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: #undef __FUNCT__
26: int main(int argc,char **args)
27: {
28: int ierr,m = 10;
29: int fcomm;
30: Vec vec;
32: PetscInitialize(&argc,&args,(char *)0,help);
34: /* This function should be called to be able to use PETSc routines
35: from the FORTRAN subroutines needed by this program */
37: PetscInitializeFortran();
39: VecCreate(PETSC_COMM_WORLD,&vec);
40: VecSetSizes(vec,PETSC_DECIDE,m);
41: VecSetFromOptions(vec);
43: /*
44: Call Fortran routine - the use of MPICCommToFortranComm() allows
45: translation of the MPI_Comm from C so that it can be properly
46: interpreted from Fortran.
47: */
48: MPICCommToFortranComm(PETSC_COMM_WORLD,&fcomm);
50: ex7f_(&vec,&fcomm);
52: VecView(vec,PETSC_VIEWER_STDOUT_WORLD);
53: VecDestroy(vec);
54: PetscFinalize();
55: return 0;
56: }
58: EXTERN_C_BEGIN
59: #undef __FUNCT__
61: void PETSC_STDCALL ex7c_(Vec *fvec,int *fcomm,int* ierr)
62: {
63: MPI_Comm comm;
64: int size;
66: /*
67: Translate Fortran integer pointer back to C and
68: Fortran Communicator back to C communicator
69: */
70: *MPIFortranCommToCComm(*fcomm,&comm);
71:
72: /* Some PETSc/MPI operations on Vec/Communicator objects */
73: *VecGetSize(*fvec,&size);
74: *MPI_Barrier(comm);
76: }
77: EXTERN_C_END