Actual source code: ex7.c
1: /*$Id: ex7.c,v 1.33 2001/03/23 23:21:37 balay Exp $*/
3: static char help[] = "Demonstrates calling a Fortran computational routine from C.n
4: Also demonstrates passing PETSc objects, MPI Communicators from C to Fortrann
5: and from Fortran to Cnn";
7: #include "petscvec.h"
9: /*
10: Ugly stuff to insure the function names match between Fortran
11: and C. Sorry, but this is out of our PETSc hands to cleanup.
12: */
13: #if defined(PETSC_HAVE_FORTRAN_CAPS)
14: #define ex7f_ EX7F
15: #define ex7c_ EX7C
16: #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
17: #define ex7f_ ex7f
18: #define ex7c_ ex7c
19: #endif
20: EXTERN_C_BEGIN
21: EXTERN void PETSC_STDCALL ex7f_(Vec *,int*);
22: EXTERN_C_END
24: int main(int argc,char **args)
25: {
26: int ierr,m = 10;
27: int fcomm;
28: Vec vec;
30: PetscInitialize(&argc,&args,(char *)0,help);
32: /* This function should be called to be able to use PETSc routines
33: from the FORTRAN subroutines needed by this program */
35: PetscInitializeFortran();
37: VecCreate(PETSC_COMM_WORLD,PETSC_DECIDE,m,&vec);
38: VecSetFromOptions(vec);
40: /*
41: Call Fortran routine - the use of MPICCommToFortranComm() allows
42: translation of the MPI_Comm from C so that it can be properly
43: interpreted from Fortran.
44: */
45: MPICCommToFortranComm(PETSC_COMM_WORLD,&fcomm);
47: ex7f_(&vec,&fcomm);
49: VecView(vec,PETSC_VIEWER_STDOUT_WORLD);
50: VecDestroy(vec);
51: PetscFinalize();
52: return 0;
53: }
55: EXTERN_C_BEGIN
56: void PETSC_STDCALL ex7c_(Vec *fvec,int *fcomm,int* ierr)
57: {
58: MPI_Comm comm;
59: int size;
61: /*
62: Translate Fortran integer pointer back to C and
63: Fortran Communicator back to C communicator
64: */
65: *MPIFortranCommToCComm(*fcomm,&comm);
66:
67: /* Some PETSc/MPI operations on Vec/Communicator objects */
68: *VecGetSize(*fvec,&size);
69: *MPI_Barrier(comm);
71: }
72: EXTERN_C_END