ENH: codedMotionSolver: motion solver with user-supplied coding

This commit is contained in:
mattijs 2018-05-21 08:59:01 +01:00
parent 5474d161f2
commit 977a9894b4
12 changed files with 942 additions and 0 deletions

View File

@ -0,0 +1,115 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) YEAR AUTHOR,AFFILIATION
\\/ M anipulation |
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
OpenFOAM is free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
\*---------------------------------------------------------------------------*/
#include "codedPoints0MotionSolverTemplate.H"
#include "fvCFD.H"
#include "unitConversion.H"
#include "addToRunTimeSelectionTable.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
defineTypeNameAndDebug(${typeName}Points0MotionSolver, 0);
addRemovableToRunTimeSelectionTable
(
motionSolver,
${typeName}Points0MotionSolver,
dictionary
);
// * * * * * * * * * * * * * * * Global Functions * * * * * * * * * * * * * //
extern "C"
{
// dynamicCode:
// SHA1 = ${SHA1sum}
//
// unique function name that can be checked if the correct library version
// has been loaded
void ${typeName}_${SHA1sum}(bool load)
{
if (load)
{
// code that can be explicitly executed after loading
}
else
{
// code that can be explicitly executed before unloading
}
}
}
// * * * * * * * * * * * * * * * Local Functions * * * * * * * * * * * * * * //
//{{{ begin localCode
${localCode}
//}}} end localCode
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
${typeName}Points0MotionSolver::${typeName}Points0MotionSolver
(
const polyMesh& mesh,
const IOdictionary& dict
)
:
points0MotionSolver(mesh, dict, "${typeName}")
{}
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
${typeName}Points0MotionSolver::~${typeName}Points0MotionSolver()
{}
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
tmp<pointField> ${typeName}Points0MotionSolver::curPoints() const
{
if (${verbose:-false})
{
Info<<"curPoints ${typeName} sha1: ${SHA1sum}\n";
}
//{{{ begin code
${code}
//}}} end code
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
// ************************************************************************* //

View File

@ -0,0 +1,103 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) YEAR AUTHOR,AFFILIATION
\\/ M anipulation |
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
OpenFOAM is free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
Description
Template for use with dynamic code generation of a
points0MotionSolver.
SourceFiles
codedPoints0MotionSolverTemplate.C
\*---------------------------------------------------------------------------*/
#ifndef codedPoints0MotionSolverTemplate_H
#define codedPoints0MotionSolverTemplate_H
#include "points0MotionSolver.H"
//{{{ begin codeInclude
${codeInclude}
//}}} end codeInclude
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
/*---------------------------------------------------------------------------*\
A templated codedPoints0MotionSolver
\*---------------------------------------------------------------------------*/
class ${typeName}Points0MotionSolver
:
public points0MotionSolver
{
// Private Member Functions
//- Disallow default bitwise copy construct
${typeName}Points0MotionSolver(const ${typeName}Points0MotionSolver&);
//- Disallow default bitwise assignment
void operator=(const ${typeName}Points0MotionSolver&);
public:
//- Runtime type information
TypeName("${typeName}");
// Constructors
//- Construct from mesh and dictionary
${typeName}Points0MotionSolver
(
const polyMesh& mesh,
const IOdictionary&
);
//- Destructor
virtual ~${typeName}Points0MotionSolver();
// Member Functions
//- Provide current points for motion. Uses current motion field
virtual tmp<pointField> curPoints() const;
//- Solve for motion
virtual void solve()
{};
};
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif
// ************************************************************************* //

View File

@ -112,6 +112,7 @@ motionSolvers/velocity/velocityDisplacement/velocityDisplacementMotionSolver.C
motionSolvers/componentVelocity/componentVelocityMotionSolver.C
motionSolvers/displacement/solidBody/solidBodyMotionSolver.C
motionSolvers/displacement/solidBody/multiSolidBodyMotionSolver.C
motionSolvers/displacement/codedPoints0/codedPoints0MotionSolver.C
solidBodyMotionFunctions = motionSolvers/displacement/solidBody/solidBodyMotionFunctions
$(solidBodyMotionFunctions)/solidBodyMotionFunction/solidBodyMotionFunction.C

View File

@ -0,0 +1,199 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2017 OpenCFD Ltd.
\\/ M anipulation |
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
OpenFOAM is free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
\*---------------------------------------------------------------------------*/
#include "codedPoints0MotionSolver.H"
#include "dictionary.H"
#include "Time.H"
#include "SHA1Digest.H"
#include "dynamicCode.H"
#include "dynamicCodeContext.H"
#include "stringOps.H"
#include "addToRunTimeSelectionTable.H"
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
namespace Foam
{
defineTypeNameAndDebug(codedPoints0MotionSolver, 0);
addToRunTimeSelectionTable
(
motionSolver,
codedPoints0MotionSolver,
dictionary
);
}
// * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * //
void Foam::codedPoints0MotionSolver::prepare
(
dynamicCode& dynCode,
const dynamicCodeContext& context
) const
{
// Set additional rewrite rules
dynCode.setFilterVariable("typeName", name_);
// Compile filtered C template
dynCode.addCompileFile("codedPoints0MotionSolverTemplate.C");
// Copy filtered H template
dynCode.addCopyFile("codedPoints0MotionSolverTemplate.H");
// Debugging: make BC verbose
// dynCode.setFilterVariable("verbose", "true");
// Info<<"compile " << name_ << " sha1: "
// << context.sha1() << endl;
// Define Make/options
dynCode.setMakeOptions
(
"EXE_INC = -g \\\n"
"-I$(LIB_SRC)/finiteVolume/lnInclude \\\n"
"-I$(LIB_SRC)/fvMotionSolvers/lnInclude \\\n"
"-I$(LIB_SRC)/dynamicMesh/lnInclude \\\n"
"-I$(LIB_SRC)/meshTools/lnInclude \\\n"
+ context.options()
+ "\n\nLIB_LIBS = \\\n"
+ " -lfvMotionSolvers \\\n"
+ context.libs()
);
}
Foam::dlLibraryTable& Foam::codedPoints0MotionSolver::libs() const
{
return const_cast<Time&>(mesh().time()).libs();
}
Foam::string Foam::codedPoints0MotionSolver::description() const
{
return "points0MotionSolver " + name();
}
void Foam::codedPoints0MotionSolver::clearRedirect() const
{
redirectMotionSolverPtr_.clear();
}
const Foam::dictionary&
Foam::codedPoints0MotionSolver::codeDict() const
{
return coeffDict();
}
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
Foam::codedPoints0MotionSolver::codedPoints0MotionSolver
(
const polyMesh& mesh,
const IOdictionary& dict
)
:
motionSolver(mesh, dict, typeName),
codedBase()
{
// Backward compatibility
if (dict.found("redirectType"))
{
dict.lookup("redirectType") >> name_;
}
else
{
dict.lookup("name") >> name_;
}
updateLibrary(name_);
redirectMotionSolver();
}
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
Foam::codedPoints0MotionSolver::~codedPoints0MotionSolver()
{}
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
Foam::motionSolver&
Foam::codedPoints0MotionSolver::redirectMotionSolver() const
{
if (!redirectMotionSolverPtr_.valid())
{
// Get the dictionary for the solver and override the
// solver name (in case it is not a subdictionary and contains
// the 'coded' as the motionSolver)
dictionary constructDict(coeffDict());
constructDict.set("solver", name_);
constructDict.set("motionSolver", name_);
IOobject io(*this);
io.readOpt() = IOobject::NO_READ;
redirectMotionSolverPtr_ = motionSolver::New
(
mesh(),
IOdictionary(io, constructDict)
);
}
return redirectMotionSolverPtr_();
}
Foam::tmp<Foam::pointField> Foam::codedPoints0MotionSolver::curPoints() const
{
updateLibrary(name_);
return redirectMotionSolver().curPoints();
}
void Foam::codedPoints0MotionSolver::solve()
{
updateLibrary(name_);
redirectMotionSolver().solve();
}
void Foam::codedPoints0MotionSolver::movePoints(const pointField& fld)
{
updateLibrary(name_);
return redirectMotionSolver().movePoints(fld);
}
void Foam::codedPoints0MotionSolver::updateMesh(const mapPolyMesh& mpm)
{
updateLibrary(name_);
return redirectMotionSolver().updateMesh(mpm);
}
// ************************************************************************* //

View File

