48 { interpolationMethod::imDirect,
"direct" },
49 { interpolationMethod::imMapNearest,
"mapNearest" },
50 { interpolationMethod::imCellVolumeWeight,
"cellVolumeWeight" },
52 interpolationMethod::imCorrectedCellVolumeWeight,
53 "correctedCellVolumeWeight"
64 { procMapMethod::pmAABB,
"AABB" },
65 { procMapMethod::pmLOD,
"LOD" },
72 void Foam::meshToMesh::mapInternalSrcToTgt
77 const bool secondOrder
85 void Foam::meshToMesh::mapInternalSrcToTgt
90 const bool secondOrder
98 void Foam::meshToMesh::mapInternalSrcToTgt
103 const bool secondOrder
111 void Foam::meshToMesh::mapInternalSrcToTgt
116 const bool secondOrder
124 void Foam::meshToMesh::mapInternalSrcToTgt
129 const bool secondOrder
137 void Foam::meshToMesh::mapInternalSrcToTgt
142 const bool secondOrder
150 void Foam::meshToMesh::mapInternalTgtToSrc
155 const bool secondOrder
163 void Foam::meshToMesh::mapInternalTgtToSrc
168 const bool secondOrder
176 void Foam::meshToMesh::mapInternalTgtToSrc
181 const bool secondOrder
189 void Foam::meshToMesh::mapInternalTgtToSrc
194 const bool secondOrder
202 void Foam::meshToMesh::mapInternalTgtToSrc
207 const bool secondOrder
215 void Foam::meshToMesh::mapInternalTgtToSrc
220 const bool secondOrder
228 void Foam::meshToMesh::mapAndOpSrcToTgt
239 void Foam::meshToMesh::mapAndOpSrcToTgt
250 void Foam::meshToMesh::mapAndOpSrcToTgt
261 void Foam::meshToMesh::mapAndOpSrcToTgt
272 void Foam::meshToMesh::mapAndOpSrcToTgt
283 void Foam::meshToMesh::mapAndOpTgtToSrc
294 void Foam::meshToMesh::mapAndOpTgtToSrc
305 void Foam::meshToMesh::mapAndOpTgtToSrc
316 void Foam::meshToMesh::mapAndOpTgtToSrc
327 void Foam::meshToMesh::mapAndOpTgtToSrc
349 intersectBb.inflate(0.01);
359 if (intersectBb.overlaps(cellBb))
367 Pout<<
"participating source mesh cells: " <<
cells.size() <<
endl;
374 void Foam::meshToMesh::normaliseWeights
376 const word& descriptor,
401 void Foam::meshToMesh::calcAddressing
403 const word& methodName,
408 autoPtr<meshToMeshMethod> methodPtr
432 methodPtr->writeConnectivity(src, tgt, srcToTgtCellAddr_);
437 void Foam::meshToMesh::calculate(
const word& methodName,
const bool normalise)
439 Info<<
"Creating mesh-to-mesh addressing for " << srcRegion_.name()
440 <<
" and " << tgtRegion_.name() <<
" regions using "
441 << methodName <<
endl;
443 singleMeshProc_ = calcDistribution(srcRegion_, tgtRegion_);
445 if (singleMeshProc_ == -1)
448 globalIndex globalSrcCells(srcRegion_.nCells());
449 globalIndex globalTgtCells(tgtRegion_.nCells());
454 autoPtr<mapDistribute> mapPtr = calcProcMap(srcRegion_, tgtRegion_);
455 const mapDistribute& map = mapPtr();
463 distributeAndMergeCells
471 newTgtFaceNeighbours,
482 tgtRegion_.time().timeName(),
487 std::move(newTgtPoints),
488 std::move(newTgtFaces),
489 std::move(newTgtFaceOwners),
490 std::move(newTgtFaceNeighbours),
499 newTgt.nBoundaryFaces(),
500 newTgt.nInternalFaces(),
502 newTgt.boundaryMesh(),
509 (void)newTgt.tetBasePtIs();
516 Pout<<
"Created newTgt mesh:" <<
nl
517 <<
" old cells = " << tgtRegion_.nCells()
518 <<
", new cells = " << newTgt.nCells() <<
nl
519 <<
" old faces = " << tgtRegion_.nFaces()
520 <<
", new faces = " << newTgt.nFaces() <<
endl;
524 Pout<<
"Writing newTgt mesh: " << newTgt.
name() <<
endl;
529 calcAddressing(methodName, srcRegion_, newTgt);
532 for (
labelList& addressing : srcToTgtCellAddr_)
534 for (
label& addr : addressing)
536 addr = newTgtCellIDs[addr];
541 for (
labelList& addressing : tgtToSrcCellAddr_)
543 globalSrcCells.inplaceToGlobal(addressing);
557 ListPlusEqOp<label>(),
573 ListPlusEqOp<scalar>(),
597 List<Map<label>> cMap;
600 new mapDistribute(globalSrcCells, tgtToSrcCellAddr_, cMap)
604 new mapDistribute(globalTgtCells, srcToTgtCellAddr_, cMap)
608 reduce(V_, sumOp<scalar>());
612 calcAddressing(methodName, srcRegion_, tgtRegion_);
632 Info<<
" Overlap volume: " << V_ <<
endl;
641 case interpolationMethod::imDirect:
646 case interpolationMethod::imMapNearest:
651 case interpolationMethod::imCellVolumeWeight:
652 case interpolationMethod::imCorrectedCellVolumeWeight:
660 <<
"Unhandled enumeration " << interpolationMethodNames_[method]
669 void Foam::meshToMesh::calculatePatchAMIs(
const word& AMIMethodName)
671 if (!patchAMIs_.empty())
674 <<
"patch AMI already calculated"
678 patchAMIs_.setSize(srcPatchID_.size());
682 label srcPatchi = srcPatchID_[i];
683 label tgtPatchi = tgtPatchID_[i];
685 const polyPatch& srcPP = srcRegion_.boundaryMesh()[srcPatchi];
686 const polyPatch& tgtPP = tgtRegion_.boundaryMesh()[tgtPatchi];
688 Info<<
"Creating AMI between source patch " << srcPP.name()
689 <<
" and target patch " << tgtPP.name()
690 <<
" using " << AMIMethodName
715 void Foam::meshToMesh::constructNoCuttingPatches
717 const word& methodName,
718 const word& AMIMethodName,
719 const bool interpAllPatches
722 if (interpAllPatches)
724 const polyBoundaryMesh& srcBM = srcRegion_.boundaryMesh();
725 const polyBoundaryMesh& tgtBM = tgtRegion_.boundaryMesh();
727 DynamicList<label> srcPatchID(srcBM.size());
728 DynamicList<label> tgtPatchID(tgtBM.size());
731 const polyPatch& pp = srcBM[patchi];
736 if (!isA<processorPolyPatch>(pp))
738 srcPatchID.append(pp.index());
740 label tgtPatchi = tgtBM.findPatchID(pp.name());
744 tgtPatchID.append(tgtPatchi);
749 <<
"Source patch " << pp.name()
750 <<
" not found in target mesh. "
751 <<
"Available target patches are " << tgtBM.names()
757 srcPatchID_.transfer(srcPatchID);
758 tgtPatchID_.transfer(tgtPatchID);
762 calculate(methodName,
true);
765 calculatePatchAMIs(AMIMethodName);
769 void Foam::meshToMesh::constructFromCuttingPatches
771 const word& methodName,
772 const word& AMIMethodName,
773 const HashTable<word>& patchMap,
778 const polyBoundaryMesh& srcBm = srcRegion_.boundaryMesh();
779 const polyBoundaryMesh& tgtBm = tgtRegion_.boundaryMesh();
782 cuttingPatches_.setSize(cuttingPatches.size());
783 forAll(cuttingPatches_, i)
785 const word& patchName = cuttingPatches[i];
786 label cuttingPatchi = srcBm.findPatchID(patchName);
788 if (cuttingPatchi == -1)
791 <<
"Unable to find patch '" << patchName
792 <<
"' in mesh '" << srcRegion_.name() <<
"'. "
793 <<
" Available patches include:" << srcBm.names()
797 cuttingPatches_[i] = cuttingPatchi;
800 DynamicList<label> srcIDs(patchMap.size());
801 DynamicList<label> tgtIDs(patchMap.size());
805 const word& tgtPatchName = iter.key();
806 const word& srcPatchName = iter.val();
808 const polyPatch& srcPatch = srcBm[srcPatchName];
813 if (!isA<processorPolyPatch>(srcPatch))
815 const polyPatch& tgtPatch = tgtBm[tgtPatchName];
817 srcIDs.append(srcPatch.index());
818 tgtIDs.append(tgtPatch.index());
822 srcPatchID_.transfer(srcIDs);
823 tgtPatchID_.transfer(tgtIDs);
826 calculate(methodName, normalise);
829 calculatePatchAMIs(AMIMethodName);
835 Foam::meshToMesh::meshToMesh
841 bool interpAllPatches
846 procMapMethod_(mapMethod),
862 constructNoCuttingPatches
864 interpolationMethodNames_[method],
867 interpolationMethodAMI(method)
874 Foam::meshToMesh::meshToMesh
878 const word& methodName,
879 const word& AMIMethodName,
881 bool interpAllPatches
886 procMapMethod_(mapMethod),
902 constructNoCuttingPatches(methodName, AMIMethodName, interpAllPatches);
906 Foam::meshToMesh::meshToMesh
919 procMapMethod_(mapMethod),
933 constructFromCuttingPatches
935 interpolationMethodNames_[method],
938 interpolationMethodAMI(method)
947 Foam::meshToMesh::meshToMesh
951 const word& methodName,
952 const word& AMIMethodName,
961 procMapMethod_(mapMethod),
975 constructFromCuttingPatches