CFD Online Discussion Forums

CFD Online Discussion Forums (https://www.cfd-online.com/Forums/)
-   OpenFOAM Programming & Development (https://www.cfd-online.com/Forums/openfoam-programming-development/)
-   -   Adding the Energy Equation to interFoam (OF 2.4.0) (https://www.cfd-online.com/Forums/openfoam-programming-development/162577-adding-energy-equation-interfoam-2-4-0-a.html)

Pay November 13, 2015 05:35

Adding the Energy Equation to interFoam (OF 2.4.0)
 
Dear Foamers,

first of all, this is my first thread, me being new to OF and the forum as well. So I am thankful for any advice regarding anything related to CFD in general and OF and this forum in particular.

Adding the Energy Equation to interFaom makes it necessary to modify the used library (A) and secondly modify the solver itself (B). I am having problems compiling said application, hence I have written this thread.
I am going to describe my steps in detail in this thread. The procedure is inspired by both the documents from Damiano Natali ("interTempFoam") and Qingming Liu ("myinterFoamDiabatic"). The links are given beneath.

http://www.wolfdynamics.com/images/c...erTempFoam.pdf

http://www.tfd.chalmers.se/~hani/kur...gLIU-final.pdf

A) Modifcation of the library

1)
Copy the original folder transportModels to the user's directory

cd $WM_PROJECT_USER_DIR/src/
cp -rp $FOAM_SRC/transportModels .

2)
Rename the folders and files which are being modified (namely the libraries incompressibleTwoPhaseMixture and immiscibleIncompressibleTwoPhaseMixture).

cd transportModels/incompressible
mv incompressibleTwoPhaseMixture myIncompressibleTwoPhaseMixture
cd myIncompressibleTwoPhaseMixture
mv incompressibleTwoPhaseMixture.C myIncompressibleTwoPhaseMixture.C
mv incompressibleTwoPhaseMixture.H myIncompressibleTwoPhaseMixture.H

cd ../..
mv immiscibleIncompressibleTwoPhaseMixture myImmiscibleIncompressibleTwoPhaseMixture
cd myImmiscibleIncompressibleTwoPhaseMixture
mv immiscibleIncompressibleTwoPhaseMixture.C myImmiscibleIncompressibleTwoPhaseMixture.C
mv immiscibleIncompressibleTwoPhaseMixture.H myImmiscibleIncompressibleTwoPhaseMixture.H

3)
Change the respective file files corresponding to the the naming and path.
in the folder incompressible/Make for myIncompressibleTwoPhaseMixture:
Code:

myIncompressibleTwoPhaseMixture/myIncompressibleTwoPhaseMixture.C

LIB = $(FOAM_USER_LIBBIN)/libmyIncompressibleTransportModels

in the folder myImmiscibleIncompressibleTwoPhaseMixture/Make for myImmiscibleIncompressibleTwoPhaseMixture:
Code:

myImmiscibleIncompressibleTwoPhaseMixture.C

LIB = $(FOAM_USER_LIBBIN)/libmyImmiscibleIncompressibleTwoPhaseMixture

4) Make sure the newly named files are being included with their new name in the respective files:
in myIncompressibleTwoPhaseMixture.C:
Code:

#include "myIncompressibleTwoPhaseMixture.H"
in myImmiscibleIncompressibleTwoPhaseMixture.C
Code:

#include "myImmiscibleIncompressibleTwoPhaseMixture.H"
in myImmiscibleIncompressibleTwoPhaseMixture.H
Code:

#include "myIncompressibleTwoPhaseMixture.H"
5)
In the file myImmiscibleIncompressibleTwoPhaseMixture/Make/options make the adaption as highlighted, so the connection to the new library is made.
Code:

LIB_LIBS = \
    -ltwoPhaseMixture \
    -L$(FOAM_USER_LIBBIN) \
    -lmyIncompressibleTransportModels \

    -linterfaceProperties \
    -ltwoPhaseProperties \
    -lfiniteVolume

6)
Add the new parameters rho and Pr in myIncompressibleTwoPhaseMixture.H.
Code:

        dimensionedScalar rho1_;
        dimensionedScalar rho2_;

//-----------modified_start------------//
        dimensionedScalar cp1_;
        dimensionedScalar cp2_;
        dimensionedScalar Pr1_;
        dimensionedScalar Pr2_;
//-----------modified_end------------//

and
Code:

        const dimensionedScalar& rho2() const
        {
        return rho2_;
        };

//-----------modified_start------------//
        //- Return const-access to phase1 density
        const dimensionedScalar& cp1() const
        {
            return cp1_;
        }

        //- Return const-access to phase2 density
        const dimensionedScalar& cp2() const
        {
            return cp2_;
        };

        //- Return const-access to phase1 density
        const dimensionedScalar& Pr1() const
        {
            return Pr1_;
        }

        //- Return const-access to phase2 density
        const dimensionedScalar& Pr2() const
        {
            return Pr2_;
        };
//-----------modified_end------------//

also for kappaf
Code:

        tmp<surfaceScalarField> nuf() const;

//-----------modified_start------------//
        //- Return the face-interpolated conductivity
        tmp<surfaceScalarField> kappaf() const;
//-----------modified_end------------//

7)
In myIncompressibleTwoPhaseMixture.C add the operations for the new parameters.
Code:

  rho2_("rho", dimDensity, nuModel2_->viscosityProperties().lookup("rho")),
//-----------modified_start------------//
    cp1_("cp", dimensionSet(0, 2, -2, -1, 0, 0, 0), nuModel1_->viscosityProperties().lookup("cp")),
    cp2_("cp", dimensionSet(0, 2, -2, -1, 0, 0, 0), nuModel2_->viscosityProperties().lookup("cp")),
    Pr1_("Pr", dimensionSet(0, 0, 0, 0, 0, 0, 0), nuModel1_->viscosityProperties().lookup("Pr")),
    Pr2_("Pr", dimensionSet(0, 0, 0, 0, 0, 0, 0), nuModel2_->viscosityProperties().lookup("Pr")),
//-----------modified_end------------//

and
Code:


            nuModel2_->viscosityProperties().lookup("rho") >> rho2_;
//-----------modified_start--------------------//
        nuModel1_->viscosityProperties().lookup("cp") >> cp1_;
        nuModel2_->viscosityProperties().lookup("cp") >> cp2_;
        nuModel1_->viscosityProperties().lookup("Pr") >> Pr1_;
        nuModel2_->viscosityProperties().lookup("Pr") >> Pr2_;
//-----------modified_end----------------------//

Also add the lines for the calculation of kappaf().
Code:

Foam::tmp<Foam::surfaceScalarField>
Foam::incompressibleTwoPhaseMixture::nuf() const
{
    const surfaceScalarField alpha1f
    (
        min(max(fvc::interpolate(alpha1_), scalar(0)), scalar(1))
    );

    return tmp<surfaceScalarField>
    (
        new surfaceScalarField
        (
            "nuf",
            (
                alpha1f*rho1_*fvc::interpolate(nuModel1_->nu())
              + (scalar(1) - alpha1f)*rho2_*fvc::interpolate(nuModel2_->nu())
            )/(alpha1f*rho1_ + (scalar(1) - alpha1f)*rho2_)
        )
    );
}

//-----------modified_start------------//
Foam::tmp<Foam::surfaceScalarField>
Foam::incompressibleTwoPhaseMixture::kappaf() const
{
        const surfaceScalarField alpha1f
        (
                min(max(fvc::interpolate(alpha1_), scalar(0)), scalar(1))
        );

        return tmp<surfaceScalarField>
        (
                new surfaceScalarField
                (
                        "kappaf",
                        (
                                alpha1f*rho1_*cp1_*(1/Pr1_)
                                *fvc::interpolate(nuModel1_->nu())
                                + (scalar(1) - alpha1f)*rho2_*cp2_
                                *(1/Pr2_)*fvc::interpolate(nuModel2_->nu())
                        )
                )
        );
}
//-----------modified_end------------//

8)
Compile both libraries from the respective folder. Start with myIncompressibleTwoPhaseMixture, because myImmiscibleIncompressibleTwoPhaseMixture depends on it already being compiled beforehand.

