D, mu and k boundary fields update in correct()

This commit is contained in:
ignis 2018-07-10 16:17:12 +09:00
parent 6033bedc3a
commit c5027f53ba
2 changed files with 286 additions and 133 deletions

View file

@ -57,11 +57,68 @@ Foam::scalar Foam::diffusivityModel::mixAvgD(const label k, const UList<scalar>&
XD[k] = 0.0;
YD[k] = 0.0;
return 1. / (sum(XD) + XY*sum(YD));
}
void
Foam::diffusivityModel::mixAvgDi(UList<scalar>& Di, const scalarSymmetricSquareMatrix &Dij, const UList<scalar>& X, const UList<scalar>& Y)
{
// Pure Condition Test ( Xi = 1 )
Switch pure = false;
label pureSpecieI = -1;
forAll (X, i)
{
if (1. - X[i] < 1e-12)
{
pureSpecieI = i;
pure = true;
break;
}
}
// Mixture average D, mu and k
if (pure)
{
const scalar* Dpure = Dij[pureSpecieI];
forAll (X, i)
{
Di[i] = Dpure[i];
}
}
else
{
forAll (X, k)
{
scalar sum1 = 0.0;
scalar sum2 = 0.0;
forAll (X, i)
{
if (i == k)
{
continue;
}
const scalar* Dk = Dij[k];
sum1 += X[i] / Dk[i];
sum2 += Y[i] / Dk[i];
}
sum2 *= X[k] / (1. - Y[k]);
Di[k] = inv(sum1 + sum2);
}
}
return;
}
Foam::scalar Foam::diffusivityModel::mixAvgMu(const UList<scalar>& muI, const UList<scalar>& X, const UList<scalar>& W)
{
const label K = muI.size();
@ -105,6 +162,122 @@ Foam::scalar Foam::diffusivityModel::mixAvgK(const UList<scalar>& k, const UList
}
void Foam::diffusivityModel::calculateMuD
(
UList<scalar> &muI,
scalarSymmetricSquareMatrix &Dij,
const scalar rhoi,
const scalar Cpi,
const scalar pi,
const scalar Ti,
const scalar WbarI,
const scalar rhoQc2i,
const scalarField &localY,
const scalarField &localX
)
{
const label ionStart = 1;
const label neutralStart = 1 + ions_.size();
// Electron - Electron
label idx = 0;
muI[0] = ecs_[idx].mu(pi,Ti,rhoQc2i);
Dij(0,0) = ecs_[idx].D(pi,Ti,rhoQc2i);
// Electron - Ions
idx = 1;
forAll (ions_, J)
{
label j = J + ionStart;
// Calculate Dij
Dij(0,j) = ecs_[idx].D(pi,Ti,rhoQc2i);
Dij(j,0) = Dij(0,j);
idx++;
}
// Electron - Neutrals
idx = 0;
forAll (neutrals_, J)
{
label j = J + neutralStart;
// Calculate Dij
Dij(0,j) = ens_[idx].D(pi,Ti);
Dij(j,0) = Dij(0,j);
idx++;
}
// Ions
label idx1 = 0;
forAll (ions_, I)
{
label i = I + ionStart;
muI[i] = ccs_[idx1].mu(pi,Ti,rhoQc2i);
Dij(i,i) = ccs_[idx1].D(pi,Ti,rhoQc2i);
idx1++;
// Ion - Ions
for (label J = I + 1; J < ions_.size(); J++)
{
label j = J + ionStart;
// Calculate Dij
Dij(i,j) = ccs_[idx1].D(pi,Ti,rhoQc2i);
Dij(j,i) = Dij(i,j);
idx1++;
}
}
label idx2 = 0;
forAll (ions_, I)
{
label i = I + ionStart;
// Ion - Neutrals
forAll (neutrals_, J)
{
label j = J + neutralStart;
// Calculate Dij
Dij(i,j) = cns_[idx2].D(pi,Ti);
Dij(j,i) = Dij(i,j);
idx2++;
}
}
// Neutrals
idx = 0;
forAll (neutrals_, I)
{
label i = I + neutralStart;
muI[i] = nns_[idx].mu(pi,Ti);
Dij(i,i) = nns_[idx].D(pi,Ti);
idx++;
// Neutral - Neutrals
for (label J = I + 1; J < neutrals_.size(); J++)
{
label j = J + neutralStart;
// Calculate Dij
Dij(i,j) = nns_[idx].D(pi,Ti);
Dij(j,i) = Dij(i,j);
idx++;
}
}
}
// * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * //
@ -388,6 +561,7 @@ Foam::diffusivityModel::~diffusivityModel()
// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * //
void Foam::diffusivityModel::correct()
{
const volScalarField &T = thermo_.T();
@ -417,6 +591,7 @@ void Foam::diffusivityModel::correct()
scalarField localD(species_.size());
scalarField Di(species_.size());
scalarField Dii(species_.size());
scalarField muI(species_.size());
scalarField kI(species_.size());
@ -449,10 +624,7 @@ void Foam::diffusivityModel::correct()
const scalar WbarI = Wbar[celli];
const scalar rhoQc2i = rhoQc2[celli];
forAll (species_, i)
{
localCv[i] = thermo_.composition().Cv(i,pi,Ti);
}
thermo_.composition().Cv(localCv,pi,Ti);
forAll (species_, i)
{
@ -460,111 +632,24 @@ void Foam::diffusivityModel::correct()
localX[i] = Y[i][celli] * WbarI / Wpure[i];
}
calculateMuD ( muI, Dij, rhoi, Cpi, pi, Ti, WbarI, rhoQc2i, localY, localX);
forAll (Dii, i)
{
Dii[i] = Dij(i,i);
}
Zrot[0] = 0;
forAll (ions_, i)
{
// ZrotI[i] = ions_[i].Zrot(Ti);
ZrotI[i] = 0.0;
ZrotI[i] = ions_[i].Zrot(Ti);
}
forAll (neutrals_, i)
{
ZrotN[i] = neutrals_[i].Zrot(Ti);
}
// Electron - Electron
label idx = 0;
muI[0] = ecs_[idx].mu(pi,Ti,rhoQc2i);
// muI[0] = SMALL;
Dii[0] = ecs_[idx].D(pi,Ti,rhoQc2i);
// Dii[0] = SMALL;
Dij(0,0) = Dii[0];
// Electron - Ions
idx = 1;
for (label J = 0; J < ions_.size(); J++)
{
label j = J + 1;
// Calculate Dij
Dij(0,j) = ecs_[idx].D(pi,Ti,rhoQc2i);
// Dij(0,j) = SMALL;
Dij(j,0) = Dij(0,j);
idx++;
}
// Electron - Neutrals
idx = 0;
for (label J = 0; J < neutrals_.size(); J++)
{
label j = J + ions_.size() + 1;
// Calculate Dij
Dij(0,j) = ens_[idx].D(pi,Ti);
// Dij(0,j) = SMALL;
Dij(j,0) = Dij(0,j);
idx++;
}
// Ions
label idx1 = 0;
label idx2 = 0;
forAll (ions_, I)
{
label i = I + 1;
muI[i] = ccs_[idx1].mu(pi,Ti,rhoQc2i);
// muI[i] = SMALL;
Dii[i] = ccs_[idx1].D(pi,Ti,rhoQc2i);
// Dii[i] = SMALL;
Dij(i,i) = Dii[i];
idx1++;
// Ion - Ions
for (label J = I+1; J < ions_.size(); J++)
{
label j = J + 1;
// Calculate Dij
Dij(i,j) = ccs_[idx1].D(pi,Ti,rhoQc2i);
// Dij(i,j) = SMALL;
Dij(j,i) = Dij(i,j);
idx1++;
}
// Ion - Neutrals
for (label j = ions_.size()+1; j < species_.size(); j++)
{
// Calculate Dij
Dij(i,j) = cns_[idx2].D(pi,Ti);
// Dij(i,j) = SMALL;
Dij(j,i) = Dij(i,j);
idx2++;
}
}
// Neutrals
idx = 0;
forAll (neutrals_, I)
{
label i = I + 1 + ions_.size();
muI[i] = nns_[idx].mu(pi,Ti);
Dii[i] = nns_[idx].D(pi,Ti);
Dij(i,i) = Dii[i];
idx++;
// Neutral - Neutrals
for (label j = i+1; j < species_.size(); j++)
{
// Calculate Dij
Dij(i,j) = nns_[idx].D(pi,Ti);
Dij(j,i) = Dij(i,j);
idx++;
}
}
// Pure Thermal conductivity
forAll (species_, i)
{
@ -587,42 +672,94 @@ void Foam::diffusivityModel::correct()
}
// Pure Condition Test ( Xi = 1 )
Switch pure = false;
label pureSpecieI = -1;
forAll (species_, i)
mixAvgDi(Di, Dij, localX, localY);
forAll (Di, i)
{
if (1. - localX[i] < 1e-12)
{
pureSpecieI = i;
pure = true;
break;
}
}
// Mixture average D, mu and k
if (pure)
{
UList<scalar> Dpure(Dij[pureSpecieI], Dij.n());
forAll (species_, i)
{
D_[i][celli] = Dpure[i];
}
}
else
{
forAll (species_, i)
{
UList<scalar> Di(Dij[i], Dij.n());
D_[i][celli] = mixAvgD(i, Di, localX, localY);
}
D_[i][celli] = Di[i];
}
mu_()[celli] = mixAvgMu(muI, localX, Wpure);
k_()[celli] = mixAvgK(kI, localX) / rhoi / Cpi;
}
forAll(p.boundaryField(), patchi)
{
const volScalarField::Patch &rhop = rho.boundaryField()[patchi];
const volScalarField::Patch &Cpp = Cp.boundaryField()[patchi];
const volScalarField::Patch &pp = p.boundaryField()[patchi];
const volScalarField::Patch &Tp = T.boundaryField()[patchi];
const volScalarField::Patch &Wbarp = Wbar.boundaryField()[patchi];
const volScalarField::Patch &rhoQc2p = rhoQc2.boundaryField()[patchi];
forAll(rhop, facei)
{
const scalar rhoi = rhop[facei];
const scalar Cpi = Cpp[facei];
const scalar pi = pp[facei];
const scalar Ti = Tp[facei];
const scalar WbarI = Wbarp[facei];
const scalar rhoQc2i = rhoQc2p[facei];
thermo_.composition().Cv(localCv,pi,Ti);
forAll (species_, i)
{
localY[i] = Y[i].boundaryField()[patchi][facei];
localX[i] = localY[i] * WbarI / Wpure[i];
}
calculateMuD ( muI, Dij, rhoi, Cpi, pi, Ti, WbarI, rhoQc2i, localY, localX);
forAll (Dii, i)
{
Dii[i] = Dij(i,i);
}
Zrot[0] = 0;
forAll (ions_, i)
{
ZrotI[i] = ions_[i].Zrot(Ti);
}
forAll (neutrals_, i)
{
ZrotN[i] = neutrals_[i].Zrot(Ti);
}
// Pure Thermal conductivity
forAll (species_, i)
{
const scalar R = Neutral::RR / Wpure[i];
const scalar CvTrans = (3./2.)*R;
const scalar CvRot = (dof[i]/2.)*R;
const scalar CvVib = localCv[i] - CvTrans - CvRot;
const scalar rSc = rhoi * Dii[i] / muI[i];
const scalar A = 5./2. - rSc;
const scalar B = Zrot[i] + (2./Neutral::pi) * ((5./3.)*CvRot + rSc);
const scalar AB = (2./Neutral::pi)*(A/B);
const scalar fTrans = (5./2.) * (1.0 - AB * CvRot / CvTrans);
const scalar fRot = rSc*(1.0+AB);
const scalar fVib = rSc;
kI[i] = muI[i]*(fTrans*CvTrans + fRot*CvRot + fVib*CvVib);
}
mixAvgDi(Di, Dij, localX, localY);
forAll (Di, i)
{
D_[i].boundaryFieldRef()[patchi][facei] = Di[i];
}
mu_().boundaryFieldRef()[patchi][facei] = mixAvgMu(muI, localX, Wpure);
k_().boundaryFieldRef()[patchi][facei] = mixAvgK(kI, localX) / rhoi / Cpi;
}
}
return;
}

