33#define UNARY_FUNCTION(ReturnType, Type1, Func, Dfunc) \
36tmp<DimensionedField<ReturnType, GeoMesh>> Func \
38 const DimensionedField<Type1, GeoMesh>& df1 \
42 tmp<DimensionedField<ReturnType, GeoMesh>>::New \
46 #Func "(" + df1.name() + ')', \
51 Dfunc(df1.dimensions()) \
54 Func(tres.ref().field(), df1.field()); \
55 tres.ref().oriented() = Dfunc(df1.oriented()); \
62tmp<DimensionedField<ReturnType, GeoMesh>> Func \
64 const tmp<DimensionedField<Type1, GeoMesh>>& tdf1 \
67 const DimensionedField<Type1, GeoMesh>& df1 = tdf1(); \
70 reuseTmpDimensionedField<ReturnType, Type1, GeoMesh>::New \
73 #Func "(" + df1.name() + ')', \
74 Dfunc(df1.dimensions()) \
77 Func(tres.ref().field(), df1.field()); \
78 tres.ref().oriented() = Dfunc(df1.oriented()); \
87#define UNARY_OPERATOR(ReturnType, Type1, Op, OpFunc, Dfunc) \
90tmp<DimensionedField<ReturnType, GeoMesh>> operator Op \
92 const DimensionedField<Type1, GeoMesh>& df1 \
96 tmp<DimensionedField<ReturnType, GeoMesh>>::New \
105 Dfunc(df1.dimensions()) \
108 Foam::OpFunc(tres.ref().field(), df1.field()); \
109 tres.ref().oriented() = Dfunc(df1.oriented()); \
116tmp<DimensionedField<ReturnType, GeoMesh>> operator Op \
118 const tmp<DimensionedField<Type1, GeoMesh>>& tdf1 \
121 const DimensionedField<Type1, GeoMesh>& df1 = tdf1(); \
124 reuseTmpDimensionedField<ReturnType, Type1, GeoMesh>::New \
128 Dfunc(df1.dimensions()) \
131 Foam::OpFunc(tres.ref().field(), df1.field()); \
132 tres.ref().oriented() = Dfunc(df1.oriented()); \
141#define BINARY_FUNCTION(ReturnType, Type1, Type2, Func) \
144tmp<DimensionedField<ReturnType, GeoMesh>> Func \
146 const DimensionedField<Type1, GeoMesh>& df1, \
147 const DimensionedField<Type2, GeoMesh>& df2 \
151 tmp<DimensionedField<ReturnType, GeoMesh>>::New \
155 #Func "(" + df1.name() + ',' + df2.name() + ')', \
160 Func(df1.dimensions(), df2.dimensions()) \
163 Func(tres.ref().field(), df1.field(), df2.field()); \
164 tres.ref().oriented() = Func(df1.oriented(), df2.oriented()); \
171tmp<DimensionedField<ReturnType, GeoMesh>> Func \
173 const DimensionedField<Type1, GeoMesh>& df1, \
174 const tmp<DimensionedField<Type2, GeoMesh>>& tdf2 \
177 const DimensionedField<Type2, GeoMesh>& df2 = tdf2(); \
180 reuseTmpDimensionedField<ReturnType, Type2, GeoMesh>::New \
183 #Func "(" + df1.name() + ',' + df2.name() + ')', \
184 Func(df1.dimensions(), df2.dimensions()) \
187 Func(tres.ref().field(), df1.field(), df2.field()); \
188 tres.ref().oriented() = Func(df1.oriented(), df2.oriented()); \
196tmp<DimensionedField<ReturnType, GeoMesh>> Func \
198 const tmp<DimensionedField<Type1, GeoMesh>>& tdf1, \
199 const DimensionedField<Type2, GeoMesh>& df2 \
202 const DimensionedField<Type1, GeoMesh>& df1 = tdf1(); \
204 tmp<DimensionedField<ReturnType, GeoMesh>> tres \
206 reuseTmpDimensionedField<ReturnType, Type1, GeoMesh>::New \
209 #Func "(" + df1.name() + ',' + df2.name() + ')', \
210 Func(df1.dimensions(), df2.dimensions()) \
214 Func(tres.ref().field(), df1.field(), df2.field()); \
215 tres.ref().oriented() = Func(df1.oriented(), df2.oriented()); \
223tmp<DimensionedField<ReturnType, GeoMesh>> Func \
225 const tmp<DimensionedField<Type1, GeoMesh>>& tdf1, \
226 const tmp<DimensionedField<Type2, GeoMesh>>& tdf2 \
229 const DimensionedField<Type1, GeoMesh>& df1 = tdf1(); \
230 const DimensionedField<Type2, GeoMesh>& df2 = tdf2(); \
233 reuseTmpTmpDimensionedField \
234 <ReturnType, Type1, Type1, Type2, GeoMesh>::New \
238 #Func "(" + df1.name() + ',' + df2.name() + ')', \
239 Func(df1.dimensions(), df2.dimensions()) \
242 Func(tres.ref().field(), df1.field(), df2.field()); \
243 tres.ref().oriented() = Func(df1.oriented(), df2.oriented()); \
253#define BINARY_TYPE_FUNCTION_SF(ReturnType, Type1, Type2, Func) \
256tmp<DimensionedField<ReturnType, GeoMesh>> Func \
258 const dimensioned<Type1>& dt1, \
259 const DimensionedField<Type2, GeoMesh>& df2 \
263 tmp<DimensionedField<ReturnType, GeoMesh>>::New \
267 #Func "(" + dt1.name() + ',' + df2.name() + ')', \
272 Func(dt1.dimensions(), df2.dimensions()) \
275 Func(tres.ref().field(), dt1.value(), df2.field()); \
276 tres.ref().oriented() = df2.oriented(); \
283tmp<DimensionedField<ReturnType, GeoMesh>> Func \
286 const DimensionedField<Type2, GeoMesh>& df2 \
289 return Func(dimensioned<Type1>(t1), df2); \
294tmp<DimensionedField<ReturnType, GeoMesh>> Func \
296 const dimensioned<Type1>& dt1, \
297 const tmp<DimensionedField<Type2, GeoMesh>>& tdf2 \
300 const DimensionedField<Type2, GeoMesh>& df2 = tdf2(); \
303 reuseTmpDimensionedField<ReturnType, Type2, GeoMesh>::New \
306 #Func "(" + dt1.name() + ',' + df2.name() + ')', \
307 Func(dt1.dimensions(), df2.dimensions()) \
310 Func(tres.ref().field(), dt1.value(), df2.field()); \
311 tres.ref().oriented() = df2.oriented(); \
319tmp<DimensionedField<ReturnType, GeoMesh>> Func \
322 const tmp<DimensionedField<Type2, GeoMesh>>& tdf2 \
325 return Func(dimensioned<Type2>(t1), tdf2); \
329#define BINARY_TYPE_FUNCTION_FS(ReturnType, Type1, Type2, Func) \
332tmp<DimensionedField<ReturnType, GeoMesh>> Func \
334 const DimensionedField<Type1, GeoMesh>& df1, \
335 const dimensioned<Type2>& dt2 \
339 tmp<DimensionedField<ReturnType, GeoMesh>>::New \
343 #Func "(" + df1.name() + ',' + dt2.name() + ')', \
348 Func(df1.dimensions(), dt2.dimensions()) \
351 Func(tres.ref().field(), df1.field(), dt2.value()); \
352 tres.ref().oriented() = df1.oriented(); \
359tmp<DimensionedField<ReturnType, GeoMesh>> Func \
361 const DimensionedField<Type1, GeoMesh>& df1, \
365 return Func(df1, dimensioned<Type2>(t2)); \
370tmp<DimensionedField<ReturnType, GeoMesh>> Func \
372 const tmp<DimensionedField<Type1, GeoMesh>>& tdf1, \
373 const dimensioned<Type2>& dt2 \
376 const DimensionedField<Type1, GeoMesh>& df1 = tdf1(); \
379 reuseTmpDimensionedField<ReturnType, Type1, GeoMesh>::New \
382 #Func "(" + df1.name() + ',' + dt2.name() + ')', \
383 Func(df1.dimensions(), dt2.dimensions()) \
386 Func(tres.ref().field(), df1.field(), dt2.value()); \
387 tres.ref().oriented() = df1.oriented(); \
395tmp<DimensionedField<ReturnType, GeoMesh>> Func \
397 const tmp<DimensionedField<Type1, GeoMesh>>& tdf1, \
401 return Func(tdf1, dimensioned<Type2>(t2)); \
405#define BINARY_TYPE_FUNCTION(ReturnType, Type1, Type2, Func) \
406 BINARY_TYPE_FUNCTION_SF(ReturnType, Type1, Type2, Func) \
407 BINARY_TYPE_FUNCTION_FS(ReturnType, Type1, Type2, Func)
412#define BINARY_OPERATOR(ReturnType, Type1, Type2, Op, OpName, OpFunc) \
415tmp<DimensionedField<ReturnType, GeoMesh>> operator Op \
417 const DimensionedField<Type1, GeoMesh>& df1, \
418 const DimensionedField<Type2, GeoMesh>& df2 \
422 tmp<DimensionedField<ReturnType, GeoMesh>>::New \
426 '(' + df1.name() + OpName + df2.name() + ')', \
431 df1.dimensions() Op df2.dimensions() \
434 Foam::OpFunc(tres.ref().field(), df1.field(), df2.field()); \
435 tres.ref().oriented() = df1.oriented() Op df2.oriented(); \
442tmp<DimensionedField<ReturnType, GeoMesh>> operator Op \
444 const DimensionedField<Type1, GeoMesh>& df1, \
445 const tmp<DimensionedField<Type2, GeoMesh>>& tdf2 \
448 const DimensionedField<Type2, GeoMesh>& df2 = tdf2(); \
451 reuseTmpDimensionedField<ReturnType, Type2, GeoMesh>::New \
454 '(' + df1.name() + OpName + df2.name() + ')', \
455 df1.dimensions() Op df2.dimensions() \
458 Foam::OpFunc(tres.ref().field(), df1.field(), df2.field()); \
459 tres.ref().oriented() = df1.oriented() Op df2.oriented(); \
467tmp<DimensionedField<ReturnType, GeoMesh>> operator Op \
469 const tmp<DimensionedField<Type1, GeoMesh>>& tdf1, \
470 const DimensionedField<Type2, GeoMesh>& df2 \
473 const DimensionedField<Type1, GeoMesh>& df1 = tdf1(); \
476 reuseTmpDimensionedField<ReturnType, Type1, GeoMesh>::New \
479 '(' + df1.name() + OpName + df2.name() + ')', \
480 df1.dimensions() Op df2.dimensions() \
483 Foam::OpFunc(tres.ref().field(), df1.field(), df2.field()); \
484 tres.ref().oriented() = df1.oriented() Op df2.oriented(); \
492tmp<DimensionedField<ReturnType, GeoMesh>> operator Op \
494 const tmp<DimensionedField<Type1, GeoMesh>>& tdf1, \
495 const tmp<DimensionedField<Type2, GeoMesh>>& tdf2 \
498 const DimensionedField<Type1, GeoMesh>& df1 = tdf1(); \
499 const DimensionedField<Type2, GeoMesh>& df2 = tdf2(); \
502 reuseTmpTmpDimensionedField \
503 <ReturnType, Type1, Type1, Type2, GeoMesh>::New \
507 '(' + df1.name() + OpName + df2.name() + ')', \
508 df1.dimensions() Op df2.dimensions() \
511 Foam::OpFunc(tres.ref().field(), df1.field(), df2.field()); \
512 tres.ref().oriented() = df1.oriented() Op df2.oriented(); \
522#define BINARY_TYPE_OPERATOR_SF(ReturnType, Type1, Type2, Op, OpName, OpFunc) \
525tmp<DimensionedField<ReturnType, GeoMesh>> operator Op \
527 const dimensioned<Type1>& dt1, \
528 const DimensionedField<Type2, GeoMesh>& df2 \
532 tmp<DimensionedField<ReturnType, GeoMesh>>::New \
536 '(' + dt1.name() + OpName + df2.name() + ')', \
541 dt1.dimensions() Op df2.dimensions() \
544 tres.ref().oriented() = df2.oriented(); \
546 Foam::OpFunc(tres.ref().field(), dt1.value(), df2.field()); \
553tmp<DimensionedField<ReturnType, GeoMesh>> operator Op \
556 const DimensionedField<Type2, GeoMesh>& df2 \
559 return dimensioned<Type1>(t1) Op df2; \
564tmp<DimensionedField<ReturnType, GeoMesh>> operator Op \
566 const dimensioned<Type1>& dt1, \
567 const tmp<DimensionedField<Type2, GeoMesh>>& tdf2 \
570 const DimensionedField<Type2, GeoMesh>& df2 = tdf2(); \
573 reuseTmpDimensionedField<ReturnType, Type2, GeoMesh>::New \
576 '(' + dt1.name() + OpName + df2.name() + ')', \
577 dt1.dimensions() Op df2.dimensions() \
580 Foam::OpFunc(tres.ref().field(), dt1.value(), tdf2().field()); \
581 tres.ref().oriented() = df2.oriented(); \
589tmp<DimensionedField<ReturnType, GeoMesh>> operator Op \
592 const tmp<DimensionedField<Type2, GeoMesh>>& tdf2 \
595 return dimensioned<Type1>(t1) Op tdf2; \
599#define BINARY_TYPE_OPERATOR_FS(ReturnType, Type1, Type2, Op, OpName, OpFunc) \
602tmp<DimensionedField<ReturnType, GeoMesh>> operator Op \
604 const DimensionedField<Type1, GeoMesh>& df1, \
605 const dimensioned<Type2>& dt2 \
609 tmp<DimensionedField<ReturnType, GeoMesh>>::New \
613 '(' + df1.name() + OpName + dt2.name() + ')', \
618 df1.dimensions() Op dt2.dimensions() \
621 Foam::OpFunc(tres.ref().field(), df1.field(), dt2.value()); \
622 tres.ref().oriented() = df1.oriented(); \
629tmp<DimensionedField<ReturnType, GeoMesh>> operator Op \
631 const DimensionedField<Type1, GeoMesh>& df1, \
635 return df1 Op dimensioned<Type2>(t2); \
640tmp<DimensionedField<ReturnType, GeoMesh>> operator Op \
642 const tmp<DimensionedField<Type1, GeoMesh>>& tdf1, \
643 const dimensioned<Type2>& dt2 \
646 const DimensionedField<Type1, GeoMesh>& df1 = tdf1(); \
649 reuseTmpDimensionedField<ReturnType, Type1, GeoMesh>::New \
652 '(' + df1.name() + OpName + dt2.name() + ')', \
653 df1.dimensions() Op dt2.dimensions() \
656 Foam::OpFunc(tres.ref().field(), tdf1().field(), dt2.value()); \
657 tres.ref().oriented() = df1.oriented(); \
665tmp<DimensionedField<ReturnType, GeoMesh>> operator Op \
667 const tmp<DimensionedField<Type1, GeoMesh>>& tdf1, \
671 return tdf1 Op dimensioned<Type2>(t2); \
674#define BINARY_TYPE_OPERATOR(ReturnType, Type1, Type2, Op, OpName, OpFunc) \
675 BINARY_TYPE_OPERATOR_SF(ReturnType, Type1, Type2, Op, OpName, OpFunc) \
676 BINARY_TYPE_OPERATOR_FS(ReturnType, Type1, Type2, Op, OpName, OpFunc)