Actual source code: ex7.c
2: static char help[] = "Demonstrates calling a Fortran computational routine from C.\n\
3: Also demonstrates passing PETSc objects, MPI Communicators from C to Fortran\n\
4: and from Fortran to C\n\n";
6: #include <petscvec.h>
7: /*
8: Ugly stuff to insure the function names match between Fortran
9: and C. This is out of our PETSc hands to cleanup.
10: */
11: /*T
12: Concepts: vectors^fortran-c;
13: Processors: n
14: T*/
15: #include <petsc/private/fortranimpl.h>
16: #if defined(PETSC_HAVE_FORTRAN_CAPS)
17: #define ex7f_ EX7F
18: #define ex7c_ EX7C
19: #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
20: #define ex7f_ ex7f
21: #define ex7c_ ex7c
22: #endif
24: PETSC_INTERN void ex7f_(Vec*,int*);
26: int main(int argc,char **args)
27: {
28: PetscInt m = 10;
29: int fcomm;
30: Vec vec;
32: PetscInitialize(&argc,&args,(char*)0,help);
33: /* This function should be called to be able to use PETSc routines
34: from the FORTRAN subroutines needed by this program */
36: PetscInitializeFortran();
38: VecCreate(PETSC_COMM_WORLD,&vec);
39: VecSetSizes(vec,PETSC_DECIDE,m);
40: VecSetFromOptions(vec);
42: /*
43: Call Fortran routine - the use of MPI_Comm_c2f() allows
44: translation of the MPI_Comm from C so that it can be properly
45: interpreted from Fortran.
46: */
47: fcomm = MPI_Comm_c2f(PETSC_COMM_WORLD);
49: ex7f_(&vec,&fcomm);
51: VecView(vec,PETSC_VIEWER_STDOUT_WORLD);
52: VecDestroy(&vec);
53: PetscFinalize();
54: return 0;
55: }
57: PETSC_INTERN void ex7c_(Vec *fvec,int *fcomm,PetscErrorCode *ierr)
58: {
59: MPI_Comm comm;
60: PetscInt vsize;
62: /*
63: Translate Fortran integer pointer back to C and
64: Fortran Communicator back to C communicator
65: */
66: comm = MPI_Comm_f2c(*fcomm);
68: /* Some PETSc/MPI operations on Vec/Communicator objects */
69: *VecGetSize(*fvec,&vsize);
70: *MPI_Barrier(comm);
72: }
74: /*TEST
76: build:
77: depends: ex7f.F
78: requires: fortran
80: test:
81: nsize: 3
82: filter: sort -b |grep -v "MPI processes"
83: filter_output: sort -b
85: TEST*/