Description
Simple solidification porosity model
This is a simple approximation to solidification where the solid phase
is represented as a porous blockage with the drag-coefficient evaluated from
\f[
S = - \alpha \rho D(T) U
\f]
where
\vartable
\alpha | Optional phase-fraction of solidifying phase
D(T) | User-defined drag-coefficient as function of temperature
\endvartable
Note that the latent heat of solidification is not included and the
temperature is unchanged by the modelled change of phase.
Example of the solidification model specification:
\verbatim
type solidification;
solidificationCoeffs
{
// Solidify between 330K and 330.5K
D table
(
(330.0 10000) // Solid below 330K
(330.5 0) // Liquid above 330.5K
);
// Optional phase-fraction of solidifying phase
alpha alpha.liquid;
// Solidification porosity is isotropic
// use the global coordinate system
coordinateSystem
{
type cartesian;
origin (0 0 0);
coordinateRotation
{
type axesRotation;
e1 (1 0 0);
e2 (0 1 0);
}
}
}
\endverbatim
137 lines
3.6 KiB
C
137 lines
3.6 KiB
C
/*---------------------------------------------------------------------------*\
|
|
========= |
|
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
|
\\ / O peration |
|
|
\\ / A nd | Copyright (C) 2017 OpenFOAM Foundation
|
|
\\/ M anipulation |
|
|
-------------------------------------------------------------------------------
|
|
License
|
|
This file is part of OpenFOAM.
|
|
|
|
OpenFOAM is free software: you can redistribute it and/or modify it
|
|
under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation, either version 3 of the License, or
|
|
(at your option) any later version.
|
|
|
|
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
\*---------------------------------------------------------------------------*/
|
|
|
|
#include "volFields.H"
|
|
#include "geometricOneField.H"
|
|
|
|
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
|
|
|
|
template<class AlphaFieldType, class RhoFieldType>
|
|
void Foam::porosityModels::solidification::apply
|
|
(
|
|
scalarField& Udiag,
|
|
const scalarField& V,
|
|
const AlphaFieldType& alpha,
|
|
const RhoFieldType& rho,
|
|
const volVectorField& U
|
|
) const
|
|
{
|
|
const volScalarField& T = mesh_.lookupObject<volScalarField>
|
|
(
|
|
IOobject::groupName(TName_, U.group())
|
|
);
|
|
|
|
forAll(cellZoneIDs_, zoneI)
|
|
{
|
|
const labelList& cells = mesh_.cellZones()[cellZoneIDs_[zoneI]];
|
|
|
|
forAll(cells, i)
|
|
{
|
|
const label celli = cells[i];
|
|
Udiag[celli] +=
|
|
V[celli]*alpha[celli]*rho[celli]*D_->value(T[celli]);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
template<class AlphaFieldType, class RhoFieldType>
|
|
void Foam::porosityModels::solidification::apply
|
|
(
|
|
tensorField& AU,
|
|
const AlphaFieldType& alpha,
|
|
const RhoFieldType& rho,
|
|
const volVectorField& U
|
|
) const
|
|
{
|
|
const volScalarField& T = mesh_.lookupObject<volScalarField>
|
|
(
|
|
IOobject::groupName(TName_, U.group())
|
|
);
|
|
|
|
forAll(cellZoneIDs_, zoneI)
|
|
{
|
|
const labelList& cells = mesh_.cellZones()[cellZoneIDs_[zoneI]];
|
|
|
|
forAll(cells, i)
|
|
{
|
|
const label celli = cells[i];
|
|
AU[celli] +=
|
|
tensor::I*alpha[celli]*rho[celli]*D_->value(T[celli]);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
template<class RhoFieldType>
|
|
void Foam::porosityModels::solidification::apply
|
|
(
|
|
scalarField& Udiag,
|
|
const scalarField& V,
|
|
const RhoFieldType& rho,
|
|
const volVectorField& U
|
|
) const
|
|
{
|
|
if (alphaName_ == "none")
|
|
{
|
|
return apply(Udiag, V, geometricOneField(), rho, U);
|
|
}
|
|
else
|
|
{
|
|
const volScalarField& alpha = mesh_.lookupObject<volScalarField>
|
|
(
|
|
IOobject::groupName(alphaName_, U.group())
|
|
);
|
|
|
|
return apply(Udiag, V, alpha, rho, U);
|
|
}
|
|
}
|
|
|
|
|
|
template<class RhoFieldType>
|
|
void Foam::porosityModels::solidification::apply
|
|
(
|
|
tensorField& AU,
|
|
const RhoFieldType& rho,
|
|
const volVectorField& U
|
|
) const
|
|
{
|
|
if (alphaName_ == "none")
|
|
{
|
|
return apply(AU, geometricOneField(), rho, U);
|
|
}
|
|
else
|
|
{
|
|
const volScalarField& alpha = mesh_.lookupObject<volScalarField>
|
|
(
|
|
IOobject::groupName(alphaName_, U.group())
|
|
);
|
|
|
|
return apply(AU, alpha, rho, U);
|
|
}
|
|
}
|
|
|
|
|
|
// ************************************************************************* //
|