/*---------------------------------------------------------------------------*\ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | www.openfoam.com \\/ M anipulation | ------------------------------------------------------------------------------- Copyright (C) 2013-2017 OpenFOAM Foundation Copyright (C) 2019 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. OpenFOAM is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. OpenFOAM is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenFOAM. If not, see . \*---------------------------------------------------------------------------*/ #include "twoPhaseMixtureThermo.H" #include "gradientEnergyFvPatchScalarField.H" #include "mixedEnergyFvPatchScalarField.H" #include "collatedFileOperation.H" // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // namespace Foam { defineTypeNameAndDebug(twoPhaseMixtureThermo, 0); } // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // Foam::twoPhaseMixtureThermo::twoPhaseMixtureThermo ( const volVectorField& U, const surfaceScalarField& phi ) : psiThermo(U.mesh(), word::null), twoPhaseMixture(U.mesh(), *this), interfaceProperties(alpha1(), U, *this), thermo1_(nullptr), thermo2_(nullptr) { { volScalarField T1(IOobject::groupName("T", phase1Name()), T_); T1.write(); } { volScalarField T2(IOobject::groupName("T", phase2Name()), T_); T2.write(); } // Note: we're writing files to be read in immediately afterwards. // Avoid any thread-writing problems. fileHandler().flush(); thermo1_ = rhoThermo::New(U.mesh(), phase1Name()); thermo2_ = rhoThermo::New(U.mesh(), phase2Name()); // thermo1_->validate(phase1Name(), "e"); // thermo2_->validate(phase2Name(), "e"); correct(); } // * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // Foam::twoPhaseMixtureThermo::~twoPhaseMixtureThermo() {} // * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * // void Foam::twoPhaseMixtureThermo::correctThermo() { thermo1_->he() = thermo1_->he(p_, T_); thermo1_->correct(); thermo2_->he() = thermo2_->he(p_, T_); thermo2_->correct(); } void Foam::twoPhaseMixtureThermo::correct() { psi_ = alpha1()*thermo1_->psi() + alpha2()*thermo2_->psi(); mu_ = alpha1()*thermo1_->mu() + alpha2()*thermo2_->mu(); alpha_ = alpha1()*thermo1_->alpha() + alpha2()*thermo2_->alpha(); interfaceProperties::correct(); } Foam::word Foam::twoPhaseMixtureThermo::thermoName() const { return thermo1_->thermoName() + ',' + thermo2_->thermoName(); } bool Foam::twoPhaseMixtureThermo::incompressible() const { return thermo1_->incompressible() && thermo2_->incompressible(); } bool Foam::twoPhaseMixtureThermo::isochoric() const { return thermo1_->isochoric() && thermo2_->isochoric(); } Foam::tmp Foam::twoPhaseMixtureThermo::he ( const volScalarField& p, const volScalarField& T ) const { return alpha1()*thermo1_->he(p, T) + alpha2()*thermo2_->he(p, T); } Foam::tmp Foam::twoPhaseMixtureThermo::he ( const scalarField& p, const scalarField& T, const labelList& cells ) const { return scalarField(alpha1(), cells)*thermo1_->he(p, T, cells) + scalarField(alpha2(), cells)*thermo2_->he(p, T, cells); } Foam::tmp Foam::twoPhaseMixtureThermo::he ( const scalarField& p, const scalarField& T, const label patchi ) const { return alpha1().boundaryField()[patchi]*thermo1_->he(p, T, patchi) + alpha2().boundaryField()[patchi]*thermo2_->he(p, T, patchi); } Foam::tmp Foam::twoPhaseMixtureThermo::hc() const { return alpha1()*thermo1_->hc() + alpha2()*thermo2_->hc(); } Foam::tmp Foam::twoPhaseMixtureThermo::THE ( const scalarField& h, const scalarField& p, const scalarField& T0, const labelList& cells ) const { NotImplemented; return T0; } Foam::tmp Foam::twoPhaseMixtureThermo::THE ( const scalarField& h, const scalarField& p, const scalarField& T0, const label patchi ) const { NotImplemented; return T0; } Foam::tmp Foam::twoPhaseMixtureThermo::Cp() const { return alpha1()*thermo1_->Cp() + alpha2()*thermo2_->Cp(); } Foam::tmp Foam::twoPhaseMixtureThermo::Cp ( const scalarField& p, const scalarField& T, const label patchi ) const { return alpha1().boundaryField()[patchi]*thermo1_->Cp(p, T, patchi) + alpha2().boundaryField()[patchi]*thermo2_->Cp(p, T, patchi); } Foam::tmp Foam::twoPhaseMixtureThermo::Cv() const { return alpha1()*thermo1_->Cv() + alpha2()*thermo2_->Cv(); } Foam::tmp Foam::twoPhaseMixtureThermo::Cv ( const scalarField& p, const scalarField& T, const label patchi ) const { return alpha1().boundaryField()[patchi]*thermo1_->Cv(p, T, patchi) + alpha2().boundaryField()[patchi]*thermo2_->Cv(p, T, patchi); } Foam::tmp Foam::twoPhaseMixtureThermo::gamma() const { return alpha1()*thermo1_->gamma() + alpha2()*thermo2_->gamma(); } Foam::tmp Foam::twoPhaseMixtureThermo::gamma ( const scalarField& p, const scalarField& T, const label patchi ) const { return alpha1().boundaryField()[patchi]*thermo1_->gamma(p, T, patchi) + alpha2().boundaryField()[patchi]*thermo2_->gamma(p, T, patchi); } Foam::tmp Foam::twoPhaseMixtureThermo::Cpv() const { return alpha1()*thermo1_->Cpv() + alpha2()*thermo2_->Cpv(); } Foam::tmp Foam::twoPhaseMixtureThermo::Cpv ( const scalarField& p, const scalarField& T, const label patchi ) const { return alpha1().boundaryField()[patchi]*thermo1_->Cpv(p, T, patchi) + alpha2().boundaryField()[patchi]*thermo2_->Cpv(p, T, patchi); } Foam::tmp Foam::twoPhaseMixtureThermo::CpByCpv() const { return alpha1()*thermo1_->CpByCpv() + alpha2()*thermo2_->CpByCpv(); } Foam::tmp Foam::twoPhaseMixtureThermo::CpByCpv ( const scalarField& p, const scalarField& T, const label patchi ) const { return alpha1().boundaryField()[patchi]*thermo1_->CpByCpv(p, T, patchi) + alpha2().boundaryField()[patchi]*thermo2_->CpByCpv(p, T, patchi); } Foam::tmp Foam::twoPhaseMixtureThermo::W() const { return alpha1()*thermo1_->W() + alpha2()*thermo1_->W(); } Foam::tmp Foam::twoPhaseMixtureThermo::nu() const { return mu()/(alpha1()*thermo1_->rho() + alpha2()*thermo2_->rho()); } Foam::tmp Foam::twoPhaseMixtureThermo::nu ( const label patchi ) const { return mu(patchi) /( alpha1().boundaryField()[patchi]*thermo1_->rho(patchi) + alpha2().boundaryField()[patchi]*thermo2_->rho(patchi) ); } Foam::tmp Foam::twoPhaseMixtureThermo::kappa() const { return alpha1()*thermo1_->kappa() + alpha2()*thermo2_->kappa(); } Foam::tmp Foam::twoPhaseMixtureThermo::kappa ( const label patchi ) const { return alpha1().boundaryField()[patchi]*thermo1_->kappa(patchi) + alpha2().boundaryField()[patchi]*thermo2_->kappa(patchi); } Foam::tmp Foam::twoPhaseMixtureThermo::alphahe() const { return alpha1()*thermo1_->alphahe() + alpha2()*thermo2_->alphahe(); } Foam::tmp Foam::twoPhaseMixtureThermo::alphahe ( const label patchi ) const { return alpha1().boundaryField()[patchi]*thermo1_->alphahe(patchi) + alpha2().boundaryField()[patchi]*thermo2_->alphahe(patchi); } Foam::tmp Foam::twoPhaseMixtureThermo::kappaEff ( const volScalarField& alphat ) const { return alpha1()*thermo1_->kappaEff(alphat) + alpha2()*thermo2_->kappaEff(alphat); } Foam::tmp Foam::twoPhaseMixtureThermo::kappaEff ( const scalarField& alphat, const label patchi ) const { return alpha1().boundaryField()[patchi]*thermo1_->kappaEff(alphat, patchi) + alpha2().boundaryField()[patchi]*thermo2_->kappaEff(alphat, patchi); } Foam::tmp Foam::twoPhaseMixtureThermo::alphaEff ( const volScalarField& alphat ) const { return alpha1()*thermo1_->alphaEff(alphat) + alpha2()*thermo2_->alphaEff(alphat); } Foam::tmp Foam::twoPhaseMixtureThermo::alphaEff ( const scalarField& alphat, const label patchi ) const { return alpha1().boundaryField()[patchi]*thermo1_->alphaEff(alphat, patchi) + alpha2().boundaryField()[patchi]*thermo2_->alphaEff(alphat, patchi); } bool Foam::twoPhaseMixtureThermo::read() { if (psiThermo::read()) { return interfaceProperties::read(); } return false; } // ************************************************************************* //