@ -0,0 +1,176 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2017 OpenCFD Ltd.
\\/ M anipulation |
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
OpenFOAM is free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
Class
Foam::codedPoints0MotionSolver
Group
Description
Provides a general interface to enable dynamic code compilation of
mesh motion solvers.
The entries are:
\plaintable
codeInclude | include files
codeOptions | include paths; inserted into EXE_INC in Make/options
codeLibs | link line; inserted into LIB_LIBS in Make/options
localCode | c++; local static functions;
code | c++; upon motionSolver::curPoints();
\endplaintable
Note that the dynamically generated motionSolver is an points0MotionSolver,
i.e. it has access to the points0 (points from constant/polyMesh).
Usage
Example of simplistic specification:
\verbatim
difference
{
type coded;
// Name of on-the-fly generated motion solver
name myMotion;
code
#{
const pointField& p0 = points0();
const tensor rotT =
rotationTensor(vector(1, 0, 0), vector(0, 1, 0));
return transform(rotT, p0);
#};
}
\endverbatim
See also
Foam::motionSolver
Foam::codedBase
SourceFiles
codedPoints0MotionSolver.C
\*---------------------------------------------------------------------------*/
#ifndef codedPoints0MotionSolver_H
#define codedPoints0MotionSolver_H
#include "motionSolver.H"
#include "codedBase.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
/*---------------------------------------------------------------------------*\
Class codedPoints0MotionSolver Declaration
\*---------------------------------------------------------------------------*/
class codedPoints0MotionSolver
:
public motionSolver,
public codedBase
{
protected:
// Protected data
//- Name of redirected motion solver
word name_;
//- Underlying motionSolver
mutable autoPtr<motionSolver> redirectMotionSolverPtr_;
// Protected Member Functions
//- Get the loaded dynamic libraries
virtual dlLibraryTable& libs() const;
//- Adapt the context for the current object
virtual void prepare(dynamicCode&, const dynamicCodeContext&) const;
// Return a description (type + name) for the output
virtual string description() const;
// Clear any redirected objects
virtual void clearRedirect() const;
// Get the dictionary to initialize the codeContext
virtual const dictionary& codeDict() const;
private:
//- Disallow default bitwise copy construct
codedPoints0MotionSolver(const codedPoints0MotionSolver&);
//- Disallow default bitwise assignment
void operator=(const codedPoints0MotionSolver&);
public:
//- Runtime type information
TypeName("coded");
// Constructors
//- Construct from mesh and dictionary
codedPoints0MotionSolver
(
const polyMesh& mesh,
const IOdictionary& dict
);
//- Destructor
virtual ~codedPoints0MotionSolver();
// Member Functions
//- Dynamically compiled motionSolver
motionSolver& redirectMotionSolver() const;
//- Return point location obtained from the current motion field
virtual tmp<pointField> curPoints() const;
//- Solve for motion
virtual void solve();
//- Update local data for geometry changes
virtual void movePoints(const pointField&);
//- Update local data for topology changes
virtual void updateMesh(const mapPolyMesh&);
};
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif
// ************************************************************************* //

View File

