Skip to content
Snippets Groups Projects
Commit 53af23b9 authored by Sergio Ferraris's avatar Sergio Ferraris Committed by Andrew Heather
Browse files

Implicit treatment of coupled boundary conditions

parent 11e0db96
No related branches found
No related tags found
1 merge request!477Implicit treatment of coupled boundary conditions
Showing
with 276 additions and 42 deletions
......@@ -21,6 +21,7 @@ EXE_INC = \
-I$(LIB_SRC)/regionModels/regionModel/lnInclude \
-I$(LIB_SRC)/regionFaModels\lnInclude
EXE_LIBS = \
-lfiniteVolume \
-lfvOptions \
......
......@@ -6,7 +6,7 @@
\\/ M anipulation |
-------------------------------------------------------------------------------
Copyright (C) 2011-2016 OpenFOAM Foundation
Copyright (C) 2017 OpenCFD Ltd.
Copyright (C) 2017-2019 OpenCFD Ltd.
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
......@@ -54,6 +54,7 @@ Description
#include "loopControl.H"
#include "pressureControl.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
int main(int argc, char *argv[])
......@@ -80,6 +81,8 @@ int main(int argc, char *argv[])
#include "solidRegionDiffusionNo.H"
#include "setInitialMultiRegionDeltaT.H"
#include "createCoupledRegions.H"
while (runTime.run())
{
#include "readTimeControls.H"
......@@ -109,8 +112,6 @@ int main(int argc, char *argv[])
forAll(fluidRegions, i)
{
Info<< "\nSolving for fluid region "
<< fluidRegions[i].name() << endl;
#include "setRegionFluidFields.H"
#include "readFluidMultiRegionPIMPLEControls.H"
#include "solveFluid.H"
......@@ -118,13 +119,35 @@ int main(int argc, char *argv[])
forAll(solidRegions, i)
{
Info<< "\nSolving for solid region "
<< solidRegions[i].name() << endl;
#include "setRegionSolidFields.H"
#include "readSolidMultiRegionPIMPLEControls.H"
#include "solveSolid.H"
}
if (coupled)
{
Info<< "\nSolving energy coupled regions " << endl;
fvMatrixAssemblyPtr->solve();
#include "correctThermos.H"
forAll(fluidRegions, i)
{
#include "setRegionFluidFields.H"
#include "readFluidMultiRegionPIMPLEControls.H"
Info<< "\nSolving for fluid region "
<< fluidRegions[i].name() << endl;
// --- PISO loop
for (int corr=0; corr<nCorr; corr++)
{
#include "pEqn.H"
}
turbulence.correct();
rho = thermo.rho();
Info<< "Min/max T:" << min(thermo.T()).value() << ' '
<< max(thermo.T()).value() << endl;
}
}
// Additional loops for energy solution only
if (!oCorr && nOuterCorr > 1)
{
......@@ -152,10 +175,28 @@ int main(int argc, char *argv[])
#include "readSolidMultiRegionPIMPLEControls.H"
#include "solveSolid.H"
}
if (coupled)
{
Info<< "\nSolving energy coupled regions " << endl;
fvMatrixAssemblyPtr->solve();
#include "correctThermos.H"
forAll(fluidRegions, i)
{
#include "setRegionFluidFields.H"
rho = thermo.rho();
}
}
}
}
}
if (coupled)
{
fvMatrixAssemblyPtr->clear();
}
runTime.write();
runTime.printExecutionTime(Info);
......
......@@ -3,6 +3,7 @@ EXE_INC = \
-I./fluid \
-I./solid \
-I../solid \
-I./../include \
-I$(LIB_SRC)/finiteVolume/cfdTools \
-I$(LIB_SRC)/finiteVolume/lnInclude \
-I$(LIB_SRC)/meshTools/lnInclude \
......@@ -35,3 +36,4 @@ EXE_LIBS = \
-lregionModels \
-lsampling \
-lregionFaModels
......@@ -6,7 +6,7 @@
\\/ M anipulation |
-------------------------------------------------------------------------------
Copyright (C) 2011-2016 OpenFOAM Foundation
Copyright (C) 2017 OpenCFD Ltd.
Copyright (C) 2017-2019 OpenCFD Ltd.
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
......@@ -66,6 +66,7 @@ int main(int argc, char *argv[])
#include "createTime.H"
#include "createMeshes.H"
#include "createFields.H"
#include "createCoupledRegions.H"
#include "initContinuityErrs.H"
while (runTime.loop())
......@@ -83,13 +84,27 @@ int main(int argc, char *argv[])
forAll(solidRegions, i)
{
Info<< "\nSolving for solid region "
<< solidRegions[i].name() << endl;
#include "setRegionSolidFields.H"
#include "readSolidMultiRegionSIMPLEControls.H"
#include "solveSolid.H"
}
if (coupled)
{
Info<< "\nSolving energy coupled regions" << endl;
fvMatrixAssemblyPtr->solve();
#include "correctThermos.H"
forAll(fluidRegions, i)
{
#include "setRegionFluidFields.H"
#include "readSolidMultiRegionSIMPLEControls.H"
#include "pEqn.H"
turb.correct();
}
}
// Additional loops for energy solution only
{
loopControl looping(runTime, "SIMPLE", "energyCoupling");
......@@ -116,9 +131,27 @@ int main(int argc, char *argv[])
#include "readSolidMultiRegionSIMPLEControls.H"
#include "solveSolid.H"
}
if (coupled)
{
Info<< "\nSolving energy coupled regions.. " << endl;
fvMatrixAssemblyPtr->solve();
#include "correctThermos.H"
forAll(fluidRegions, i)
{
#include "setRegionFluidFields.H"
turb.correct();
}
}
}
}
if (coupled)
{
fvMatrixAssemblyPtr->clear();
}
runTime.write();
runTime.printExecutionTime(Info);
......
......@@ -20,13 +20,20 @@
fvOptions.constrain(EEqn);
EEqn.solve();
if (coupled)
{
fvMatrixAssemblyPtr->addFvMatrix(EEqn);
}
else
{
EEqn.solve();
fvOptions.correct(he);
fvOptions.correct(he);
thermo.correct();
rad.correct();
thermo.correct();
rad.correct();
Info<< "Min/max T:" << min(thermo.T()).value() << ' '
<< max(thermo.T()).value() << endl;
Info<< "Min/max T:" << min(thermo.T()).value() << ' '
<< max(thermo.T()).value() << endl;
}
}
......@@ -2,7 +2,7 @@
MRF.correctBoundaryVelocity(U);
tmp<fvVectorMatrix> tUEqn
UEqn =
(
fvm::div(phi, U)
+ MRF.DDt(rho, U)
......@@ -10,7 +10,6 @@
==
fvOptions(rho, U)
);
fvVectorMatrix& UEqn = tUEqn.ref();
UEqn.relax();
......
......@@ -21,6 +21,8 @@ PtrList<dimensionedScalar> rhoMin(fluidRegions.size());
PtrList<IOMRFZoneList> MRFfluid(fluidRegions.size());
PtrList<fv::options> fluidFvOptions(fluidRegions.size());
PtrList<fvVectorMatrix> UEqFluid(fluidRegions.size());
const uniformDimensionedVectorField& g = meshObjects::gravity::New(runTime);
// Populate fluid field pointer lists
......@@ -222,5 +224,11 @@ forAll(fluidRegions, i)
new fv::options(fluidRegions[i])
);
UEqFluid.set
(
i,
new fvVectorMatrix(UFluid[i], dimForce)
);
turbulence[i].validate();
}
......@@ -2,7 +2,7 @@
volScalarField rAU("rAU", 1.0/UEqn.A());
surfaceScalarField rhorAUf("rhorAUf", fvc::interpolate(rho*rAU));
volVectorField HbyA(constrainHbyA(rAU*UEqn.H(), U, p_rgh));
tUEqn.clear();
//tUEqn.clear();
surfaceScalarField phig(-rhorAUf*ghf*fvc::snGrad(rho)*mesh.magSf());
......
......@@ -22,6 +22,8 @@
IOMRFZoneList& MRF = MRFfluid[i];
fv::options& fvOptions = fluidFvOptions[i];
fvVectorMatrix& UEqn = UEqFluid[i];
const dimensionedScalar initialMass
(
"initialMass",
......
......@@ -12,8 +12,10 @@
#include "UEqn.H"
#include "EEqn.H"
#include "pEqn.H"
turb.correct();
if (!coupled)
{
#include "pEqn.H"
turb.correct();
}
}
}
......@@ -16,13 +16,21 @@
fvOptions.constrain(hEqn);
hEqn.solve();
if (coupled)
{
fvMatrixAssemblyPtr->addFvMatrix(hEqn);
}
else
{
Info<< "\nSolving for solid region "
<< solidRegions[i].name() << endl;
fvOptions.correct(h);
}
thermo.correct();
hEqn.solve();
fvOptions.correct(h);
thermo.correct();
Info<< "Min/max T:" << min(thermo.T()).value() << ' '
<< max(thermo.T()).value() << endl;
Info<< "Min/max T:" << min(thermo.T()).value() << ' '
<< max(thermo.T()).value() << endl;
}
}
}
......@@ -7,6 +7,7 @@ EXE_INC = \
-I${phaseSystem}/twoPhaseCompressibleTurbulenceModels/lnInclude \
-I${phaseSystem}/multiphaseSystem/lnInclude \
-I./fluid \
-I./solid \
-I../solid \
-I../fluid \
-I../include \
......
if (finalIter)
{
mesh.data::add("finalIteration", true);
}
{
for (int nonOrth=0; nonOrth<=nNonOrthCorr; ++nonOrth)
{
fvScalarMatrix hEqn
(
fvm::ddt(betav*rho, h)
- (
thermo.isotropic()
? fvm::laplacian(betav*thermo.alpha(), h, "laplacian(alpha,h)")
: fvm::laplacian(betav*taniAlpha(), h, "laplacian(alpha,h)")
)
==
fvOptions(rho, h)
);
hEqn.relax();
fvOptions.constrain(hEqn);
hEqn.solve(mesh.solver(h.select(finalIter)));
fvOptions.correct(h);
}
thermo.correct();
Info<< "Min/max T:" << min(thermo.T()).value() << ' '
<< max(thermo.T()).value() << endl;
}
if (finalIter)
{
mesh.data::remove("finalIteration");
}
......@@ -27,13 +27,19 @@
fvOptions.constrain(EEqn);
EEqn.solve(mesh.solver(he.select(finalIter)));
if (coupled)
{
fvMatrixAssemblyPtr->addFvMatrix(EEqn);
}
else
{
EEqn.solve(mesh.solver(he.select(finalIter)));
fvOptions.correct(he);
fvOptions.correct(he);
thermo.correct();
rad.correct();
thermo.correct();
rad.correct();
Info<< "Min/max T:" << min(thermo.T()).value() << ' '
<< max(thermo.T()).value() << endl;
Info<< "Min/max T:" << min(thermo.T()).value() << ' '
<< max(thermo.T()).value() << endl;
}
}
......@@ -2,7 +2,7 @@
MRF.correctBoundaryVelocity(U);
tmp<fvVectorMatrix> tUEqn
UEqn =
(
fvm::ddt(rho, U) + fvm::div(phi, U)
+ MRF.DDt(rho, U)
......@@ -10,7 +10,6 @@
==
fvOptions(rho, U)
);
fvVectorMatrix& UEqn = tUEqn.ref();
UEqn.relax();
......
......@@ -16,6 +16,8 @@ PtrList<multivariateSurfaceInterpolationScheme<scalar>::fieldTable>
fieldsFluid(fluidRegions.size());
PtrList<volScalarField> QdotFluid(fluidRegions.size());
PtrList<fvVectorMatrix> UEqFluid(fluidRegions.size());
List<scalar> initialMassFluid(fluidRegions.size());
List<bool> frozenFlowFluid(fluidRegions.size(), false);
......@@ -293,6 +295,12 @@ forAll(fluidRegions, i)
new fv::options(fluidRegions[i])
);
UEqFluid.set
(
i,
new fvVectorMatrix(UFluid[i], dimForce)
);
turbulenceFluid[i].validate();
pRefCellFluid[i] = -1;
......
......@@ -49,6 +49,8 @@
IOMRFZoneList& MRF = MRFfluid[i];
fv::options& fvOptions = fluidFvOptions[i];
fvVectorMatrix& UEqn = UEqFluid[i];
const dimensionedScalar initialMass
(
"initialMass",
......
......@@ -18,15 +18,20 @@ else
#include "YEqn.H"
#include "EEqn.H"
// --- PISO loop
for (int corr=0; corr<nCorr; corr++)
if (!coupled)
{
#include "pEqn.H"
}
Info<< "\nSolving for fluid region " << fluidRegions[i].name() << endl;
// --- PISO loop
for (int corr=0; corr<nCorr; corr++)
{
#include "pEqn.H"
}
turbulence.correct();
turbulence.correct();
rho = thermo.rho();
rho = thermo.rho();
}
}
if (finalIter)
......
forAll(fluidRegions, i)
{
rhoThermo& thermo = thermoFluid[i];
radiation::radiationModel& rad = radiation[i];
fv::options& fvOptions = fluidFvOptions[i];
volScalarField& he = thermo.he();
fvOptions.correct(he);
thermo.correct();
rad.correct();
}
forAll(solidRegions, i)
{
solidThermo& thermo = thermos[i];
fv::options& fvOptions = solidHeatSources[i];
volScalarField& h = thermo.he();
fvOptions.correct(h);
thermo.correct();
}
fvSolution solutionDict(runTime);
bool coupled(solutionDict.getOrDefault("coupledEnergyField", false));
autoPtr<fvMatrix<scalar>> fvMatrixAssemblyPtr;
forAll(fluidRegions, i)
{
const rhoThermo& thermo = refCast<const rhoThermo>(thermoFluid[i]);
const auto& bpsi = thermo.T().boundaryField();
forAll (bpsi, patchI)
{
if (bpsi[patchI].useImplicit())
{
coupled = true;
}
}
}
forAll(solidRegions, i)
{
solidThermo& thermo = thermos[i];
const auto& bpsi = thermo.T().boundaryField();
forAll (bpsi, patchI)
{
if (bpsi[patchI].useImplicit())
{
coupled = true;
}
}
}
forAll(fluidRegions, i)
{
const rhoThermo& thermo = refCast<const rhoThermo>(thermoFluid[i]);
if (coupled)
{
Info << "Create fvMatrixAssembly." << endl;
fvMatrixAssemblyPtr.reset
(
new fvMatrix<scalar>
(
thermo.he(),
dimEnergy/dimTime
)
);
break;
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment