From ba130ec083ffe435eb10ff17afb4274251fb6be6 Mon Sep 17 00:00:00 2001 From: Will Bainbridge Date: Fri, 28 Jan 2022 17:10:17 +0000 Subject: [PATCH] multiphase: Rationalised alphaContactAngle handling Alpha contact angle boundaries are now specified in the following way for multiphase solvers (i.e., multiphaseInterFoam, compressibleMultiphaseInterFoam, and multiphaseEulerFoam): boundaryField { wall { type alphaContactAngle; contactAngleProperties { water { // Constant contact angle theta0 90; } oil { // Dynamic contact angle theta0 90; uTheta 1; thetaA 125; thetaR 85; } } value uniform 0; } } All solvers now share the same implementation of the alphaContactAngle boundary condition and the contact angle correction algorithm. If alpha contact angle boundary conditions are used they must be specified for all phases or an error will result. The consistency of the input will also be checked. The angles given for water in the alpha.air file must be 180 degrees minus the angles given for air in the alpha.water file. --- .../compressibleMultiphaseMixture/Make/files | 1 - .../Make/options | 2 + .../alphaContactAngleFvPatchScalarField.C | 145 ------------ .../alphaContactAngleFvPatchScalarField.H | 206 ------------------ .../compressibleMultiphaseMixture.C | 145 +----------- .../compressibleMultiphaseMixture.H | 9 +- .../multiphaseEulerFoam/Make/options | 1 + .../phaseSystems/Make/files | 2 - .../phaseSystems/Make/options | 1 + .../phaseSystems/phaseSystem/phaseSystem.C | 141 +----------- .../phaseSystems/phaseSystem/phaseSystem.H | 13 -- .../multiphaseMixture/Make/files | 1 - .../multiphaseMixture/Make/options | 2 + .../alphaContactAngleFvPatchScalarField.C | 145 ------------ .../alphaContactAngleFvPatchScalarField.H | 206 ------------------ .../multiphaseMixture/multiphaseMixture.C | 139 +----------- .../multiphaseMixture/multiphaseMixture.H | 14 +- src/Allwmake | 1 + src/multiphaseModels/Allwmake | 9 + .../multiphaseProperties/Make/files | 4 + .../multiphaseProperties/Make/options | 5 + .../alphaContactAngleFvPatchScalarField.C | 0 .../alphaContactAngleFvPatchScalarField.H | 2 +- .../correctContactAngle/correctContactAngle.C | 159 ++++++++++++++ .../correctContactAngle/correctContactAngle.H | 65 ++++++ .../laminar/damBreak4phase/0/alpha.air.orig | 45 ++-- .../damBreak4phase/0/alpha.mercury.orig | 27 ++- .../laminar/damBreak4phase/0/alpha.oil.orig | 27 ++- .../laminar/damBreak4phase/0/alpha.water.orig | 27 ++- .../RAS/damBreak4phase/0/alpha.air.orig | 45 ++-- .../RAS/damBreak4phase/0/alpha.mercury.orig | 27 ++- .../RAS/damBreak4phase/0/alpha.oil.orig | 27 ++- .../RAS/damBreak4phase/0/alpha.water.orig | 27 ++- .../laminar/damBreak4phase/0/alpha.air.orig | 45 ++-- .../damBreak4phase/0/alpha.mercury.orig | 27 ++- .../laminar/damBreak4phase/0/alpha.oil.orig | 27 ++- .../laminar/damBreak4phase/0/alpha.water.orig | 27 ++- .../damBreak4phaseFine/0/alpha.air.orig | 45 ++-- .../damBreak4phaseFine/0/alpha.mercury.orig | 27 ++- .../damBreak4phaseFine/0/alpha.oil.orig | 27 ++- .../damBreak4phaseFine/0/alpha.water.orig | 27 ++- 41 files changed, 641 insertions(+), 1281 deletions(-) delete mode 100644 applications/solvers/multiphase/compressibleMultiphaseInterFoam/compressibleMultiphaseMixture/alphaContactAngle/alphaContactAngleFvPatchScalarField.C delete mode 100644 applications/solvers/multiphase/compressibleMultiphaseInterFoam/compressibleMultiphaseMixture/alphaContactAngle/alphaContactAngleFvPatchScalarField.H delete mode 100644 applications/solvers/multiphase/multiphaseInterFoam/multiphaseMixture/alphaContactAngle/alphaContactAngleFvPatchScalarField.C delete mode 100644 applications/solvers/multiphase/multiphaseInterFoam/multiphaseMixture/alphaContactAngle/alphaContactAngleFvPatchScalarField.H create mode 100755 src/multiphaseModels/Allwmake create mode 100644 src/multiphaseModels/multiphaseProperties/Make/files create mode 100644 src/multiphaseModels/multiphaseProperties/Make/options rename {applications/solvers/multiphase/multiphaseEulerFoam/phaseSystems => src/multiphaseModels/multiphaseProperties}/alphaContactAngle/alphaContactAngleFvPatchScalarField.C (100%) rename {applications/solvers/multiphase/multiphaseEulerFoam/phaseSystems => src/multiphaseModels/multiphaseProperties}/alphaContactAngle/alphaContactAngleFvPatchScalarField.H (99%) create mode 100644 src/multiphaseModels/multiphaseProperties/correctContactAngle/correctContactAngle.C create mode 100644 src/multiphaseModels/multiphaseProperties/correctContactAngle/correctContactAngle.H diff --git a/applications/solvers/multiphase/compressibleMultiphaseInterFoam/compressibleMultiphaseMixture/Make/files b/applications/solvers/multiphase/compressibleMultiphaseInterFoam/compressibleMultiphaseMixture/Make/files index bbd8bf2b5c..faa83428bd 100644 --- a/applications/solvers/multiphase/compressibleMultiphaseInterFoam/compressibleMultiphaseMixture/Make/files +++ b/applications/solvers/multiphase/compressibleMultiphaseInterFoam/compressibleMultiphaseMixture/Make/files @@ -1,5 +1,4 @@ phaseModel/phaseModel.C -alphaContactAngle/alphaContactAngleFvPatchScalarField.C compressibleMultiphaseMixture.C LIB = $(FOAM_LIBBIN)/libcompressibleMultiphaseMixture diff --git a/applications/solvers/multiphase/compressibleMultiphaseInterFoam/compressibleMultiphaseMixture/Make/options b/applications/solvers/multiphase/compressibleMultiphaseInterFoam/compressibleMultiphaseMixture/Make/options index 040016896f..5dca2a4b02 100644 --- a/applications/solvers/multiphase/compressibleMultiphaseInterFoam/compressibleMultiphaseMixture/Make/options +++ b/applications/solvers/multiphase/compressibleMultiphaseInterFoam/compressibleMultiphaseMixture/Make/options @@ -1,11 +1,13 @@ EXE_INC = \ -I$(LIB_SRC)/physicalProperties/lnInclude \ + -I$(LIB_SRC)/multiphaseModels/multiphaseProperties/lnInclude \ -I$(LIB_SRC)/thermophysicalModels/basic/lnInclude \ -I$(LIB_SRC)/finiteVolume/lnInclude \ -I$(LIB_SRC)/meshTools/lnInclude LIB_LIBS = \ -lfluidThermophysicalModels \ + -lmultiphaseProperties \ -lspecie \ -lfiniteVolume \ -lmeshTools diff --git a/applications/solvers/multiphase/compressibleMultiphaseInterFoam/compressibleMultiphaseMixture/alphaContactAngle/alphaContactAngleFvPatchScalarField.C b/applications/solvers/multiphase/compressibleMultiphaseInterFoam/compressibleMultiphaseMixture/alphaContactAngle/alphaContactAngleFvPatchScalarField.C deleted file mode 100644 index 3460747dcd..0000000000 --- a/applications/solvers/multiphase/compressibleMultiphaseInterFoam/compressibleMultiphaseMixture/alphaContactAngle/alphaContactAngleFvPatchScalarField.C +++ /dev/null @@ -1,145 +0,0 @@ -/*---------------------------------------------------------------------------*\ - ========= | - \\ / F ield | OpenFOAM: The Open Source CFD Toolbox - \\ / O peration | Website: https://openfoam.org - \\ / A nd | Copyright (C) 2013-2021 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 . - -\*---------------------------------------------------------------------------*/ - -#include "alphaContactAngleFvPatchScalarField.H" -#include "addToRunTimeSelectionTable.H" -#include "fvPatchFieldMapper.H" - -// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // - -namespace Foam -{ - -alphaContactAngleFvPatchScalarField::interfaceThetaProps::interfaceThetaProps -( - Istream& is -) -: - theta0_(readScalar(is)), - uTheta_(readScalar(is)), - thetaA_(readScalar(is)), - thetaR_(readScalar(is)) -{} - - -Istream& operator>> -( - Istream& is, - alphaContactAngleFvPatchScalarField::interfaceThetaProps& tp -) -{ - is >> tp.theta0_ >> tp.uTheta_ >> tp.thetaA_ >> tp.thetaR_; - return is; -} - - -Ostream& operator<< -( - Ostream& os, - const alphaContactAngleFvPatchScalarField::interfaceThetaProps& tp -) -{ - os << tp.theta0_ << token::SPACE - << tp.uTheta_ << token::SPACE - << tp.thetaA_ << token::SPACE - << tp.thetaR_; - - return os; -} - - -// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // - -alphaContactAngleFvPatchScalarField::alphaContactAngleFvPatchScalarField -( - const fvPatch& p, - const DimensionedField& iF -) -: - zeroGradientFvPatchScalarField(p, iF) -{} - - -alphaContactAngleFvPatchScalarField::alphaContactAngleFvPatchScalarField -( - const fvPatch& p, - const DimensionedField& iF, - const dictionary& dict -) -: - zeroGradientFvPatchScalarField(p, iF), - thetaProps_(dict.lookup("thetaProperties")) -{ - evaluate(); -} - - -alphaContactAngleFvPatchScalarField::alphaContactAngleFvPatchScalarField -( - const alphaContactAngleFvPatchScalarField& gcpsf, - const fvPatch& p, - const DimensionedField& iF, - const fvPatchFieldMapper& mapper -) -: - zeroGradientFvPatchScalarField(gcpsf, p, iF, mapper), - thetaProps_(gcpsf.thetaProps_) -{} - - -alphaContactAngleFvPatchScalarField::alphaContactAngleFvPatchScalarField -( - const alphaContactAngleFvPatchScalarField& gcpsf, - const DimensionedField& iF -) -: - zeroGradientFvPatchScalarField(gcpsf, iF), - thetaProps_(gcpsf.thetaProps_) -{} - - -// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // - -void alphaContactAngleFvPatchScalarField::write(Ostream& os) const -{ - fvPatchScalarField::write(os); - writeEntry(os, "thetaProperties", thetaProps_); - writeEntry(os, "value", *this); -} - - -// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // - -makePatchTypeField -( - fvPatchScalarField, - alphaContactAngleFvPatchScalarField -); - -// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // - -} // End namespace Foam - -// ************************************************************************* // diff --git a/applications/solvers/multiphase/compressibleMultiphaseInterFoam/compressibleMultiphaseMixture/alphaContactAngle/alphaContactAngleFvPatchScalarField.H b/applications/solvers/multiphase/compressibleMultiphaseInterFoam/compressibleMultiphaseMixture/alphaContactAngle/alphaContactAngleFvPatchScalarField.H deleted file mode 100644 index f4b2590f27..0000000000 --- a/applications/solvers/multiphase/compressibleMultiphaseInterFoam/compressibleMultiphaseMixture/alphaContactAngle/alphaContactAngleFvPatchScalarField.H +++ /dev/null @@ -1,206 +0,0 @@ -/*---------------------------------------------------------------------------*\ - ========= | - \\ / F ield | OpenFOAM: The Open Source CFD Toolbox - \\ / O peration | Website: https://openfoam.org - \\ / A nd | Copyright (C) 2013-2021 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 . - -Class - Foam::alphaContactAngleFvPatchScalarField - -Description - Contact-angle boundary condition for multi-phase interface-capturing - simulations. Used in conjunction with multiphaseMixture. - -SourceFiles - alphaContactAngleFvPatchScalarField.C - -\*---------------------------------------------------------------------------*/ - -#ifndef alphaContactAngleFvPatchScalarField_H -#define alphaContactAngleFvPatchScalarField_H - -#include "zeroGradientFvPatchFields.H" -#include "compressibleMultiphaseMixture.H" - -// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // - -namespace Foam -{ - -/*---------------------------------------------------------------------------*\ - Class alphaContactAngleFvPatch Declaration -\*---------------------------------------------------------------------------*/ - -class alphaContactAngleFvPatchScalarField -: - public zeroGradientFvPatchScalarField -{ -public: - - class interfaceThetaProps - { - //- Equilibrium contact angle - scalar theta0_; - - //- Dynamic contact angle velocity scale - scalar uTheta_; - - //- Limiting advancing contact angle - scalar thetaA_; - - //- Limiting receding contact angle - scalar thetaR_; - - - public: - - // Constructors - interfaceThetaProps() - {} - - interfaceThetaProps(Istream&); - - - // Member Functions - - //- Return the equilibrium contact angle theta0 - scalar theta0(bool matched=true) const - { - if (matched) return theta0_; - else return 180.0 - theta0_; - } - - //- Return the dynamic contact angle velocity scale - scalar uTheta() const - { - return uTheta_; - } - - //- Return the limiting advancing contact angle - scalar thetaA(bool matched=true) const - { - if (matched) return thetaA_; - else return 180.0 - thetaA_; - } - - //- Return the limiting receding contact angle - scalar thetaR(bool matched=true) const - { - if (matched) return thetaR_; - else return 180.0 - thetaR_; - } - - - // IO functions - - friend Istream& operator>>(Istream&, interfaceThetaProps&); - friend Ostream& operator<<(Ostream&, const interfaceThetaProps&); - }; - - typedef HashTable - < - interfaceThetaProps, - compressibleMultiphaseMixture::interfacePair, - compressibleMultiphaseMixture::interfacePair::hash - > thetaPropsTable; - - -private: - - // Private Data - - thetaPropsTable thetaProps_; - - -public: - - //- Runtime type information - TypeName("alphaContactAngle"); - - - // Constructors - - //- Construct from patch and internal field - alphaContactAngleFvPatchScalarField - ( - const fvPatch&, - const DimensionedField& - ); - - //- Construct from patch, internal field and dictionary - alphaContactAngleFvPatchScalarField - ( - const fvPatch&, - const DimensionedField&, - const dictionary& - ); - - //- Construct by mapping given alphaContactAngleFvPatchScalarField - // onto a new patch - alphaContactAngleFvPatchScalarField - ( - const alphaContactAngleFvPatchScalarField&, - const fvPatch&, - const DimensionedField&, - const fvPatchFieldMapper& - ); - - //- Construct as copy setting internal field reference - alphaContactAngleFvPatchScalarField - ( - const alphaContactAngleFvPatchScalarField&, - const DimensionedField& - ); - - //- Construct and return a clone setting internal field reference - virtual tmp clone - ( - const DimensionedField& iF - ) const - { - return tmp - ( - new alphaContactAngleFvPatchScalarField(*this, iF) - ); - } - - - // Member Functions - - //- Return the contact angle properties - const thetaPropsTable& thetaProps() const - { - return thetaProps_; - } - - //- Write - virtual void write(Ostream&) const; -}; - - -// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // - -} // End namespace Foam - -// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // - -#endif - -// ************************************************************************* // diff --git a/applications/solvers/multiphase/compressibleMultiphaseInterFoam/compressibleMultiphaseMixture/compressibleMultiphaseMixture.C b/applications/solvers/multiphase/compressibleMultiphaseInterFoam/compressibleMultiphaseMixture/compressibleMultiphaseMixture.C index 5efcbb17f6..fcad65430e 100644 --- a/applications/solvers/multiphase/compressibleMultiphaseInterFoam/compressibleMultiphaseMixture/compressibleMultiphaseMixture.C +++ b/applications/solvers/multiphase/compressibleMultiphaseInterFoam/compressibleMultiphaseMixture/compressibleMultiphaseMixture.C @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | Website: https://openfoam.org - \\ / A nd | Copyright (C) 2013-2021 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2013-2022 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -25,7 +25,7 @@ License #include "compressibleMultiphaseMixture.H" #include "alphaContactAngleFvPatchScalarField.H" -#include "unitConversion.H" +#include "correctContactAngle.H" #include "Time.H" #include "subCycle.H" #include "MULES.H" @@ -401,138 +401,6 @@ Foam::tmp Foam::compressibleMultiphaseMixture::nHatf } -// Correction for the boundary condition on the unit normal nHat on -// walls to produce the correct contact angle. - -// The dynamic contact angle is calculated from the component of the -// velocity on the direction of the interface, parallel to the wall. - -void Foam::compressibleMultiphaseMixture::correctContactAngle -( - const phaseModel& alpha1, - const phaseModel& alpha2, - surfaceVectorField::Boundary& nHatb -) const -{ - const volScalarField::Boundary& a1bf = alpha1.boundaryField(); - const volScalarField::Boundary& a2bf = alpha2.boundaryField(); - - const fvBoundaryMesh& boundary = mesh_.boundary(); - - forAll(boundary, patchi) - { - if - ( - isA(a1bf[patchi]) - || isA(a2bf[patchi]) - ) - { - if - ( - isA(a1bf[patchi]) - && isA(a2bf[patchi]) - ) - { - FatalErrorInFunction - << "alphaContactAngle boundary condition " - "specified on patch " << boundary[patchi].name() - << " for both " << alpha1.name() << " and " << alpha2.name() - << nl << "which may be inconsistent." - << exit(FatalError); - } - - const alphaContactAngleFvPatchScalarField& acap = - isA(a1bf[patchi]) - ? refCast(a1bf[patchi]) - : refCast(a2bf[patchi]) - ; - - vectorField& nHatPatch = nHatb[patchi]; - - vectorField AfHatPatch - ( - mesh_.Sf().boundaryField()[patchi] - /mesh_.magSf().boundaryField()[patchi] - ); - - alphaContactAngleFvPatchScalarField::thetaPropsTable:: - const_iterator tp = - acap.thetaProps().find(interfacePair(alpha1, alpha2)); - - if (tp == acap.thetaProps().end()) - { - FatalErrorInFunction - << "Cannot find interface " << interfacePair(alpha1, alpha2) - << "\n in table of theta properties for patch " - << acap.patch().name() - << exit(FatalError); - } - - const bool matched = (tp.key().first() == alpha1.name()); - - const scalar theta0 = degToRad(tp().theta0(matched)); - - scalarField theta(boundary[patchi].size(), theta0); - - const scalar uTheta = tp().uTheta(); - - // Calculate the dynamic contact angle if required - if (uTheta > small) - { - const scalar thetaA = degToRad(tp().thetaA(matched)); - const scalar thetaR = degToRad(tp().thetaR(matched)); - - // Calculated the component of the velocity parallel to the wall - vectorField Uwall - ( - U_.boundaryField()[patchi].patchInternalField() - - U_.boundaryField()[patchi] - ); - Uwall -= (AfHatPatch & Uwall)*AfHatPatch; - - // Find the direction of the interface parallel to the wall - vectorField nWall - ( - nHatPatch - (AfHatPatch & nHatPatch)*AfHatPatch - ); - - // Normalise nWall - nWall /= (mag(nWall) + small); - - // Calculate Uwall resolved normal to the interface parallel to - // the interface - const scalarField uwall(nWall & Uwall); - - theta += (thetaA - thetaR)*tanh(uwall/uTheta); - } - - - // Reset nHatPatch to correspond to the contact angle - - const scalarField a12(nHatPatch & AfHatPatch); - - const scalarField b1(cos(theta)); - - scalarField b2(nHatPatch.size()); - - forAll(b2, facei) - { - b2[facei] = cos(acos(a12[facei]) - theta[facei]); - } - - const scalarField det(1.0 - a12*a12); - - const scalarField a((b1 - a12*b2)/det); - const scalarField b((b2 - a12*b1)/det); - - nHatPatch = a*AfHatPatch + b*nHatPatch; - - nHatPatch /= (mag(nHatPatch) + deltaN_.value()); - } - } -} - - Foam::tmp Foam::compressibleMultiphaseMixture::K ( const phaseModel& alpha1, @@ -541,7 +409,14 @@ Foam::tmp Foam::compressibleMultiphaseMixture::K { tmp tnHatfv = nHatfv(alpha1, alpha2); - correctContactAngle(alpha1, alpha2, tnHatfv.ref().boundaryFieldRef()); + correctContactAngle + ( + alpha1, + alpha2, + U_.boundaryField(), + deltaN_, + tnHatfv.ref().boundaryFieldRef() + ); // Simple expression for curvature return -fvc::div(tnHatfv & mesh_.Sf()); diff --git a/applications/solvers/multiphase/compressibleMultiphaseInterFoam/compressibleMultiphaseMixture/compressibleMultiphaseMixture.H b/applications/solvers/multiphase/compressibleMultiphaseInterFoam/compressibleMultiphaseMixture/compressibleMultiphaseMixture.H index 06824f8cf6..4943936016 100644 --- a/applications/solvers/multiphase/compressibleMultiphaseInterFoam/compressibleMultiphaseMixture/compressibleMultiphaseMixture.H +++ b/applications/solvers/multiphase/compressibleMultiphaseInterFoam/compressibleMultiphaseMixture/compressibleMultiphaseMixture.H @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | Website: https://openfoam.org - \\ / A nd | Copyright (C) 2013-2021 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2013-2022 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -171,13 +171,6 @@ private: const volScalarField& alpha2 ) const; - void correctContactAngle - ( - const phaseModel& alpha1, - const phaseModel& alpha2, - surfaceVectorField::Boundary& nHatb - ) const; - tmp K ( const phaseModel& alpha1, diff --git a/applications/solvers/multiphase/multiphaseEulerFoam/multiphaseEulerFoam/Make/options b/applications/solvers/multiphase/multiphaseEulerFoam/multiphaseEulerFoam/Make/options index 3d9cfa163c..3daee21182 100644 --- a/applications/solvers/multiphase/multiphaseEulerFoam/multiphaseEulerFoam/Make/options +++ b/applications/solvers/multiphase/multiphaseEulerFoam/multiphaseEulerFoam/Make/options @@ -19,6 +19,7 @@ EXE_LIBS = \ -leulerianInterfacialCompositionModels \ -lmultiphaseMomentumTransportModels \ -lmultiphaseReactions \ + -lmultiphaseProperties \ -lphaseFluidThermophysicalTransportModels \ -lphaseFluidReactionThermophysicalTransportModels \ -lfiniteVolume \ diff --git a/applications/solvers/multiphase/multiphaseEulerFoam/phaseSystems/Make/files b/applications/solvers/multiphase/multiphaseEulerFoam/phaseSystems/Make/files index fb683afa60..a49952c3f9 100644 --- a/applications/solvers/multiphase/multiphaseEulerFoam/phaseSystems/Make/files +++ b/applications/solvers/multiphase/multiphaseEulerFoam/phaseSystems/Make/files @@ -105,6 +105,4 @@ BlendedInterfacialModel/blendingMethods/hyperbolic/hyperbolic.C BlendedInterfacialModel/blendingMethods/continuous/continuous.C BlendedInterfacialModel/blendingMethods/segregatedBlendingMethod/segregatedBlendingMethod.C -alphaContactAngle/alphaContactAngleFvPatchScalarField.C - LIB = $(FOAM_LIBBIN)/libphaseSystem diff --git a/applications/solvers/multiphase/multiphaseEulerFoam/phaseSystems/Make/options b/applications/solvers/multiphase/multiphaseEulerFoam/phaseSystems/Make/options index 8678dbb2a1..7f9c1221b2 100644 --- a/applications/solvers/multiphase/multiphaseEulerFoam/phaseSystems/Make/options +++ b/applications/solvers/multiphase/multiphaseEulerFoam/phaseSystems/Make/options @@ -3,6 +3,7 @@ EXE_INC = \ -I../interfacialCompositionModels/lnInclude \ -I../multiphaseCompressibleMomentumTransportModels/lnInclude \ -I$(LIB_SRC)/physicalProperties/lnInclude \ + -I$(LIB_SRC)/multiphaseModels/multiphaseProperties/lnInclude \ -I$(LIB_SRC)/thermophysicalModels/basic/lnInclude \ -I$(LIB_SRC)/thermophysicalModels/specie/lnInclude \ -I$(LIB_SRC)/thermophysicalModels/reactionThermo/lnInclude \ diff --git a/applications/solvers/multiphase/multiphaseEulerFoam/phaseSystems/phaseSystem/phaseSystem.C b/applications/solvers/multiphase/multiphaseEulerFoam/phaseSystems/phaseSystem/phaseSystem.C index f12fabe566..d5189d2ac0 100644 --- a/applications/solvers/multiphase/multiphaseEulerFoam/phaseSystems/phaseSystem/phaseSystem.C +++ b/applications/solvers/multiphase/multiphaseEulerFoam/phaseSystems/phaseSystem/phaseSystem.C @@ -34,7 +34,7 @@ License #include "CorrectPhi.H" #include "fvcMeshPhi.H" #include "alphaContactAngleFvPatchScalarField.H" -#include "unitConversion.H" +#include "correctContactAngle.H" #include "dragModel.H" #include "movingWallVelocityFvPatchVectorField.H" #include "pimpleControl.H" @@ -184,136 +184,6 @@ Foam::tmp Foam::phaseSystem::nHatf } -void Foam::phaseSystem::correctContactAngle -( - const phaseModel& phase1, - const phaseModel& phase2, - surfaceVectorField::Boundary& nHatbf -) const -{ - const volScalarField& a1 = phase1; - const volScalarField& a2 = phase2; - - const volScalarField::Boundary& a1bf = a1.boundaryField(); - const volScalarField::Boundary& a2bf = a2.boundaryField(); - - const fvBoundaryMesh& boundary = mesh_.boundary(); - - forAll(boundary, patchi) - { - const fvPatchScalarField& a1p = a1bf[patchi]; - const fvPatchScalarField& a2p = a2bf[patchi]; - - const bool a1pIsCa = isA(a1p); - const bool a2pIsCa = isA(a2p); - - if (a1pIsCa || a2pIsCa) - { - if (a1pIsCa != a2pIsCa) - { - FatalErrorInFunction - << alphaContactAngleFvPatchScalarField::typeName - << " boundary condition specified on patch " - << boundary[patchi].name() << " for " - << (a1pIsCa ? a1.name() : a2.name()) << " but not for " - << (a2pIsCa ? a1.name() : a2.name()) - << exit(FatalError); - } - - const alphaContactAngleFvPatchScalarField& a1ca = - refCast(a1p); - const alphaContactAngleFvPatchScalarField& a2ca = - refCast(a2p); - - const bool a1caHasProps = a1ca.thetaProps().found(phase2.name()); - const bool a2caHasProps = a2ca.thetaProps().found(phase1.name()); - - if (!a1caHasProps && !a2caHasProps) - { - FatalErrorInFunction - << "Neither " - << alphaContactAngleFvPatchScalarField::typeName - << " boundary condition specified on patch " - << boundary[patchi].name() - << " for " << a1.name() << " and " << a2.name() - << " contains properties for the other phase" - << exit(FatalError); - } - - if - ( - a1caHasProps && a2caHasProps - && a1ca.thetaProps()[phase2.name()] - != a2ca.thetaProps()[phase1.name()].reversed() - ) - { - FatalErrorInFunction - << "The " - << alphaContactAngleFvPatchScalarField::typeName - << " boundary conditions specified on patch " - << boundary[patchi].name() - << " for " << a1.name() << " and " << a2.name() - << " contain inconsistent properties" - << exit(FatalError); - } - - const alphaContactAngleFvPatchScalarField::contactAngleProperties - tp = a1caHasProps - ? a1ca.thetaProps()[phase2.name()] - : a2ca.thetaProps()[phase1.name()].reversed(); - - const vectorField np(mesh_.boundary()[patchi].nf()); - - vectorField& nHatp = nHatbf[patchi]; - - // Calculate the contact angle - scalarField theta(np.size(), degToRad(tp.theta0())); - - // Calculate the dynamic contact angle if required - if (tp.dynamic()) - { - const scalar uTheta = tp.uTheta(); - const scalar thetaA = degToRad(tp.thetaA()); - const scalar thetaR = degToRad(tp.thetaR()); - - // Calculated the component of the velocity parallel to the wall - vectorField Uwall - ( - phase1.U()().boundaryField()[patchi].patchInternalField() - - phase1.U()().boundaryField()[patchi] - ); - Uwall -= (np & Uwall)*np; - - // Find the direction of the interface parallel to the wall - vectorField nWall(nHatp - (np & nHatp)*np); - nWall /= (mag(nWall) + small); - - // Calculate Uwall resolved normal to the interface parallel to - // the interface - const scalarField uwall(nWall & Uwall); - - theta += (thetaA - thetaR)*tanh(uwall/uTheta); - } - - // Reset nHatp to correspond to the contact angle - const scalarField a12(nHatp & np); - const scalarField b1(cos(theta)); - scalarField b2(nHatp.size()); - forAll(b2, facei) - { - b2[facei] = cos(acos(a12[facei]) - theta[facei]); - } - const scalarField det(1 - a12*a12); - const scalarField a((b1 - a12*b2)/det); - const scalarField b((b2 - a12*b1)/det); - - nHatp = a*np + b*nHatp; - nHatp /= (mag(nHatp) + deltaN_.value()); - } - } -} - - Foam::tmp Foam::phaseSystem::K ( const phaseModel& phase1, @@ -322,7 +192,14 @@ Foam::tmp Foam::phaseSystem::K { tmp tnHatfv = nHatfv(phase1, phase2); - correctContactAngle(phase1, phase2, tnHatfv.ref().boundaryFieldRef()); + correctContactAngle + ( + phase1, + phase2, + phase1.U()().boundaryField(), + deltaN_, + tnHatfv.ref().boundaryFieldRef() + ); // Simple expression for curvature return -fvc::div(tnHatfv & mesh_.Sf()); diff --git a/applications/solvers/multiphase/multiphaseEulerFoam/phaseSystems/phaseSystem/phaseSystem.H b/applications/solvers/multiphase/multiphaseEulerFoam/phaseSystems/phaseSystem/phaseSystem.H index 59db74c6b1..776382b714 100644 --- a/applications/solvers/multiphase/multiphaseEulerFoam/phaseSystems/phaseSystem/phaseSystem.H +++ b/applications/solvers/multiphase/multiphaseEulerFoam/phaseSystems/phaseSystem/phaseSystem.H @@ -211,19 +211,6 @@ protected: const volScalarField& alpha2 ) const; - //- Correction for the boundary condition on the unit normal nHat on - // walls to produce the correct contact angle. - // - // The dynamic contact angle is calculated from the component of - // the velocity on the direction of the interface, parallel to the - // wall. Used for interface compression. - void correctContactAngle - ( - const phaseModel& alpha1, - const phaseModel& alpha2, - surfaceVectorField::Boundary& nHatb - ) const; - //- Curvature of interface between two phases // Used for interface compression tmp K diff --git a/applications/solvers/multiphase/multiphaseInterFoam/multiphaseMixture/Make/files b/applications/solvers/multiphase/multiphaseInterFoam/multiphaseMixture/Make/files index 5912ebaf0e..d2410d4b49 100644 --- a/applications/solvers/multiphase/multiphaseInterFoam/multiphaseMixture/Make/files +++ b/applications/solvers/multiphase/multiphaseInterFoam/multiphaseMixture/Make/files @@ -1,5 +1,4 @@ phase/phase.C -alphaContactAngle/alphaContactAngleFvPatchScalarField.C multiphaseMixture.C LIB = $(FOAM_LIBBIN)/libmultiphaseInterFoam diff --git a/applications/solvers/multiphase/multiphaseInterFoam/multiphaseMixture/Make/options b/applications/solvers/multiphase/multiphaseInterFoam/multiphaseMixture/Make/options index ee0bc13126..bfbd7774fa 100644 --- a/applications/solvers/multiphase/multiphaseInterFoam/multiphaseMixture/Make/options +++ b/applications/solvers/multiphase/multiphaseInterFoam/multiphaseMixture/Make/options @@ -1,6 +1,7 @@ EXE_INC = \ -IalphaContactAngle \ -I$(LIB_SRC)/physicalProperties/lnInclude \ + -I$(LIB_SRC)/multiphaseModels/multiphaseProperties/lnInclude \ -I$(LIB_SRC)/twoPhaseModels/interfaceProperties/lnInclude \ -I$(LIB_SRC)/finiteVolume/lnInclude \ -I$(LIB_SRC)/meshTools/lnInclude @@ -8,5 +9,6 @@ EXE_INC = \ LIB_LIBS = \ -linterfaceProperties \ -lphysicalProperties \ + -lmultiphaseProperties \ -lfiniteVolume \ -lmeshTools diff --git a/applications/solvers/multiphase/multiphaseInterFoam/multiphaseMixture/alphaContactAngle/alphaContactAngleFvPatchScalarField.C b/applications/solvers/multiphase/multiphaseInterFoam/multiphaseMixture/alphaContactAngle/alphaContactAngleFvPatchScalarField.C deleted file mode 100644 index 7216f1a4f8..0000000000 --- a/applications/solvers/multiphase/multiphaseInterFoam/multiphaseMixture/alphaContactAngle/alphaContactAngleFvPatchScalarField.C +++ /dev/null @@ -1,145 +0,0 @@ -/*---------------------------------------------------------------------------*\ - ========= | - \\ / F ield | OpenFOAM: The Open Source CFD Toolbox - \\ / O peration | Website: https://openfoam.org - \\ / A nd | Copyright (C) 2011-2021 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 . - -\*---------------------------------------------------------------------------*/ - -#include "alphaContactAngleFvPatchScalarField.H" -#include "addToRunTimeSelectionTable.H" -#include "fvPatchFieldMapper.H" - -// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // - -namespace Foam -{ - -alphaContactAngleFvPatchScalarField::interfaceThetaProps::interfaceThetaProps -( - Istream& is -) -: - theta0_(readScalar(is)), - uTheta_(readScalar(is)), - thetaA_(readScalar(is)), - thetaR_(readScalar(is)) -{} - - -Istream& operator>> -( - Istream& is, - alphaContactAngleFvPatchScalarField::interfaceThetaProps& tp -) -{ - is >> tp.theta0_ >> tp.uTheta_ >> tp.thetaA_ >> tp.thetaR_; - return is; -} - - -Ostream& operator<< -( - Ostream& os, - const alphaContactAngleFvPatchScalarField::interfaceThetaProps& tp -) -{ - os << tp.theta0_ << token::SPACE - << tp.uTheta_ << token::SPACE - << tp.thetaA_ << token::SPACE - << tp.thetaR_; - - return os; -} - - -// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // - -alphaContactAngleFvPatchScalarField::alphaContactAngleFvPatchScalarField -( - const fvPatch& p, - const DimensionedField& iF -) -: - zeroGradientFvPatchScalarField(p, iF) -{} - - -alphaContactAngleFvPatchScalarField::alphaContactAngleFvPatchScalarField -( - const fvPatch& p, - const DimensionedField& iF, - const dictionary& dict -) -: - zeroGradientFvPatchScalarField(p, iF), - thetaProps_(dict.lookup("thetaProperties")) -{ - evaluate(); -} - - -alphaContactAngleFvPatchScalarField::alphaContactAngleFvPatchScalarField -( - const alphaContactAngleFvPatchScalarField& gcpsf, - const fvPatch& p, - const DimensionedField& iF, - const fvPatchFieldMapper& mapper -) -: - zeroGradientFvPatchScalarField(gcpsf, p, iF, mapper), - thetaProps_(gcpsf.thetaProps_) -{} - - -alphaContactAngleFvPatchScalarField::alphaContactAngleFvPatchScalarField -( - const alphaContactAngleFvPatchScalarField& gcpsf, - const DimensionedField& iF -) -: - zeroGradientFvPatchScalarField(gcpsf, iF), - thetaProps_(gcpsf.thetaProps_) -{} - - -// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // - -void alphaContactAngleFvPatchScalarField::write(Ostream& os) const -{ - fvPatchScalarField::write(os); - writeEntry(os, "thetaProperties", thetaProps_); - writeEntry(os, "value", *this); -} - - -// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // - -makePatchTypeField -( - fvPatchScalarField, - alphaContactAngleFvPatchScalarField -); - -// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // - -} // End namespace Foam - -// ************************************************************************* // diff --git a/applications/solvers/multiphase/multiphaseInterFoam/multiphaseMixture/alphaContactAngle/alphaContactAngleFvPatchScalarField.H b/applications/solvers/multiphase/multiphaseInterFoam/multiphaseMixture/alphaContactAngle/alphaContactAngleFvPatchScalarField.H deleted file mode 100644 index 942d44535e..0000000000 --- a/applications/solvers/multiphase/multiphaseInterFoam/multiphaseMixture/alphaContactAngle/alphaContactAngleFvPatchScalarField.H +++ /dev/null @@ -1,206 +0,0 @@ -/*---------------------------------------------------------------------------*\ - ========= | - \\ / F ield | OpenFOAM: The Open Source CFD Toolbox - \\ / O peration | Website: https://openfoam.org - \\ / A nd | Copyright (C) 2011-2020 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 . - -Class - Foam::alphaContactAngleFvPatchScalarField - -Description - Contact-angle boundary condition for multi-phase interface-capturing - simulations. Used in conjunction with multiphaseMixture. - -SourceFiles - alphaContactAngleFvPatchScalarField.C - -\*---------------------------------------------------------------------------*/ - -#ifndef alphaContactAngleFvPatchScalarField_H -#define alphaContactAngleFvPatchScalarField_H - -#include "zeroGradientFvPatchFields.H" -#include "multiphaseMixture.H" - -// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // - -namespace Foam -{ - -/*---------------------------------------------------------------------------*\ - Class alphaContactAngleFvPatch Declaration -\*---------------------------------------------------------------------------*/ - -class alphaContactAngleFvPatchScalarField -: - public zeroGradientFvPatchScalarField -{ -public: - - class interfaceThetaProps - { - //- Equilibrium contact angle - scalar theta0_; - - //- Dynamic contact angle velocity scale - scalar uTheta_; - - //- Limiting advancing contact angle - scalar thetaA_; - - //- Limiting receding contact angle - scalar thetaR_; - - - public: - - // Constructors - interfaceThetaProps() - {} - - interfaceThetaProps(Istream&); - - - // Member Functions - - //- Return the equilibrium contact angle theta0 - scalar theta0(bool matched=true) const - { - if (matched) return theta0_; - else return 180.0 - theta0_; - } - - //- Return the dynamic contact angle velocity scale - scalar uTheta() const - { - return uTheta_; - } - - //- Return the limiting advancing contact angle - scalar thetaA(bool matched=true) const - { - if (matched) return thetaA_; - else return 180.0 - thetaA_; - } - - //- Return the limiting receding contact angle - scalar thetaR(bool matched=true) const - { - if (matched) return thetaR_; - else return 180.0 - thetaR_; - } - - - // IO functions - - friend Istream& operator>>(Istream&, interfaceThetaProps&); - friend Ostream& operator<<(Ostream&, const interfaceThetaProps&); - }; - - typedef HashTable - < - interfaceThetaProps, - multiphaseMixture::interfacePair, - multiphaseMixture::interfacePair::hash - > thetaPropsTable; - - -private: - - // Private Data - - thetaPropsTable thetaProps_; - - -public: - - //- Runtime type information - TypeName("alphaContactAngle"); - - - // Constructors - - //- Construct from patch and internal field - alphaContactAngleFvPatchScalarField - ( - const fvPatch&, - const DimensionedField& - ); - - //- Construct from patch, internal field and dictionary - alphaContactAngleFvPatchScalarField - ( - const fvPatch&, - const DimensionedField&, - const dictionary& - ); - - //- Construct by mapping given alphaContactAngleFvPatchScalarField - // onto a new patch - alphaContactAngleFvPatchScalarField - ( - const alphaContactAngleFvPatchScalarField&, - const fvPatch&, - const DimensionedField&, - const fvPatchFieldMapper& - ); - - //- Construct as copy setting internal field reference - alphaContactAngleFvPatchScalarField - ( - const alphaContactAngleFvPatchScalarField&, - const DimensionedField& - ); - - //- Construct and return a clone setting internal field reference - virtual tmp clone - ( - const DimensionedField& iF - ) const - { - return tmp - ( - new alphaContactAngleFvPatchScalarField(*this, iF) - ); - } - - - // Member Functions - - //- Return the contact angle properties - const thetaPropsTable& thetaProps() const - { - return thetaProps_; - } - - //- Write - virtual void write(Ostream&) const; -}; - - -// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // - -} // End namespace Foam - -// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // - -#endif - -// ************************************************************************* // diff --git a/applications/solvers/multiphase/multiphaseInterFoam/multiphaseMixture/multiphaseMixture.C b/applications/solvers/multiphase/multiphaseInterFoam/multiphaseMixture/multiphaseMixture.C index a52ca5b29b..fd981e55b8 100644 --- a/applications/solvers/multiphase/multiphaseInterFoam/multiphaseMixture/multiphaseMixture.C +++ b/applications/solvers/multiphase/multiphaseInterFoam/multiphaseMixture/multiphaseMixture.C @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | Website: https://openfoam.org - \\ / A nd | Copyright (C) 2011-2021 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2011-2022 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -25,7 +25,7 @@ License #include "multiphaseMixture.H" #include "alphaContactAngleFvPatchScalarField.H" -#include "unitConversion.H" +#include "correctContactAngle.H" #include "Time.H" #include "subCycle.H" #include "MULES.H" @@ -391,132 +391,6 @@ Foam::tmp Foam::multiphaseMixture::nHatf } -void Foam::multiphaseMixture::correctContactAngle -( - const phase& alpha1, - const phase& alpha2, - surfaceVectorField::Boundary& nHatb -) const -{ - const volScalarField::Boundary& a1bf = alpha1.boundaryField(); - const volScalarField::Boundary& a2bf = alpha2.boundaryField(); - - const fvBoundaryMesh& boundary = mesh_.boundary(); - - forAll(boundary, patchi) - { - if - ( - isA(a1bf[patchi]) - || isA(a2bf[patchi]) - ) - { - if - ( - isA(a1bf[patchi]) - && isA(a2bf[patchi]) - ) - { - FatalErrorInFunction - << "alphaContactAngle boundary condition " - "specified on patch " << boundary[patchi].name() - << " for both " << alpha1.name() << " and " << alpha2.name() - << nl << "which may be inconsistent." - << exit(FatalError); - } - - const alphaContactAngleFvPatchScalarField& acap = - isA(a1bf[patchi]) - ? refCast(a1bf[patchi]) - : refCast(a2bf[patchi]) - ; - - vectorField& nHatPatch = nHatb[patchi]; - - const vectorField AfHatPatch - ( - mesh_.Sf().boundaryField()[patchi] - /mesh_.magSf().boundaryField()[patchi] - ); - - alphaContactAngleFvPatchScalarField::thetaPropsTable:: - const_iterator tp = - acap.thetaProps().find(interfacePair(alpha1, alpha2)); - - if (tp == acap.thetaProps().end()) - { - FatalErrorInFunction - << "Cannot find interface " << interfacePair(alpha1, alpha2) - << "\n in table of theta properties for patch " - << acap.patch().name() - << exit(FatalError); - } - - const bool matched = (tp.key().first() == alpha1.name()); - - const scalar theta0 = degToRad(tp().theta0(matched)); - - scalarField theta(boundary[patchi].size(), theta0); - - const scalar uTheta = tp().uTheta(); - - // Calculate the dynamic contact angle if required - if (uTheta > small) - { - const scalar thetaA = degToRad(tp().thetaA(matched)); - const scalar thetaR = degToRad(tp().thetaR(matched)); - - // Calculated the component of the velocity parallel to the wall - vectorField Uwall - ( - U_.boundaryField()[patchi].patchInternalField() - - U_.boundaryField()[patchi] - ); - Uwall -= (AfHatPatch & Uwall)*AfHatPatch; - - // Find the direction of the interface parallel to the wall - vectorField nWall - ( - nHatPatch - (AfHatPatch & nHatPatch)*AfHatPatch - ); - - // Normalise nWall - nWall /= (mag(nWall) + small); - - // Calculate Uwall resolved normal to the interface parallel to - // the interface - const scalarField uwall(nWall & Uwall); - - theta += (thetaA - thetaR)*tanh(uwall/uTheta); - } - - - // Reset nHatPatch to correspond to the contact angle - - const scalarField a12(nHatPatch & AfHatPatch); - - const scalarField b1(cos(theta)); - - scalarField b2(nHatPatch.size()); - - forAll(b2, facei) - { - b2[facei] = cos(acos(a12[facei]) - theta[facei]); - } - - const scalarField det(1.0 - a12*a12); - - const scalarField a((b1 - a12*b2)/det); - const scalarField b((b2 - a12*b1)/det); - - nHatPatch = a*AfHatPatch + b*nHatPatch; - - nHatPatch /= (mag(nHatPatch) + deltaN_.value()); - } - } -} - - Foam::tmp Foam::multiphaseMixture::K ( const phase& alpha1, @@ -525,7 +399,14 @@ Foam::tmp Foam::multiphaseMixture::K { tmp tnHatfv = nHatfv(alpha1, alpha2); - correctContactAngle(alpha1, alpha2, tnHatfv.ref().boundaryFieldRef()); + correctContactAngle + ( + alpha1, + alpha2, + U_.boundaryField(), + deltaN_, + tnHatfv.ref().boundaryFieldRef() + ); // Simple expression for curvature return -fvc::div(tnHatfv & mesh_.Sf()); diff --git a/applications/solvers/multiphase/multiphaseInterFoam/multiphaseMixture/multiphaseMixture.H b/applications/solvers/multiphase/multiphaseInterFoam/multiphaseMixture/multiphaseMixture.H index 2e50e2c08e..120eb5f03d 100644 --- a/applications/solvers/multiphase/multiphaseInterFoam/multiphaseMixture/multiphaseMixture.H +++ b/applications/solvers/multiphase/multiphaseInterFoam/multiphaseMixture/multiphaseMixture.H @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | Website: https://openfoam.org - \\ / A nd | Copyright (C) 2011-2021 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2011-2022 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -173,18 +173,6 @@ private: const volScalarField& alpha2 ) const; - //- Correction for the boundary condition on the unit normal nHat on - // walls to produce the correct contact angle. - // - // The dynamic contact angle is calculated from the component of the - // velocity on the direction of the interface, parallel to the wall. - void correctContactAngle - ( - const phase& alpha1, - const phase& alpha2, - surfaceVectorField::Boundary& nHatb - ) const; - tmp K(const phase& alpha1, const phase& alpha2) const; diff --git a/src/Allwmake b/src/Allwmake index aa6a860e35..7a393240ea 100755 --- a/src/Allwmake +++ b/src/Allwmake @@ -59,6 +59,7 @@ wmake $targetType physicalProperties thermophysicalModels/Allwmake $targetType $* twoPhaseModels/Allwmake $targetType $* +multiphaseModels/Allwmake $targetType $* MomentumTransportModels/Allwmake $targetType $* ThermophysicalTransportModels/Allwmake $targetType $* wmake $targetType radiationModels diff --git a/src/multiphaseModels/Allwmake b/src/multiphaseModels/Allwmake new file mode 100755 index 0000000000..2f30a6db5d --- /dev/null +++ b/src/multiphaseModels/Allwmake @@ -0,0 +1,9 @@ +#!/bin/sh +cd ${0%/*} || exit 1 # Run from this directory + +# Parse arguments for library compilation +. $WM_PROJECT_DIR/wmake/scripts/AllwmakeParseArguments + +wmake $targetType multiphaseProperties + +#------------------------------------------------------------------------------ diff --git a/src/multiphaseModels/multiphaseProperties/Make/files b/src/multiphaseModels/multiphaseProperties/Make/files new file mode 100644 index 0000000000..cd0a11242b --- /dev/null +++ b/src/multiphaseModels/multiphaseProperties/Make/files @@ -0,0 +1,4 @@ +alphaContactAngle/alphaContactAngleFvPatchScalarField.C +correctContactAngle/correctContactAngle.C + +LIB = $(FOAM_LIBBIN)/libmultiphaseProperties diff --git a/src/multiphaseModels/multiphaseProperties/Make/options b/src/multiphaseModels/multiphaseProperties/Make/options new file mode 100644 index 0000000000..71b7873964 --- /dev/null +++ b/src/multiphaseModels/multiphaseProperties/Make/options @@ -0,0 +1,5 @@ +EXE_INC = \ + -I$(LIB_SRC)/finiteVolume/lnInclude + +LIB_LIBS = \ + -lfiniteVolume diff --git a/applications/solvers/multiphase/multiphaseEulerFoam/phaseSystems/alphaContactAngle/alphaContactAngleFvPatchScalarField.C b/src/multiphaseModels/multiphaseProperties/alphaContactAngle/alphaContactAngleFvPatchScalarField.C similarity index 100% rename from applications/solvers/multiphase/multiphaseEulerFoam/phaseSystems/alphaContactAngle/alphaContactAngleFvPatchScalarField.C rename to src/multiphaseModels/multiphaseProperties/alphaContactAngle/alphaContactAngleFvPatchScalarField.C diff --git a/applications/solvers/multiphase/multiphaseEulerFoam/phaseSystems/alphaContactAngle/alphaContactAngleFvPatchScalarField.H b/src/multiphaseModels/multiphaseProperties/alphaContactAngle/alphaContactAngleFvPatchScalarField.H similarity index 99% rename from applications/solvers/multiphase/multiphaseEulerFoam/phaseSystems/alphaContactAngle/alphaContactAngleFvPatchScalarField.H rename to src/multiphaseModels/multiphaseProperties/alphaContactAngle/alphaContactAngleFvPatchScalarField.H index f4da42e990..f9749c4766 100644 --- a/applications/solvers/multiphase/multiphaseEulerFoam/phaseSystems/alphaContactAngle/alphaContactAngleFvPatchScalarField.H +++ b/src/multiphaseModels/multiphaseProperties/alphaContactAngle/alphaContactAngleFvPatchScalarField.H @@ -26,7 +26,7 @@ Class Description Contact-angle boundary condition for multi-phase interface-capturing - simulations. Used in conjunction with phaseSystem. + simulations. SourceFiles alphaContactAngleFvPatchScalarField.C diff --git a/src/multiphaseModels/multiphaseProperties/correctContactAngle/correctContactAngle.C b/src/multiphaseModels/multiphaseProperties/correctContactAngle/correctContactAngle.C new file mode 100644 index 0000000000..3bc404ed50 --- /dev/null +++ b/src/multiphaseModels/multiphaseProperties/correctContactAngle/correctContactAngle.C @@ -0,0 +1,159 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | Website: https://openfoam.org + \\ / A nd | Copyright (C) 2022 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 . + +\*---------------------------------------------------------------------------*/ + +#include "correctContactAngle.H" +#include "unitConversion.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +void Foam::correctContactAngle +( + const volScalarField& a1, + const volScalarField& a2, + const volVectorField::Boundary& Ubf, + const dimensionedScalar& deltaN, + surfaceVectorField::Boundary& nHatbf +) +{ + const volScalarField::Boundary& a1bf = a1.boundaryField(); + const volScalarField::Boundary& a2bf = a2.boundaryField(); + + const fvBoundaryMesh& boundary = a1.mesh().boundary(); + + forAll(boundary, patchi) + { + const fvPatchScalarField& a1p = a1bf[patchi]; + const fvPatchScalarField& a2p = a2bf[patchi]; + + const bool a1pIsCa = isA(a1p); + const bool a2pIsCa = isA(a2p); + + if (a1pIsCa || a2pIsCa) + { + if (a1pIsCa != a2pIsCa) + { + FatalErrorInFunction + << alphaContactAngleFvPatchScalarField::typeName + << " boundary condition specified on patch " + << boundary[patchi].name() << " for " + << (a1pIsCa ? a1.name() : a2.name()) << " but not for " + << (a2pIsCa ? a1.name() : a2.name()) + << exit(FatalError); + } + + const alphaContactAngleFvPatchScalarField& a1ca = + refCast(a1p); + const alphaContactAngleFvPatchScalarField& a2ca = + refCast(a2p); + + const bool a1caHasProps = a1ca.thetaProps().found(a2.group()); + const bool a2caHasProps = a2ca.thetaProps().found(a1.group()); + + if (!a1caHasProps && !a2caHasProps) + { + FatalErrorInFunction + << "Neither " + << alphaContactAngleFvPatchScalarField::typeName + << " boundary condition specified on patch " + << boundary[patchi].name() + << " for " << a1.name() << " and " << a2.name() + << " contains properties for the other phase" + << exit(FatalError); + } + + if + ( + a1caHasProps && a2caHasProps + && a1ca.thetaProps()[a2.group()] + != a2ca.thetaProps()[a1.group()].reversed() + ) + { + FatalErrorInFunction + << "The " + << alphaContactAngleFvPatchScalarField::typeName + << " boundary conditions specified on patch " + << boundary[patchi].name() + << " for " << a1.name() << " and " << a2.name() + << " contain inconsistent properties" + << exit(FatalError); + } + + const alphaContactAngleFvPatchScalarField::contactAngleProperties + tp = a1caHasProps + ? a1ca.thetaProps()[a2.group()] + : a2ca.thetaProps()[a1.group()].reversed(); + + const vectorField np(a1.mesh().boundary()[patchi].nf()); + + vectorField& nHatp = nHatbf[patchi]; + + // Calculate the contact angle + scalarField theta(np.size(), degToRad(tp.theta0())); + + // Calculate the dynamic contact angle if required + if (tp.dynamic()) + { + const scalar uTheta = tp.uTheta(); + const scalar thetaA = degToRad(tp.thetaA()); + const scalar thetaR = degToRad(tp.thetaR()); + + // Calculated the component of the velocity parallel to the wall + vectorField Uwall + ( + Ubf[patchi].patchInternalField() - Ubf[patchi] + ); + Uwall -= (np & Uwall)*np; + + // Find the direction of the interface parallel to the wall + vectorField nWall(nHatp - (np & nHatp)*np); + nWall /= (mag(nWall) + small); + + // Calculate Uwall resolved normal to the interface parallel to + // the interface + const scalarField uwall(nWall & Uwall); + + theta += (thetaA - thetaR)*tanh(uwall/uTheta); + } + + // Reset nHatp to correspond to the contact angle + const scalarField a12(nHatp & np); + const scalarField b1(cos(theta)); + scalarField b2(nHatp.size()); + forAll(b2, facei) + { + b2[facei] = cos(acos(a12[facei]) - theta[facei]); + } + const scalarField det(1 - a12*a12); + const scalarField a((b1 - a12*b2)/det); + const scalarField b((b2 - a12*b1)/det); + + nHatp = a*np + b*nHatp; + nHatp /= (mag(nHatp) + deltaN.value()); + } + } +} + + +// ************************************************************************* // diff --git a/src/multiphaseModels/multiphaseProperties/correctContactAngle/correctContactAngle.H b/src/multiphaseModels/multiphaseProperties/correctContactAngle/correctContactAngle.H new file mode 100644 index 0000000000..ba63c942d9 --- /dev/null +++ b/src/multiphaseModels/multiphaseProperties/correctContactAngle/correctContactAngle.H @@ -0,0 +1,65 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | Website: https://openfoam.org + \\ / A nd | Copyright (C) 2022 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 . + +Class + Foam::correctContactAngle + +Description + Correction for the boundary condition on the unit normal nHat on + walls to produce the correct contact angle. The dynamic contact angle is + calculated from the component of the velocity on the direction of the + interface, parallel to the wall. + +SourceFiles + correctContactAngle.C + +\*---------------------------------------------------------------------------*/ + +#ifndef correctContactAngle_H +#define correctContactAngle_H + +#include "alphaContactAngleFvPatchScalarField.H" +#include "surfaceFields.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +//- Correct the contact angle for the two volume fraction fields +void correctContactAngle +( + const volScalarField& alpha1, + const volScalarField& alpha2, + const volVectorField::Boundary& Ubf, + const dimensionedScalar& deltaN, + surfaceVectorField::Boundary& nHatbf +); + +} + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/tutorials/multiphase/compressibleMultiphaseInterFoam/laminar/damBreak4phase/0/alpha.air.orig b/tutorials/multiphase/compressibleMultiphaseInterFoam/laminar/damBreak4phase/0/alpha.air.orig index 30f6025155..d8e07cbd20 100644 --- a/tutorials/multiphase/compressibleMultiphaseInterFoam/laminar/damBreak4phase/0/alpha.air.orig +++ b/tutorials/multiphase/compressibleMultiphaseInterFoam/laminar/damBreak4phase/0/alpha.air.orig @@ -23,43 +23,34 @@ boundaryField leftWall { type alphaContactAngle; - thetaProperties - ( - ( water air ) 90 0 0 0 - ( oil air ) 90 0 0 0 - ( mercury air ) 90 0 0 0 - ( water oil ) 90 0 0 0 - ( water mercury ) 90 0 0 0 - ( oil mercury ) 90 0 0 0 - ); + contactAngleProperties + { + oil { theta0 90; } + water { theta0 90; } + mercury { theta0 90; } + } value uniform 0; } rightWall { type alphaContactAngle; - thetaProperties - ( - ( water air ) 90 0 0 0 - ( oil air ) 90 0 0 0 - ( mercury air ) 90 0 0 0 - ( water oil ) 90 0 0 0 - ( water mercury ) 90 0 0 0 - ( oil mercury ) 90 0 0 0 - ); + contactAngleProperties + { + oil { theta0 90; } + water { theta0 90; } + mercury { theta0 90; } + } value uniform 1; } lowerWall { type alphaContactAngle; - thetaProperties - ( - ( water air ) 90 0 0 0 - ( oil air ) 90 0 0 0 - ( mercury air ) 90 0 0 0 - ( water oil ) 90 0 0 0 - ( water mercury ) 90 0 0 0 - ( oil mercury ) 90 0 0 0 - ); + contactAngleProperties + { + oil { theta0 90; } + water { theta0 90; } + mercury { theta0 90; } + } value uniform 0; } atmosphere diff --git a/tutorials/multiphase/compressibleMultiphaseInterFoam/laminar/damBreak4phase/0/alpha.mercury.orig b/tutorials/multiphase/compressibleMultiphaseInterFoam/laminar/damBreak4phase/0/alpha.mercury.orig index 1128cce360..9a15e94d1c 100644 --- a/tutorials/multiphase/compressibleMultiphaseInterFoam/laminar/damBreak4phase/0/alpha.mercury.orig +++ b/tutorials/multiphase/compressibleMultiphaseInterFoam/laminar/damBreak4phase/0/alpha.mercury.orig @@ -22,15 +22,36 @@ boundaryField { leftWall { - type zeroGradient; + type alphaContactAngle; + contactAngleProperties + { + air { theta0 90; } + oil { theta0 90; } + water { theta0 90; } + } + value uniform 0; } rightWall { - type zeroGradient; + type alphaContactAngle; + contactAngleProperties + { + air { theta0 90; } + oil { theta0 90; } + water { theta0 90; } + } + value uniform 0; } lowerWall { - type zeroGradient; + type alphaContactAngle; + contactAngleProperties + { + air { theta0 90; } + oil { theta0 90; } + water { theta0 90; } + } + value uniform 0; } atmosphere { diff --git a/tutorials/multiphase/compressibleMultiphaseInterFoam/laminar/damBreak4phase/0/alpha.oil.orig b/tutorials/multiphase/compressibleMultiphaseInterFoam/laminar/damBreak4phase/0/alpha.oil.orig index ec23852b3c..657c29c086 100644 --- a/tutorials/multiphase/compressibleMultiphaseInterFoam/laminar/damBreak4phase/0/alpha.oil.orig +++ b/tutorials/multiphase/compressibleMultiphaseInterFoam/laminar/damBreak4phase/0/alpha.oil.orig @@ -22,15 +22,36 @@ boundaryField { leftWall { - type zeroGradient; + type alphaContactAngle; + contactAngleProperties + { + air { theta0 90; } + water { theta0 90; } + mercury { theta0 90; } + } + value uniform 0; } rightWall { - type zeroGradient; + type alphaContactAngle; + contactAngleProperties + { + air { theta0 90; } + water { theta0 90; } + mercury { theta0 90; } + } + value uniform 0; } lowerWall { - type zeroGradient; + type alphaContactAngle; + contactAngleProperties + { + air { theta0 90; } + water { theta0 90; } + mercury { theta0 90; } + } + value uniform 0; } atmosphere { diff --git a/tutorials/multiphase/compressibleMultiphaseInterFoam/laminar/damBreak4phase/0/alpha.water.orig b/tutorials/multiphase/compressibleMultiphaseInterFoam/laminar/damBreak4phase/0/alpha.water.orig index 542d52f791..523cb66377 100644 --- a/tutorials/multiphase/compressibleMultiphaseInterFoam/laminar/damBreak4phase/0/alpha.water.orig +++ b/tutorials/multiphase/compressibleMultiphaseInterFoam/laminar/damBreak4phase/0/alpha.water.orig @@ -22,15 +22,36 @@ boundaryField { leftWall { - type zeroGradient; + type alphaContactAngle; + contactAngleProperties + { + air { theta0 90; } + oil { theta0 90; } + mercury { theta0 90; } + } + value uniform 0; } rightWall { - type zeroGradient; + type alphaContactAngle; + contactAngleProperties + { + air { theta0 90; } + oil { theta0 90; } + mercury { theta0 90; } + } + value uniform 0; } lowerWall { - type zeroGradient; + type alphaContactAngle; + contactAngleProperties + { + air { theta0 90; } + oil { theta0 90; } + mercury { theta0 90; } + } + value uniform 0; } atmosphere { diff --git a/tutorials/multiphase/multiphaseInterFoam/RAS/damBreak4phase/0/alpha.air.orig b/tutorials/multiphase/multiphaseInterFoam/RAS/damBreak4phase/0/alpha.air.orig index 30f6025155..d8e07cbd20 100644 --- a/tutorials/multiphase/multiphaseInterFoam/RAS/damBreak4phase/0/alpha.air.orig +++ b/tutorials/multiphase/multiphaseInterFoam/RAS/damBreak4phase/0/alpha.air.orig @@ -23,43 +23,34 @@ boundaryField leftWall { type alphaContactAngle; - thetaProperties - ( - ( water air ) 90 0 0 0 - ( oil air ) 90 0 0 0 - ( mercury air ) 90 0 0 0 - ( water oil ) 90 0 0 0 - ( water mercury ) 90 0 0 0 - ( oil mercury ) 90 0 0 0 - ); + contactAngleProperties + { + oil { theta0 90; } + water { theta0 90; } + mercury { theta0 90; } + } value uniform 0; } rightWall { type alphaContactAngle; - thetaProperties - ( - ( water air ) 90 0 0 0 - ( oil air ) 90 0 0 0 - ( mercury air ) 90 0 0 0 - ( water oil ) 90 0 0 0 - ( water mercury ) 90 0 0 0 - ( oil mercury ) 90 0 0 0 - ); + contactAngleProperties + { + oil { theta0 90; } + water { theta0 90; } + mercury { theta0 90; } + } value uniform 1; } lowerWall { type alphaContactAngle; - thetaProperties - ( - ( water air ) 90 0 0 0 - ( oil air ) 90 0 0 0 - ( mercury air ) 90 0 0 0 - ( water oil ) 90 0 0 0 - ( water mercury ) 90 0 0 0 - ( oil mercury ) 90 0 0 0 - ); + contactAngleProperties + { + oil { theta0 90; } + water { theta0 90; } + mercury { theta0 90; } + } value uniform 0; } atmosphere diff --git a/tutorials/multiphase/multiphaseInterFoam/RAS/damBreak4phase/0/alpha.mercury.orig b/tutorials/multiphase/multiphaseInterFoam/RAS/damBreak4phase/0/alpha.mercury.orig index 1128cce360..9a15e94d1c 100644 --- a/tutorials/multiphase/multiphaseInterFoam/RAS/damBreak4phase/0/alpha.mercury.orig +++ b/tutorials/multiphase/multiphaseInterFoam/RAS/damBreak4phase/0/alpha.mercury.orig @@ -22,15 +22,36 @@ boundaryField { leftWall { - type zeroGradient; + type alphaContactAngle; + contactAngleProperties + { + air { theta0 90; } + oil { theta0 90; } + water { theta0 90; } + } + value uniform 0; } rightWall { - type zeroGradient; + type alphaContactAngle; + contactAngleProperties + { + air { theta0 90; } + oil { theta0 90; } + water { theta0 90; } + } + value uniform 0; } lowerWall { - type zeroGradient; + type alphaContactAngle; + contactAngleProperties + { + air { theta0 90; } + oil { theta0 90; } + water { theta0 90; } + } + value uniform 0; } atmosphere { diff --git a/tutorials/multiphase/multiphaseInterFoam/RAS/damBreak4phase/0/alpha.oil.orig b/tutorials/multiphase/multiphaseInterFoam/RAS/damBreak4phase/0/alpha.oil.orig index ec23852b3c..657c29c086 100644 --- a/tutorials/multiphase/multiphaseInterFoam/RAS/damBreak4phase/0/alpha.oil.orig +++ b/tutorials/multiphase/multiphaseInterFoam/RAS/damBreak4phase/0/alpha.oil.orig @@ -22,15 +22,36 @@ boundaryField { leftWall { - type zeroGradient; + type alphaContactAngle; + contactAngleProperties + { + air { theta0 90; } + water { theta0 90; } + mercury { theta0 90; } + } + value uniform 0; } rightWall { - type zeroGradient; + type alphaContactAngle; + contactAngleProperties + { + air { theta0 90; } + water { theta0 90; } + mercury { theta0 90; } + } + value uniform 0; } lowerWall { - type zeroGradient; + type alphaContactAngle; + contactAngleProperties + { + air { theta0 90; } + water { theta0 90; } + mercury { theta0 90; } + } + value uniform 0; } atmosphere { diff --git a/tutorials/multiphase/multiphaseInterFoam/RAS/damBreak4phase/0/alpha.water.orig b/tutorials/multiphase/multiphaseInterFoam/RAS/damBreak4phase/0/alpha.water.orig index 542d52f791..523cb66377 100644 --- a/tutorials/multiphase/multiphaseInterFoam/RAS/damBreak4phase/0/alpha.water.orig +++ b/tutorials/multiphase/multiphaseInterFoam/RAS/damBreak4phase/0/alpha.water.orig @@ -22,15 +22,36 @@ boundaryField { leftWall { - type zeroGradient; + type alphaContactAngle; + contactAngleProperties + { + air { theta0 90; } + oil { theta0 90; } + mercury { theta0 90; } + } + value uniform 0; } rightWall { - type zeroGradient; + type alphaContactAngle; + contactAngleProperties + { + air { theta0 90; } + oil { theta0 90; } + mercury { theta0 90; } + } + value uniform 0; } lowerWall { - type zeroGradient; + type alphaContactAngle; + contactAngleProperties + { + air { theta0 90; } + oil { theta0 90; } + mercury { theta0 90; } + } + value uniform 0; } atmosphere { diff --git a/tutorials/multiphase/multiphaseInterFoam/laminar/damBreak4phase/0/alpha.air.orig b/tutorials/multiphase/multiphaseInterFoam/laminar/damBreak4phase/0/alpha.air.orig index 30f6025155..d8e07cbd20 100644 --- a/tutorials/multiphase/multiphaseInterFoam/laminar/damBreak4phase/0/alpha.air.orig +++ b/tutorials/multiphase/multiphaseInterFoam/laminar/damBreak4phase/0/alpha.air.orig @@ -23,43 +23,34 @@ boundaryField leftWall { type alphaContactAngle; - thetaProperties - ( - ( water air ) 90 0 0 0 - ( oil air ) 90 0 0 0 - ( mercury air ) 90 0 0 0 - ( water oil ) 90 0 0 0 - ( water mercury ) 90 0 0 0 - ( oil mercury ) 90 0 0 0 - ); + contactAngleProperties + { + oil { theta0 90; } + water { theta0 90; } + mercury { theta0 90; } + } value uniform 0; } rightWall { type alphaContactAngle; - thetaProperties - ( - ( water air ) 90 0 0 0 - ( oil air ) 90 0 0 0 - ( mercury air ) 90 0 0 0 - ( water oil ) 90 0 0 0 - ( water mercury ) 90 0 0 0 - ( oil mercury ) 90 0 0 0 - ); + contactAngleProperties + { + oil { theta0 90; } + water { theta0 90; } + mercury { theta0 90; } + } value uniform 1; } lowerWall { type alphaContactAngle; - thetaProperties - ( - ( water air ) 90 0 0 0 - ( oil air ) 90 0 0 0 - ( mercury air ) 90 0 0 0 - ( water oil ) 90 0 0 0 - ( water mercury ) 90 0 0 0 - ( oil mercury ) 90 0 0 0 - ); + contactAngleProperties + { + oil { theta0 90; } + water { theta0 90; } + mercury { theta0 90; } + } value uniform 0; } atmosphere diff --git a/tutorials/multiphase/multiphaseInterFoam/laminar/damBreak4phase/0/alpha.mercury.orig b/tutorials/multiphase/multiphaseInterFoam/laminar/damBreak4phase/0/alpha.mercury.orig index 1128cce360..9a15e94d1c 100644 --- a/tutorials/multiphase/multiphaseInterFoam/laminar/damBreak4phase/0/alpha.mercury.orig +++ b/tutorials/multiphase/multiphaseInterFoam/laminar/damBreak4phase/0/alpha.mercury.orig @@ -22,15 +22,36 @@ boundaryField { leftWall { - type zeroGradient; + type alphaContactAngle; + contactAngleProperties + { + air { theta0 90; } + oil { theta0 90; } + water { theta0 90; } + } + value uniform 0; } rightWall { - type zeroGradient; + type alphaContactAngle; + contactAngleProperties + { + air { theta0 90; } + oil { theta0 90; } + water { theta0 90; } + } + value uniform 0; } lowerWall { - type zeroGradient; + type alphaContactAngle; + contactAngleProperties + { + air { theta0 90; } + oil { theta0 90; } + water { theta0 90; } + } + value uniform 0; } atmosphere { diff --git a/tutorials/multiphase/multiphaseInterFoam/laminar/damBreak4phase/0/alpha.oil.orig b/tutorials/multiphase/multiphaseInterFoam/laminar/damBreak4phase/0/alpha.oil.orig index ec23852b3c..657c29c086 100644 --- a/tutorials/multiphase/multiphaseInterFoam/laminar/damBreak4phase/0/alpha.oil.orig +++ b/tutorials/multiphase/multiphaseInterFoam/laminar/damBreak4phase/0/alpha.oil.orig @@ -22,15 +22,36 @@ boundaryField { leftWall { - type zeroGradient; + type alphaContactAngle; + contactAngleProperties + { + air { theta0 90; } + water { theta0 90; } + mercury { theta0 90; } + } + value uniform 0; } rightWall { - type zeroGradient; + type alphaContactAngle; + contactAngleProperties + { + air { theta0 90; } + water { theta0 90; } + mercury { theta0 90; } + } + value uniform 0; } lowerWall { - type zeroGradient; + type alphaContactAngle; + contactAngleProperties + { + air { theta0 90; } + water { theta0 90; } + mercury { theta0 90; } + } + value uniform 0; } atmosphere { diff --git a/tutorials/multiphase/multiphaseInterFoam/laminar/damBreak4phase/0/alpha.water.orig b/tutorials/multiphase/multiphaseInterFoam/laminar/damBreak4phase/0/alpha.water.orig index 542d52f791..523cb66377 100644 --- a/tutorials/multiphase/multiphaseInterFoam/laminar/damBreak4phase/0/alpha.water.orig +++ b/tutorials/multiphase/multiphaseInterFoam/laminar/damBreak4phase/0/alpha.water.orig @@ -22,15 +22,36 @@ boundaryField { leftWall { - type zeroGradient; + type alphaContactAngle; + contactAngleProperties + { + air { theta0 90; } + oil { theta0 90; } + mercury { theta0 90; } + } + value uniform 0; } rightWall { - type zeroGradient; + type alphaContactAngle; + contactAngleProperties + { + air { theta0 90; } + oil { theta0 90; } + mercury { theta0 90; } + } + value uniform 0; } lowerWall { - type zeroGradient; + type alphaContactAngle; + contactAngleProperties + { + air { theta0 90; } + oil { theta0 90; } + mercury { theta0 90; } + } + value uniform 0; } atmosphere { diff --git a/tutorials/multiphase/multiphaseInterFoam/laminar/damBreak4phaseFine/0/alpha.air.orig b/tutorials/multiphase/multiphaseInterFoam/laminar/damBreak4phaseFine/0/alpha.air.orig index 30f6025155..d8e07cbd20 100644 --- a/tutorials/multiphase/multiphaseInterFoam/laminar/damBreak4phaseFine/0/alpha.air.orig +++ b/tutorials/multiphase/multiphaseInterFoam/laminar/damBreak4phaseFine/0/alpha.air.orig @@ -23,43 +23,34 @@ boundaryField leftWall { type alphaContactAngle; - thetaProperties - ( - ( water air ) 90 0 0 0 - ( oil air ) 90 0 0 0 - ( mercury air ) 90 0 0 0 - ( water oil ) 90 0 0 0 - ( water mercury ) 90 0 0 0 - ( oil mercury ) 90 0 0 0 - ); + contactAngleProperties + { + oil { theta0 90; } + water { theta0 90; } + mercury { theta0 90; } + } value uniform 0; } rightWall { type alphaContactAngle; - thetaProperties - ( - ( water air ) 90 0 0 0 - ( oil air ) 90 0 0 0 - ( mercury air ) 90 0 0 0 - ( water oil ) 90 0 0 0 - ( water mercury ) 90 0 0 0 - ( oil mercury ) 90 0 0 0 - ); + contactAngleProperties + { + oil { theta0 90; } + water { theta0 90; } + mercury { theta0 90; } + } value uniform 1; } lowerWall { type alphaContactAngle; - thetaProperties - ( - ( water air ) 90 0 0 0 - ( oil air ) 90 0 0 0 - ( mercury air ) 90 0 0 0 - ( water oil ) 90 0 0 0 - ( water mercury ) 90 0 0 0 - ( oil mercury ) 90 0 0 0 - ); + contactAngleProperties + { + oil { theta0 90; } + water { theta0 90; } + mercury { theta0 90; } + } value uniform 0; } atmosphere diff --git a/tutorials/multiphase/multiphaseInterFoam/laminar/damBreak4phaseFine/0/alpha.mercury.orig b/tutorials/multiphase/multiphaseInterFoam/laminar/damBreak4phaseFine/0/alpha.mercury.orig index 1128cce360..9a15e94d1c 100644 --- a/tutorials/multiphase/multiphaseInterFoam/laminar/damBreak4phaseFine/0/alpha.mercury.orig +++ b/tutorials/multiphase/multiphaseInterFoam/laminar/damBreak4phaseFine/0/alpha.mercury.orig @@ -22,15 +22,36 @@ boundaryField { leftWall { - type zeroGradient; + type alphaContactAngle; + contactAngleProperties + { + air { theta0 90; } + oil { theta0 90; } + water { theta0 90; } + } + value uniform 0; } rightWall { - type zeroGradient; + type alphaContactAngle; + contactAngleProperties + { + air { theta0 90; } + oil { theta0 90; } + water { theta0 90; } + } + value uniform 0; } lowerWall { - type zeroGradient; + type alphaContactAngle; + contactAngleProperties + { + air { theta0 90; } + oil { theta0 90; } + water { theta0 90; } + } + value uniform 0; } atmosphere { diff --git a/tutorials/multiphase/multiphaseInterFoam/laminar/damBreak4phaseFine/0/alpha.oil.orig b/tutorials/multiphase/multiphaseInterFoam/laminar/damBreak4phaseFine/0/alpha.oil.orig index ec23852b3c..657c29c086 100644 --- a/tutorials/multiphase/multiphaseInterFoam/laminar/damBreak4phaseFine/0/alpha.oil.orig +++ b/tutorials/multiphase/multiphaseInterFoam/laminar/damBreak4phaseFine/0/alpha.oil.orig @@ -22,15 +22,36 @@ boundaryField { leftWall { - type zeroGradient; + type alphaContactAngle; + contactAngleProperties + { + air { theta0 90; } + water { theta0 90; } + mercury { theta0 90; } + } + value uniform 0; } rightWall { - type zeroGradient; + type alphaContactAngle; + contactAngleProperties + { + air { theta0 90; } + water { theta0 90; } + mercury { theta0 90; } + } + value uniform 0; } lowerWall { - type zeroGradient; + type alphaContactAngle; + contactAngleProperties + { + air { theta0 90; } + water { theta0 90; } + mercury { theta0 90; } + } + value uniform 0; } atmosphere { diff --git a/tutorials/multiphase/multiphaseInterFoam/laminar/damBreak4phaseFine/0/alpha.water.orig b/tutorials/multiphase/multiphaseInterFoam/laminar/damBreak4phaseFine/0/alpha.water.orig index 542d52f791..523cb66377 100644 --- a/tutorials/multiphase/multiphaseInterFoam/laminar/damBreak4phaseFine/0/alpha.water.orig +++ b/tutorials/multiphase/multiphaseInterFoam/laminar/damBreak4phaseFine/0/alpha.water.orig @@ -22,15 +22,36 @@ boundaryField { leftWall { - type zeroGradient; + type alphaContactAngle; + contactAngleProperties + { + air { theta0 90; } + oil { theta0 90; } + mercury { theta0 90; } + } + value uniform 0; } rightWall { - type zeroGradient; + type alphaContactAngle; + contactAngleProperties + { + air { theta0 90; } + oil { theta0 90; } + mercury { theta0 90; } + } + value uniform 0; } lowerWall { - type zeroGradient; + type alphaContactAngle; + contactAngleProperties + { + air { theta0 90; } + oil { theta0 90; } + mercury { theta0 90; } + } + value uniform 0; } atmosphere {