|
[Sponsors] |
Memory protection in OpenFOAM / combinig with FORTRAN |
|
LinkBack | Thread Tools | Search this Thread | Display Modes |
February 5, 2013, 06:43 |
Memory protection in OpenFOAM / combinig with FORTRAN
|
#1 |
New Member
Bo Terp Paulsen
Join Date: Oct 2010
Posts: 13
Rep Power: 16 |
I am trying to combine the interFoam solver with an external solver written in FORTRAN. I had no problem combining the FORTRAN code with C++, but there seems to be something "OpenFOAM specific" corrupting the data of the FORTRAN solver. My best guess is that the automatic memory handling in OpenFOAM, unintended is freeing the memory of the FORTRAN solver and hereby causing memory corruption.
The implementation is made in the following way: 1. Compiled a shared library from the FORTRAN code; libexternalSolver.so 2. Linked to the shared library in Make/options 3. Declared necessary function form the external solver in the c++ code by extern "C" (see code below) 4. Compiled the OpenFOAM solver with wmake. If the lines related to solving equations in interFoam is comment out (see below), the solver is running seamlessly and the external solver returns correct results. If the lines are uncomment, the fields of the external solver are corrupted and the code crashes with a floating point exception after a few time steps. Notice that the simulation is crashing with data corruption even in the very simple "coupling", where no data are exchanged between interFoam and the external solver. A minimal (non)working example is shown below. (interFoam from OpenFOAM-2.1.x) Code:
/*---------------------------------------------------------------------------*\ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2011 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/>. Application interFoam Description Solver for 2 incompressible, isothermal immiscible fluids using a VOF (volume of fluid) phase-fraction based interface capturing approach. The momentum and other fluid properties are of the "mixture" and a single momentum equation is solved. Turbulence modelling is generic, i.e. laminar, RAS or LES may be selected. For a two-fluid approach see twoPhaseEulerFoam. \*---------------------------------------------------------------------------*/ // Declaration of external functions extern "C" void external_solver_t0_setup_(); // Setting up external solver extern "C" void external_solver_take_a_timestep_(); // Take a time step in external solver #include "fvCFD.H" #include "MULES.H" #include "subCycle.H" #include "interfaceProperties.H" #include "twoPhaseMixture.H" #include "turbulenceModel.H" #include "interpolationTable.H" #include "pimpleControl.H" #include "IObasicSourceList.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // int main(int argc, char *argv[]) { // Calling external FORTRAN function external_solver_t0_setup_(); #include "setRootCase.H" #include "createTime.H" #include "createMesh.H" pimpleControl pimple(mesh); #include "initContinuityErrs.H" #include "createFields.H" #include "readTimeControls.H" #include "correctPhi.H" #include "CourantNo.H" #include "setInitialDeltaT.H" //// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // Info<< "\nStarting time loop\n" << endl; while (runTime.run()) { #include "readTimeControls.H" #include "CourantNo.H" #include "alphaCourantNo.H" #include "setDeltaT.H" runTime++; // Calling external FORTRAN function external_solver_take_a_timestep_(); Info<< "Time = " << runTime.timeName() << nl << endl; twoPhaseProperties.correct(); // If the following line is uncommented the data of the external solver is corrupted and the solver crashes! #include "alphaEqnSubCycle.H" //// --- Pressure-velocity PIMPLE corrector loop //while (pimple.loop()) //{ //#include "UEqn.H" //// --- Pressure corrector loop //while (pimple.correct()) //{ //#include "pEqn.H" //} //if (pimple.turbCorr()) //{ //turbulence->correct(); //} //} runTime.write(); Info<< "ExecutionTime = " << runTime.elapsedCpuTime() << " s" << " ClockTime = " << runTime.elapsedClockTime() << " s" << nl << endl; } Info<< "End\n" << endl; return 0; } // ************************************************************************* // Code:
EXE_INC = \ -I$(LIB_SRC)/transportModels \ -I$(LIB_SRC)/transportModels/incompressible/lnInclude \ -I$(LIB_SRC)/transportModels/interfaceProperties/lnInclude \ -I$(LIB_SRC)/turbulenceModels/incompressible/turbulenceModel \ -I$(LIB_SRC)/finiteVolume/lnInclude \ -I$(LIB_SRC)/meshTools/lnInclude \ -I$(HOME)/lib/include \ EXE_LIBS = \ -L ~/lib/ \ -lgfortran \ -ltwoPhaseInterfaceProperties \ -lincompressibleTransportModels \ -lincompressibleTurbulenceModel \ -lincompressibleRASModels \ -lincompressibleLESModels \ -lfiniteVolume \ -lmeshTools \ -L$(FOAM_USER_LIBBIN) \ -lexternalSolver Kind Regards, Bo Terp |
|
February 6, 2013, 05:26 |
|
#2 |
Senior Member
Christian Lucas
Join Date: Aug 2009
Location: Braunschweig, Germany
Posts: 202
Rep Power: 18 |
Hi,
the method you explain above works fine for me. Have a look at the my iapws 97 library for OpenFOAM http://www.cfd-online.com/Forums/ope...tml#post400518 Regards, Christian |
|
February 15, 2016, 13:25 |
|
#3 |
New Member
Marco
Join Date: Nov 2014
Location: Germany
Posts: 14
Rep Power: 12 |
Hi,
I'm having a similar problem, did you ever resolve your issue? OpenFOAM seems to free the memory for an array that I want to access using a pointer in an "external" C-function. Any help is appreciated. |
|
Tags |
coupled solver, fortran, memory corruption, open foam |
|
|
Similar Threads | ||||
Thread | Thread Starter | Forum | Replies | Last Post |
Comparison between C/C++ and Fortran? | rick | Main CFD Forum | 45 | September 6, 2011 01:52 |
Memory leak in OpenFOAM? | marupio | OpenFOAM Bugs | 8 | October 14, 2010 13:49 |
Critical errors during OpenFoam installation in OpenSuse 11.0 | amscosta | OpenFOAM | 5 | May 1, 2009 15:06 |
Summer School on Numerical Modelling and OpenFOAM | hjasak | OpenFOAM | 5 | October 12, 2008 14:14 |
OpenFOAM Training and Workshop | Hrvoje Jasak | Main CFD Forum | 0 | October 7, 2005 08:14 |