// Read in a list of dictionaries for the merge patch pairs if (meshDict.found("mergePatchPairs")) { List > mergePatchPairs ( meshDict.lookup("mergePatchPairs") ); if (mergePatchPairs.size() > 0) { // Create and add point and face zones and mesh modifiers List pz(mergePatchPairs.size()); List fz(3*mergePatchPairs.size()); List cz(0); forAll (mergePatchPairs, pairI) { const word mergeName ( mergePatchPairs[pairI].first() + mergePatchPairs[pairI].second() + name(pairI) ); pz[pairI] = new pointZone ( mergeName + "CutPointZone", labelList(0), 0, mesh.pointZones() ); // Master patch const word masterPatchName(mergePatchPairs[pairI].first()); const polyPatch& masterPatch = mesh.boundaryMesh() [ mesh.boundaryMesh().findPatchID(masterPatchName) ]; labelList isf(masterPatch.size()); forAll (isf, i) { isf[i] = masterPatch.start() + i; } fz[3*pairI] = new faceZone ( mergeName + "MasterZone", isf, boolList(masterPatch.size(), false), 0, mesh.faceZones() ); // Slave patch const word slavePatchName(mergePatchPairs[pairI].second()); const polyPatch& slavePatch = mesh.boundaryMesh() [ mesh.boundaryMesh().findPatchID(slavePatchName) ]; labelList osf(slavePatch.size()); forAll (osf, i) { osf[i] = slavePatch.start() + i; } fz[3*pairI + 1] = new faceZone ( mergeName + "SlaveZone", osf, boolList(slavePatch.size(), false), 1, mesh.faceZones() ); // Add empty zone for cut faces fz[3*pairI + 2] = new faceZone ( mergeName + "CutFaceZone", labelList(0), boolList(0, false), 2, mesh.faceZones() ); } // end of all merge pairs Info << "Adding point and face zones" << endl; mesh.addZones(pz, fz, cz); Info << "Creating topo change" << endl; polyTopoChanger attacher(mesh); attacher.setSize(mergePatchPairs.size()); forAll (mergePatchPairs, pairI) { const word mergeName ( mergePatchPairs[pairI].first() + mergePatchPairs[pairI].second() + name(pairI) ); // Add the sliding interface mesh modifier attacher.set ( pairI, new slidingInterface ( "couple" + name(pairI), pairI, attacher, mergeName + "MasterZone", mergeName + "SlaveZone", mergeName + "CutPointZone", mergeName + "CutFaceZone", mergePatchPairs[pairI].first(), mergePatchPairs[pairI].second(), slidingInterface::INTEGRAL, // always integral intersection::VISIBLE ) ); } attacher.changeMesh(); // Clean the mesh after attach labelList patchSizes(mesh.boundaryMesh().size()); labelList patchStarts(mesh.boundaryMesh().size()); forAll (mesh.boundaryMesh(), patchI) { patchSizes[patchI] = mesh.boundaryMesh()[patchI].size(); patchStarts[patchI] = mesh.boundaryMesh()[patchI].start(); } mesh.resetPrimitives ( xferCopy(mesh.points()), xferCopy(mesh.faces()), xferCopy(mesh.faceOwner()), xferCopy(mesh.faceNeighbour()), patchSizes, patchStarts ); mesh.setInstance(runTime.constant()); mesh.removeZones(); } } else { Info<< nl << "There are no merge patch pairs" << endl; } // Set any cellZones (note: cell labelling unaffected by above // mergePatchPairs) label nZones = blocks.numZonedBlocks(); if (nZones > 0) { Info<< nl << "Adding cell zones" << endl; // Map from zoneName to cellZone index HashTable