cd incompressible
wclean
wmake libso
cd ..
cd myImmiscibleIncompressibleTwoPhaseMixture
wclean
wmake libso


Compiling works at this stage, which is good for the moment but doesn't necessarily mean to me that I did everything right.



B) Modification of the solver interFoam to interTempFoam


1)
Enter the destination of the new solver and copy the base solver.

cd $WM_PROJECT_USER_DIR/applications/solvers/multiphase
cp -rp $FOAM_APP/solvers/multiphase/interFoam .

2)
Rename the folder and the .C file.

mv interFoam interTempFoam
cd interTempFoam
mv interFoam.C interTempFoam.C

3)
Adapt the file Make/files to the changed naming and path.
Code:

interTempFoam.C

EXE = $(FOAM_USER_APPBIN)/interTempFoam

4)
In interTempFoam.C adapt the name of the following library being included.
Code:

#include "myImmiscibleIncompressibleTwoPhaseMixture.H"
5)
Add the following lines in the file createFields.H.
Code:

Info<< "Reading field U\n" << endl;
    volVectorField U
    (
        IOobject
        (
            "U",
            runTime.timeName(),
            mesh,
            IOobject::MUST_READ,
            IOobject::AUTO_WRITE
        ),
        mesh
    );

//-------------modified_start--------------//
    Info<< "Reading field T\n" << endl;
    volScalarField T
    (
        IOobject
        (
            "T",
            runTime.timeName(),
            mesh,
            IOobject::MUST_READ,
            IOobject::AUTO_WRITE
        ),
        mesh
    );
//-------------modified_end--------------//

and
Code:

  const dimensionedScalar& rho2 = mixture.rho2();
//-------------modified_start--------------//
    const dimensionedScalar& cp1 = mixture.cp1();
    const dimensionedScalar& cp2 = mixture.cp2(); //not for Pr1 und Pr2 ???
//-------------modified_end--------------//

and
Code:

  // Mass flux
    surfaceScalarField rhoPhi
    (
        IOobject
        (
            "rhoPhi",
            runTime.timeName(),
            mesh,
            IOobject::NO_READ,
            IOobject::NO_WRITE
        ),
        fvc::interpolate(rho)*phi
    );

//-------------modified_start--------------//
    // Need to store rhoCp for ddt(rhoCp, T)
    volScalarField rhoCp
    (
        IOobject
        (
            "rhoCp",
            runTime.timeName(),
            mesh,
            IOobject::READ_IF_PRESENT
        ),
        alpha1*rho1*cp1 + alpha2*rho2*cp2,
        alpha1.boundaryField().types()
    );
    rhoCp.oldTime();

    // heat flux
    surfaceScalarField rhoCpPhi
    (
        IOobject
        (
            "rhoCpPhi",
            runTime.timeName(),
            mesh,
            IOobject::NO_READ,
            IOobject::NO_WRITE
        ),
        fvc::interpolate(rhoCp)*phi
    );
//-------------modified_end--------------//

6)
In alphaEqn.H add:
Code:

      // Calculate the end-of-time-step mass flux
        rhoPhi = phiAlpha*(rho1 - rho2) + phi*rho2;

//-------------modified_start--------------//
        // Calculate the end-of-time-step heat flux
        rhoCpPhi = phiAlpha*(rho1*cp1 - rho2*cp2) + phi*rho2*cp2;
//-------------modified_end--------------//

and in alphaEqnSubCycle.H add:
Code:

rho == alpha1*rho1 + alpha2*rho2;
//-------------modified_start--------------//
rhoCp == alpha1*rho1*cp1 + alpha2*rho2*cp2;
//-------------modified_end--------------//

7)
Create a file named Teqn.H in the interTempFoam folder containing the Energy Equation:
Code:

surfaceScalarField kappaf = incompressibleTwoPhaseMixture.kappaf();

fvScalarMatrix TEqn
(
        fvm::ddt(rhoCp,T)
        + fvm::div(rhoCpPhi,T)
        - fvm::laplacian(kappaf,T)
);

TEqn.solve();

8)
Add the command for solving the E-Eqn in interTempFoam.C. The specific location of the added line may be object of discussion. Here is my suggestion:
Code:

        // --- Pressure-velocity PIMPLE corrector loop
        while (pimple.loop())
        {
            #include "alphaControls.H"
            #include "alphaEqnSubCycle.H"

            mixture.correct();

            #include "UEqn.H"

            // --- Pressure corrector loop
            while (pimple.correct())
            {
                #include "pEqn.H"
            }

            if (pimple.turbCorr())
            {
                turbulence->correct();
            }
        }

//--------------modified_start----------------//
                #include "TEqn.H"
//--------------modified_end------------------//

9)
Adapt the file Make/options to the names and locations of the beforehand modified libraries. The following code is probably not correct and thus object of my questions.
Code:

EXE_INC = \
    -I$(LIB_SRC)/transportModels/twoPhaseMixture/lnInclude \
    -I$(LIB_SRC)/transportModels \
    -I$(WM_PROJECT_USER_DIR)/src/transportModels/incompressible/lnInclude \
    -I$(LIB_SRC)/transportModels/interfaceProperties/lnInclude \
    -I$(LIB_SRC)/turbulenceModels/incompressible/turbulenceModel \
    -I$(WM_PROJECT_USER_DIR)/src/transportModels/myImmiscibleIncompressibleTwoPhaseMixture/lnInclude \
    -I$(LIB_SRC)/finiteVolume/lnInclude \
    -I$(LIB_SRC)/fvOptions/lnInclude \
    -I$(LIB_SRC)/meshTools/lnInclude \
    -I$(LIB_SRC)/sampling/lnInclude

EXE_LIBS = \
    -L$(FOAM_USER_LIBBIN) \
    -lmyImmiscibleIncompressibleTwoPhaseMixture \
    -L$(FOAM_LIBBIN) \

    -lincompressibleTurbulenceModel \
    -lincompressibleRASModels \
    -lincompressibleLESModels \
    -lfiniteVolume \
    -lfvOptions \
    -lmeshTools \
    -lsampling

9)
Compile the solver from within its directory interTempFoam.

wclean
wmake

<------------------------------------------------------------------------------------------------------------------------->
When I do everything as described I get the following output log:
Code:

~/OpenFOAM/puhlig-2.4.0/applications/solvers/multiphase/interTempFoam$ wmake
Making dependency list for source file interTempFoam.C
SOURCE=interTempFoam.C ;  g++ -m64 -Dlinux64 -DWM_DP -Wall -Wextra -Wno-unused-parameter -Wold-style-cast -Wnon-virtual-dtor -O3  -DNoRepository -ftemplate-depth-100 -I/opt/openfoam240/src/transportModels/twoPhaseMixture/lnInclude -I/opt/openfoam240/src/transportModels -I/home/puhlig/OpenFOAM/puhlig-2.4.0/src/transportModels/incompressible/lnInclude -I/opt/openfoam240/src/transportModels/interfaceProperties/lnInclude -I/opt/openfoam240/src/turbulenceModels/incompressible/turbulenceModel -I/home/puhlig/OpenFOAM/puhlig-2.4.0/src/transportModels/myImmiscibleIncompressibleTwoPhaseMixture/lnInclude -I/opt/openfoam240/src/finiteVolume/lnInclude -I/opt/openfoam240/src/fvOptions/lnInclude -I/opt/openfoam240/src/meshTools/lnInclude -I/opt/openfoam240/src/sampling/lnInclude -IlnInclude -I. -I/opt/openfoam240/src/OpenFOAM/lnInclude -I/opt/openfoam240/src/OSspecific/POSIX/lnInclude  -fPIC -c $SOURCE -o Make/linux64GccDPOpt/interTempFoam.o
In file included from interTempFoam.C:108:0:
TEqn.H: In function ‘int main(int, char**)’:
TEqn.H:1:58: error: expected primary-expression before ‘.’ token
 surfaceScalarField kappaf = incompressibleTwoPhaseMixture.kappaf();
                                                          ^
In file included from interTempFoam.C:64:0:
/opt/openfoam240/src/finiteVolume/lnInclude/readTimeControls.H:38:8: warning: unused variable ‘maxDeltaT’ [-Wunused-variable]
 scalar maxDeltaT =
        ^
