CFD Online Discussion Forums

CFD Online Discussion Forums (https://www.cfd-online.com/Forums/)
-   OpenFOAM Programming & Development (https://www.cfd-online.com/Forums/openfoam-programming-development/)
-   -   Mesh gets out of sync during parallel 2D adaptive mesh refinement (https://www.cfd-online.com/Forums/openfoam-programming-development/126321-mesh-gets-out-sync-during-parallel-2d-adaptive-mesh-refinement.html)

pjohannes183 November 14, 2013 04:31

Mesh gets out of sync during parallel 2D adaptive mesh refinement
 
Dear Co-Foamers,

I am working on a 2D adaptive mesh refinement and managed to create a dynamicFvMesh using some of OpenFOAM's high-level mesh operations. It runs fine and gives good results (I successfully validated a backward-facing step) but as soon as I try to run it in parallel, it won't work anymore. Maybe somebody understands why my code does not work in parallel and knows how I could make it work? I believe I need to synchronize some information between the processors after the first refinement step but I don't know exactly which information to transfer.

Let me become a bit more precise about what I've done so far:

I'm doing mesh refinement in 2 passes, one for each direction (say x and y). The first step works fine but when it comes to the second step it fails. It appears to me that the meshes have become out of sync at the coupled processor boundaries. One processor does not know which cells are connected from its neighbour processor over the coupled patch. I'm getting errors like
Code:

[4] --> FOAM FATAL ERROR:
[4] in patch:procBoundary4to3 : Local size of patch is 62 (faces).
Received from neighbour 64 faceCentres!

or

Code:

[2] Cannot find point in pts1 matching point 3
coord:(0.0015 0.001761904762 0) in pts0
when using tolerance 2.670915379e-08

The code when reduced to the essential looks as follows
Code:

bool Foam::dynamic2DRefineFvMesh::update()
{
    // I left out some unnecessary code
    // all variables used for the x-refinement are marked with "1"
    // the variables for the y-refinement have a "2"

    // the list of cell labels which we want to refine later
    labelList refCells1;

    // actually determine the cells we want to refine
    determineRefinementCells(refCells1);

    // a list of "refineCells" which holds the same labels as refCells1 but together with a vector
    List<refineCell> refineCellList1;

    // first refinement in x direction
    const vector vec1 = (1, 0, 0);

    // copy refCells1 into refineCellList1
    transferToRefineCellList(refCells1, refineCellList1, vec1);

    // create a cellLooper for the mesh
    autoPtr<cellLooper> cellLooper1(new geomCellLooper(*this));

    // create a meshCutter, undoability switched off
    undoableMeshCutter undoableMeshCutter1(*this, false)

    // create a polyTopoChange which will perform the actual mesh modifications
    polyTopoChange polyTopoChange1(*this);

    // construct cellCuts for our refinement cells
    cellCuts cc1(*this, cellLooper1(), refineCellList1);

    // play the refinement operation into the polyTopoChange
    undoableMeshCutter1.setRefinement(cc1, polyTopoChange1);

    // create a map which holds the information for the mesh changes
    autoPtr<mapPolyMesh> map1 = polyTopoChange1.changeMesh(*this, false);

    // update fields, works fine this time but won't work for the second direction
    updateMesh(map1);

    //-- x-direction is done. y-direction is analogous
    // between both steps we need to find out the new labels of the cells which have been refined in step 1 so we know which cells we must still refine in step 2 (the labels will have changed)
    // the code will crash as soon as I call updateMesh(map2) (or even earlier if I try other things like parallel redistributing)

    // ...
}

I'd be very happy if anybody could point me in the right direction. Thank you in advance for any support!


All times are GMT -4. The time now is 14:04.