|
[Sponsors] |
using a Fortran library of thermodynamics inside sutherland transport model |
|
LinkBack | Thread Tools | Search this Thread | Display Modes |
April 7, 2016, 10:34 |
Extern"C"(using a Fortran library of thermodynamics inside sutherlandTransport model)
|
#1 |
Member
Mehdi Aminyavari
Join Date: Feb 2016
Location: Milan
Posts: 35
Rep Power: 10 |
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; } // ************************************************************************* // 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_ Last edited by Mehdi3031; April 8, 2016 at 10:47. |
|
|
|
Similar Threads | ||||
Thread | Thread Starter | Forum | Replies | Last Post |
Compiling an external Fortran library of thermodynamics and using inside reactingFoam | Mehdi3031 | OpenFOAM Programming & Development | 4 | March 18, 2016 19:10 |
K-Epsilon model inside VECTIS | Ilomem | Main CFD Forum | 0 | October 24, 2008 00:53 |
To model fire inside the domain - please help | hari | Main CFD Forum | 0 | October 27, 2007 09:35 |
FDS - how to implement your FORTRAN model???? | ana | Main CFD Forum | 0 | July 1, 2005 11:06 |
FORTRAN static library | littlelz | Main CFD Forum | 6 | April 1, 2003 08:35 |