mirror of
https://develop.openfoam.com/Development/openfoam.git
synced 2025-12-28 03:37:59 +00:00
Finite area port, Hrvoje Jasak
- with sphereSurfactantFoam and sphereTransport test case
This commit is contained in:
committed by
Andrew Heather
parent
4c81ee202d
commit
0c64622341
3
applications/solvers/finiteArea/liquidFilmFoam/Make/files
Executable file
3
applications/solvers/finiteArea/liquidFilmFoam/Make/files
Executable file
@ -0,0 +1,3 @@
|
||||
liquidFilmFoam.C
|
||||
|
||||
EXE = $(FOAM_APPBIN)/liquidFilmFoam
|
||||
10
applications/solvers/finiteArea/liquidFilmFoam/Make/options
Executable file
10
applications/solvers/finiteArea/liquidFilmFoam/Make/options
Executable file
@ -0,0 +1,10 @@
|
||||
EXE_INC = \
|
||||
-I$(LIB_SRC)/finiteArea/lnInclude \
|
||||
-I$(LIB_SRC)/finiteVolume/lnInclude \
|
||||
-I$(LIB_SRC)/meshTools/lnInclude \
|
||||
-I$(LIB_SRC)/cfdTools/general/lnInclude
|
||||
|
||||
EXE_LIBS = \
|
||||
-lfiniteArea \
|
||||
-lfiniteVolume \
|
||||
-lmeshTools
|
||||
@ -0,0 +1,7 @@
|
||||
{
|
||||
// Stabilisation of friction factor calculation
|
||||
// Friction factor is defined with standard gravity
|
||||
frictionFactor.primitiveFieldRef() =
|
||||
mag(2*9.81*sqr(manningField.primitiveField())/
|
||||
pow(mag(h.primitiveField()) + 1e-7, 1.0/3.0));
|
||||
}
|
||||
@ -0,0 +1,13 @@
|
||||
{
|
||||
scalar CoNumSigma = max
|
||||
(
|
||||
sqrt
|
||||
(
|
||||
2*M_PI*sigma*sqr(aMesh.edgeInterpolation::deltaCoeffs())
|
||||
*aMesh.edgeInterpolation::deltaCoeffs()
|
||||
/rhol
|
||||
)
|
||||
).value()*runTime.deltaT().value();
|
||||
|
||||
Info<< "Max Capillary Courant Number = " << CoNumSigma << '\n' << endl;
|
||||
}
|
||||
158
applications/solvers/finiteArea/liquidFilmFoam/createFaFields.H
Normal file
158
applications/solvers/finiteArea/liquidFilmFoam/createFaFields.H
Normal file
@ -0,0 +1,158 @@
|
||||
Info<< "Reading field h" << endl;
|
||||
areaScalarField h
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"h",
|
||||
runTime.timeName(),
|
||||
mesh,
|
||||
IOobject::MUST_READ,
|
||||
IOobject::AUTO_WRITE
|
||||
),
|
||||
aMesh
|
||||
);
|
||||
|
||||
|
||||
Info<< "Reading field Us" << endl;
|
||||
areaVectorField Us
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"Us",
|
||||
runTime.timeName(),
|
||||
mesh,
|
||||
IOobject::MUST_READ,
|
||||
IOobject::AUTO_WRITE
|
||||
),
|
||||
aMesh
|
||||
);
|
||||
|
||||
|
||||
edgeScalarField phis
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"phis",
|
||||
runTime.timeName(),
|
||||
mesh,
|
||||
IOobject::READ_IF_PRESENT,
|
||||
IOobject::AUTO_WRITE
|
||||
),
|
||||
fac::interpolate(Us) & aMesh.Le()
|
||||
);
|
||||
|
||||
|
||||
edgeScalarField phi2s
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"phi2s",
|
||||
runTime.timeName(),
|
||||
mesh,
|
||||
IOobject::READ_IF_PRESENT,
|
||||
IOobject::AUTO_WRITE
|
||||
),
|
||||
fac::interpolate(h*Us) & aMesh.Le()
|
||||
);
|
||||
|
||||
|
||||
const areaVectorField& Ns = aMesh.faceAreaNormals();
|
||||
areaVectorField Gs = g - Ns*(Ns & g);
|
||||
areaScalarField Gn = mag(g - Gs);
|
||||
|
||||
// Mass source
|
||||
areaScalarField Sm
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"Sm",
|
||||
runTime.timeName(),
|
||||
mesh,
|
||||
IOobject::NO_READ,
|
||||
IOobject::NO_WRITE
|
||||
),
|
||||
aMesh,
|
||||
dimensionedScalar("Sm", dimLength/dimTime, 0)
|
||||
);
|
||||
|
||||
// Mass sink
|
||||
areaScalarField Sd
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"Sd",
|
||||
runTime.timeName(),
|
||||
mesh,
|
||||
IOobject::NO_READ,
|
||||
IOobject::NO_WRITE
|
||||
),
|
||||
aMesh,
|
||||
dimensionedScalar("Sd", dimLength/dimTime, 0)
|
||||
);
|
||||
|
||||
areaVectorField Ug
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"Sg",
|
||||
runTime.timeName(),
|
||||
mesh,
|
||||
IOobject::NO_READ,
|
||||
IOobject::NO_WRITE
|
||||
),
|
||||
aMesh,
|
||||
dimensionedVector("Ug", dimVelocity, vector::zero)
|
||||
);
|
||||
|
||||
|
||||
// Surface pressure
|
||||
areaScalarField ps
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"ps",
|
||||
runTime.timeName(),
|
||||
mesh,
|
||||
IOobject::NO_READ,
|
||||
IOobject::AUTO_WRITE
|
||||
),
|
||||
rhol*Gn*h - sigma*fac::laplacian(h)
|
||||
);
|
||||
|
||||
// Friction factor
|
||||
areaScalarField dotProduct
|
||||
(
|
||||
aMesh.faceAreaNormals() & (g/mag(g))
|
||||
);
|
||||
|
||||
Info<< "View factor: min = " << min(dotProduct.internalField())
|
||||
<< " max = " << max(dotProduct.internalField()) << endl;
|
||||
|
||||
areaScalarField manningField
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"manningField",
|
||||
runTime.timeName(),
|
||||
mesh,
|
||||
IOobject::MUST_READ,
|
||||
IOobject::AUTO_WRITE
|
||||
),
|
||||
aMesh
|
||||
);
|
||||
|
||||
areaScalarField frictionFactor
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"frictionFactor",
|
||||
runTime.timeName(),
|
||||
mesh,
|
||||
IOobject::NO_READ,
|
||||
IOobject::NO_WRITE
|
||||
),
|
||||
aMesh,
|
||||
dimensionedScalar("one", dimless, 0.01)
|
||||
);
|
||||
|
||||
aMesh.schemesDict().setFluxRequired("h");
|
||||
@ -0,0 +1,31 @@
|
||||
volVectorField U
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"U",
|
||||
runTime.timeName(),
|
||||
mesh,
|
||||
IOobject::NO_READ,
|
||||
IOobject::AUTO_WRITE
|
||||
),
|
||||
mesh,
|
||||
dimensionedVector("0", dimVelocity, vector::zero)
|
||||
);
|
||||
|
||||
|
||||
volScalarField H
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"H",
|
||||
runTime.timeName(),
|
||||
mesh,
|
||||
IOobject::NO_READ,
|
||||
IOobject::AUTO_WRITE
|
||||
),
|
||||
mesh,
|
||||
dimensionedScalar("0", dimLength, 0)
|
||||
);
|
||||
|
||||
// Create volume-to surface mapping object
|
||||
volSurfaceMapping vsm(aMesh);
|
||||
155
applications/solvers/finiteArea/liquidFilmFoam/liquidFilmFoam.C
Normal file
155
applications/solvers/finiteArea/liquidFilmFoam/liquidFilmFoam.C
Normal file
@ -0,0 +1,155 @@
|
||||
/*---------------------------------------------------------------------------*\
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd |
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
| Copyright (C) 2016-2017 Wikki Ltd
|
||||
-------------------------------------------------------------------------------
|
||||
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/>.
|
||||
|
||||
Application
|
||||
liquidFilmFoam
|
||||
|
||||
Description
|
||||
Transient solver for incompressible, laminar flow of Newtonian fluids in
|
||||
liquid film formulation.
|
||||
|
||||
Author
|
||||
Zeljko Tukovic, FMENA
|
||||
Hrvoje Jasak, Wikki Ltd.
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#include "fvCFD.H"
|
||||
#include "faCFD.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
#include "setRootCase.H"
|
||||
#include "createTime.H"
|
||||
#include "createMesh.H"
|
||||
#include "createFaMesh.H"
|
||||
#include "readGravitationalAcceleration.H"
|
||||
#include "readTransportProperties.H"
|
||||
#include "createFaFields.H"
|
||||
#include "createFvFields.H"
|
||||
#include "createTimeControls.H"
|
||||
|
||||
Info<< "\nStarting time loop\n" << endl;
|
||||
|
||||
while (runTime.run())
|
||||
{
|
||||
#include "readSolutionControls.H"
|
||||
#include "readTimeControls.H"
|
||||
#include "surfaceCourantNo.H"
|
||||
#include "capillaryCourantNo.H"
|
||||
#include "setDeltaT.H"
|
||||
|
||||
runTime++;
|
||||
|
||||
Info<< "Time = " << runTime.timeName() << nl << endl;
|
||||
|
||||
while (runTime.loop())
|
||||
{
|
||||
phi2s = fac::interpolate(h)*phis;
|
||||
|
||||
#include "calcFrictionFactor.H"
|
||||
|
||||
faVectorMatrix UsEqn
|
||||
(
|
||||
fam::ddt(h, Us)
|
||||
+ fam::div(phi2s, Us)
|
||||
+ fam::Sp(0.0125*frictionFactor*mag(Us), Us)
|
||||
==
|
||||
Gs*h
|
||||
- fam::Sp(Sd, Us)
|
||||
);
|
||||
|
||||
UsEqn.relax();
|
||||
solve(UsEqn == - fac::grad(ps*h)/rhol + ps*fac::grad(h)/rhol);
|
||||
|
||||
areaScalarField UsA = UsEqn.A();
|
||||
|
||||
Us = UsEqn.H()/UsA;
|
||||
Us.correctBoundaryConditions();
|
||||
|
||||
phis = (fac::interpolate(Us) & aMesh.Le())
|
||||
- fac::interpolate(1.0/(rhol*UsA))
|
||||
*fac::lnGrad(ps*h)*aMesh.magLe()
|
||||
+ fac::interpolate(ps/(rhol*UsA))
|
||||
*fac::lnGrad(h)*aMesh.magLe();
|
||||
|
||||
faScalarMatrix hEqn
|
||||
(
|
||||
fam::ddt(h)
|
||||
+ fam::div(phis, h)
|
||||
==
|
||||
Sm
|
||||
- fam::Sp
|
||||
(
|
||||
Sd/(h + dimensionedScalar("small", dimLength, SMALL)),
|
||||
h
|
||||
)
|
||||
);
|
||||
|
||||
hEqn.relax();
|
||||
hEqn.solve();
|
||||
|
||||
phi2s = hEqn.flux();
|
||||
|
||||
// Bound h
|
||||
h.primitiveFieldRef() = max
|
||||
(
|
||||
max
|
||||
(
|
||||
h.primitiveField(),
|
||||
fac::average(max(h, h0))().primitiveField()
|
||||
*pos(h0.value() - h.primitiveField())
|
||||
),
|
||||
h0.value()
|
||||
);
|
||||
|
||||
ps = rhol*Gn*h - sigma*fac::laplacian(h);
|
||||
ps.correctBoundaryConditions();
|
||||
|
||||
Us -= (1.0/(rhol*UsA))*fac::grad(ps*h)
|
||||
- (ps/(rhol*UsA))*fac::grad(h);
|
||||
Us.correctBoundaryConditions();
|
||||
}
|
||||
|
||||
if (runTime.outputTime())
|
||||
{
|
||||
vsm.mapToVolume(h, H.boundaryFieldRef());
|
||||
vsm.mapToVolume(Us, U.boundaryFieldRef());
|
||||
|
||||
runTime.write();
|
||||
}
|
||||
|
||||
Info<< "ExecutionTime = "
|
||||
<< scalar(runTime.elapsedCpuTime())
|
||||
<< " s\n" << endl << endl;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
// ************************************************************************* //
|
||||
@ -0,0 +1,13 @@
|
||||
int nCorr = 0;
|
||||
|
||||
if (aMesh.solutionDict().found("nOuterCorrectors"))
|
||||
{
|
||||
nCorr =
|
||||
readInt(aMesh.solutionDict().lookup("nOuterCorrectors"));
|
||||
}
|
||||
else
|
||||
{
|
||||
FatalErrorIn(args.executable())
|
||||
<< "Cannot find number of correctors"
|
||||
<< abort(FatalError);
|
||||
}
|
||||
@ -0,0 +1,41 @@
|
||||
IOdictionary transportProperties
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"transportProperties",
|
||||
runTime.constant(),
|
||||
mesh,
|
||||
IOobject::MUST_READ,
|
||||
IOobject::NO_WRITE
|
||||
)
|
||||
);
|
||||
|
||||
dimensionedScalar mug
|
||||
(
|
||||
transportProperties.lookup("mug")
|
||||
);
|
||||
|
||||
dimensionedScalar mul
|
||||
(
|
||||
transportProperties.lookup("mul")
|
||||
);
|
||||
|
||||
dimensionedScalar sigma
|
||||
(
|
||||
transportProperties.lookup("sigma")
|
||||
);
|
||||
|
||||
dimensionedScalar rhol
|
||||
(
|
||||
transportProperties.lookup("rhol")
|
||||
);
|
||||
|
||||
dimensionedScalar rhog
|
||||
(
|
||||
transportProperties.lookup("rhog")
|
||||
);
|
||||
|
||||
dimensionedScalar h0
|
||||
(
|
||||
transportProperties.lookup("h0")
|
||||
);
|
||||
@ -0,0 +1,60 @@
|
||||
/*---------------------------------------------------------------------------*\
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd |
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
| Copyright (C) 2016-2017 Wikki Ltd
|
||||
-------------------------------------------------------------------------------
|
||||
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/>.
|
||||
|
||||
Global
|
||||
surfaceCourantNo
|
||||
|
||||
Author
|
||||
Hrvoje Jasak, Wikki Ltd.
|
||||
|
||||
Description
|
||||
Calculates and outputs the mean and maximum Courant Numbers for the
|
||||
Finite Area method.
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
scalar CoNum = 0.0;
|
||||
scalar meanCoNum = 0.0;
|
||||
scalar velMag = 0.0;
|
||||
|
||||
if (aMesh.nInternalEdges())
|
||||
{
|
||||
edgeScalarField SfUfbyDelta =
|
||||
aMesh.edgeInterpolation::deltaCoeffs()*mag(phis);
|
||||
|
||||
CoNum = max(SfUfbyDelta/aMesh.magLe())
|
||||
.value()*runTime.deltaT().value();
|
||||
|
||||
meanCoNum = (sum(SfUfbyDelta)/sum(aMesh.magLe()))
|
||||
.value()*runTime.deltaT().value();
|
||||
|
||||
velMag = max(mag(phis)/aMesh.magLe()).value();
|
||||
}
|
||||
|
||||
Info<< "Courant Number mean: " << meanCoNum
|
||||
<< " max: " << CoNum
|
||||
<< " velocity magnitude: " << velMag << endl;
|
||||
|
||||
// ************************************************************************* //
|
||||
@ -0,0 +1,3 @@
|
||||
surfactantFoam.C
|
||||
|
||||
EXE = $(FOAM_USER_APPBIN)/sphereSurfactantFoam
|
||||
@ -0,0 +1,10 @@
|
||||
EXE_INC = \
|
||||
-I$(LIB_SRC)/finiteArea/lnInclude \
|
||||
-I$(LIB_SRC)/finiteVolume/lnInclude \
|
||||
-I$(LIB_SRC)/meshTools/lnInclude \
|
||||
-I$(LIB_SRC)/cfdTools/general/lnInclude
|
||||
|
||||
EXE_LIBS = \
|
||||
-lfiniteArea \
|
||||
-lfiniteVolume \
|
||||
-lmeshTools
|
||||
@ -0,0 +1,78 @@
|
||||
Info<< "Reading field Cs" << endl;
|
||||
areaScalarField Cs
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"Cs",
|
||||
runTime.timeName(),
|
||||
mesh,
|
||||
IOobject::MUST_READ,
|
||||
IOobject::AUTO_WRITE
|
||||
),
|
||||
aMesh
|
||||
);
|
||||
|
||||
dimensioned<scalar> Cs0
|
||||
(
|
||||
"Cs0",
|
||||
dimensionSet(1, -2, 0, 0, 0, 0, 0),
|
||||
1.0
|
||||
);
|
||||
|
||||
const areaVectorField& R = aMesh.areaCentres();
|
||||
|
||||
Cs = Cs0*(1.0 + R.component(vector::X)/mag(R));
|
||||
|
||||
|
||||
dimensioned<scalar> Ds
|
||||
(
|
||||
"Ds",
|
||||
dimensionSet(0, 2, -1, 0, 0, 0, 0),
|
||||
1.0
|
||||
);
|
||||
|
||||
|
||||
areaVectorField Us
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"Us",
|
||||
runTime.timeName(),
|
||||
mesh,
|
||||
IOobject::NO_READ,
|
||||
IOobject::NO_WRITE
|
||||
),
|
||||
aMesh,
|
||||
dimensioned<vector>("Us", dimVelocity, vector::zero)
|
||||
);
|
||||
|
||||
dimensioned<scalar> Uinf("Uinf", dimVelocity, 1.0);
|
||||
|
||||
forAll (Us, faceI)
|
||||
{
|
||||
Us[faceI].x() =
|
||||
Uinf.value()*(0.25*(3.0 + sqr(R[faceI].x()/mag(R[faceI]))) - 1.0);
|
||||
|
||||
Us[faceI].y() =
|
||||
Uinf.value()*0.25*R[faceI].x()*R[faceI].y()/sqr(mag(R[faceI]));
|
||||
|
||||
Us[faceI].z() =
|
||||
Uinf.value()*0.25*R[faceI].x()*R[faceI].z()/sqr(mag(R[faceI]));
|
||||
}
|
||||
|
||||
Us -= aMesh.faceAreaNormals()*(aMesh.faceAreaNormals() & Us);
|
||||
|
||||
|
||||
edgeScalarField phis
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"phis",
|
||||
runTime.timeName(),
|
||||
mesh,
|
||||
IOobject::NO_READ,
|
||||
IOobject::NO_WRITE
|
||||
),
|
||||
linearEdgeInterpolate(Us) & aMesh.Le()
|
||||
);
|
||||
|
||||
@ -0,0 +1,2 @@
|
||||
// Create Finite Area mesh
|
||||
faMesh aMesh(mesh);
|
||||
@ -0,0 +1,36 @@
|
||||
// Create volume-to surface mapping object
|
||||
volSurfaceMapping vsm(aMesh);
|
||||
|
||||
volScalarField Cvf
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"Cvf",
|
||||
runTime.timeName(),
|
||||
mesh,
|
||||
IOobject::NO_READ,
|
||||
IOobject::AUTO_WRITE
|
||||
),
|
||||
mesh,
|
||||
dimensionedScalar("0", dimless/dimLength, 0)
|
||||
);
|
||||
|
||||
vsm.mapToVolume(Cs, Cvf.boundaryFieldRef());
|
||||
Cvf.write();
|
||||
|
||||
volVectorField U
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"U",
|
||||
runTime.timeName(),
|
||||
mesh,
|
||||
IOobject::NO_READ,
|
||||
IOobject::AUTO_WRITE
|
||||
),
|
||||
mesh,
|
||||
dimensionedVector("zero", dimVelocity, vector::zero)
|
||||
);
|
||||
|
||||
vsm.mapToVolume(Us, U.boundaryFieldRef());
|
||||
U.write();
|
||||
@ -0,0 +1,86 @@
|
||||
/*---------------------------------------------------------------------------*\
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd |
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
| Copyright (C) 2016-2017 Wikki Ltd
|
||||
-------------------------------------------------------------------------------
|
||||
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/>.
|
||||
|
||||
Application
|
||||
surfactantFoam for sphere transport
|
||||
|
||||
Description
|
||||
Passive scalar transport equation solver on a sphere
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#include "fvCFD.H"
|
||||
#include "faCFD.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
#include "setRootCase.H"
|
||||
#include "createTime.H"
|
||||
#include "createMesh.H"
|
||||
|
||||
#include "createFaMesh.H"
|
||||
#include "createFaFields.H"
|
||||
#include "createVolFields.H"
|
||||
|
||||
Info<< "Total mass of surfactant: "
|
||||
<< sum(Cs.internalField()*aMesh.S()) << endl;
|
||||
|
||||
Info<< "\nStarting time loop\n" << endl;
|
||||
|
||||
while (runTime.loop())
|
||||
{
|
||||
Info<< "Time = " << runTime.value() << endl;
|
||||
|
||||
faScalarMatrix CsEqn
|
||||
(
|
||||
fam::ddt(Cs)
|
||||
+ fam::div(phis, Cs)
|
||||
- fam::laplacian(Ds, Cs)
|
||||
);
|
||||
|
||||
CsEqn.solve();
|
||||
|
||||
if (runTime.outputTime())
|
||||
{
|
||||
vsm.mapToVolume(Cs, Cvf.boundaryFieldRef());
|
||||
|
||||
runTime.write();
|
||||
}
|
||||
|
||||
Info<< "Total mass of surfactant: "
|
||||
<< sum(Cs.internalField()*aMesh.S()) << endl;
|
||||
|
||||
Info<< "ExecutionTime = "
|
||||
<< scalar(runTime.elapsedCpuTime())
|
||||
<< " s\n" << endl << endl;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
// ************************************************************************* //
|
||||
@ -0,0 +1,3 @@
|
||||
surfactantFoam.C
|
||||
|
||||
EXE = $(FOAM_APPBIN)/surfactantFoam
|
||||
10
applications/solvers/finiteArea/surfactantFoam/Make/options
Normal file
10
applications/solvers/finiteArea/surfactantFoam/Make/options
Normal file
@ -0,0 +1,10 @@
|
||||
EXE_INC = \
|
||||
-I$(LIB_SRC)/finiteArea/lnInclude \
|
||||
-I$(LIB_SRC)/finiteVolume/lnInclude \
|
||||
-I$(LIB_SRC)/meshTools/lnInclude \
|
||||
-I$(LIB_SRC)/cfdTools/general/lnInclude
|
||||
|
||||
EXE_LIBS = \
|
||||
-lfiniteArea \
|
||||
-lfiniteVolume \
|
||||
-lmeshTools
|
||||
@ -0,0 +1,63 @@
|
||||
Info<< "Reading field Cs" << endl;
|
||||
areaScalarField Cs
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"Cs",
|
||||
runTime.timeName(),
|
||||
mesh,
|
||||
IOobject::MUST_READ,
|
||||
IOobject::AUTO_WRITE
|
||||
),
|
||||
aMesh
|
||||
);
|
||||
|
||||
Info<< "Reading transportProperties\n" << endl;
|
||||
|
||||
IOdictionary transportProperties
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"transportProperties",
|
||||
runTime.constant(),
|
||||
mesh,
|
||||
IOobject::MUST_READ,
|
||||
IOobject::NO_WRITE
|
||||
)
|
||||
);
|
||||
|
||||
|
||||
Info<< "Reading diffusivity D\n" << endl;
|
||||
|
||||
dimensionedScalar Ds
|
||||
(
|
||||
transportProperties.lookup("Ds")
|
||||
);
|
||||
|
||||
areaVectorField Us
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"Us",
|
||||
runTime.timeName(),
|
||||
mesh,
|
||||
IOobject::MUST_READ,
|
||||
IOobject::NO_WRITE
|
||||
),
|
||||
aMesh
|
||||
);
|
||||
|
||||
|
||||
edgeScalarField phis
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"phis",
|
||||
runTime.timeName(),
|
||||
mesh,
|
||||
IOobject::NO_READ,
|
||||
IOobject::NO_WRITE
|
||||
),
|
||||
linearEdgeInterpolate(Us) & aMesh.Le()
|
||||
);
|
||||
|
||||
@ -0,0 +1,2 @@
|
||||
// Create Finite Area mesh
|
||||
faMesh aMesh(mesh);
|
||||
@ -0,0 +1,36 @@
|
||||
// Create volume-to surface mapping object
|
||||
volSurfaceMapping vsm(aMesh);
|
||||
|
||||
volScalarField Cvf
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"Cvf",
|
||||
runTime.timeName(),
|
||||
mesh,
|
||||
IOobject::NO_READ,
|
||||
IOobject::AUTO_WRITE
|
||||
),
|
||||
mesh,
|
||||
dimensionedScalar("0", dimless/dimLength, 0)
|
||||
);
|
||||
|
||||
vsm.mapToVolume(Cs, Cvf.boundaryFieldRef());
|
||||
Cvf.write();
|
||||
|
||||
volVectorField U
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"U",
|
||||
runTime.timeName(),
|
||||
mesh,
|
||||
IOobject::NO_READ,
|
||||
IOobject::AUTO_WRITE
|
||||
),
|
||||
mesh,
|
||||
dimensionedVector("zero", dimVelocity, vector::zero)
|
||||
);
|
||||
|
||||
vsm.mapToVolume(Us, U.boundaryFieldRef());
|
||||
U.write();
|
||||
112
applications/solvers/finiteArea/surfactantFoam/surfactantFoam.C
Normal file
112
applications/solvers/finiteArea/surfactantFoam/surfactantFoam.C
Normal file
@ -0,0 +1,112 @@
|
||||
/*---------------------------------------------------------------------------*\
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd |
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
| Copyright (C) 2016-2017 Wikki Ltd
|
||||
-------------------------------------------------------------------------------
|
||||
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/>.
|
||||
|
||||
Application
|
||||
surfactantFoam
|
||||
|
||||
Group
|
||||
grpBasicSolvers
|
||||
|
||||
Description
|
||||
Passive scalar transport equation solver.
|
||||
|
||||
\heading Solver details
|
||||
The equation is given by:
|
||||
|
||||
\f[
|
||||
\ddt{Cs} + \div \left(\vec{U} Cs\right) - \div \left(D_T \grad Cs \right)
|
||||
= 0
|
||||
\f]
|
||||
|
||||
Where:
|
||||
\vartable
|
||||
Cs | Passive scalar
|
||||
Ds | Diffusion coefficient
|
||||
\endvartable
|
||||
|
||||
\heading Required fields
|
||||
\plaintable
|
||||
Cs | Passive scalar
|
||||
Us | Velocity [m/s]
|
||||
\endplaintable
|
||||
|
||||
Author
|
||||
Zeljko Tukovic, FMENA
|
||||
Hrvoje Jasak, Wikki Ltd.
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#include "fvCFD.H"
|
||||
#include "faCFD.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
#include "setRootCase.H"
|
||||
#include "createTime.H"
|
||||
#include "createMesh.H"
|
||||
#include "createFaMesh.H"
|
||||
#include "createFaFields.H"
|
||||
#include "createVolFields.H"
|
||||
|
||||
Info<< "Total mass of surfactant: "
|
||||
<< sum(Cs.internalField()*aMesh.S()) << endl;
|
||||
|
||||
Info<< "\nStarting time loop\n" << endl;
|
||||
|
||||
while (runTime.loop())
|
||||
{
|
||||
Info<< "Time = " << runTime.value() << endl;
|
||||
|
||||
faScalarMatrix CsEqn
|
||||
(
|
||||
fam::ddt(Cs)
|
||||
+ fam::div(phis, Cs)
|
||||
- fam::laplacian(Ds, Cs)
|
||||
);
|
||||
|
||||
CsEqn.solve();
|
||||
|
||||
if (runTime.outputTime())
|
||||
{
|
||||
vsm.mapToVolume(Cs, Cvf.boundaryFieldRef());
|
||||
|
||||
runTime.write();
|
||||
}
|
||||
|
||||
Info<< "Total mass of surfactant: "
|
||||
<< sum(Cs.internalField()*aMesh.S()) << endl;
|
||||
|
||||
Info<< "ExecutionTime = " << runTime.elapsedCpuTime() << " s"
|
||||
<< " ClockTime = " << runTime.elapsedClockTime() << " s"
|
||||
<< nl << endl;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
// ************************************************************************* //
|
||||
Reference in New Issue
Block a user