make: *** [Make/linux64GccDPOpt/interTempFoam.o] Error 1

Let us prioritize the error over the warning.
Do you have any idea how it comes to that error and how to solve it?

I would very much appreciate comments from your side.

Best Regards
Perry

hdietterich November 16, 2015 19:57

interTempFoam in OF 2.3.1
 
Hi,
I'm working on the exact same problem. I've used the wolfdynamics page to make nearly same modifications as you to incorporate temperature into OpenFOAM (2.3.1), and I am getting a similar error in the end. The only differences in my procedure are:

Using "mixture" in your step 7: This is used to refer to the other quantities defined in myIncompressibleTwoPhaseMixture, so that's why I've used it. Anything else gives me the error you got.
Code:

surfaceScalarField kappaf = mixture.kappaf();

fvScalarMatrix TEqn
(
        fvm::ddt(rhoCp, T)
        + fvm::div(rhoCpPhi, T)
        - fvm::laplacian(kappaf, T)
);

TEqn.solve();

Then in your step 8: I've added the include call immediately after the Ueqn.H one.
Code:

// --- Pressure-velocity PIMPLE corrector loop
        while (pimple.loop())
        {
            #include "alphaControls.H"
            #include "alphaEqnSubCycle.H"

            mixture.correct();

            #include "UEqn.H"

            #include "TEqn.H"

            // --- Pressure corrector loop
            while (pimple.correct())
            {
                #include "pEqn.H"
            }

            if (pimple.turbCorr())
            {
                turbulence->correct();
            }
        }

Then in your step 9: I've essentially tried to add any libraries that might help.
Code:

EXE_INC = \
    -I$(LIB_SRC)/transportModels/twoPhaseMixture/lnInclude \
    -I$(LIB_SRC)/transportModels \
    -I$(WM_PROJECT_USER_DIR)/src/transportModels/incompressible/lnInclude \
    -I$(LIB_SRC)/transportModels/interfaceProperties/lnInclude \
    -I$(LIB_SRC)/turbulenceModels/incompressible/turbulenceModel \
    -I$(WM_PROJECT_USER_DIR)/src/transportModels/myImmiscibleIncompressibleTwoPhaseMixture/lnInclude \
    -I$(LIB_SRC)/finiteVolume/lnInclude \
    -I$(LIB_SRC)/fvOptions/lnInclude \
    -I$(LIB_SRC)/meshTools/lnInclude \
    -I$(LIB_SRC)/sampling/lnInclude

EXE_LIBS = \
    -ltwoPhaseMixture \
    -linterfaceProperties \
    -ltwoPhaseProperties \
    -L$(FOAM_USER_LIBBIN) \
    -lmyIncompressibleTransportModels \
    -lmyImmiscibleIncompressibleTwoPhaseMixture \
    -lincompressibleTurbulenceModel \
    -lincompressibleRASModels \
    -lincompressibleLESModels \
    -lfiniteVolume \
    -lfvOptions \
    -lmeshTools \
    -lsampling

This then gives me the following error while compiling:
Code:

In function `main':
interThermalFoam.C:(.text.startup+0x409d): undefined reference to `Foam::incompressibleTwoPhaseMixture::kappaf() const'
collect2: error: ld returned 1 exit status

This is actually an error that has turned up a few times when I search the forums, but the solutions that have worked for people (compiling the libraries before the solver, referencing the modified libraries rather than those in interFoam) are not apparently the problem in this case.

Does anyone have any suggestions?

akidess November 17, 2015 02:00

Fantastic post Perry, you are a role model for this forum. Anyway, you did some strange things:
1. Your new library has the same name as the old one
2. You include both the new and old library in the Make files, although the old one is completely redundant.

Pay November 17, 2015 10:04

Hi Hannah,

thank you for your reply. I implemented the first line of your TEqn.H file:
Code:

surfaceScalarField kappaf = mixture.kappaf();
For the time being I left the rest as it is, because it succesfully compiled (when one ignores the warning about maxDeltaT).

I just adjusted the given damBreak tutorial case (with its very coarse mesh). It completed the calculation, but with temperature values beneath zero. In consequence I will try a refined mesh and I will probably have to look into fvSchemses and fvSolution in more detail.

Greetings
Perry

Pay November 17, 2015 10:16

Hello Anton,

thanks for your feedback and the compliment.
Quote:

1. Your new library has the same name as the old one
I am guessing with "the old one [library]" you are referring to the directory "incompressible", the path of which is specified in:
Code:

EXE_INC = \
    -I$(LIB_SRC)/transportModels/twoPhaseMixture/lnInclude \
    -I$(LIB_SRC)/transportModels \
    -I$(WM_PROJECT_USER_DIR)/src/transportModels/incompressible/lnInclude \
    - ...

If YES: "incompressible" is not the name of any library, but rather the folder in which the library "incompressibleTwoPhaseMixture" or in my case "myIncompressibleTwoPhaseMixture" is situated in.
If NO: What do you mean?

Quote:

2. You include both the new and old library in the Make files, although the old one is completely redundant.
I think I just gave the answer to that question, too.
Or didn't I?

Greetings
Perry

hdietterich November 17, 2015 11:50

Hi Perry,

I'm glad that little change worked. I've modified mine to exactly match yours (with the mixture.kappaf) and it now compiles, too! Thanks for your very detailed description of all of your interFoam modifications. Now to see if it actually works...

Hannah

mkraposhin November 17, 2015 12:28

Quote:

Originally Posted by Pay (Post 573714)
Hi Hannah,

I just adjusted the given damBreak tutorial case (with its very coarse mesh). It completed the calculation, but with temperature values beneath zero. In consequence I will try a refined mesh and I will probably have to look into fvSchemses and fvSolution in more detail.

Greetings
Perry

It will be very difficult to you to obtain solution with conserved energy. Because when you are using interFoam, all properties are advected with volumetric flux. So, you must rewrite equation for temperature for each phase, and then, by summing for all phases, you can get equation for temperature of mixture:
Code:

fvm::ddt(T)
+
fvm::div(phi,T)
+
fvm::SuSp(-fvc::div(phi),T)
-
fvm::laplacian(alpha1*kappa1 / (rho1*Cp1), T)
-
fvm::laplacian((1 - alpha1)*kappa2 / (rho2*Cp2), T)


hdietterich November 17, 2015 14:20

Unfortunately, I get a segmentation fault when I run my newly compiled interFoam with temperature for a modified damBreak case with temperature. How do I interpret the error message to identify what might be wrong?

Code:

// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
Create time

Create mesh for time = 0


PIMPLE: Operating solver in PISO mode

Reading field p_rgh

Reading field U

Reading field T

Reading/calculating face flux field phi

Reading transportProperties

Selecting incompressible transport model Newtonian
Selecting incompressible transport model Newtonian
#0  Foam::error::printStack(Foam::Ostream&) at ??:?
#1  Foam::sigSegv::sigHandler(int) at ??:?
#2 
 at sigaction.c:?
#3  at objectRegistry.C:?
#4  Foam::objectRegistry::checkIn(Foam::regIOobject&) const at ??:?
#5  Foam::regIOobject::checkIn() at ??:?
#6  Foam::regIOobject::regIOobject(Foam::IOobject const&, bool) at ??:?
#7  Foam::GeometricField<double, Foam::fvPatchField, Foam::volMesh>::GeometricField(Foam::IOobject const&, Foam::fvMesh const&, Foam::dimensioned<double> const&, Foam::word const&) at ??:?
#8  Foam::interfaceProperties::interfaceProperties(Foam::GeometricField<double, Foam::fvPatchField, Foam::volMesh> const&, Foam::GeometricField<Foam::Vector<double>, Foam::fvPatchField, Foam::volMesh> const&, Foam::IOdictionary const&) at ??:?
#9  Foam::immiscibleIncompressibleTwoPhaseMixture::immiscibleIncompressibleTwoPhaseMixture(Foam::GeometricField<Foam::Vector<double>, Foam::fvPatchField, Foam::volMesh> const&, Foam::GeometricField<double, Foam::fvsPatchField, Foam::surfaceMesh> const&) at ??:?
#10 
 at ??:?
#11  __libc_start_main at ??:?
#12 
 at ??:?
