42 template <
unsigned Dim,
class MFLOAT>
47 hasSpacingFields =
false;
53 template <
unsigned Dim,
class MFLOAT>
59 gridSizes[d] = ndi[d].length();
61 for (d=0; d<
Dim; d++) {
64 origin(d) = ndi[d].first();
66 for (i=0; i < gridSizes[d]-1; i++) {
67 (meshSpacing[d])[i] = ndi[d].stride();
68 (meshPosition[d])[i] = MFLOAT(i);
70 (meshPosition[d])[gridSizes[d]-1] = MFLOAT(gridSizes[d]-1);
75 template <
unsigned Dim,
class MFLOAT>
81 gridSizes[d] = ndi[d].length();
83 for (d=0; d<
Dim; d++) {
86 origin(d) = ndi[d].first();
88 set_meshSpacing(delX);
92 template <
unsigned Dim,
class MFLOAT>
99 gridSizes[d] = ndi[d].length();
101 for (d=0; d<
Dim; d++) {
106 set_meshSpacing(delX);
110 template <
unsigned Dim,
class MFLOAT>
116 for (d=0; d<
Dim; d++)
117 gridSizes[d] = ndi[d].length();
121 set_meshSpacing(delX);
129 template <
unsigned Dim,
class MFLOAT>
133 PInsist(
Dim==1,
"Number of Index arguments does not match mesh dimension!!");
134 gridSizes[0] = I.
length();
136 origin(0) = I.
first();
139 for (i=0; i < gridSizes[0]-1; i++) {
140 (meshSpacing[0])[i] = I.
stride();
141 (meshPosition[0])[i] = MFLOAT(i);
143 (meshPosition[0])[gridSizes[0]-1] = MFLOAT(gridSizes[0]-1);
144 for (
unsigned int d=0; d<
Dim; d++) {
151 template <
unsigned Dim,
class MFLOAT>
155 PInsist(
Dim==1,
"Number of Index arguments does not match mesh dimension!!");
156 gridSizes[0] = I.
length();
158 origin(0) = I.
first();
159 for (
unsigned int d=0; d<
Dim; d++) {
163 set_meshSpacing(delX);
167 template <
unsigned Dim,
class MFLOAT>
172 PInsist(
Dim==1,
"Number of Index arguments does not match mesh dimension!!");
174 gridSizes[0] = I.
length();
175 for (
unsigned int d=0; d<
Dim; d++) {
180 set_meshSpacing(delX);
184 template <
unsigned Dim,
class MFLOAT>
189 PInsist(
Dim==1,
"Number of Index arguments does not match mesh dimension!!");
191 gridSizes[0] = I.
length();
194 set_meshSpacing(delX);
199 template <
unsigned Dim,
class MFLOAT>
203 PInsist(
Dim==2,
"Number of Index arguments does not match mesh dimension!!");
204 gridSizes[0] = I.
length();
205 gridSizes[1] = J.
length();
207 origin(0) = I.
first();
208 origin(1) = J.
first();
211 for (i=0; i < gridSizes[0]-1; i++) {
212 (meshSpacing[0])[i] = I.
stride();
213 (meshPosition[0])[i] = MFLOAT(i);
215 (meshPosition[0])[gridSizes[0]-1] = MFLOAT(gridSizes[0]-1);
216 for (i=0; i < gridSizes[1]-1; i++) {
217 (meshSpacing[1])[i] = J.
stride();
218 (meshPosition[1])[i] = MFLOAT(i);
220 (meshPosition[1])[gridSizes[1]-1] = MFLOAT(gridSizes[1]-1);
221 for (
unsigned int d=0; d<
Dim; d++) {
228 template <
unsigned Dim,
class MFLOAT>
232 PInsist(
Dim==2,
"Number of Index arguments does not match mesh dimension!!");
233 gridSizes[0] = I.
length();
234 gridSizes[1] = J.
length();
236 origin(0) = I.
first();
237 origin(1) = J.
first();
238 for (
unsigned int d=0; d<
Dim; d++) {
242 set_meshSpacing(delX);
246 template <
unsigned Dim,
class MFLOAT>
251 PInsist(
Dim==2,
"Number of Index arguments does not match mesh dimension!!");
252 gridSizes[0] = I.
length();
253 gridSizes[1] = J.
length();
255 for (
unsigned int d=0; d<
Dim; d++) {
260 set_meshSpacing(delX);
264 template <
unsigned Dim,
class MFLOAT>
269 PInsist(
Dim==2,
"Number of Index arguments does not match mesh dimension!!");
270 gridSizes[0] = I.
length();
271 gridSizes[1] = J.
length();
275 set_meshSpacing(delX);
280 template <
unsigned Dim,
class MFLOAT>
284 PInsist(
Dim==3,
"Number of Index arguments does not match mesh dimension!!");
285 gridSizes[0] = I.
length();
286 gridSizes[1] = J.
length();
287 gridSizes[2] = K.
length();
290 origin(0) = I.
first();
291 origin(1) = J.
first();
292 origin(2) = K.
first();
295 for (i=0; i < gridSizes[0]-1; i++) {
296 (meshSpacing[0])[i] = I.
stride();
297 (meshPosition[0])[i] = MFLOAT(i);
299 (meshPosition[0])[gridSizes[0]-1] = MFLOAT(gridSizes[0]-1);
300 for (i=0; i < gridSizes[1]-1; i++) {
301 (meshSpacing[1])[i] = J.
stride();
302 (meshPosition[1])[i] = MFLOAT(i);
304 (meshPosition[1])[gridSizes[1]-1] = MFLOAT(gridSizes[1]-1);
305 for (i=0; i < gridSizes[2]-1; i++) {
306 (meshSpacing[2])[i] = K.
stride();
307 (meshPosition[2])[i] = MFLOAT(i);
309 (meshPosition[2])[gridSizes[2]-1] = MFLOAT(gridSizes[2]-1);
311 for (
unsigned int d=0; d<
Dim; d++) {
318 template <
unsigned Dim,
class MFLOAT>
323 PInsist(
Dim==3,
"Number of Index arguments does not match mesh dimension!!");
324 gridSizes[0] = I.
length();
325 gridSizes[1] = J.
length();
326 gridSizes[2] = K.
length();
328 origin(0) = I.
first();
329 origin(1) = J.
first();
330 origin(2) = K.
first();
331 for (
unsigned int d=0; d<
Dim; d++) {
335 set_meshSpacing(delX);
339 template <
unsigned Dim,
class MFLOAT>
344 PInsist(
Dim==3,
"Number of Index arguments does not match mesh dimension!!");
345 gridSizes[0] = I.
length();
346 gridSizes[1] = J.
length();
347 gridSizes[2] = K.
length();
349 for (
unsigned int d=0; d<
Dim; d++) {
354 set_meshSpacing(delX);
358 template <
unsigned Dim,
class MFLOAT>
364 PInsist(
Dim==3,
"Number of Index arguments does not match mesh dimension!!");
365 gridSizes[0] = I.
length();
366 gridSizes[1] = J.
length();
367 gridSizes[2] = K.
length();
371 set_meshSpacing(delX);
378 template <
unsigned Dim,
class MFLOAT>
384 for (d=0; d<
Dim; d++)
385 gridSizes[d] = ndi[d].length();
387 for (d=0; d<
Dim; d++) {
390 origin(d) = ndi[d].first();
392 for (i=0; i < gridSizes[d]-1; i++) {
393 (meshSpacing[d])[i] = ndi[d].stride();
394 (meshPosition[d])[i] = MFLOAT(i);
396 (meshPosition[d])[gridSizes[d]-1] = MFLOAT(gridSizes[d]-1);
401 template <
unsigned Dim,
class MFLOAT>
407 for (d=0; d<
Dim; d++)
408 gridSizes[d] = ndi[d].length();
410 for (d=0; d<
Dim; d++) {
413 origin(d) = ndi[d].first();
415 set_meshSpacing(delX);
419 template <
unsigned Dim,
class MFLOAT>
426 for (d=0; d<
Dim; d++)
427 gridSizes[d] = ndi[d].length();
429 for (d=0; d<
Dim; d++) {
434 set_meshSpacing(delX);
438 template <
unsigned Dim,
class MFLOAT>
445 for (d=0; d<
Dim; d++)
446 gridSizes[d] = ndi[d].length();
450 set_meshSpacing(delX);
458 template <
unsigned Dim,
class MFLOAT>
463 PInsist(
Dim==1,
"Number of Index arguments does not match mesh dimension!!");
464 gridSizes[0] = I.
length();
466 origin(0) = I.
first();
469 for (i=0; i < gridSizes[0]-1; i++) {
470 (meshSpacing[0])[i] = I.
stride();
471 (meshPosition[0])[i] = MFLOAT(i);
473 (meshPosition[0])[gridSizes[0]-1] = MFLOAT(gridSizes[0]-1);
474 for (
unsigned int d=0; d<
Dim; d++) {
481 template <
unsigned Dim,
class MFLOAT>
486 PInsist(
Dim==1,
"Number of Index arguments does not match mesh dimension!!");
487 gridSizes[0] = I.
length();
489 origin(0) = I.
first();
490 for (
unsigned int d=0; d<
Dim; d++) {
494 set_meshSpacing(delX);
498 template <
unsigned Dim,
class MFLOAT>
504 PInsist(
Dim==1,
"Number of Index arguments does not match mesh dimension!!");
506 gridSizes[0] = I.
length();
507 for (
unsigned int d=0; d<
Dim; d++) {
512 set_meshSpacing(delX);
516 template <
unsigned Dim,
class MFLOAT>
522 PInsist(
Dim==1,
"Number of Index arguments does not match mesh dimension!!");
524 gridSizes[0] = I.
length();
527 set_meshSpacing(delX);
532 template <
unsigned Dim,
class MFLOAT>
537 PInsist(
Dim==2,
"Number of Index arguments does not match mesh dimension!!");
538 gridSizes[0] = I.
length();
539 gridSizes[1] = J.
length();
541 origin(0) = I.
first();
542 origin(1) = J.
first();
545 for (i=0; i < gridSizes[0]-1; i++) {
546 (meshSpacing[0])[i] = I.
stride();
547 (meshPosition[0])[i] = MFLOAT(i);
549 (meshPosition[0])[gridSizes[0]-1] = MFLOAT(gridSizes[0]-1);
550 for (i=0; i < gridSizes[1]-1; i++) {
551 (meshSpacing[1])[i] = J.
stride();
552 (meshPosition[1])[i] = MFLOAT(i);
554 (meshPosition[1])[gridSizes[1]-1] = MFLOAT(gridSizes[1]-1);
555 for (
unsigned int d=0; d<
Dim; d++) {
562 template <
unsigned Dim,
class MFLOAT>
567 PInsist(
Dim==2,
"Number of Index arguments does not match mesh dimension!!");
568 gridSizes[0] = I.
length();
569 gridSizes[1] = J.
length();
571 origin(0) = I.
first();
572 origin(1) = J.
first();
573 for (
unsigned int d=0; d<
Dim; d++) {
577 set_meshSpacing(delX);
581 template <
unsigned Dim,
class MFLOAT>
587 PInsist(
Dim==2,
"Number of Index arguments does not match mesh dimension!!");
588 gridSizes[0] = I.
length();
589 gridSizes[1] = J.
length();
591 for (
unsigned int d=0; d<
Dim; d++) {
596 set_meshSpacing(delX);
600 template <
unsigned Dim,
class MFLOAT>
606 PInsist(
Dim==2,
"Number of Index arguments does not match mesh dimension!!");
607 gridSizes[0] = I.
length();
608 gridSizes[1] = J.
length();
612 set_meshSpacing(delX);
617 template <
unsigned Dim,
class MFLOAT>
622 PInsist(
Dim==3,
"Number of Index arguments does not match mesh dimension!!");
623 gridSizes[0] = I.
length();
624 gridSizes[1] = J.
length();
625 gridSizes[2] = K.
length();
628 origin(0) = I.
first();
629 origin(1) = J.
first();
630 origin(2) = K.
first();
633 for (i=0; i < gridSizes[0]-1; i++) {
634 (meshSpacing[0])[i] = I.
stride();
635 (meshPosition[0])[i] = MFLOAT(i);
637 (meshPosition[0])[gridSizes[0]-1] = MFLOAT(gridSizes[0]-1);
638 for (i=0; i < gridSizes[1]-1; i++) {
639 (meshSpacing[1])[i] = J.
stride();
640 (meshPosition[1])[i] = MFLOAT(i);
642 (meshPosition[1])[gridSizes[1]-1] = MFLOAT(gridSizes[1]-1);
643 for (i=0; i < gridSizes[2]-1; i++) {
644 (meshSpacing[2])[i] = K.
stride();
645 (meshPosition[2])[i] = MFLOAT(i);
647 (meshPosition[2])[gridSizes[2]-1] = MFLOAT(gridSizes[2]-1);
649 for (
unsigned int d=0; d<
Dim; d++) {
656 template <
unsigned Dim,
class MFLOAT>
662 PInsist(
Dim==3,
"Number of Index arguments does not match mesh dimension!!");
663 gridSizes[0] = I.
length();
664 gridSizes[1] = J.
length();
665 gridSizes[2] = K.
length();
667 origin(0) = I.
first();
668 origin(1) = J.
first();
669 origin(2) = K.
first();
670 for (
unsigned int d=0; d<
Dim; d++) {
674 set_meshSpacing(delX);
678 template <
unsigned Dim,
class MFLOAT>
684 PInsist(
Dim==3,
"Number of Index arguments does not match mesh dimension!!");
685 gridSizes[0] = I.
length();
686 gridSizes[1] = J.
length();
687 gridSizes[2] = K.
length();
689 for (
unsigned int d=0; d<
Dim; d++) {
694 set_meshSpacing(delX);
698 template <
unsigned Dim,
class MFLOAT>
705 PInsist(
Dim==3,
"Number of Index arguments does not match mesh dimension!!");
706 gridSizes[0] = I.
length();
707 gridSizes[1] = J.
length();
708 gridSizes[2] = K.
length();
712 set_meshSpacing(delX);
720 template<
unsigned Dim,
class MFLOAT>
725 for (
unsigned d=0; d<
Dim; ++d) {
726 (meshPosition[d])[0] = o(d);
727 for (
unsigned vert=1; vert<gridSizes[d]; ++vert) {
728 (meshPosition[d])[vert] = (meshPosition[d])[vert-1] +
729 (meshSpacing[d])[vert-1];
733 for (
unsigned face=0; face < 2*
Dim; ++face) updateMeshSpacingGuards(face);
734 this->notifyOfChange();
737 template<
unsigned Dim,
class MFLOAT>
745 template<
unsigned Dim,
class MFLOAT>
749 unsigned d, cell, face;
751 for (d=0;d<
Dim;++d) {
752 (meshPosition[d])[0] = origin(d);
753 for (cell=0; cell < gridSizes[d]-1; cell++) {
754 (meshSpacing[d])[cell] = del[d][cell];
755 (meshPosition[d])[cell+1] = (meshPosition[d])[cell] + del[d][cell];
759 for (face=0; face < 2*
Dim; ++face) updateMeshSpacingGuards(face);
761 if (hasSpacingFields) storeSpacingFields();
762 this->notifyOfChange();
766 template<
unsigned Dim,
class MFLOAT>
772 for (d=1;d<
Dim;++d) coef *= 0.5;
774 for (d=0;d<
Dim;++d) {
776 for (
unsigned b=0; b<(1<<
Dim); ++b) {
777 int s = ( b&(1<<d) ) ? 1 : -1;
784 template<
unsigned Dim,
class MFLOAT>
789 for (
int cell=0; cell < gridSizes[d]-1; cell++)
790 spacings[cell] = (*(meshSpacing[d].
find(cell))).second;
842 template<
unsigned Dim,
class MFLOAT>
848 for (
unsigned int d=0; d<
Dim; d++) et[d] =
PARALLEL;
849 storeSpacingFields(et, -1);
852 template<
unsigned Dim,
class MFLOAT>
858 storeSpacingFields(et, vnodes);
861 template<
unsigned Dim,
class MFLOAT>
868 storeSpacingFields(et, vnodes);
871 template<
unsigned Dim,
class MFLOAT>
879 storeSpacingFields(et, vnodes);
884 template<
unsigned Dim,
class MFLOAT>
889 int currentLocation[
Dim];
891 for (d=0; d<
Dim; d++) {
892 cells[d] =
Index(gridSizes[d]-1);
893 verts[d] =
Index(gridSizes[d]);
895 if (!hasSpacingFields) {
911 cfi_end = vertSpacings.
end();
912 for (cfi = vertSpacings.
begin(); cfi != cfi_end; ++cfi) {
913 cfi.GetCurrentLocation(currentLocation);
914 for (d=0; d<
Dim; d++)
915 vertexSpacing(d) = (*(meshSpacing[d].find(currentLocation[d]))).second;
916 *cfi = vertexSpacing;
923 vfi_end = cellSpacings.
end();
924 for (vfi = cellSpacings.
begin(); vfi != vfi_end; ++vfi) {
925 vfi.GetCurrentLocation(currentLocation);
926 for (d=0; d<
Dim; d++)
927 cellSpacing(d) = 0.5 * ((meshSpacing[d])[currentLocation[d]] +
928 (meshSpacing[d])[currentLocation[d]-1]);
947 int coffset, voffset;
950 for (face=0; face < 2*
Dim; face++) {
961 cSlab[d] =
Index(verts[d].
max() + 1,
963 vSlab[d] =
Index(cells[d].
max() + 1,
972 switch (MeshBC[face]) {
976 coffset = -verts[d].length();
977 voffset = -cells[d].length();
979 coffset = verts[d].length();
980 voffset = cells[d].length();
986 coffset = 2*verts[d].max() + 1;
987 voffset = 2*cells[d].max() + 1 - 1;
989 coffset = 2*verts[d].min() - 1;
990 voffset = 2*cells[d].min() - 1 + 1;
996 coffset = 2*verts[d].max() + 1;
997 voffset = 2*cells[d].max() + 1 - 1;
999 coffset = 2*verts[d].min() - 1;
1000 voffset = 2*cells[d].min() - 1 + 1;
1004 ERRORMSG(
"Cartesian::storeSpacingFields(): unknown MeshBC type" <<
endl);
1010 for (cfill_i=cellSpacings.
begin_if();
1011 cfill_i!=cellSpacings.
end_if(); ++cfill_i)
1022 if ( cSlab.
touches( fill_alloc ) )
1035 src[d] = coffset - src[d];
1040 for (from_i=cellSpacings.
begin_if();
1041 from_i!=cellSpacings.
end_if(); ++from_i)
1048 if ( src.touches( from_owned ) )
1054 LFI lhs = fill.
begin(cfill_it);
1055 LFI rhs = from.
begin(from_it);
1076 for (vfill_i=vertSpacings.
begin_if();
1077 vfill_i!=vertSpacings.
end_if(); ++vfill_i)
1088 if ( vSlab.touches( fill_alloc ) )
1101 src[d] = voffset - src[d];
1106 for (from_i=vertSpacings.
begin_if();
1107 from_i!=vertSpacings.
end_if(); ++from_i)
1114 if ( src.touches( from_owned ) )
1120 LFI lhs = fill.
begin(vfill_it);
1121 LFI rhs = from.
begin(from_it);
1144 hasSpacingFields =
true;
1156 template<
unsigned Dim,
class MFLOAT>
1164 unsigned vnodesPerDirection[
Dim];
1165 vnodesPerDirection[0] = vnodes1;
1166 storeSpacingFields(et, vnodesPerDirection, recurse, vnodes);
1169 template<
unsigned Dim,
class MFLOAT>
1172 unsigned vnodes1,
unsigned vnodes2,
1173 bool recurse,
int vnodes) {
1177 unsigned vnodesPerDirection[
Dim];
1178 vnodesPerDirection[0] = vnodes1;
1179 vnodesPerDirection[1] = vnodes2;
1180 storeSpacingFields(et, vnodesPerDirection, recurse, vnodes);
1183 template<
unsigned Dim,
class MFLOAT>
1186 unsigned vnodes1,
unsigned vnodes2,
unsigned vnodes3,
1187 bool recurse,
int vnodes) {
1192 unsigned vnodesPerDirection[
Dim];
1193 vnodesPerDirection[0] = vnodes1;
1194 vnodesPerDirection[1] = vnodes2;
1195 vnodesPerDirection[2] = vnodes3;
1196 storeSpacingFields(et, vnodesPerDirection, recurse, vnodes);
1203 template<
unsigned Dim,
class MFLOAT>
1206 unsigned* vnodesPerDirection,
1207 bool recurse,
int vnodes) {
1209 int currentLocation[
Dim];
1211 for (d=0; d<
Dim; d++) {
1212 cells[d] =
Index(gridSizes[d]-1);
1213 verts[d] =
Index(gridSizes[d]);
1215 if (!hasSpacingFields) {
1233 cfi_end = vertSpacings.
end();
1234 for (cfi = vertSpacings.
begin(); cfi != cfi_end; ++cfi) {
1235 cfi.GetCurrentLocation(currentLocation);
1236 for (d=0; d<
Dim; d++)
1237 vertexSpacing(d) = (*(meshSpacing[d].find(currentLocation[d]))).second;
1238 *cfi = vertexSpacing;
1245 vfi_end = cellSpacings.
end();
1246 for (vfi = cellSpacings.
begin(); vfi != vfi_end; ++vfi) {
1247 vfi.GetCurrentLocation(currentLocation);
1248 for (d=0; d<
Dim; d++)
1249 cellSpacing(d) = 0.5 * ((meshSpacing[d])[currentLocation[d]] +
1250 (meshSpacing[d])[currentLocation[d]-1]);
1269 int coffset, voffset;
1272 for (face=0; face < 2*
Dim; face++) {
1283 cSlab[d] =
Index(verts[d].
max() + 1,
1285 vSlab[d] =
Index(cells[d].
max() + 1,
1289 verts[d].min() - 1);
1291 cells[d].min() - 1);
1294 switch (MeshBC[face]) {
1298 coffset = -verts[d].length();
1299 voffset = -cells[d].length();
1301 coffset = verts[d].length();
1302 voffset = cells[d].length();
1308 coffset = 2*verts[d].max() + 1;
1309 voffset = 2*cells[d].max() + 1 - 1;
1311 coffset = 2*verts[d].min() - 1;
1312 voffset = 2*cells[d].min() - 1 + 1;
1318 coffset = 2*verts[d].max() + 1;
1319 voffset = 2*cells[d].max() + 1 - 1;
1321 coffset = 2*verts[d].min() - 1;
1322 voffset = 2*cells[d].min() - 1 + 1;
1326 ERRORMSG(
"Cartesian::storeSpacingFields(): unknown MeshBC type" <<
endl);
1332 for (cfill_i=cellSpacings.
begin_if();
1333 cfill_i!=cellSpacings.
end_if(); ++cfill_i)
1344 if ( cSlab.
touches( fill_alloc ) )
1357 src[d] = coffset - src[d];
1362 for (from_i=cellSpacings.
begin_if();
1363 from_i!=cellSpacings.
end_if(); ++from_i)
1370 if ( src.touches( from_owned ) )
1376 LFI lhs = fill.
begin(cfill_it);
1377 LFI rhs = from.
begin(from_it);
1398 for (vfill_i=vertSpacings.
begin_if();
1399 vfill_i!=vertSpacings.
end_if(); ++vfill_i)
1410 if ( vSlab.touches( fill_alloc ) )
1423 src[d] = voffset - src[d];
1428 for (from_i=vertSpacings.
begin_if();
1429 from_i!=vertSpacings.
end_if(); ++from_i)
1436 if ( src.touches( from_owned ) )
1442 LFI lhs = fill.
begin(vfill_it);
1443 LFI rhs = from.
begin(from_it);
1466 hasSpacingFields =
true;
1474 template<
unsigned Dim,
class MFLOAT >
1480 out <<
"======Cartesian<" <<
Dim <<
",MFLOAT>==begin======" <<
std::endl;
1481 for (d=0; d <
Dim; d++)
1482 out <<
"gridSizes[" << d <<
"] = " << gridSizes[d] << std::endl;
1483 out <<
"origin = " << origin <<
std::endl;
1484 for (d=0; d <
Dim; d++) {
1485 out <<
"--------meshSpacing[" << d <<
"]---------" <<
std::endl;
1487 for (mi=meshSpacing[d].begin(); mi != meshSpacing[d].end(); ++mi) {
1488 out <<
"meshSpacing[" << d <<
"][" << (*mi).first <<
"] = "
1492 for (
unsigned b=0; b < (1<<
Dim); b++)
1493 out <<
"Dvc[" << b <<
"] = " << Dvc[b] << std::endl;
1494 for (d=0; d <
Dim; d++)
1498 out <<
"======Cartesian<" << Dim <<
",MFLOAT>==end========" <<
std::endl;
1506 template <
unsigned Dim,
class MFLOAT>
1511 MFLOAT volume = 1.0;
1513 for (d=0; d<
Dim; d++)
1514 if (ndi[d].length() != 1) {
1515 ERRORMSG(
"Cartesian::getCellVolume() error: arg is not a NDIndex"
1516 <<
"specifying a single element" <<
endl);
1519 volume *= (*(meshSpacing[d].find(ndi[d].first()))).second;
1524 template <
unsigned Dim,
class MFLOAT>
1534 int currentLocation[
Dim];
1535 volumes.Uncompress();
1538 fi_end=volumes.end();
1539 for (fi = volumes.
begin(); fi != fi_end; ++fi) {
1540 fi.GetCurrentLocation(currentLocation);
1541 for (d=0; d<
Dim; d++)
1542 *fi *= (*(meshSpacing[d].
find(currentLocation[d]))).second;
1547 template <
unsigned Dim,
class MFLOAT>
1555 for (d=0; d<
Dim; d++) {
1556 i0 = ndi[d].first();
1557 if ( (i0 < -(
int(gridSizes[d])-1)/2) ||
1558 (i0 > 3*(
int(gridSizes[d])-1)/2) )
1559 ERRORMSG(
"Cartesian::getVertRangeVolume() error: " << ndi
1560 <<
" is an NDIndex ranging outside the mesh and guard layers;"
1561 <<
" not allowed." <<
endl);
1562 v0(d) = (*(meshPosition[d].find(i0))).second;
1564 if ( (i1 < -(
int(gridSizes[d])-1)/2) ||
1565 (i1 > 3*(
int(gridSizes[d])-1)/2) )
1566 ERRORMSG(
"Cartesian::getVertRangeVolume() error: " << ndi
1567 <<
" is an NDIndex ranging outside the mesh and guard layers;"
1568 <<
" not allowed." <<
endl);
1569 v1(d) = (*(meshPosition[d].find(i1))).second;
1572 MFLOAT volume = 1.0;
1573 for (d=0; d<
Dim; d++) volume *=
abs(v1(d) - v0(d));
1577 template <
unsigned Dim,
class MFLOAT>
1585 for (d=0; d<
Dim; d++) {
1586 i0 = ndi[d].first();
1587 if ( (i0 < -(
int(gridSizes[d])-1)/2) ||
1588 (i0 > 3*(
int(gridSizes[d])-1)/2) )
1589 ERRORMSG(
"Cartesian::getCellRangeVolume() error: " << ndi
1590 <<
" is an NDIndex ranging outside the mesh and guard layers;"
1591 <<
" not allowed." <<
endl);
1592 v0(d) = (*(meshPosition[d].find(i0))).second;
1593 i1 = ndi[d].last()+1;
1594 if ( (i1 < -(
int(gridSizes[d])-1)/2) ||
1595 (i1 > 3*(
int(gridSizes[d])-1)/2) )
1596 ERRORMSG(
"Cartesian::getCellRangeVolume() error: " << ndi
1597 <<
" is an NDIndex ranging outside the mesh and guard layers;"
1598 <<
" not allowed." <<
endl);
1599 v1(d) = (*(meshPosition[d].find(i1))).second;
1602 MFLOAT volume = 1.0;
1603 for (d=0; d<
Dim; d++) volume *=
abs(v1(d) - v0(d));
1608 template <
unsigned Dim,
class MFLOAT>
1615 for (d=0; d<
Dim; d++) {
1616 int gs = (int(gridSizes[d])-1)/2;
1617 boxMin(d) = (*(meshPosition[d].find(-gs))).second;
1618 boxMax(d) = (*(meshPosition[d].find(3*gs))).second;
1620 for (d=0; d<
Dim; d++)
1621 if ( (x(d) < boxMin(d)) || (x(d) > boxMax(d)) )
1622 ERRORMSG(
"Cartesian::getNearestVertex() - input point is outside"
1623 <<
" mesh boundary and guard layers; not allowed." <<
endl);
1627 MFLOAT xVertexBelow, xVertexAbove, xVertex;
1628 int vertBelow, vertAbove, vertNearest[
Dim];
1629 for (d=0; d<
Dim; d++) {
1630 vertBelow = -(int(gridSizes[d])-1)/2;
1631 vertAbove = 3*(int(gridSizes[d])-1)/2;
1632 xVertexBelow = (*(meshPosition[d].find(vertBelow))).second;
1633 xVertexAbove = (*(meshPosition[d].find(vertAbove))).second;
1635 if (x(d) < xVertexBelow) {
1636 vertNearest[d] = vertBelow;
1639 if (x(d) > xVertexAbove) {
1640 vertNearest[d] = vertAbove;
1643 while (vertAbove > vertBelow+1) {
1644 vertNearest[d] = (vertAbove+vertBelow)/2;
1645 xVertex = (*(meshPosition[d].find(vertNearest[d]))).second;
1646 if (x(d) > xVertex) {
1647 vertBelow = vertNearest[d];
1648 xVertexBelow = xVertex;
1650 else if (x(d) < xVertex) {
1651 vertAbove = vertNearest[d];
1652 xVertexAbove = xVertex;
1655 vertAbove = vertBelow;
1658 if (vertAbove != vertBelow) {
1659 if ((x(d)-xVertexBelow)<(xVertexAbove-x(d))) {
1660 vertNearest[d] = vertBelow;
1663 vertNearest[d] = vertAbove;
1670 for (d=0; d<
Dim; d++) ndi[d] =
Index(vertNearest[d],vertNearest[d],1);
1675 template <
unsigned Dim,
class MFLOAT>
1682 for (d=0; d<
Dim; d++) {
1683 int gs = (int(gridSizes[d]) - 1)/2;
1684 boxMin(d) = (*(meshPosition[d].find(-gs))).second;
1685 boxMax(d) = (*(meshPosition[d].find(3*gs))).second;
1687 for (d=0; d<
Dim; d++)
1688 if ( (x(d) < boxMin(d)) || (x(d) > boxMax(d)) )
1689 ERRORMSG(
"Cartesian::getVertexBelow() - input point is outside"
1690 <<
" mesh boundary and guard layers; not allowed." <<
endl);
1693 MFLOAT xVertexBelow, xVertexAbove, xVertex;
1694 int vertBelow, vertAbove, vertNearest[
Dim];
1695 for (d=0; d<
Dim; d++) {
1696 vertBelow = -(int(gridSizes[d])-1)/2;
1697 vertAbove = 3*(int(gridSizes[d])-1)/2;
1698 xVertexBelow = (*(meshPosition[d].find(vertBelow))).second;
1699 xVertexAbove = (*(meshPosition[d].find(vertAbove))).second;
1701 if (x(d) < xVertexBelow) {
1702 vertNearest[d] = vertBelow;
1705 if (x(d) > xVertexAbove) {
1706 vertNearest[d] = vertAbove;
1709 while (vertAbove > vertBelow+1) {
1710 vertNearest[d] = (vertAbove+vertBelow)/2;
1711 xVertex = (*(meshPosition[d].find(vertNearest[d]))).second;
1712 if (x(d) > xVertex) {
1713 vertBelow = vertNearest[d];
1714 xVertexBelow = xVertex;
1716 else if (x(d) < xVertex) {
1717 vertAbove = vertNearest[d];
1718 xVertexAbove = xVertex;
1721 vertAbove = vertBelow;
1724 if (vertAbove != vertBelow) {
1725 vertNearest[d] = vertBelow;
1731 for (d=0; d<
Dim; d++) ndi[d] =
Index(vertNearest[d],vertNearest[d],1);
1736 template <
unsigned Dim,
class MFLOAT>
1743 for (d=0; d<
Dim; d++) {
1744 if (ndi[d].length() != 1)
1745 ERRORMSG(
"Cartesian::getVertexPosition() error: " << ndi
1746 <<
" is not an NDIndex specifying a single element" <<
endl);
1748 if ( (i < -(
int(gridSizes[d])-1)/2) ||
1749 (i > 3*(
int(gridSizes[d])-1)/2) )
1750 ERRORMSG(
"Cartesian::getVertexPosition() error: " << ndi
1751 <<
" is an NDIndex outside the mesh and guard layers;"
1752 <<
" not allowed." <<
endl);
1753 vertexPosition(d) = (*(meshPosition[d].find(i))).second;
1755 return vertexPosition;
1758 template <
unsigned Dim,
class MFLOAT>
1765 int currentLocation[
Dim];
1767 vertexPositions.Uncompress();
1769 fi_end = vertexPositions.end();
1770 for (fi = vertexPositions.
begin(); fi != fi_end; ++fi) {
1772 fi.GetCurrentLocation(currentLocation);
1773 for (d=0; d<
Dim; d++) {
1774 vertexPosition(d) = (*(meshPosition[d].find(currentLocation[d]))).second;
1776 *fi = vertexPosition;
1778 return vertexPositions;
1782 template <
unsigned Dim,
class MFLOAT>
1789 for (d=0; d<
Dim; d++) {
1790 if (ndi[d].length() != 1)
1791 ERRORMSG(
"Cartesian::getCellPosition() error: " << ndi
1792 <<
" is not an NDIndex specifying a single element" <<
endl);
1794 if ( (i < -(
int(gridSizes[d])-1)/2) ||
1795 (i >= 3*(
int(gridSizes[d])-1)/2) )
1796 ERRORMSG(
"Cartesian::getCellPosition() error: " << ndi
1797 <<
" is an NDIndex outside the mesh and guard layers;"
1798 <<
" not allowed." <<
endl);
1799 cellPosition(d) = 0.5 * ( (*(meshPosition[d].find(i))).second +
1800 (*(meshPosition[d].find(i+1))).second );
1802 return cellPosition;
1805 template <
unsigned Dim,
class MFLOAT>
1812 int currentLocation[
Dim];
1814 cellPositions.Uncompress();
1816 fi_end = cellPositions.end();
1817 for (fi = cellPositions.
begin(); fi != fi_end; ++fi) {
1819 fi.GetCurrentLocation(currentLocation);
1820 for (d=0; d<
Dim; d++) {
1822 0.5 * ( (*(meshPosition[d].find(currentLocation[d]))).second +
1823 (*(meshPosition[d].find(currentLocation[d]+1))).second );
1827 return cellPositions;
1831 template <
unsigned Dim,
class MFLOAT>
1839 for (
unsigned int d=0; d<
Dim; d++) {
1841 int a = ndi[d].first();
1842 int b = ndi[d].last();
1844 int tmpa = a; a = b; b = tmpa;
1848 if (a < -((
int(gridSizes[d])-1)/2) || b >= 3*(
int(gridSizes[d])-1)/2) {
1849 ERRORMSG(
"Cartesian::getDeltaVertex() error: " << ndi
1850 <<
" is an NDIndex ranging outside"
1851 <<
" the mesh and guard layers region; not allowed."
1858 vertexVertexSpacing[d] += (*(meshSpacing[d].find(a++))).second;
1861 return vertexVertexSpacing;
1865 template <
unsigned Dim,
class MFLOAT>
1871 int currentLocation[
Dim];
1873 vertexSpacings.Uncompress();
1875 fi_end = vertexSpacings.end();
1876 for (fi = vertexSpacings.
begin(); fi != fi_end; ++fi) {
1877 fi.GetCurrentLocation(currentLocation);
1878 for (
unsigned int d=0; d<
Dim; d++)
1879 vertexVertexSpacing[d]=(*(meshSpacing[d].
find(currentLocation[d]))).second;
1880 *fi = vertexVertexSpacing;
1882 return vertexSpacings;
1886 template <
unsigned Dim,
class MFLOAT>
1894 for (
unsigned int d=0; d<
Dim; d++) {
1896 int a = ndi[d].first();
1897 int b = ndi[d].last();
1899 int tmpa = a; a = b; b = tmpa;
1903 if (a <= -(
int(gridSizes[d])-1)/2 || b >= 3*(
int(gridSizes[d])-1)/2) {
1904 ERRORMSG(
"Cartesian::getDeltaCell() error: " << ndi
1905 <<
" is an NDIndex ranging outside"
1906 <<
" the mesh and guard layers region; not allowed."
1912 cellCellSpacing[d] += ((*(meshSpacing[d].find(a))).second +
1913 (*(meshSpacing[d].find(a-1))).second) * 0.5;
1917 return cellCellSpacing;
1921 template <
unsigned Dim,
class MFLOAT>
1927 int currentLocation[
Dim];
1929 cellSpacings.Uncompress();
1931 fi_end = cellSpacings.end();
1932 for (fi = cellSpacings.
begin(); fi != fi_end; ++fi) {
1933 fi.GetCurrentLocation(currentLocation);
1934 for (
unsigned int d=0; d<
Dim; d++)
1935 cellCellSpacing[d]+=((*(meshSpacing[d].
find(currentLocation[d]))).second +
1936 (*(meshSpacing[d].
find(currentLocation[d]-1))).second) * 0.5;
1937 *fi = cellCellSpacing;
1939 return cellSpacings;
1942 template <
unsigned Dim,
class MFLOAT>
1949 for (d=0; d<
Dim; d++) {
1950 for (i=0; i<
Dim; i++) {
1951 surfaceNormals[2*d](i) = 0.0;
1952 surfaceNormals[2*d+1](i) = 0.0;
1954 surfaceNormals[2*d](d) = -1.0;
1955 surfaceNormals[2*d+1](d) = 1.0;
1957 return surfaceNormals;
1960 template <
unsigned Dim,
class MFLOAT>
1965 surfaceNormalsFields )
const
1969 for (d=0; d<
Dim; d++) {
1970 for (i=0; i<
Dim; i++) {
1971 surfaceNormals[2*d](i) = 0.0;
1972 surfaceNormals[2*d+1](i) = 0.0;
1974 surfaceNormals[2*d](d) = -1.0;
1975 surfaceNormals[2*d+1](d) = 1.0;
1977 for (d=0; d<2*
Dim; d++)
assign((*(surfaceNormalsFields[d])),
1986 template <
unsigned Dim,
class MFLOAT>
1998 for (d=0; d<
Dim; d++) {
1999 if ((face/2) == d) {
2000 surfaceNormal(face) = -1.0;
2002 surfaceNormal(face) = 0.0;
2006 for (d=0; d<
Dim; d++) {
2007 if ((face/2) == d) {
2008 surfaceNormal(face) = 1.0;
2010 surfaceNormal(face) = 0.0;
2014 return surfaceNormal;
2017 template <
unsigned Dim,
class MFLOAT>
2022 unsigned face)
const
2031 for (d=0; d<
Dim; d++) {
2032 if ((face/2) == d) {
2033 surfaceNormal(face) = -1.0;
2035 surfaceNormal(face) = 0.0;
2039 for (d=0; d<
Dim; d++) {
2040 if ((face/2) == d) {
2041 surfaceNormal(face) = 1.0;
2043 surfaceNormal(face) = 0.0;
2047 surfaceNormalField = surfaceNormal;
2048 return surfaceNormalField;
2055 template <
unsigned Dim,
class MFLOAT>
2060 MeshBC[face] = meshBCType;
2061 updateMeshSpacingGuards(face);
2063 if (hasSpacingFields) storeSpacingFields();
2066 template <
unsigned Dim,
class MFLOAT>
2071 for (
unsigned int face=0; face < 2*
Dim; face++) {
2072 MeshBC[face] = meshBCTypes[face];
2073 updateMeshSpacingGuards(face);
2076 if (hasSpacingFields) storeSpacingFields();
2079 template <
unsigned Dim,
class MFLOAT>
2088 int cell, guardLayer;
2095 switch (MeshBC[d*2]) {
2097 for (guardLayer = 0; guardLayer <= (gridSizes[d]-1)/2; guardLayer++) {
2098 cell = gridSizes[d] - 1 + guardLayer;
2099 (meshSpacing[d])[cell] = (meshSpacing[d])[guardLayer];
2100 (meshPosition[d])[cell+1] = (meshPosition[d])[cell] +
2101 (meshSpacing[d])[cell];
2105 for (guardLayer = 0; guardLayer <= (gridSizes[d]-1)/2; guardLayer++) {
2106 cell = gridSizes[d] - 1 + guardLayer;
2107 (meshSpacing[d])[cell] = (meshSpacing[d])[cell - guardLayer - 1];
2108 (meshPosition[d])[cell+1] = (meshPosition[d])[cell] +
2109 (meshSpacing[d])[cell];
2113 for (guardLayer = 0; guardLayer <= (gridSizes[d]-1)/2; guardLayer++) {
2114 cell = gridSizes[d] - 1 + guardLayer;
2115 (meshSpacing[d])[cell] = 0;
2116 (meshPosition[d])[cell+1] = (meshPosition[d])[cell] +
2117 (meshSpacing[d])[cell];
2121 ERRORMSG(
"Cartesian::updateMeshSpacingGuards(): unknown MeshBC type"
2128 switch (MeshBC[d]) {
2130 for (guardLayer = 0; guardLayer <= (gridSizes[d]-1)/2; guardLayer++) {
2131 cell = -1 - guardLayer;
2132 (meshSpacing[d])[cell] = (meshSpacing[d])[gridSizes[d] + cell];
2133 (meshPosition[d])[cell] = (meshPosition[d])[cell+1] -
2134 (meshSpacing[d])[cell];
2138 for (guardLayer = 0; guardLayer <= (gridSizes[d]-1)/2; guardLayer++) {
2139 cell = -1 - guardLayer;
2140 (meshSpacing[d])[cell] = (meshSpacing[d])[-cell - 1];
2141 (meshPosition[d])[cell] = (meshPosition[d])[cell+1] -
2142 (meshSpacing[d])[cell];
2146 for (guardLayer = 0; guardLayer <= (gridSizes[d]-1)/2; guardLayer++) {
2147 cell = -1 - guardLayer;
2148 (meshSpacing[d])[cell] = 0;
2149 (meshPosition[d])[cell] = (meshPosition[d])[cell+1] -
2150 (meshSpacing[d])[cell];
2154 ERRORMSG(
"Cartesian::updateMeshSpacingGuards(): unknown MeshBC type"
2163 template <
unsigned Dim,
class MFLOAT>
2173 template <
unsigned Dim,
class MFLOAT>
2179 for (
unsigned int b=0; b < 2*
Dim; b++) mb[b] = MeshBC[b];
2197 template <
class T,
class MFLOAT >
2202 PAssert_EQ(x.get_mesh().hasSpacingFields,
true);
2205 Index I = domain[0];
2207 dot(x[I ], x.get_mesh().Dvc[0]/vertSpacings[I]) +
2208 dot(x[I+1], x.get_mesh().Dvc[1]/vertSpacings[I]);
2212 template <
class T,
class MFLOAT >
2217 PAssert_EQ(x.get_mesh().hasSpacingFields,
true);
2220 Index I = domain[0];
2221 Index J = domain[1];
2223 dot(x[I ][J ], x.get_mesh().Dvc[0]/vertSpacings[I][J]) +
2224 dot(x[I+1][J ], x.get_mesh().Dvc[1]/vertSpacings[I][J]) +
2225 dot(x[I ][J+1], x.get_mesh().Dvc[2]/vertSpacings[I][J]) +
2226 dot(x[I+1][J+1], x.get_mesh().Dvc[3]/vertSpacings[I][J]);
2230 template <
class T,
class MFLOAT >
2235 PAssert_EQ(x.get_mesh().hasSpacingFields,
true);
2238 Index I = domain[0];
2239 Index J = domain[1];
2242 dot(x[I ][J ][K ], x.get_mesh().Dvc[0]/vertSpacings[I][J][
K]) +
2243 dot(x[I+1][J ][K ], x.get_mesh().Dvc[1]/vertSpacings[I][J][
K]) +
2244 dot(x[I ][J+1][K ], x.get_mesh().Dvc[2]/vertSpacings[I][J][
K]) +
2245 dot(x[I+1][J+1][K ], x.get_mesh().Dvc[3]/vertSpacings[I][J][
K]) +
2246 dot(x[I ][J ][K+1], x.get_mesh().Dvc[4]/vertSpacings[I][J][
K]) +
2247 dot(x[I+1][J ][K+1], x.get_mesh().Dvc[5]/vertSpacings[I][J][
K]) +
2248 dot(x[I ][J+1][K+1], x.get_mesh().Dvc[6]/vertSpacings[I][J][
K]) +
2249 dot(x[I+1][J+1][K+1], x.get_mesh().Dvc[7]/vertSpacings[I][J][
K]);
2255 template <
class T,
class MFLOAT >
2260 PAssert_EQ(x.get_mesh().hasSpacingFields,
true);
2263 Index I = domain[0];
2265 dot(x[I-1], x.get_mesh().Dvc[0]/cellSpacings[I]) +
2266 dot(x[I ], x.get_mesh().Dvc[1]/cellSpacings[I]);
2270 template <
class T,
class MFLOAT >
2275 PAssert_EQ(x.get_mesh().hasSpacingFields,
true);
2278 Index I = domain[0];
2279 Index J = domain[1];
2281 dot(x[I-1][J-1], x.get_mesh().Dvc[0]/cellSpacings[I][J]) +
2282 dot(x[I ][J-1], x.get_mesh().Dvc[1]/cellSpacings[I][J]) +
2283 dot(x[I-1][J ], x.get_mesh().Dvc[2]/cellSpacings[I][J]) +
2284 dot(x[I ][J ], x.get_mesh().Dvc[3]/cellSpacings[I][J]);
2288 template <
class T,
class MFLOAT >
2293 PAssert_EQ(x.get_mesh().hasSpacingFields,
true);
2296 Index I = domain[0];
2297 Index J = domain[1];
2300 dot(x[I-1][J-1][K-1], x.get_mesh().Dvc[0]/cellSpacings[I][J][
K]) +
2301 dot(x[I ][J-1][K-1], x.get_mesh().Dvc[1]/cellSpacings[I][J][
K]) +
2302 dot(x[I-1][J ][K-1], x.get_mesh().Dvc[2]/cellSpacings[I][J][
K]) +
2303 dot(x[I ][J ][K-1], x.get_mesh().Dvc[3]/cellSpacings[I][J][
K]) +
2304 dot(x[I-1][J-1][K ], x.get_mesh().Dvc[4]/cellSpacings[I][J][
K]) +
2305 dot(x[I ][J-1][K ], x.get_mesh().Dvc[5]/cellSpacings[I][J][
K]) +
2306 dot(x[I-1][J ][K ], x.get_mesh().Dvc[6]/cellSpacings[I][J][
K]) +
2307 dot(x[I ][J ][K ], x.get_mesh().Dvc[7]/cellSpacings[I][J][
K]);
2328 template <
class T,
class MFLOAT >
2333 PAssert_EQ(x.get_mesh().hasSpacingFields,
true);
2336 Index I = domain[0];
2339 r[I] =
dot(idx, (x[I+1] - x[I-1])/(vS[I ] + vS[I-1]));
2343 template <
class T,
class MFLOAT >
2348 PAssert_EQ(x.get_mesh().hasSpacingFields,
true);
2351 Index I = domain[0];
2352 Index J = domain[1];
2359 dot(idx, (x[I+1][J ] - x[I-1][J ])/(vS[I ][J ] + vS[I-1][J ])) +
2360 dot(idy, (x[I ][J+1] - x[I ][J-1])/(vS[I ][J ] + vS[I ][J-1]));
2364 template <
class T,
class MFLOAT >
2369 PAssert_EQ(x.get_mesh().hasSpacingFields,
true);
2372 Index I = domain[0];
2373 Index J = domain[1];
2386 dot(idx, ((x[I+1][J ][K ] - x[I-1][J ][K ])/
2387 (vS[I ][J ][K ] + vS[I-1][J ][K ]))) +
2388 dot(idy, ((x[I ][J+1][K ] - x[I ][J-1][K ])/
2389 (vS[I ][J ][K ] + vS[I ][J-1][K ]))) +
2390 dot(idz, ((x[I ][J ][K+1] - x[I ][J ][K-1])/
2391 (vS[I ][J ][K ] + vS[I ][J ][K-1])));
2401 template <
class T,
class MFLOAT >
2406 PAssert_EQ(x.get_mesh().hasSpacingFields,
true);
2409 Index I = domain[0];
2412 r[I] =
dot(idx, (x[I+1] - x[I-1])/(cS[I ] + cS[I-1]));
2416 template <
class T,
class MFLOAT >
2421 PAssert_EQ(x.get_mesh().hasSpacingFields,
true);
2424 Index I = domain[0];
2425 Index J = domain[1];
2432 dot(idx, (x[I+1][J ] - x[I-1][J ])/(cS[I ][J ] + cS[I-1][J ])) +
2433 dot(idy, (x[I ][J+1] - x[I ][J-1])/(cS[I ][J ] + cS[I ][J-1]));
2437 template <
class T,
class MFLOAT >
2442 PAssert_EQ(x.get_mesh().hasSpacingFields,
true);
2445 Index I = domain[0];
2446 Index J = domain[1];
2459 dot(idx, ((x[I+1][J ][K ] - x[I-1][J ][K ])/
2460 (cS[I ][J ][K ] + cS[I-1][J ][K ]))) +
2461 dot(idy, ((x[I ][J+1][K ] - x[I ][J-1][K ])/
2462 (cS[I ][J ][K ] + cS[I ][J-1][K ]))) +
2463 dot(idz, ((x[I ][J ][K+1] - x[I ][J ][K-1])/
2464 (cS[I ][J ][K ] + cS[I ][J ][K-1])));
2470 template <
class T,
class MFLOAT >
2475 PAssert_EQ(x.get_mesh().hasSpacingFields,
true);
2478 Index I = domain[0];
2480 dot(x[I ], x.get_mesh().Dvc[0]/vertSpacings[I]) +
2481 dot(x[I+1], x.get_mesh().Dvc[1]/vertSpacings[I]);
2485 template <
class T,
class MFLOAT >
2490 PAssert_EQ(x.get_mesh().hasSpacingFields,
true);
2493 Index I = domain[0];
2494 Index J = domain[1];
2496 dot(x[I ][J ], x.get_mesh().Dvc[0]/vertSpacings[I][J]) +
2497 dot(x[I+1][J ], x.get_mesh().Dvc[1]/vertSpacings[I][J]) +
2498 dot(x[I ][J+1], x.get_mesh().Dvc[2]/vertSpacings[I][J]) +
2499 dot(x[I+1][J+1], x.get_mesh().Dvc[3]/vertSpacings[I][J]);
2503 template <
class T,
class MFLOAT >
2508 PAssert_EQ(x.get_mesh().hasSpacingFields,
true);
2511 Index I = domain[0];
2512 Index J = domain[1];
2515 dot(x[I ][J ][K ], x.get_mesh().Dvc[0]/vertSpacings[I][J][
K]) +
2516 dot(x[I+1][J ][K ], x.get_mesh().Dvc[1]/vertSpacings[I][J][
K]) +
2517 dot(x[I ][J+1][K ], x.get_mesh().Dvc[2]/vertSpacings[I][J][
K]) +
2518 dot(x[I+1][J+1][K ], x.get_mesh().Dvc[3]/vertSpacings[I][J][
K]) +
2519 dot(x[I ][J ][K+1], x.get_mesh().Dvc[4]/vertSpacings[I][J][
K]) +
2520 dot(x[I+1][J ][K+1], x.get_mesh().Dvc[5]/vertSpacings[I][J][
K]) +
2521 dot(x[I ][J+1][K+1], x.get_mesh().Dvc[6]/vertSpacings[I][J][
K]) +
2522 dot(x[I+1][J+1][K+1], x.get_mesh().Dvc[7]/vertSpacings[I][J][
K]);
2528 template <
class T,
class MFLOAT >
2533 PAssert_EQ(x.get_mesh().hasSpacingFields,
true);
2536 Index I = domain[0];
2538 dot(x[I ], x.get_mesh().Dvc[0]/vertSpacings[I]) +
2539 dot(x[I+1], x.get_mesh().Dvc[1]/vertSpacings[I]);
2543 template <
class T,
class MFLOAT >
2548 PAssert_EQ(x.get_mesh().hasSpacingFields,
true);
2551 Index I = domain[0];
2552 Index J = domain[1];
2554 dot(x[I ][J ], x.get_mesh().Dvc[0]/vertSpacings[I][J]) +
2555 dot(x[I+1][J ], x.get_mesh().Dvc[1]/vertSpacings[I][J]) +
2556 dot(x[I ][J+1], x.get_mesh().Dvc[2]/vertSpacings[I][J]) +
2557 dot(x[I+1][J+1], x.get_mesh().Dvc[3]/vertSpacings[I][J]);
2561 template <
class T,
class MFLOAT >
2566 PAssert_EQ(x.get_mesh().hasSpacingFields,
true);
2569 Index I = domain[0];
2570 Index J = domain[1];
2573 dot(x[I ][J ][K ], x.get_mesh().Dvc[0]/vertSpacings[I][J][
K]) +
2574 dot(x[I+1][J ][K ], x.get_mesh().Dvc[1]/vertSpacings[I][J][
K]) +
2575 dot(x[I ][J+1][K ], x.get_mesh().Dvc[2]/vertSpacings[I][J][
K]) +
2576 dot(x[I+1][J+1][K ], x.get_mesh().Dvc[3]/vertSpacings[I][J][
K]) +
2577 dot(x[I ][J ][K+1], x.get_mesh().Dvc[4]/vertSpacings[I][J][
K]) +
2578 dot(x[I+1][J ][K+1], x.get_mesh().Dvc[5]/vertSpacings[I][J][
K]) +
2579 dot(x[I ][J+1][K+1], x.get_mesh().Dvc[6]/vertSpacings[I][J][
K]) +
2580 dot(x[I+1][J+1][K+1], x.get_mesh().Dvc[7]/vertSpacings[I][J][
K]);
2587 template <
class T,
class MFLOAT >
2592 PAssert_EQ(x.get_mesh().hasSpacingFields,
true);
2595 Index I = domain[0];
2597 dot(x[I-1], x.get_mesh().Dvc[0]/cellSpacings[I]) +
2598 dot(x[I ], x.get_mesh().Dvc[1]/cellSpacings[I]);
2602 template <
class T,
class MFLOAT >
2607 PAssert_EQ(x.get_mesh().hasSpacingFields,
true);
2610 Index I = domain[0];
2611 Index J = domain[1];
2613 dot(x[I-1][J-1], x.get_mesh().Dvc[0]/cellSpacings[I][J]) +
2614 dot(x[I ][J-1], x.get_mesh().Dvc[1]/cellSpacings[I][J]) +
2615 dot(x[I-1][J ], x.get_mesh().Dvc[2]/cellSpacings[I][J]) +
2616 dot(x[I ][J ], x.get_mesh().Dvc[3]/cellSpacings[I][J]);
2620 template <
class T,
class MFLOAT >
2625 PAssert_EQ(x.get_mesh().hasSpacingFields,
true);
2628 Index I = domain[0];
2629 Index J = domain[1];
2632 dot(x[I-1][J-1][K-1], x.get_mesh().Dvc[0]/cellSpacings[I][J][
K]) +
2633 dot(x[I ][J-1][K-1], x.get_mesh().Dvc[1]/cellSpacings[I][J][
K]) +
2634 dot(x[I-1][J ][K-1], x.get_mesh().Dvc[2]/cellSpacings[I][J][
K]) +
2635 dot(x[I ][J ][K-1], x.get_mesh().Dvc[3]/cellSpacings[I][J][
K]) +
2636 dot(x[I-1][J-1][K ], x.get_mesh().Dvc[4]/cellSpacings[I][J][
K]) +
2637 dot(x[I ][J-1][K ], x.get_mesh().Dvc[5]/cellSpacings[I][J][
K]) +
2638 dot(x[I-1][J ][K ], x.get_mesh().Dvc[6]/cellSpacings[I][J][
K]) +
2639 dot(x[I ][J ][K ], x.get_mesh().Dvc[7]/cellSpacings[I][J][
K]);
2646 template <
class T,
class MFLOAT >
2651 PAssert_EQ(x.get_mesh().hasSpacingFields,
true);
2654 Index I = domain[0];
2656 dot(x[I-1], x.get_mesh().Dvc[0]/cellSpacings[I]) +
2657 dot(x[I ], x.get_mesh().Dvc[1]/cellSpacings[I]);
2661 template <
class T,
class MFLOAT >
2666 PAssert_EQ(x.get_mesh().hasSpacingFields,
true);
2669 Index I = domain[0];
2670 Index J = domain[1];
2672 dot(x[I-1][J-1], x.get_mesh().Dvc[0]/cellSpacings[I][J]) +
2673 dot(x[I ][J-1], x.get_mesh().Dvc[1]/cellSpacings[I][J]) +
2674 dot(x[I-1][J ], x.get_mesh().Dvc[2]/cellSpacings[I][J]) +
2675 dot(x[I ][J ], x.get_mesh().Dvc[3]/cellSpacings[I][J]);
2679 template <
class T,
class MFLOAT >
2684 PAssert_EQ(x.get_mesh().hasSpacingFields,
true);
2687 Index I = domain[0];
2688 Index J = domain[1];
2691 dot(x[I-1][J-1][K-1], x.get_mesh().Dvc[0]/cellSpacings[I][J][
K]) +
2692 dot(x[I ][J-1][K-1], x.get_mesh().Dvc[1]/cellSpacings[I][J][
K]) +
2693 dot(x[I-1][J ][K-1], x.get_mesh().Dvc[2]/cellSpacings[I][J][
K]) +
2694 dot(x[I ][J ][K-1], x.get_mesh().Dvc[3]/cellSpacings[I][J][
K]) +
2695 dot(x[I-1][J-1][K ], x.get_mesh().Dvc[4]/cellSpacings[I][J][
K]) +
2696 dot(x[I ][J-1][K ], x.get_mesh().Dvc[5]/cellSpacings[I][J][
K]) +
2697 dot(x[I-1][J ][K ], x.get_mesh().Dvc[6]/cellSpacings[I][J][
K]) +
2698 dot(x[I ][J ][K ], x.get_mesh().Dvc[7]/cellSpacings[I][J][
K]);
2707 template <
class T,
class MFLOAT >
2712 PAssert_EQ(x.get_mesh().hasSpacingFields,
true);
2715 Index I = domain[0];
2716 r[I] = (x[I ]*x.get_mesh().Dvc[0] +
2717 x[I+1]*x.get_mesh().Dvc[1])/vertSpacings[I];
2721 template <
class T,
class MFLOAT >
2726 PAssert_EQ(x.get_mesh().hasSpacingFields,
true);
2729 Index I = domain[0];
2730 Index J = domain[1];
2731 r[I][J] = (x[I ][J ]*x.get_mesh().Dvc[0] +
2732 x[I+1][J ]*x.get_mesh().Dvc[1] +
2733 x[I ][J+1]*x.get_mesh().Dvc[2] +
2734 x[I+1][J+1]*x.get_mesh().Dvc[3])/vertSpacings[I][J];
2738 template <
class T,
class MFLOAT >
2743 PAssert_EQ(x.get_mesh().hasSpacingFields,
true);
2746 Index I = domain[0];
2747 Index J = domain[1];
2749 r[I][J][
K] = (x[I ][J ][
K ]*x.get_mesh().Dvc[0] +
2750 x[I+1][J ][
K ]*x.get_mesh().Dvc[1] +
2751 x[I ][J+1][
K ]*x.get_mesh().Dvc[2] +
2752 x[I+1][J+1][
K ]*x.get_mesh().Dvc[3] +
2753 x[I ][J ][K+1]*x.get_mesh().Dvc[4] +
2754 x[I+1][J ][K+1]*x.get_mesh().Dvc[5] +
2755 x[I ][J+1][K+1]*x.get_mesh().Dvc[6] +
2756 x[I+1][J+1][K+1]*x.get_mesh().Dvc[7])/vertSpacings[I][J][K];
2764 template <
class T,
class MFLOAT >
2769 PAssert_EQ(x.get_mesh().hasSpacingFields,
true);
2772 Index I = domain[0];
2773 r[I] = (x[I-1]*x.get_mesh().Dvc[0] +
2774 x[I ]*x.get_mesh().Dvc[1])/cellSpacings[I];
2778 template <
class T,
class MFLOAT >
2783 PAssert_EQ(x.get_mesh().hasSpacingFields,
true);
2786 Index I = domain[0];
2787 Index J = domain[1];
2788 r[I][J] = (x[I-1][J-1]*x.get_mesh().Dvc[0] +
2789 x[I ][J-1]*x.get_mesh().Dvc[1] +
2790 x[I-1][J ]*x.get_mesh().Dvc[2] +
2791 x[I ][J ]*x.get_mesh().Dvc[3])/cellSpacings[I][J];
2795 template <
class T,
class MFLOAT >
2800 PAssert_EQ(x.get_mesh().hasSpacingFields,
true);
2803 Index I = domain[0];
2804 Index J = domain[1];
2807 for (
unsigned int d=0; d < 1<<3U; d++) dvc[d] = x.get_mesh().Dvc[d];
2808 r[I][J][
K] = (x[I-1][J-1][K-1]*dvc[0] +
2809 x[I ][J-1][K-1]*dvc[1] +
2810 x[I-1][J ][K-1]*dvc[2] +
2811 x[I ][J ][K-1]*dvc[3] +
2812 x[I-1][J-1][
K ]*dvc[4] +
2813 x[I ][J-1][
K ]*dvc[5] +
2814 x[I-1][J ][
K ]*dvc[6] +
2815 x[I ][J ][
K ]*dvc[7])/
2816 cellSpacings[I][J][K];
2835 template <
class T,
class MFLOAT >
2840 PAssert_EQ(x.get_mesh().hasSpacingFields,
true);
2842 *(x.get_mesh().VertSpacings);
2844 Index I = domain[0];
2849 r[I] = idx*((x[I+1] - x[I-1])/(vertSpacings[I] + vertSpacings[I-1]));
2853 template <
class T,
class MFLOAT >
2858 PAssert_EQ(x.get_mesh().hasSpacingFields,
true);
2860 *(x.get_mesh().VertSpacings);
2862 Index I = domain[0];
2863 Index J = domain[1];
2872 idx*((x[I+1][J ] - x[I-1][J ])/
2873 (vertSpacings[I][J] + vertSpacings[I-1][J])) +
2874 idy*((x[I ][J+1] - x[I ][J-1])/
2875 (vertSpacings[I][J] + vertSpacings[I][J-1]));
2879 template <
class T,
class MFLOAT >
2884 PAssert_EQ(x.get_mesh().hasSpacingFields,
true);
2886 *(x.get_mesh().VertSpacings);
2888 Index I = domain[0];
2889 Index J = domain[1];
2904 idx*((x[I+1][J ][
K ] - x[I-1][J ][
K ])/
2905 (vertSpacings[I][J][K] + vertSpacings[I-1][J][K])) +
2906 idy*((x[I ][J+1][K ] - x[I ][J-1][K ])/
2907 (vertSpacings[I][J][
K] + vertSpacings[I][J-1][
K])) +
2908 idz*((x[I ][J ][K+1] - x[I ][J ][K-1])/
2909 (vertSpacings[I][J][K] + vertSpacings[I][J][K-1]));
2915 template <
class T,
class MFLOAT >
2920 PAssert_EQ(x.get_mesh().hasSpacingFields,
true);
2922 *(x.get_mesh().CellSpacings);
2924 Index I = domain[0];
2929 r[I] = idx*((x[I+1] - x[I-1])/(cellSpacings[I] + cellSpacings[I+1]));
2933 template <
class T,
class MFLOAT >
2938 PAssert_EQ(x.get_mesh().hasSpacingFields,
true);
2940 *(x.get_mesh().CellSpacings);
2942 Index I = domain[0];
2943 Index J = domain[1];
2952 idx*((x[I+1][J ] - x[I-1][J ])/
2953 (cellSpacings[I][J] + cellSpacings[I+1][J])) +
2954 idy*((x[I ][J+1] - x[I ][J-1])/
2955 (cellSpacings[I][J] + cellSpacings[I][J+1]));
2959 template <
class T,
class MFLOAT >
2964 PAssert_EQ(x.get_mesh().hasSpacingFields,
true);
2966 *(x.get_mesh().CellSpacings);
2968 Index I = domain[0];
2969 Index J = domain[1];
2984 idx*((x[I+1][J ][
K ] - x[I-1][J ][
K ])/
2985 (cellSpacings[I][J][K] + cellSpacings[I+1][J][K])) +
2986 idy*((x[I ][J+1][K ] - x[I ][J-1][K ])/
2987 (cellSpacings[I][J][
K] + cellSpacings[I][J+1][
K])) +
2988 idz*((x[I ][J ][K+1] - x[I ][J ][K-1])/
2989 (cellSpacings[I][J][K] + cellSpacings[I][J][K+1]));
2995 template <
class T,
class MFLOAT >
3000 PAssert_EQ(x.get_mesh().hasSpacingFields,
true);
3003 Index I = domain[0];
3010 template <
class T,
class MFLOAT >
3015 PAssert_EQ(x.get_mesh().hasSpacingFields,
true);
3018 Index I = domain[0];
3019 Index J = domain[1];
3021 outerProduct(x[I ][J ], x.get_mesh().Dvc[0]/vS[I][J]) +
3022 outerProduct(x[I+1][J ], x.get_mesh().Dvc[1]/vS[I][J]) +
3023 outerProduct(x[I ][J+1], x.get_mesh().Dvc[2]/vS[I][J]) +
3024 outerProduct(x[I+1][J+1], x.get_mesh().Dvc[3]/vS[I][J]);
3028 template <
class T,
class MFLOAT >
3033 PAssert_EQ(x.get_mesh().hasSpacingFields,
true);
3036 Index I = domain[0];
3037 Index J = domain[1];
3040 outerProduct(x[I ][J ][K ], x.get_mesh().Dvc[0]/vS[I][J][
K]) +
3041 outerProduct(x[I+1][J ][K ], x.get_mesh().Dvc[1]/vS[I][J][
K]) +
3042 outerProduct(x[I ][J+1][K ], x.get_mesh().Dvc[2]/vS[I][J][
K]) +
3043 outerProduct(x[I+1][J+1][K ], x.get_mesh().Dvc[3]/vS[I][J][
K]) +
3044 outerProduct(x[I ][J ][K+1], x.get_mesh().Dvc[4]/vS[I][J][
K]) +
3045 outerProduct(x[I+1][J ][K+1], x.get_mesh().Dvc[5]/vS[I][J][
K]) +
3046 outerProduct(x[I ][J+1][K+1], x.get_mesh().Dvc[6]/vS[I][J][
K]) +
3047 outerProduct(x[I+1][J+1][K+1], x.get_mesh().Dvc[7]/vS[I][J][
K]);
3055 template <
class T,
class MFLOAT >
3060 PAssert_EQ(x.get_mesh().hasSpacingFields,
true);
3063 Index I = domain[0];
3065 outerProduct(x[I-1], x.get_mesh().Dvc[0]/cellSpacings[I-1]) +
3066 outerProduct(x[I ], x.get_mesh().Dvc[1]/cellSpacings[I-1]);
3070 template <
class T,
class MFLOAT >
3075 PAssert_EQ(x.get_mesh().hasSpacingFields,
true);
3078 Index I = domain[0];
3079 Index J = domain[1];
3081 outerProduct(x[I-1][J-1], x.get_mesh().Dvc[0]/cS[I-1][J-1]) +
3082 outerProduct(x[I ][J-1], x.get_mesh().Dvc[1]/cS[I-1][J-1]) +
3083 outerProduct(x[I-1][J ], x.get_mesh().Dvc[2]/cS[I-1][J-1]) +
3084 outerProduct(x[I ][J ], x.get_mesh().Dvc[3]/cS[I-1][J-1]);
3088 template <
class T,
class MFLOAT >
3093 PAssert_EQ(x.get_mesh().hasSpacingFields,
true);
3096 Index I = domain[0];
3097 Index J = domain[1];
3100 outerProduct(x[I-1][J-1][K-1], x.get_mesh().Dvc[0]/cS[I-1][J-1][K-1]) +
3101 outerProduct(x[I ][J-1][K-1], x.get_mesh().Dvc[1]/cS[I-1][J-1][K-1]) +
3102 outerProduct(x[I-1][J ][K-1], x.get_mesh().Dvc[2]/cS[I-1][J-1][K-1]) +
3103 outerProduct(x[I ][J ][K-1], x.get_mesh().Dvc[3]/cS[I-1][J-1][K-1]) +
3104 outerProduct(x[I-1][J-1][K ], x.get_mesh().Dvc[4]/cS[I-1][J-1][K-1]) +
3105 outerProduct(x[I ][J-1][K ], x.get_mesh().Dvc[5]/cS[I-1][J-1][K-1]) +
3106 outerProduct(x[I-1][J ][K ], x.get_mesh().Dvc[6]/cS[I-1][J-1][K-1]) +
3107 outerProduct(x[I ][J ][K ], x.get_mesh().Dvc[7]/cS[I-1][J-1][K-1]);
3118 template <
class T1,
class T2,
class MFLOAT >
3121 Field<T2,1U,Cartesian<1U,MFLOAT>,
Cell>& w,
3122 Field<T1,1U,Cartesian<1U,MFLOAT>,
Vert>& r)
3125 Index I = domain[0];
3126 r[I] = (x[I-1]*w[I-1] + x[I ]*w[I ])/(w[I-1] + w[I ]);
3130 template <
class T1,
class T2,
class MFLOAT >
3133 Field<T2,2U,Cartesian<2U,MFLOAT>,
Cell>& w,
3134 Field<T1,2U,Cartesian<2U,MFLOAT>,
Vert>& r)
3137 Index I = domain[0];
3138 Index J = domain[1];
3140 r[I][J] = (x[I-1][J-1] * w[I-1][J-1] +
3141 x[I ][J-1] * w[I ][J-1] +
3142 x[I-1][J ] * w[I-1][J ] +
3143 x[I ][J ] * w[I ][J ])/
3151 template <
class T1,
class T2,
class MFLOAT >
3154 Field<T2,3U,Cartesian<3U,MFLOAT>,
Cell>& w,
3155 Field<T1,3U,Cartesian<3U,MFLOAT>,
Vert>& r)
3158 Index I = domain[0];
3159 Index J = domain[1];
3162 r[I][J][
K] = (x[I-1][J-1][K-1] * w[I-1][J-1][K-1] +
3163 x[I ][J-1][K-1] * w[I ][J-1][K-1] +
3164 x[I-1][J ][K-1] * w[I-1][J ][K-1] +
3165 x[I ][J ][K-1] * w[I ][J ][K-1] +
3166 x[I-1][J-1][
K ] * w[I-1][J-1][
K ] +
3167 x[I ][J-1][
K ] * w[I ][J-1][
K ] +
3168 x[I-1][J ][
K ] * w[I-1][J ][
K ] +
3169 x[I ][J ][
K ] * w[I ][J ][
K ] )/
3184 template <
class T1,
class T2,
class MFLOAT >
3187 Field<T2,1U,Cartesian<1U,MFLOAT>,
Vert>& w,
3188 Field<T1,1U,Cartesian<1U,MFLOAT>,
Cell>& r)
3191 Index I = domain[0];
3192 r[I] = (x[I+1]*w[I+1] + x[I ]*w[I ])/(w[I+1] + w[I ]);
3196 template <
class T1,
class T2,
class MFLOAT >
3199 Field<T2,2U,Cartesian<2U,MFLOAT>,
Vert>& w,
3200 Field<T1,2U,Cartesian<2U,MFLOAT>,
Cell>& r)
3203 Index I = domain[0];
3204 Index J = domain[1];
3206 r[I][J] = (x[I+1][J+1] * w[I+1][J+1] +
3207 x[I ][J+1] * w[I ][J+1] +
3208 x[I+1][J ] * w[I+1][J ] +
3209 x[I ][J ] * w[I ][J ])/
3217 template <
class T1,
class T2,
class MFLOAT >
3220 Field<T2,3U,Cartesian<3U,MFLOAT>,
Vert>& w,
3221 Field<T1,3U,Cartesian<3U,MFLOAT>,
Cell>& r)
3224 Index I = domain[0];
3225 Index J = domain[1];
3228 r[I][J][
K] = (x[I+1][J+1][K+1] * w[I+1][J+1][K+1] +
3229 x[I ][J+1][K+1] * w[I ][J+1][K+1] +
3230 x[I+1][J ][K+1] * w[I+1][J ][K+1] +
3231 x[I ][J ][K+1] * w[I ][J ][K+1] +
3232 x[I+1][J+1][
K ] * w[I+1][J+1][
K ] +
3233 x[I ][J+1][
K ] * w[I ][J+1][
K ] +
3234 x[I+1][J ][
K ] * w[I+1][J ][
K ] +
3235 x[I ][J ][
K ] * w[I ][J ][
K ])/
3250 template <
class T1,
class MFLOAT >
3253 Field<T1,1U,Cartesian<1U,MFLOAT>,
Vert>& r)
3256 Index I = domain[0];
3257 r[I] = 0.5*(x[I-1] + x[I ]);
3261 template <
class T1,
class MFLOAT >
3264 Field<T1,2U,Cartesian<2U,MFLOAT>,
Vert>& r)
3267 Index I = domain[0];
3268 Index J = domain[1];
3269 r[I][J] = 0.25*(x[I-1][J-1] + x[I ][J-1] + x[I-1][J ] + x[I ][J ]);
3273 template <
class T1,
class MFLOAT >
3276 Field<T1,3U,Cartesian<3U,MFLOAT>,
Vert>& r)
3279 Index I = domain[0];
3280 Index J = domain[1];
3282 r[I][J][
K] = 0.125*(x[I-1][J-1][K-1] + x[I ][J-1][K-1] + x[I-1][J ][K-1] +
3283 x[I ][J ][K-1] + x[I-1][J-1][
K ] + x[I ][J-1][
K ] +
3284 x[I-1][J ][
K ] + x[I ][J ][
K ]);
3291 template <
class T1,
class MFLOAT >
3294 Field<T1,1U,Cartesian<1U,MFLOAT>,
Cell>& r)
3297 Index I = domain[0];
3298 r[I] = 0.5*(x[I+1] + x[I ]);
3302 template <
class T1,
class MFLOAT >
3305 Field<T1,2U,Cartesian<2U,MFLOAT>,
Cell>& r)
3308 Index I = domain[0];
3309 Index J = domain[1];
3310 r[I][J] = 0.25*(x[I+1][J+1] + x[I ][J+1] + x[I+1][J ] + x[I ][J ]);
3314 template <
class T1,
class MFLOAT >
3317 Field<T1,3U,Cartesian<3U,MFLOAT>,
Cell>& r)
3320 Index I = domain[0];
3321 Index J = domain[1];
3323 r[I][J][
K] = 0.125*(x[I+1][J+1][K+1] + x[I ][J+1][K+1] + x[I+1][J ][K+1] +
3324 x[I ][J ][K+1] + x[I+1][J+1][
K ] + x[I ][J+1][
K ] +
3325 x[I+1][J ][
K ] + x[I ][J ][
K ]);
void storeSpacingFields()
void PETE_apply(const OpPeriodic< T > &e, T &a, const T &b)
Vektor< MFLOAT, Dim > * getSurfaceNormals(const NDIndex< Dim > &) const
Field< Vektor< MFLOAT, Dim >, Dim, Cartesian< Dim, MFLOAT >, Cell > & getSurfaceNormalField(Field< Vektor< MFLOAT, Dim >, Dim, Cartesian< Dim, MFLOAT >, Cell > &, unsigned) const
PETE_TUTree< FnAbs, typename T::PETE_Expr_t > abs(const PETE_Expr< T > &l)
ac_id_larray::iterator iterator_if
constexpr double e
The value of .
Vektor< MFLOAT, Dim > getSurfaceNormal(const NDIndex< Dim > &, unsigned) const
const NDIndex< Dim > & getOwned() const
T::PETE_Expr_t::PETE_Return_t max(const PETE_Expr< T > &expr, NDIndex< D > &loc)
Field< Vektor< MFLOAT, Dim >, Dim, Cartesian< Dim, MFLOAT >, Cell > & getCellPositionField(Field< Vektor< MFLOAT, Dim >, Dim, Cartesian< Dim, MFLOAT >, Cell > &) const
Vektor< MFLOAT, Dim > getDeltaCell(const NDIndex< Dim > &) const
MeshBC_E * get_MeshBC() const
NDIndex< Dim > getNearestVertex(const Vektor< MFLOAT, Dim > &) const
void initialize(const NDIndex< Dim > &ndi)
NDIndex< Dim > AddGuardCells(const NDIndex< Dim > &idx, const GuardCellSizes< Dim > &g)
void assign(const BareField< T, Dim > &a, RHS b, OP op, ExprTag< true >)
double dot(const Vector3D &lhs, const Vector3D &rhs)
Vector dot product.
Field< Vektor< MFLOAT, Dim >, Dim, Cartesian< Dim, MFLOAT >, Vert > & getVertexPositionField(Field< Vektor< MFLOAT, Dim >, Dim, Cartesian< Dim, MFLOAT >, Vert > &) const
void set_meshSpacing(MFLOAT **const del)
Field< Vektor< T, 1U >, 1U, Cartesian< 1U, MFLOAT >, Cell > & Grad(Field< T, 1U, Cartesian< 1U, MFLOAT >, Vert > &x, Field< Vektor< T, 1U >, 1U, Cartesian< 1U, MFLOAT >, Cell > &r)
const iterator & begin() const
unsigned int length() const
NDIndex< Dim > plugBase(const NDIndex< 1 > &i) const
virtual void fillGuardCells(bool reallyFill=true) const
Vektor< MFLOAT, Dim > get_origin() const
Vektor< MFLOAT, Dim > getVertexPosition(const NDIndex< Dim > &) const
Field< Vektor< MFLOAT, Dim >, Dim, Cartesian< Dim, MFLOAT >, Vert > & getDeltaCellField(Field< Vektor< MFLOAT, Dim >, Dim, Cartesian< Dim, MFLOAT >, Vert > &) const
Field< MFLOAT, Dim, Cartesian< Dim, MFLOAT >, Cell > & getCellVolumeField(Field< MFLOAT, Dim, Cartesian< Dim, MFLOAT >, Cell > &) const
unsigned rightGuard(unsigned d) const
bool touches(const NDIndex< Dim > &) const
unsigned leftGuard(unsigned d) const
const NDIndex< Dim > & getAllocated() const
void print(std::ostream &)
Field< T1, 1U, Cartesian< 1U, MFLOAT >, Vert > & Average(Field< T1, 1U, Cartesian< 1U, MFLOAT >, Cell > &x, Field< T2, 1U, Cartesian< 1U, MFLOAT >, Cell > &w, Field< T1, 1U, Cartesian< 1U, MFLOAT >, Vert > &r)
const T * find(const T table[], const std::string &name)
Look up name.
MFLOAT getVertRangeVolume(const NDIndex< Dim > &) const
Field< Vektor< MFLOAT, Dim >, Dim, Cartesian< Dim, MFLOAT >, Cell > & getDeltaVertexField(Field< Vektor< MFLOAT, Dim >, Dim, Cartesian< Dim, MFLOAT >, Cell > &) const
OpMeshExtrapolate(T &o, T &s)
void getSurfaceNormalFields(Field< Vektor< MFLOAT, Dim >, Dim, Cartesian< Dim, MFLOAT >, Cell > **) const
void set_MeshBC(unsigned face, MeshBC_E meshBCType)
Vektor< MFLOAT, Dim > getDeltaVertex(const NDIndex< Dim > &) const
Tenzor< typename PETEBinaryReturn< T1, T2, OpMultipply >::type, D > outerProduct(const Vektor< T1, D > &v1, const Vektor< T2, D > &v2)
NDIndex< Dim > intersect(const NDIndex< Dim > &) const
void set_origin(const Vektor< MFLOAT, Dim > &o)
std::string::iterator iterator
const GuardCellSizes< Dim > & getGuardCellSizes() const
NDIndex< Dim > getVertexBelow(const Vektor< MFLOAT, Dim > &) const
MFLOAT getCellRangeVolume(const NDIndex< Dim > &) const
Vektor< MFLOAT, Dim > getCellPosition(const NDIndex< Dim > &) const
T::PETE_Expr_t::PETE_Return_t min(const PETE_Expr< T > &expr, NDIndex< D > &loc)
double Div(double a, double b)
Inform & endl(Inform &inf)
void updateMeshSpacingGuards(int face)
MFLOAT getCellVolume(const NDIndex< Dim > &) const
void get_meshSpacing(unsigned d, MFLOAT *spacings) const