Adaptive Mesh Refinement With a Moving Meshusing sprayDyMFoam
Andreas Nygren
Chalmers University of TechnologyDivision of Combustion
8-9th of DecemberOpenFoam Course
Andreas Nygren OpenFoam Course - December 8-9 2015
Introduction
Motivation
• To properly resolve the physics, fine meshes are needed inregions of interest.
• It is computationally expensive to make the whole mesh veryfine.
• For automotive applications moving meshes are used to modelpiston movement.
Andreas Nygren OpenFoam Course - December 8-9 2015
Introduction
Learning Outcomes
Today you will learn how to:
• How to combine the dynamicRefineFvMesh class withthedynamicMotionSolverFvMesh class
• Modify sprayDyMFoam to calculate and output the gradientof the velocity field to be used as basis for the adaptive meshrefinement.
• How to set-up a case with mesh motion and on-line adaptivemesh refinement.
Andreas Nygren OpenFoam Course - December 8-9 2015
Introduction
Dynamic Mesh Libraries in OpenFOAM
dynamicFvMesh
• dynamicMotionSolverFvMesh• dynamicRefineFvMesh• solidBodyMotionFvMesh• dynamicInkJetFvMesh
topoChangerFvMesh
• linearValveFvMesh• linearValveLayersFvMesh• mixerFvMesh• movingConeTopoFvMesh• rawTopoChangerFvMesh
Andreas Nygren OpenFoam Course - December 8-9 2015
Introduction
Dynamic Mesh Libraries in OpenFOAM
dynamicFvMesh
• dynamicMotionSolverFvMesh• dynamicRefineFvMesh• solidBodyMotionFvMesh• dynamicInkJetFvMesh
topoChangerFvMesh
• linearValveFvMesh• linearValveLayersFvMesh• mixerFvMesh• movingConeTopoFvMesh• rawTopoChangerFvMesh
Focus on simple mesh motion with mesh refinement!
Andreas Nygren OpenFoam Course - December 8-9 2015
Mesh Refinement with Motion
First off!
• Combine dynamicRefineFvMesh anddynamicMotionSolverFvMesh
• Create a library for both mesh motion and refinement
Andreas Nygren OpenFoam Course - December 8-9 2015
Mesh Refinement with Motion
Copy and rename
Start by copying dynamicRefineFvMesh to your own folder
OF30x
mkdir -p $FOAM_RUN/../src/motionRefinementFvMesh/
cd $FOAM_RUN/../src/motionRefinementFvMesh/
cp -r $FOAM_SRC/dynamicFvMesh/dynamicRefineFvMesh .
mv dynamicRefineFvMesh dynamicMotionSolverRefineFvMesh
cd dynamicMotionSolverRefineFvMesh
mv dynamicRefineFvMesh.C dynamicMotionSolverRefineFvMesh.C
mv dynamicRefineFvMesh.H dynamicMotionSolverRefineFvMesh.H
Andreas Nygren OpenFoam Course - December 8-9 2015
Mesh Refinement with Motion
Renaming Inside Files
• Function calls and includes etc need to be renamed to thenew class name
• Use the sed command!
sed commandsed -i s/dynamicRefineFvMesh/dynamicMotionSolverRefineFvMesh/g dynamicMotionSolverRefineFvMesh.C
sed -i s/dynamicRefineFvMesh/dynamicMotionSolverRefineFvMesh/g dynamicMotionSolverRefineFvMesh.H
• A Convenient and safe way to change the name
Andreas Nygren OpenFoam Course - December 8-9 2015
Mesh Refinement with Motion
Edit dynamicMotionSolverRefineFvMesh.H
Class Declaration for motionSolvernamespace Foam
{
// Add Class Declaration for the Motion Solver Class
class motionSolver;
Declare a pointer to the motionSolver
class dynamicMotionSolverRefineFvMesh
:
public dynamicFvMesh
{
//Add declaration for pointer to Motion Solver
autoPtr motionPtr_;
protected:
Andreas Nygren OpenFoam Course - December 8-9 2015
Mesh Refinement with Motion
Edit dynamicMotionSolverRefineFvMesh.C
Includes for the Motion Solver#include "dynamicMotionSolverRefineFvMesh.H"
#include "addToRunTimeSelectionTable.H"
#include "surfaceInterpolate.H"
#include "volFields.H"
#include "polyTopoChange.H"
#include "surfaceFields.H"
#include "syncTools.H"
#include "pointFields.H"
#include "sigFpe.H"
#include "cellSet.H"
// Add the Following Includes to the Header:
#include "motionSolver.H"
#include "mapPolyMesh.H"
#include "pointField.H"
Andreas Nygren OpenFoam Course - December 8-9 2015
Mesh Refinement with Motion
Edit dynamicMotionSolverRefineFvMesh.C
Pointer to the motionSolver object in the ConstructordynamicFvMesh(io),
//define a pointer to the motionSolver Object in the Constructor:
motionPtr_(motionSolver::New(*this)),
meshCutter_(*this),
dumpLevel_(false),
nRefinementIterations_(0),
protectedCell_(nCells(), 0)
function call to move pointsbool Foam::dynamicMotionSolverRefineFvMesh::update()
{
// Add a function call to the motionSolver
// to move points before refinement.
dynamicFvMesh::movePoints(motionPtr_->newPoints());
Andreas Nygren OpenFoam Course - December 8-9 2015
Mesh Refinement with Motion
Create a Make folder
Copy the Make folder from dynamicFvMesh
cd ..
cp -r $FOAM_SRC/dynamicFvMesh/Make .
Edit Make/files
dynamicMotionSolverRefineFvMesh/dynamicMotionSolverRefineFvMesh.C
LIB = $(FOAM_USER_LIBBIN)/libmotionRefinementFvMesh
Andreas Nygren OpenFoam Course - December 8-9 2015
Mesh Refinement with Motion
Make/options link with dynamicFvMesh
EXE_INC = \
-I$(LIB_SRC)/triSurface/lnInclude \
-I$(LIB_SRC)/meshTools/lnInclude \
-I$(LIB_SRC)/dynamicMesh/lnInclude \
-I$(LIB_SRC)/dynamicFvMesh/lnInclude \
-I$(LIB_SRC)/finiteVolume/lnInclude
LIB_LIBS = \
-ltriSurface \
-lmeshTools \
-ldynamicMesh \
-ldynamicFvMesh \
-lfiniteVolume
Andreas Nygren OpenFoam Course - December 8-9 2015
Mesh Refinement with Motion
Clean and Compile!
Makewclean
wmake
Andreas Nygren OpenFoam Course - December 8-9 2015
Mesh Refinement Based on a Gradient
• It is known that the mesh should be refined where thegradient of a field is high.
• We can base our mesh refinement on the gradient of a fieldrather than the field itself.
• We just need to calculate the gradient of the field every timestep
• An easy way of doing this is to just modify the solver
Andreas Nygren OpenFoam Course - December 8-9 2015
Mesh Refinement Based on a Gradient
Copying The Files
Copy and rename sprayDyMFoammkdir -p $FOAM_RUN/../applications/solvers/mySprayDyMFoam
cd $FOAM_RUN/../applications/solvers/mySprayDyMFoam
cp $FOAM_SOLVERS/lagrangian/sprayFoam/createClouds.H .
cp $FOAM_SOLVERS/lagrangian/sprayFoam/createFields.H .
cp $FOAM_SOLVERS/lagrangian/sprayFoam/rhoEqn.H .
cp $FOAM_SOLVERS/lagrangian/sprayFoam/UEqn.H .
cp $FOAM_SOLVERS/lagrangian/sprayFoam/sprayDyMFoam/pEqn.H .
cp $FOAM_SOLVERS/lagrangian/sprayFoam/sprayDyMFoam/sprayDyMFoam.C .
cp -r $FOAM_SOLVERS/lagrangian/sprayFoam/sprayDyMFoam/Make .
mv sprayDyMFoam.C mySprayDyMFoam.C
Andreas Nygren OpenFoam Course - December 8-9 2015
Mesh Refinement Based on a Gradient
Initialize The Gradient Field
Add to createFields.H
// Initialize After U!
volScalarField UGrad
(
IOobject
(
"UGrad",
runTime.timeName(),
mesh,
IOobject::READ_IF_PRESENT,
IOobject::AUTO_WRITE
),
mag(fvc::grad(U))
);
Andreas Nygren OpenFoam Course - December 8-9 2015
Mesh Refinement Based on a Gradient
Modify the Solver
Add gradient calculation
// Store momentum to set rhoUf for introduced faces.
volVectorField rhoU("rhoU", rho*U);
// Add the calculation of the velocity
// gradient before the mesh changes
UGrad = mag(fvc::grad(U));
// Do any mesh changes
mesh.update();
Andreas Nygren OpenFoam Course - December 8-9 2015
Mesh Refinement Based on a Gradient
Create Make/files, Make/options and compile
Make/files - Change Name
mySprayDyMFoam.C
EXE = $(FOAM_USER_APPBIN)/mySprayDyMFoam
Make/options - Change the Path to Two Folders
-I$(FOAM_SOLVERS)/lagrangian/reactingParcelFoam \
-I$(FOAM_SOLVERS)/compressible/rhoPimpleFoam/rhoPimpleDyMFoam \
Clean and Compile!
wclean
wmake
Andreas Nygren OpenFoam Course - December 8-9 2015
Case Set-Up
Aachen-Bomb case
• Static Spray combustionchamber
• sprayFoam tutorial case• We can modify it to run
with dynamicMotionSolver-RefineFvMesh
Andreas Nygren OpenFoam Course - December 8-9 2015
Case Set-Up
• Download the aachenBombMotionRefine case.• It has been modified so that the spray chamber will shrink
during run-time.
• It serve to illustrate the simultaneous mesh motion andrefinement.
• This is not a ”real spray simulation”. The mesh is to coarse.• We will now go through the modifications and then run the
case.
Andreas Nygren OpenFoam Course - December 8-9 2015
Case Set-Up
Add patches for movingWall
patches
(
wall walls
(
(2 6 5 1)
(0 4 7 3)
(0 1 5 4)
(7 6 2 3)
)
wall fixedWall
(
(4 5 6 7)
)
wall movingWall
(
(0 1 2 3)
)
);
Andreas Nygren OpenFoam Course - December 8-9 2015
Case Set-Up
Modify inital files to correspond to new patches
boundaryField
{
walls
{
type zeroGradient;
}
fixedWall
{
type zeroGradient;
}
movingWall
{
type zeroGradient;
}
}
Andreas Nygren OpenFoam Course - December 8-9 2015
Case Set-Up
Moving Wall velocity for U
movingWall
{
type movingWallVelocity;
value uniform (0 0 0);
}
Andreas Nygren OpenFoam Course - December 8-9 2015
Case Set-Up
pointMotion
dimensions [ 0 1 -1 0 0 0 0 ];
internalField uniform 0;
boundaryField
{
movingWall
{
type uniformFixedValue;
uniformValue 1;
value uniform 1;
}
walls
{
type slip;
}
fixedWall
{
type uniformFixedValue;
uniformValue 0;
value uniform 0;
}
}
• Special Inital File• Prescribe velocity for mesh
points at movingWall
Andreas Nygren OpenFoam Course - December 8-9 2015
Case Set-Up
dynamicMeshDict - Motion Coeffs
dynamicFvMesh dynamicMotionSolverRefineFvMesh;
motionSolverLibs ( "libfvMotionSolvers.so" );
solver
velocityComponentLaplacian;
velocityComponentLaplacianCoeffs
{
component
y;
diffusivity
inverseDistance (movingWall);
}
Andreas Nygren OpenFoam Course - December 8-9 2015
Case Set-Up
dynamicMeshDict - Refinement CoeffsdynamicMotionSolverRefineFvMeshCoeffs
//dynamicRefineFvMeshCoeffs
{
// How often to refine
refineInterval 1;
// Field to be refinement on
field
UGrad;
// Refine field inbetween lower..upper
lowerRefineLevel 10000;
upperRefineLevel 70000;
// If value < unrefineLevel unrefine
unrefineLevel
1;
// Have slower than 2:1 refinement
nBufferLayers
1;
// Refine cells only up to maxRefinement levels
maxRefinement
2;
// Stop refinement if maxCells reached
maxCells
160000;
// Flux field and corresponding velocity field. Fluxes on changed
// faces get recalculated by interpolating the velocity. Use none
// on surfaceScalarFields that do not need to be reinterpolated.
correctFluxes
(
(phi_0 U_0)
(phi U)
Andreas Nygren OpenFoam Course - December 8-9 2015
Results
Figure: Inital Temperature Field andMesh
Figure: Temperature Field and Meshafter 0.006 seconds
Andreas Nygren OpenFoam Course - December 8-9 2015
IntroductionMesh Refinement with MotionMesh Refinement Based on a GradientCase Set-UpResults
Top Related