- Author
- Jean-Christophe Fabre jean-.nosp@m.chri.nosp@m.stoph.nosp@m.e.fa.nosp@m.bre@i.nosp@m.nra..nosp@m.fr
- See also
- http://www-h.eng.cam.ac.uk/help/tpl/languages/mixinglanguages.html
-
http://www.neurophys.wisc.edu/comp/docs/notes/not017.html
-
http://www.yolinux.com/TUTORIALS/LinuxTutorialMixingFortranAndC.html
-
http://arnholm.org/software/cppf77/cppf77.htm
-
http://www.aei.mpg.de/~jthorn/c2f.html
Below are examples of C++ simulators calling Fortran subroutines.
Fortran source code:
subroutine multrealvalue(value,mult,result)
implicit none
real*8 value
real*8 mult
real*8 result
result=value*mult
return
end
subroutine multintvalue(value,mult,result)
implicit none
integer value
integer mult
integer result
result=value*mult
return
end
subroutine multrealmatrix(matrix,dim1,dim2,mult,result)
implicit none
integer dim1
integer dim2
real*8 matrix(dim2,dim1)
integer mult
real*8 result(dim2,dim1)
integer i, j
do j=1,dim1
do i=1,dim2
result(i,j) = matrix(i,j) * mult
end do
end do
return
end
Declaration of Fortran subroutines to call (In C++ code):
#define FREAL8
Definition: FortranCPP.hpp:281
#define BEGIN_EXTERN_FORTRAN
Definition: FortranCPP.hpp:107
#define FINT
Definition: FortranCPP.hpp:307
#define END_EXTERN_FORTRAN
Definition: FortranCPP.hpp:108
#define EXTERN_FSUBROUTINE(x)
Definition: FortranCPP.hpp:161
Use of Fortran subroutines tFrom C++ code:
{
int i;
double DValue, DMult, DResult;
DValue = 1.5436;
DMult = 2.5;
DResult = 0.0;
if (abs(DResult - (DValue*DMult)) > 0.0001)
{
OPENFLUID_RaiseError("Wrong fortran call (multrealvalue)");
}
int IValue, IMult, IResult;
IValue = 45;
IMult = 18;
IResult = 0;
if (IResult != (IValue*IMult))
{
OPENFLUID_RaiseError("Wrong fortran call (multintvalue)");
}
int MMult, MDim1,MDim2;
double *MValue;
double *MResult;
MMult = 3;
MDim1 = 2;
MDim2 = 3;
MValue = new double[MDim1*MDim2];
MResult = new double[MDim1*MDim2];
for (i=0; i < MDim1*MDim2;i++)
{
MValue[i] = 1.5;
MResult[i] = 0.0;
}
for (i=0; i < MDim1*MDim2;i++)
{
if (abs(MResult[i] - (MValue[i] * MMult)) > 0.0001)
{
OPENFLUID_RaiseError("Wrong fortran call (multrealmatrix)");
}
}
return DefaultDeltaT();
}
#define CALL_FSUBROUTINE(x)
Definition: FortranCPP.hpp:177
Definition: SchedulingRequest.hpp:54