Mehdi3031 |
April 7, 2016 09:34 |
Extern"C"(using a Fortran library of thermodynamics inside sutherlandTransport model)
Dear OpenFoam users,
Hi!
Does anybody knows how can I use an external function from a static thermolibrary (.a) in "sutherlandTransportI.H" file which is located here:
$WM_PROJECT_USER_DIR/src/thermophysicalModels/specie/transport/sutherland/
or lets say
$WM_PROJECT_DIR/src/thermophysicalModels/specie/transport/sutherland/
To be more clear, I want to change the Transport model, and use a function of mine to calculate kappa as highlighted in blue in the following code (that is sutherlandTransportI.H):
Code:
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2011-2013 OpenFOAM Foundation
\\/ M anipulation |
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
OpenFOAM is free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
\*---------------------------------------------------------------------------*/
#include "specie.H"
extern"C" {
float myKappa_(float* ii, float* jj);
}
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
template<class Thermo>
inline void Foam::sutherlandTransport<Thermo>::calcCoeffs
(
const scalar mu1, const scalar T1,
const scalar mu2, const scalar T2
)
{
scalar rootT1 = sqrt(T1);
scalar mu1rootT2 = mu1*sqrt(T2);
scalar mu2rootT1 = mu2*rootT1;
Ts_ = (mu2rootT1 - mu1rootT2)/(mu1rootT2/T1 - mu2rootT1/T2);
As_ = mu1*(1.0 + Ts_/T1)/rootT1;
}
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
template<class Thermo>
inline Foam::sutherlandTransport<Thermo>::sutherlandTransport
(
const Thermo& t,
const scalar As,
const scalar Ts
)
:
Thermo(t),
As_(As),
Ts_(Ts)
{}
template<class Thermo>
inline Foam::sutherlandTransport<Thermo>::sutherlandTransport
(
const Thermo& t,
const scalar mu1, const scalar T1,
const scalar mu2, const scalar T2
)
:
Thermo(t)
{
calcCoeffs(mu1, T1, mu2, T2);
}
template<class Thermo>
inline Foam::sutherlandTransport<Thermo>::sutherlandTransport
(
const word& name,
const sutherlandTransport& st
)
:
Thermo(name, st),
As_(st.As_),
Ts_(st.Ts_)
{}
template<class Thermo>
inline Foam::autoPtr<Foam::sutherlandTransport<Thermo> >
Foam::sutherlandTransport<Thermo>::clone() const
{
return autoPtr<sutherlandTransport<Thermo> >
(
new sutherlandTransport<Thermo>(*this)
);
}
template<class Thermo>
inline Foam::autoPtr<Foam::sutherlandTransport<Thermo> >
Foam::sutherlandTransport<Thermo>::New
(
Istream& is
)
{
return autoPtr<sutherlandTransport<Thermo> >
(
new sutherlandTransport<Thermo>(is)
);
}
template<class Thermo>
inline Foam::autoPtr<Foam::sutherlandTransport<Thermo> >
Foam::sutherlandTransport<Thermo>::New
(
const dictionary& dict
)
{
return autoPtr<sutherlandTransport<Thermo> >
(
new sutherlandTransport<Thermo>(dict)
);
}
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
template<class Thermo>
inline Foam::scalar Foam::sutherlandTransport<Thermo>::mu
(
const scalar p,
const scalar T
) const
{
return As_*::sqrt(T)/(1.0 + Ts_/T);
}
template<class Thermo>
inline Foam::scalar Foam::sutherlandTransport<Thermo>::kappa
(
const scalar p, const scalar T
) const
{
//Here instead of the next two red lines, I want to call the function from another static thermodynamic library (myKappa)as written in green:
scalar Cv_ = this->Cv(p, T);
return mu(p, T)*Cv_*(1.32 + 1.77*this->R()/Cv_);
float result = myKappa_(T, P);
return result;
}
template<class Thermo>
inline Foam::scalar Foam::sutherlandTransport<Thermo>::alphah
(
const scalar p,
const scalar T
) const
{
return kappa(p, T)/this->Cpv(p, T);
}
// * * * * * * * * * * * * * * * Member Operators * * * * * * * * * * * * * //
template<class Thermo>
inline Foam::sutherlandTransport<Thermo>&
Foam::sutherlandTransport<Thermo>::operator=
(
const sutherlandTransport<Thermo>& st
)
{
Thermo::operator=(st);
As_ = st.As_;
Ts_ = st.Ts_;
return *this;
}
template<class Thermo>
inline void Foam::sutherlandTransport<Thermo>::operator+=
(
const sutherlandTransport<Thermo>& st
)
{
scalar molr1 = this->nMoles();
Thermo::operator+=(st);
molr1 /= this->nMoles();
scalar molr2 = st.nMoles()/this->nMoles();
As_ = molr1*As_ + molr2*st.As_;
Ts_ = molr1*Ts_ + molr2*st.Ts_;
}
template<class Thermo>
inline void Foam::sutherlandTransport<Thermo>::operator-=
(
const sutherlandTransport<Thermo>& st
)
{
scalar molr1 = this->nMoles();
Thermo::operator-=(st);
molr1 /= this->nMoles();
scalar molr2 = st.nMoles()/this->nMoles();
As_ = molr1*As_ - molr2*st.As_;
Ts_ = molr1*Ts_ - molr2*st.Ts_;
}
template<class Thermo>
inline void Foam::sutherlandTransport<Thermo>::operator*=
(
const scalar s
)
{
Thermo::operator*=(s);
}
// * * * * * * * * * * * * * * * Friend Operators * * * * * * * * * * * * * //
template<class Thermo>
inline Foam::sutherlandTransport<Thermo> Foam::operator+
(
const sutherlandTransport<Thermo>& st1,
const sutherlandTransport<Thermo>& st2
)
{
Thermo t
(
static_cast<const Thermo&>(st1) + static_cast<const Thermo&>(st2)
);
scalar molr1 = st1.nMoles()/t.nMoles();
scalar molr2 = st2.nMoles()/t.nMoles();
return sutherlandTransport<Thermo>
(
t,
molr1*st1.As_ + molr2*st2.As_,
molr1*st1.Ts_ + molr2*st2.Ts_
);
}
template<class Thermo>
inline Foam::sutherlandTransport<Thermo> Foam::operator-
(
const sutherlandTransport<Thermo>& st1,
const sutherlandTransport<Thermo>& st2
)
{
Thermo t
(
static_cast<const Thermo&>(st1) - static_cast<const Thermo&>(st2)
);
scalar molr1 = st1.nMoles()/t.nMoles();
scalar molr2 = st2.nMoles()/t.nMoles();
return sutherlandTransport<Thermo>
(
t,
molr1*st1.As_ - molr2*st2.As_,
molr1*st1.Ts_ - molr2*st2.Ts_
);
}
template<class Thermo>
inline Foam::sutherlandTransport<Thermo> Foam::operator*
(
const scalar s,
const sutherlandTransport<Thermo>& st
)
{
return sutherlandTransport<Thermo>
(
s*static_cast<const Thermo&>(st),
st.As_,
st.Ts_
);
}
template<class Thermo>
inline Foam::sutherlandTransport<Thermo> Foam::operator==
(
const sutherlandTransport<Thermo>& st1,
const sutherlandTransport<Thermo>& st2
)
{
return st2 - st1;
}
// ************************************************************************* //
I am already using this function in my solver using the extern "C" method, so the external library and functions are okay, I also tried to do the same in here, and Introduced the path to the .a library in the Make/option of the "spice" library as u can see bellow:
Code:
LIB_LIBS = -lOpenFOAM \
EXE_LIBS = \
-lgfortran\
$(HOME)/OpenFOAM/mehdi-3.0.1/platforms/linux64GccDPInt32Opt/lib/LibPropBM001/LibPropBM001.a
and then declared the extern "C" in the header as you can see in the first code highlighted in violet.
It compiles and makes the .so file of the thermophysicalModel, but when I run the case with the solver that uses this thermophysical Model, it gives and error that myKappa is not declared:
Code:
Create time
Create mesh for time = 0
PIMPLE: Operating solver in PISO mode
Reading g
Creating reaction model
Selecting combustion model laminar<psiChemistryCombustion>
Selecting chemistry type
{
chemistrySolver EulerImplicit;
chemistryThermo psi;
}
Selecting thermodynamics package
{
type hePsiThermo;
mixture reactingMixture;
transport mySutherland;
thermo janaf;
energy sensibleEnthalpy;
equationOfState perfectGas;
specie specie;
}
Selecting chemistryReader foamChemistryReader
TransientReactingFoam: symbol lookup error: /home/mehdi/OpenFOAM/mehdi-3.0.1/platforms/linux64GccDPInt32Opt/lib/libreactionThermophysicalModels.so: undefined symbol: myKappa_
Any help and hint would be really appreciable. Thanks in advance
|