Actual source code: ex7.c

  1: static char help[] = "Demonstrates calling a Fortran computational routine from C.\n\
  2: Also demonstrates passing  PETSc objects, MPI Communicators from C to Fortran\n\
  3: and from Fortran to C\n\n";

  5: #include <petscvec.h>
  6: /*
  7:   Ugly stuff to insure the function names match between Fortran
  8:   and C. This is out of our PETSc hands to cleanup.
  9: */
 10: #if defined(PETSC_HAVE_FORTRAN_CAPS)
 11:   #define ex7f_ EX7F
 12:   #define ex7c_ EX7C
 13: #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
 14:   #define ex7f_ ex7f
 15:   #define ex7c_ ex7c
 16: #endif

 18: PETSC_INTERN void ex7f_(Vec *, int *);

 20: int main(int argc, char **args)
 21: {
 22:   PetscInt m = 10;
 23:   int      fcomm;
 24:   Vec      vec;

 26:   PetscFunctionBeginUser;
 27:   PetscCall(PetscInitialize(&argc, &args, (char *)0, help));
 28:   /* This function should be called to be able to use PETSc routines
 29:      from the FORTRAN subroutines needed by this program */

 31:   PetscCall(PetscInitializeFortran());

 33:   PetscCall(VecCreate(PETSC_COMM_WORLD, &vec));
 34:   PetscCall(VecSetSizes(vec, PETSC_DECIDE, m));
 35:   PetscCall(VecSetFromOptions(vec));

 37:   /*
 38:      Call Fortran routine - the use of MPI_Comm_c2f() allows
 39:      translation of the MPI_Comm from C so that it can be properly
 40:      interpreted from Fortran.
 41:   */
 42:   fcomm = MPI_Comm_c2f(PETSC_COMM_WORLD);

 44:   ex7f_(&vec, &fcomm);

 46:   PetscCall(VecView(vec, PETSC_VIEWER_STDOUT_WORLD));
 47:   PetscCall(VecDestroy(&vec));
 48:   PetscCall(PetscFinalize());
 49:   return 0;
 50: }

 52: PETSC_INTERN void ex7c_(Vec *fvec, int *fcomm, PetscErrorCode *ierr)
 53: {
 54:   MPI_Comm comm;
 55:   PetscInt vsize;

 57:   /*
 58:     Translate Fortran integer pointer back to C and
 59:     Fortran Communicator back to C communicator
 60:   */
 61:   comm = MPI_Comm_f2c(*fcomm);

 63:   /* Some PETSc/MPI operations on Vec/Communicator objects */
 64:   *ierr = VecGetSize(*fvec, &vsize);
 65:   if (*ierr) return;
 66:   if (MPI_Barrier(comm)) *ierr = PETSC_ERR_MPI;
 67: }

 69: /*TEST

 71:    build:
 72:      depends: ex7f.F
 73:      requires: fortran

 75:    test:
 76:       nsize: 3
 77:       filter: sort -b |grep -v " MPI process"
 78:       filter_output: sort -b

 80: TEST*/