View file

@ -112,14 +112,30 @@ class diffusivityModel
void operator=(const diffusivityModel&);
//- Disallow default bitwise assignment
scalar mixAvgD(const label k, const UList<scalar>& Di, const UList<scalar>& X, const UList<scalar>& Y);
inline scalar mixAvgD(const label k, const UList<scalar>& Di, const UList<scalar>& X, const UList<scalar>& Y);
//- Disallow default bitwise assignment
scalar mixAvgMu(const UList<scalar>& muI, const UList<scalar>& X, const UList<scalar>& W);
inline void mixAvgDi(UList<scalar>& Di, const scalarSymmetricSquareMatrix &Dij, const UList<scalar>& X, const UList<scalar>& Y);
//- Disallow default bitwise assignment
scalar mixAvgK(const UList<scalar>& k, const UList<scalar>& X);
inline scalar mixAvgMu(const UList<scalar>& muI, const UList<scalar>& X, const UList<scalar>& W);
//- Disallow default bitwise assignment
inline scalar mixAvgK(const UList<scalar>& k, const UList<scalar>& X);
inline void calculateMuD
(
UList<scalar> &muI,
scalarSymmetricSquareMatrix &Dij,
const scalar rhoi,
const scalar Cpi,
const scalar pi,
const scalar Ti,
const scalar WbarI,
const scalar rhoQc2i,
const scalarField &localY,
const scalarField &localX
);
public: