CFD Online Discussion Forums

CFD Online Discussion Forums (https://www.cfd-online.com/Forums/)
-   OpenFOAM Running, Solving & CFD (https://www.cfd-online.com/Forums/openfoam-solving/)
-   -   Problem using AMI (https://www.cfd-online.com/Forums/openfoam-solving/95697-problem-using-ami.html)

otaolafr May 18, 2021 03:30

Quote:

Originally Posted by louisgag (Post 804059)
Having different number of cells on the two neighboring patches is not an issue.
It sounds like you have one cell face that doesn't find any neighbor, that's an issue.
There are some parameters to ignore this type of issue or you can verify visually that all faces properly match with one or more neighbors

hello louis,
thanks for your answer! I have being reading all over the forum without luck... as you can see in the image, the patches are superposed correctly. at least visually, did you meant another thing? there are more image in my original post if necessary
https://i.ibb.co/pwHvVSB/fig2.png

louisgag May 18, 2021 04:24

I don't know much about this type of use of the AMI interface but you could check whether it is like I said by trying the ACMI: https://openfoam.org/release/2-3-0/non-conforming-ami/

otaolafr May 18, 2021 05:01

Quote:

Originally Posted by louisgag (Post 804073)
I don't know much about this type of use of the AMI interface but you could check whether it is like I said by trying the ACMI: https://openfoam.org/release/2-3-0/non-conforming-ami/

hello louis,
I found at least a partial solution for my issue and made it work.
the problem is comming from the feature snapping. I was using a quarter of the geometry (that had two symmetry planes) as the input mesh for the snappy. and when I was doing this the features were perfectly detected, but that brought some problems.I tryied another workflow where I introduce a bigger surface mesh than my real volume and "cut it" with my background mesh therefore the features detected were less (as the ones in the cut will not be detected by surfaceFeatureExtract). this solved my issue. it is not a perfect solution but at least it works.... I will post this and an image ilustrating it in my thread if you want to have a look (so anyone that finish in that thread has an answer)

gabrielfelix October 22, 2021 12:56

Error when creating AMI patches propeller
 
2 Attachment(s)
Hi folks,

I've been running propeller simulations over the last months, and I had been using snappyHexMesh for meshing the propeller geometry and simulation domain before jumping into cfMesh. My simulation structure is completely based on the pimpleFoam propeller tutorial, except that I modified it to run my geometry in compressible steady-state (rhoSimpleFoam) and using MRF technique.

SHM meshes were never as refined as they should be, specially at the leading-edge and near the blade tips. As reported in this thread:
[snappyHexMesh] Rough leading-edge and trailing-edge after snapping, I spent around 2 months trying to improve the mesh, which I actually did, however not sufficiently as I wanted. SHM fails to refine the surface after a certain surface refinement level and also fails to add boundary layers properly to the surface.

After researching for alternatives I came across cfMesh through this video: How to create your first mesh with cfMesh - tutorial by József Nagy that helped me a lot with the introduction to the mesher. It is a much simpler, more intuitive, increadibly fast, and requires fewer configurations compared to SHM. It really surprised me.

I have started meshing with it and the very first mesh I came out with was better than any mesh I had done before with SHM. Not only the surface refinement was excelent, but it succesfully added layers on the whole propeller/airfoil surface. It also executed the mesh in less than a minute, when compared to 10-30 minutes of SHM. I found cfMesh really great, but I'm having difficulties to integrate the mesh to my simulation structure and to dealing with some AMI patches, which I'm going to further detail next.

My domain is composed by:
- propellerTip: are the prop blades
- propellerSpinner: the prop spinner
- innerCylinderSmall: the "moving" domain
- outerCylinder: an outer cylinder that contains the other patches as well as the farfield upstream and downstream of the propeller

https://i.imgur.com/Dk7HAJK.png

snappyHexMesh
The meshing process that I was using was: create a blockMesh wrapping the whole domain; extract stl file surface with surfaceFeatureExtract, mesh with snappyHexMesh;configure the boundary, inlet and outlet face sets; and finally create AMI, inlet and outlet patches.

Code:

blockMesh
surfaceFeatureExtract
snappyHexMesh
topoSet -dict system/createInletOutletSets.topoSetDict
createPatch -overwrite

blockMeshDict:
Code:

scale  1;
convertToMeters  1;

vertices
(
    (-0.65 -0.65 -0.65)
    ( 0.65 -0.65 -0.65)
    ( 0.65  0.65 -0.65)
    (-0.65  0.65 -0.65)
    (-0.65 -0.65  0.65)
    ( 0.65 -0.65  0.65)
    ( 0.65  0.65  0.65)
    (-0.65  0.65  0.65)
);


blocks
(
    hex (0 1 2 3 4 5 6 7) (12 20 12) simpleGrading (1 1 1)
);

edges
(
);

boundary
(
    walls
    {
        type wall;
        faces
        (
            (2 6 5 1)
            (0 3 2 1)
            (0 4 7 3)
            (4 5 6 7)
        );
    }
    inlet
    {
        type patch;
        faces
        (
            (3 7 6 2)
        );
    }
    outlet
    {
        type patch;
        faces
        (
            (1 5 4 0)
        );
    }
);

// ************************************************************************* //

snappyHexMeshDict:
Code:

castellatedMesh true;
snap            true;
addLayers      true;

geometry
{
    innerCylinderSmall.stl
        {
                type triSurfaceMesh;
                name innerCylinderSmall;
        }
        outerCylinder.stl
        {
                type triSurfaceMesh;
                name outerCylinder;
        }
        propellerTip.stl
        {
                type triSurfaceMesh;
                name propellerTip;
        }
    propellerSpinner.stl
        {
                type triSurfaceMesh;
                name propellerSpinner;
        }
}


castellatedMeshControls
{

    maxLocalCells 1000000;

    maxGlobalCells 15000000;

    minRefinementCells 0;

    maxLoadUnbalance 0.10;

    nCellsBetweenLevels 2;



    features
    (
        {
            file        "innerCylinderSmall.eMesh";
            level      2;
        }
        {
            file        "outerCylinder.eMesh";
            level      0;
        }
        {
            file        "propellerTip.eMesh";
            level      9;
        }
        {
            file        "propellerSpinner.eMesh";
            level      6;
        }
    );



    refinementSurfaces
    {
        innerCylinderSmall
        {
            level      (2 2);

            faceType    boundary;
            cellZone    innerCylinderSmall;
            faceZone    innerCylinderSmall;
            cellZoneInside  inside;
        }
        outerCylinder
        {
            level      (0 0);
        }
        propellerTip
        {
            level      (1 9);
        }
        propellerSpinner
        {
            level      (1 6);
        }
    }

    resolveFeatureAngle 0.1;


    refinementRegions
    {
        innerCylinderSmall
        {
            mode        inside;
            levels      ((1E15 2));
        }
        outerCylinder
        {
            mode        inside;
            levels      ((1E15 1));
        }
    }

    locationInMesh (0.01 -0.125 0.01);

    allowFreeStandingZoneFaces false;
}


snapControls
{
    nSmoothPatch 3;

    tolerance 1.0; // 1.0;

    nSolveIter 100;

    nRelaxIter 5;

        nFeatureSnapIter 10;

        implicitFeatureSnap true;

        explicitFeatureSnap false;

        multiRegionFeatureSnap true;
}


addLayersControls
{
    relativeSizes true;

    layers
    {
                "propellerTip.*"
                        {
                                nSurfaceLayers 3;
                        }
    }

    expansionRatio 1.0;

    finalLayerThickness 0.3;

    minThickness 0.1;

    nGrow 0;

    featureAngle 30;

    nRelaxIter 3;

    nSmoothSurfaceNormals 1;

    nSmoothNormals 3;

    nSmoothThickness 10;

    maxFaceThicknessRatio 0.5;

    maxThicknessToMedialRatio 0.3;

    minMedialAxisAngle 90;

    nBufferCellsNoExtrude 0;

    nLayerIter 100;
}


meshQualityControls
{
    maxNonOrtho 65;

    maxBoundarySkewness 4;
    maxInternalSkewness 4;

    maxConcave 80;

    minVol 1e-13;

    minTetQuality -1e30; // 1e-30;

    minArea -1;

    minTwist 0.01;

    minDeterminant 0.001;

    minFaceWeight 0.05;

    minVolRatio 0.01;

    minTriangleTwist -1;


    nSmoothScale 4;

    errorReduction 0.75;

    relaxed
    {
        maxNonOrtho 75;
    }
}

mergeTolerance 1e-6;


// ************************************************************************* //

createInletOutletSets.topoSetDict:
Code:

/*--------------------------------*- C++ -*----------------------------------*\
FoamFile
{
    version    2.0;
    format      ascii;
    class      dictionary;
    object      topoSetDict;
}

// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

actions
(
    {
        name    boundaryFaces;
        type    faceSet;
        action  new;
        source  patchToFace;
        patch  outerCylinder;
    }
   
    {
        name    outletFaces;
        type    faceSet;
        action  new;
        source  faceToFace;
        set    boundaryFaces;
    }

    {
        name    inletFaces;
        type    faceSet;
        action  new;
        source  faceToFace;
        set    boundaryFaces;
    }

    {
        name    outletFaces;
        type    faceSet;
        action  subset;
        source  normalToFace;
        normal  (0 -1 0);
        cos    0.3;    // Tolerance (max cos of angle)
    }

    {
        name    inletFaces;
        type    faceSet;
        action  subset;
        source  normalToFace;
        normal  (0 1 0);
        cos    0.3;    // Tolerance (max cos of angle)
    }
);

// ************************************************************************* //

createPatchDict:
Code:

/*--------------------------------*- C++ -*----------------------------------*\
FoamFile
{
    version    2.0;
    format      ascii;
    class      dictionary;
    object      createPatchDict;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

// Do a synchronisation of coupled points after creation of any patches.
// Note: this does not work with points that are on multiple coupled patches
//      with transformations (i.e. cyclics).
pointSync false;

// Patches to create.
patches
(   
    {
        //- Master side patch
        name            AMI1;
        patchInfo
        {
            type            cyclicAMI;
            matchTolerance  0.0001;
            neighbourPatch  AMI2;
            transform      noOrdering;
        }
        constructFrom patches;
        patches (innerCylinderSmall);
    }

    {
        //- Slave side patch
        name            AMI2;
        patchInfo
        {
            type            cyclicAMI;
            matchTolerance  0.0001;
            neighbourPatch  AMI1;
            transform      noOrdering;
        }
        constructFrom patches;
        patches (innerCylinderSmall_slave);
    }


    {
        name inlet;
        patchInfo
        {
            type            patch;
        }
        constructFrom set;
        set inletFaces;
    }
    {
        name outlet;
        patchInfo
        {
            type            patch;
        }
        constructFrom set;
        set outletFaces;
    }
);

// ************************************************************************* //

cfMesh

Now, for cfMesh I tried to keep as much of the previous workflow as possible, however, as seen in this post: Problem using AMI post #184, due to cfMesh limitations I had to create two separate meshes: rotor containing innerCylinderSmall, propellerTip, and propellerSpinner; and stator containing outerCylinder. An then I merged them together with mergeMesh.

I created the mesh on both rotor and stator folders as
Code:

surfaceFeatureEdges rotor.stl rotor.fms
cartesianMesh

surfaceFeatureEdges stator.stl stator.fms
blockMesh
cartesianMesh

with meshDict.rotor:
Code:

FoamFile
{
    version    2.0;
    format      ascii;
    class      dictionary;
    location    "mesh";
    object      meshDict;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

surfaceFile "rotorSlave.fms";

minCellSize 0.005;

maxCellSize 0.01;

boundaryCellSize 0.05;

localRefinement
{
    "propellerTip"
    {
        //cellSize  0.000125;
        additionalRefinementLevels 6;
    }
}

boundaryLayers
{
    //nLayers 3;
   
    thicknessRatio 1.1;
   
    maxFirstLayerThickness 0.5;
   
    patchBoundaryLayers
    {
        "propellerTip"
        {
            nLayers 3;
           
            allowDiscontinuity 0;
        }
    }
}

meshDict.stator:
Code:

FoamFile
{
    version    2.0;
    format      ascii;
    class      dictionary;
    location    "mesh";
    object      meshDict;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

surfaceFile "outerCylinder.fms";

minCellSize 0.01;

maxCellSize 0.1;

boundaryCellSize 0.1;

Then I execute:
Code:

cd stator
mergeMeshes . ../rotor
topoSet -dict system/createInletOutletSets.topoSetDict
createPatch -overwrite

However, createPatch fails to create AMI2 patch because there is no innerCylinderSmall_slave patch. Thus the AMI2 is created empty with zero faces, as is shown in boundary file below. The patch innerCylinderSmall_slave patch is created as simrego described on this thread below:
Quote:

Originally Posted by simrego (Post 718193)
Hi!


If I'm correct it is made in the refinementSurfaces/innerCylinderSmall entry where you define the faceType as boundary. So you split the mesh with walls. Then in the createPatch utility you correct it and create the cyclicAMI interface between them.

it is created in this section of SHM
Code:

refinementSurfaces
    {
        innerCylinderSmall
        {
            level      (2 2);

            faceType    boundary;
            cellZone    innerCylinderSmall;
            faceZone    innerCylinderSmall;
            cellZoneInside  inside;
        }

however, it is not created under cfMesh environment.

I tried many and many things that I saw in multiple threads without any success. I need to create the innerCylinderSmall_slave patch, but I dont know how to copy or duplicate the patch innerCylinderSmall.

createPatch log:
Code:

/*---------------------------------------------------------------------------*\
| =========                |                                                |
| \\      /  F ield        | OpenFOAM: The Open Source CFD Toolbox          |
|  \\    /  O peration    | Version:  v2012                                |
|  \\  /    A nd          | Website:  www.openfoam.com                      |
|    \\/    M anipulation  |                                                |
\*---------------------------------------------------------------------------*/
Build  : _7bdb509494-20201222 OPENFOAM=2012
Arch  : "LSB;label=32;scalar=64"
Exec  : createPatch -overwrite
Date  : Oct 21 2021
Time  : 15:01:31
Host  : MSI
PID    : 640
I/O    : uncollated
Case  : /mnt/c/Users/Felix/Documents/Mestrado/OpenFOAM/runs/liuPropeller/3liuAs31mscD30implicit/mesh/stator
nProcs : 1
trapFpe: Floating point exception trapping enabled (FOAM_SIGFPE).
fileModificationChecking : Monitoring run-time modified files using timeStampMaster (fileModificationSkew 5, maxFileModificationPolls 20)
allowSystemOperations : Allowing user-supplied system call operations

// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
Create time

Create polyMesh for time = 0

Reading "system/createPatchDict"

Adding new patch AMI1 as patch 4 from
{
    type            cyclicAMI;
    matchTolerance  0.0001;
    neighbourPatch  AMI2;
    transform      noOrdering;
}

Adding new patch AMI2 as patch 5 from
{
    type            cyclicAMI;
    matchTolerance  0.0001;
    neighbourPatch  AMI1;
    transform      noOrdering;
}

Adding new patch inlet as patch 6 from
{
    type            patch;
}

Adding new patch outlet as patch 7 from
{
    type            patch;
}


Moving faces from patch innerCylinderSmall to patch 4
--> FOAM Warning :
    From Foam::labelHashSet Foam::polyBoundaryMesh::patchSet(const Foam::UList<Foam::wordRe>&, bool, bool) const
    in file meshes/polyMesh/polyBoundaryMesh/polyBoundaryMesh.C at line 896
    Cannot find any patch or group names matching innerCylinderSmall_slave
Read 5050 faces from faceSet inletFaces
Read 4964 faces from faceSet outletFaces

Doing topology modification to order faces.

Not synchronising points.

Removing patches with no faces in them.

Removing zero-sized patch innerCylinderSmall type wall at position 1
Removing patches.
Writing repatched mesh to 0

End

boundary file with AMI2 with zero faces:
Code:

/*--------------------------------*- C++ -*----------------------------------*\
| =========                |                                                |
| \\      /  F ield        | OpenFOAM: The Open Source CFD Toolbox          |
|  \\    /  O peration    | Version:  v2012                                |
|  \\  /    A nd          | Website:  www.openfoam.com                      |
|    \\/    M anipulation  |                                                |
\*---------------------------------------------------------------------------*/
FoamFile
{
    version    2.0;
    format      binary;
    class      polyBoundaryMesh;
    arch        "LSB;label=32;scalar=64";
    location    "constant/polyMesh";
    object      boundary;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

7
(
    outerCylinder
    {
        type            wall;
        inGroups        1(wall);
        nFaces          18590;
        startFace      16194675;
    }
    propellerSpinner
    {
        type            wall;
        inGroups        1(wall);
        nFaces          14725;
        startFace      16213265;
    }
    propellerTip
    {
        type            wall;
        inGroups        1(wall);
        nFaces          1030388;
        startFace      16227990;
    }
    AMI1
    {
        type            cyclicAMI;
        inGroups        1(cyclicAMI);
        nFaces          9448;
        startFace      17258378;
        matchTolerance  0.0001;
        transform      noOrdering;
        neighbourPatch  AMI2;
        AMIMethod      faceAreaWeightAMI;
        restartUncoveredSourceFace 1;
    }
    AMI2
    {
        type            cyclicAMI;
        inGroups        1(cyclicAMI);
        nFaces          0;
        startFace      17267826;
        matchTolerance  0.0001;
        transform      noOrdering;
        neighbourPatch  AMI1;
        AMIMethod      faceAreaWeightAMI;
        restartUncoveredSourceFace 1;
    }
    inlet
    {
        type            patch;
        nFaces          5050;
        startFace      17267826;
    }
    outlet
    {
        type            patch;
        nFaces          4964;
        startFace      17272876;
    }
)

// ************************************************************************* //

I saw that createBaffles could do the job, but I could not find any configuration that would help me. I tried to set up the dict below, but it didn't work.
Code:

FoamFile
{
    version    2.0;
    format      ascii;
    class      dictionary;
    object      createBafflesDict;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

internalFacesOnly true;

baffles
{
    baffleFaces
    {
        type                faceZone;
        zoneName        innerCylinderSmall;
            flip                false;
       
        patches
        {
            master
            {
                name            innerCylinderSmall;
                type            wall;
            }
            slave { ${..master} }
        }
    }
}

What do you folks think I should do? But trying to keep as much of the original workflow?

I'll make available both the snappyHexMesh and cfMesh case folder which I mentioned above:
https://drive.google.com/file/d/1uq8...ew?usp=sharing

Images from the differences of SHM and cfMesh meshes. Left SHM, right cfMesh

mrk17 December 2, 2021 01:13

Hi Gabriel,

I am facing the same problem. I am trying to setup a case for rhoPimpleFoam to analyse the flow around a propeller.

Like you, I used the snappyHexMesh without success. It just wont work. Then I turned to cfMesh which gave a good mesh. But I am facing issues with the AMI interface.

Per my understanding, when using SHM it will create a faceZone for the innerCylinder patch and a cellZone for the region it encloses (in our case the rotating region). But it will not separate the mesh into two regions (which is what AMI needs). Using the faceZone / the slave patches created by SHM we can use createBaffles / createPatch to separate the mesh into two regions and define AMIs.

In cfMesh, since there are two meshes (rotating and stationary), merging them together creates the two regions AMI needs. All that's left to do is to define AMI with createPatch or edit the boundary file like wyldckat suggested in this post. And I was able to create AMI patches without any issues. But the problem comes when I run the case. I get the following warning every time the solver tries to create weights for the AMI. I just couldn't figure this out.

Code:

AMI: Creating addressing and weights between 376 source faces and 87808 target faces
--> FOAM Warning :
    From virtual void Foam::faceAreaWeightAMI::calcInterArea(Foam::label, Foam::label, Foam::scalar&, Foam::vector&) const
    in file AMIInterpolation/AMIInterpolation/faceAreaWeightAMI/faceAreaWeightAMI.C at line 414
    Invalid normal for source face 0 points 3((-0.493139 -0.15 -0.869936) (-0.607758 -0.15 -0.794109) (-0.397416 -0.15 -0.773014)) target face 31158 points 4((0.800022 0.15 0.390017) (0.800034 0.15 0.400026) (0.810078 0.15 0.400056) (0.810052 0.15 0.390038))
--> FOAM Warning :
    From virtual void Foam::faceAreaWeightAMI::calcInterArea(Foam::label, Foam::label, Foam::scalar&, Foam::vector&) const
    in file AMIInterpolation/AMIInterpolation/faceAreaWeightAMI/faceAreaWeightAMI.C at line 414
    Invalid normal for source face 0 points 3((-0.493139 -0.15 -0.869936) (-0.607758 -0.15 -0.794109) (-0.397416 -0.15 -0.773014)) target face 1 points 4((0.810078 0.15 0.400056) (0.810113 0.15 0.410082) (0.820232 0.15 0.41016) (0.820164 0.15 0.400115))
--> FOAM Warning :
    From virtual void Foam::faceAreaWeightAMI::calcInterArea(Foam::label, Foam::label, Foam::scalar&, Foam::vector&) const
    in file AMIInterpolation/AMIInterpolation/faceAreaWeightAMI/faceAreaWeightAMI.C at line 414
    Invalid normal for source face 0 points 3((-0.493139 -0.15 -0.869936) (-0.607758 -0.15 -0.794109) (-0.397416 -0.15 -0.773014)) target face 2 points 4((0.800052 0.15 0.410039) (0.800077 0.15 0.420057) (0.810163 0.15 0.420116) (0.810113 0.15 0.410082))
--> FOAM Warning :
    From virtual void Foam::faceAreaWeightAMI::calcInterArea(Foam::label, Foam::label, Foam::scalar&, Foam::vector&) const
    in file AMIInterpolation/AMIInterpolation/faceAreaWeightAMI/faceAreaWeightAMI.C at line 414
    Invalid normal for source face 0 points 3((-0.493139 -0.15 -0.869936) (-0.607758 -0.15 -0.794109) (-0.397416 -0.15 -0.773014)) target face 31051 points 4((0.790014 0.15 0.400011) (0.790022 0.15 0.410017) (0.800052 0.15 0.410039) (0.800034 0.15 0.400026))
--> FOAM Warning :
    From virtual void Foam::faceAreaWeightAMI::calcInterArea(Foam::label, Foam::label, Foam::scalar&, Foam::vector&) const
    in file AMIInterpolation/AMIInterpolation/faceAreaWeightAMI/faceAreaWeightAMI.C at line 414
    Invalid normal for source face 0 points 3((-0.493139 -0.15 -0.869936) (-0.607758 -0.15 -0.794109) (-0.397416 -0.15 -0.773014)) target face 0 points 4((0.800034 0.15 0.400026) (0.800052 0.15 0.410039) (0.810113 0.15 0.410082) (0.810078 0.15 0.400056))
--> FOAM Warning :
    From virtual bool Foam::faceAreaWeightAMI::overlaps(Foam::label, Foam::label, Foam::scalar) const
    in file AMIInterpolation/AMIInterpolation/faceAreaWeightAMI/faceAreaWeightAMI.C at line 493
    Invalid normal for source face 14 points 4((-0.607758 -0.15 -0.794109) (-0.598065 -0.15 -0.59814) (-0.401316 -0.15 -0.58872) (-0.397416 -0.15 -0.773014)) target face 31158 points 4((0.800022 0.15 0.390017) (0.800034 0.15 0.400026) (0.810078 0.15 0.400056) (0.810052 0.15 0.390038))
--> FOAM Warning :
    From virtual bool Foam::faceAreaWeightAMI::overlaps(Foam::label, Foam::label, Foam::scalar) const
    in file AMIInterpolation/AMIInterpolation/faceAreaWeightAMI/faceAreaWeightAMI.C at line 493
    Invalid normal for source face 14 points 4((-0.607758 -0.15 -0.794109) (-0.598065 -0.15 -0.59814) (-0.401316 -0.15 -0.58872) (-0.397416 -0.15 -0.773014)) target face 1 points 4((0.810078 0.15 0.400056) (0.810113 0.15 0.410082) (0.820232 0.15 0.41016) (0.820164 0.15 0.400115))
--> FOAM Warning :
    From virtual bool Foam::faceAreaWeightAMI::overlaps(Foam::label, Foam::label, Foam::scalar) const
    in file AMIInterpolation/AMIInterpolation/faceAreaWeightAMI/faceAreaWeightAMI.C at line 493
    Invalid normal for source face 14 points 4((-0.607758 -0.15 -0.794109) (-0.598065 -0.15 -0.59814) (-0.401316 -0.15 -0.58872) (-0.397416 -0.15 -0.773014)) target face 2 points 4((0.800052 0.15 0.410039) (0.800077 0.15 0.420057) (0.810163 0.15 0.420116) (0.810113 0.15 0.410082))
--> FOAM Warning :
    From virtual bool Foam::faceAreaWeightAMI::overlaps(Foam::label, Foam::label, Foam::scalar) const
    in file AMIInterpolation/AMIInterpolation/faceAreaWeightAMI/faceAreaWeightAMI.C at line 493
    Invalid normal for source face 14 points 4((-0.607758 -0.15 -0.794109) (-0.598065 -0.15 -0.59814) (-0.401316 -0.15 -0.58872) (-0.397416 -0.15 -0.773014)) target face 31051 points 4((0.790014 0.15 0.400011) (0.790022 0.15 0.410017) (0.800052 0.15 0.410039) (0.800034 0.15 0.400026))
--> FOAM Warning :
    From virtual bool Foam::faceAreaWeightAMI::overlaps(Foam::label, Foam::label, Foam::scalar) const
    in file AMIInterpolation/AMIInterpolation/faceAreaWeightAMI/faceAreaWeightAMI.C at line 493
    Invalid normal for source face 14 points 4((-0.607758 -0.15 -0.794109) (-0.598065 -0.15 -0.59814) (-0.401316 -0.15 -0.58872) (-0.397416 -0.15 -0.773014)) target face 0 points 4((0.800034 0.15 0.400026) (0.800052 0.15 0.410039) (0.810113 0.15 0.410082) (0.810078 0.15 0.400056))
--> FOAM Warning :
    From virtual bool Foam::faceAreaWeightAMI::overlaps(Foam::label, Foam::label, Foam::scalar) const
    in file AMIInterpolation/AMIInterpolation/faceAreaWeightAMI/faceAreaWeightAMI.C at line 493
    Invalid normal for source face 1 points 3((-0.493139 -0.15 -0.869936) (-0.397416 -0.15 -0.773014) (-0.38022 -0.15 -0.924895)) target face 31158 points 4((0.800022 0.15 0.390017) (0.800034 0.15 0.400026) (0.810078 0.15 0.400056) (0.810052 0.15 0.390038))
--> FOAM Warning :
    From virtual bool Foam::faceAreaWeightAMI::overlaps(Foam::label, Foam::label, Foam::scalar) const
    in file AMIInterpolation/AMIInterpolation/faceAreaWeightAMI/faceAreaWeightAMI.C at line 493
    Invalid normal for source face 1 points 3((-0.493139 -0.15 -0.869936) (-0.397416 -0.15 -0.773014) (-0.38022 -0.15 -0.924895)) target face 1 points 4((0.810078 0.15 0.400056) (0.810113 0.15 0.410082) (0.820232 0.15 0.41016) (0.820164 0.15 0.400115))
--> FOAM Warning :
    From virtual bool Foam::faceAreaWeightAMI::overlaps(Foam::label, Foam::label, Foam::scalar) const
    in file AMIInterpolation/AMIInterpolation/faceAreaWeightAMI/faceAreaWeightAMI.C at line 493
    Invalid normal for source face 1 points 3((-0.493139 -0.15 -0.869936) (-0.397416 -0.15 -0.773014) (-0.38022 -0.15 -0.924895)) target face 2 points 4((0.800052 0.15 0.410039) (0.800077 0.15 0.420057) (0.810163 0.15 0.420116) (0.810113 0.15 0.410082))
--> FOAM Warning :
    From virtual bool Foam::faceAreaWeightAMI::overlaps(Foam::label, Foam::label, Foam::scalar) const
    in file AMIInterpolation/AMIInterpolation/faceAreaWeightAMI/faceAreaWeightAMI.C at line 493
    Invalid normal for source face 1 points 3((-0.493139 -0.15 -0.869936) (-0.397416 -0.15 -0.773014) (-0.38022 -0.15 -0.924895)) target face 31051 points 4((0.790014 0.15 0.400011) (0.790022 0.15 0.410017) (0.800052 0.15 0.410039) (0.800034 0.15 0.400026))
--> FOAM Warning :
    From virtual bool Foam::faceAreaWeightAMI::overlaps(Foam::label, Foam::label, Foam::scalar) const
    in file AMIInterpolation/AMIInterpolation/faceAreaWeightAMI/faceAreaWeightAMI.C at line 493
    Invalid normal for source face 1 points 3((-0.493139 -0.15 -0.869936) (-0.397416 -0.15 -0.773014) (-0.38022 -0.15 -0.924895)) target face 0 points 4((0.800034 0.15 0.400026) (0.800052 0.15 0.410039) (0.810113 0.15 0.410082) (0.810078 0.15 0.400056))
AMI: Patch source sum(weights) min:0.99999753 max:1.01689 average:1.0039146
AMI: Patch target sum(weights) min:0.99869123 max:1.0003692 average:0.99999442

Did you get your case working? If so could you please let me know how you did it?

It will be very helpful if someone could shed some light on this issue I am facing. It seems the face normals are wrong, but I can't figure out how to resolve it.

Regards,
MRK

gabrielfelix March 16, 2022 15:49

Quote:

Originally Posted by mrk17 (Post 817740)
Hi Gabriel,

I am facing the same problem. I am trying to setup a case for rhoPimpleFoam to analyse the flow around a propeller.

Like you, I used the snappyHexMesh without success. It just wont work. Then I turned to cfMesh which gave a good mesh. But I am facing issues with the AMI interface.

Per my understanding, when using SHM it will create a faceZone for the innerCylinder patch and a cellZone for the region it encloses (in our case the rotating region). But it will not separate the mesh into two regions (which is what AMI needs). Using the faceZone / the slave patches created by SHM we can use createBaffles / createPatch to separate the mesh into two regions and define AMIs.

In cfMesh, since there are two meshes (rotating and stationary), merging them together creates the two regions AMI needs. All that's left to do is to define AMI with createPatch or edit the boundary file like wyldckat suggested in this post. And I was able to create AMI patches without any issues. But the problem comes when I run the case. I get the following warning every time the solver tries to create weights for the AMI. I just couldn't figure this out.

Code:

AMI: Creating addressing and weights between 376 source faces and 87808 target faces
--> FOAM Warning :
    From virtual void Foam::faceAreaWeightAMI::calcInterArea(Foam::label, Foam::label, Foam::scalar&, Foam::vector&) const
    in file AMIInterpolation/AMIInterpolation/faceAreaWeightAMI/faceAreaWeightAMI.C at line 414
    Invalid normal for source face 0 points 3((-0.493139 -0.15 -0.869936) (-0.607758 -0.15 -0.794109) (-0.397416 -0.15 -0.773014)) target face 31158 points 4((0.800022 0.15 0.390017) (0.800034 0.15 0.400026) (0.810078 0.15 0.400056) (0.810052 0.15 0.390038))
--> FOAM Warning :
    From virtual void Foam::faceAreaWeightAMI::calcInterArea(Foam::label, Foam::label, Foam::scalar&, Foam::vector&) const
    in file AMIInterpolation/AMIInterpolation/faceAreaWeightAMI/faceAreaWeightAMI.C at line 414
    Invalid normal for source face 0 points 3((-0.493139 -0.15 -0.869936) (-0.607758 -0.15 -0.794109) (-0.397416 -0.15 -0.773014)) target face 1 points 4((0.810078 0.15 0.400056) (0.810113 0.15 0.410082) (0.820232 0.15 0.41016) (0.820164 0.15 0.400115))
--> FOAM Warning :
    From virtual void Foam::faceAreaWeightAMI::calcInterArea(Foam::label, Foam::label, Foam::scalar&, Foam::vector&) const
    in file AMIInterpolation/AMIInterpolation/faceAreaWeightAMI/faceAreaWeightAMI.C at line 414
    Invalid normal for source face 0 points 3((-0.493139 -0.15 -0.869936) (-0.607758 -0.15 -0.794109) (-0.397416 -0.15 -0.773014)) target face 2 points 4((0.800052 0.15 0.410039) (0.800077 0.15 0.420057) (0.810163 0.15 0.420116) (0.810113 0.15 0.410082))
--> FOAM Warning :
    From virtual void Foam::faceAreaWeightAMI::calcInterArea(Foam::label, Foam::label, Foam::scalar&, Foam::vector&) const
    in file AMIInterpolation/AMIInterpolation/faceAreaWeightAMI/faceAreaWeightAMI.C at line 414
    Invalid normal for source face 0 points 3((-0.493139 -0.15 -0.869936) (-0.607758 -0.15 -0.794109) (-0.397416 -0.15 -0.773014)) target face 31051 points 4((0.790014 0.15 0.400011) (0.790022 0.15 0.410017) (0.800052 0.15 0.410039) (0.800034 0.15 0.400026))
--> FOAM Warning :
    From virtual void Foam::faceAreaWeightAMI::calcInterArea(Foam::label, Foam::label, Foam::scalar&, Foam::vector&) const
    in file AMIInterpolation/AMIInterpolation/faceAreaWeightAMI/faceAreaWeightAMI.C at line 414
    Invalid normal for source face 0 points 3((-0.493139 -0.15 -0.869936) (-0.607758 -0.15 -0.794109) (-0.397416 -0.15 -0.773014)) target face 0 points 4((0.800034 0.15 0.400026) (0.800052 0.15 0.410039) (0.810113 0.15 0.410082) (0.810078 0.15 0.400056))
--> FOAM Warning :
    From virtual bool Foam::faceAreaWeightAMI::overlaps(Foam::label, Foam::label, Foam::scalar) const
    in file AMIInterpolation/AMIInterpolation/faceAreaWeightAMI/faceAreaWeightAMI.C at line 493
    Invalid normal for source face 14 points 4((-0.607758 -0.15 -0.794109) (-0.598065 -0.15 -0.59814) (-0.401316 -0.15 -0.58872) (-0.397416 -0.15 -0.773014)) target face 31158 points 4((0.800022 0.15 0.390017) (0.800034 0.15 0.400026) (0.810078 0.15 0.400056) (0.810052 0.15 0.390038))
--> FOAM Warning :
    From virtual bool Foam::faceAreaWeightAMI::overlaps(Foam::label, Foam::label, Foam::scalar) const
    in file AMIInterpolation/AMIInterpolation/faceAreaWeightAMI/faceAreaWeightAMI.C at line 493
    Invalid normal for source face 14 points 4((-0.607758 -0.15 -0.794109) (-0.598065 -0.15 -0.59814) (-0.401316 -0.15 -0.58872) (-0.397416 -0.15 -0.773014)) target face 1 points 4((0.810078 0.15 0.400056) (0.810113 0.15 0.410082) (0.820232 0.15 0.41016) (0.820164 0.15 0.400115))
--> FOAM Warning :
    From virtual bool Foam::faceAreaWeightAMI::overlaps(Foam::label, Foam::label, Foam::scalar) const
    in file AMIInterpolation/AMIInterpolation/faceAreaWeightAMI/faceAreaWeightAMI.C at line 493
    Invalid normal for source face 14 points 4((-0.607758 -0.15 -0.794109) (-0.598065 -0.15 -0.59814) (-0.401316 -0.15 -0.58872) (-0.397416 -0.15 -0.773014)) target face 2 points 4((0.800052 0.15 0.410039) (0.800077 0.15 0.420057) (0.810163 0.15 0.420116) (0.810113 0.15 0.410082))
--> FOAM Warning :
    From virtual bool Foam::faceAreaWeightAMI::overlaps(Foam::label, Foam::label, Foam::scalar) const
    in file AMIInterpolation/AMIInterpolation/faceAreaWeightAMI/faceAreaWeightAMI.C at line 493
    Invalid normal for source face 14 points 4((-0.607758 -0.15 -0.794109) (-0.598065 -0.15 -0.59814) (-0.401316 -0.15 -0.58872) (-0.397416 -0.15 -0.773014)) target face 31051 points 4((0.790014 0.15 0.400011) (0.790022 0.15 0.410017) (0.800052 0.15 0.410039) (0.800034 0.15 0.400026))
--> FOAM Warning :
    From virtual bool Foam::faceAreaWeightAMI::overlaps(Foam::label, Foam::label, Foam::scalar) const
    in file AMIInterpolation/AMIInterpolation/faceAreaWeightAMI/faceAreaWeightAMI.C at line 493
    Invalid normal for source face 14 points 4((-0.607758 -0.15 -0.794109) (-0.598065 -0.15 -0.59814) (-0.401316 -0.15 -0.58872) (-0.397416 -0.15 -0.773014)) target face 0 points 4((0.800034 0.15 0.400026) (0.800052 0.15 0.410039) (0.810113 0.15 0.410082) (0.810078 0.15 0.400056))
--> FOAM Warning :
    From virtual bool Foam::faceAreaWeightAMI::overlaps(Foam::label, Foam::label, Foam::scalar) const
    in file AMIInterpolation/AMIInterpolation/faceAreaWeightAMI/faceAreaWeightAMI.C at line 493
    Invalid normal for source face 1 points 3((-0.493139 -0.15 -0.869936) (-0.397416 -0.15 -0.773014) (-0.38022 -0.15 -0.924895)) target face 31158 points 4((0.800022 0.15 0.390017) (0.800034 0.15 0.400026) (0.810078 0.15 0.400056) (0.810052 0.15 0.390038))
--> FOAM Warning :
    From virtual bool Foam::faceAreaWeightAMI::overlaps(Foam::label, Foam::label, Foam::scalar) const
    in file AMIInterpolation/AMIInterpolation/faceAreaWeightAMI/faceAreaWeightAMI.C at line 493
    Invalid normal for source face 1 points 3((-0.493139 -0.15 -0.869936) (-0.397416 -0.15 -0.773014) (-0.38022 -0.15 -0.924895)) target face 1 points 4((0.810078 0.15 0.400056) (0.810113 0.15 0.410082) (0.820232 0.15 0.41016) (0.820164 0.15 0.400115))
--> FOAM Warning :
    From virtual bool Foam::faceAreaWeightAMI::overlaps(Foam::label, Foam::label, Foam::scalar) const
    in file AMIInterpolation/AMIInterpolation/faceAreaWeightAMI/faceAreaWeightAMI.C at line 493
    Invalid normal for source face 1 points 3((-0.493139 -0.15 -0.869936) (-0.397416 -0.15 -0.773014) (-0.38022 -0.15 -0.924895)) target face 2 points 4((0.800052 0.15 0.410039) (0.800077 0.15 0.420057) (0.810163 0.15 0.420116) (0.810113 0.15 0.410082))
--> FOAM Warning :
    From virtual bool Foam::faceAreaWeightAMI::overlaps(Foam::label, Foam::label, Foam::scalar) const
    in file AMIInterpolation/AMIInterpolation/faceAreaWeightAMI/faceAreaWeightAMI.C at line 493
    Invalid normal for source face 1 points 3((-0.493139 -0.15 -0.869936) (-0.397416 -0.15 -0.773014) (-0.38022 -0.15 -0.924895)) target face 31051 points 4((0.790014 0.15 0.400011) (0.790022 0.15 0.410017) (0.800052 0.15 0.410039) (0.800034 0.15 0.400026))
--> FOAM Warning :
    From virtual bool Foam::faceAreaWeightAMI::overlaps(Foam::label, Foam::label, Foam::scalar) const
    in file AMIInterpolation/AMIInterpolation/faceAreaWeightAMI/faceAreaWeightAMI.C at line 493
    Invalid normal for source face 1 points 3((-0.493139 -0.15 -0.869936) (-0.397416 -0.15 -0.773014) (-0.38022 -0.15 -0.924895)) target face 0 points 4((0.800034 0.15 0.400026) (0.800052 0.15 0.410039) (0.810113 0.15 0.410082) (0.810078 0.15 0.400056))
AMI: Patch source sum(weights) min:0.99999753 max:1.01689 average:1.0039146
AMI: Patch target sum(weights) min:0.99869123 max:1.0003692 average:0.99999442

Did you get your case working? If so could you please let me know how you did it?

It will be very helpful if someone could shed some light on this issue I am facing. It seems the face normals are wrong, but I can't figure out how to resolve it.

Regards,
MRK

Can you send me your case files so I can see how you did it?

gorg88 June 13, 2022 02:48

Anyone resolve this problem?

quarkz September 4, 2022 23:12

Hi gabrielfelix,

Did you manage to fix your problem? I hope to learn from you. Also, your files can't be downloaded.

Quote:

Originally Posted by gabrielfelix (Post 814852)
Hi folks,

I've been running propeller simulations over the last months, and I had been using snappyHexMesh for meshing the propeller geometry and simulation domain before jumping into cfMesh. My simulation structure is completely based on the pimpleFoam propeller tutorial, except that I modified it to run my geometry in compressible steady-state (rhoSimpleFoam) and using MRF technique.

SHM meshes were never as refined as they should be, specially at the leading-edge and near the blade tips. As reported in this thread:
[snappyHexMesh] Rough leading-edge and trailing-edge after snapping, I spent around 2 months trying to improve the mesh, which I actually did, however not sufficiently as I wanted. SHM fails to refine the surface after a certain surface refinement level and also fails to add boundary layers properly to the surface.

After researching for alternatives I came across cfMesh through this video: How to create your first mesh with cfMesh - tutorial by József Nagy that helped me a lot with the introduction to the mesher. It is a much simpler, more intuitive, increadibly fast, and requires fewer configurations compared to SHM. It really surprised me.

I have started meshing with it and the very first mesh I came out with was better than any mesh I had done before with SHM. Not only the surface refinement was excelent, but it succesfully added layers on the whole propeller/airfoil surface. It also executed the mesh in less than a minute, when compared to 10-30 minutes of SHM. I found cfMesh really great, but I'm having difficulties to integrate the mesh to my simulation structure and to dealing with some AMI patches, which I'm going to further detail next.

My domain is composed by:
- propellerTip: are the prop blades
- propellerSpinner: the prop spinner
- innerCylinderSmall: the "moving" domain
- outerCylinder: an outer cylinder that contains the other patches as well as the farfield upstream and downstream of the propeller

https://i.imgur.com/Dk7HAJK.png

snappyHexMesh
The meshing process that I was using was: create a blockMesh wrapping the whole domain; extract stl file surface with surfaceFeatureExtract, mesh with snappyHexMesh;configure the boundary, inlet and outlet face sets; and finally create AMI, inlet and outlet patches.

Code:

blockMesh
surfaceFeatureExtract
snappyHexMesh
topoSet -dict system/createInletOutletSets.topoSetDict
createPatch -overwrite

blockMeshDict:
Code:

scale  1;
convertToMeters  1;

vertices
(
    (-0.65 -0.65 -0.65)
    ( 0.65 -0.65 -0.65)
    ( 0.65  0.65 -0.65)
    (-0.65  0.65 -0.65)
    (-0.65 -0.65  0.65)
    ( 0.65 -0.65  0.65)
    ( 0.65  0.65  0.65)
    (-0.65  0.65  0.65)
);


blocks
(
    hex (0 1 2 3 4 5 6 7) (12 20 12) simpleGrading (1 1 1)
);

edges
(
);

boundary
(
    walls
    {
        type wall;
        faces
        (
            (2 6 5 1)
            (0 3 2 1)
            (0 4 7 3)
            (4 5 6 7)
        );
    }
    inlet
    {
        type patch;
        faces
        (
            (3 7 6 2)
        );
    }
    outlet
    {
        type patch;
        faces
        (
            (1 5 4 0)
        );
    }
);

// ************************************************************************* //

snappyHexMeshDict:
Code:

castellatedMesh true;
snap            true;
addLayers      true;

geometry
{
    innerCylinderSmall.stl
        {
                type triSurfaceMesh;
                name innerCylinderSmall;
        }
        outerCylinder.stl
        {
                type triSurfaceMesh;
                name outerCylinder;
        }
        propellerTip.stl
        {
                type triSurfaceMesh;
                name propellerTip;
        }
    propellerSpinner.stl
        {
                type triSurfaceMesh;
                name propellerSpinner;
        }
}


castellatedMeshControls
{

    maxLocalCells 1000000;

    maxGlobalCells 15000000;

    minRefinementCells 0;

    maxLoadUnbalance 0.10;

    nCellsBetweenLevels 2;



    features
    (
        {
            file        "innerCylinderSmall.eMesh";
            level      2;
        }
        {
            file        "outerCylinder.eMesh";
            level      0;
        }
        {
            file        "propellerTip.eMesh";
            level      9;
        }
        {
            file        "propellerSpinner.eMesh";
            level      6;
        }
    );



    refinementSurfaces
    {
        innerCylinderSmall
        {
            level      (2 2);

            faceType    boundary;
            cellZone    innerCylinderSmall;
            faceZone    innerCylinderSmall;
            cellZoneInside  inside;
        }
        outerCylinder
        {
            level      (0 0);
        }
        propellerTip
        {
            level      (1 9);
        }
        propellerSpinner
        {
            level      (1 6);
        }
    }

    resolveFeatureAngle 0.1;


    refinementRegions
    {
        innerCylinderSmall
        {
            mode        inside;
            levels      ((1E15 2));
        }
        outerCylinder
        {
            mode        inside;
            levels      ((1E15 1));
        }
    }

    locationInMesh (0.01 -0.125 0.01);

    allowFreeStandingZoneFaces false;
}


snapControls
{
    nSmoothPatch 3;

    tolerance 1.0; // 1.0;

    nSolveIter 100;

    nRelaxIter 5;

        nFeatureSnapIter 10;

        implicitFeatureSnap true;

        explicitFeatureSnap false;

        multiRegionFeatureSnap true;
}


addLayersControls
{
    relativeSizes true;

    layers
    {
                "propellerTip.*"
                        {
                                nSurfaceLayers 3;
                        }
    }

    expansionRatio 1.0;

    finalLayerThickness 0.3;

    minThickness 0.1;

    nGrow 0;

    featureAngle 30;

    nRelaxIter 3;

    nSmoothSurfaceNormals 1;

    nSmoothNormals 3;

    nSmoothThickness 10;

    maxFaceThicknessRatio 0.5;

    maxThicknessToMedialRatio 0.3;

    minMedialAxisAngle 90;

    nBufferCellsNoExtrude 0;

    nLayerIter 100;
}


meshQualityControls
{
    maxNonOrtho 65;

    maxBoundarySkewness 4;
    maxInternalSkewness 4;

    maxConcave 80;

    minVol 1e-13;

    minTetQuality -1e30; // 1e-30;

    minArea -1;

    minTwist 0.01;

    minDeterminant 0.001;

    minFaceWeight 0.05;

    minVolRatio 0.01;

    minTriangleTwist -1;


    nSmoothScale 4;

    errorReduction 0.75;

    relaxed
    {
        maxNonOrtho 75;
    }
}

mergeTolerance 1e-6;


// ************************************************************************* //

createInletOutletSets.topoSetDict:
Code:

/*--------------------------------*- C++ -*----------------------------------*\
FoamFile
{
    version    2.0;
    format      ascii;
    class      dictionary;
    object      topoSetDict;
}

// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

actions
(
    {
        name    boundaryFaces;
        type    faceSet;
        action  new;
        source  patchToFace;
        patch  outerCylinder;
    }
   
    {
        name    outletFaces;
        type    faceSet;
        action  new;
        source  faceToFace;
        set    boundaryFaces;
    }

    {
        name    inletFaces;
        type    faceSet;
        action  new;
        source  faceToFace;
        set    boundaryFaces;
    }

    {
        name    outletFaces;
        type    faceSet;
        action  subset;
        source  normalToFace;
        normal  (0 -1 0);
        cos    0.3;    // Tolerance (max cos of angle)
    }

    {
        name    inletFaces;
        type    faceSet;
        action  subset;
        source  normalToFace;
        normal  (0 1 0);
        cos    0.3;    // Tolerance (max cos of angle)
    }
);

// ************************************************************************* //

createPatchDict:
Code:

/*--------------------------------*- C++ -*----------------------------------*\
FoamFile
{
    version    2.0;
    format      ascii;
    class      dictionary;
    object      createPatchDict;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

// Do a synchronisation of coupled points after creation of any patches.
// Note: this does not work with points that are on multiple coupled patches
//      with transformations (i.e. cyclics).
pointSync false;

// Patches to create.
patches
(   
    {
        //- Master side patch
        name            AMI1;
        patchInfo
        {
            type            cyclicAMI;
            matchTolerance  0.0001;
            neighbourPatch  AMI2;
            transform      noOrdering;
        }
        constructFrom patches;
        patches (innerCylinderSmall);
    }

    {
        //- Slave side patch
        name            AMI2;
        patchInfo
        {
            type            cyclicAMI;
            matchTolerance  0.0001;
            neighbourPatch  AMI1;
            transform      noOrdering;
        }
        constructFrom patches;
        patches (innerCylinderSmall_slave);
    }


    {
        name inlet;
        patchInfo
        {
            type            patch;
        }
        constructFrom set;
        set inletFaces;
    }
    {
        name outlet;
        patchInfo
        {
            type            patch;
        }
        constructFrom set;
        set outletFaces;
    }
);

// ************************************************************************* //

cfMesh

Now, for cfMesh I tried to keep as much of the previous workflow as possible, however, as seen in this post: Problem using AMI post #184, due to cfMesh limitations I had to create two separate meshes: rotor containing innerCylinderSmall, propellerTip, and propellerSpinner; and stator containing outerCylinder. An then I merged them together with mergeMesh.

I created the mesh on both rotor and stator folders as
Code:

surfaceFeatureEdges rotor.stl rotor.fms
cartesianMesh

surfaceFeatureEdges stator.stl stator.fms
blockMesh
cartesianMesh

with meshDict.rotor:
Code:

FoamFile
{
    version    2.0;
    format      ascii;
    class      dictionary;
    location    "mesh";
    object      meshDict;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

surfaceFile "rotorSlave.fms";

minCellSize 0.005;

maxCellSize 0.01;

boundaryCellSize 0.05;

localRefinement
{
    "propellerTip"
    {
        //cellSize  0.000125;
        additionalRefinementLevels 6;
    }
}

boundaryLayers
{
    //nLayers 3;
   
    thicknessRatio 1.1;
   
    maxFirstLayerThickness 0.5;
   
    patchBoundaryLayers
    {
        "propellerTip"
        {
            nLayers 3;
           
            allowDiscontinuity 0;
        }
    }
}

meshDict.stator:
Code:

FoamFile
{
    version    2.0;
    format      ascii;
    class      dictionary;
    location    "mesh";
    object      meshDict;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

surfaceFile "outerCylinder.fms";

minCellSize 0.01;

maxCellSize 0.1;

boundaryCellSize 0.1;

Then I execute:
Code:

cd stator
mergeMeshes . ../rotor
topoSet -dict system/createInletOutletSets.topoSetDict
createPatch -overwrite

However, createPatch fails to create AMI2 patch because there is no innerCylinderSmall_slave patch. Thus the AMI2 is created empty with zero faces, as is shown in boundary file below. The patch innerCylinderSmall_slave patch is created as simrego described on this thread below:

it is created in this section of SHM
Code:

refinementSurfaces
    {
        innerCylinderSmall
        {
            level      (2 2);

            faceType    boundary;
            cellZone    innerCylinderSmall;
            faceZone    innerCylinderSmall;
            cellZoneInside  inside;
        }

however, it is not created under cfMesh environment.

I tried many and many things that I saw in multiple threads without any success. I need to create the innerCylinderSmall_slave patch, but I dont know how to copy or duplicate the patch innerCylinderSmall.

createPatch log:
Code:

/*---------------------------------------------------------------------------*\
| =========                |                                                |
| \\      /  F ield        | OpenFOAM: The Open Source CFD Toolbox          |
|  \\    /  O peration    | Version:  v2012                                |
|  \\  /    A nd          | Website:  www.openfoam.com                      |
|    \\/    M anipulation  |                                                |
\*---------------------------------------------------------------------------*/
Build  : _7bdb509494-20201222 OPENFOAM=2012
Arch  : "LSB;label=32;scalar=64"
Exec  : createPatch -overwrite
Date  : Oct 21 2021
Time  : 15:01:31
Host  : MSI
PID    : 640
I/O    : uncollated
Case  : /mnt/c/Users/Felix/Documents/Mestrado/OpenFOAM/runs/liuPropeller/3liuAs31mscD30implicit/mesh/stator
nProcs : 1
trapFpe: Floating point exception trapping enabled (FOAM_SIGFPE).
fileModificationChecking : Monitoring run-time modified files using timeStampMaster (fileModificationSkew 5, maxFileModificationPolls 20)
allowSystemOperations : Allowing user-supplied system call operations

// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
Create time

Create polyMesh for time = 0

Reading "system/createPatchDict"

Adding new patch AMI1 as patch 4 from
{
    type            cyclicAMI;
    matchTolerance  0.0001;
    neighbourPatch  AMI2;
    transform      noOrdering;
}

Adding new patch AMI2 as patch 5 from
{
    type            cyclicAMI;
    matchTolerance  0.0001;
    neighbourPatch  AMI1;
    transform      noOrdering;
}

Adding new patch inlet as patch 6 from
{
    type            patch;
}

Adding new patch outlet as patch 7 from
{
    type            patch;
}


Moving faces from patch innerCylinderSmall to patch 4
--> FOAM Warning :
    From Foam::labelHashSet Foam::polyBoundaryMesh::patchSet(const Foam::UList<Foam::wordRe>&, bool, bool) const
    in file meshes/polyMesh/polyBoundaryMesh/polyBoundaryMesh.C at line 896
    Cannot find any patch or group names matching innerCylinderSmall_slave
Read 5050 faces from faceSet inletFaces
Read 4964 faces from faceSet outletFaces

Doing topology modification to order faces.

Not synchronising points.

Removing patches with no faces in them.

Removing zero-sized patch innerCylinderSmall type wall at position 1
Removing patches.
Writing repatched mesh to 0

End

boundary file with AMI2 with zero faces:
Code:

/*--------------------------------*- C++ -*----------------------------------*\
| =========                |                                                |
| \\      /  F ield        | OpenFOAM: The Open Source CFD Toolbox          |
|  \\    /  O peration    | Version:  v2012                                |
|  \\  /    A nd          | Website:  www.openfoam.com                      |
|    \\/    M anipulation  |                                                |
\*---------------------------------------------------------------------------*/
FoamFile
{
    version    2.0;
    format      binary;
    class      polyBoundaryMesh;
    arch        "LSB;label=32;scalar=64";
    location    "constant/polyMesh";
    object      boundary;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

7
(
    outerCylinder
    {
        type            wall;
        inGroups        1(wall);
        nFaces          18590;
        startFace      16194675;
    }
    propellerSpinner
    {
        type            wall;
        inGroups        1(wall);
        nFaces          14725;
        startFace      16213265;
    }
    propellerTip
    {
        type            wall;
        inGroups        1(wall);
        nFaces          1030388;
        startFace      16227990;
    }
    AMI1
    {
        type            cyclicAMI;
        inGroups        1(cyclicAMI);
        nFaces          9448;
        startFace      17258378;
        matchTolerance  0.0001;
        transform      noOrdering;
        neighbourPatch  AMI2;
        AMIMethod      faceAreaWeightAMI;
        restartUncoveredSourceFace 1;
    }
    AMI2
    {
        type            cyclicAMI;
        inGroups        1(cyclicAMI);
        nFaces          0;
        startFace      17267826;
        matchTolerance  0.0001;
        transform      noOrdering;
        neighbourPatch  AMI1;
        AMIMethod      faceAreaWeightAMI;
        restartUncoveredSourceFace 1;
    }
    inlet
    {
        type            patch;
        nFaces          5050;
        startFace      17267826;
    }
    outlet
    {
        type            patch;
        nFaces          4964;
        startFace      17272876;
    }
)

// ************************************************************************* //

I saw that createBaffles could do the job, but I could not find any configuration that would help me. I tried to set up the dict below, but it didn't work.
Code:

FoamFile
{
    version    2.0;
    format      ascii;
    class      dictionary;
    object      createBafflesDict;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

internalFacesOnly true;

baffles
{
    baffleFaces
    {
        type                faceZone;
        zoneName        innerCylinderSmall;
            flip                false;
       
        patches
        {
            master
            {
                name            innerCylinderSmall;
                type            wall;
            }
            slave { ${..master} }
        }
    }
}

What do you folks think I should do? But trying to keep as much of the original workflow?

I'll make available both the snappyHexMesh and cfMesh case folder which I mentioned above:
https://drive.google.com/file/d/1uq8...ew?usp=sharing

Images from the differences of SHM and cfMesh meshes. Left SHM, right cfMesh


quarkz September 4, 2022 23:51

Btw,

I have read thru all the pages here. I need to rotate my elevator on a plane using AMI. I followed the propeller and annularThermalMixer tutorials. Steady state worked well.

However, rotating the elevator gave 0 weight error after a while of running. I went back to start from the propeller tutorial, slowly modifying step by step to debug for errors. The final objective is to get to my rotating elevator problem.

In my case, the elevator is orientated in a sideway pointing down orientation. The simulation works well even when I change my domain size and replace the propeller for the elevator to match my problem.

However, I found that once I rotate the orientation such that the axis is (0 1 1), the simulation becomes unstable. It seems that reducing the initial time step from 1e-5 to 1e-6 and decreasing the CFL from 1 to 0.5 helps. Simulation runs till 0.8s before it suddenly crashes. Still not sure why.

Any other suggestion? Has anyone tried the new NCC in OF v10? The simulation diverges in its own propeller implementation and I can't get it to work as there's segmentation error at the last step.

Thanks!

quarkz March 7, 2023 20:26

Some updates to my problem. It seems that generating a new grid can help mitigate some problems. Using lowWeightCorrection = 0.2 also helps.

quarkz March 7, 2023 20:32

Btw, for those AMI experts out there, supposed I have a propeller and I am trying to use AMI to simulate its rotation. I create an additional AMI cylinder over the propeller.

Supposed I have a wall body next to the propeller. If my AMI cylinder intersects the wall body, is it ok? In other words, are we allowed in OpenFOAM to let the AMI clyinder and wall body overlap one another? Will it give numerical error?

I just tried a similar simulation using moveDynamicMesh and I found that my grid is giving a lot of problem with stuffs like negative volume, incorrect face.

I wonder if it's due the cylinder wall body intersection...

amuzeshi May 11, 2023 05:56

Quote:

Originally Posted by kid (Post 360047)
Sir,
geometry should be 1:1


Source and target faces should SEE each other.
Increase the size of one of the source/target, so that target/source can see it in full.

Matheus Nunes May 23, 2023 11:41

Propeller cfMesh
 
The idea is to make two meshes AMI and domain.



The AMI mesh should contain AMI.stl and rotor.stl. You should join both surfaces then mesh with meshdict and remember to name AMI_inside(patch) and rotor(wall).


Now you mesh the domain. It should contain AMI.stl and any other static surfaces. Join those surfaces and generate the bounding box of the domain. Now mesh with meshdict and remember to include the AMI_outside(patch).


Now use mergeMesh to put the AMI inside the domain.


Use checkMesh to create the sets, remove the broken surfaces from the sets, and use setsToZones to create the region0 (domain) and region1 (AMI).


Use now createPatch to set the AMIs.


The biggest problem is that the created AMIs are decoupled. This breaks the weights and the simulation. It is similar to when you try to make one explicitly and the other implicitly in SHM. If I solve this problem I will update this answer properly.

gabrielfelix July 5, 2023 20:53

Hello guys, I finally found a solution to the problem and managed to mesh the propeller case with cfMesh succesfully. I posted the detailed solution in this thread.
[Guide] How to mesh a propeller domain using cfMesh - AMI patch
Case files are also available.

quarkz July 9, 2023 22:02

Hi gabrielfelix,

Thanks for the guide. It's going to be very useful.

quarkz August 22, 2023 11:22

Hi all,
I've been having error and divergence issues using AMI with faceAreaWeightAMI and faceAreaWeightAMI2D. There's also spikes in the forces. When I changed to nearestFaceAMI, my solution converges and the spikes are much lesser now.

So it may be worth trying for those having problems like me.

amuzeshi August 23, 2023 09:12

Quote:

Originally Posted by quarkz (Post 855703)
Hi all,
I've been having error and divergence issues using AMI with faceAreaWeightAMI and faceAreaWeightAMI2D. There's also spikes in the forces. When I changed to nearestFaceAMI, my solution converges and the spikes are much lesser now.

So it may be worth trying for those having problems like me.


I suggest that you also give a try to NCC (available from OpenFOAM 10+) which is the next generation of AMI.

quarkz September 2, 2023 23:41

Quote:

Originally Posted by amuzeshi (Post 855759)
I suggest that you also give a try to NCC (available from OpenFOAM 10+) which is the next generation of AMI.

Thanks amuzeshi! Yes, OF11 has ncc. However, I am stuck with the foundation ver since I need the multi motion with deformation.

F42 November 13, 2023 08:19

mass loss issue
 
Hello all,

I looked through the forum but could't find a solution to my AMI problem:
I am solving diffusion-like scalar transport equations and face significant mass loss. In a simplified sketch, the mesh looks like this:

https://i.postimg.cc/vTv2cQgD/Screen...-13-133216.jpg

With an inlet and an outlet (z-coordinate) and two periodic directions (x, y). I managed to run several geometries with the cyclicAMI bc.
I just figured that I loose 10-30% of mass until the end of the simulation. I believe this is caused by the slightly different sizes (~3%) and non-conformal meshes of the periodics because mass conservation works with zeroGradient bcs. The boundary file looks like this:

Code:

periodic_11
    {
        type                  cyclicAMI;
        inGroups            1 ( cyclicAMI );
        nFaces              6012;
        startFace            1380532;
        neighbourPatch    periodic_12;
        transform            translational;
        separationVector  ( 0 3e-05 0 );
        matchTolerance    1e-07;
        AMIMethod          faceAreaWeightAMI;
        requireMatch        1;
        restartUncoveredSourceFace 1;
        lowWeightCorrection 0.2;
    }

 periodic_12
    {
        type                  cyclicAMI;
        inGroups            1 ( cyclicAMI );
        nFaces              5299;
        startFace            1386544;
        neighbourPatch    periodic_11;
        transform            translational;
        separationVector  ( 0 -3e-05 0 );
        matchTolerance    1e-07;
        AMIMethod          faceAreaWeightAMI;
        requireMatch        1;
        restartUncoveredSourceFace 1;
        lowWeightCorrection 0.2;
    }

The mesh itself is quite complicated (multi region case with complex surfaces) and generated with a commercial software.
Has anyone solved this issue??

So far I played with the settings without success. I tried the cyclicPeriodicAMI but it throws a sigSegv error which I don't understand:

Code:

#0  Foam::error::printStack(Foam::Ostream&) at ??:?
#1  Foam::sigSegv::sigHandler(int) at ??:?
#2  ? in /lib/x86_64-linux-gnu/libpthread.so.0
#3  __dynamic_cast in /lib/x86_64-linux-gnu/libstdc++.so.6
#4  Foam::coupledPolyPatch const& Foam::refCast<Foam::coupledPolyPatch const, Foam::polyPatch const>(Foam::polyPatch const&) at ??:?
#5  Foam::cyclicPeriodicAMIPolyPatch::resetAMI() const at ??:?
#6  Foam::cyclicAMIPolyPatch::AMI() const at ??:?
#7  Foam::cyclicAMIPolyPatch::applyLowWeightCorrection() const at ??:?
#8  Foam::cyclicAMIFvPatchField<double>::patchNeighbourField() const at ??:?
#9  Foam::coupledFvPatchField<double>::evaluate(Foam::UPstream::commsTypes) at ??:?
...

I am using OF version v2206

Any help is appreciated! :)


All times are GMT -4. The time now is 12:03.