38 const dictionary&
dict,
44 return dict.get<Type>(
"average");
60 const word& fieldName,
66 const auto& procIDs = UPstream::procID(myComm);
71 const label proci = procIDs[ranki];
79 mappedPatchBase::subRegistry
82 mapper_.sendPath(proci)
90 Pout<<
"*** STORING :"
91 <<
" field:" << fieldName
93 <<
" as:" << subObr.objectPath() <<
endl;
96 mappedPatchBase::storeField(subObr, fieldName, subFld);
106 const bool allowUnset,
112 const word& fieldName,
116 const auto& procIDs = UPstream::procID(myComm);
123 const label proci = procIDs[ranki];
129 mappedPatchBase::subRegistry
132 mapper_.receivePath(proci)
144 if (subFldPtr->size() != map.size())
161 Pout<<
"*** RETRIEVED :"
162 <<
" field:" << fieldName
164 <<
" from:" << subObr.objectPath() <<
endl;
173 <<
" field:" << fieldName
174 <<
" in:" << subObr.objectPath() <<
endl;
182 mappedPatchBase::storeField(subObr, fieldName, dummyFld);
189 (void)subObr.lookupObject<
IOField<T>>(fieldName);
206 const word& fieldName,
213 const label nProcs = Pstream::nProcs(0);
215 for (label domain = 0; domain < nProcs; domain++)
217 const labelList& constructMap = map[domain];
218 if (constructMap.size())
222 mappedPatchBase::subRegistry
225 mapper_.receivePath(domain)
235 Pout<<
"*** STORING INITIAL :"
236 <<
" field:" << fieldName <<
" values:"
239 <<
" constructMap:" <<
flatOutput(constructMap)
240 <<
" as:" << subObr.objectPath() <<
endl;
243 mappedPatchBase::storeField(subObr, fieldName, receiveFld);
253 const word& fieldName,
256 const label constructSize,
265 patchField_.internalField().time(),
266 patchField_.patch().boundaryMesh().mesh().name(),
267 patchField_.patch().name(),
275 const bool ok = retrieveField
278 patchField_.internalField().time(),
279 mapper_.sampleRegion(),
280 mapper_.samplePatch(),
291 fld.setSize(address.size());
304 mop(
fld[facei], facei, work[slots[i]], w[i]);
324 const word& fieldName,
325 const bool setAverage,
327 const word& interpolationScheme
331 patchField_(patchField),
332 fieldName_(fieldName),
333 setAverage_(setAverage),
335 interpolationScheme_(interpolationScheme)
348 patchField_(patchField),
351 dict.template getOrDefault<word>
354 patchField_.internalField().name()
357 setAverage_(
dict.getOrDefault(
"setAverage",
false)),
358 average_(getAverage(
dict, setAverage_)),
363 mapper_.sampleDatabase()
365 mapper_.mode() != mappedPatchBase::NEARESTPATCHFACE
366 && mapper_.mode() != mappedPatchBase::NEARESTPATCHFACEAMI
371 <<
"Mapping using the database only supported for "
373 << mappedPatchBase::sampleModeNames_
375 mappedPatchBase::NEARESTPATCHFACE
378 << mappedPatchBase::sampleModeNames_
380 mappedPatchBase::NEARESTPATCHFACEAMI
385 if (mapper_.mode() == mappedPatchBase::NEARESTCELL)
387 dict.readEntry(
"interpolationScheme", interpolationScheme_);
406 if (mapper_.sampleDatabase())
408 if (mapper_.mode() == mappedPatchBase::NEARESTPATCHFACE)
413 patchField_.internalField().time(),
415 mapper_.sampleRegion(),
417 mapper_.samplePatch(),
418 mapper_.map().constructMap(),
419 patchField_.internalField().name(),
423 else if (mapper_.mode() == mappedPatchBase::NEARESTPATCHFACEAMI)
441 patchField_(patchField),
442 fieldName_(patchField_.internalField().name()),
473 patchField_(patchField),
484 template<
class Type2>
490 if (mapper_.sameRegion())
492 if (fieldName == patchField_.internalField().name())
496 dynamic_cast<const fieldType&
>
498 patchField_.internalField()
504 return thisMesh.template lookupObject<fieldType>(fieldName);
508 const fvMesh& nbrMesh = refCast<const fvMesh>(mapper_.sampleMesh());
509 return nbrMesh.template lookupObject<fieldType>(fieldName);
517 return sampleField<Type>(fieldName_);
525 const word& fieldName,
529 if (mapper_.sampleDatabase())
531 const label myComm = mapper_.getCommunicator();
533 if (mapper_.mode() != mappedPatchBase::NEARESTPATCHFACEAMI)
538 patchField_.internalField().time(),
539 patchField_.patch().boundaryMesh().mesh().name(),
540 patchField_.patch().name(),
542 mapper_.map().subMap(),
547 fld.setSize(mapper_.map().constructSize());
551 patchField_.internalField().time(),
552 mapper_.sampleRegion(),
553 mapper_.samplePatch(),
555 mapper_.map().constructMap(),
569 if (mapper_.masterWorld())
573 storeAndRetrieveField
589 storeAndRetrieveField
605 mapper_.distribute(
fld);
622 int oldTag = UPstream::msgType();
623 UPstream::msgType() = oldTag + 1;
629 auto& newValues = tnewValues.ref();
631 switch (mapper_.mode())
633 case mappedPatchBase::NEARESTCELL:
635 const fieldType&
fld = sampleField();
640 if (!mapper_.sameWorld() || mapper_.sampleDatabase())
643 <<
"Interpolating cell values from different world"
644 <<
" or database currently not supported"
649 refCast<const fvMesh>(mapper_.sampleMesh());
668 interpolationScheme_,
672 const auto& interp = *interpolator;
679 newValues[celli] = interp.interpolate
692 distribute(fieldName_, newValues);
696 case mappedPatchBase::NEARESTPATCHFACE:
697 case mappedPatchBase::NEARESTPATCHFACEAMI:
699 if (mapper_.sameWorld())
702 refCast<const fvMesh>(mapper_.sampleMesh());
703 const fieldType&
fld = sampleField();
705 const label nbrPatchID =
711 <<
"Unable to find sample patch " << mapper_.samplePatch()
712 <<
" in region " << mapper_.sampleRegion()
713 <<
" for patch " << patchField_.patch().name() <<
nl
717 const auto& nbrField =
fld;
719 newValues = nbrField.boundaryField()[nbrPatchID];
725 newValues = patchField_;
727 distribute(fieldName_, newValues);
731 case mappedPatchBase::NEARESTFACE:
734 if (mapper_.sameWorld())
737 refCast<const fvMesh>(mapper_.sampleMesh());
738 const fieldType&
fld = sampleField();
742 const auto& nbrField =
fld;
746 label faceStart = pf.patch().start();
750 allValues[faceStart++] = pf[facei];
760 const fieldType& thisFld =
dynamic_cast<const fieldType&
>
762 patchField_.internalField()
767 label faceStart = pf.patch().start();
771 allValues[faceStart++] = pf[facei];
776 distribute(fieldName_, allValues);
777 newValues.transfer(allValues);
784 <<
"Unknown sampling mode: " << mapper_.mode() <<
nl
792 gSum(patchField_.patch().magSf()*newValues)
793 /
gSum(patchField_.patch().magSf());
795 if (
mag(averagePsi) > 0.5*
mag(average_))
797 newValues *=
mag(average_)/
mag(averagePsi);
801 newValues += (average_ - averagePsi);
806 UPstream::msgType() = oldTag;
829 if (mapper_.sameWorld())
832 const label nbrPatchID = mapper_.samplePolyPatch().index();
833 const auto& nbrField = this->sampleField();
834 nbrIntFld = nbrField.boundaryField()[nbrPatchID].patchInternalField();
840 nbrIntFld = patchField_.patchInternalField();
845 int oldTag = UPstream::msgType();
846 UPstream::msgType() = oldTag+1;
848 distribute(fieldName_, nbrIntFld);
851 UPstream::msgType() = oldTag;
865 if (mapper_.sameWorld())
868 const auto& nbrMesh = refCast<const fvMesh>(this->mapper_.sampleMesh());
869 const label nbrPatchID = mapper_.samplePolyPatch().index();
870 const auto& nbrPatch = nbrMesh.boundary()[nbrPatchID];
871 nbrKDelta = nbrPatch.deltaCoeffs();
877 nbrKDelta = patchField_.patch().deltaCoeffs();
883 const int oldTag = UPstream::msgType();
884 UPstream::msgType() = oldTag+1;
886 distribute(fieldName_ +
"_deltaCoeffs", nbrKDelta);
889 UPstream::msgType() = oldTag;
898 const word& fieldName,
903 thisWeights =
new scalarField(patchField_.patch().deltaCoeffs());
904 if (!fieldName.empty())
907 patchField_.patch().template lookupPatchField
914 ).patchInternalField();
920 if (mapper_.sameWorld())
923 const auto& nbrMesh = refCast<const fvMesh>(mapper_.sampleMesh());
924 const label nbrPatchID = mapper_.samplePolyPatch().index();
925 const auto& nbrPatch = nbrMesh.boundary()[nbrPatchID];
927 nbrWeights =
new scalarField(nbrPatch.deltaCoeffs());
929 if (!fieldName.empty())
932 const auto& nbrWeightField =
933 nbrMesh.template lookupObject<volScalarField>(fieldName);
935 nbrWeightField.boundaryField()[nbrPatchID].patchInternalField();
947 int oldTag = UPstream::msgType();
948 UPstream::msgType() = oldTag+1;
950 distribute(fieldName_ +
"_weights", nbrWeights.
ref());
953 UPstream::msgType() = oldTag;
964 if (!isA<mappedPatchBase>(
p.patch()))
967 <<
"Incorrect patch type " <<
p.patch().type()
968 <<
" for patch " <<
p.patch().name()
969 <<
" of field " << iF.name()
970 <<
" in file " << iF.objectPath() <<
nl
971 <<
"Type should be a mappedPatch"
974 return refCast<const mappedPatchBase>(
p.patch());
982 const word& fieldName,
986 if (mapper_.sampleDatabase())
990 if (mapper_.mode() == mappedPatchBase::NEARESTPATCHFACE)
994 patchField_.internalField().time(),
995 mapper_.sampleRegion(),
996 mapper_.samplePatch(),
997 mapper_.map().constructMap(),
1006 template<
class Type>
1009 os.writeEntry(
"field", fieldName_);
1013 os.writeEntry(
"setAverage",
"true");
1014 os.writeEntry(
"average", average_);
1017 if (mapper_.mode() == mappedPatchBase::NEARESTCELL)
1019 os.writeEntry(
"interpolationScheme", interpolationScheme_);