@ -0,0 +1,77 @@
/*--------------------------------*- C++ -*----------------------------------*\
| ========= | |
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| \\ / O peration | Version: plus |
| \\ / A nd | Web: www.OpenFOAM.com |
| \\/ M anipulation | |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class dictionary;
location "system";
object dynamicMeshDict;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
dynamicFvMesh dynamicMotionSolverFvMesh;
motionSolver coded;
name myMotion;
codeInclude
#{
#include "transformField.H"
#};
localCode
#{
// Generate new set of points
tmp<pointField> twistColumn
(
const scalar& maxRotAngle,
const pointField& points
)
{
tmp<pointField> tnewPoints(new pointField(points));
pointField& newPoints = tnewPoints.ref();
const boundBox bb(points, true);
const scalar zMin = bb.min()[vector::Z];
const scalar zSpan = bb.span()[vector::Z];
forAll(points, pointI)
{
const scalar x = points[pointI].component(0);
const scalar y = points[pointI].component(1);
const scalar z = points[pointI].component(2);
// Scale the angle by height
const scalar localAngle = maxRotAngle*(z-zMin)/zSpan;
const scalar xr = x*cos(localAngle)-y*sin(localAngle);
const scalar yr = x*sin(localAngle)+y*cos(localAngle);
newPoints[pointI] = vector(xr, yr, z);
}
return tnewPoints;
}
#};
code
#{
const Time& tm = mesh().time();
const pointField& p0 = points0();
// Max twist pi at t=10
const scalar maxRotAngle =
constant::mathematical::pi*Foam::sin(degToRad(90.0/10.0*tm.value()));
tmp<pointField> tnewPoints(twistColumn(maxRotAngle, p0));
return tnewPoints;
#};
// ************************************************************************* //

View File

@ -0,0 +1,21 @@
/*--------------------------------*- C++ -*----------------------------------*\
| ========= | |
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| \\ / O peration | Version: plus |
| \\ / A nd | Web: www.OpenFOAM.com |
| \\/ M anipulation | |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class dictionary;
object transportProperties;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
transportModel Newtonian;
nu 1.5e-05;
// ************************************************************************* //

View File

@ -0,0 +1,72 @@
/*--------------------------------*- C++ -*----------------------------------*\
| ========= | |
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| \\ / O peration | Version: plus |
| \\ / A nd | Web: www.OpenFOAM.com |
| \\/ M anipulation | |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class dictionary;
object blockMeshDict;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
scale 1;
vertices
(
(-0.5 -0.5 0)
(0.5 -0.5 0)
(0.5 0.5 0)
(-0.5 0.5 0)
(-0.5 -0.5 8)
(0.5 -0.5 8)
(0.5 0.5 8)
(-0.5 0.5 8)
);
blocks
(
hex (0 1 2 3 4 5 6 7) (2 2 8) simpleGrading (1 1 1)
);
edges
(
);
boundary
(
sides
{
type patch;
faces
(
(2 6 5 1)
(0 4 7 3)
(3 7 6 2)
(1 5 4 0)
);
}
floor
{
type wall;
faces
(
(0 3 2 1)
);
}
top
{
type patch;
faces
(
(4 5 6 7)
);
}
);
// ************************************************************************* //

View File

@ -0,0 +1,48 @@
/*--------------------------------*- C++ -*----------------------------------*\
| ========= | |
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| \\ / O peration | Version: plus |
| \\ / A nd | Web: www.OpenFOAM.com |
| \\/ M anipulation | |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class dictionary;
object controlDict;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
application moveDynamicMesh;
startFrom startTime;
startTime 0;
stopAt endTime;
endTime 40;
deltaT 1;
writeControl timeStep;
writeInterval 1;
purgeWrite 0;
writeFormat binary;
writePrecision 6;
writeCompression off;
timeFormat general;
timePrecision 6;
runTimeModifiable true;
// ************************************************************************* //

View File

@ -0,0 +1,24 @@
/*--------------------------------*- C++ -*----------------------------------*\
| ========= | |
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| \\ / O peration | Version: plus |
| \\ / A nd | Web: www.OpenFOAM.com |
| \\/ M anipulation | |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class dictionary;
note "mesh decomposition control dictionary";
object decomposeParDict;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
//- The total number of domains (mandatory)
numberOfSubdomains 3;
//- The decomposition method (mandatory)
method random;
// ************************************************************************* //

View File

@ -0,0 +1,50 @@
/*--------------------------------*- C++ -*----------------------------------*\
| ========= | |
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| \\ / O peration | Version: plus |
| \\ / A nd | Web: www.OpenFOAM.com |
| \\/ M anipulation | |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class dictionary;
location "system";
object fvSchemes;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
ddtSchemes
{
default Euler;
}
gradSchemes
{
default Gauss linear;
}
divSchemes
{
default none;
div(phi,U) Gauss linear;
}
laplacianSchemes
{
default Gauss linear corrected;
}
interpolationSchemes
{
default linear;
}
snGradSchemes
{
default corrected;
}
// ************************************************************************* //

View File

@ -0,0 +1,56 @@
/*--------------------------------*- C++ -*----------------------------------*\
| ========= | |
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| \\ / O peration | Version: plus |
| \\ / A nd | Web: www.OpenFOAM.com |
| \\/ M anipulation | |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class dictionary;
location "system";
object fvSolution;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
solvers
{
p
{
solver PCG;
preconditioner DIC;
tolerance 1e-06;
relTol 0;
}
U
{
solver PBiCGStab;
preconditioner DILU;
tolerance 1e-05;
relTol 0;
}
"cellDisplacement.*"
{
solver GAMG;
tolerance 1e-08;
relTol 0;
smoother GaussSeidel;
}
"(cellMotionU|cellMotionUz)"
{
$p;
tolerance 1e-08;
relTol 0;
}
}
PIMPLE
{}
// ************************************************************************* //