Loading...
Searching...
No Matches
FieldFieldFunctionsM.C
Go to the documentation of this file.
1/*---------------------------------------------------------------------------*\
2 ========= |
3 \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
4 \\ / O peration |
5 \\ / A nd | www.openfoam.com
6 \\/ M anipulation |
7-------------------------------------------------------------------------------
8 Copyright (C) 2011-2017 OpenFOAM Foundation
9 Copyright (C) 2022-2023 OpenCFD Ltd.
10-------------------------------------------------------------------------------
11License
12 This file is part of OpenFOAM.
13
14 OpenFOAM is free software: you can redistribute it and/or modify it
15 under the terms of the GNU General Public License as published by
16 the Free Software Foundation, either version 3 of the License, or
17 (at your option) any later version.
18
19 OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
20 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
21 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
22 for more details.
23
24 You should have received a copy of the GNU General Public License
25 along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
26
27\*---------------------------------------------------------------------------*/
28
29#include "FieldM.H"
31
32// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
33
34#define UNARY_FUNCTION(ReturnType, Type1, Func) \
35 \
36TEMPLATE \
37void Func \
38( \
39 FieldField<Field, ReturnType>& result, \
40 const FieldField<Field, Type1>& f1 \
41) \
42{ \
43 const label loopLen = (result).size(); \
44 \
45 for (label i = 0; i < loopLen; ++i) \
46 { \
47 Func(result[i], f1[i]); \
48 } \
49} \
50 \
51TEMPLATE \
52tmp<FieldField<Field, ReturnType>> Func \
53( \
54 const FieldField<Field, Type1>& f1 \
55) \
56{ \
57 auto tres = FieldField<Field, ReturnType>::NewCalculatedType(f1); \
58 Func(tres.ref(), f1); \
59 return tres; \
60} \
61 \
62TEMPLATE \
63tmp<FieldField<Field, ReturnType>> Func \
64( \
65 const tmp<FieldField<Field, Type1>>& tf1 \
66) \
67{ \
68 auto tres = reuseTmpFieldField<Field, ReturnType, Type1>::New(tf1); \
69 Func(tres.ref(), tf1()); \
70 tf1.clear(); \
71 return tres; \
72}
73
74
75// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
76
77#define UNARY_OPERATOR(ReturnType, Type1, Op, OpFunc) \
78 \
79TEMPLATE \
80void OpFunc \
81( \
82 FieldField<Field, ReturnType>& result, \
83 const FieldField<Field, Type1>& f1 \
84) \
85{ \
86 const label loopLen = (result).size(); \
87 \
88 for (label i = 0; i < loopLen; ++i) \
89 { \
90 OpFunc(result[i], f1[i]); \
91 } \
92} \
93 \
94TEMPLATE \
95tmp<FieldField<Field, ReturnType>> operator Op \
96( \
97 const FieldField<Field, Type1>& f1 \
98) \
99{ \
100 auto tres = FieldField<Field, ReturnType>::NewCalculatedType(f1); \
101 OpFunc(tres.ref(), f1); \
102 return tres; \
103} \
104 \
105TEMPLATE \
106tmp<FieldField<Field, ReturnType>> operator Op \
107( \
108 const tmp<FieldField<Field, Type1>>& tf1 \
109) \
110{ \
111 auto tres = reuseTmpFieldField<Field, ReturnType, Type1>::New(tf1); \
112 OpFunc(tres.ref(), tf1()); \
113 tf1.clear(); \
114 return tres; \
115}
116
117
118// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
119
120#define BINARY_FUNCTION(ReturnType, Type1, Type2, Func) \
121 \
122TEMPLATE \
123void Func \
124( \
125 FieldField<Field, ReturnType>& result, \
126 const FieldField<Field, Type1>& f1, \
127 const FieldField<Field, Type2>& f2 \
128) \
129{ \
130 const label loopLen = (result).size(); \
131 \
132 for (label i = 0; i < loopLen; ++i) \
133 { \
134 Func(result[i], f1[i], f2[i]); \
135 } \
136} \
137 \
138TEMPLATE \
139tmp<FieldField<Field, ReturnType>> Func \
140( \
141 const FieldField<Field, Type1>& f1, \
142 const FieldField<Field, Type2>& f2 \
143) \
144{ \
145 auto tres = FieldField<Field, ReturnType>::NewCalculatedType(f1); \
146 Func(tres.ref(), f1, f2); \
147 return tres; \
148} \
149 \
150TEMPLATE \
151tmp<FieldField<Field, ReturnType>> Func \
152( \
153 const FieldField<Field, Type1>& f1, \
154 const tmp<FieldField<Field, Type2>>& tf2 \
155) \
156{ \
157 auto tres = reuseTmpFieldField<Field, ReturnType, Type2>::New(tf2); \
158 Func(tres.ref(), f1, tf2()); \
159 tf2.clear(); \
160 return tres; \
161} \
162 \
163TEMPLATE \
164tmp<FieldField<Field, ReturnType>> Func \
165( \
166 const tmp<FieldField<Field, Type1>>& tf1, \
167 const FieldField<Field, Type2>& f2 \
168) \
169{ \
170 auto tres = reuseTmpFieldField<Field, ReturnType, Type1>::New(tf1); \
171 Func(tres.ref(), tf1(), f2); \
172 tf1.clear(); \
173 return tres; \
174} \
175 \
176TEMPLATE \
177tmp<FieldField<Field, ReturnType>> Func \
178( \
179 const tmp<FieldField<Field, Type1>>& tf1, \
180 const tmp<FieldField<Field, Type2>>& tf2 \
181) \
182{ \
183 auto tres \
184 ( \
185 reuseTmpTmpFieldField<Field, ReturnType, Type1, Type1, Type2>:: \
186 New(tf1, tf2) \
187 ); \
188 Func(tres.ref(), tf1(), tf2()); \
189 tf1.clear(); \
190 tf2.clear(); \
191 return tres; \
192}
193
194
195// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
196
197#define BINARY_TYPE_FUNCTION_SF(ReturnType, Type1, Type2, Func) \
198 \
199TEMPLATE \
200void Func \
201( \
202 FieldField<Field, ReturnType>& result, \
203 const Type1& s1, \
204 const FieldField<Field, Type2>& f2 \
205) \
206{ \
207 const label loopLen = (result).size(); \
208 \
209 for (label i = 0; i < loopLen; ++i) \
210 { \
211 Func(result[i], s1, f2[i]); \
212 } \
213} \
214 \
215TEMPLATE \
216tmp<FieldField<Field, ReturnType>> Func \
217( \
218 const Type1& s1, \
219 const FieldField<Field, Type2>& f2 \
220) \
221{ \
222 auto tres = FieldField<Field, ReturnType>::NewCalculatedType(f2); \
223 Func(tres.ref(), s1, f2); \
224 return tres; \
225} \
226 \
227TEMPLATE \
228tmp<FieldField<Field, ReturnType>> Func \
229( \
230 const Type1& s1, \
231 const tmp<FieldField<Field, Type2>>& tf2 \
232) \
233{ \
234 auto tres = reuseTmpFieldField<Field, ReturnType, Type2>::New(tf2); \
235 Func(tres.ref(), s1, tf2()); \
236 tf2.clear(); \
237 return tres; \
238}
239
240
241#define BINARY_TYPE_FUNCTION_FS(ReturnType, Type1, Type2, Func) \
242 \
243TEMPLATE \
244void Func \
245( \
246 FieldField<Field, ReturnType>& result, \
247 const FieldField<Field, Type1>& f1, \
248 const Type2& s2 \
249) \
250{ \
251 const label loopLen = (result).size(); \
252 \
253 for (label i = 0; i < loopLen; ++i) \
254 { \
255 Func(result[i], f1[i], s2); \
256 } \
257} \
258 \
259TEMPLATE \
260tmp<FieldField<Field, ReturnType>> Func \
261( \
262 const FieldField<Field, Type1>& f1, \
263 const Type2& s2 \
264) \
265{ \
266 auto tres = FieldField<Field, ReturnType>::NewCalculatedType(f1); \
267 Func(tres.ref(), f1, s2); \
268 return tres; \
269} \
270 \
271TEMPLATE \
272tmp<FieldField<Field, ReturnType>> Func \
273( \
274 const tmp<FieldField<Field, Type1>>& tf1, \
275 const Type2& s2 \
276) \
277{ \
278 auto tres = reuseTmpFieldField<Field, ReturnType, Type1>::New(tf1); \
279 Func(tres.ref(), tf1(), s2); \
280 tf1.clear(); \
281 return tres; \
282}
283
284
285#define BINARY_TYPE_FUNCTION(ReturnType, Type1, Type2, Func) \
286 BINARY_TYPE_FUNCTION_SF(ReturnType, Type1, Type2, Func) \
287 BINARY_TYPE_FUNCTION_FS(ReturnType, Type1, Type2, Func)
288
289
290// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
291
292#define BINARY_OPERATOR(ReturnType, Type1, Type2, Op, OpFunc) \
293 \
294TEMPLATE \
295void OpFunc \
296( \
297 FieldField<Field, ReturnType>& result, \
298 const FieldField<Field, Type1>& f1, \
299 const FieldField<Field, Type2>& f2 \
300) \
301{ \
302 const label loopLen = (result).size(); \
303 \
304 for (label i = 0; i < loopLen; ++i) \
305 { \
306 OpFunc(result[i], f1[i], f2[i]); \
307 } \
308} \
309 \
310TEMPLATE \
311tmp<FieldField<Field, ReturnType>> operator Op \
312( \
313 const FieldField<Field, Type1>& f1, \
314 const FieldField<Field, Type2>& f2 \
315) \
316{ \
317 auto tres = FieldField<Field, ReturnType>::NewCalculatedType(f1); \
318 OpFunc(tres.ref(), f1, f2); \
319 return tres; \
320} \
321 \
322TEMPLATE \
323tmp<FieldField<Field, ReturnType>> operator Op \
324( \
325 const FieldField<Field, Type1>& f1, \
326 const tmp<FieldField<Field, Type2>>& tf2 \
327) \
328{ \
329 auto tres = reuseTmpFieldField<Field, ReturnType, Type2>::New(tf2); \
330 OpFunc(tres.ref(), f1, tf2()); \
331 tf2.clear(); \
332 return tres; \
333} \
334 \
335TEMPLATE \
336tmp<FieldField<Field, ReturnType>> operator Op \
337( \
338 const tmp<FieldField<Field, Type1>>& tf1, \
339 const FieldField<Field, Type2>& f2 \
340) \
341{ \
342 auto tres = reuseTmpFieldField<Field, ReturnType, Type1>::New(tf1); \
343 OpFunc(tres.ref(), tf1(), f2); \
344 tf1.clear(); \
345 return tres; \
346} \
347 \
348TEMPLATE \
349tmp<FieldField<Field, ReturnType>> operator Op \
350( \
351 const tmp<FieldField<Field, Type1>>& tf1, \
352 const tmp<FieldField<Field, Type2>>& tf2 \
353) \
354{ \
355 auto tres \
356 ( \
357 reuseTmpTmpFieldField<Field, ReturnType, Type1, Type1, Type2>:: \
358 New(tf1, tf2) \
359 ); \
360 OpFunc(tres.ref(), tf1(), tf2()); \
361 tf1.clear(); \
362 tf2.clear(); \
363 return tres; \
364}
365
366
367// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
368
369#define BINARY_TYPE_OPERATOR_SF(ReturnType, Type1, Type2, Op, OpFunc) \
370 \
371TEMPLATE \
372void OpFunc \
373( \
374 FieldField<Field, ReturnType>& result, \
375 const Type1& s1, \
376 const FieldField<Field, Type2>& f2 \
377) \
378{ \
379 const label loopLen = (result).size(); \
380 \
381 for (label i = 0; i < loopLen; ++i) \
382 { \
383 OpFunc(result[i], s1, f2[i]); \
384 } \
385} \
386 \
387TEMPLATE \
388tmp<FieldField<Field, ReturnType>> operator Op \
389( \
390 const Type1& s1, \
391 const FieldField<Field, Type2>& f2 \
392) \
393{ \
394 auto tres = FieldField<Field, ReturnType>::NewCalculatedType(f2); \
395 OpFunc(tres.ref(), s1, f2); \
396 return tres; \
397} \
398 \
399TEMPLATE \
400tmp<FieldField<Field, ReturnType>> operator Op \
401( \
402 const Type1& s1, \
403 const tmp<FieldField<Field, Type2>>& tf2 \
404) \
405{ \
406 auto tres = reuseTmpFieldField<Field, ReturnType, Type2>::New(tf2); \
407 OpFunc(tres.ref(), s1, tf2()); \
408 tf2.clear(); \
409 return tres; \
410}
411
412
413#define BINARY_TYPE_OPERATOR_FS(ReturnType, Type1, Type2, Op, OpFunc) \
414 \
415TEMPLATE \
416void OpFunc \
417( \
418 FieldField<Field, ReturnType>& result, \
419 const FieldField<Field, Type1>& f1, \
420 const Type2& s2 \
421) \
422{ \
423 const label loopLen = (result).size(); \
424 \
425 for (label i = 0; i < loopLen; ++i) \
426 { \
427 OpFunc(result[i], f1[i], s2); \
428 } \
429} \
430 \
431TEMPLATE \
432tmp<FieldField<Field, ReturnType>> operator Op \
433( \
434 const FieldField<Field, Type1>& f1, \
435 const Type2& s2 \
436) \
437{ \
438 auto tres = FieldField<Field, ReturnType>::NewCalculatedType(f1); \
439 OpFunc(tres.ref(), f1, s2); \
440 return tres; \
441} \
442 \
443TEMPLATE \
444tmp<FieldField<Field, ReturnType>> operator Op \
445( \
446 const tmp<FieldField<Field, Type1>>& tf1, \
447 const Type2& s2 \
448) \
449{ \
450 auto tres = reuseTmpFieldField<Field, ReturnType, Type1>::New(tf1); \
451 OpFunc(tres.ref(), tf1(), s2); \
452 tf1.clear(); \
453 return tres; \
454}
455
456
457#define BINARY_TYPE_OPERATOR(ReturnType, Type1, Type2, Op, OpFunc) \
458 BINARY_TYPE_OPERATOR_SF(ReturnType, Type1, Type2, Op, OpFunc) \
459 BINARY_TYPE_OPERATOR_FS(ReturnType, Type1, Type2, Op, OpFunc)
460
461
462// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
463
464#define TERNARY_FUNCTION(ReturnType, Type1, Type2, Type3, Func) \
465 \
466TEMPLATE \
467void Func \
468( \
469 FieldField<Field, ReturnType>& result, \
470 const FieldField<Field, Type1>& f1, \
471 const FieldField<Field, Type2>& f2, \
472 const FieldField<Field, Type3>& f3 \
473) \
474{ \
475 const label loopLen = (result).size(); \
476 \
477 for (label i = 0; i < loopLen; ++i) \
478 { \
479 Func(result[i], f1[i], f2[i], f3[i]); \
480 } \
481} \
482 \
483TEMPLATE \
484tmp<FieldField<Field, ReturnType>> Func \
485( \
486 const FieldField<Field, Type1>& f1, \
487 const FieldField<Field, Type2>& f2, \
488 const FieldField<Field, Type3>& f3 \
489) \
490{ \
491 auto tres = FieldField<Field, ReturnType>::NewCalculatedType(f1); \
492 Func(tres.ref(), f1, f2, f3); \
493 return tres; \
494} \
495 \
496TEMPLATE \
497tmp<FieldField<Field, ReturnType>> Func \
498( \
499 const tmp<FieldField<Field, Type1>>& tf1, \
500 const FieldField<Field, Type2>& f2, \
501 const FieldField<Field, Type3>& f3 \
502) \
503{ \
504 auto tres = reuseTmpFieldField<Field, ReturnType, Type1>::New(tf1); \
505 Func(tres.ref(), tf1(), f2, f3); \
506 tf1.clear(); \
507 return tres; \
508} \
509 \
510TEMPLATE \
511tmp<FieldField<Field, ReturnType>> Func \
512( \
513 const FieldField<Field, Type1>& f1, \
514 const tmp<FieldField<Field, Type2>>& tf2, \
515 const FieldField<Field, Type3>& f3 \
516) \
517{ \
518 auto tres = reuseTmpFieldField<Field, ReturnType, Type2>::New(tf2); \
519 Func(tres.ref(), f1, tf2(), f3); \
520 tf2.clear(); \
521 return tres; \
522} \
523 \
524TEMPLATE \
525tmp<FieldField<Field, ReturnType>> Func \
526( \
527 const FieldField<Field, Type1>& f1, \
528 const FieldField<Field, Type2>& f2, \
529 const tmp<FieldField<Field, Type3>>& tf3 \
530) \
531{ \
532 auto tres = reuseTmpFieldField<Field, ReturnType, Type3>::New(tf3); \
533 Func(tres.ref(), f1, f2, tf3()); \
534 tf3.clear(); \
535 return tres; \
536} \
537 \
538TEMPLATE \
539tmp<FieldField<Field, ReturnType>> Func \
540( \
541 const tmp<FieldField<Field, Type1>>& tf1, \
542 const tmp<FieldField<Field, Type2>>& tf2, \
543 const FieldField<Field, Type3>& f3 \
544) \
545{ \
546 tmp<FieldField<Field, ReturnType>> tres \
547 ( \
548 reuseTmpTmpFieldField<Field, ReturnType, Type1, Type1, Type2>:: \
549 New(tf1, tf2) \
550 ); \
551 Func(tres.ref(), tf1(), tf2(), f3); \
552 tf1.clear(); \
553 tf2.clear(); \
554 return tres; \
555} \
556 \
557TEMPLATE \
558tmp<FieldField<Field, ReturnType>> Func \
559( \
560 const tmp<FieldField<Field, Type1>>& tf1, \
561 const FieldField<Field, Type2>& f2, \
562 const tmp<FieldField<Field, Type3>>& tf3 \
563) \
564{ \
565 tmp<FieldField<Field, ReturnType>> tres \
566 ( \
567 reuseTmpTmpFieldField<Field, ReturnType, Type1, Type1, Type3>:: \
568 New(tf1, tf3) \
569 ); \
570 Func(tres.ref(), tf1(), f2, tf3()); \
571 tf1.clear(); \
572 tf3.clear(); \
573 return tres; \
574} \
575 \
576TEMPLATE \
577tmp<FieldField<Field, ReturnType>> Func \
578( \
579 const FieldField<Field, Type1>& f1, \
580 const tmp<FieldField<Field, Type2>>& tf2, \
581 const tmp<FieldField<Field, Type3>>& tf3 \
582) \
583{ \
584 tmp<FieldField<Field, ReturnType>> tres \
585 ( \
586 reuseTmpTmpFieldField<Field, ReturnType, Type2, Type2, Type3>:: \
587 New(tf2, tf3) \
588 ); \
589 Func(tres.ref(), f1, tf2(), tf3()); \
590 tf2.clear(); \
591 tf3.clear(); \
592 return tres; \
593} \
594 \
595TEMPLATE \
596tmp<FieldField<Field, ReturnType>> Func \
597( \
598 const tmp<FieldField<Field, Type1>>& tf1, \
599 const tmp<FieldField<Field, Type2>>& tf2, \
600 const tmp<FieldField<Field, Type3>>& tf3 \
601) \
602{ \
603 /* TBD: check all three types? */ \
604 tmp<FieldField<Field, ReturnType>> tres \
605 ( \
606 reuseTmpTmpFieldField<Field, ReturnType, Type1, Type1, Type2>:: \
607 New(tf1, tf2) \
608 ); \
609 Func(tres.ref(), tf1(), tf2(), tf3()); \
610 tf1.clear(); \
611 tf2.clear(); \
612 tf3.clear(); \
613 return tres; \
614}
615
616
617#define TERNARY_TYPE_FUNCTION_FFS(ReturnType, Type1, Type2, Type3, Func) \
618 \
619TEMPLATE \
620void Func \
621( \
622 FieldField<Field, ReturnType>& result, \
623 const FieldField<Field, Type1>& f1, \
624 const FieldField<Field, Type2>& f2, \
625 const Type3& s3 \
626) \
627{ \
628 const label loopLen = (result).size(); \
629 \
630 for (label i = 0; i < loopLen; ++i) \
631 { \
632 Func(result[i], f1[i], f2[i], s3); \
633 } \
634} \
635 \
636TEMPLATE \
637tmp<FieldField<Field, ReturnType>> Func \
638( \
639 const FieldField<Field, Type1>& f1, \
640 const FieldField<Field, Type2>& f2, \
641 const Type3& s3 \
642) \
643{ \
644 auto tres = FieldField<Field, ReturnType>::NewCalculatedType(f1); \
645 Func(tres.ref(), f1, f2, s3); \
646 return tres; \
647} \
648 \
649TEMPLATE \
650tmp<FieldField<Field, ReturnType>> Func \
651( \
652 const tmp<FieldField<Field, Type1>>& tf1, \
653 const FieldField<Field, Type2>& f2, \
654 const Type3& s3 \
655) \
656{ \
657 auto tres = reuseTmpFieldField<Field, ReturnType, Type1>::New(tf1); \
658 Func(tres.ref(), tf1(), f2, s3); \
659 tf1.clear(); \
660 return tres; \
661} \
662 \
663TEMPLATE \
664tmp<FieldField<Field, ReturnType>> Func \
665( \
666 const FieldField<Field, Type1>& f1, \
667 const tmp<FieldField<Field, Type2>>& tf2, \
668 const Type3& s3 \
669) \
670{ \
671 auto tres = reuseTmpFieldField<Field, ReturnType, Type2>::New(tf2); \
672 Func(tres.ref(), f1, tf2(), s3); \
673 tf2.clear(); \
674 return tres; \
675} \
676 \
677TEMPLATE \
678tmp<FieldField<Field, ReturnType>> Func \
679( \
680 const tmp<FieldField<Field, Type1>>& tf1, \
681 const tmp<FieldField<Field, Type2>>& tf2, \
682 const Type3& s3 \
683) \
684{ \
685 tmp<FieldField<Field, ReturnType>> tres \
686 ( \
687 reuseTmpTmpFieldField<Field, ReturnType, Type1, Type1, Type2>:: \
688 New(tf1, tf2) \
689 ); \
690 Func(tres.ref(), tf1(), tf2(), s3); \
691 tf1.clear(); \
692 tf2.clear(); \
693 return tres; \
694}
695
696
697// ************************************************************************* //
Declaration macros for Field<Type> algebra.