Segmentation fault

To modify damBreak I have added a T file to the 0 folder, cp and Pr to both phases in the transportProperties,

Code:

    div(rhoCpPhi,T)    Gauss linearUpwind grad(T);
    div(rhoCpPhi)      Gauss linearUpwind;

to fvSchemes,

Code:

    T
    {
        solver          BICCG;
        preconditioner  DILU;
        tolerance      1e-07;
        relTol          0;
    }

to fvSolution, and initial conditions to setFields.

I'd appreciate help identifying where the error might be so that I might know what to do to fix it.

mkraposhin, that's an interesting thought. Once this actually runs, then I'll be interested in getting the best solution possible.

Hannah

mkraposhin November 17, 2015 15:29

Quote:

#8 Foam::interfaceProperties::interfaceProperties(Foa m::GeometricField<double, Foam::fvPatchField, Foam::volMesh> const&, Foam::GeometricField<Foam::Vector<double>, Foam::fvPatchField, Foam::volMesh> const&, Foam::IOdictionary const&) at ??:?
#9 Foam::immiscibleIncompressibleTwoPhaseMixture::imm iscibleIncompressibleTwoPhaseMixture(Foam::Geometr icField<Foam::Vector<double>, Foam::fvPatchField, Foam::volMesh> const&, Foam::GeometricField<double, Foam::fvsPatchField, Foam::surfaceMesh> const&) at ??:?
#10
from this lines it is seen that you are still using old model
immiscibleIncompressibleTwoPhaseMixture

can you post your createFields.H file?

mkraposhin November 17, 2015 15:31

Also, i think that it would be better to nest child class from mixture model, rather then creating new. Because at next lines OF creates turbulence model, that uses mixture model

hdietterich November 17, 2015 16:09

Quote:

Originally Posted by mkraposhin (Post 573741)
from this lines it is seen that you are still using old model
immiscibleIncompressibleTwoPhaseMixture

can you post your createFields.H file?

Here is the createFields.H.

Code:

    Info<< "Reading field p_rgh\n" << endl;
    volScalarField p_rgh
    (
        IOobject
        (
            "p_rgh",
            runTime.timeName(),
            mesh,
            IOobject::MUST_READ,
            IOobject::AUTO_WRITE
        ),
        mesh
    );

    Info<< "Reading field U\n" << endl;
    volVectorField U
    (
        IOobject
        (
            "U",
            runTime.timeName(),
            mesh,
            IOobject::MUST_READ,
            IOobject::AUTO_WRITE
        ),
        mesh
    );

    // ADDED
    Info<< "Reading field T\n" << endl;
    volScalarField T
    (
        IOobject
        (
            "T",
            runTime.timeName(),
            mesh,
            IOobject::MUST_READ,
            IOobject::AUTO_WRITE
        ),
        mesh
    );
    // end ADDED

    #include "createPhi.H"


    Info<< "Reading transportProperties\n" << endl;
    immiscibleIncompressibleTwoPhaseMixture mixture(U, phi);
 
    volScalarField& alpha1(mixture.alpha1());
    volScalarField& alpha2(mixture.alpha2());

    const dimensionedScalar& rho1 = mixture.rho1();
    const dimensionedScalar& rho2 = mixture.rho2();
   
    // ADDED
    const dimensionedScalar& cp1 = mixture.cp1();
    const dimensionedScalar& cp2 = mixture.cp2();
    //const dimensionedScalar& Pr1 = mixture.Pr1();
    //const dimensionedScalar& Pr2 = mixture.Pr2();
    // end ADDED

    // Need to store rho for ddt(rho, U)
    volScalarField rho
    (
        IOobject
        (
            "rho",
            runTime.timeName(),
            mesh,
            IOobject::READ_IF_PRESENT
        ),
        alpha1*rho1 + alpha2*rho2,
        alpha1.boundaryField().types()
    );
    rho.oldTime();

    // ADDED
    // Need to store rhoCp
    volScalarField rhoCp
    (
        IOobject
        (
            "rhoCp",
            runTime.timeName(),
            mesh,
            IOobject::READ_IF_PRESENT
        ),
        alpha1*rho1*cp1 + alpha2*rho2*cp2,
        alpha1.boundaryField().types()
    );
    rhoCp.oldTime();
    // end ADDED

    // Mass flux
    surfaceScalarField rhoPhi
    (
        IOobject
        (
            "rhoPhi",
            runTime.timeName(),
            mesh,
            IOobject::NO_READ,
            IOobject::NO_WRITE
        ),
        fvc::interpolate(rho)*phi
    );

    // ADDED
    surfaceScalarField rhoCpPhi
    (
        IOobject
        (
            "rhoCpPhi",
            runTime.timeName(),
            mesh,
            IOobject::NO_READ,
            IOobject::NO_WRITE
        ),
        fvc::interpolate(rhoCp)*phi
    );
    // end ADDED

    // Construct incompressible turbulence model
    autoPtr<incompressible::turbulenceModel> turbulence
    (
        incompressible::turbulenceModel::New(U, phi, mixture)
    );

    #include "readGravitationalAcceleration.H"

    /*
    dimensionedVector g0(g);

    // Read the data file and initialise the interpolation table
    interpolationTable<vector> timeSeriesAcceleration
    (
        runTime.path()/runTime.caseConstant()/"acceleration.dat"
    );
    */

    Info<< "Calculating field g.h\n" << endl;
    volScalarField gh("gh", g & mesh.C());
    surfaceScalarField ghf("ghf", g & mesh.Cf());

    volScalarField p
    (
        IOobject
        (
            "p",
            runTime.timeName(),
            mesh,
            IOobject::NO_READ,
            IOobject::AUTO_WRITE
        ),
        p_rgh + rho*gh
    );

    label pRefCell = 0;
    scalar pRefValue = 0.0;
    setRefCell
    (
        p,
        p_rgh,
        mesh.solutionDict().subDict("PIMPLE"),
        pRefCell,
        pRefValue
    );

    if (p_rgh.needReference())
    {
        p += dimensionedScalar
        (
            "p",
            p.dimensions(),
            pRefValue - getRefCellValue(p, pRefCell)
        );
        p_rgh = p - rho*gh;
    }


    fv::IOoptionList fvOptions(mesh);

    // Creating field for thermophysical properties


    // MULES Correction
    tmp<surfaceScalarField> tphiAlphaCorr0;

As in Perry's steps and http://www.wolfdynamics.com/images/c...erTempFoam.pdf, I changed the names of the libraries, but not the names of the definitions within them. For instance, myIncompressibleTwoPhaseMixture.C begins like:

Code:

#include "myIncompressibleTwoPhaseMixture.H"
#include "addToRunTimeSelectionTable.H"
#include "surfaceFields.H"
#include "fvc.H"

// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //

namespace Foam
{
    defineTypeNameAndDebug(incompressibleTwoPhaseMixture, 0);
}

Therefore, when I'm calling "immiscibleIncompressibleTwoPhaseMixture mixture(U, phi);" that's been defined within the myImmiscibleIncompressibleTwoPhaseMixture library and so should reference the new versions. All the other libraries are left unchanged, so the turbulence model used is the old one stored in $FOAM_SRC. That said, is there a place in the Make/options modifications described in Perry's first post that would link both old and new libraries and create confusion? That could be a source of the problem...

akidess November 18, 2015 00:22

