38#define UNARY_FUNCTION(ReturnType, Type1, Func, Dfunc) \
43 GeometricField<ReturnType, PatchField, GeoMesh>& res, \
44 const GeometricField<Type1, PatchField, GeoMesh>& gf1 \
47 Foam::Func(res.primitiveFieldRef(), gf1.primitiveField()); \
48 Foam::Func(res.boundaryFieldRef(), gf1.boundaryField()); \
49 res.oriented() = gf1.oriented(); \
54tmp<GeometricField<ReturnType, PatchField, GeoMesh>> Func \
56 const GeometricField<Type1, PatchField, GeoMesh>& gf1 \
60 tmp<GeometricField<ReturnType, PatchField, GeoMesh>>::New \
64 #Func "(" + gf1.name() + ')', \
71 Dfunc(gf1.dimensions()) \
74 Foam::Func(tres.ref(), gf1); \
81tmp<GeometricField<ReturnType, PatchField, GeoMesh>> Func \
83 const tmp<GeometricField<Type1, PatchField, GeoMesh>>& tgf1 \
86 const GeometricField<Type1, PatchField, GeoMesh>& gf1 = tgf1(); \
89 reuseTmpGeometricField<ReturnType, Type1, PatchField, GeoMesh>::New \
92 #Func "(" + gf1.name() + ')', \
93 Dfunc(gf1.dimensions()) \
96 Foam::Func(tres.ref(), gf1); \
106#define UNARY_OPERATOR(ReturnType, Type1, Op, OpFunc, Dfunc) \
111 GeometricField<ReturnType, PatchField, GeoMesh>& res, \
112 const GeometricField<Type1, PatchField, GeoMesh>& gf1 \
115 Foam::OpFunc(res.primitiveFieldRef(), gf1.primitiveField()); \
116 Foam::OpFunc(res.boundaryFieldRef(), gf1.boundaryField()); \
117 res.oriented() = gf1.oriented(); \
121tmp<GeometricField<ReturnType, PatchField, GeoMesh>> operator Op \
123 const GeometricField<Type1, PatchField, GeoMesh>& gf1 \
127 tmp<GeometricField<ReturnType, PatchField, GeoMesh>>::New \
138 Dfunc(gf1.dimensions()) \
141 Foam::OpFunc(tres.ref(), gf1); \
148tmp<GeometricField<ReturnType, PatchField, GeoMesh>> operator Op \
150 const tmp<GeometricField<Type1, PatchField, GeoMesh>>& tgf1 \
153 const GeometricField<Type1, PatchField, GeoMesh>& gf1 = tgf1(); \
156 reuseTmpGeometricField<ReturnType, Type1, PatchField, GeoMesh>::New \
160 Dfunc(gf1.dimensions()) \
163 Foam::OpFunc(tres.ref(), gf1); \
173#define BINARY_FUNCTION(ReturnType, Type1, Type2, Func) \
178 GeometricField<ReturnType, PatchField, GeoMesh>& res, \
179 const GeometricField<Type1, PatchField, GeoMesh>& gf1, \
180 const GeometricField<Type2, PatchField, GeoMesh>& gf2 \
185 res.primitiveFieldRef(), \
186 gf1.primitiveField(), \
187 gf2.primitiveField() \
191 res.boundaryFieldRef(), \
192 gf1.boundaryField(), \
193 gf2.boundaryField() \
195 res.oriented() = Func(gf1.oriented(), gf2.oriented()); \
200tmp<GeometricField<ReturnType, PatchField, GeoMesh>> Func \
202 const GeometricField<Type1, PatchField, GeoMesh>& gf1, \
203 const GeometricField<Type2, PatchField, GeoMesh>& gf2 \
207 tmp<GeometricField<ReturnType, PatchField, GeoMesh>>::New \
211 #Func "(" + gf1.name() + ',' + gf2.name() + ')', \
218 Func(gf1.dimensions(), gf2.dimensions()) \
221 Foam::Func(tres.ref(), gf1, gf2); \
228tmp<GeometricField<ReturnType, PatchField, GeoMesh>> Func \
230 const GeometricField<Type1, PatchField, GeoMesh>& gf1, \
231 const tmp<GeometricField<Type2, PatchField, GeoMesh>>& tgf2 \
234 const GeometricField<Type2, PatchField, GeoMesh>& gf2 = tgf2(); \
237 reuseTmpGeometricField<ReturnType, Type2, PatchField, GeoMesh>::New \
240 #Func "(" + gf1.name() + ',' + gf2.name() + ')', \
241 Func(gf1.dimensions(), gf2.dimensions()) \
244 Foam::Func(tres.ref(), gf1, gf2); \
253tmp<GeometricField<ReturnType, PatchField, GeoMesh>> Func \
255 const tmp<GeometricField<Type1, PatchField, GeoMesh>>& tgf1, \
256 const GeometricField<Type2, PatchField, GeoMesh>& gf2 \
259 const GeometricField<Type1, PatchField, GeoMesh>& gf1 = tgf1(); \
262 reuseTmpGeometricField<ReturnType, Type1, PatchField, GeoMesh>::New \
265 #Func "(" + gf1.name() + ',' + gf2.name() + ')', \
266 Func(gf1.dimensions(), gf2.dimensions()) \
269 Foam::Func(tres.ref(), gf1, gf2); \
278tmp<GeometricField<ReturnType, PatchField, GeoMesh>> Func \
280 const tmp<GeometricField<Type1, PatchField, GeoMesh>>& tgf1, \
281 const tmp<GeometricField<Type2, PatchField, GeoMesh>>& tgf2 \
284 const GeometricField<Type1, PatchField, GeoMesh>& gf1 = tgf1(); \
285 const GeometricField<Type2, PatchField, GeoMesh>& gf2 = tgf2(); \
288 reuseTmpTmpGeometricField \
289 <ReturnType, Type1, Type1, Type2, PatchField, GeoMesh> \
294 #Func "(" + gf1.name() + ',' + gf2.name() + ')', \
295 Func(gf1.dimensions(), gf2.dimensions()) \
298 Foam::Func(tres.ref(), gf1, gf2); \
309#define BINARY_TYPE_FUNCTION_SF(ReturnType, Type1, Type2, Func) \
314 GeometricField<ReturnType, PatchField, GeoMesh>& res, \
315 const dimensioned<Type1>& dt1, \
316 const GeometricField<Type2, PatchField, GeoMesh>& gf2 \
319 Foam::Func(res.primitiveFieldRef(), dt1.value(), gf2.primitiveField()); \
320 Foam::Func(res.boundaryFieldRef(), dt1.value(), gf2.boundaryField()); \
321 res.oriented() = gf2.oriented(); \
326tmp<GeometricField<ReturnType, PatchField, GeoMesh>> Func \
328 const dimensioned<Type1>& dt1, \
329 const GeometricField<Type2, PatchField, GeoMesh>& gf2 \
333 tmp<GeometricField<ReturnType, PatchField, GeoMesh>>::New \
337 #Func "(" + dt1.name() + ',' + gf2.name() + ')', \
344 Func(dt1.dimensions(), gf2.dimensions()) \
347 Foam::Func(tres.ref(), dt1, gf2); \
354tmp<GeometricField<ReturnType, PatchField, GeoMesh>> Func \
357 const GeometricField<Type2, PatchField, GeoMesh>& gf2 \
360 return Func(dimensioned<Type1>(t1), gf2); \
365tmp<GeometricField<ReturnType, PatchField, GeoMesh>> Func \
367 const dimensioned<Type1>& dt1, \
368 const tmp<GeometricField<Type2, PatchField, GeoMesh>>& tgf2 \
371 const GeometricField<Type2, PatchField, GeoMesh>& gf2 = tgf2(); \
374 reuseTmpGeometricField<ReturnType, Type2, PatchField, GeoMesh>::New \
377 #Func "(" + dt1.name() + gf2.name() + ',' + ')', \
378 Func(dt1.dimensions(), gf2.dimensions()) \
381 Foam::Func(tres.ref(), dt1, gf2); \
390tmp<GeometricField<ReturnType, PatchField, GeoMesh>> Func \
393 const tmp<GeometricField<Type2, PatchField, GeoMesh>>& tgf2 \
396 return Func(dimensioned<Type1>(t1), tgf2); \
400#define BINARY_TYPE_FUNCTION_FS(ReturnType, Type1, Type2, Func) \
405 GeometricField<ReturnType, PatchField, GeoMesh>& res, \
406 const GeometricField<Type1, PatchField, GeoMesh>& gf1, \
407 const dimensioned<Type2>& dt2 \
410 Foam::Func(res.primitiveFieldRef(), gf1.primitiveField(), dt2.value()); \
411 Foam::Func(res.boundaryFieldRef(), gf1.boundaryField(), dt2.value()); \
412 res.oriented() = gf1.oriented(); \
417tmp<GeometricField<ReturnType, PatchField, GeoMesh>> Func \
419 const GeometricField<Type1, PatchField, GeoMesh>& gf1, \
420 const dimensioned<Type2>& dt2 \
424 tmp<GeometricField<ReturnType, PatchField, GeoMesh>>::New \
428 #Func "(" + gf1.name() + ',' + dt2.name() + ')', \
435 Func(gf1.dimensions(), dt2.dimensions()) \
438 Foam::Func(tres.ref(), gf1, dt2); \
445tmp<GeometricField<ReturnType, PatchField, GeoMesh>> Func \
447 const GeometricField<Type1, PatchField, GeoMesh>& gf1, \
451 return Func(gf1, dimensioned<Type2>(t2)); \
456tmp<GeometricField<ReturnType, PatchField, GeoMesh>> Func \
458 const tmp<GeometricField<Type1, PatchField, GeoMesh>>& tgf1, \
459 const dimensioned<Type2>& dt2 \
462 const GeometricField<Type1, PatchField, GeoMesh>& gf1 = tgf1(); \
465 reuseTmpGeometricField<ReturnType, Type1, PatchField, GeoMesh>::New \
468 #Func "(" + gf1.name() + ',' + dt2.name() + ')', \
469 Func(gf1.dimensions(), dt2.dimensions()) \
472 Foam::Func(tres.ref(), gf1, dt2); \
481tmp<GeometricField<ReturnType, PatchField, GeoMesh>> Func \
483 const tmp<GeometricField<Type1, PatchField, GeoMesh>>& tgf1, \
487 return Func(tgf1, dimensioned<Type2>(t2)); \
491#define BINARY_TYPE_FUNCTION(ReturnType, Type1, Type2, Func) \
492 BINARY_TYPE_FUNCTION_SF(ReturnType, Type1, Type2, Func) \
493 BINARY_TYPE_FUNCTION_FS(ReturnType, Type1, Type2, Func)
498#define BINARY_OPERATOR(ReturnType, Type1, Type2, Op, OpName, OpFunc) \
503 GeometricField<ReturnType, PatchField, GeoMesh>& res, \
504 const GeometricField<Type1, PatchField, GeoMesh>& gf1, \
505 const GeometricField<Type2, PatchField, GeoMesh>& gf2 \
509 (res.primitiveFieldRef(), gf1.primitiveField(), gf2.primitiveField()); \
511 (res.boundaryFieldRef(), gf1.boundaryField(), gf2.boundaryField()); \
512 res.oriented() = gf1.oriented() Op gf2.oriented(); \
517tmp<GeometricField<ReturnType, PatchField, GeoMesh>> operator Op \
519 const GeometricField<Type1, PatchField, GeoMesh>& gf1, \
520 const GeometricField<Type2, PatchField, GeoMesh>& gf2 \
524 tmp<GeometricField<ReturnType, PatchField, GeoMesh>>::New \
528 '(' + gf1.name() + OpName + gf2.name() + ')', \
535 gf1.dimensions() Op gf2.dimensions() \
538 Foam::OpFunc(tres.ref(), gf1, gf2); \
545tmp<GeometricField<ReturnType, PatchField, GeoMesh>> operator Op \
547 const GeometricField<Type1, PatchField, GeoMesh>& gf1, \
548 const tmp<GeometricField<Type2, PatchField, GeoMesh>>& tgf2 \
551 const GeometricField<Type2, PatchField, GeoMesh>& gf2 = tgf2(); \
554 reuseTmpGeometricField<ReturnType, Type2, PatchField, GeoMesh>::New \
557 '(' + gf1.name() + OpName + gf2.name() + ')', \
558 gf1.dimensions() Op gf2.dimensions() \
561 Foam::OpFunc(tres.ref(), gf1, gf2); \
570tmp<GeometricField<ReturnType, PatchField, GeoMesh>> operator Op \
572 const tmp<GeometricField<Type1, PatchField, GeoMesh>>& tgf1, \
573 const GeometricField<Type2, PatchField, GeoMesh>& gf2 \
576 const GeometricField<Type1, PatchField, GeoMesh>& gf1 = tgf1(); \
579 reuseTmpGeometricField<ReturnType, Type1, PatchField, GeoMesh>::New \
582 '(' + gf1.name() + OpName + gf2.name() + ')', \
583 gf1.dimensions() Op gf2.dimensions() \
586 Foam::OpFunc(tres.ref(), gf1, gf2); \
595tmp<GeometricField<ReturnType, PatchField, GeoMesh>> operator Op \
597 const tmp<GeometricField<Type1, PatchField, GeoMesh>>& tgf1, \
598 const tmp<GeometricField<Type2, PatchField, GeoMesh>>& tgf2 \
601 const GeometricField<Type1, PatchField, GeoMesh>& gf1 = tgf1(); \
602 const GeometricField<Type2, PatchField, GeoMesh>& gf2 = tgf2(); \
605 reuseTmpTmpGeometricField \
606 <ReturnType, Type1, Type1, Type2, PatchField, GeoMesh>::New \
610 '(' + gf1.name() + OpName + gf2.name() + ')', \
611 gf1.dimensions() Op gf2.dimensions() \
614 Foam::OpFunc(tres.ref(), gf1, gf2); \
625#define BINARY_TYPE_OPERATOR_SF(ReturnType, Type1, Type2, Op, OpName, OpFunc) \
630 GeometricField<ReturnType, PatchField, GeoMesh>& res, \
631 const dimensioned<Type1>& dt1, \
632 const GeometricField<Type2, PatchField, GeoMesh>& gf2 \
635 Foam::OpFunc(res.primitiveFieldRef(), dt1.value(), gf2.primitiveField()); \
636 Foam::OpFunc(res.boundaryFieldRef(), dt1.value(), gf2.boundaryField()); \
637 res.oriented() = gf2.oriented(); \
642tmp<GeometricField<ReturnType, PatchField, GeoMesh>> operator Op \
644 const dimensioned<Type1>& dt1, \
645 const GeometricField<Type2, PatchField, GeoMesh>& gf2 \
649 tmp<GeometricField<ReturnType, PatchField, GeoMesh>>::New \
653 '(' + dt1.name() + OpName + gf2.name() + ')', \
660 dt1.dimensions() Op gf2.dimensions() \
663 Foam::OpFunc(tres.ref(), dt1, gf2); \
670tmp<GeometricField<ReturnType, PatchField, GeoMesh>> operator Op \
673 const GeometricField<Type2, PatchField, GeoMesh>& gf2 \
676 return dimensioned<Type1>(t1) Op gf2; \
681tmp<GeometricField<ReturnType, PatchField, GeoMesh>> operator Op \
683 const dimensioned<Type1>& dt1, \
684 const tmp<GeometricField<Type2, PatchField, GeoMesh>>& tgf2 \
687 const GeometricField<Type2, PatchField, GeoMesh>& gf2 = tgf2(); \
690 reuseTmpGeometricField<ReturnType, Type2, PatchField, GeoMesh>::New \
693 '(' + dt1.name() + OpName + gf2.name() + ')', \
694 dt1.dimensions() Op gf2.dimensions() \
697 Foam::OpFunc(tres.ref(), dt1, gf2); \
706tmp<GeometricField<ReturnType, PatchField, GeoMesh>> operator Op \
709 const tmp<GeometricField<Type2, PatchField, GeoMesh>>& tgf2 \
712 return dimensioned<Type1>(t1) Op tgf2; \
716#define BINARY_TYPE_OPERATOR_FS(ReturnType, Type1, Type2, Op, OpName, OpFunc) \
721 GeometricField<ReturnType, PatchField, GeoMesh>& res, \
722 const GeometricField<Type1, PatchField, GeoMesh>& gf1, \
723 const dimensioned<Type2>& dt2 \
726 Foam::OpFunc(res.primitiveFieldRef(), gf1.primitiveField(), dt2.value()); \
727 Foam::OpFunc(res.boundaryFieldRef(), gf1.boundaryField(), dt2.value()); \
728 res.oriented() = gf1.oriented(); \
733tmp<GeometricField<ReturnType, PatchField, GeoMesh>> operator Op \
735 const GeometricField<Type1, PatchField, GeoMesh>& gf1, \
736 const dimensioned<Type2>& dt2 \
740 tmp<GeometricField<ReturnType, PatchField, GeoMesh>>::New \
744 '(' + gf1.name() + OpName + dt2.name() + ')', \
751 gf1.dimensions() Op dt2.dimensions() \
754 Foam::OpFunc(tres.ref(), gf1, dt2); \
761tmp<GeometricField<ReturnType, PatchField, GeoMesh>> operator Op \
763 const GeometricField<Type1, PatchField, GeoMesh>& gf1, \
767 return gf1 Op dimensioned<Type2>(t2); \
772tmp<GeometricField<ReturnType, PatchField, GeoMesh>> operator Op \
774 const tmp<GeometricField<Type1, PatchField, GeoMesh>>& tgf1, \
775 const dimensioned<Type2>& dt2 \
778 const GeometricField<Type1, PatchField, GeoMesh>& gf1 = tgf1(); \
781 reuseTmpGeometricField<ReturnType, Type1, PatchField, GeoMesh>::New \
784 '(' + gf1.name() + OpName + dt2.name() + ')', \
785 gf1.dimensions() Op dt2.dimensions() \
788 Foam::OpFunc(tres.ref(), gf1, dt2); \
797tmp<GeometricField<ReturnType, PatchField, GeoMesh>> operator Op \
799 const tmp<GeometricField<Type1, PatchField, GeoMesh>>& tgf1, \
803 return tgf1 Op dimensioned<Type2>(t2); \
807#define BINARY_TYPE_OPERATOR(ReturnType, Type1, Type2, Op, OpName, OpFunc) \
808 BINARY_TYPE_OPERATOR_SF(ReturnType, Type1, Type2, Op, OpName, OpFunc) \
809 BINARY_TYPE_OPERATOR_FS(ReturnType, Type1, Type2, Op, OpName, OpFunc)