1 #include <petsc/private/petscimpl.h> /*I "petscsys.h" I*/ 2 3 #if defined(PETSC_USE_FORTRAN_BINDINGS) 4 #if defined(PETSC_HAVE_FORTRAN_CAPS) 5 #define petscinitializefortran_ PETSCINITIALIZEFORTRAN 6 #define petscsetmoduleblock_ PETSCSETMODULEBLOCK 7 #define petscsetmoduleblockmpi_ PETSCSETMODULEBLOCKMPI 8 #define petscsetmoduleblocknumeric_ PETSCSETMODULEBLOCKNUMERIC 9 #define petscsetcomm_ PETSCSETCOMM 10 #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE) 11 #define petscinitializefortran_ petscinitializefortran 12 #define petscsetmoduleblock_ petscsetmoduleblock 13 #define petscsetmoduleblockmpi_ petscsetmoduleblockmpi 14 #define petscsetmoduleblocknumeric_ petscsetmoduleblocknumeric 15 #define petscsetcomm_ petscsetcomm 16 #endif 17 18 PETSC_EXTERN void petscsetmoduleblock_(void); 19 PETSC_EXTERN void petscsetmoduleblockmpi_(MPI_Fint *, MPI_Fint *, MPI_Fint *, MPI_Fint *); 20 PETSC_EXTERN void petscsetmoduleblocknumeric_(PetscReal *, PetscReal *, PetscReal *, PetscReal *, PetscReal *, PetscReal *, PetscReal *, PetscReal *); 21 PETSC_EXTERN void petscsetcomm_(MPI_Fint *, MPI_Fint *); 22 #endif 23 24 /*@C 25 PetscInitializeFortran - Routine that should be called soon AFTER 26 the call to `PetscInitialize()` if one is using a C main program 27 that calls Fortran routines that in turn call PETSc routines. 28 29 Collective on `PETSC_COMM_WORLD` 30 31 Level: beginner 32 33 Notes: 34 `PetscInitializeFortran()` initializes some of the default viewers, 35 communicators, etc. for use in the Fortran if a user's main program is 36 written in C. `PetscInitializeFortran()` is NOT needed if a user's main 37 program is written in Fortran; in this case, just calling 38 `PetscInitialize()` in the main (Fortran) program is sufficient. 39 40 This function exists and can be called even if PETSc has been configured 41 with `--with-fortran-bindings=0` or `--with-fc=0`. It just does nothing 42 in that case. 43 44 .seealso: `PetscInitialize()` 45 @*/ 46 PetscErrorCode PetscInitializeFortran(void) 47 { 48 #if defined(PETSC_USE_FORTRAN_BINDINGS) 49 MPI_Fint c1 = 0, c2 = 0; 50 51 if (PETSC_COMM_WORLD) c1 = MPI_Comm_c2f(PETSC_COMM_WORLD); 52 c2 = MPI_Comm_c2f(PETSC_COMM_SELF); 53 petscsetmoduleblock_(); 54 petscsetcomm_(&c1, &c2); 55 56 { 57 MPI_Fint freal, fscalar, fsum, fint; 58 freal = MPI_Type_c2f(MPIU_REAL); 59 fscalar = MPI_Type_c2f(MPIU_SCALAR); 60 fsum = MPI_Op_c2f(MPIU_SUM); 61 fint = MPI_Type_c2f(MPIU_INT); 62 petscsetmoduleblockmpi_(&freal, &fscalar, &fsum, &fint); 63 } 64 65 { 66 PetscReal pi = PETSC_PI; 67 PetscReal maxreal = PETSC_MAX_REAL; 68 PetscReal minreal = PETSC_MIN_REAL; 69 PetscReal eps = PETSC_MACHINE_EPSILON; 70 PetscReal seps = PETSC_SQRT_MACHINE_EPSILON; 71 PetscReal small = PETSC_SMALL; 72 PetscReal pinf = PETSC_INFINITY; 73 PetscReal pninf = PETSC_NINFINITY; 74 petscsetmoduleblocknumeric_(&pi, &maxreal, &minreal, &eps, &seps, &small, &pinf, &pninf); 75 } 76 #endif 77 return PETSC_SUCCESS; 78 } 79