Sorry for the confusion, I just realized I didn't read it properly and indeed you don't have the original immiscibleIncompressibleTwoPhaseMixture in Make/*.

Quote:

Originally Posted by Pay (Post 573718)
Hello Anton,

thanks for your feedback and the compliment.

I am guessing with "the old one [library]" you are referring to the directory "incompressible", the path of which is specified in:
Code:

EXE_INC = \
    -I$(LIB_SRC)/transportModels/twoPhaseMixture/lnInclude \
    -I$(LIB_SRC)/transportModels \
    -I$(WM_PROJECT_USER_DIR)/src/transportModels/incompressible/lnInclude \
    - ...

If YES: "incompressible" is not the name of any library, but rather the folder in which the library "incompressibleTwoPhaseMixture" or in my case "myIncompressibleTwoPhaseMixture" is situated in.
If NO: What do you mean?



I think I just gave the answer to that question, too.
Or didn't I?

Greetings
Perry


mkraposhin November 18, 2015 01:22

Quote:

Info<< "Reading transportProperties\n" << endl;
immiscibleIncompressibleTwoPhaseMixture mixture(U, phi)
As i expected, you left initialization for old data type of mixture.
So, you need to change immiscibleIncompressibleTwoPhaseMixture to myImmiscibleIncompressibleTwoPhaseMixture

But when you do that, i think, that solver will fail to compile, because turbulence model class depends on mixture class.

Later i can try to explain how to derive your own class from class immiscibleIncompressibleTwoPhaseMixture

mkraposhin November 18, 2015 01:44

O.k., i'm sorry,

i didn't read untill the end of your post, but nevertheless, turbulence model needs original data type, but not modified, that's why it fails to run

and of course, you must avoid using same data type names for different classes

mkraposhin November 18, 2015 05:46

2 Attachment(s)
Hi, i spend ~ 20 minutes and made child class myImmiscibleIncompressibleTwoPhaseMixture, which can do all work without substituting user type instead of original OF

Step 1. Create your new class myImmiscibleIncompressibleTwoPhaseMixture as a sub class of immiscibleIncompressibleTwoPhaseMixture, see attachment files .H and .C.
Please note that for compatibility with OF you need to change all names, for example:
Code:

#ifndef myImmiscibleIncompressibleTwoPhaseMixture_H
#define myImmiscibleIncompressibleTwoPhaseMixture_H

Otherwise, you may get in conflict with OF

Step 2. Adjust files Make/files and Make/options to include all neccesary files from OF
Make/files
Code:

myImmiscibleIncompressibleTwoPhaseMixture.C
LIB = $(FOAM_USER_LIBBIN)/libmyImmiscibleIncompressibleTwoPhaseMixture

Make/options
Code:

EXE_INC = \
    -I$(LIB_SRC)/meshTools/lnInclude \
    -I$(LIB_SRC)/OpenFOAM/lnInclude \
    -I$(LIB_SRC)/finiteVolume/lnInclude \
    -I$(LIB_SRC)/transportModels \
    -I$(LIB_SRC)/transportModels/immiscibleIncompressibleTwoPhaseMixture/lnInclude \
    -I$(LIB_SRC)/transportModels/incompressible/lnInclude \
    -I$(LIB_SRC)/transportModels/interfaceProperties/lnInclude \
    -I$(LIB_SRC)/transportModels/twoPhaseMixture/lnInclude \
    -I$(LIB_SRC)/finiteVolume/lnInclude

LIB_LIBS = \
    -ltwoPhaseMixture \
    -lincompressibleTransportModels \
    -linterfaceProperties \
    -ltwoPhaseProperties \
    -limmiscibleIncompressibleTwoPhaseMixture \
    -lfiniteVolume

Step 3. Compile with wmake libso

Step 4. Initialize new model in new solver:
- add -I../myImmiscibleIncompressibleTwoPhaseMixture \ line to Make/options EXE_INC section of your solver
- add consequent lines to -L section of Make/options file of your solver
- add #include "myImmiscibleIncompressibleTwoPhaseMixture.H" to solver instead of OF original solver
- add initialization of your myImmiscibleIncompressibleTwoPhaseMixture class instead of OF original class in createFields.H
- use method mixture.lambdaEff() to get mixture heat conduction coefficient
- solve equation for temperature, formulated in volumetric fluxes:
Code:

solve
(
    fvm::ddt(T)
    +
    fvm::div(phi,T)
    +
    fvm::SuSp(-fvc::div(phi),T)
    -
    fvm::laplacian(lambdam, T)
)


hdietterich November 18, 2015 12:07

Thanks so much for your efforts. I'll go through and change all the internal names as well. Since all the new properties are defined in myIncompressibleTwoPhaseMixture (the immiscible one just calls them), that will need to be adjusted, too.

Edit: I see you've suggested moving all of the definitions into myImmiscibleIncompressibleTwoPhaseMixture. I'll incorporate that.

This doesn't help explain, though, why this isn't needed for Perry and everyone else using these (http://www.wolfdynamics.com/images/c...erTempFoam.pdf, http://www.cfd-online.com/Forums/ope...interfoam.html, etc) instructions.

Hannah

hdietterich November 18, 2015 17:15

3 Attachment(s)
Well those changes just produced a lot of compiling errors, but continuing to mess around with my original Make/options and #include's produced a version that compiled and ran a test case successfully. I'll look into making mkraposhin's suggested modifications to TEqn.

In the meantime, I'm attaching all of the files in case they might help someone else (using OF 2.3.1).

Hannah

mkraposhin November 19, 2015 04:27

I will try to compile your code and report what is wrong later.
Regarding previous version of library and solver - i made it for OF 2.4.0, not for 2.3.1

Pay November 19, 2015 05:28

Hello Matvey,

first of all, thanks for taking part in the thread.

Quote:

So, you must rewrite equation for temperature for each phase, and then, by summing for all phases, you can get equation for temperature of mixture:
Does it make such a difference? Because the coefficients in my proposed TEqn are being calculated for the mixture beforehand:
in alphaEqn.H:
Code:

        // Calculate the end-of-time-step mass flux
        rhoPhi = phiAlpha*(rho1 - rho2) + phi*rho2;
    }

//-------------modified_start--------------//
        // Calculate the end-of-time-step heat flux
        rhoCpPhi = phiAlpha*(rho1*cp1 - rho2*cp2) + phi*rho2*cp2;
//-------------modified_end--------------//

and in alphaEqnSubCycle.H:
Code:

rho == alpha1*rho1 + alpha2*rho2;
//-------------modified_start--------------//
rhoCp == alpha1*rho1*cp1 + alpha2*rho2*cp2;
//-------------modified_end--------------//

To your proposed TEqn:
I see that you divided the equation by (rho*cp)
viewing the terms separately:
Quote:

fvm::ddt(T)
That is straigt forward

Quote:

-
fvm::laplacian(alpha1*kappa1 / (rho1*Cp1), T)
-
fvm::laplacian((1 - alpha1)*kappa2 / (rho2*Cp2), T)
Here I can see, that you split the single laplacian term in two laplacian terms with each of them having the fitting alpha and parameters in it.

Quote:

fvm::div(phi,T)
+
fvm::SuSp(-fvc::div(phi),T)
Here I see the basic term for the convective temperature transport plus a new term.
What does this new term do? I do not know the operation in there (SuSp(-fvc ...).

Best Regards
Perry

mkraposhin November 19, 2015 12:35

1 Attachment(s)
@ Hannah:

Hi, i looked at your code and i understand that you mixed from all versions :)

So, i used my approach to create a new class for mixture and mass flux approach for energy equation. It works for OF 2.3.1. You can find source code in the attachment.

To make solver, go into folder interThermalFoam/myImmiscibleIncompressibleTwoPhaseMixture and run
wmake libso

then go one folder up and run
wmake

mkraposhin November 19, 2015 12:37

@ Hannah and Perry:
I need some time to write equations to show you what seems wrong to me when we use energy equation, formulated with mass fluxes

mkraposhin November 20, 2015 12:23

1 Attachment(s)
First of all, i would like to post derivation of mixture equation for temperature.

As you can see, it is possible to derive equations without using mass fluxes and heat capacities in fluxes expressions.

Why i don't like mass fluxes?

Because interFoam's pressure equation solves for volumetric fluxes. Until your densities are constant (doesn't depends on temperature), you can easilly construct mass flux which satisfies mass continuity.

But for other cases you will get in "trouble"

atulkjoy December 21, 2015 13:34

fireFoam
 
Hi,
I want to model small pool fire 2d case with methanol. for steady state flame propagation I want to implement interface boundary condition with on FireFoam.
1. conduction by flame = latent heat* velocity
2.stefan boundary condition with velovity == diffusion*mass fraction grad/1-mass fraction.
3.Clausius-Clapeyron equation.
Can any body help how should I proceed ?????????????????????

Pay December 22, 2015 07:18

Hello Atul,
this thread's topic has nearly nothing in common with your post.
Please only make posts where it fits to the topic and/or start a new thread.
Also have a look whether you find tutorials on the wiki or somewhere else.

Pay January 4, 2016 11:21

3 Attachment(s)
@ Hannah

I had another look on my own and also your case setup of the 2D damTempBreak case.
Apart from that we use our own solvers, which should be also the same except the OpenFOAM version, I adjusted the last details to your setup.

And still when I view the results in paraview e.g. after 0.5 sec AND RESCALE the caption I can see temperatures below minimum temperature and above maximum temperature of the starting condition (which is physically impossible).
Hannah, could you please review your damTempBreak case and tell if you make the same observation?

I am attaching pictures of temperatur field for 0 and 0.5 sceonds and my case file.

Attachment 44310

Attachment 44311

Attachment 44312

hdietterich February 10, 2016 14:41

2 Attachment(s)
I just checked, and I do see that effect, although not nearly as extreme as that. With initial fluid temperatures of 270 and 300 K, I end up with fluids with maximum and minimum temperatures of ~267 and 301 K (see attached plot). I didn't notice this before, since ParaView didn't change the scale by default.

However, for my actual viscous fluid extrusion simulations the effect seems to be negligible (min 293.15 K ambient air, max 315.15 K input fluid). There's a brief excursion about halfway through the simulation, but the model recovers and the minimum and maximum temperatures are otherwise very steady and accurate (see attached plot).

Perhaps the wandering temperatures are due to small numerical errors that add up from poor mesh or temporal resolution in the damBreakTemp case? For my purposes it's definitely given very good results.

Pay February 11, 2016 03:31

Well I cannot explain why the whole aproach seems to have worked in previous versions of OF an still works ok in 2.3 while it doesn't in 2.4.0.

Quote:

Perhaps the wandering temperatures are due to small numerical errors that add up from poor mesh or temporal resolution in the damBreakTemp case?
Concerning bad mesh ... I used blockMesh generating a nearly equidistant 2D quad mesh, I cannot imagine how this should be a bad mesh.

block March 8, 2016 15:31

Quote:

Originally Posted by Pay (Post 573191)
Dear Foamers,

first of all, this is my first thread, me being new to OF and the forum as well. So I am thankful for any advice regarding anything related to CFD in general and OF and this forum in particular.

Adding the Energy Equation to interFaom makes it necessary to modify the used library (A) and secondly modify the solver itself (B). I am having problems compiling said application, hence I have written this thread.
I am going to describe my steps in detail in this thread. The procedure is inspired by both the documents from Damiano Natali ("interTempFoam") and Qingming Liu ("myinterFoamDiabatic"). The links are given beneath.

http://www.wolfdynamics.com/images/c...erTempFoam.pdf

http://www.tfd.chalmers.se/~hani/kur...gLIU-final.pdf

A) Modifcation of the library

1)
Copy the original folder transportModels to the user's directory

cd $WM_PROJECT_USER_DIR/src/
cp -rp $FOAM_SRC/transportModels .

2)
Rename the folders and files which are being modified (namely the libraries incompressibleTwoPhaseMixture and immiscibleIncompressibleTwoPhaseMixture).

cd transportModels/incompressible
mv incompressibleTwoPhaseMixture myIncompressibleTwoPhaseMixture
cd myIncompressibleTwoPhaseMixture
mv incompressibleTwoPhaseMixture.C myIncompressibleTwoPhaseMixture.C
mv incompressibleTwoPhaseMixture.H myIncompressibleTwoPhaseMixture.H

cd ../..
mv immiscibleIncompressibleTwoPhaseMixture myImmiscibleIncompressibleTwoPhaseMixture
cd myImmiscibleIncompressibleTwoPhaseMixture
mv immiscibleIncompressibleTwoPhaseMixture.C myImmiscibleIncompressibleTwoPhaseMixture.C
mv immiscibleIncompressibleTwoPhaseMixture.H myImmiscibleIncompressibleTwoPhaseMixture.H

3)
Change the respective file files corresponding to the the naming and path.
in the folder incompressible/Make for myIncompressibleTwoPhaseMixture:
Code:

myIncompressibleTwoPhaseMixture/myIncompressibleTwoPhaseMixture.C

LIB = $(FOAM_USER_LIBBIN)/libmyIncompressibleTransportModels

in the folder myImmiscibleIncompressibleTwoPhaseMixture/Make for myImmiscibleIncompressibleTwoPhaseMixture:
Code:

myImmiscibleIncompressibleTwoPhaseMixture.C

LIB = $(FOAM_USER_LIBBIN)/libmyImmiscibleIncompressibleTwoPhaseMixture

4) Make sure the newly named files are being included with their new name in the respective files:
in myIncompressibleTwoPhaseMixture.C:
Code:

#include "myIncompressibleTwoPhaseMixture.H"
in myImmiscibleIncompressibleTwoPhaseMixture.C
Code:

#include "myImmiscibleIncompressibleTwoPhaseMixture.H"
in myImmiscibleIncompressibleTwoPhaseMixture.H
Code:

#include "myIncompressibleTwoPhaseMixture.H"
5)
In the file myImmiscibleIncompressibleTwoPhaseMixture/Make/options make the adaption as highlighted, so the connection to the new library is made.
Code:

LIB_LIBS = \
    -ltwoPhaseMixture \
    -L$(FOAM_USER_LIBBIN) \
    -lmyIncompressibleTransportModels \

    -linterfaceProperties \
    -ltwoPhaseProperties \
    -lfiniteVolume

6)
Add the new parameters rho and Pr in myIncompressibleTwoPhaseMixture.H.
Code:

    dimensionedScalar rho1_;
    dimensionedScalar rho2_;

//-----------modified_start------------//
    dimensionedScalar cp1_;
    dimensionedScalar cp2_;
    dimensionedScalar Pr1_;
    dimensionedScalar Pr2_;
//-----------modified_end------------//

and
Code:

    const dimensionedScalar& rho2() const
    {
    return rho2_;
    };

//-----------modified_start------------//
        //- Return const-access to phase1 density
        const dimensionedScalar& cp1() const
        {
            return cp1_;
        }

        //- Return const-access to phase2 density
        const dimensionedScalar& cp2() const
        {
            return cp2_;
        };

        //- Return const-access to phase1 density
        const dimensionedScalar& Pr1() const
        {
            return Pr1_;
        }

        //- Return const-access to phase2 density
        const dimensionedScalar& Pr2() const
        {
            return Pr2_;
        };
//-----------modified_end------------//

also for kappaf
Code:

        tmp<surfaceScalarField> nuf() const;

//-----------modified_start------------//
    //- Return the face-interpolated conductivity
    tmp<surfaceScalarField> kappaf() const;
//-----------modified_end------------//

7)
In myIncompressibleTwoPhaseMixture.C add the operations for the new parameters.
Code:

  rho2_("rho", dimDensity, nuModel2_->viscosityProperties().lookup("rho")),
//-----------modified_start------------//
    cp1_("cp", dimensionSet(0, 2, -2, -1, 0, 0, 0), nuModel1_->viscosityProperties().lookup("cp")),
    cp2_("cp", dimensionSet(0, 2, -2, -1, 0, 0, 0), nuModel2_->viscosityProperties().lookup("cp")),
    Pr1_("Pr", dimensionSet(0, 0, 0, 0, 0, 0, 0), nuModel1_->viscosityProperties().lookup("Pr")),
    Pr2_("Pr", dimensionSet(0, 0, 0, 0, 0, 0, 0), nuModel2_->viscosityProperties().lookup("Pr")),
//-----------modified_end------------//

and
Code:


            nuModel2_->viscosityProperties().lookup("rho") >> rho2_;
//-----------modified_start--------------------//
    nuModel1_->viscosityProperties().lookup("cp") >> cp1_;
    nuModel2_->viscosityProperties().lookup("cp") >> cp2_;
    nuModel1_->viscosityProperties().lookup("Pr") >> Pr1_;
    nuModel2_->viscosityProperties().lookup("Pr") >> Pr2_;
//-----------modified_end----------------------//

Also add the lines for the calculation of kappaf().
Code:

Foam::tmp<Foam::surfaceScalarField>
Foam::incompressibleTwoPhaseMixture::nuf() const
{
    const surfaceScalarField alpha1f
    (
        min(max(fvc::interpolate(alpha1_), scalar(0)), scalar(1))
    );

    return tmp<surfaceScalarField>
    (
        new surfaceScalarField
        (
            "nuf",
            (
                alpha1f*rho1_*fvc::interpolate(nuModel1_->nu())
              + (scalar(1) - alpha1f)*rho2_*fvc::interpolate(nuModel2_->nu())
            )/(alpha1f*rho1_ + (scalar(1) - alpha1f)*rho2_)
        )
    );
}

//-----------modified_start------------//
Foam::tmp<Foam::surfaceScalarField>
Foam::incompressibleTwoPhaseMixture::kappaf() const
{
    const surfaceScalarField alpha1f
    (
        min(max(fvc::interpolate(alpha1_), scalar(0)), scalar(1))
    );

    return tmp<surfaceScalarField>
    (
        new surfaceScalarField
        (
            "kappaf",
            (
                alpha1f*rho1_*cp1_*(1/Pr1_)
                *fvc::interpolate(nuModel1_->nu())
                + (scalar(1) - alpha1f)*rho2_*cp2_
                *(1/Pr2_)*fvc::interpolate(nuModel2_->nu())
            )
        )
    );
}
//-----------modified_end------------//

8)
Compile both libraries from the respective folder. Start with myIncompressibleTwoPhaseMixture, because myImmiscibleIncompressibleTwoPhaseMixture depends on it already being compiled beforehand.

cd incompressible
wclean
wmake libso
cd ..
cd myImmiscibleIncompressibleTwoPhaseMixture
wclean
wmake libso


Compiling works at this stage, which is good for the moment but doesn't necessarily mean to me that I did everything right.



B) Modification of the solver interFoam to interTempFoam


1)
Enter the destination of the new solver and copy the base solver.

cd $WM_PROJECT_USER_DIR/applications/solvers/multiphase
cp -rp $FOAM_APP/solvers/multiphase/interFoam .

2)
Rename the folder and the .C file.

mv interFoam interTempFoam
cd interTempFoam
mv interFoam.C interTempFoam.C

3)
Adapt the file Make/files to the changed naming and path.
Code:

interTempFoam.C

EXE = $(FOAM_USER_APPBIN)/interTempFoam

4)
In interTempFoam.C adapt the name of the following library being included.
Code:

#include "myImmiscibleIncompressibleTwoPhaseMixture.H"
5)
Add the following lines in the file createFields.H.
Code:

Info<< "Reading field U\n" << endl;
    volVectorField U
    (
        IOobject
        (
            "U",
            runTime.timeName(),
            mesh,
            IOobject::MUST_READ,
            IOobject::AUTO_WRITE
        ),
        mesh
    );

//-------------modified_start--------------//
    Info<< "Reading field T\n" << endl;
    volScalarField T
    (
        IOobject
        (
            "T",
            runTime.timeName(),
            mesh,
            IOobject::MUST_READ,
            IOobject::AUTO_WRITE
        ),
        mesh
    );
//-------------modified_end--------------//

and
Code:

  const dimensionedScalar& rho2 = mixture.rho2();
//-------------modified_start--------------//
    const dimensionedScalar& cp1 = mixture.cp1();
    const dimensionedScalar& cp2 = mixture.cp2(); //not for Pr1 und Pr2 ???
//-------------modified_end--------------//

and
Code:

  // Mass flux
    surfaceScalarField rhoPhi
    (
        IOobject
        (
            "rhoPhi",
            runTime.timeName(),
            mesh,
            IOobject::NO_READ,
            IOobject::NO_WRITE
        ),
        fvc::interpolate(rho)*phi
    );

//-------------modified_start--------------//
    // Need to store rhoCp for ddt(rhoCp, T)
    volScalarField rhoCp
    (
        IOobject
        (
            "rhoCp",
            runTime.timeName(),
            mesh,
            IOobject::READ_IF_PRESENT
        ),
        alpha1*rho1*cp1 + alpha2*rho2*cp2,
        alpha1.boundaryField().types()
    );
    rhoCp.oldTime();

    // heat flux
    surfaceScalarField rhoCpPhi
    (
        IOobject
        (
            "rhoCpPhi",
            runTime.timeName(),
            mesh,
            IOobject::NO_READ,
            IOobject::NO_WRITE
        ),
        fvc::interpolate(rhoCp)*phi
    );
//-------------modified_end--------------//

6)
In alphaEqn.H add:
Code:

      // Calculate the end-of-time-step mass flux
        rhoPhi = phiAlpha*(rho1 - rho2) + phi*rho2;

//-------------modified_start--------------//
        // Calculate the end-of-time-step heat flux
    rhoCpPhi = phiAlpha*(rho1*cp1 - rho2*cp2) + phi*rho2*cp2;
//-------------modified_end--------------//

and in alphaEqnSubCycle.H add:
Code:

rho == alpha1*rho1 + alpha2*rho2;
//-------------modified_start--------------//
rhoCp == alpha1*rho1*cp1 + alpha2*rho2*cp2;
//-------------modified_end--------------//

7)
Create a file named Teqn.H in the interTempFoam folder containing the Energy Equation:
Code:

surfaceScalarField kappaf = incompressibleTwoPhaseMixture.kappaf();

fvScalarMatrix TEqn
(
    fvm::ddt(rhoCp,T)
    + fvm::div(rhoCpPhi,T)
    - fvm::laplacian(kappaf,T)
);

TEqn.solve();

8)
Add the command for solving the E-Eqn in interTempFoam.C. The specific location of the added line may be object of discussion. Here is my suggestion:
Code:

        // --- Pressure-velocity PIMPLE corrector loop
        while (pimple.loop())
        {
            #include "alphaControls.H"
            #include "alphaEqnSubCycle.H"

            mixture.correct();

            #include "UEqn.H"

            // --- Pressure corrector loop
            while (pimple.correct())
            {
                #include "pEqn.H"
            }

            if (pimple.turbCorr())
            {
                turbulence->correct();
            }
        }

//--------------modified_start----------------//
        #include "TEqn.H"
//--------------modified_end------------------//

9)
Adapt the file Make/options to the names and locations of the beforehand modified libraries. The following code is probably not correct and thus object of my questions.
Code:

EXE_INC = \
    -I$(LIB_SRC)/transportModels/twoPhaseMixture/lnInclude \
    -I$(LIB_SRC)/transportModels \
    -I$(WM_PROJECT_USER_DIR)/src/transportModels/incompressible/lnInclude \
    -I$(LIB_SRC)/transportModels/interfaceProperties/lnInclude \
    -I$(LIB_SRC)/turbulenceModels/incompressible/turbulenceModel \
    -I$(WM_PROJECT_USER_DIR)/src/transportModels/myImmiscibleIncompressibleTwoPhaseMixture/lnInclude \
    -I$(LIB_SRC)/finiteVolume/lnInclude \
    -I$(LIB_SRC)/fvOptions/lnInclude \
    -I$(LIB_SRC)/meshTools/lnInclude \
    -I$(LIB_SRC)/sampling/lnInclude

EXE_LIBS = \
    -L$(FOAM_USER_LIBBIN) \
    -lmyImmiscibleIncompressibleTwoPhaseMixture \
    -L$(FOAM_LIBBIN) \

    -lincompressibleTurbulenceModel \
    -lincompressibleRASModels \
    -lincompressibleLESModels \
    -lfiniteVolume \
    -lfvOptions \
    -lmeshTools \
    -lsampling

9)
Compile the solver from within its directory interTempFoam.

wclean
wmake

<------------------------------------------------------------------------------------------------------------------------->
When I do everything as described I get the following output log:
Code:

~/OpenFOAM/puhlig-2.4.0/applications/solvers/multiphase/interTempFoam$ wmake
Making dependency list for source file interTempFoam.C
SOURCE=interTempFoam.C ;  g++ -m64 -Dlinux64 -DWM_DP -Wall -Wextra -Wno-unused-parameter -Wold-style-cast -Wnon-virtual-dtor -O3  -DNoRepository -ftemplate-depth-100 -I/opt/openfoam240/src/transportModels/twoPhaseMixture/lnInclude -I/opt/openfoam240/src/transportModels -I/home/puhlig/OpenFOAM/puhlig-2.4.0/src/transportModels/incompressible/lnInclude -I/opt/openfoam240/src/transportModels/interfaceProperties/lnInclude -I/opt/openfoam240/src/turbulenceModels/incompressible/turbulenceModel -I/home/puhlig/OpenFOAM/puhlig-2.4.0/src/transportModels/myImmiscibleIncompressibleTwoPhaseMixture/lnInclude -I/opt/openfoam240/src/finiteVolume/lnInclude -I/opt/openfoam240/src/fvOptions/lnInclude -I/opt/openfoam240/src/meshTools/lnInclude -I/opt/openfoam240/src/sampling/lnInclude -IlnInclude -I. -I/opt/openfoam240/src/OpenFOAM/lnInclude -I/opt/openfoam240/src/OSspecific/POSIX/lnInclude  -fPIC -c $SOURCE -o Make/linux64GccDPOpt/interTempFoam.o
In file included from interTempFoam.C:108:0:
TEqn.H: In function ‘int main(int, char**)’:
TEqn.H:1:58: error: expected primary-expression before ‘.’ token
 surfaceScalarField kappaf = incompressibleTwoPhaseMixture.kappaf();
                                                          ^
In file included from interTempFoam.C:64:0:
/opt/openfoam240/src/finiteVolume/lnInclude/readTimeControls.H:38:8: warning: unused variable ‘maxDeltaT’ [-Wunused-variable]
 scalar maxDeltaT =
        ^
make: *** [Make/linux64GccDPOpt/interTempFoam.o] Error 1

Let us prioritize the error over the warning.
Do you have any idea how it comes to that error and how to solve it?

I would very much appreciate comments from your side.

Best Regards
Perry


Hi Perry,

I know this is a really old post however i wonder if you managed to solve this problem as i have tried so many ways but i keep getting your error.


Kind regards

Rimsha

Pay March 10, 2016 04:39

1 Attachment(s)
Hello Rimsha,

Disclaimer: I did all this in OF 2.4.0 and got unphysical results. Seems like Hannah did not in version 2.3.

Nevertheless, I did succesfully compile the solver and libraries. When I remember correctly the missing change was done in the TEqn.H file:
"surfaceScalarField kappaf = incompressibleTwoPhaseMixture.kappaf();"
was changed to
"surfaceScalarField kappaf = mixture.kappaf();"

I can't find my documentation with english commentary, but in spite of that the attached file should help you (there is also described how to setup a test case).

As closing remark: I went over to using compressibleInterFoam, which solves the energy equation.

block March 10, 2016 07:25

Quote:

Originally Posted by Pay (Post 588975)
Hello Rimsha,

Disclaimer: I did all this in OF 2.4.0 and got unphysical results. Seems like Hannah did not in version 2.3.

Nevertheless, I did succesfully compile the solver and libraries. When I remember correctly the missing change was done in the TEqn.H file:
"surfaceScalarField kappaf = incompressibleTwoPhaseMixture.kappaf();"
was changed to
"surfaceScalarField kappaf = mixture.kappaf();"

I can't find my documentation with english commentary, but in spite of that the attached file should help you (there is also described how to setup a test case).

As closing remark: I went over to using compressibleInterFoam, which solves the energy equation.

Hiya,

Thank you for your reply, I managed to complied the code yesterday, i am also getting strange results when the difference in cp is large in both fluids so i am looking into this right now.

Thank you very much for the document it is highly appreciated.

Kind Regards

Rimsha

Wangzhaoting April 17, 2016 10:10

Hi,Hannah and Perry
I'm working on the similar object. I've used the wolfdynamics page to make the same modifications as you to incorporate temperature into OpenFOAM (3.0).The damBreak case works well and the temperature field is physically.When I try to simulate the object which is a simulation of slug flow temperature field about 2.6-meters long pipeline with radius of 0.013 meter.Temperature of air and water are both 313 K.And the temperature of tube wall is 277 K.But some of final value of temperature is much higher than anticipated results(which is physically impossible).Some values are physical. The damBreak works well,but the pipeline can't. I really don't know what the problem is. Please help!:(

Julia

Pay April 19, 2016 05:45

Hello Julia,
initially I don't know what the problem is, too.
I would recommend you to start a new thread and supply more detailed information in there, like: turbulence model?, boundary, starting conditions, zip-file of your case folder, maybe a picture of physically impossible temperature field.
Greetings
Perry

Wangzhaoting April 21, 2016 09:47

Thank you for your reply,I will strat a new thread:)

thebear June 1, 2016 05:30

working solver
 
1 Attachment(s)
hey,
i just worked through the solver and made some little lib and class changes and it works fine with OF2.3.1.

block June 13, 2016 10:33

Quote:

Originally Posted by thebear (Post 602806)
hey,
i just worked through the solver and made some little lib and class changes and it works fine with OF2.3.1.

Thanks so much for the replay, i found the error and corrected it, however thank you so much for the help.

Kind Regards

Rimsha

smog June 17, 2016 12:36

Can you let us all know what the problem was and how you fixed it?

block June 19, 2016 10:55

1 Attachment(s)
Hi Smog,

sure thing,

there were a number of things that was wrong with my libraries,

1) Attachment 48420

All the Foam:: incompresibleTwoPhaseMixture: : incompressibleTwoPhaseMixture needed to be changed to the picture attached above so to the name of the new library name i have selected.

2) error of Kaapaf in the Temp equation was also a concern which was solved using the suggestion by Perry above.

Apart from that i cant remember what else however if i do remember i will post back.

Kind Regards

Rimsha

eee_099_OpenFOAM_4.1 June 15, 2017 07:28

Help please!!!
 
Hello Guys,
Can someone help me please, I need to model melting of a powder particle (solid to liquid, - MODELLING OF BLOWN-POWDER REPAIR PROCESS) and I have managed to modify, compile and use the new SOlver (Inter_Thermal_Foam) as done Perry, hannah and the attached PDFs (Thanks Perry), and it seems to work fine with the "damBreak" tutorial, but now need to adpot it to mine, but have no idea where to start. I was told that I would need to add the "SOURCE" term to the Energy euation TEqn.H, and a few other modifications to files.

I also came across this link, but have no idea what he (Fabian) did;
https://www.cfd-online.com/Forums/op...se-change.html

Any help would be greatly appreciated.

You can also contact me via email if that helps.

Many thanks in advance.

Ehi

eee_099_OpenFOAM_4.1 June 15, 2017 07:34

Help please!!!
 
Hello Guys,
Can someone help me please, I'm trying to model melting of a powder particle in space or unit volume (solid to liquid), and I have so far managed to modify, compile and use the new Solver (Inter_Thermal_Foam) as carried out and beautifully explained/detailed by Perry, Hannah and the attached PDFs (Thanks Perry!), and it seems to work fine with the "damBreak" tutorial, but now need to adopt it to mine, but have no idea where to start.
I was told that I would now need to add the "SOURCE" term t(from "STEFAN"'s condition) to the Energy equation TEqn.H, and a few other modifications to the appropriate files. HOW DO I DO THIS PLEASE?

I also came across this link, but have no idea what/how he (Fabian) did (it);
https://www.cfd-online.com/Forums/op...se-change.html

Any help would be greatly appreciated.

eee_099_OpenFOAM_4.1 June 23, 2017 07:01

adding "SOURCE TERM" to the modified interFoam solver and Shared Library
 
Hello guys,
I'm currently working on additive manufacturing (Blown Powder repair) for Aerospace Turbine components PhD, and successfully modified and ran a modified version of following the instructions.

But now I need to incorporate the "SOURCE TERM" as you've described on here; https://www.cfd-online.com/Forums/op...se-change.html, my question is, HOW DO I GO ABOUT MODIFYING THE FILES PLEASE, and do I need to modify files in the src/transportModels/incompressible, below doing the same for the "SOLVER" folder?

I JUST NEED TO MODEL A SOLID MELTING, and will hopefully take it from there.
solve
(
hEqn ==
- hs*fvc::ddt(rho, gamma) //Source term from Stefan condition
);
Thanks in advance, and keep up the great work you guys have been doing.

Kind regards,
Ekoh E E


All times are GMT -4. The time now is 03:11.