Académique Documents
Professionnel Documents
Culture Documents
Challenges
Applications
Conclusion
Motivation
Driver (C/C++)
Scientific/Engineering Applications
(FORTRAN 90/95)
FORTRAN 90 C
extern “C” {
SUBROUTINE example() void sum_(long *x, long
INTEGER, PARAMETER :: N=10 *n, long *y) {
INTEGER :: x(N), y *y = 0;
x(1:N) = 1 for (long i=0; i<*n;
CALL SUM(x,N,y) i++) {
PRINT *,’Sum of array ’, & *y += *(x+i);
’elements = ’,y }
END SUBROUTINE example }
}
FORTRAN 90: work1.f90 C++: Mesh.h
class Mesh {
SUBROUTINE work1()
public:
USE MeshModule, ONLY : &
void Mesh(long *,
initMesh,getGrid,deleteMesh
long *, long *,
INTEGER:: n1, n2, n3
double *);
REAL*8:: geometry(3,3)
void ~Mesh();
REAL*8, pointer:: grid(:,:,:)
double *getGrid()
... ... const;
READ(*,*)n1, n2, n3, & long getSizeX() const;
geometry(1:3,1:3) long getSizeY() const;
CALL initMesh(n1, n2, n3, & long getSizeZ() const;
geometry)
private:
grid => getGrid()
double *grid;
... ...
long nx, ny, nz;
CALL deleteMesh()
double geometry[9];
END SUBROUTINE work1
};
Challenges
For making a C++ numerical library usable by a
FORTRAN application, we need to know:
How to construct and destruct a C++ object via
FORTRAN routine calls?
Pointer :: *p_obj
FORTRAN Application
p(:,:,:)
C++
FORTRAN Object in
Module the Library
Alias
Function
Alias
Function
MeshModule.f90
PUBLIC : initMesh, getGrid, deleteMesh, aliasGrid
PRIVATE : INTEGER :: nx, ny, nz
PRIVATE : REAL*8, pointer :: grid(:,:,:)
CONTAINS
SUBROUTINE initMesh(L,M,N,g) SUBROUTINE aliasGrid(n1, &
INTEGER :: L,M,N n2,n3,a)
REAL*8 :: g(9)
CALL c_initMesh(L,M,N,g) INTEGER :: n1,n2,n3
END SUBROUTINE initMesh REAL*8, TARGET :: &
a(n1,n2,n3)
SUBROUTINE deleteMesh()
CALL c_deleteMesh() nx = n1
END SUBROUTINE deleteMesh ny = n2
nz = n3
FUNCTION getGrid() result(p)
REAL*8, POINTER:: p(:,:,:) grid => a(1:nx,1:ny,1:nz)
CALL c_getGrid()
p => grid(1:nx,1:ny,1:nz) END SUBROUTINE aliasGrid
END FUNCTION getGrid
aliasArray.f90
SUBROUTINE aliasArray(nx, ny, nz, a)
USE MeshModule, only: aliasGrid