Cumulative Development: Vuko Vukcevic
This commit is contained in:
commit
3b4ea0cc01
63 changed files with 1817 additions and 1536 deletions
|
@ -5,7 +5,8 @@ EXE_INC = \
|
||||||
-I$(LIB_SRC)/dynamicMesh/topoChangerFvMesh/lnInclude \
|
-I$(LIB_SRC)/dynamicMesh/topoChangerFvMesh/lnInclude \
|
||||||
-I$(LIB_SRC)/meshTools/lnInclude \
|
-I$(LIB_SRC)/meshTools/lnInclude \
|
||||||
-I$(LIB_SRC)/finiteVolume/lnInclude \
|
-I$(LIB_SRC)/finiteVolume/lnInclude \
|
||||||
-I$(LIB_SRC)/solidModels/lnInclude
|
-I$(LIB_SRC)/solidModels/lnInclude \
|
||||||
|
-I$(LIB_SRC)/conjugateHeatTransfer/lnInclude
|
||||||
|
|
||||||
EXE_LIBS = \
|
EXE_LIBS = \
|
||||||
-lfiniteVolume \
|
-lfiniteVolume \
|
||||||
|
@ -13,4 +14,5 @@ EXE_LIBS = \
|
||||||
-ldynamicFvMesh \
|
-ldynamicFvMesh \
|
||||||
-ldynamicMesh \
|
-ldynamicMesh \
|
||||||
-ltopoChangerFvMesh \
|
-ltopoChangerFvMesh \
|
||||||
-lsolidModels
|
-lsolidModels \
|
||||||
|
-lconjugateHeatTransfer
|
||||||
|
|
|
@ -49,7 +49,9 @@ Foam::constantThermal::constantThermal
|
||||||
thermalLaw(name, T, dict),
|
thermalLaw(name, T, dict),
|
||||||
rho_(dict.lookup("rho")),
|
rho_(dict.lookup("rho")),
|
||||||
C_(dict.lookup("C")),
|
C_(dict.lookup("C")),
|
||||||
k_(dict.lookup("k"))
|
k_(dict.lookup("k")),
|
||||||
|
alpha_(dict.lookup("alpha")),
|
||||||
|
T0_(dict.lookup("T0"))
|
||||||
{}
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
@ -86,6 +88,7 @@ Foam::tmp<Foam::volScalarField> Foam::constantThermal::rho() const
|
||||||
return tresult;
|
return tresult;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Foam::tmp<Foam::volScalarField> Foam::constantThermal::C() const
|
Foam::tmp<Foam::volScalarField> Foam::constantThermal::C() const
|
||||||
{
|
{
|
||||||
tmp<volScalarField> tresult
|
tmp<volScalarField> tresult
|
||||||
|
@ -138,4 +141,56 @@ Foam::tmp<Foam::volScalarField> Foam::constantThermal::k() const
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Foam::tmp<Foam::volScalarField> Foam::constantThermal::alpha() const
|
||||||
|
{
|
||||||
|
tmp<volScalarField> tresult
|
||||||
|
(
|
||||||
|
new volScalarField
|
||||||
|
(
|
||||||
|
IOobject
|
||||||
|
(
|
||||||
|
"alpha",
|
||||||
|
mesh().time().timeName(),
|
||||||
|
mesh(),
|
||||||
|
IOobject::NO_READ,
|
||||||
|
IOobject::NO_WRITE
|
||||||
|
),
|
||||||
|
mesh(),
|
||||||
|
alpha_,
|
||||||
|
zeroGradientFvPatchScalarField::typeName
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
tresult().correctBoundaryConditions();
|
||||||
|
|
||||||
|
return tresult;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Foam::tmp<Foam::volScalarField> Foam::constantThermal::T0() const
|
||||||
|
{
|
||||||
|
tmp<volScalarField> tresult
|
||||||
|
(
|
||||||
|
new volScalarField
|
||||||
|
(
|
||||||
|
IOobject
|
||||||
|
(
|
||||||
|
"T0",
|
||||||
|
mesh().time().timeName(),
|
||||||
|
mesh(),
|
||||||
|
IOobject::NO_READ,
|
||||||
|
IOobject::NO_WRITE
|
||||||
|
),
|
||||||
|
mesh(),
|
||||||
|
T0_,
|
||||||
|
zeroGradientFvPatchScalarField::typeName
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
tresult().correctBoundaryConditions();
|
||||||
|
|
||||||
|
return tresult;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// ************************************************************************* //
|
// ************************************************************************* //
|
||||||
|
|
|
@ -64,6 +64,12 @@ class constantThermal
|
||||||
//- Thermal conductivity
|
//- Thermal conductivity
|
||||||
dimensionedScalar k_;
|
dimensionedScalar k_;
|
||||||
|
|
||||||
|
//- Thermal expansion coefficient
|
||||||
|
dimensionedScalar alpha_;
|
||||||
|
|
||||||
|
//- Reference temperature
|
||||||
|
dimensionedScalar T0_;
|
||||||
|
|
||||||
|
|
||||||
// Private Member Functions
|
// Private Member Functions
|
||||||
|
|
||||||
|
@ -109,6 +115,12 @@ public:
|
||||||
//- Return thermal conductivity
|
//- Return thermal conductivity
|
||||||
virtual tmp<volScalarField> k() const;
|
virtual tmp<volScalarField> k() const;
|
||||||
|
|
||||||
|
//- Return thermal expansion coefficient
|
||||||
|
virtual tmp<volScalarField> alpha() const;
|
||||||
|
|
||||||
|
//- Return reference temperature
|
||||||
|
virtual tmp<volScalarField> T0() const;
|
||||||
|
|
||||||
virtual void correct()
|
virtual void correct()
|
||||||
{}
|
{}
|
||||||
};
|
};
|
||||||
|
|
|
@ -109,6 +109,7 @@ void Foam::multiMaterialThermal::readLaws
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Foam::multiMaterialThermal::checkLaws() const
|
void Foam::multiMaterialThermal::checkLaws() const
|
||||||
{
|
{
|
||||||
const PtrList<thermalLaw>& laws = *this;
|
const PtrList<thermalLaw>& laws = *this;
|
||||||
|
@ -173,6 +174,7 @@ Foam::multiMaterialThermal::multiMaterialThermal
|
||||||
checkLaws();
|
checkLaws();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Construct from dictionary and create default material field
|
// Construct from dictionary and create default material field
|
||||||
Foam::multiMaterialThermal::multiMaterialThermal
|
Foam::multiMaterialThermal::multiMaterialThermal
|
||||||
(
|
(
|
||||||
|
@ -244,6 +246,7 @@ Foam::tmp<Foam::volScalarField> Foam::multiMaterialThermal::rho() const
|
||||||
return tresult;
|
return tresult;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Foam::tmp<Foam::volScalarField> Foam::multiMaterialThermal::C() const
|
Foam::tmp<Foam::volScalarField> Foam::multiMaterialThermal::C() const
|
||||||
{
|
{
|
||||||
tmp<volScalarField> tresult
|
tmp<volScalarField> tresult
|
||||||
|
@ -310,6 +313,78 @@ Foam::tmp<Foam::volScalarField> Foam::multiMaterialThermal::k() const
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Foam::tmp<Foam::volScalarField> Foam::multiMaterialThermal::alpha() const
|
||||||
|
{
|
||||||
|
tmp<volScalarField> tresult
|
||||||
|
(
|
||||||
|
new volScalarField
|
||||||
|
(
|
||||||
|
IOobject
|
||||||
|
(
|
||||||
|
"alpha",
|
||||||
|
mesh().time().timeName(),
|
||||||
|
mesh(),
|
||||||
|
IOobject::NO_READ,
|
||||||
|
IOobject::NO_WRITE
|
||||||
|
),
|
||||||
|
mesh(),
|
||||||
|
dimensionedScalar("zeroE", dimless/dimTemperature, 0),
|
||||||
|
zeroGradientFvPatchScalarField::typeName
|
||||||
|
)
|
||||||
|
);
|
||||||
|
volScalarField& result = tresult();
|
||||||
|
|
||||||
|
// Accumulate data for all fields
|
||||||
|
const PtrList<thermalLaw>& laws = *this;
|
||||||
|
|
||||||
|
forAll (laws, lawI)
|
||||||
|
{
|
||||||
|
result.internalField() +=
|
||||||
|
indicator(lawI)*laws[lawI].alpha()().internalField();
|
||||||
|
}
|
||||||
|
|
||||||
|
result.correctBoundaryConditions();
|
||||||
|
|
||||||
|
return tresult;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Foam::tmp<Foam::volScalarField> Foam::multiMaterialThermal::T0() const
|
||||||
|
{
|
||||||
|
tmp<volScalarField> tresult
|
||||||
|
(
|
||||||
|
new volScalarField
|
||||||
|
(
|
||||||
|
IOobject
|
||||||
|
(
|
||||||
|
"T0",
|
||||||
|
mesh().time().timeName(),
|
||||||
|
mesh(),
|
||||||
|
IOobject::NO_READ,
|
||||||
|
IOobject::NO_WRITE
|
||||||
|
),
|
||||||
|
mesh(),
|
||||||
|
dimensionedScalar("zeroT0", dimTemperature, 0),
|
||||||
|
zeroGradientFvPatchScalarField::typeName
|
||||||
|
)
|
||||||
|
);
|
||||||
|
volScalarField& result = tresult();
|
||||||
|
|
||||||
|
// Accumulate data for all fields
|
||||||
|
const PtrList<thermalLaw>& laws = *this;
|
||||||
|
|
||||||
|
forAll (laws, lawI)
|
||||||
|
{
|
||||||
|
result.internalField() +=
|
||||||
|
indicator(lawI)*laws[lawI].T0()().internalField();
|
||||||
|
}
|
||||||
|
|
||||||
|
result.correctBoundaryConditions();
|
||||||
|
|
||||||
|
return tresult;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void Foam::multiMaterialThermal::correct()
|
void Foam::multiMaterialThermal::correct()
|
||||||
{
|
{
|
||||||
PtrList<thermalLaw>& laws = *this;
|
PtrList<thermalLaw>& laws = *this;
|
||||||
|
|
|
@ -66,6 +66,7 @@ class multiMaterialThermal
|
||||||
//- Calculate indicator field given index
|
//- Calculate indicator field given index
|
||||||
tmp<volScalarField> indicator(const label index) const;
|
tmp<volScalarField> indicator(const label index) const;
|
||||||
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
// Protected data
|
// Protected data
|
||||||
|
@ -73,6 +74,7 @@ protected:
|
||||||
//- Material indicator field
|
//- Material indicator field
|
||||||
volScalarField materials_;
|
volScalarField materials_;
|
||||||
|
|
||||||
|
|
||||||
// Protected member functions
|
// Protected member functions
|
||||||
|
|
||||||
//- Check that the laws and the material field are okay
|
//- Check that the laws and the material field are okay
|
||||||
|
@ -113,6 +115,7 @@ public:
|
||||||
const scalar defaultMaterial
|
const scalar defaultMaterial
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
// Destructor
|
// Destructor
|
||||||
|
|
||||||
virtual ~multiMaterialThermal();
|
virtual ~multiMaterialThermal();
|
||||||
|
@ -129,6 +132,12 @@ public:
|
||||||
//- Return thermal conductivity
|
//- Return thermal conductivity
|
||||||
virtual tmp<volScalarField> k() const;
|
virtual tmp<volScalarField> k() const;
|
||||||
|
|
||||||
|
//- Return thermal expansion coefficient
|
||||||
|
virtual tmp<volScalarField> alpha() const;
|
||||||
|
|
||||||
|
//- Return reference temperature
|
||||||
|
virtual tmp<volScalarField> T0() const;
|
||||||
|
|
||||||
//- Correct the rheological model
|
//- Correct the rheological model
|
||||||
virtual void correct();
|
virtual void correct();
|
||||||
};
|
};
|
||||||
|
|
|
@ -54,13 +54,13 @@ Foam::multiMaterialZonesThermal::multiMaterialZonesThermal
|
||||||
PtrList<thermalLaw>& laws = *this;
|
PtrList<thermalLaw>& laws = *this;
|
||||||
forAll (laws, lawI)
|
forAll (laws, lawI)
|
||||||
{
|
{
|
||||||
wordList zones (lawEntries[lawI].dict().lookup("zones"));
|
const wordList zones(lawEntries[lawI].dict().lookup("zones"));
|
||||||
|
|
||||||
forAll(zones, zoneI)
|
forAll(zones, zoneI)
|
||||||
{
|
{
|
||||||
const label zoneID = mesh().cellZones().findZoneID(zones[zoneI]);
|
const label zoneID = mesh().cellZones().findZoneID(zones[zoneI]);
|
||||||
|
|
||||||
if ( zoneID < 0 )
|
if (zoneID < 0)
|
||||||
{
|
{
|
||||||
FatalErrorIn
|
FatalErrorIn
|
||||||
(
|
(
|
||||||
|
|
|
@ -61,6 +61,7 @@ class multiMaterialZonesThermal
|
||||||
//- Disallow default bitwise assignment
|
//- Disallow default bitwise assignment
|
||||||
void operator=(const multiMaterialZonesThermal&);
|
void operator=(const multiMaterialZonesThermal&);
|
||||||
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
//- Runtime type information
|
//- Runtime type information
|
||||||
|
|
|
@ -44,7 +44,7 @@ autoPtr<thermalLaw> thermalLaw::New
|
||||||
const dictionary& dict
|
const dictionary& dict
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
word rheoTypeName = dict.lookup("type");
|
const word rheoTypeName = dict.lookup("type");
|
||||||
|
|
||||||
Info<< "Selecting thermal model " << rheoTypeName << endl;
|
Info<< "Selecting thermal model " << rheoTypeName << endl;
|
||||||
|
|
||||||
|
@ -64,7 +64,7 @@ autoPtr<thermalLaw> thermalLaw::New
|
||||||
) << "Unknown thermalLaw type "
|
) << "Unknown thermalLaw type "
|
||||||
<< rheoTypeName << endl << endl
|
<< rheoTypeName << endl << endl
|
||||||
<< "Valid thermalLaws are : " << endl
|
<< "Valid thermalLaws are : " << endl
|
||||||
<< dictionaryConstructorTablePtr_->toc()
|
<< dictionaryConstructorTablePtr_->sortedToc()
|
||||||
<< exit(FatalIOError);
|
<< exit(FatalIOError);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -83,6 +83,7 @@ protected:
|
||||||
return T_.mesh();
|
return T_.mesh();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
//- Runtime type information
|
//- Runtime type information
|
||||||
|
@ -156,6 +157,12 @@ public:
|
||||||
//- Return thermal conductivity
|
//- Return thermal conductivity
|
||||||
virtual tmp<volScalarField> k() const = 0;
|
virtual tmp<volScalarField> k() const = 0;
|
||||||
|
|
||||||
|
//- Return thermal expansion coefficient
|
||||||
|
virtual tmp<volScalarField> alpha() const = 0;
|
||||||
|
|
||||||
|
//- Return reference temperature
|
||||||
|
virtual tmp<volScalarField> T0() const = 0;
|
||||||
|
|
||||||
//- Correct the thermal model
|
//- Correct the thermal model
|
||||||
virtual void correct() = 0;
|
virtual void correct() = 0;
|
||||||
};
|
};
|
||||||
|
|
|
@ -118,9 +118,10 @@ void thermalModel::modifyResistance
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
tmp<fvScalarMatrix> thermalModel::laplacian(volScalarField& T)
|
tmp<fvScalarMatrix> thermalModel::laplacian(volScalarField& T)
|
||||||
{
|
{
|
||||||
word kScheme ("laplacian(k,T)");
|
const word kScheme("laplacian(k,T)");
|
||||||
|
|
||||||
surfaceScalarField kf = fvc::interpolate(lawPtr_->k());
|
surfaceScalarField kf = fvc::interpolate(lawPtr_->k());
|
||||||
|
|
||||||
|
@ -128,10 +129,11 @@ tmp<fvScalarMatrix> thermalModel::laplacian(volScalarField& T)
|
||||||
|
|
||||||
return tmp<fvScalarMatrix>
|
return tmp<fvScalarMatrix>
|
||||||
(
|
(
|
||||||
new fvScalarMatrix( fvm::laplacian(kf, T, kScheme) )
|
new fvScalarMatrix(fvm::laplacian(kf, T, kScheme))
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
tmp<volScalarField> thermalModel::S() const
|
tmp<volScalarField> thermalModel::S() const
|
||||||
{
|
{
|
||||||
tmp<volScalarField> tsource
|
tmp<volScalarField> tsource
|
||||||
|
@ -155,15 +157,17 @@ tmp<volScalarField> thermalModel::S() const
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
volScalarField& source = tsource();
|
||||||
|
|
||||||
forAll(sourcePtr_, sourceI)
|
forAll(sourcePtr_, sourceI)
|
||||||
{
|
{
|
||||||
sourcePtr_[sourceI].addSource(tsource());
|
sourcePtr_[sourceI].addSource(source);
|
||||||
}
|
}
|
||||||
|
|
||||||
return tsource;
|
return tsource;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool thermalModel::read()
|
bool thermalModel::read()
|
||||||
{
|
{
|
||||||
if (regIOobject::read())
|
if (regIOobject::read())
|
||||||
|
|
|
@ -76,6 +76,7 @@ class thermalModel
|
||||||
//- Thermal Source
|
//- Thermal Source
|
||||||
PtrList<thermalSource> sourcePtr_;
|
PtrList<thermalSource> sourcePtr_;
|
||||||
|
|
||||||
|
|
||||||
// Private Member Functions
|
// Private Member Functions
|
||||||
|
|
||||||
//- Disallow copy construct
|
//- Disallow copy construct
|
||||||
|
@ -128,6 +129,18 @@ public:
|
||||||
return lawPtr_->k();
|
return lawPtr_->k();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//- Return thermal expansion coefficient
|
||||||
|
tmp<volScalarField> alpha() const
|
||||||
|
{
|
||||||
|
return lawPtr_->alpha();
|
||||||
|
}
|
||||||
|
|
||||||
|
//- Return reference temperature
|
||||||
|
tmp<volScalarField> T0() const
|
||||||
|
{
|
||||||
|
return lawPtr_->T0();
|
||||||
|
}
|
||||||
|
|
||||||
//- Add resistance for gaps
|
//- Add resistance for gaps
|
||||||
void modifyResistance(surfaceScalarField&) const;
|
void modifyResistance(surfaceScalarField&) const;
|
||||||
|
|
||||||
|
|
|
@ -2930,15 +2930,19 @@ Foam::label Foam::polyhedralRefinement::faceConsistentRefinement
|
||||||
const label curOwnLevel =
|
const label curOwnLevel =
|
||||||
cellsToRefine[own] ? cellLevel_[own] + 1 : cellLevel_[own];
|
cellsToRefine[own] ? cellLevel_[own] + 1 : cellLevel_[own];
|
||||||
|
|
||||||
if (neiLevel[i] > (curOwnLevel + 1))
|
// Note: we are using more stringent 1:1 consistency across coupled
|
||||||
|
// boundaries in order to simplify handling of edge based consistency
|
||||||
|
// checks for parallel runs
|
||||||
|
if (neiLevel[i] > curOwnLevel)
|
||||||
{
|
{
|
||||||
// Neighbour level is higher than owner level + 1, owner must be
|
// Neighbour level is higher than owner level, owner must be
|
||||||
// marked for refinement
|
// marked for refinement
|
||||||
cellsToRefine[own] = true;
|
cellsToRefine[own] = true;
|
||||||
++nAddCells;
|
++nAddCells;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Note: other possibility (that owner level is higher than neighbour
|
// Note: other possibility (that owner level is higher than neighbour
|
||||||
// level + 1) is taken into account on the other side automatically
|
// level) is taken into account on the other side automatically
|
||||||
}
|
}
|
||||||
|
|
||||||
// Return number of added cells
|
// Return number of added cells
|
||||||
|
@ -2946,7 +2950,7 @@ Foam::label Foam::polyhedralRefinement::faceConsistentRefinement
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Foam::label Foam::polyhedralRefinement::pointConsistentRefinement
|
Foam::label Foam::polyhedralRefinement::edgeConsistentRefinement
|
||||||
(
|
(
|
||||||
boolList& cellsToRefine
|
boolList& cellsToRefine
|
||||||
) const
|
) const
|
||||||
|
@ -2954,90 +2958,75 @@ Foam::label Foam::polyhedralRefinement::pointConsistentRefinement
|
||||||
// Count number of cells that will be added
|
// Count number of cells that will be added
|
||||||
label nAddCells = 0;
|
label nAddCells = 0;
|
||||||
|
|
||||||
// Maximum surrounding cell refinement level for each point
|
// Algorithm: loop over all edges and visit all unique cell pairs sharing
|
||||||
labelList maxRefLevel(mesh_.nPoints(), 0);
|
// this particular edge. Then, ensure 2:1 edge consistency by marking
|
||||||
|
// cell with lower level for refinement
|
||||||
|
|
||||||
// Get point cells
|
// Get edge cells
|
||||||
const labelListList& meshPointCells = mesh_.pointCells();
|
const labelListList& meshEdgeCells = mesh_.edgeCells();
|
||||||
|
|
||||||
// Loop through all points and collect maximum point level for each point
|
// Loop through all mesh edges
|
||||||
forAll (maxRefLevel, pointI)
|
forAll (meshEdgeCells, edgeI)
|
||||||
{
|
{
|
||||||
// Get the cells for this point
|
// Get current edge cells
|
||||||
const labelList& curCells = meshPointCells[pointI];
|
const labelList& curEdgeCells = meshEdgeCells[edgeI];
|
||||||
|
|
||||||
// Get reference to maximum pooint level for this point
|
// Loop through all edge cells
|
||||||
label& curMaxPointLevel = maxRefLevel[pointI];
|
forAll (curEdgeCells, i)
|
||||||
|
|
||||||
// Find maximum refinement level for this point
|
|
||||||
forAll (curCells, i)
|
|
||||||
{
|
{
|
||||||
// Get cell index and "future" cell level
|
// Get first cell index
|
||||||
const label& curCellI = curCells[i];
|
const label& cellI = curEdgeCells[i];
|
||||||
const label curCellLevel =
|
|
||||||
cellsToRefine[curCellI]
|
|
||||||
? cellLevel_[curCellI] + 1
|
|
||||||
: cellLevel_[curCellI];
|
|
||||||
|
|
||||||
// Update maximum point level if the curCellLevel is higher
|
// Loop through remaining edge cells
|
||||||
curMaxPointLevel = max(curMaxPointLevel, curCellLevel);
|
for (label j = i + 1; j < curEdgeCells.size(); ++j)
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Sync maximum refinement level across coupled boundaries
|
|
||||||
syncTools::syncPointList
|
|
||||||
(
|
|
||||||
mesh_,
|
|
||||||
maxRefLevel,
|
|
||||||
maxEqOp<label>(),
|
|
||||||
0, // Null value
|
|
||||||
true // Apply separation for parallel cyclics
|
|
||||||
);
|
|
||||||
|
|
||||||
// Now that the levels are synced, go through all points and add cells to
|
|
||||||
// refine
|
|
||||||
forAll (maxRefLevel, pointI)
|
|
||||||
{
|
|
||||||
// Get the cells for this point
|
|
||||||
const labelList& curCells = meshPointCells[pointI];
|
|
||||||
|
|
||||||
// Loop through these point cells and set cells for refinement which
|
|
||||||
// would end up having refinement level smaller than maximum level - 1
|
|
||||||
forAll (curCells, i)
|
|
||||||
{
|
|
||||||
// Get cell index, reference to refinement flag and "future" cell
|
|
||||||
// level
|
|
||||||
const label& curCellI = curCells[i];
|
|
||||||
bool& willBeRefined = cellsToRefine[curCellI];
|
|
||||||
const label curCellLevel =
|
|
||||||
willBeRefined
|
|
||||||
? cellLevel_[curCellI] + 1
|
|
||||||
: cellLevel_[curCellI];
|
|
||||||
|
|
||||||
if (curCellLevel < maxRefLevel[pointI] - 1)
|
|
||||||
{
|
{
|
||||||
if (!willBeRefined)
|
// Get second cell index
|
||||||
|
const label& cellJ = curEdgeCells[j];
|
||||||
|
|
||||||
|
// Get levels of the two cells. If the cell is marked for
|
||||||
|
// refinement, the level is current level + 1, otherwise it is
|
||||||
|
// equal to the current level
|
||||||
|
|
||||||
|
// Note: cellsToRefine flag for both cellI and cellJ might
|
||||||
|
// change, this is why we need to recalculate cellI level here
|
||||||
|
const label cellILevel =
|
||||||
|
cellsToRefine[cellI]
|
||||||
|
? cellLevel_[cellI] + 1
|
||||||
|
: cellLevel_[cellI];
|
||||||
|
|
||||||
|
const label cellJLevel =
|
||||||
|
cellsToRefine[cellJ]
|
||||||
|
? cellLevel_[cellJ] + 1
|
||||||
|
: cellLevel_[cellJ];
|
||||||
|
|
||||||
|
if (cellILevel > cellJLevel + 1)
|
||||||
{
|
{
|
||||||
// Cell has not been marked for refinement, mark the cell for
|
// Level of cellI is higher than level of cellJ + 1, cellJ
|
||||||
// refinement and increment the counter
|
// must be marked for refinement
|
||||||
willBeRefined = true;
|
cellsToRefine[cellJ] = true;
|
||||||
++nAddCells;
|
++nAddCells;
|
||||||
}
|
}
|
||||||
else
|
else if (cellJLevel > cellILevel + 1)
|
||||||
{
|
{
|
||||||
FatalErrorIn
|
// Level of cellJ is higher than level of cellI + 1, cellI
|
||||||
(
|
// must be marked for refinement
|
||||||
"label polyhedralRefinement::pointConsistentRefinement"
|
cellsToRefine[cellI] = true;
|
||||||
"(boolList cellsToRefine) const"
|
++nAddCells;
|
||||||
) << "Cell is marked for refinement, but the 4:1 point"
|
|
||||||
<< " consistency cannot be ensured." << nl
|
|
||||||
<< "Something went wrong before this step."
|
|
||||||
<< endl;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Note: in order to avoid very difficult and time-consuming parallelisation
|
||||||
|
// of edge cell connectivity and edge cell values, we enforce a more
|
||||||
|
// stringent face-based consistency across processor boundaries. Basically,
|
||||||
|
// if a face-based consistency of 1:1 (not 2:1 as for ordinary faces) is
|
||||||
|
// ensured, the edge-based consistency becomes a local operation (I'm not
|
||||||
|
// 100% sure to be honest since there are countless variants when dealing
|
||||||
|
// with arbitrary polyhedral cells).
|
||||||
|
// See faceConsistentRefinement for details. VV, 17/Apr/2018.
|
||||||
|
|
||||||
|
// Return number of added cells
|
||||||
return nAddCells;
|
return nAddCells;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3072,7 +3061,7 @@ Foam::label Foam::polyhedralRefinement::faceConsistentUnrefinement
|
||||||
const label neiLevel =
|
const label neiLevel =
|
||||||
cellsToUnrefine[nei] ? cellLevel_[nei] - 1 : cellLevel_[nei];
|
cellsToUnrefine[nei] ? cellLevel_[nei] - 1 : cellLevel_[nei];
|
||||||
|
|
||||||
if (ownLevel < (neiLevel -1))
|
if (ownLevel < (neiLevel - 1))
|
||||||
{
|
{
|
||||||
// Owner level is smaller than neighbour level - 1, we must not
|
// Owner level is smaller than neighbour level - 1, we must not
|
||||||
// unrefine owner
|
// unrefine owner
|
||||||
|
@ -3090,7 +3079,10 @@ Foam::label Foam::polyhedralRefinement::faceConsistentUnrefinement
|
||||||
<< "Owner: " << own << ", neighbour: " << nei
|
<< "Owner: " << own << ", neighbour: " << nei
|
||||||
<< nl
|
<< nl
|
||||||
<< "Owner level: " << ownLevel
|
<< "Owner level: " << ownLevel
|
||||||
<< ", neighbour level: " << neiLevel
|
<< ", neighbour level: " << neiLevel << nl
|
||||||
|
<< "This is probably because the refinement and "
|
||||||
|
<< "unrefinement regions are very close." << nl
|
||||||
|
<< "Try increasing nUnrefinementBufferLayers. "
|
||||||
<< abort(FatalError);
|
<< abort(FatalError);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3115,7 +3107,10 @@ Foam::label Foam::polyhedralRefinement::faceConsistentUnrefinement
|
||||||
<< "Owner: " << own << ", neighbour: " << nei
|
<< "Owner: " << own << ", neighbour: " << nei
|
||||||
<< nl
|
<< nl
|
||||||
<< "Owner level: " << ownLevel
|
<< "Owner level: " << ownLevel
|
||||||
<< ", neighbour level: " << neiLevel
|
<< ", neighbour level: " << neiLevel << nl
|
||||||
|
<< "This is probably because the refinement and "
|
||||||
|
<< "unrefinement regions are very close." << nl
|
||||||
|
<< "Try increasing nUnrefinementBufferLayers. "
|
||||||
<< abort(FatalError);
|
<< abort(FatalError);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3150,9 +3145,12 @@ Foam::label Foam::polyhedralRefinement::faceConsistentUnrefinement
|
||||||
const label curOwnLevel =
|
const label curOwnLevel =
|
||||||
cellsToUnrefine[own] ? cellLevel_[own] - 1 : cellLevel_[own];
|
cellsToUnrefine[own] ? cellLevel_[own] - 1 : cellLevel_[own];
|
||||||
|
|
||||||
if (curOwnLevel < (neiLevel[i] - 1))
|
// Note: we are using more stringent 1:1 consistency across coupled
|
||||||
|
// boundaries in order to simplify handling of edge based consistency
|
||||||
|
// checkes for parallel runs
|
||||||
|
if (curOwnLevel < neiLevel[i])
|
||||||
{
|
{
|
||||||
// Owner level is smaller than neighbour level - 1, we must not
|
// Owner level is smaller than neighbour level, we must not
|
||||||
// unrefine owner
|
// unrefine owner
|
||||||
|
|
||||||
// Check whether the cell has not been marked for unrefinement
|
// Check whether the cell has not been marked for unrefinement
|
||||||
|
@ -3168,7 +3166,10 @@ Foam::label Foam::polyhedralRefinement::faceConsistentUnrefinement
|
||||||
<< "Owner: " << own
|
<< "Owner: " << own
|
||||||
<< nl
|
<< nl
|
||||||
<< "Owner level: " << curOwnLevel
|
<< "Owner level: " << curOwnLevel
|
||||||
<< ", neighbour level: " << neiLevel[i]
|
<< ", neighbour level: " << neiLevel[i] << nl
|
||||||
|
<< "This is probably because the refinement and "
|
||||||
|
<< "unrefinement regions are very close." << nl
|
||||||
|
<< "Try increasing nUnrefinementBufferLayers. "
|
||||||
<< abort(FatalError);
|
<< abort(FatalError);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3177,7 +3178,7 @@ Foam::label Foam::polyhedralRefinement::faceConsistentUnrefinement
|
||||||
}
|
}
|
||||||
|
|
||||||
// Note: other possibility (that neighbour level is smaller than owner
|
// Note: other possibility (that neighbour level is smaller than owner
|
||||||
// level - 1) is taken into account on the other side automatically
|
// level) is taken into account on the other side automatically
|
||||||
}
|
}
|
||||||
|
|
||||||
// Return number of local cells removed from unrefinement
|
// Return number of local cells removed from unrefinement
|
||||||
|
@ -3185,100 +3186,129 @@ Foam::label Foam::polyhedralRefinement::faceConsistentUnrefinement
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Foam::label Foam::polyhedralRefinement::pointConsistentUnrefinement
|
Foam::label Foam::polyhedralRefinement::edgeConsistentUnrefinement
|
||||||
(
|
(
|
||||||
boolList& cellsToUnrefine
|
boolList& cellsToUnrefine
|
||||||
) const
|
) const
|
||||||
{
|
{
|
||||||
// Count number of cells removed from unrefinement
|
// Count number of cells that will be removed
|
||||||
label nRemCells = 0;
|
label nRemCells = 0;
|
||||||
|
|
||||||
// Minimum cell refinement level for each point. Note: initialise with
|
// Algorithm: loop over all edges and visit all unique cell pairs sharing
|
||||||
// labelMax
|
// this particular edge. Then, ensure 2:1 edge consistency by protecting the
|
||||||
labelList minRefLevel(mesh_.nPoints(), labelMax);
|
// cell with lower level from unrefinement
|
||||||
|
|
||||||
// Get point cells
|
// Get edge cells
|
||||||
const labelListList& meshPointCells = mesh_.pointCells();
|
const labelListList& meshEdgeCells = mesh_.edgeCells();
|
||||||
|
|
||||||
// Loop through all points and collect minimum point level for each point
|
// Loop through all mesh edges
|
||||||
forAll (minRefLevel, pointI)
|
forAll (meshEdgeCells, edgeI)
|
||||||
{
|
{
|
||||||
// Get the cell for this point
|
// Get current edge cells
|
||||||
const labelList& curCells = meshPointCells[pointI];
|
const labelList& curEdgeCells = meshEdgeCells[edgeI];
|
||||||
|
|
||||||
// Get reference to minimum point level for this point
|
// Loop through all edge cells
|
||||||
label& curMinPointLevel = minRefLevel[pointI];
|
forAll (curEdgeCells, i)
|
||||||
|
|
||||||
// Find minimum refinement level for this point
|
|
||||||
forAll (curCells, i)
|
|
||||||
{
|
{
|
||||||
// Get cell index and "future" cell level
|
// Get first cell index
|
||||||
const label& curCellI = curCells[i];
|
const label& cellI = curEdgeCells[i];
|
||||||
const label curCellLevel =
|
|
||||||
cellsToUnrefine[curCellI]
|
|
||||||
? cellLevel_[curCellI] - 1
|
|
||||||
: cellLevel_[curCellI];
|
|
||||||
|
|
||||||
// Update minimum point level if the curCellLevel is smaller
|
// Loop through remaining edge cells
|
||||||
curMinPointLevel = min(curMinPointLevel, curCellLevel);
|
for (label j = i + 1; j < curEdgeCells.size(); ++j)
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Sync minimum refinement level across coupled boundaries
|
|
||||||
syncTools::syncPointList
|
|
||||||
(
|
|
||||||
mesh_,
|
|
||||||
minRefLevel,
|
|
||||||
minEqOp<label>(),
|
|
||||||
0, // Null value
|
|
||||||
true // Apply separation for parallel cyclics
|
|
||||||
);
|
|
||||||
|
|
||||||
// Now that the levels are synced, go through all points and protect some
|
|
||||||
// cells from unrefinement
|
|
||||||
forAll (minRefLevel, pointI)
|
|
||||||
{
|
|
||||||
// Get the cells for this point
|
|
||||||
const labelList& curCells = meshPointCells[pointI];
|
|
||||||
|
|
||||||
// Loop through these point cells and protected cells from unrefinement
|
|
||||||
// which would end up having refinement level greater than level + 1
|
|
||||||
forAll (curCells, i)
|
|
||||||
{
|
|
||||||
// Get cell index, reference to unrefinement flag and "future" cell
|
|
||||||
// level
|
|
||||||
const label& curCellI = curCells[i];
|
|
||||||
bool& willBeUnrefined = cellsToUnrefine[curCellI];
|
|
||||||
const label curCellLevel =
|
|
||||||
willBeUnrefined
|
|
||||||
? cellLevel_[curCellI] - 1
|
|
||||||
: cellLevel_[curCellI];
|
|
||||||
|
|
||||||
if (curCellLevel > minRefLevel[pointI] + 1)
|
|
||||||
{
|
{
|
||||||
if (willBeUnrefined)
|
// Get second cell index
|
||||||
|
const label& cellJ = curEdgeCells[j];
|
||||||
|
|
||||||
|
// Get levels of the two cells. If the cell is marked for
|
||||||
|
// unrefinement, the level is current level - 1, otherwise it is
|
||||||
|
// equal to the current level
|
||||||
|
|
||||||
|
// Note: cellsToUnrefine flag for both cellI and cellJ might
|
||||||
|
// change, this is why we need to recalculate cellI level here
|
||||||
|
const label cellILevel =
|
||||||
|
cellsToUnrefine[cellI]
|
||||||
|
? cellLevel_[cellI] - 1
|
||||||
|
: cellLevel_[cellI];
|
||||||
|
|
||||||
|
const label cellJLevel =
|
||||||
|
cellsToUnrefine[cellJ]
|
||||||
|
? cellLevel_[cellJ] - 1
|
||||||
|
: cellLevel_[cellJ];
|
||||||
|
|
||||||
|
if (cellILevel < cellJLevel - 1)
|
||||||
{
|
{
|
||||||
// Cell has been marked for unrefinement, protect the cell
|
// Level of cellI is smaller than level of cellJ - 1, cellI
|
||||||
// from unrefinement and increment the counter
|
// must be protected from unrefinement
|
||||||
willBeUnrefined = false;
|
|
||||||
|
// Check whether the cell has not been marked for
|
||||||
|
// unrefinement
|
||||||
|
if (!cellsToUnrefine[cellI])
|
||||||
|
{
|
||||||
|
FatalErrorIn
|
||||||
|
(
|
||||||
|
"label polyhedralRefinement::"
|
||||||
|
"edgeConsistentUnrefinement"
|
||||||
|
"(boolList& cellsToUnrefine)"
|
||||||
|
) << "Cell not marked for unrefinement, indicating a"
|
||||||
|
<< " previous unnoticed problem with unrefinement."
|
||||||
|
<< nl
|
||||||
|
<< "cellI: " << cellI << ", cellJ: " << cellJ
|
||||||
|
<< nl
|
||||||
|
<< "Level of cellI: " << cellILevel
|
||||||
|
<< ", level of cellJ: " << cellJLevel << nl
|
||||||
|
<< "This is probably because the refinement and "
|
||||||
|
<< "unrefinement regions are very close." << nl
|
||||||
|
<< "Try increasing nUnrefinementBufferLayers. "
|
||||||
|
<< abort(FatalError);
|
||||||
|
}
|
||||||
|
|
||||||
|
cellsToUnrefine[cellI] = false;
|
||||||
++nRemCells;
|
++nRemCells;
|
||||||
}
|
}
|
||||||
else
|
else if (cellJLevel < cellILevel - 1)
|
||||||
{
|
{
|
||||||
FatalErrorIn
|
// Level of cellJ is smaller than level of cellI - 1, cellJ
|
||||||
(
|
// must be protected from unrefinement
|
||||||
"label polyhedralRefinement::"
|
|
||||||
"pointConsistentUnrefinement"
|
// Check whether the cell has not been marked for
|
||||||
"(boolList cellsToRefine) const"
|
// unrefinement
|
||||||
) << "Cell is not marked for unrefinement, but the 4:1"
|
if (!cellsToUnrefine[cellJ])
|
||||||
<< " point consistency cannot be ensured." << nl
|
{
|
||||||
<< "Something went wrong before this step."
|
FatalErrorIn
|
||||||
<< endl;
|
(
|
||||||
|
"label polyhedralRefinement::"
|
||||||
|
"edgeConsistentUnrefinement"
|
||||||
|
"(boolList& cellsToUnrefine)"
|
||||||
|
) << "Cell not marked for unrefinement, indicating a"
|
||||||
|
<< " previous unnoticed problem with unrefinement."
|
||||||
|
<< nl
|
||||||
|
<< "cellI: " << cellI << ", cellJ: " << cellJ
|
||||||
|
<< nl
|
||||||
|
<< "Level of cellI: " << cellILevel
|
||||||
|
<< ", level of cellJ: " << cellJLevel << nl
|
||||||
|
<< "This is probably because the refinement and "
|
||||||
|
<< "unrefinement regions are very close." << nl
|
||||||
|
<< "Try increasing nUnrefinementBufferLayers. "
|
||||||
|
<< abort(FatalError);
|
||||||
|
}
|
||||||
|
|
||||||
|
cellsToUnrefine[cellJ] = false;
|
||||||
|
++nRemCells;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Note: in order to avoid very difficult and time-consuming parallelisation
|
||||||
|
// of edge cell connectivity and edge cell values, we enforce a more
|
||||||
|
// stringent face-based consistency across processor boundaries. Basically,
|
||||||
|
// if a face-based consistency of 1:1 (not 2:1 as for ordinary faces) is
|
||||||
|
// ensured, the edge-based consistency becomes a local operation (I'm not
|
||||||
|
// 100% sure to be honest whether this is true all the time since there are
|
||||||
|
// countless variants when dealing with arbitrary polyhedral cells).
|
||||||
|
// See faceConsistentRefinement for details. VV, 3/Apr/2018.
|
||||||
|
|
||||||
|
// Return number of removed cells
|
||||||
return nRemCells;
|
return nRemCells;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3328,11 +3358,18 @@ Foam::polyhedralRefinement::polyhedralRefinement
|
||||||
faceRemover_(mesh_, GREAT), // Merge boundary faces wherever possible
|
faceRemover_(mesh_, GREAT), // Merge boundary faces wherever possible
|
||||||
maxCells_(readLabel(dict.lookup("maxCells"))),
|
maxCells_(readLabel(dict.lookup("maxCells"))),
|
||||||
maxRefinementLevel_(readLabel(dict.lookup("maxRefinementLevel"))),
|
maxRefinementLevel_(readLabel(dict.lookup("maxRefinementLevel"))),
|
||||||
pointBasedConsistency_
|
edgeBasedConsistency_
|
||||||
(
|
(
|
||||||
dict.lookupOrDefault<Switch>("pointBasedConsistency", true)
|
dict.lookupOrDefault<Switch>("edgeBasedConsistency", true)
|
||||||
),
|
),
|
||||||
nBufferLayers_(readScalar(dict.lookup("nBufferLayers")))
|
nRefinementBufferLayers_
|
||||||
|
(
|
||||||
|
readScalar(dict.lookup("nRefinementBufferLayers"))
|
||||||
|
),
|
||||||
|
nUnrefinementBufferLayers_
|
||||||
|
(
|
||||||
|
readScalar(dict.lookup("nUnrefinementBufferLayers"))
|
||||||
|
)
|
||||||
{
|
{
|
||||||
// Calculate level 0 edge length
|
// Calculate level 0 edge length
|
||||||
calcLevel0EdgeLength();
|
calcLevel0EdgeLength();
|
||||||
|
@ -3401,7 +3438,7 @@ Foam::polyhedralRefinement::polyhedralRefinement
|
||||||
|
|
||||||
// If the maximum refinementLevel is greater than 2 and the user insists on
|
// If the maximum refinementLevel is greater than 2 and the user insists on
|
||||||
// not using point based refinement strategy, issue a warning
|
// not using point based refinement strategy, issue a warning
|
||||||
if (!pointBasedConsistency_ && maxRefinementLevel_ > 2)
|
if (!edgeBasedConsistency_ && maxRefinementLevel_ > 2)
|
||||||
{
|
{
|
||||||
WarningIn
|
WarningIn
|
||||||
(
|
(
|
||||||
|
@ -3420,12 +3457,12 @@ Foam::polyhedralRefinement::polyhedralRefinement
|
||||||
<< " 8:1 point conflicts."
|
<< " 8:1 point conflicts."
|
||||||
<< nl
|
<< nl
|
||||||
<< "In order to supress this message and use point based"
|
<< "In order to supress this message and use point based"
|
||||||
<< " consistency checks, set pointBasedConsistency to true."
|
<< " consistency checks, set edgeBasedConsistency to true."
|
||||||
<< endl;
|
<< endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check number of buffer layers
|
// Check number of refinement buffer layers
|
||||||
if (nBufferLayers_ < 0)
|
if (nRefinementBufferLayers_ < 0)
|
||||||
{
|
{
|
||||||
FatalErrorIn
|
FatalErrorIn
|
||||||
(
|
(
|
||||||
|
@ -3436,11 +3473,53 @@ Foam::polyhedralRefinement::polyhedralRefinement
|
||||||
"\n const label index,"
|
"\n const label index,"
|
||||||
"\n const polyTopoChanger& mme"
|
"\n const polyTopoChanger& mme"
|
||||||
"\n)"
|
"\n)"
|
||||||
) << "Negative nBufferLayers specified."
|
) << "Negative nRefinementBufferLayers specified."
|
||||||
<< nl
|
<< nl
|
||||||
<< "This is not allowed."
|
<< "This is not allowed."
|
||||||
<< abort(FatalError);
|
<< abort(FatalError);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Check number of unrefinement buffer layers
|
||||||
|
if (nUnrefinementBufferLayers_ < 0)
|
||||||
|
{
|
||||||
|
FatalErrorIn
|
||||||
|
(
|
||||||
|
"polyhedralRefinement::polyhedralRefinement"
|
||||||
|
"\n("
|
||||||
|
"\n const word& name,"
|
||||||
|
"\n const dictionary& dict,"
|
||||||
|
"\n const label index,"
|
||||||
|
"\n const polyTopoChanger& mme"
|
||||||
|
"\n)"
|
||||||
|
) << "Negative nUnrefinementBufferLayers specified."
|
||||||
|
<< nl
|
||||||
|
<< "This is not allowed."
|
||||||
|
<< abort(FatalError);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check whether the number of unrefinement buffer layers is smaller than
|
||||||
|
// number of refinement buffer layers + 2
|
||||||
|
if (nUnrefinementBufferLayers_ < nRefinementBufferLayers_ + 2)
|
||||||
|
{
|
||||||
|
WarningIn
|
||||||
|
(
|
||||||
|
"polyhedralRefinement::polyhedralRefinement"
|
||||||
|
"\n("
|
||||||
|
"\n const word& name,"
|
||||||
|
"\n const dictionary& dict,"
|
||||||
|
"\n const label index,"
|
||||||
|
"\n const polyTopoChanger& mme"
|
||||||
|
"\n)"
|
||||||
|
) << "Using " << nUnrefinementBufferLayers_
|
||||||
|
<< " unrefinement buffer layers and " << nRefinementBufferLayers_
|
||||||
|
<< " refinement buffer layers."
|
||||||
|
<< nl
|
||||||
|
<< "Make sure that the number of unrefinement buffer layers is "
|
||||||
|
<< "at least nRefinementBufferLayers + 2" << nl
|
||||||
|
<< "in order to avoid problems with point level inconsistency when "
|
||||||
|
<< "refinement and unrefinement are performed in same iteration."
|
||||||
|
<< endl;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -3495,8 +3574,9 @@ void Foam::polyhedralRefinement::setCellsToRefine
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Extend cells across faces using a specified number of buffer layers
|
// Extend cells across faces using a specified number of refinement buffer
|
||||||
for (label i = 0; i < nBufferLayers_; ++i)
|
// layers
|
||||||
|
for (label i = 0; i < nRefinementBufferLayers_; ++i)
|
||||||
{
|
{
|
||||||
extendMarkedCellsAcrossFaces(refineCell);
|
extendMarkedCellsAcrossFaces(refineCell);
|
||||||
}
|
}
|
||||||
|
@ -3515,11 +3595,11 @@ void Foam::polyhedralRefinement::setCellsToRefine
|
||||||
// Reset counter at the beginning of each iteration
|
// Reset counter at the beginning of each iteration
|
||||||
nAddCells = 0;
|
nAddCells = 0;
|
||||||
|
|
||||||
if (pointBasedConsistency_)
|
if (edgeBasedConsistency_)
|
||||||
{
|
{
|
||||||
// Check for 4:1 point based consistent refinement. Updates
|
// Check for 4:1 edge based consistent refinement. Updates
|
||||||
// cellsToRefine and returns number of cells added in this iteration
|
// cellsToRefine and returns number of cells added in this iteration
|
||||||
nAddCells += pointConsistentRefinement(refineCell);
|
nAddCells += edgeConsistentRefinement(refineCell);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check for 2:1 face based consistent refinement. Updates cellsToRefine
|
// Check for 2:1 face based consistent refinement. Updates cellsToRefine
|
||||||
|
@ -3555,9 +3635,7 @@ void Foam::polyhedralRefinement::setCellsToRefine
|
||||||
// Transfer the contents into the data member (ordinary list)
|
// Transfer the contents into the data member (ordinary list)
|
||||||
cellsToRefine_.transfer(cellsToRefineDynamic);
|
cellsToRefine_.transfer(cellsToRefineDynamic);
|
||||||
|
|
||||||
Info<< "polyhedralRefinement::setCellsToRefine"
|
Info<< "Selected " << returnReduce(cellsToRefine_.size(), sumOp<label>())
|
||||||
<< "(const labelList& refinementCellCandidates)" << nl
|
|
||||||
<< "Selected " << returnReduce(cellsToRefine_.size(), sumOp<label>())
|
|
||||||
<< " cells to refine." << endl;
|
<< " cells to refine." << endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3708,10 +3786,9 @@ void Foam::polyhedralRefinement::setSplitPointsToUnrefine
|
||||||
protectedCell[cellsToRefine_[i]] = true;
|
protectedCell[cellsToRefine_[i]] = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Extend protected cells across points using a specified number of buffer
|
// Extend protected cells across points using a specified number of
|
||||||
// layers + 1 in order to stay far away from cells that are going to be
|
// unrefinement buffer layers
|
||||||
// refined
|
for (label i = 0; i < nUnrefinementBufferLayers_ + 2; ++i)
|
||||||
for (label i = 0; i < nBufferLayers_ + 1; ++i)
|
|
||||||
{
|
{
|
||||||
extendMarkedCellsAcrossPoints(protectedCell);
|
extendMarkedCellsAcrossPoints(protectedCell);
|
||||||
}
|
}
|
||||||
|
@ -3771,12 +3848,12 @@ void Foam::polyhedralRefinement::setSplitPointsToUnrefine
|
||||||
// Reset number of removed cells from unrefinement for this iteration
|
// Reset number of removed cells from unrefinement for this iteration
|
||||||
nRemCells = 0;
|
nRemCells = 0;
|
||||||
|
|
||||||
if (pointBasedConsistency_)
|
if (edgeBasedConsistency_)
|
||||||
{
|
{
|
||||||
// Check for 4:1 point based consistent unrefinement. Updates
|
// Check for 4:1 edge based consistent unrefinement. Updates
|
||||||
// cellsToUnrefine and returns number of removed cells from
|
// cellsToUnrefine and returns number of removed cells from
|
||||||
// unrefinement in this iteration
|
// unrefinement in this iteration
|
||||||
nRemCells += pointConsistentUnrefinement(cellsToUnrefine);
|
nRemCells += edgeConsistentUnrefinement(cellsToUnrefine);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check for 2:1 face based consistent unrefinement. Updates
|
// Check for 2:1 face based consistent unrefinement. Updates
|
||||||
|
@ -3843,9 +3920,7 @@ void Foam::polyhedralRefinement::setSplitPointsToUnrefine
|
||||||
// Transfer the contents into the data member (ordinary list)
|
// Transfer the contents into the data member (ordinary list)
|
||||||
splitPointsToUnrefine_.transfer(splitPointsToUnrefineDynamic);
|
splitPointsToUnrefine_.transfer(splitPointsToUnrefineDynamic);
|
||||||
|
|
||||||
Info<< "polyhedralRefinement::setSplitPointsToUnrefine"
|
Info<< "Selected "
|
||||||
<< "(const labelList& unrefinementPointCandidates)" << nl
|
|
||||||
<< "Selected "
|
|
||||||
<< returnReduce(splitPointsToUnrefine_.size(), sumOp<label>())
|
<< returnReduce(splitPointsToUnrefine_.size(), sumOp<label>())
|
||||||
<< " split points to unrefine." << endl;
|
<< " split points to unrefine." << endl;
|
||||||
}
|
}
|
||||||
|
@ -4063,8 +4138,9 @@ void Foam::polyhedralRefinement::write(Ostream& os) const
|
||||||
<< name() << nl
|
<< name() << nl
|
||||||
<< maxCells_ << nl
|
<< maxCells_ << nl
|
||||||
<< maxRefinementLevel_ << nl
|
<< maxRefinementLevel_ << nl
|
||||||
<< pointBasedConsistency_ << nl
|
<< edgeBasedConsistency_ << nl
|
||||||
<< nBufferLayers_ << endl;
|
<< nRefinementBufferLayers_ << nl
|
||||||
|
<< nUnrefinementBufferLayers_ << endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -4081,9 +4157,11 @@ void Foam::polyhedralRefinement::writeDict(Ostream& os) const
|
||||||
<< token::END_STATEMENT << nl
|
<< token::END_STATEMENT << nl
|
||||||
<< " maxRefinementLevel " << maxRefinementLevel_
|
<< " maxRefinementLevel " << maxRefinementLevel_
|
||||||
<< token::END_STATEMENT << nl
|
<< token::END_STATEMENT << nl
|
||||||
<< " pointBasedConsistency " << pointBasedConsistency_
|
<< " edgeBasedConsistency " << edgeBasedConsistency_
|
||||||
<< token::END_STATEMENT << nl
|
<< token::END_STATEMENT << nl
|
||||||
<< " nBufferLayers " << nBufferLayers_
|
<< " nRefinementBufferLayers " << nRefinementBufferLayers_
|
||||||
|
<< token::END_STATEMENT << nl
|
||||||
|
<< " nUnrefinementBufferLayers " << nUnrefinementBufferLayers_
|
||||||
<< token::END_STATEMENT << nl
|
<< token::END_STATEMENT << nl
|
||||||
<< " active " << active()
|
<< " active " << active()
|
||||||
<< token::END_STATEMENT << nl
|
<< token::END_STATEMENT << nl
|
||||||
|
|
|
@ -124,11 +124,17 @@ private:
|
||||||
//- Maximum number of refinement levels for a given cell
|
//- Maximum number of refinement levels for a given cell
|
||||||
label maxRefinementLevel_;
|
label maxRefinementLevel_;
|
||||||
|
|
||||||
//- Switch whether to use point based consistency on refinement
|
//- Switch whether to use edge based consistency on refinement
|
||||||
Switch pointBasedConsistency_;
|
Switch edgeBasedConsistency_;
|
||||||
|
|
||||||
//- Number of buffer layers for refinement
|
//- Number of buffer layers for refinement
|
||||||
label nBufferLayers_;
|
label nRefinementBufferLayers_;
|
||||||
|
|
||||||
|
//- Number of buffer layers for unrefinement, controlling how far
|
||||||
|
// the unrefinement region needs to be from current refinement
|
||||||
|
// region. Therefore, this should always be at least
|
||||||
|
// nRefinementBufferLayers + 2 to avoid level inconsistencies
|
||||||
|
label nUnrefinementBufferLayers_;
|
||||||
|
|
||||||
|
|
||||||
// Private Member Functions
|
// Private Member Functions
|
||||||
|
@ -357,17 +363,17 @@ private:
|
||||||
// is obtained. Returns local number of cells changed
|
// is obtained. Returns local number of cells changed
|
||||||
label faceConsistentRefinement(boolList& cellsToRefine) const;
|
label faceConsistentRefinement(boolList& cellsToRefine) const;
|
||||||
|
|
||||||
//- Updates cellsToRefine such that a point consistent 4:1 refinement
|
//- Updates cellsToRefine such that an edge consistent 4:1 refinement
|
||||||
// is obtained. Returns local number of cells changed
|
// is obtained. Returns local number of cells changed
|
||||||
label pointConsistentRefinement(boolList& cellsToRefine) const;
|
label edgeConsistentRefinement(boolList& cellsToRefine) const;
|
||||||
|
|
||||||
//- Updates cellsToUnrefine such that a face consistent 2:1
|
//- Updates cellsToUnrefine such that a face consistent 2:1
|
||||||
// unrefinement is obtained. Returns local number of cells changed
|
// unrefinement is obtained. Returns local number of cells changed
|
||||||
label faceConsistentUnrefinement(boolList& cellsToUnrefine) const;
|
label faceConsistentUnrefinement(boolList& cellsToUnrefine) const;
|
||||||
|
|
||||||
//- Updates cellsToUnrefine such that a point consistent 4:1
|
//- Updates cellsToUnrefine such that an edge consistent 4:1
|
||||||
// unrefinement is obtained. Returns local number of cells changed
|
// unrefinement is obtained. Returns local number of cells changed
|
||||||
label pointConsistentUnrefinement(boolList& cellsToUnrefine) const;
|
label edgeConsistentUnrefinement(boolList& cellsToUnrefine) const;
|
||||||
|
|
||||||
|
|
||||||
// Copy control
|
// Copy control
|
||||||
|
|
|
@ -2491,6 +2491,9 @@ Foam::autoPtr<Foam::mapPolyMesh> Foam::polyTopoChanger::changeMesh()
|
||||||
// Increment the morph index
|
// Increment the morph index
|
||||||
morphIndex_++;
|
morphIndex_++;
|
||||||
|
|
||||||
|
// Mark the mesh as changing
|
||||||
|
mesh_.changing(true);
|
||||||
|
|
||||||
return topoChangeMap;
|
return topoChangeMap;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -2504,6 +2507,9 @@ Foam::autoPtr<Foam::mapPolyMesh> Foam::polyTopoChanger::changeMesh()
|
||||||
|
|
||||||
// Sync mesh update
|
// Sync mesh update
|
||||||
mesh_.syncUpdateMesh();
|
mesh_.syncUpdateMesh();
|
||||||
|
|
||||||
|
// Mark the mesh as changing
|
||||||
|
mesh_.changing(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
return autoPtr<mapPolyMesh>(new mapPolyMesh(mesh_));
|
return autoPtr<mapPolyMesh>(new mapPolyMesh(mesh_));
|
||||||
|
|
|
@ -15,6 +15,7 @@ dynamicPolyRefinementFvMesh/dynamicPolyRefinementFvMesh.C
|
||||||
dynamicPolyRefinementFvMesh/refinementSelection/refinementSelection/refinementSelection.C
|
dynamicPolyRefinementFvMesh/refinementSelection/refinementSelection/refinementSelection.C
|
||||||
dynamicPolyRefinementFvMesh/refinementSelection/fieldBoundsRefinement/fieldBoundsRefinement.C
|
dynamicPolyRefinementFvMesh/refinementSelection/fieldBoundsRefinement/fieldBoundsRefinement.C
|
||||||
dynamicPolyRefinementFvMesh/refinementSelection/minCellVolumeRefinement/minCellVolumeRefinement.C
|
dynamicPolyRefinementFvMesh/refinementSelection/minCellVolumeRefinement/minCellVolumeRefinement.C
|
||||||
|
dynamicPolyRefinementFvMesh/refinementSelection/minCellSizeRefinement/minCellSizeRefinement.C
|
||||||
dynamicPolyRefinementFvMesh/refinementSelection/minPatchDistanceRefinement/minPatchDistanceRefinement.C
|
dynamicPolyRefinementFvMesh/refinementSelection/minPatchDistanceRefinement/minPatchDistanceRefinement.C
|
||||||
dynamicPolyRefinementFvMesh/refinementSelection/compositeRefinementSelection/compositeRefinementSelection.C
|
dynamicPolyRefinementFvMesh/refinementSelection/compositeRefinementSelection/compositeRefinementSelection.C
|
||||||
|
|
||||||
|
|
|
@ -20,8 +20,19 @@ dynamicFvMesh dynamicPolyRefinementFvMesh;
|
||||||
dynamicPolyRefinementFvMeshCoeffs
|
dynamicPolyRefinementFvMeshCoeffs
|
||||||
{
|
{
|
||||||
// Dynamic mesh procedure controls
|
// Dynamic mesh procedure controls
|
||||||
|
|
||||||
|
// Refine every refineInterval step
|
||||||
refineInterval 1;
|
refineInterval 1;
|
||||||
|
|
||||||
|
// Unrefine every unrefineInterval step
|
||||||
|
unrefineInterval 1;
|
||||||
|
|
||||||
|
// Separate refinement/unrefinement steps. In case this is switched on,
|
||||||
|
// if both refinement and unrefinement should have been performed in a
|
||||||
|
// single step, unrefinement is skipped. Switched off by default, meaning
|
||||||
|
// that it should be safe to perform both at the same time
|
||||||
|
separateUpdates false;
|
||||||
|
|
||||||
// Refinement selection criteria
|
// Refinement selection criteria
|
||||||
refinementSelection
|
refinementSelection
|
||||||
{
|
{
|
||||||
|
@ -47,11 +58,16 @@ dynamicPolyRefinementFvMeshCoeffs
|
||||||
maxRefinementLevel 3;
|
maxRefinementLevel 3;
|
||||||
|
|
||||||
// Number of buffer layers between refinement levels
|
// Number of buffer layers between refinement levels
|
||||||
nBufferLayers 1;
|
nRefinementBufferLayers 1;
|
||||||
|
|
||||||
// Whether to use point based consistency check. Needed when one allows more
|
// Number of buffer layers for unrefinement in order to run away from the
|
||||||
// than 2 refinement levels (automatically switched on in that case)
|
// region that is getting refined at the same time in order to avoid point
|
||||||
pointBasedRefinement yes;
|
// level inconsistencies
|
||||||
|
nUnrefinementBufferLayers 4;
|
||||||
|
|
||||||
|
// Whether to use edge based consistency check. Needed when one allows more
|
||||||
|
// than 2 refinement levels (automatically switched on)
|
||||||
|
edgeBasedConsistency yes;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -49,16 +49,30 @@ addToRunTimeSelectionTable
|
||||||
|
|
||||||
void Foam::dynamicPolyRefinementFvMesh::readDict()
|
void Foam::dynamicPolyRefinementFvMesh::readDict()
|
||||||
{
|
{
|
||||||
// Read and check refinement interval
|
// Read and check refinement and unrefinement intervals
|
||||||
refineInterval_ = readLabel(refinementDict_.lookup("refineInterval"));
|
refineInterval_ = readLabel(refinementDict_.lookup("refineInterval"));
|
||||||
if (refineInterval_ < 1)
|
if (refineInterval_ < 1)
|
||||||
{
|
{
|
||||||
FatalErrorIn("dynamicPolyRefinementFvMesh::readDict()")
|
FatalErrorIn("dynamicPolyRefinementFvMesh::readDict()")
|
||||||
<< "Illegal refineInterval found: " << refineInterval_ << nl
|
<< "Illegal refineInterval found: " << refineInterval_ << nl
|
||||||
<< "The refineInterval controls the refinement/unrefinement"
|
<< "The refineInterval controls the refinement"
|
||||||
<< " trigerring within a certain time step and should be > 0"
|
<< " trigerring within a certain time step and should be > 0"
|
||||||
<< exit(FatalError);
|
<< exit(FatalError);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unrefineInterval_ = readLabel(refinementDict_.lookup("unrefineInterval"));
|
||||||
|
if (refineInterval_ < 1)
|
||||||
|
{
|
||||||
|
FatalErrorIn("dynamicPolyRefinementFvMesh::readDict()")
|
||||||
|
<< "Illegal unrefineInterval found: " << refineInterval_ << nl
|
||||||
|
<< "The unrefineInterval controls the unrefinement"
|
||||||
|
<< " trigerring within a certain time step and should be > 0"
|
||||||
|
<< exit(FatalError);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Read separate updates switch
|
||||||
|
separateUpdates_ =
|
||||||
|
refinementDict_.lookupOrDefault<Switch>("separateUpdates", false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -86,6 +100,11 @@ Foam::dynamicPolyRefinementFvMesh::dynamicPolyRefinementFvMesh
|
||||||
).subDict(typeName + "Coeffs")
|
).subDict(typeName + "Coeffs")
|
||||||
),
|
),
|
||||||
refineInterval_(readLabel(refinementDict_.lookup("refineInterval"))),
|
refineInterval_(readLabel(refinementDict_.lookup("refineInterval"))),
|
||||||
|
unrefineInterval_(readLabel(refinementDict_.lookup("unrefineInterval"))),
|
||||||
|
separateUpdates_
|
||||||
|
(
|
||||||
|
refinementDict_.lookupOrDefault<Switch>("separateUpdates", false)
|
||||||
|
),
|
||||||
curTimeIndex_(-1),
|
curTimeIndex_(-1),
|
||||||
|
|
||||||
refinementSelectionPtr_(refinementSelection::New(*this, refinementDict_))
|
refinementSelectionPtr_(refinementSelection::New(*this, refinementDict_))
|
||||||
|
@ -128,13 +147,29 @@ bool Foam::dynamicPolyRefinementFvMesh::update()
|
||||||
|
|
||||||
// Performing refinement/unrefinement when:
|
// Performing refinement/unrefinement when:
|
||||||
// 1. We are at the first time step
|
// 1. We are at the first time step
|
||||||
// 2. Time step is a multiplier of specified refineInterval
|
// 2. Only once per time step
|
||||||
// 3. Only once per time step
|
// 3. Time step is a multiplier of specified refineInterval or
|
||||||
|
// unrefineInterval
|
||||||
|
|
||||||
|
// Get time index
|
||||||
|
const label timeID = time().timeIndex();
|
||||||
|
|
||||||
|
// Check whether to perform refinement and/or unrefinement
|
||||||
|
const bool performRefinement = timeID % refineInterval_ == 0;
|
||||||
|
|
||||||
|
// Skip performing refinement/unrefinement in the same step if
|
||||||
|
// separateUpdates flag is switched on
|
||||||
|
bool performUnrefinement = timeID % unrefineInterval_ == 0;
|
||||||
|
if (performRefinement && separateUpdates_)
|
||||||
|
{
|
||||||
|
performUnrefinement = false;
|
||||||
|
}
|
||||||
|
|
||||||
if
|
if
|
||||||
(
|
(
|
||||||
time().timeIndex() > 0
|
timeID > 0
|
||||||
&& time().timeIndex() % refineInterval_ == 0
|
&& curTimeIndex_ < timeID
|
||||||
&& curTimeIndex_ < time().timeIndex()
|
&& (performRefinement || performUnrefinement)
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
// Update current time index to skip multiple topo changes per single
|
// Update current time index to skip multiple topo changes per single
|
||||||
|
@ -145,23 +180,47 @@ bool Foam::dynamicPolyRefinementFvMesh::update()
|
||||||
polyhedralRefinement& polyRefModifier =
|
polyhedralRefinement& polyRefModifier =
|
||||||
refCast<polyhedralRefinement>(topoChanger_[0]);
|
refCast<polyhedralRefinement>(topoChanger_[0]);
|
||||||
|
|
||||||
// Get refinement candidates from refinement selection algorithm. Note:
|
// Create empty list for refinement candidates
|
||||||
// return type is Xfer<labelList> so there's no copying
|
labelList refCandidates;
|
||||||
const labelList refCandidates
|
|
||||||
(
|
// Collect refinement candidates from refinement selection algorithm in
|
||||||
refinementSelectionPtr_->refinementCellCandidates()
|
// case the refinement should be performed in this time step
|
||||||
);
|
if (performRefinement)
|
||||||
|
{
|
||||||
|
// Note: return type is Xfer<labelList> so there's no copying (two
|
||||||
|
// transfers are occuring)
|
||||||
|
refCandidates.transfer
|
||||||
|
(
|
||||||
|
refinementSelectionPtr_->refinementCellCandidates()()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Info<< "Skipping refinement for this time-step..." << endl;
|
||||||
|
}
|
||||||
|
|
||||||
// Set cells to refine. Note: polyhedralRefinement ensures that face and
|
// Set cells to refine. Note: polyhedralRefinement ensures that face and
|
||||||
// point consistent refinement is performed
|
// point consistent refinement is performed
|
||||||
polyRefModifier.setCellsToRefine(refCandidates);
|
polyRefModifier.setCellsToRefine(refCandidates);
|
||||||
|
|
||||||
// Get unrefinement point candidates from refinement selection
|
// Create empty list for unrefinement candidates
|
||||||
// algorithm. Note: return type is Xfer<labelList> so there's no copying
|
labelList unrefCandidates;
|
||||||
const labelList unrefCandidates
|
|
||||||
(
|
// Collect unrefinement candidates from refinement selection algorithm
|
||||||
refinementSelectionPtr_->unrefinementPointCandidates()
|
// in case the unrefinement should be performed in this time step
|
||||||
);
|
if (performUnrefinement)
|
||||||
|
{
|
||||||
|
// Note: return type is Xfer<labelList> so there's no copying (two
|
||||||
|
// transfers are occuring)
|
||||||
|
unrefCandidates.transfer
|
||||||
|
(
|
||||||
|
refinementSelectionPtr_->unrefinementPointCandidates()()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Info<< "Skipping unrefinement for this time-step..." << endl;
|
||||||
|
}
|
||||||
|
|
||||||
// Set split points to unrefine around.
|
// Set split points to unrefine around.
|
||||||
// Notes:
|
// Notes:
|
||||||
|
@ -191,13 +250,25 @@ bool Foam::dynamicPolyRefinementFvMesh::update()
|
||||||
// Perform refinement and unrefinement in one go
|
// Perform refinement and unrefinement in one go
|
||||||
autoPtr<mapPolyMesh> topoChangeMap = topoChanger_.changeMesh();
|
autoPtr<mapPolyMesh> topoChangeMap = topoChanger_.changeMesh();
|
||||||
|
|
||||||
// Output cell balance
|
// Output cell balance if the topo change has been performed
|
||||||
Info<< "Successfully performed polyhedral refinement. "
|
const label nOldCells =
|
||||||
<< "Changed from "
|
returnReduce(topoChangeMap->nOldCells(), sumOp<label>());
|
||||||
<< returnReduce(topoChangeMap->nOldCells(), sumOp<label>())
|
const label sizeCellMap =
|
||||||
<< " to "
|
returnReduce(topoChangeMap->cellMap().size(), sumOp<label>());
|
||||||
<< returnReduce(topoChangeMap->cellMap().size(), sumOp<label>())
|
|
||||||
<< " cells." << endl;
|
// If the size of cell map is different than zero, we actually performed
|
||||||
|
// some topo changes
|
||||||
|
if (sizeCellMap)
|
||||||
|
{
|
||||||
|
Info<< "Successfully performed polyhedral refinement. "
|
||||||
|
<< "Changed from " << nOldCells << " to " << sizeCellMap
|
||||||
|
<< " cells." << endl;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Info<< "Refinement/unrefinement not performed in this time step "
|
||||||
|
<< "since no cells were selected." << endl;
|
||||||
|
}
|
||||||
|
|
||||||
return topoChangeMap->morphing();
|
return topoChangeMap->morphing();
|
||||||
}
|
}
|
||||||
|
|
|
@ -65,6 +65,13 @@ class dynamicPolyRefinementFvMesh
|
||||||
//- Refinement interval
|
//- Refinement interval
|
||||||
label refineInterval_;
|
label refineInterval_;
|
||||||
|
|
||||||
|
//- Unrefinement interval
|
||||||
|
label unrefineInterval_;
|
||||||
|
|
||||||
|
//- Separate refinement/unrefinement: off by default, meaning that
|
||||||
|
// refinement and unrefinement can be performed in the same step
|
||||||
|
Switch separateUpdates_;
|
||||||
|
|
||||||
//- Current time index (helper variable to skip multiple topo changes in
|
//- Current time index (helper variable to skip multiple topo changes in
|
||||||
// a single time step)
|
// a single time step)
|
||||||
label curTimeIndex_;
|
label curTimeIndex_;
|
||||||
|
|
|
@ -0,0 +1,128 @@
|
||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | Copyright held by original author
|
||||||
|
\\/ 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 2 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, write to the Free Software Foundation,
|
||||||
|
Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
|
||||||
|
Author
|
||||||
|
Vuko Vukcevic, Wikki Ltd. All rights reserved.
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#include "minCellSizeRefinement.H"
|
||||||
|
#include "addToRunTimeSelectionTable.H"
|
||||||
|
#include "volFields.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
namespace Foam
|
||||||
|
{
|
||||||
|
|
||||||
|
defineTypeNameAndDebug(minCellSizeRefinement, 0);
|
||||||
|
addToRunTimeSelectionTable
|
||||||
|
(
|
||||||
|
refinementSelection,
|
||||||
|
minCellSizeRefinement,
|
||||||
|
dictionary
|
||||||
|
);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
Foam::minCellSizeRefinement::minCellSizeRefinement
|
||||||
|
(
|
||||||
|
const fvMesh& mesh,
|
||||||
|
const dictionary& dict
|
||||||
|
)
|
||||||
|
:
|
||||||
|
refinementSelection(mesh, dict),
|
||||||
|
minDelta_(readScalar(coeffDict().lookup("minCellSize")))
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * Destructor* * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
Foam::minCellSizeRefinement::~minCellSizeRefinement()
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * Public Member Functions * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
Foam::Xfer<Foam::labelList>
|
||||||
|
Foam::minCellSizeRefinement::refinementCellCandidates() const
|
||||||
|
{
|
||||||
|
// Get cell sizes: cube root of cell volume (assuming cube cells)
|
||||||
|
const scalarField cellSize = pow(mesh().V().field(), 1.0/3.0);
|
||||||
|
|
||||||
|
// Create storage for collection of cells. Assume that almost all of the
|
||||||
|
// cells will be marked to prevent excessive resizing.
|
||||||
|
dynamicLabelList refinementCandidates(mesh().nCells());
|
||||||
|
|
||||||
|
// Loop through cells and collect refinement candidates
|
||||||
|
forAll (cellSize, cellI)
|
||||||
|
{
|
||||||
|
if (cellSize[cellI] > minDelta_)
|
||||||
|
{
|
||||||
|
// Cell is larger than the specified minimum, append cell for
|
||||||
|
// potential refinement
|
||||||
|
refinementCandidates.append(cellI);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Print out some information
|
||||||
|
Info<< "Selection algorithm " << type() << " selected "
|
||||||
|
<< returnReduce(refinementCandidates.size(), sumOp<label>())
|
||||||
|
<< " cells as refinement candidates."
|
||||||
|
<< endl;
|
||||||
|
|
||||||
|
// Return the list in the Xfer container to prevent copying
|
||||||
|
return refinementCandidates.xfer();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Foam::Xfer<Foam::labelList>
|
||||||
|
Foam::minCellSizeRefinement::unrefinementPointCandidates() const
|
||||||
|
{
|
||||||
|
// Mark all points as unrefinement candidates since only split points may be
|
||||||
|
// considered for actual unrefinement and since this refinement criterion
|
||||||
|
// will be usually used in combination with others. VV, 15/Mar/2018.
|
||||||
|
|
||||||
|
// All points are unrefinement candidates
|
||||||
|
labelList unrefinementCandidates(mesh().nPoints());
|
||||||
|
|
||||||
|
forAll (unrefinementCandidates, pointI)
|
||||||
|
{
|
||||||
|
unrefinementCandidates[pointI] = pointI;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Print out some information
|
||||||
|
Info<< "Selection algorithm " << type() << " selected "
|
||||||
|
<< returnReduce(unrefinementCandidates.size(), sumOp<label>())
|
||||||
|
<< " points as unrefinement candidates."
|
||||||
|
<< endl;
|
||||||
|
|
||||||
|
// Return the list in the Xfer container to prevent copying
|
||||||
|
return unrefinementCandidates.xfer();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
|
@ -0,0 +1,111 @@
|
||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | Copyright held by original author
|
||||||
|
\\/ 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 2 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, write to the Free Software Foundation,
|
||||||
|
Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
|
||||||
|
Class
|
||||||
|
Foam::minCellSizeRefinement
|
||||||
|
|
||||||
|
Description
|
||||||
|
Selection of refinement cells based on a minimum cell size. Assumes that
|
||||||
|
cells are mostly cubic and compares the minimum cell size with V^1/3, where
|
||||||
|
V is the cell volume. If the cell size is larger than the specified one,
|
||||||
|
cell gets selected for refinement.
|
||||||
|
|
||||||
|
SourceFiles
|
||||||
|
minCellSizeRefinement.C
|
||||||
|
|
||||||
|
Author
|
||||||
|
Vuko Vukcevic, Wikki Ltd. All rights reserved.
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifndef minCellSizeRefinement_H
|
||||||
|
#define minCellSizeRefinement_H
|
||||||
|
|
||||||
|
#include "refinementSelection.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
namespace Foam
|
||||||
|
{
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
Class minCellSizeRefinement Declaration
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
class minCellSizeRefinement
|
||||||
|
:
|
||||||
|
public refinementSelection
|
||||||
|
{
|
||||||
|
// Private data
|
||||||
|
|
||||||
|
//- Minimum cell size
|
||||||
|
scalar minDelta_;
|
||||||
|
|
||||||
|
|
||||||
|
// Private Member Functions
|
||||||
|
|
||||||
|
//- Disallow default bitwise copy construct
|
||||||
|
minCellSizeRefinement(const minCellSizeRefinement&);
|
||||||
|
|
||||||
|
//- Disallow default bitwise assignment
|
||||||
|
void operator=(const minCellSizeRefinement&);
|
||||||
|
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
//- Runtime type information
|
||||||
|
TypeName("minCellSizeRefinement");
|
||||||
|
|
||||||
|
|
||||||
|
// Constructors
|
||||||
|
|
||||||
|
//- Construct from components
|
||||||
|
minCellSizeRefinement(const fvMesh& mesh, const dictionary& dict);
|
||||||
|
|
||||||
|
|
||||||
|
//- Destructor
|
||||||
|
virtual ~minCellSizeRefinement();
|
||||||
|
|
||||||
|
|
||||||
|
// Member Functions
|
||||||
|
|
||||||
|
// Selection of refinement/unrefinement candidates
|
||||||
|
|
||||||
|
//- Return transferable list of cells to refine
|
||||||
|
virtual Xfer<labelList> refinementCellCandidates() const;
|
||||||
|
|
||||||
|
//- Return transferable list of split points to unrefine
|
||||||
|
virtual Xfer<labelList> unrefinementPointCandidates() const;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
} // End namespace Foam
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
|
@ -780,6 +780,40 @@ void Foam::argList::parse
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Managing the overrides for the global control switches:
|
||||||
|
//
|
||||||
|
// Here is the order of precedence for the definition/overriding of the
|
||||||
|
// control switches, from lowest to highest:
|
||||||
|
// - source code definitions from the various libraries/solvers
|
||||||
|
// - file specified by the env. variable FOAM_GLOBAL_CONTROLDICT
|
||||||
|
// - case's system/controlDict file
|
||||||
|
// - command-line parameters
|
||||||
|
//
|
||||||
|
// First, we allow the users to specify the location of a centralized
|
||||||
|
// global controlDict dictionary using the environment variable
|
||||||
|
// FOAM_GLOBAL_CONTROLDICT.
|
||||||
|
fileName optionalGlobControlDictFileName =
|
||||||
|
getEnv("FOAM_GLOBAL_CONTROLDICT");
|
||||||
|
|
||||||
|
if (optionalGlobControlDictFileName.size() )
|
||||||
|
{
|
||||||
|
debug::updateCentralDictVars
|
||||||
|
(
|
||||||
|
optionalGlobControlDictFileName,
|
||||||
|
Pstream::master() && bannerEnabled
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Now that the rootPath_/globalCase_ directory is known (following the
|
||||||
|
// call to getRootCase()), we grab any global control switches overrides
|
||||||
|
// from the current case's controlDict.
|
||||||
|
|
||||||
|
debug::updateCentralDictVars
|
||||||
|
(
|
||||||
|
rootPath_/globalCase_/"system/controlDict",
|
||||||
|
Pstream::master() && bannerEnabled
|
||||||
|
);
|
||||||
|
|
||||||
// Finally, a command-line override for central controlDict's variables.
|
// Finally, a command-line override for central controlDict's variables.
|
||||||
// This is the ultimate override for the global control switches.
|
// This is the ultimate override for the global control switches.
|
||||||
|
|
||||||
|
@ -793,7 +827,7 @@ void Foam::argList::parse
|
||||||
|
|
||||||
forAll (globalControlDictSwitchSetNames, gI)
|
forAll (globalControlDictSwitchSetNames, gI)
|
||||||
{
|
{
|
||||||
word switchSetName = globalControlDictSwitchSetNames.names[gI];
|
const word switchSetName = globalControlDictSwitchSetNames.names[gI];
|
||||||
|
|
||||||
if (optionFound(switchSetName))
|
if (optionFound(switchSetName))
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
extrudeModel/extrudeModel.C
|
extrudeModel/extrudeModel.C
|
||||||
extrudeModel/newExtrudeModel.C
|
extrudeModel/newExtrudeModel.C
|
||||||
linearNormal/linearNormal.C
|
linearNormal/linearNormal.C
|
||||||
|
gradedNormal/gradedNormal.C
|
||||||
linearRadial/linearRadial.C
|
linearRadial/linearRadial.C
|
||||||
sigmaRadial/sigmaRadial.C
|
sigmaRadial/sigmaRadial.C
|
||||||
wedge/wedge.C
|
wedge/wedge.C
|
||||||
|
|
|
@ -1,8 +1,10 @@
|
||||||
EXE_INC = \
|
EXE_INC = \
|
||||||
-I$(LIB_SRC)/meshTools/lnInclude \
|
-I$(LIB_SRC)/meshTools/lnInclude \
|
||||||
-I$(LIB_SRC)/dynamicMesh/lnInclude
|
-I$(LIB_SRC)/dynamicMesh/lnInclude \
|
||||||
|
-I$(LIB_SRC)/ODE/lnInclude
|
||||||
|
|
||||||
LIB_LIBS = \
|
LIB_LIBS = \
|
||||||
-lmeshTools \
|
-lmeshTools \
|
||||||
-ldynamicMesh
|
-ldynamicMesh \
|
||||||
|
-lODE
|
||||||
|
|
||||||
|
|
143
src/mesh/extrudeModel/gradedNormal/gradedNormal.C
Normal file
143
src/mesh/extrudeModel/gradedNormal/gradedNormal.C
Normal file
|
@ -0,0 +1,143 @@
|
||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | foam-extend: Open Source CFD
|
||||||
|
\\ / O peration | Version: 4.0
|
||||||
|
\\ / A nd | Web: http://www.foam-extend.org
|
||||||
|
\\/ M anipulation | For copyright notice see file Copyright
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
License
|
||||||
|
This file is part of foam-extend.
|
||||||
|
|
||||||
|
foam-extend 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.
|
||||||
|
|
||||||
|
foam-extend 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 foam-extend. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#include "gradedNormal.H"
|
||||||
|
#include "addToRunTimeSelectionTable.H"
|
||||||
|
#include "BisectionRoot.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
namespace Foam
|
||||||
|
{
|
||||||
|
namespace extrudeModels
|
||||||
|
{
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
defineTypeNameAndDebug(gradedNormal, 0);
|
||||||
|
|
||||||
|
addToRunTimeSelectionTable(extrudeModel, gradedNormal, dictionary);
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
gradedNormal::gradedNormal(const dictionary& dict)
|
||||||
|
:
|
||||||
|
extrudeModel(typeName, dict),
|
||||||
|
thickness_(readScalar(coeffDict_.lookup("thickness"))),
|
||||||
|
delta0_(readScalar(coeffDict_.lookup("initialCellLength"))),
|
||||||
|
expansionFactor_(1.0)
|
||||||
|
{
|
||||||
|
// Sanity checks
|
||||||
|
if (thickness_ <= SMALL)
|
||||||
|
{
|
||||||
|
FatalErrorIn("gradedNormal(const dictionary&)")
|
||||||
|
<< "thickness should be positive: " << thickness_
|
||||||
|
<< exit(FatalError);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (delta0_ <= SMALL)
|
||||||
|
{
|
||||||
|
FatalErrorIn("gradedNormal(const dictionary&)")
|
||||||
|
<< "initialCellLength should be positive: " << delta0_
|
||||||
|
<< exit(FatalError);
|
||||||
|
}
|
||||||
|
|
||||||
|
const scalar maxExpFactor =
|
||||||
|
coeffDict_.lookupOrDefault<scalar>("maxExpansionFactor", 3.0);
|
||||||
|
|
||||||
|
if (maxExpFactor <= SMALL)
|
||||||
|
{
|
||||||
|
FatalErrorIn("gradedNormal(const dictionary&)")
|
||||||
|
<< "maxExpansionFactor should be positive: " << maxExpFactor
|
||||||
|
<< exit(FatalError);
|
||||||
|
}
|
||||||
|
|
||||||
|
const scalar bisectionTol =
|
||||||
|
coeffDict_.lookupOrDefault<scalar>("bisectionTol", 1e-5);
|
||||||
|
|
||||||
|
if (bisectionTol <= SMALL)
|
||||||
|
{
|
||||||
|
FatalErrorIn("gradedNormal(const dictionary&)")
|
||||||
|
<< "bisectionTolerance should be positive: " << bisectionTol
|
||||||
|
<< exit(FatalError);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create expansion factor equation represented as a function object
|
||||||
|
expansionFactorEqn eqn(*this);
|
||||||
|
|
||||||
|
// Calculate the expansionFactor using the bisection algorithm with the
|
||||||
|
// default tolerance of 1e-5
|
||||||
|
BisectionRoot<expansionFactorEqn> rootFinder
|
||||||
|
(
|
||||||
|
eqn,
|
||||||
|
bisectionTol
|
||||||
|
);
|
||||||
|
|
||||||
|
// Search for the root in [0, 3], where upper bound 3 is default
|
||||||
|
expansionFactor_ = rootFinder.root
|
||||||
|
(
|
||||||
|
0.0,
|
||||||
|
maxExpFactor
|
||||||
|
);
|
||||||
|
|
||||||
|
// Report the result
|
||||||
|
Info<< "Calculated expansion factor: " << expansionFactor_ << endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
gradedNormal::~gradedNormal()
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * Operators * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
point gradedNormal::operator()
|
||||||
|
(
|
||||||
|
const point& surfacePoint,
|
||||||
|
const vector& surfaceNormal,
|
||||||
|
const label layer
|
||||||
|
) const
|
||||||
|
{
|
||||||
|
scalar d = 0.0;
|
||||||
|
|
||||||
|
for (label i = 0; i < layer; ++i)
|
||||||
|
{
|
||||||
|
d += delta0_*pow(expansionFactor_, i + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
return surfacePoint + d*surfaceNormal;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
} // End namespace extrudeModels
|
||||||
|
} // End namespace Foam
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
|
|
158
src/mesh/extrudeModel/gradedNormal/gradedNormal.H
Normal file
158
src/mesh/extrudeModel/gradedNormal/gradedNormal.H
Normal file
|
@ -0,0 +1,158 @@
|
||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | foam-extend: Open Source CFD
|
||||||
|
\\ / O peration | Version: 4.0
|
||||||
|
\\ / A nd | Web: http://www.foam-extend.org
|
||||||
|
\\/ M anipulation | For copyright notice see file Copyright
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
License
|
||||||
|
This file is part of foam-extend.
|
||||||
|
|
||||||
|
foam-extend 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.
|
||||||
|
|
||||||
|
foam-extend 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 foam-extend. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
Class
|
||||||
|
Foam::extrudeModels::gradedNormal
|
||||||
|
|
||||||
|
Description
|
||||||
|
Extrudes by transforming points normal to the surface. Input parameters are:
|
||||||
|
1. Extrusion thickness (in meters),
|
||||||
|
2. Initial delta (in meters),
|
||||||
|
3. Number of layers.
|
||||||
|
|
||||||
|
Expansion factor is calculated numerically using bisection algorithm.
|
||||||
|
|
||||||
|
Author
|
||||||
|
Vuko Vukcevic. FMENA Zagreb. All rights reserved.
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifndef gradedNormal_H
|
||||||
|
#define gradedNormal_H
|
||||||
|
|
||||||
|
#include "point.H"
|
||||||
|
#include "extrudeModel.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
namespace Foam
|
||||||
|
{
|
||||||
|
namespace extrudeModels
|
||||||
|
{
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
Class gradedNormal Declaration
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
class gradedNormal
|
||||||
|
:
|
||||||
|
public extrudeModel
|
||||||
|
{
|
||||||
|
// Private data
|
||||||
|
|
||||||
|
//- Layer thickness
|
||||||
|
scalar thickness_;
|
||||||
|
|
||||||
|
//- Initial delta (cell size at the extruded patch)
|
||||||
|
scalar delta0_;
|
||||||
|
|
||||||
|
//- Expansion factor
|
||||||
|
scalar expansionFactor_;
|
||||||
|
|
||||||
|
|
||||||
|
// Expansion factor equation (functor class used by BisectionRoot)
|
||||||
|
class expansionFactorEqn
|
||||||
|
{
|
||||||
|
// Private data
|
||||||
|
|
||||||
|
//- Const reference to underlying gradedNormal model
|
||||||
|
const gradedNormal& gnm_;
|
||||||
|
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
//- Construct given gradedNormal model
|
||||||
|
explicit expansionFactorEqn(const gradedNormal& gnm)
|
||||||
|
:
|
||||||
|
gnm_(gnm)
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
//- Function call operator
|
||||||
|
scalar operator()(const scalar& x) const
|
||||||
|
{
|
||||||
|
scalar result = gnm_.thickness();
|
||||||
|
|
||||||
|
for (label i = 0; i <= gnm_.nLayers(); ++i)
|
||||||
|
{
|
||||||
|
result -= gnm_.delta0()*pow(x, i);
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
//- Runtime type information
|
||||||
|
TypeName("gradedNormal");
|
||||||
|
|
||||||
|
// Constructors
|
||||||
|
|
||||||
|
//- Construct from components
|
||||||
|
gradedNormal(const dictionary& dict);
|
||||||
|
|
||||||
|
|
||||||
|
//- Destructor
|
||||||
|
~gradedNormal();
|
||||||
|
|
||||||
|
|
||||||
|
// Access functions
|
||||||
|
|
||||||
|
//- Return const reference to thickness
|
||||||
|
const scalar& thickness() const
|
||||||
|
{
|
||||||
|
return thickness_;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//- Return const reference to initial delta
|
||||||
|
const scalar& delta0() const
|
||||||
|
{
|
||||||
|
return delta0_;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Member Operators
|
||||||
|
|
||||||
|
point operator()
|
||||||
|
(
|
||||||
|
const point& surfacePoint,
|
||||||
|
const vector& surfaceNormal,
|
||||||
|
const label layer
|
||||||
|
) const;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
} // End namespace extrudeModels
|
||||||
|
} // End namespace Foam
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
|
|
|
@ -122,6 +122,15 @@ public:
|
||||||
|
|
||||||
//- Construct null
|
//- Construct null
|
||||||
inline donorAcceptor()
|
inline donorAcceptor()
|
||||||
|
:
|
||||||
|
acceptorCell_(-1),
|
||||||
|
acceptorProcNo_(-1),
|
||||||
|
acceptorPoint_(vector::zero),
|
||||||
|
donorCell_(-1),
|
||||||
|
donorProcNo_(-1),
|
||||||
|
donorPoint_(vector::zero),
|
||||||
|
extendedDonorCells_(),
|
||||||
|
extendedDonorPoints_()
|
||||||
{}
|
{}
|
||||||
|
|
||||||
//- Construct from acceptor data
|
//- Construct from acceptor data
|
||||||
|
|
|
@ -105,6 +105,7 @@ class isoSurface
|
||||||
//- Reference to mesh
|
//- Reference to mesh
|
||||||
const fvMesh& mesh_;
|
const fvMesh& mesh_;
|
||||||
|
|
||||||
|
//- Point values
|
||||||
const scalarField& pVals_;
|
const scalarField& pVals_;
|
||||||
|
|
||||||
//- Input volScalarField with separated coupled patches rewritten
|
//- Input volScalarField with separated coupled patches rewritten
|
||||||
|
@ -119,7 +120,6 @@ class isoSurface
|
||||||
//- When to merge points
|
//- When to merge points
|
||||||
const scalar mergeDistance_;
|
const scalar mergeDistance_;
|
||||||
|
|
||||||
|
|
||||||
//- Whether face might be cut
|
//- Whether face might be cut
|
||||||
List<cellCutType> faceCutType_;
|
List<cellCutType> faceCutType_;
|
||||||
|
|
||||||
|
@ -446,7 +446,6 @@ public:
|
||||||
const GeometricField<Type, fvPatchField, volMesh>& cCoords,
|
const GeometricField<Type, fvPatchField, volMesh>& cCoords,
|
||||||
const Field<Type>& pCoords
|
const Field<Type>& pCoords
|
||||||
) const;
|
) const;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -572,13 +572,13 @@ bool Foam::sampledIsoSurface::expire()
|
||||||
facesPtr_.clear();
|
facesPtr_.clear();
|
||||||
subMeshPtr_.clear();
|
subMeshPtr_.clear();
|
||||||
|
|
||||||
// already marked as expired
|
// Already marked as expired
|
||||||
if (prevTimeIndex_ == -1)
|
if (prevTimeIndex_ == -1)
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// force update
|
// Force update
|
||||||
prevTimeIndex_ = -1;
|
prevTimeIndex_ = -1;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -61,6 +61,8 @@ void Foam::sampledCuttingPlane::createGeometry()
|
||||||
pointDistance_.clear();
|
pointDistance_.clear();
|
||||||
cellDistancePtr_.clear();
|
cellDistancePtr_.clear();
|
||||||
|
|
||||||
|
// Clear derived data
|
||||||
|
clearGeom();
|
||||||
|
|
||||||
// Get any subMesh
|
// Get any subMesh
|
||||||
if (zoneID_.index() != -1 && !subMeshPtr_.valid())
|
if (zoneID_.index() != -1 && !subMeshPtr_.valid())
|
||||||
|
@ -311,6 +313,12 @@ Foam::sampledCuttingPlane::~sampledCuttingPlane()
|
||||||
|
|
||||||
bool Foam::sampledCuttingPlane::needsUpdate() const
|
bool Foam::sampledCuttingPlane::needsUpdate() const
|
||||||
{
|
{
|
||||||
|
// Update for changing mesh
|
||||||
|
if (mesh().changing())
|
||||||
|
{
|
||||||
|
needsUpdate_ = true;
|
||||||
|
}
|
||||||
|
|
||||||
return needsUpdate_;
|
return needsUpdate_;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -327,6 +335,9 @@ bool Foam::sampledCuttingPlane::expire()
|
||||||
// Clear any stored topologies
|
// Clear any stored topologies
|
||||||
facesPtr_.clear();
|
facesPtr_.clear();
|
||||||
|
|
||||||
|
// Clear derived data
|
||||||
|
clearGeom();
|
||||||
|
|
||||||
// already marked as expired
|
// already marked as expired
|
||||||
if (needsUpdate_)
|
if (needsUpdate_)
|
||||||
{
|
{
|
||||||
|
|
|
@ -68,10 +68,10 @@ class sampledCuttingPlane
|
||||||
//- Whether to recalculate cell values as average of point values
|
//- Whether to recalculate cell values as average of point values
|
||||||
const Switch average_;
|
const Switch average_;
|
||||||
|
|
||||||
//- zone name/index (if restricted to zones)
|
//- Zone name/index (if restricted to zones)
|
||||||
mutable cellZoneID zoneID_;
|
mutable cellZoneID zoneID_;
|
||||||
|
|
||||||
//- for zones: patch to put exposed faces into
|
//- For zones: patch to put exposed faces into
|
||||||
mutable word exposedPatchName_;
|
mutable word exposedPatchName_;
|
||||||
|
|
||||||
//- Track if the surface needs an update
|
//- Track if the surface needs an update
|
||||||
|
@ -90,7 +90,7 @@ class sampledCuttingPlane
|
||||||
//- Constructed iso surface
|
//- Constructed iso surface
|
||||||
autoPtr<isoSurface> isoSurfPtr_;
|
autoPtr<isoSurface> isoSurfPtr_;
|
||||||
|
|
||||||
//- triangles converted to faceList
|
//- Triangles converted to faceList
|
||||||
mutable autoPtr<faceList> facesPtr_;
|
mutable autoPtr<faceList> facesPtr_;
|
||||||
|
|
||||||
|
|
||||||
|
@ -99,7 +99,7 @@ class sampledCuttingPlane
|
||||||
//- Create iso surface
|
//- Create iso surface
|
||||||
void createGeometry();
|
void createGeometry();
|
||||||
|
|
||||||
//- sample field on faces
|
//- Sample field on faces
|
||||||
template <class Type>
|
template <class Type>
|
||||||
tmp<Field<Type> > sampleField
|
tmp<Field<Type> > sampleField
|
||||||
(
|
(
|
||||||
|
@ -129,9 +129,8 @@ public:
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
// Destructor
|
//- Destructor
|
||||||
|
virtual ~sampledCuttingPlane();
|
||||||
virtual ~sampledCuttingPlane();
|
|
||||||
|
|
||||||
|
|
||||||
// Member Functions
|
// Member Functions
|
||||||
|
@ -177,67 +176,75 @@ public:
|
||||||
return isoSurfPtr_();
|
return isoSurfPtr_();
|
||||||
}
|
}
|
||||||
|
|
||||||
//- sample field on surface
|
|
||||||
|
// Sample
|
||||||
|
|
||||||
|
//- Sample field on surface
|
||||||
virtual tmp<scalarField> sample
|
virtual tmp<scalarField> sample
|
||||||
(
|
(
|
||||||
const volScalarField&
|
const volScalarField&
|
||||||
) const;
|
) const;
|
||||||
|
|
||||||
//- sample field on surface
|
//- Sample field on surface
|
||||||
virtual tmp<vectorField> sample
|
virtual tmp<vectorField> sample
|
||||||
(
|
(
|
||||||
const volVectorField&
|
const volVectorField&
|
||||||
) const;
|
) const;
|
||||||
|
|
||||||
//- sample field on surface
|
//- Sample field on surface
|
||||||
virtual tmp<sphericalTensorField> sample
|
virtual tmp<sphericalTensorField> sample
|
||||||
(
|
(
|
||||||
const volSphericalTensorField&
|
const volSphericalTensorField&
|
||||||
) const;
|
) const;
|
||||||
|
|
||||||
//- sample field on surface
|
//- Sample field on surface
|
||||||
virtual tmp<symmTensorField> sample
|
virtual tmp<symmTensorField> sample
|
||||||
(
|
(
|
||||||
const volSymmTensorField&
|
const volSymmTensorField&
|
||||||
) const;
|
) const;
|
||||||
|
|
||||||
//- sample field on surface
|
//- Sample field on surface
|
||||||
virtual tmp<tensorField> sample
|
virtual tmp<tensorField> sample
|
||||||
(
|
(
|
||||||
const volTensorField&
|
const volTensorField&
|
||||||
) const;
|
) const;
|
||||||
|
|
||||||
|
|
||||||
//- interpolate field on surface
|
// Interpolate
|
||||||
|
|
||||||
|
//- Interpolate field on surface
|
||||||
virtual tmp<scalarField> interpolate
|
virtual tmp<scalarField> interpolate
|
||||||
(
|
(
|
||||||
const interpolation<scalar>&
|
const interpolation<scalar>&
|
||||||
) const;
|
) const;
|
||||||
|
|
||||||
//- interpolate field on surface
|
//- Interpolate field on surface
|
||||||
virtual tmp<vectorField> interpolate
|
virtual tmp<vectorField> interpolate
|
||||||
(
|
(
|
||||||
const interpolation<vector>&
|
const interpolation<vector>&
|
||||||
) const;
|
) const;
|
||||||
|
|
||||||
//- interpolate field on surface
|
//- Interpolate field on surface
|
||||||
virtual tmp<sphericalTensorField> interpolate
|
virtual tmp<sphericalTensorField> interpolate
|
||||||
(
|
(
|
||||||
const interpolation<sphericalTensor>&
|
const interpolation<sphericalTensor>&
|
||||||
) const;
|
) const;
|
||||||
|
|
||||||
//- interpolate field on surface
|
//- Interpolate field on surface
|
||||||
virtual tmp<symmTensorField> interpolate
|
virtual tmp<symmTensorField> interpolate
|
||||||
(
|
(
|
||||||
const interpolation<symmTensor>&
|
const interpolation<symmTensor>&
|
||||||
) const;
|
) const;
|
||||||
|
|
||||||
//- interpolate field on surface
|
//- Interpolate field on surface
|
||||||
virtual tmp<tensorField> interpolate
|
virtual tmp<tensorField> interpolate
|
||||||
(
|
(
|
||||||
const interpolation<tensor>&
|
const interpolation<tensor>&
|
||||||
) const;
|
) const;
|
||||||
|
|
||||||
|
|
||||||
|
// Output
|
||||||
|
|
||||||
//- Write
|
//- Write
|
||||||
virtual void print(Ostream&) const;
|
virtual void print(Ostream&) const;
|
||||||
};
|
};
|
||||||
|
|
|
@ -55,7 +55,7 @@ void Foam::vtkSurfaceWriter::writeGeometry
|
||||||
<< "DATASET POLYDATA" << nl;
|
<< "DATASET POLYDATA" << nl;
|
||||||
|
|
||||||
// Write vertex coords
|
// Write vertex coords
|
||||||
os << "POINTS " << points.size() << " float" << nl;
|
os << "POINTS " << points.size() << " double" << nl;
|
||||||
forAll(points, pointI)
|
forAll(points, pointI)
|
||||||
{
|
{
|
||||||
const point& pt = points[pointI];
|
const point& pt = points[pointI];
|
||||||
|
@ -100,7 +100,7 @@ namespace Foam
|
||||||
const Field<scalar>& values
|
const Field<scalar>& values
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
os << "1 " << values.size() << " float" << nl;
|
os << "1 " << values.size() << " double" << nl;
|
||||||
|
|
||||||
forAll(values, elemI)
|
forAll(values, elemI)
|
||||||
{
|
{
|
||||||
|
@ -129,7 +129,7 @@ namespace Foam
|
||||||
const Field<vector>& values
|
const Field<vector>& values
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
os << "3 " << values.size() << " float" << nl;
|
os << "3 " << values.size() << " double" << nl;
|
||||||
|
|
||||||
forAll(values, elemI)
|
forAll(values, elemI)
|
||||||
{
|
{
|
||||||
|
@ -147,7 +147,7 @@ namespace Foam
|
||||||
const Field<sphericalTensor>& values
|
const Field<sphericalTensor>& values
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
os << "1 " << values.size() << " float" << nl;
|
os << "1 " << values.size() << " double" << nl;
|
||||||
|
|
||||||
forAll(values, elemI)
|
forAll(values, elemI)
|
||||||
{
|
{
|
||||||
|
@ -164,7 +164,7 @@ namespace Foam
|
||||||
const Field<symmTensor>& values
|
const Field<symmTensor>& values
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
os << "6 " << values.size() << " float" << nl;
|
os << "6 " << values.size() << " double" << nl;
|
||||||
|
|
||||||
forAll(values, elemI)
|
forAll(values, elemI)
|
||||||
{
|
{
|
||||||
|
@ -185,7 +185,7 @@ namespace Foam
|
||||||
const Field<tensor>& values
|
const Field<tensor>& values
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
os << "9 " << values.size() << " float" << nl;
|
os << "9 " << values.size() << " double" << nl;
|
||||||
|
|
||||||
forAll(values, elemI)
|
forAll(values, elemI)
|
||||||
{
|
{
|
||||||
|
@ -210,7 +210,7 @@ void Foam::vtkSurfaceWriter::writeData
|
||||||
const Field<Type>& values
|
const Field<Type>& values
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
os << "1 " << values.size() << " float" << nl;
|
os << "1 " << values.size() << " double" << nl;
|
||||||
|
|
||||||
forAll(values, elemI)
|
forAll(values, elemI)
|
||||||
{
|
{
|
||||||
|
|
|
@ -79,12 +79,5 @@ $(rheologyLaws)/multiMaterial/multiMaterial.C
|
||||||
$(rheologyLaws)/orthotropicLinearElastic/orthotropicLinearElastic.C
|
$(rheologyLaws)/orthotropicLinearElastic/orthotropicLinearElastic.C
|
||||||
$(rheologyLaws)/PronyViscoelastic/PronyViscoelastic.C
|
$(rheologyLaws)/PronyViscoelastic/PronyViscoelastic.C
|
||||||
|
|
||||||
thermalModel/thermalModel.C
|
|
||||||
thermalLaws = thermalModel/thermalLaws
|
|
||||||
$(thermalLaws)/thermalLaw/thermalLaw.C
|
|
||||||
$(thermalLaws)/thermalLaw/newThermalLaw.C
|
|
||||||
$(thermalLaws)/constantThermal/constantThermal.C
|
|
||||||
$(thermalLaws)/multiMaterialThermal/multiMaterialThermal.C
|
|
||||||
|
|
||||||
|
|
||||||
LIB = $(FOAM_LIBBIN)/libsolidModels
|
LIB = $(FOAM_LIBBIN)/libsolidModels
|
||||||
|
|
|
@ -3,6 +3,7 @@ EXE_INC = \
|
||||||
-I$(LIB_SRC)/meshTools/lnInclude \
|
-I$(LIB_SRC)/meshTools/lnInclude \
|
||||||
-I$(LIB_SRC)/finiteArea/lnInclude \
|
-I$(LIB_SRC)/finiteArea/lnInclude \
|
||||||
-I$(LIB_SRC)/lagrangian/lnInclude \
|
-I$(LIB_SRC)/lagrangian/lnInclude \
|
||||||
|
-I$(LIB_SRC)/conjugateHeatTransfer/lnInclude \
|
||||||
-I$(LIB_SRC)/dynamicMesh/lnInclude \
|
-I$(LIB_SRC)/dynamicMesh/lnInclude \
|
||||||
-I$(LIB_SRC)/dynamicMesh/dynamicMesh/lnInclude \
|
-I$(LIB_SRC)/dynamicMesh/dynamicMesh/lnInclude \
|
||||||
-I$(LIB_SRC)/dynamicMesh/dynamicFvMesh/lnInclude \
|
-I$(LIB_SRC)/dynamicMesh/dynamicFvMesh/lnInclude \
|
||||||
|
@ -12,6 +13,7 @@ LIB_LIBS = \
|
||||||
-lfiniteVolume \
|
-lfiniteVolume \
|
||||||
-lmeshTools \
|
-lmeshTools \
|
||||||
-lfiniteArea \
|
-lfiniteArea \
|
||||||
|
-lconjugateHeatTransfer \
|
||||||
-ldynamicFvMesh \
|
-ldynamicFvMesh \
|
||||||
-ldynamicMesh \
|
-ldynamicMesh \
|
||||||
-ltopoChangerFvMesh \
|
-ltopoChangerFvMesh \
|
||||||
|
|
|
@ -1,169 +0,0 @@
|
||||||
/*---------------------------------------------------------------------------*\
|
|
||||||
========= |
|
|
||||||
\\ / F ield | foam-extend: Open Source CFD
|
|
||||||
\\ / O peration | Version: 4.0
|
|
||||||
\\ / A nd | Web: http://www.foam-extend.org
|
|
||||||
\\/ M anipulation | For copyright notice see file Copyright
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
License
|
|
||||||
This file is part of foam-extend.
|
|
||||||
|
|
||||||
foam-extend 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.
|
|
||||||
|
|
||||||
foam-extend 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 foam-extend. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
\*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
#include "constantThermal.H"
|
|
||||||
#include "addToRunTimeSelectionTable.H"
|
|
||||||
#include "zeroGradientFvPatchFields.H"
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
namespace Foam
|
|
||||||
{
|
|
||||||
defineTypeNameAndDebug(constantThermal, 0);
|
|
||||||
addToRunTimeSelectionTable(thermalLaw, constantThermal, dictionary);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
// Construct from dictionary
|
|
||||||
Foam::constantThermal::constantThermal
|
|
||||||
(
|
|
||||||
const word& name,
|
|
||||||
const volScalarField& T,
|
|
||||||
const dictionary& dict
|
|
||||||
)
|
|
||||||
:
|
|
||||||
thermalLaw(name, T, dict),
|
|
||||||
C_(dict.lookup("C")),
|
|
||||||
k_(dict.lookup("k")),
|
|
||||||
alpha_(dict.lookup("alpha")),
|
|
||||||
T0_(dict.lookup("T0"))
|
|
||||||
{}
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
Foam::constantThermal::~constantThermal()
|
|
||||||
{}
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
Foam::tmp<Foam::volScalarField> Foam::constantThermal::C() const
|
|
||||||
{
|
|
||||||
tmp<volScalarField> tresult
|
|
||||||
(
|
|
||||||
new volScalarField
|
|
||||||
(
|
|
||||||
IOobject
|
|
||||||
(
|
|
||||||
"C",
|
|
||||||
mesh().time().timeName(),
|
|
||||||
mesh(),
|
|
||||||
IOobject::NO_READ,
|
|
||||||
IOobject::NO_WRITE
|
|
||||||
),
|
|
||||||
mesh(),
|
|
||||||
C_,
|
|
||||||
zeroGradientFvPatchScalarField::typeName
|
|
||||||
)
|
|
||||||
);
|
|
||||||
|
|
||||||
tresult().correctBoundaryConditions();
|
|
||||||
|
|
||||||
return tresult;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Foam::tmp<Foam::volScalarField> Foam::constantThermal::k() const
|
|
||||||
{
|
|
||||||
tmp<volScalarField> tresult
|
|
||||||
(
|
|
||||||
new volScalarField
|
|
||||||
(
|
|
||||||
IOobject
|
|
||||||
(
|
|
||||||
"k",
|
|
||||||
mesh().time().timeName(),
|
|
||||||
mesh(),
|
|
||||||
IOobject::NO_READ,
|
|
||||||
IOobject::NO_WRITE
|
|
||||||
),
|
|
||||||
mesh(),
|
|
||||||
k_,
|
|
||||||
zeroGradientFvPatchScalarField::typeName
|
|
||||||
)
|
|
||||||
);
|
|
||||||
|
|
||||||
tresult().correctBoundaryConditions();
|
|
||||||
|
|
||||||
return tresult;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Foam::tmp<Foam::volScalarField> Foam::constantThermal::alpha() const
|
|
||||||
{
|
|
||||||
tmp<volScalarField> tresult
|
|
||||||
(
|
|
||||||
new volScalarField
|
|
||||||
(
|
|
||||||
IOobject
|
|
||||||
(
|
|
||||||
"alpha",
|
|
||||||
mesh().time().timeName(),
|
|
||||||
mesh(),
|
|
||||||
IOobject::NO_READ,
|
|
||||||
IOobject::NO_WRITE
|
|
||||||
),
|
|
||||||
mesh(),
|
|
||||||
alpha_,
|
|
||||||
zeroGradientFvPatchScalarField::typeName
|
|
||||||
)
|
|
||||||
);
|
|
||||||
|
|
||||||
tresult().correctBoundaryConditions();
|
|
||||||
|
|
||||||
return tresult;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Foam::tmp<Foam::volScalarField> Foam::constantThermal::T0() const
|
|
||||||
{
|
|
||||||
tmp<volScalarField> tresult
|
|
||||||
(
|
|
||||||
new volScalarField
|
|
||||||
(
|
|
||||||
IOobject
|
|
||||||
(
|
|
||||||
"T0",
|
|
||||||
mesh().time().timeName(),
|
|
||||||
mesh(),
|
|
||||||
IOobject::NO_READ,
|
|
||||||
IOobject::NO_WRITE
|
|
||||||
),
|
|
||||||
mesh(),
|
|
||||||
T0_,
|
|
||||||
zeroGradientFvPatchScalarField::typeName
|
|
||||||
)
|
|
||||||
);
|
|
||||||
|
|
||||||
tresult().correctBoundaryConditions();
|
|
||||||
|
|
||||||
return tresult;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// ************************************************************************* //
|
|
|
@ -1,131 +0,0 @@
|
||||||
/*---------------------------------------------------------------------------*\
|
|
||||||
========= |
|
|
||||||
\\ / F ield | foam-extend: Open Source CFD
|
|
||||||
\\ / O peration | Version: 4.0
|
|
||||||
\\ / A nd | Web: http://www.foam-extend.org
|
|
||||||
\\/ M anipulation | For copyright notice see file Copyright
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
License
|
|
||||||
This file is part of foam-extend.
|
|
||||||
|
|
||||||
foam-extend 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.
|
|
||||||
|
|
||||||
foam-extend 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 foam-extend. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
Class
|
|
||||||
constantThermal
|
|
||||||
|
|
||||||
Description
|
|
||||||
Constant thermal properties
|
|
||||||
|
|
||||||
Author
|
|
||||||
Hrvoje Jasak, Wikki Ltd. All rights reserved.
|
|
||||||
|
|
||||||
SourceFiles
|
|
||||||
constantThermal.C
|
|
||||||
|
|
||||||
\*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
#ifndef constantThermal_H
|
|
||||||
#define constantThermal_H
|
|
||||||
|
|
||||||
#include "thermalLaw.H"
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
namespace Foam
|
|
||||||
{
|
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*\
|
|
||||||
Class constantThermal Declaration
|
|
||||||
\*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
class constantThermal
|
|
||||||
:
|
|
||||||
public thermalLaw
|
|
||||||
{
|
|
||||||
// Private data
|
|
||||||
|
|
||||||
//- Specific heat capacity
|
|
||||||
dimensionedScalar C_;
|
|
||||||
|
|
||||||
//- Thermal conductivity
|
|
||||||
dimensionedScalar k_;
|
|
||||||
|
|
||||||
//- Thermal expansion coefficient
|
|
||||||
dimensionedScalar alpha_;
|
|
||||||
|
|
||||||
//- Reference temperature
|
|
||||||
dimensionedScalar T0_;
|
|
||||||
|
|
||||||
|
|
||||||
// Private Member Functions
|
|
||||||
|
|
||||||
//- Disallow default bitwise copy construct
|
|
||||||
constantThermal(const constantThermal&);
|
|
||||||
|
|
||||||
//- Disallow default bitwise assignment
|
|
||||||
void operator=(const constantThermal&);
|
|
||||||
|
|
||||||
|
|
||||||
public:
|
|
||||||
|
|
||||||
//- Runtime type information
|
|
||||||
TypeName("constant");
|
|
||||||
|
|
||||||
// Static data members
|
|
||||||
|
|
||||||
|
|
||||||
// Constructors
|
|
||||||
|
|
||||||
//- Construct from dictionary
|
|
||||||
constantThermal
|
|
||||||
(
|
|
||||||
const word& name,
|
|
||||||
const volScalarField& T,
|
|
||||||
const dictionary& dict
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
// Destructor
|
|
||||||
|
|
||||||
virtual ~constantThermal();
|
|
||||||
|
|
||||||
|
|
||||||
// Member Functions
|
|
||||||
|
|
||||||
//- Return specific heat capacity
|
|
||||||
virtual tmp<volScalarField> C() const;
|
|
||||||
|
|
||||||
//- Return thermal conductivity
|
|
||||||
virtual tmp<volScalarField> k() const;
|
|
||||||
|
|
||||||
//- Return thermal expansion coefficient
|
|
||||||
virtual tmp<volScalarField> alpha() const;
|
|
||||||
|
|
||||||
//- Return reference temperature
|
|
||||||
virtual tmp<volScalarField> T0() const;
|
|
||||||
|
|
||||||
virtual void correct()
|
|
||||||
{}
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
} // End namespace Foam
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// ************************************************************************* //
|
|
|
@ -1,293 +0,0 @@
|
||||||
/*---------------------------------------------------------------------------*\
|
|
||||||
========= |
|
|
||||||
\\ / F ield | foam-extend: Open Source CFD
|
|
||||||
\\ / O peration | Version: 4.0
|
|
||||||
\\ / A nd | Web: http://www.foam-extend.org
|
|
||||||
\\/ M anipulation | For copyright notice see file Copyright
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
License
|
|
||||||
This file is part of foam-extend.
|
|
||||||
|
|
||||||
foam-extend 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.
|
|
||||||
|
|
||||||
foam-extend 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 foam-extend. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
\*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
#include "multiMaterialThermal.H"
|
|
||||||
#include "addToRunTimeSelectionTable.H"
|
|
||||||
#include "zeroGradientFvPatchFields.H"
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
namespace Foam
|
|
||||||
{
|
|
||||||
defineTypeNameAndDebug(multiMaterialThermal, 0);
|
|
||||||
addToRunTimeSelectionTable(thermalLaw, multiMaterialThermal, dictionary);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
|
|
||||||
|
|
||||||
Foam::tmp<Foam::scalarField> Foam::multiMaterialThermal::indicator
|
|
||||||
(
|
|
||||||
const label i
|
|
||||||
) const
|
|
||||||
{
|
|
||||||
const scalarField& mat = materials_.internalField();
|
|
||||||
|
|
||||||
tmp<scalarField> tresult(new scalarField(mat.size(), 0.0));
|
|
||||||
scalarField& result = tresult();
|
|
||||||
|
|
||||||
forAll (mat, matI)
|
|
||||||
{
|
|
||||||
if (mat[matI] > i - SMALL && mat[matI] < i + 1 - SMALL)
|
|
||||||
{
|
|
||||||
result[matI] = 1.0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return tresult;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
// Construct from dictionary
|
|
||||||
Foam::multiMaterialThermal::multiMaterialThermal
|
|
||||||
(
|
|
||||||
const word& name,
|
|
||||||
const volScalarField& T,
|
|
||||||
const dictionary& dict
|
|
||||||
)
|
|
||||||
:
|
|
||||||
thermalLaw(name, T, dict),
|
|
||||||
PtrList<thermalLaw>(),
|
|
||||||
materials_
|
|
||||||
(
|
|
||||||
IOobject
|
|
||||||
(
|
|
||||||
"materials",
|
|
||||||
mesh().time().timeName(),
|
|
||||||
mesh(),
|
|
||||||
IOobject::MUST_READ,
|
|
||||||
IOobject::AUTO_WRITE
|
|
||||||
),
|
|
||||||
mesh()
|
|
||||||
)
|
|
||||||
{
|
|
||||||
PtrList<thermalLaw>& laws = *this;
|
|
||||||
|
|
||||||
PtrList<entry> lawEntries(dict.lookup("laws"));
|
|
||||||
laws.setSize(lawEntries.size());
|
|
||||||
|
|
||||||
forAll (laws, lawI)
|
|
||||||
{
|
|
||||||
laws.set
|
|
||||||
(
|
|
||||||
lawI,
|
|
||||||
thermalLaw::New
|
|
||||||
(
|
|
||||||
lawEntries[lawI].keyword(),
|
|
||||||
T,
|
|
||||||
lawEntries[lawI].dict()
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
if
|
|
||||||
(
|
|
||||||
min(materials_).value() < 0
|
|
||||||
|| max(materials_).value() > laws.size() + SMALL
|
|
||||||
)
|
|
||||||
{
|
|
||||||
FatalErrorIn
|
|
||||||
(
|
|
||||||
"multiMaterialThermal::multiMaterialThermal\n"
|
|
||||||
"(\n"
|
|
||||||
" const word& name,\n"
|
|
||||||
" const volScalarField& T,\n"
|
|
||||||
" const dictionary& dict\n"
|
|
||||||
")"
|
|
||||||
) << "Invalid definition of material indicator field. "
|
|
||||||
<< "Number of materials: " << laws.size()
|
|
||||||
<< " max index: " << max(materials_)
|
|
||||||
<< ". Should be " << laws.size() - 1
|
|
||||||
<< abort(FatalError);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
Foam::multiMaterialThermal::~multiMaterialThermal()
|
|
||||||
{}
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
Foam::tmp<Foam::volScalarField> Foam::multiMaterialThermal::C() const
|
|
||||||
{
|
|
||||||
tmp<volScalarField> tresult
|
|
||||||
(
|
|
||||||
new volScalarField
|
|
||||||
(
|
|
||||||
IOobject
|
|
||||||
(
|
|
||||||
"C",
|
|
||||||
mesh().time().timeName(),
|
|
||||||
mesh(),
|
|
||||||
IOobject::NO_READ,
|
|
||||||
IOobject::NO_WRITE
|
|
||||||
),
|
|
||||||
mesh(),
|
|
||||||
dimensionedScalar("zeroC", dimSpecificHeatCapacity, 0),
|
|
||||||
zeroGradientFvPatchScalarField::typeName
|
|
||||||
)
|
|
||||||
);
|
|
||||||
volScalarField& result = tresult();
|
|
||||||
|
|
||||||
// Accumulate data for all fields
|
|
||||||
const PtrList<thermalLaw>& laws = *this;
|
|
||||||
|
|
||||||
forAll (laws, lawI)
|
|
||||||
{
|
|
||||||
result.internalField() +=
|
|
||||||
indicator(lawI)*laws[lawI].C()().internalField();
|
|
||||||
}
|
|
||||||
|
|
||||||
result.correctBoundaryConditions();
|
|
||||||
|
|
||||||
return tresult;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Foam::tmp<Foam::volScalarField> Foam::multiMaterialThermal::k() const
|
|
||||||
{
|
|
||||||
tmp<volScalarField> tresult
|
|
||||||
(
|
|
||||||
new volScalarField
|
|
||||||
(
|
|
||||||
IOobject
|
|
||||||
(
|
|
||||||
"k",
|
|
||||||
mesh().time().timeName(),
|
|
||||||
mesh(),
|
|
||||||
IOobject::NO_READ,
|
|
||||||
IOobject::NO_WRITE
|
|
||||||
),
|
|
||||||
mesh(),
|
|
||||||
dimensionedScalar("zerok", dimThermalConductivity, 0),
|
|
||||||
zeroGradientFvPatchScalarField::typeName
|
|
||||||
)
|
|
||||||
);
|
|
||||||
volScalarField& result = tresult();
|
|
||||||
|
|
||||||
// Accumulate data for all fields
|
|
||||||
const PtrList<thermalLaw>& laws = *this;
|
|
||||||
|
|
||||||
forAll (laws, lawI)
|
|
||||||
{
|
|
||||||
result.internalField() +=
|
|
||||||
indicator(lawI)*laws[lawI].k()().internalField();
|
|
||||||
}
|
|
||||||
|
|
||||||
result.correctBoundaryConditions();
|
|
||||||
|
|
||||||
return tresult;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Foam::tmp<Foam::volScalarField> Foam::multiMaterialThermal::alpha() const
|
|
||||||
{
|
|
||||||
tmp<volScalarField> tresult
|
|
||||||
(
|
|
||||||
new volScalarField
|
|
||||||
(
|
|
||||||
IOobject
|
|
||||||
(
|
|
||||||
"alpha",
|
|
||||||
mesh().time().timeName(),
|
|
||||||
mesh(),
|
|
||||||
IOobject::NO_READ,
|
|
||||||
IOobject::NO_WRITE
|
|
||||||
),
|
|
||||||
mesh(),
|
|
||||||
dimensionedScalar("zeroE", dimless/dimTemperature, 0),
|
|
||||||
zeroGradientFvPatchScalarField::typeName
|
|
||||||
)
|
|
||||||
);
|
|
||||||
volScalarField& result = tresult();
|
|
||||||
|
|
||||||
// Accumulate data for all fields
|
|
||||||
const PtrList<thermalLaw>& laws = *this;
|
|
||||||
|
|
||||||
forAll (laws, lawI)
|
|
||||||
{
|
|
||||||
result.internalField() +=
|
|
||||||
indicator(lawI)*laws[lawI].alpha()().internalField();
|
|
||||||
}
|
|
||||||
|
|
||||||
result.correctBoundaryConditions();
|
|
||||||
|
|
||||||
return tresult;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Foam::tmp<Foam::volScalarField> Foam::multiMaterialThermal::T0() const
|
|
||||||
{
|
|
||||||
tmp<volScalarField> tresult
|
|
||||||
(
|
|
||||||
new volScalarField
|
|
||||||
(
|
|
||||||
IOobject
|
|
||||||
(
|
|
||||||
"T0",
|
|
||||||
mesh().time().timeName(),
|
|
||||||
mesh(),
|
|
||||||
IOobject::NO_READ,
|
|
||||||
IOobject::NO_WRITE
|
|
||||||
),
|
|
||||||
mesh(),
|
|
||||||
dimensionedScalar("zeroT0", dimTemperature, 0),
|
|
||||||
zeroGradientFvPatchScalarField::typeName
|
|
||||||
)
|
|
||||||
);
|
|
||||||
volScalarField& result = tresult();
|
|
||||||
|
|
||||||
// Accumulate data for all fields
|
|
||||||
const PtrList<thermalLaw>& laws = *this;
|
|
||||||
|
|
||||||
forAll (laws, lawI)
|
|
||||||
{
|
|
||||||
result.internalField() +=
|
|
||||||
indicator(lawI)*laws[lawI].T0()().internalField();
|
|
||||||
}
|
|
||||||
|
|
||||||
result.correctBoundaryConditions();
|
|
||||||
|
|
||||||
return tresult;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void Foam::multiMaterialThermal::correct()
|
|
||||||
{
|
|
||||||
PtrList<thermalLaw>& laws = *this;
|
|
||||||
|
|
||||||
forAll (laws, lawI)
|
|
||||||
{
|
|
||||||
laws[lawI].correct();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// ************************************************************************* //
|
|
|
@ -1,125 +0,0 @@
|
||||||
/*---------------------------------------------------------------------------*\
|
|
||||||
========= |
|
|
||||||
\\ / F ield | foam-extend: Open Source CFD
|
|
||||||
\\ / O peration | Version: 4.0
|
|
||||||
\\ / A nd | Web: http://www.foam-extend.org
|
|
||||||
\\/ M anipulation | For copyright notice see file Copyright
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
License
|
|
||||||
This file is part of foam-extend.
|
|
||||||
|
|
||||||
foam-extend 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.
|
|
||||||
|
|
||||||
foam-extend 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 foam-extend. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
Class
|
|
||||||
multiMaterialThermal
|
|
||||||
|
|
||||||
Description
|
|
||||||
Zoned multi-material thermal model controlled by an indicator field.
|
|
||||||
|
|
||||||
Author
|
|
||||||
Hrvoje Jasak, Wikki Ltd. All rights reserved.
|
|
||||||
|
|
||||||
SourceFiles
|
|
||||||
multiMaterialThermal.C
|
|
||||||
|
|
||||||
\*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
#ifndef multiMaterialThermal_H
|
|
||||||
#define multiMaterialThermal_H
|
|
||||||
|
|
||||||
#include "thermalLaw.H"
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
namespace Foam
|
|
||||||
{
|
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*\
|
|
||||||
Class multiMaterialThermal Declaration
|
|
||||||
\*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
class multiMaterialThermal
|
|
||||||
:
|
|
||||||
public thermalLaw,
|
|
||||||
public PtrList<thermalLaw>
|
|
||||||
{
|
|
||||||
// Private data
|
|
||||||
|
|
||||||
//- Material indicator field
|
|
||||||
volScalarField materials_;
|
|
||||||
|
|
||||||
// Private Member Functions
|
|
||||||
|
|
||||||
//- Disallow default bitwise copy construct
|
|
||||||
multiMaterialThermal(const multiMaterialThermal&);
|
|
||||||
|
|
||||||
//- Disallow default bitwise assignment
|
|
||||||
void operator=(const multiMaterialThermal&);
|
|
||||||
|
|
||||||
|
|
||||||
//- Calculate indicator field given index
|
|
||||||
tmp<scalarField> indicator(const label index) const;
|
|
||||||
|
|
||||||
public:
|
|
||||||
|
|
||||||
//- Runtime type information
|
|
||||||
TypeName("multiMaterial");
|
|
||||||
|
|
||||||
// Static data members
|
|
||||||
|
|
||||||
|
|
||||||
// Constructors
|
|
||||||
|
|
||||||
//- Construct from dictionary
|
|
||||||
multiMaterialThermal
|
|
||||||
(
|
|
||||||
const word& name,
|
|
||||||
const volScalarField& T,
|
|
||||||
const dictionary& dict
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
// Destructor
|
|
||||||
|
|
||||||
virtual ~multiMaterialThermal();
|
|
||||||
|
|
||||||
|
|
||||||
// Member Functions
|
|
||||||
|
|
||||||
//- Return specific heat capacity
|
|
||||||
virtual tmp<volScalarField> C() const;
|
|
||||||
|
|
||||||
//- Return thermal conductivity
|
|
||||||
virtual tmp<volScalarField> k() const;
|
|
||||||
|
|
||||||
//- Return thermal expansion coefficient
|
|
||||||
virtual tmp<volScalarField> alpha() const;
|
|
||||||
|
|
||||||
//- Return reference temperature
|
|
||||||
virtual tmp<volScalarField> T0() const;
|
|
||||||
|
|
||||||
//- Correct the rheological model
|
|
||||||
virtual void correct();
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
} // End namespace Foam
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// ************************************************************************* //
|
|
|
@ -1,79 +0,0 @@
|
||||||
/*---------------------------------------------------------------------------*\
|
|
||||||
========= |
|
|
||||||
\\ / F ield | foam-extend: Open Source CFD
|
|
||||||
\\ / O peration | Version: 4.0
|
|
||||||
\\ / A nd | Web: http://www.foam-extend.org
|
|
||||||
\\/ M anipulation | For copyright notice see file Copyright
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
License
|
|
||||||
This file is part of foam-extend.
|
|
||||||
|
|
||||||
foam-extend 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.
|
|
||||||
|
|
||||||
foam-extend 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 foam-extend. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
Class
|
|
||||||
thermalLaw
|
|
||||||
|
|
||||||
\*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
#include "thermalLaw.H"
|
|
||||||
#include "volFields.H"
|
|
||||||
#include "surfaceFields.H"
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
namespace Foam
|
|
||||||
{
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
autoPtr<thermalLaw> thermalLaw::New
|
|
||||||
(
|
|
||||||
const word& name,
|
|
||||||
const volScalarField& T,
|
|
||||||
const dictionary& dict
|
|
||||||
)
|
|
||||||
{
|
|
||||||
word rheoTypeName = dict.lookup("type");
|
|
||||||
|
|
||||||
Info<< "Selecting thermal model " << rheoTypeName << endl;
|
|
||||||
|
|
||||||
dictionaryConstructorTable::iterator cstrIter =
|
|
||||||
dictionaryConstructorTablePtr_->find(rheoTypeName);
|
|
||||||
|
|
||||||
if (cstrIter == dictionaryConstructorTablePtr_->end())
|
|
||||||
{
|
|
||||||
FatalIOErrorIn
|
|
||||||
(
|
|
||||||
"thermalLaw::New(\n"
|
|
||||||
" const word& name,\n"
|
|
||||||
" const volScalarField& T,\n"
|
|
||||||
" const dictionary& dict\n"
|
|
||||||
")",
|
|
||||||
dict
|
|
||||||
) << "Unknown thermalLaw type "
|
|
||||||
<< rheoTypeName << endl << endl
|
|
||||||
<< "Valid thermalLaws are : " << endl
|
|
||||||
<< dictionaryConstructorTablePtr_->sortedToc()
|
|
||||||
<< exit(FatalIOError);
|
|
||||||
}
|
|
||||||
|
|
||||||
return autoPtr<thermalLaw>(cstrIter()(name, T, dict));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
} // End namespace Foam
|
|
||||||
|
|
||||||
// ************************************************************************* //
|
|
|
@ -1,62 +0,0 @@
|
||||||
/*---------------------------------------------------------------------------*\
|
|
||||||
========= |
|
|
||||||
\\ / F ield | foam-extend: Open Source CFD
|
|
||||||
\\ / O peration | Version: 4.0
|
|
||||||
\\ / A nd | Web: http://www.foam-extend.org
|
|
||||||
\\/ M anipulation | For copyright notice see file Copyright
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
License
|
|
||||||
This file is part of foam-extend.
|
|
||||||
|
|
||||||
foam-extend 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.
|
|
||||||
|
|
||||||
foam-extend 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 foam-extend. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
Class
|
|
||||||
thermalLaw
|
|
||||||
|
|
||||||
\*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
#include "thermalLaw.H"
|
|
||||||
#include "volFields.H"
|
|
||||||
#include "fvc.H"
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
namespace Foam
|
|
||||||
{
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
defineTypeNameAndDebug(thermalLaw, 0);
|
|
||||||
defineRunTimeSelectionTable(thermalLaw, dictionary);
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
thermalLaw::thermalLaw
|
|
||||||
(
|
|
||||||
const word& name,
|
|
||||||
const volScalarField& T,
|
|
||||||
const dictionary& dict
|
|
||||||
)
|
|
||||||
:
|
|
||||||
name_(name),
|
|
||||||
T_(T)
|
|
||||||
{}
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
} // End namespace Foam
|
|
||||||
|
|
||||||
// ************************************************************************* //
|
|
|
@ -1,170 +0,0 @@
|
||||||
/*---------------------------------------------------------------------------*\
|
|
||||||
========= |
|
|
||||||
\\ / F ield | foam-extend: Open Source CFD
|
|
||||||
\\ / O peration | Version: 4.0
|
|
||||||
\\ / A nd | Web: http://www.foam-extend.org
|
|
||||||
\\/ M anipulation | For copyright notice see file Copyright
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
License
|
|
||||||
This file is part of foam-extend.
|
|
||||||
|
|
||||||
foam-extend 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.
|
|
||||||
|
|
||||||
foam-extend 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 foam-extend. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
Class
|
|
||||||
thermalLaw
|
|
||||||
|
|
||||||
Description
|
|
||||||
Thermal material properties for solids.
|
|
||||||
|
|
||||||
Author
|
|
||||||
Hrvoje Jasak, Wikki Ltd. All rights reserved.
|
|
||||||
|
|
||||||
SourceFiles
|
|
||||||
thermalLaw.C
|
|
||||||
newThermalLaw.C
|
|
||||||
|
|
||||||
\*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
#ifndef thermalLaw_H
|
|
||||||
#define thermalLaw_H
|
|
||||||
|
|
||||||
#include "IOdictionary.H"
|
|
||||||
#include "typeInfo.H"
|
|
||||||
#include "runTimeSelectionTables.H"
|
|
||||||
#include "volFields.H"
|
|
||||||
#include "tmp.H"
|
|
||||||
#include "autoPtr.H"
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
namespace Foam
|
|
||||||
{
|
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*\
|
|
||||||
Class thermalLaw Declaration
|
|
||||||
\*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
class thermalLaw
|
|
||||||
{
|
|
||||||
// Private data
|
|
||||||
|
|
||||||
//- Name
|
|
||||||
const word name_;
|
|
||||||
|
|
||||||
//- Reference to stress field
|
|
||||||
const volScalarField& T_;
|
|
||||||
|
|
||||||
|
|
||||||
// Private Member Functions
|
|
||||||
|
|
||||||
//- Disallow copy construct
|
|
||||||
thermalLaw(const thermalLaw&);
|
|
||||||
|
|
||||||
//- Disallow default bitwise assignment
|
|
||||||
void operator=(const thermalLaw&);
|
|
||||||
|
|
||||||
|
|
||||||
protected:
|
|
||||||
|
|
||||||
//- Return reference to mesh
|
|
||||||
const fvMesh& mesh() const
|
|
||||||
{
|
|
||||||
return T_.mesh();
|
|
||||||
}
|
|
||||||
|
|
||||||
public:
|
|
||||||
|
|
||||||
//- Runtime type information
|
|
||||||
TypeName("thermalLaw");
|
|
||||||
|
|
||||||
|
|
||||||
// Declare run-time constructor selection table
|
|
||||||
|
|
||||||
declareRunTimeSelectionTable
|
|
||||||
(
|
|
||||||
autoPtr,
|
|
||||||
thermalLaw,
|
|
||||||
dictionary,
|
|
||||||
(
|
|
||||||
const word name,
|
|
||||||
const volScalarField& T,
|
|
||||||
const dictionary& dict
|
|
||||||
),
|
|
||||||
(name, T, dict)
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
// Selectors
|
|
||||||
|
|
||||||
//- Return a reference to the selected thermal model
|
|
||||||
static autoPtr<thermalLaw> New
|
|
||||||
(
|
|
||||||
const word& name,
|
|
||||||
const volScalarField& T,
|
|
||||||
const dictionary& dict
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
// Constructors
|
|
||||||
|
|
||||||
//- Construct from dictionary
|
|
||||||
thermalLaw
|
|
||||||
(
|
|
||||||
const word& name,
|
|
||||||
const volScalarField& T,
|
|
||||||
const dictionary& dict
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
// Destructor
|
|
||||||
|
|
||||||
virtual ~thermalLaw()
|
|
||||||
{}
|
|
||||||
|
|
||||||
|
|
||||||
// Member Functions
|
|
||||||
|
|
||||||
//- Return name
|
|
||||||
const word& name() const
|
|
||||||
{
|
|
||||||
return name_;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//- Return specific heat capacity
|
|
||||||
virtual tmp<volScalarField> C() const = 0;
|
|
||||||
|
|
||||||
//- Return thermal conductivity
|
|
||||||
virtual tmp<volScalarField> k() const = 0;
|
|
||||||
|
|
||||||
//- Return thermal expansion coefficient
|
|
||||||
virtual tmp<volScalarField> alpha() const = 0;
|
|
||||||
|
|
||||||
//- Return reference temperature
|
|
||||||
virtual tmp<volScalarField> T0() const = 0;
|
|
||||||
|
|
||||||
//- Correct the rheological model
|
|
||||||
virtual void correct() = 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
} // End namespace Foam
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// ************************************************************************* //
|
|
|
@ -1,90 +0,0 @@
|
||||||
/*---------------------------------------------------------------------------*\
|
|
||||||
========= |
|
|
||||||
\\ / F ield | foam-extend: Open Source CFD
|
|
||||||
\\ / O peration | Version: 4.0
|
|
||||||
\\ / A nd | Web: http://www.foam-extend.org
|
|
||||||
\\/ M anipulation | For copyright notice see file Copyright
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
License
|
|
||||||
This file is part of foam-extend.
|
|
||||||
|
|
||||||
foam-extend 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.
|
|
||||||
|
|
||||||
foam-extend 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 foam-extend. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
Class
|
|
||||||
thermalModel
|
|
||||||
|
|
||||||
Description
|
|
||||||
Thermal material properties for solids.
|
|
||||||
|
|
||||||
Author
|
|
||||||
Hrvoje Jasak, Wikki Ltd. All rights reserved.
|
|
||||||
|
|
||||||
\*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
#include "thermalModel.H"
|
|
||||||
#include "volFields.H"
|
|
||||||
#include "fvc.H"
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
namespace Foam
|
|
||||||
{
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
defineTypeNameAndDebug(thermalModel, 0);
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
thermalModel::thermalModel(const volScalarField& T)
|
|
||||||
:
|
|
||||||
IOdictionary
|
|
||||||
(
|
|
||||||
IOobject
|
|
||||||
(
|
|
||||||
"thermalProperties",
|
|
||||||
T.time().constant(),
|
|
||||||
T.db(),
|
|
||||||
IOobject::MUST_READ_IF_MODIFIED,
|
|
||||||
IOobject::NO_WRITE
|
|
||||||
)
|
|
||||||
),
|
|
||||||
T_(T),
|
|
||||||
lawPtr_(thermalLaw::New("law", T_, subDict("thermal")))
|
|
||||||
{}
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
bool thermalModel::read()
|
|
||||||
{
|
|
||||||
if (regIOobject::read())
|
|
||||||
{
|
|
||||||
lawPtr_ = thermalLaw::New("law", T_, subDict("thermal"));
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
} // End namespace Foam
|
|
||||||
|
|
||||||
// ************************************************************************* //
|
|
|
@ -1,148 +0,0 @@
|
||||||
/*---------------------------------------------------------------------------*\
|
|
||||||
========= |
|
|
||||||
\\ / F ield | foam-extend: Open Source CFD
|
|
||||||
\\ / O peration | Version: 4.0
|
|
||||||
\\ / A nd | Web: http://www.foam-extend.org
|
|
||||||
\\/ M anipulation | For copyright notice see file Copyright
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
License
|
|
||||||
This file is part of foam-extend.
|
|
||||||
|
|
||||||
foam-extend 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.
|
|
||||||
|
|
||||||
foam-extend 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 foam-extend. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
Class
|
|
||||||
thermalModel
|
|
||||||
|
|
||||||
Description
|
|
||||||
Thermal material properties for solids.
|
|
||||||
|
|
||||||
Author
|
|
||||||
Hrvoje Jasak, Wikki Ltd. All rights reserved.
|
|
||||||
|
|
||||||
SourceFiles
|
|
||||||
thermalModel.C
|
|
||||||
|
|
||||||
\*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
#ifndef thermalModel_H
|
|
||||||
#define thermalModel_H
|
|
||||||
|
|
||||||
#include "IOdictionary.H"
|
|
||||||
#include "typeInfo.H"
|
|
||||||
#include "runTimeSelectionTables.H"
|
|
||||||
#include "volFields.H"
|
|
||||||
#include "tmp.H"
|
|
||||||
#include "thermalLaw.H"
|
|
||||||
#include "Switch.H"
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
namespace Foam
|
|
||||||
{
|
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*\
|
|
||||||
Class thermalModel Declaration
|
|
||||||
\*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
class thermalModel
|
|
||||||
:
|
|
||||||
public IOdictionary
|
|
||||||
{
|
|
||||||
// Private data
|
|
||||||
|
|
||||||
//- Reference to temperature field
|
|
||||||
const volScalarField& T_;
|
|
||||||
|
|
||||||
//- Thermal law
|
|
||||||
autoPtr<thermalLaw> lawPtr_;
|
|
||||||
|
|
||||||
|
|
||||||
// Private Member Functions
|
|
||||||
|
|
||||||
//- Disallow copy construct
|
|
||||||
thermalModel(const thermalModel&);
|
|
||||||
|
|
||||||
//- Disallow default bitwise assignment
|
|
||||||
void operator=(const thermalModel&);
|
|
||||||
|
|
||||||
|
|
||||||
public:
|
|
||||||
|
|
||||||
//- Runtime type information
|
|
||||||
TypeName("thermalModel");
|
|
||||||
|
|
||||||
// Constructors
|
|
||||||
|
|
||||||
//- Construct from dictionary
|
|
||||||
thermalModel(const volScalarField& T);
|
|
||||||
|
|
||||||
|
|
||||||
// Destructor
|
|
||||||
|
|
||||||
virtual ~thermalModel()
|
|
||||||
{}
|
|
||||||
|
|
||||||
|
|
||||||
// Member Functions
|
|
||||||
|
|
||||||
//- Return thermal law
|
|
||||||
const thermalLaw& law() const
|
|
||||||
{
|
|
||||||
return lawPtr_();
|
|
||||||
}
|
|
||||||
|
|
||||||
//- Return specific heat capacity
|
|
||||||
tmp<volScalarField> C() const
|
|
||||||
{
|
|
||||||
return lawPtr_->C();
|
|
||||||
}
|
|
||||||
|
|
||||||
//- Return thermal conductivity
|
|
||||||
tmp<volScalarField> k() const
|
|
||||||
{
|
|
||||||
return lawPtr_->k();
|
|
||||||
}
|
|
||||||
|
|
||||||
//- Return thermal expansion coefficient
|
|
||||||
tmp<volScalarField> alpha() const
|
|
||||||
{
|
|
||||||
return lawPtr_->alpha();
|
|
||||||
}
|
|
||||||
|
|
||||||
//- Return reference temperature
|
|
||||||
tmp<volScalarField> T0() const
|
|
||||||
{
|
|
||||||
return lawPtr_->T0();
|
|
||||||
}
|
|
||||||
|
|
||||||
//- Correct the thermal model
|
|
||||||
void correct()
|
|
||||||
{
|
|
||||||
lawPtr_->correct();
|
|
||||||
}
|
|
||||||
|
|
||||||
//- Read thermalProperties dictionary
|
|
||||||
virtual bool read();
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
} // End namespace Foam
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// ************************************************************************* //
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*--------------------------------*- C++ -*----------------------------------*\
|
/*--------------------------------*- C++ -*----------------------------------*\
|
||||||
| ========= | |
|
| ========= | |
|
||||||
| \\ / F ield | foam-extend: Open Source CFD |
|
| \\ / F ield | foam-extend: Open Source CFD |
|
||||||
| \\ / O peration | Version: 4.0 |
|
| \\ / O peration | Version: 4.1 |
|
||||||
| \\ / A nd | Web: http://www.foam-extend.org |
|
| \\ / A nd | Web: http://www.foam-extend.org |
|
||||||
| \\/ M anipulation | |
|
| \\/ M anipulation | |
|
||||||
\*---------------------------------------------------------------------------*/
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
|
@ -27,6 +27,10 @@ thermal
|
||||||
C C [0 2 -2 -1 0] 100;
|
C C [0 2 -2 -1 0] 100;
|
||||||
k k [1 1 -3 -1 0] 10;
|
k k [1 1 -3 -1 0] 10;
|
||||||
|
|
||||||
|
// Values not used
|
||||||
|
alpha alpha [0 0 0 -1 0 0 0] 0.0;
|
||||||
|
T0 T0 [0 0 0 1 0 0 0] 0.0;
|
||||||
|
|
||||||
zones ( solidBlock );
|
zones ( solidBlock );
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*--------------------------------*- C++ -*----------------------------------*\
|
/*--------------------------------*- C++ -*----------------------------------*\
|
||||||
| ========= | |
|
| ========= | |
|
||||||
| \\ / F ield | foam-extend: Open Source CFD |
|
| \\ / F ield | foam-extend: Open Source CFD |
|
||||||
| \\ / O peration | Version: 4.0 |
|
| \\ / O peration | Version: 4.1 |
|
||||||
| \\ / A nd | Web: http://www.foam-extend.org |
|
| \\ / A nd | Web: http://www.foam-extend.org |
|
||||||
| \\/ M anipulation | |
|
| \\/ M anipulation | |
|
||||||
\*---------------------------------------------------------------------------*/
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
|
@ -27,6 +27,10 @@ thermal
|
||||||
C C [0 2 -2 -1 0] 100;
|
C C [0 2 -2 -1 0] 100;
|
||||||
k k [1 1 -3 -1 0] 10;
|
k k [1 1 -3 -1 0] 10;
|
||||||
|
|
||||||
|
// Values not used
|
||||||
|
alpha alpha [0 0 0 -1 0 0 0] 0.0;
|
||||||
|
T0 T0 [0 0 0 1 0 0 0] 0.0;
|
||||||
|
|
||||||
zones ( solidBlock );
|
zones ( solidBlock );
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
|
@ -20,6 +20,10 @@ thermal
|
||||||
rho rho [1 -3 0 0 0] 10;
|
rho rho [1 -3 0 0 0] 10;
|
||||||
C C [0 2 -2 -1 0] 100;
|
C C [0 2 -2 -1 0] 100;
|
||||||
k k [1 1 -3 -1 0] 10;
|
k k [1 1 -3 -1 0] 10;
|
||||||
|
|
||||||
|
// Values not used
|
||||||
|
alpha alpha [0 0 0 -1 0 0 0] 0.0;
|
||||||
|
T0 T0 [0 0 0 1 0 0 0] 0.0;
|
||||||
|
|
||||||
gaps
|
gaps
|
||||||
(
|
(
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*--------------------------------*- C++ -*----------------------------------*\
|
/*--------------------------------*- C++ -*----------------------------------*\
|
||||||
| ========= | |
|
| ========= | |
|
||||||
| \\ / F ield | foam-extend: Open Source CFD |
|
| \\ / F ield | foam-extend: Open Source CFD |
|
||||||
| \\ / O peration | Version: 4.0 |
|
| \\ / O peration | Version: 4.1 |
|
||||||
| \\ / A nd | Web: http://www.foam-extend.org |
|
| \\ / A nd | Web: http://www.foam-extend.org |
|
||||||
| \\/ M anipulation | |
|
| \\/ M anipulation | |
|
||||||
\*---------------------------------------------------------------------------*/
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
|
@ -21,6 +21,11 @@ thermal
|
||||||
k k [1 1 -3 -1 0 0 0] 250;
|
k k [1 1 -3 -1 0 0 0] 250;
|
||||||
alpha alpha [0 0 0 -1 0 0 0] 2.3e-05;
|
alpha alpha [0 0 0 -1 0 0 0] 2.3e-05;
|
||||||
T0 T0 [0 0 0 1 0 0 0] 0;
|
T0 T0 [0 0 0 1 0 0 0] 0;
|
||||||
|
|
||||||
|
// Data not used
|
||||||
|
rho rho [1 -3 0 0 0 0 0] 1;
|
||||||
|
gaps ();
|
||||||
|
sources ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,49 @@
|
||||||
|
/*--------------------------------*- C++ -*----------------------------------*\
|
||||||
|
| ========= | |
|
||||||
|
| \\ / F ield | foam-extend: Open Source CFD |
|
||||||
|
| \\ / O peration | Version: 4.0 |
|
||||||
|
| \\ / A nd | Web: http://www.foam-extend.org |
|
||||||
|
| \\/ M anipulation | |
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
FoamFile
|
||||||
|
{
|
||||||
|
version 2.0;
|
||||||
|
format ascii;
|
||||||
|
class volVectorField;
|
||||||
|
location "0";
|
||||||
|
object U;
|
||||||
|
}
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
dimensions [0 1 -1 0 0 0 0];
|
||||||
|
|
||||||
|
internalField uniform (0 0 1);
|
||||||
|
|
||||||
|
boundaryField
|
||||||
|
{
|
||||||
|
walls
|
||||||
|
{
|
||||||
|
type fixedValue;
|
||||||
|
value uniform (0 0 1);
|
||||||
|
}
|
||||||
|
inlet
|
||||||
|
{
|
||||||
|
type fixedValue;
|
||||||
|
value uniform (0 0 1);
|
||||||
|
}
|
||||||
|
outlet
|
||||||
|
{
|
||||||
|
type zeroGradient;
|
||||||
|
}
|
||||||
|
movingSlider
|
||||||
|
{
|
||||||
|
type ggi;
|
||||||
|
}
|
||||||
|
staticSlider
|
||||||
|
{
|
||||||
|
type ggi;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
|
@ -0,0 +1,40 @@
|
||||||
|
// -*- C++ -*-
|
||||||
|
// File generated by PyFoam - sorry for the ugliness
|
||||||
|
|
||||||
|
FoamFile
|
||||||
|
{
|
||||||
|
version 2.0;
|
||||||
|
format ascii;
|
||||||
|
class volScalarField;
|
||||||
|
object p;
|
||||||
|
}
|
||||||
|
|
||||||
|
dimensions [ 0 2 -2 0 0 0 0 ];
|
||||||
|
|
||||||
|
internalField uniform 0;
|
||||||
|
|
||||||
|
boundaryField
|
||||||
|
{
|
||||||
|
walls
|
||||||
|
{
|
||||||
|
type zeroGradient;
|
||||||
|
}
|
||||||
|
staticSlider
|
||||||
|
{
|
||||||
|
type ggi;
|
||||||
|
}
|
||||||
|
movingSlider
|
||||||
|
{
|
||||||
|
type ggi;
|
||||||
|
}
|
||||||
|
inlet
|
||||||
|
{
|
||||||
|
type zeroGradient;
|
||||||
|
}
|
||||||
|
outlet
|
||||||
|
{
|
||||||
|
type fixedValue;
|
||||||
|
value uniform 0;
|
||||||
|
}
|
||||||
|
} // ************************************************************************* //
|
||||||
|
|
|
@ -0,0 +1,11 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
# Source tutorial clean functions
|
||||||
|
. $WM_PROJECT_DIR/bin/tools/CleanFunctions
|
||||||
|
|
||||||
|
cleanCase
|
||||||
|
\rm -rf VTK
|
||||||
|
\rm -rf 0
|
||||||
|
\cp -r save 0
|
||||||
|
\rm -f constant/polyMesh/boundary
|
||||||
|
\rm -rf constant/polyMesh/sets
|
|
@ -0,0 +1,13 @@
|
||||||
|
#!/bin/sh
|
||||||
|
# Source tutorial run functions
|
||||||
|
. $WM_PROJECT_DIR/bin/tools/RunFunctions
|
||||||
|
|
||||||
|
application="potentialFoam"
|
||||||
|
|
||||||
|
runApplication blockMesh
|
||||||
|
\cp -r boundary constant/polyMesh/.
|
||||||
|
|
||||||
|
runApplication setSet -batch setBatch.batch
|
||||||
|
runApplication setsToZones -noFlipMap
|
||||||
|
|
||||||
|
runApplication $application
|
|
@ -0,0 +1,61 @@
|
||||||
|
/*--------------------------------*- C++ -*----------------------------------*\
|
||||||
|
| ========= | |
|
||||||
|
| \\ / F ield | foam-extend: Open Source CFD |
|
||||||
|
| \\ / O peration | Version: 4.1 |
|
||||||
|
| \\ / A nd | Web: http://www.foam-extend.org |
|
||||||
|
| \\/ M anipulation | |
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
FoamFile
|
||||||
|
{
|
||||||
|
version 2.0;
|
||||||
|
format ascii;
|
||||||
|
class polyBoundaryMesh;
|
||||||
|
location "constant/polyMesh";
|
||||||
|
object boundary;
|
||||||
|
}
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
5
|
||||||
|
(
|
||||||
|
walls
|
||||||
|
{
|
||||||
|
type wall;
|
||||||
|
nFaces 24;
|
||||||
|
startFace 8;
|
||||||
|
}
|
||||||
|
inlet
|
||||||
|
{
|
||||||
|
type patch;
|
||||||
|
nFaces 1;
|
||||||
|
startFace 32;
|
||||||
|
}
|
||||||
|
outlet
|
||||||
|
{
|
||||||
|
type patch;
|
||||||
|
nFaces 3;
|
||||||
|
startFace 33;
|
||||||
|
}
|
||||||
|
movingSlider
|
||||||
|
{
|
||||||
|
type ggi;
|
||||||
|
nFaces 3;
|
||||||
|
startFace 36;
|
||||||
|
|
||||||
|
shadowPatch staticSlider;
|
||||||
|
zone movingSliderZone;
|
||||||
|
bridgeOverlap true;
|
||||||
|
}
|
||||||
|
staticSlider
|
||||||
|
{
|
||||||
|
type ggi;
|
||||||
|
nFaces 1;
|
||||||
|
startFace 39;
|
||||||
|
|
||||||
|
shadowPatch movingSlider;
|
||||||
|
zone staticSliderZone;
|
||||||
|
bridgeOverlap true;
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
|
@ -0,0 +1,110 @@
|
||||||
|
/*--------------------------------*- C++ -*----------------------------------*\
|
||||||
|
| ========= | |
|
||||||
|
| \\ / F ield | foam-extend: Open Source CFD |
|
||||||
|
| \\ / O peration | Version: 3.2 |
|
||||||
|
| \\ / A nd | Web: http://www.foam-extend.org |
|
||||||
|
| \\/ M anipulation | |
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
FoamFile
|
||||||
|
{
|
||||||
|
version 2.0;
|
||||||
|
format ascii;
|
||||||
|
class dictionary;
|
||||||
|
object blockMeshDict;
|
||||||
|
}
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
convertToMeters 1;
|
||||||
|
|
||||||
|
vertices
|
||||||
|
(
|
||||||
|
(0 0 0)
|
||||||
|
(1 0 0)
|
||||||
|
(1 1 0)
|
||||||
|
(0 1 0)
|
||||||
|
(0 0 5)
|
||||||
|
(1 0 5)
|
||||||
|
(1 1 5)
|
||||||
|
(0 1 5)
|
||||||
|
|
||||||
|
(0 0 5)
|
||||||
|
(1 0 5)
|
||||||
|
(1 0.56 5)
|
||||||
|
(0 0.56 5)
|
||||||
|
(0 0 10)
|
||||||
|
(1 0 10)
|
||||||
|
(1 0.56 10)
|
||||||
|
(0 0.56 10)
|
||||||
|
);
|
||||||
|
|
||||||
|
blocks
|
||||||
|
(
|
||||||
|
hex (0 1 2 3 4 5 6 7) stationary (1 1 2) simpleGrading (1 1 1)
|
||||||
|
hex (8 9 10 11 12 13 14 15) moving (1 3 2) simpleGrading (1 1 1)
|
||||||
|
);
|
||||||
|
|
||||||
|
edges
|
||||||
|
(
|
||||||
|
|
||||||
|
);
|
||||||
|
|
||||||
|
boundary
|
||||||
|
(
|
||||||
|
walls
|
||||||
|
{
|
||||||
|
type wall;
|
||||||
|
faces
|
||||||
|
(
|
||||||
|
(0 1 5 4)
|
||||||
|
(1 2 6 5)
|
||||||
|
(2 3 7 6)
|
||||||
|
(0 4 7 3)
|
||||||
|
(9 10 14 13)
|
||||||
|
(10 11 15 14)
|
||||||
|
(8 12 15 11)
|
||||||
|
(8 9 13 12)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
inlet
|
||||||
|
{
|
||||||
|
type patch;
|
||||||
|
faces
|
||||||
|
(
|
||||||
|
(0 3 2 1)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
outlet
|
||||||
|
{
|
||||||
|
type patch;
|
||||||
|
faces
|
||||||
|
(
|
||||||
|
(12 13 14 15)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
movingSlider
|
||||||
|
{
|
||||||
|
type patch;
|
||||||
|
faces
|
||||||
|
(
|
||||||
|
(9 8 11 10)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
staticSlider
|
||||||
|
{
|
||||||
|
type patch;
|
||||||
|
faces
|
||||||
|
(
|
||||||
|
(4 5 6 7)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
mergePatchPairs
|
||||||
|
(
|
||||||
|
);
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
|
@ -0,0 +1,22 @@
|
||||||
|
/*--------------------------------*- C++ -*----------------------------------*\
|
||||||
|
| ========= | |
|
||||||
|
| \\ / F ield | foam-extend: Open Source CFD |
|
||||||
|
| \\ / O peration | Version: 4.0 |
|
||||||
|
| \\ / A nd | Web: http://www.foam-extend.org |
|
||||||
|
| \\/ M anipulation | |
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
FoamFile
|
||||||
|
{
|
||||||
|
version 2.0;
|
||||||
|
format ascii;
|
||||||
|
class dictionary;
|
||||||
|
object transportProperties;
|
||||||
|
}
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
transportModel Newtonian;
|
||||||
|
|
||||||
|
//nu nu [0 2 -1 0 0 0 0] 1e-5;
|
||||||
|
nu nu [0 2 -1 0 0 0 0] 0;
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
|
@ -0,0 +1,49 @@
|
||||||
|
/*--------------------------------*- C++ -*----------------------------------*\
|
||||||
|
| ========= | |
|
||||||
|
| \\ / F ield | foam-extend: Open Source CFD |
|
||||||
|
| \\ / O peration | Version: 4.0 |
|
||||||
|
| \\ / A nd | Web: http://www.foam-extend.org |
|
||||||
|
| \\/ M anipulation | |
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
FoamFile
|
||||||
|
{
|
||||||
|
version 2.0;
|
||||||
|
format ascii;
|
||||||
|
class volVectorField;
|
||||||
|
location "0";
|
||||||
|
object U;
|
||||||
|
}
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
dimensions [0 1 -1 0 0 0 0];
|
||||||
|
|
||||||
|
internalField uniform (0 0 1);
|
||||||
|
|
||||||
|
boundaryField
|
||||||
|
{
|
||||||
|
walls
|
||||||
|
{
|
||||||
|
type fixedValue;
|
||||||
|
value uniform (0 0 1);
|
||||||
|
}
|
||||||
|
inlet
|
||||||
|
{
|
||||||
|
type fixedValue;
|
||||||
|
value uniform (0 0 1);
|
||||||
|
}
|
||||||
|
outlet
|
||||||
|
{
|
||||||
|
type zeroGradient;
|
||||||
|
}
|
||||||
|
movingSlider
|
||||||
|
{
|
||||||
|
type ggi;
|
||||||
|
}
|
||||||
|
staticSlider
|
||||||
|
{
|
||||||
|
type ggi;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
|
@ -0,0 +1,40 @@
|
||||||
|
// -*- C++ -*-
|
||||||
|
// File generated by PyFoam - sorry for the ugliness
|
||||||
|
|
||||||
|
FoamFile
|
||||||
|
{
|
||||||
|
version 2.0;
|
||||||
|
format ascii;
|
||||||
|
class volScalarField;
|
||||||
|
object p;
|
||||||
|
}
|
||||||
|
|
||||||
|
dimensions [ 0 2 -2 0 0 0 0 ];
|
||||||
|
|
||||||
|
internalField uniform 0;
|
||||||
|
|
||||||
|
boundaryField
|
||||||
|
{
|
||||||
|
walls
|
||||||
|
{
|
||||||
|
type zeroGradient;
|
||||||
|
}
|
||||||
|
staticSlider
|
||||||
|
{
|
||||||
|
type ggi;
|
||||||
|
}
|
||||||
|
movingSlider
|
||||||
|
{
|
||||||
|
type ggi;
|
||||||
|
}
|
||||||
|
inlet
|
||||||
|
{
|
||||||
|
type zeroGradient;
|
||||||
|
}
|
||||||
|
outlet
|
||||||
|
{
|
||||||
|
type fixedValue;
|
||||||
|
value uniform 0;
|
||||||
|
}
|
||||||
|
} // ************************************************************************* //
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
faceSet staticSliderZone new patchToFace staticSlider
|
||||||
|
faceSet movingSliderZone new patchToFace movingSlider
|
||||||
|
quit
|
|
@ -0,0 +1,67 @@
|
||||||
|
/*--------------------------------*- C++ -*----------------------------------*\
|
||||||
|
| ========= | |
|
||||||
|
| \\ / F ield | foam-extend: Open Source CFD |
|
||||||
|
| \\ / O peration | Version: 3.1 |
|
||||||
|
| \\ / A nd | Web: http://www.extend-project.de |
|
||||||
|
| \\/ M anipulation | |
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
FoamFile
|
||||||
|
{
|
||||||
|
version 2.0;
|
||||||
|
format ascii;
|
||||||
|
class dictionary;
|
||||||
|
object controlDict;
|
||||||
|
}
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
application icoFoam;
|
||||||
|
|
||||||
|
startFrom latestTime;
|
||||||
|
|
||||||
|
startTime 0;
|
||||||
|
|
||||||
|
stopAt endTime;
|
||||||
|
|
||||||
|
endTime 1;
|
||||||
|
|
||||||
|
deltaT 0.001;
|
||||||
|
|
||||||
|
writeControl timeStep;
|
||||||
|
|
||||||
|
writeInterval 100;
|
||||||
|
|
||||||
|
purgeWrite 0;
|
||||||
|
|
||||||
|
writeFormat ascii;
|
||||||
|
|
||||||
|
writePrecision 10;
|
||||||
|
|
||||||
|
writeCompression compressed;
|
||||||
|
|
||||||
|
timeFormat general;
|
||||||
|
|
||||||
|
timePrecision 6;
|
||||||
|
|
||||||
|
runTimeModifiable yes;
|
||||||
|
|
||||||
|
adjustTimeStep no;
|
||||||
|
|
||||||
|
maxCo 0.2;
|
||||||
|
|
||||||
|
functions
|
||||||
|
(
|
||||||
|
ggiCheck
|
||||||
|
{
|
||||||
|
type ggiCheck;
|
||||||
|
phi phi;
|
||||||
|
functionObjectLibs ("libcheckFunctionObjects.so");
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
DebugSwitches
|
||||||
|
{
|
||||||
|
ggi 1;
|
||||||
|
GGIInterpolation 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
|
@ -0,0 +1,49 @@
|
||||||
|
/*--------------------------------*- C++ -*----------------------------------*\
|
||||||
|
| ========= | |
|
||||||
|
| \\ / F ield | foam-extend: Open Source CFD |
|
||||||
|
| \\ / O peration | Version: 3.1 |
|
||||||
|
| \\ / A nd | Web: http://www.extend-project.de |
|
||||||
|
| \\/ M anipulation | |
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
FoamFile
|
||||||
|
{
|
||||||
|
version 2.0;
|
||||||
|
format ascii;
|
||||||
|
class dictionary;
|
||||||
|
object fvSchemes;
|
||||||
|
}
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
ddtSchemes
|
||||||
|
{
|
||||||
|
default Euler;
|
||||||
|
}
|
||||||
|
|
||||||
|
gradSchemes
|
||||||
|
{
|
||||||
|
default Gauss linear;
|
||||||
|
}
|
||||||
|
|
||||||
|
divSchemes
|
||||||
|
{
|
||||||
|
div(phi,U) Gauss upwind;
|
||||||
|
|
||||||
|
div((muEff*dev2(T(grad(U))))) Gauss linear;
|
||||||
|
}
|
||||||
|
|
||||||
|
laplacianSchemes
|
||||||
|
{
|
||||||
|
default Gauss linear limited 0.5;
|
||||||
|
}
|
||||||
|
|
||||||
|
interpolationSchemes
|
||||||
|
{
|
||||||
|
default linear;
|
||||||
|
}
|
||||||
|
|
||||||
|
snGradSchemes
|
||||||
|
{
|
||||||
|
default limited 0.5;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
|
@ -0,0 +1,52 @@
|
||||||
|
/*--------------------------------*- C++ -*----------------------------------*\
|
||||||
|
| ========= | |
|
||||||
|
| \\ / F ield | foam-extend: Open Source CFD |
|
||||||
|
| \\ / O peration | Version: 3.1 |
|
||||||
|
| \\ / A nd | Web: http://www.extend-project.de |
|
||||||
|
| \\/ M anipulation | |
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
FoamFile
|
||||||
|
{
|
||||||
|
version 2.0;
|
||||||
|
format ascii;
|
||||||
|
class dictionary;
|
||||||
|
object fvSolution;
|
||||||
|
}
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
solvers
|
||||||
|
{
|
||||||
|
p
|
||||||
|
{
|
||||||
|
solver BiCGStab;
|
||||||
|
preconditioner Cholesky;
|
||||||
|
|
||||||
|
minIter 0;
|
||||||
|
maxIter 1000;
|
||||||
|
tolerance 1e-10;
|
||||||
|
relTol 0.0;
|
||||||
|
}
|
||||||
|
U
|
||||||
|
{
|
||||||
|
solver BiCGStab;
|
||||||
|
preconditioner DILU;
|
||||||
|
|
||||||
|
minIter 0;
|
||||||
|
maxIter 1000;
|
||||||
|
tolerance 1e-07;
|
||||||
|
relTol 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SIMPLE
|
||||||
|
{
|
||||||
|
nNonOrthogonalCorrectors 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
PISO
|
||||||
|
{
|
||||||
|
nCorrectors 2;
|
||||||
|
nNonOrthogonalCorrectors 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
|
@ -0,0 +1,4 @@
|
||||||
|
The conservative overlapping GGI needs certain top level changes for solvers
|
||||||
|
other than potentialFoam. Basically, all parts that make up the flux on the RHS
|
||||||
|
of pressure equation need to be interpolated together. This is not the case with
|
||||||
|
the latest version of time and under-relaxation consistent solvers.
|
Reference in a new issue