Field.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-2016 OpenFOAM Foundation
9  Copyright (C) 2015-2019 OpenCFD Ltd.
10 -------------------------------------------------------------------------------
11 License
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 "FieldMapper.H"
30 #include "FieldM.H"
31 #include "dictionary.H"
32 #include "contiguous.H"
33 #include "mapDistributeBase.H"
34 
35 // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
36 
37 template<class Type>
39 (
40  const UList<Type>& mapF,
41  const labelUList& mapAddressing
42 )
43 :
44  List<Type>(mapAddressing.size())
45 {
46  map(mapF, mapAddressing);
47 }
48 
49 
50 template<class Type>
52 (
53  const tmp<Field<Type>>& tmapF,
54  const labelUList& mapAddressing
55 )
56 :
57  List<Type>(mapAddressing.size())
58 {
59  map(tmapF, mapAddressing);
60 }
61 
62 
63 template<class Type>
65 (
66  const UList<Type>& mapF,
67  const labelListList& mapAddressing,
68  const scalarListList& mapWeights
69 )
70 :
71  List<Type>(mapAddressing.size())
72 {
73  map(mapF, mapAddressing, mapWeights);
74 }
75 
76 
77 template<class Type>
79 (
80  const tmp<Field<Type>>& tmapF,
81  const labelListList& mapAddressing,
82  const scalarListList& mapWeights
83 )
84 :
85  List<Type>(mapAddressing.size())
86 {
87  map(tmapF, mapAddressing, mapWeights);
88 }
89 
90 
91 template<class Type>
93 (
94  const UList<Type>& mapF,
95  const FieldMapper& mapper,
96  const bool applyFlip
97 )
98 :
99  List<Type>(mapper.size())
100 {
101  map(mapF, mapper, applyFlip);
102 }
103 
104 
105 template<class Type>
107 (
108  const UList<Type>& mapF,
109  const FieldMapper& mapper,
110  const Type& defaultValue,
111  const bool applyFlip
112 )
113 :
114  List<Type>(mapper.size(), defaultValue)
115 {
116  map(mapF, mapper, applyFlip);
117 }
118 
119 
120 template<class Type>
122 (
123  const UList<Type>& mapF,
124  const FieldMapper& mapper,
125  const UList<Type>& defaultValues,
126  const bool applyFlip
127 )
128 :
129  List<Type>(defaultValues)
130 {
131  map(mapF, mapper, applyFlip);
132 }
133 
134 
135 template<class Type>
137 (
138  const tmp<Field<Type>>& tmapF,
139  const FieldMapper& mapper,
140  const bool applyFlip
141 )
142 :
143  List<Type>(mapper.size())
144 {
145  map(tmapF, mapper, applyFlip);
146 }
147 
148 
149 template<class Type>
151 (
152  const tmp<Field<Type>>& tmapF,
153  const FieldMapper& mapper,
154  const Type& defaultValue,
155  const bool applyFlip
156 )
157 :
158  List<Type>(mapper.size(), defaultValue)
159 {
160  map(tmapF, mapper, applyFlip);
161 }
162 
163 
164 template<class Type>
166 (
167  const tmp<Field<Type>>& tmapF,
168  const FieldMapper& mapper,
169  const UList<Type>& defaultValues,
170  const bool applyFlip
171 )
172 :
173  List<Type>(defaultValues)
174 {
175  map(tmapF, mapper, applyFlip);
176 }
177 
178 
179 template<class Type>
181 (
182  const word& keyword,
183  const dictionary& dict,
184  const label len
185 )
186 {
187  if (len)
188  {
189  ITstream& is = dict.lookup(keyword);
190 
191  // Read first token
192  token firstToken(is);
193 
194  if (firstToken.isWord())
195  {
196  if (firstToken.wordToken() == "uniform")
197  {
198  this->setSize(len);
199  operator=(pTraits<Type>(is));
200  }
201  else if (firstToken.wordToken() == "nonuniform")
202  {
203  is >> static_cast<List<Type>&>(*this);
204  label currentSize = this->size();
205  if (currentSize != len)
206  {
207  if (len < currentSize && allowConstructFromLargerSize)
208  {
209  #ifdef FULLDEBUG
211  << "Sizes do not match. "
212  << "Re-sizing " << currentSize
213  << " entries to " << len
214  << endl;
215  #endif
216 
217  // Resize the data
218  this->setSize(len);
219  }
220  else
221  {
223  << "size " << this->size()
224  << " is not equal to the given value of " << len
225  << exit(FatalIOError);
226  }
227  }
228  }
229  else
230  {
232  << "Expected keyword 'uniform' or 'nonuniform', found "
233  << firstToken.wordToken()
234  << exit(FatalIOError);
235  }
236  }
237  else if (is.version() == IOstream::versionNumber(2,0))
238  {
240  << "Expected keyword 'uniform' or 'nonuniform', "
241  "assuming deprecated Field format from "
242  "Foam version 2.0." << endl;
243 
244  this->setSize(len);
245 
246  is.putBack(firstToken);
247  operator=(pTraits<Type>(is));
248  }
249  else
250  {
252  << "Expected keyword 'uniform' or 'nonuniform', found "
253  << firstToken.info() << exit(FatalIOError);
254  }
255  }
256 }
257 
258 
259 // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
260 
261 template<class Type>
263 (
264  const UList<Type>& mapF,
265  const labelUList& mapAddressing
266 )
267 {
268  Field<Type>& f = *this;
269 
270  if (f.size() != mapAddressing.size())
271  {
272  f.setSize(mapAddressing.size());
273  }
274 
275  if (mapF.size() > 0)
276  {
277  forAll(f, i)
278  {
279  const label mapI = mapAddressing[i];
280 
281  if (mapI >= 0)
282  {
283  f[i] = mapF[mapI];
284  }
285  }
286  }
287 }
288 
289 
290 template<class Type>
292 (
293  const tmp<Field<Type>>& tmapF,
294  const labelUList& mapAddressing
295 )
296 {
297  map(tmapF(), mapAddressing);
298  tmapF.clear();
299 }
300 
301 
302 template<class Type>
304 (
305  const UList<Type>& mapF,
306  const labelListList& mapAddressing,
307  const scalarListList& mapWeights
308 )
309 {
310  Field<Type>& f = *this;
311 
312  if (f.size() != mapAddressing.size())
313  {
314  f.setSize(mapAddressing.size());
315  }
316 
317  if (mapWeights.size() != mapAddressing.size())
318  {
320  << mapWeights.size() << " map size: " << mapAddressing.size()
321  << abort(FatalError);
322  }
323 
324  forAll(f, i)
325  {
326  const labelList& localAddrs = mapAddressing[i];
327  const scalarList& localWeights = mapWeights[i];
328 
329  f[i] = Zero;
330 
331  forAll(localAddrs, j)
332  {
333  f[i] += localWeights[j]*mapF[localAddrs[j]];
334  }
335  }
336 }
337 
338 
339 template<class Type>
341 (
342  const tmp<Field<Type>>& tmapF,
343  const labelListList& mapAddressing,
344  const scalarListList& mapWeights
345 )
346 {
347  map(tmapF(), mapAddressing, mapWeights);
348  tmapF.clear();
349 }
350 
351 
352 template<class Type>
354 (
355  const UList<Type>& mapF,
356  const FieldMapper& mapper,
357  const bool applyFlip
358 )
359 {
360  if (mapper.distributed())
361  {
362  // Fetch remote parts of mapF
363  const mapDistributeBase& distMap = mapper.distributeMap();
364  Field<Type> newMapF(mapF);
365 
366  if (applyFlip)
367  {
368  distMap.distribute(newMapF);
369  }
370  else
371  {
372  distMap.distribute(newMapF, noOp());
373  }
374 
375  if (mapper.direct() && notNull(mapper.directAddressing()))
376  {
377  map(newMapF, mapper.directAddressing());
378  }
379  else if (!mapper.direct())
380  {
381  map(newMapF, mapper.addressing(), mapper.weights());
382  }
383  else if (mapper.direct() && isNull(mapper.directAddressing()))
384  {
385  // Special case, no local mapper. Assume ordering already correct
386  // from distribution. Note: this behaviour is different compared
387  // to local mapper.
388  this->transfer(newMapF);
389  this->setSize(mapper.size());
390  }
391  }
392  else
393  {
394  if
395  (
396  mapper.direct()
397  && notNull(mapper.directAddressing())
398  && mapper.directAddressing().size()
399  )
400  {
401  map(mapF, mapper.directAddressing());
402  }
403  else if (!mapper.direct() && mapper.addressing().size())
404  {
405  map(mapF, mapper.addressing(), mapper.weights());
406  }
407  }
408 }
409 
410 
411 template<class Type>
413 (
414  const tmp<Field<Type>>& tmapF,
415  const FieldMapper& mapper,
416  const bool applyFlip
417 )
418 {
419  map(tmapF(), mapper, applyFlip);
420  tmapF.clear();
421 }
422 
423 
424 template<class Type>
426 (
427  const FieldMapper& mapper,
428  const bool applyFlip
429 )
430 {
431  if (mapper.distributed())
432  {
433  // Fetch remote parts of *this
434  const mapDistributeBase& distMap = mapper.distributeMap();
435  Field<Type> fCpy(*this);
436 
437  if (applyFlip)
438  {
439  distMap.distribute(fCpy);
440  }
441  else
442  {
443  distMap.distribute(fCpy, noOp());
444  }
445 
446  if
447  (
448  (mapper.direct()
449  && notNull(mapper.directAddressing()))
450  || !mapper.direct()
451  )
452  {
453  this->map(fCpy, mapper);
454  }
455  else if (mapper.direct() && isNull(mapper.directAddressing()))
456  {
457  // Special case, no local mapper. Assume ordering already correct
458  // from distribution. Note: this behaviour is different compared
459  // to local mapper.
460  this->transfer(fCpy);
461  this->setSize(mapper.size());
462  }
463  }
464  else
465  {
466  if
467  (
468  (
469  mapper.direct()
470  && notNull(mapper.directAddressing())
471  && mapper.directAddressing().size()
472  )
473  || (!mapper.direct() && mapper.addressing().size())
474  )
475  {
476  Field<Type> fCpy(*this);
477  map(fCpy, mapper);
478  }
479  else
480  {
481  this->setSize(mapper.size());
482  }
483  }
484 }
485 
486 
487 template<class Type>
489 (
490  const UList<Type>& mapF,
491  const labelUList& mapAddressing
492 )
493 {
494  Field<Type>& f = *this;
495 
496  forAll(mapF, i)
497  {
498  label mapI = mapAddressing[i];
499 
500  if (mapI >= 0)
501  {
502  f[mapI] = mapF[i];
503  }
504  }
505 }
506 
507 
508 template<class Type>
510 (
511  const tmp<Field<Type>>& tmapF,
512  const labelUList& mapAddressing
513 )
514 {
515  rmap(tmapF(), mapAddressing);
516  tmapF.clear();
517 }
518 
519 
520 template<class Type>
522 (
523  const UList<Type>& mapF,
524  const labelUList& mapAddressing,
525  const UList<scalar>& mapWeights
526 )
527 {
528  Field<Type>& f = *this;
529 
530  f = Zero;
531 
532  forAll(mapF, i)
533  {
534  f[mapAddressing[i]] += mapF[i]*mapWeights[i];
535  }
536 }
537 
538 
539 template<class Type>
541 (
542  const tmp<Field<Type>>& tmapF,
543  const labelUList& mapAddressing,
544  const UList<scalar>& mapWeights
545 )
546 {
547  rmap(tmapF(), mapAddressing, mapWeights);
548  tmapF.clear();
549 }
550 
551 
552 template<class Type>
554 {
555  TFOR_ALL_F_OP_OP_F(Type, *this, =, -, Type, *this)
556 }
557 
558 
559 template<class Type>
562 (
563  const direction d
564 ) const
565 {
566  auto tres = tmp<Field<cmptType>>::New(this->size());
567  ::Foam::component(tres.ref(), *this, d);
568  return tres;
569 }
570 
571 
572 template<class Type>
574 (
575  const direction d,
576  const UList<cmptType>& sf
577 )
578 {
579  TFOR_ALL_F_OP_FUNC_S_F(Type, *this, ., replace, const direction, d,
580  cmptType, sf)
581 }
582 
583 
584 template<class Type>
586 (
587  const direction d,
588  const tmp<Field<cmptType>>& tsf
589 )
590 {
591  replace(d, tsf());
592  tsf.clear();
593 }
594 
595 
596 template<class Type>
598 (
599  const direction d,
600  const cmptType& c
601 )
602 {
603  TFOR_ALL_F_OP_FUNC_S_S(Type, *this, ., replace, const direction, d,
604  cmptType, c)
605 }
606 
607 
608 template<class Type>
609 template<class VSForm>
611 {
612  VSForm vs;
613  for (direction i=0; i<VSForm::nComponents; i++)
614  {
615  vs[i] = this->operator[](start + i);
616  }
617  return vs;
618 }
619 
620 
621 template<class Type>
623 {
624  auto tres = tmp<Field<Type>>::New(this->size());
625  ::Foam::T(tres.ref(), *this);
626  return tres;
627 }
628 
629 
630 template<class Type>
631 void Foam::Field<Type>::writeEntry(const word& keyword, Ostream& os) const
632 {
633  if (keyword.size())
634  {
635  os.writeKeyword(keyword);
636  }
637 
638  // The contents are 'uniform' if the list is non-empty
639  // and all entries have identical values.
640 
642  {
643  os << word("uniform") << token::SPACE << this->first();
644  }
645  else
646  {
647  os << word("nonuniform") << token::SPACE;
649  }
650 
651  os << token::END_STATEMENT << nl;
652 }
653 
654 
655 // * * * * * * * * * * * * * * * Member Operators * * * * * * * * * * * * * //
656 
657 template<class Type>
659 {
660  if (this == &rhs)
661  {
662  return; // Self-assignment is a no-op
663  }
664 
666 }
667 
668 
669 template<class Type>
671 {
672  if (this == &(rhs()))
673  {
674  return; // Self-assignment is a no-op
675  }
676 
677  List<Type>::operator=(rhs());
678 }
679 
680 
681 template<class Type>
682 template<class Form, class Cmpt, Foam::direction nCmpt>
684 {
685  TFOR_ALL_F_OP_S(Type, *this, =, VSType, vs)
686 }
687 
688 
689 #define COMPUTED_ASSIGNMENT(TYPE, op) \
690  \
691 template<class Type> \
692 void Foam::Field<Type>::operator op(const UList<TYPE>& f) \
693 { \
694  TFOR_ALL_F_OP_F(Type, *this, op, TYPE, f) \
695 } \
696  \
697 template<class Type> \
698 void Foam::Field<Type>::operator op(const tmp<Field<TYPE>>& tf) \
699 { \
700  operator op(tf()); \
701  tf.clear(); \
702 } \
703  \
704 template<class Type> \
705 void Foam::Field<Type>::operator op(const TYPE& t) \
706 { \
707  TFOR_ALL_F_OP_S(Type, *this, op, TYPE, t) \
708 }
709 
714 
715 #undef COMPUTED_ASSIGNMENT
716 
717 
718 // * * * * * * * * * * * * * * * Ostream Operator * * * * * * * * * * * * * //
719 
720 template<class Type>
722 {
723  os << static_cast<const List<Type>&>(f);
724  return os;
725 }
726 
727 
728 template<class Type>
730 {
731  os << tf();
732  tf.clear();
733  return os;
734 }
735 
736 
737 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
738 
739 #include "FieldFunctions.C"
740 
741 // ************************************************************************* //
setSize
points setSize(newPointi)
Foam::component
void component(FieldField< Field, typename FieldField< Field, Type >::cmptType > &sf, const FieldField< Field, Type > &f, const direction d)
Definition: FieldFieldFunctions.C:44
FieldFunctions.C
mapDistributeBase.H
Foam::word
A class for handling words, derived from Foam::string.
Definition: word.H:62
Foam::tmp
A class for managing temporary objects.
Definition: PtrList.H:59
Foam::Field::autoMap
void autoMap(const FieldMapper &map, const bool applyFlip=true)
Map from self.
Definition: Field.C:426
Foam::Zero
static constexpr const zero Zero
Global zero.
Definition: zero.H:128
Foam::mapDistributeBase::distribute
static void distribute(const Pstream::commsTypes commsType, const List< labelPair > &schedule, const label constructSize, const labelListList &subMap, const bool subHasFlip, const labelListList &constructMap, const bool constructHasFlip, List< T > &, const negateOp &negOp, const int tag=UPstream::msgType())
Distribute data. Note:schedule only used for.
Definition: mapDistributeBaseTemplates.C:122
FieldM.H
High performance macro functions for Field<Type> algebra. These expand using either array element acc...
Foam::FieldMapper::size
virtual label size() const =0
Foam::FieldMapper::weights
virtual const scalarListList & weights() const
Definition: FieldMapper.H:107
TFOR_ALL_F_OP_FUNC_S_S
#define TFOR_ALL_F_OP_FUNC_S_S(typeF1, f1, OP, FUNC, typeS1, s1, typeS2, s2)
Definition: FieldM.H:237
Foam::FieldMapper
Abstract base class to hold the Field mapping addressing and weights.
Definition: FieldMapper.H:49
Foam::FatalIOError
IOerror FatalIOError
Foam::endl
Ostream & endl(Ostream &os)
Add newline and flush stream.
Definition: Ostream.H:337
Foam::token
A token holds an item read from Istream.
Definition: token.H:69
Foam::FieldMapper::direct
virtual bool direct() const =0
Foam::Field::Field
constexpr Field() noexcept
Construct null.
Definition: FieldI.H:31
TFOR_ALL_F_OP_S
#define TFOR_ALL_F_OP_S(typeF, f, OP, typeS, s)
Definition: FieldM.H:359
forAll
#define forAll(list, i)
Loop across all elements in list.
Definition: stdFoam.H:290
Foam::VectorSpace
Templated vector space.
Definition: VectorSpace.H:56
Foam::Field::map
void map(const UList< Type > &mapF, const labelUList &mapAddressing)
1 to 1 map from the given field
Definition: Field.C:263
Foam::Field< Foam::Vector2D >::cmptType
pTraits< Foam::Vector2D >::cmptType cmptType
Component type.
Definition: Field.H:87
Foam::label
intWM_LABEL_SIZE_t label
A label is an int32_t or int64_t as specified by the pre-processor macro WM_LABEL_SIZE.
Definition: label.H:62
Foam::IOstreamOption::versionNumber
Representation of a major/minor version number.
Definition: IOstreamOption.H:79
Foam::Field
Generic templated field type.
Definition: Field.H:63
Foam::token::info
InfoProxy< token > info() const
Return info proxy for printing token information to a stream.
Definition: token.H:513
Foam::ITstream
An input stream of tokens.
Definition: ITstream.H:55
Foam::Field::T
tmp< Field< Type > > T() const
Return the field transpose (only defined for second rank tensors)
Definition: Field.C:622
Foam::Field::replace
void replace(const direction, const UList< cmptType > &)
Replace a component field of the field.
Definition: Field.C:574
Foam::IOstreamOption::version
versionNumber version() const noexcept
Get the stream version.
Definition: IOstreamOption.H:321
dict
dictionary dict
Definition: searchingEngine.H:14
Foam::notNull
bool notNull(const T *ptr)
True if ptr is not a pointer (of type T) to the nullObject.
Definition: nullObject.H:195
Foam::Field::rmap
void rmap(const UList< Type > &mapF, const labelUList &mapAddressing)
1 to 1 reverse-map from the given field
Definition: Field.C:489
Foam::FatalError
error FatalError
Foam::dictionary
A list of keyword definitions, which are a keyword followed by a number of values (eg,...
Definition: dictionary.H:121
Foam::Field::negate
void negate()
Negate this field (negative).
Definition: Field.C:553
Foam::token::isWord
bool isWord() const
Token is WORD.
Definition: tokenI.H:552
Foam::FieldMapper::directAddressing
virtual const labelUList & directAddressing() const
Definition: FieldMapper.H:89
Foam::Ostream::writeKeyword
virtual Ostream & writeKeyword(const keyType &kw)
Write the keyword followed by an appropriate indentation.
Definition: Ostream.C:57
Foam::abort
errorManip< error > abort(error &err)
Definition: errorManip.H:137
T
const volScalarField & T
Definition: createFieldRefs.H:2
Foam::Field::component
tmp< Field< cmptType > > component(const direction) const
Return a component field of the field.
Definition: Field.C:562
Foam::token::wordToken
const word & wordToken() const
Return const reference to the word contents.
Definition: tokenI.H:558
Foam::Field::operator=
void operator=(const Field< Type > &)
Copy assignment.
Definition: Field.C:658
Foam::exit
errorManipArg< error, int > exit(error &err, const int errNo=1)
Definition: errorManip.H:130
Foam::Field::writeEntry
void writeEntry(const word &keyword, Ostream &os) const
Write the field as a dictionary entry.
Definition: Field.C:631
Foam::New
tmp< DimensionedField< TypeR, GeoMesh > > New(const tmp< DimensionedField< TypeR, GeoMesh >> &tdf1, const word &name, const dimensionSet &dimensions)
Global function forwards to reuseTmpDimensionedField::New.
Definition: DimensionedFieldReuseFunctions.H:105
FatalErrorInFunction
#define FatalErrorInFunction
Report an error message using Foam::FatalError.
Definition: error.H:355
Foam::FieldMapper::addressing
virtual const labelListList & addressing() const
Definition: FieldMapper.H:98
TFOR_ALL_F_OP_FUNC_S_F
#define TFOR_ALL_F_OP_FUNC_S_F(typeF1, f1, OP, FUNC, typeS, s, typeF2, f2)
Definition: FieldM.H:219
Foam::nl
constexpr char nl
Definition: Ostream.H:372
f
labelList f(nPoints)
contiguous.H
Foam::List< Type >
Foam::pTraits< Type >
Foam::Istream::putBack
void putBack(const token &tok)
Put back token.
Definition: Istream.C:53
Foam::start
label ListType::const_reference const label start
Definition: ListOps.H:408
Foam::Field::block
VSForm block(const label start) const
Definition: Field.C:610
Foam::UList< Type >
dictionary.H
Foam::direction
uint8_t direction
Definition: direction.H:47
Foam::constant::universal::c
const dimensionedScalar c
Speed of light in a vacuum.
Foam::mapDistributeBase
Class containing processor-to-processor mapping information.
Definition: mapDistributeBase.H:103
Foam::UList::size
void size(const label n) noexcept
Override size to be inconsistent with allocated storage.
Definition: UListI.H:360
FieldMapper.H
Foam::isNull
bool isNull(const T *ptr)
True if ptr is a pointer (of type T) to the nullObject.
Definition: nullObject.H:180
FatalIOErrorInFunction
#define FatalIOErrorInFunction(ios)
Report an error message using Foam::FatalIOError.
Definition: error.H:375
Foam::Ostream
An Ostream is an abstract base class for all output systems (streams, files, token lists,...
Definition: Ostream.H:56
IOWarningInFunction
#define IOWarningInFunction(ios)
Report an IO warning using Foam::Warning.
Definition: messageStream.H:306
TFOR_ALL_F_OP_OP_F
#define TFOR_ALL_F_OP_OP_F(typeF1, f1, OP1, OP2, typeF2, f2)
Definition: FieldM.H:341
Foam::FieldMapper::distributeMap
virtual const mapDistributeBase & distributeMap() const
Definition: FieldMapper.H:76
Foam::FieldMapper::distributed
virtual bool distributed() const
Definition: FieldMapper.H:71
Foam::operator<<
Ostream & operator<<(Ostream &, const boundaryPatch &)
Definition: boundaryPatch.C:102
COMPUTED_ASSIGNMENT
#define COMPUTED_ASSIGNMENT(TYPE, op)
Definition: Field.C:689
Foam::is_contiguous
A template class to specify that a data type can be considered as being contiguous in memory.
Definition: contiguous.H:75
Foam::noOp
Pass through value. Should never be specialized.
Definition: flipOp.H:64