1 
2 #include <petsc/private/fortranimpl.h>
3 
4 #if defined(PETSC_HAVE_FORTRAN_CAPS)
5 #define petscinitializefortran_       PETSCINITIALIZEFORTRAN
6 #define petscsetmoduleblock_          PETSCSETMODULEBLOCK
7 #define petscsetfortranbasepointers_  PETSCSETFORTRANBASEPOINTERS
8 #define petsc_null_function_          PETSC_NULL_FUNCTION
9 #define petscsetmoduleblocknumeric_   PETSCSETMODULEBLOCKNUMERIC
10 #define petscsetcomm_                 PETSCSETCOMM
11 #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
12 #define petscinitializefortran_       petscinitializefortran
13 #define petscsetmoduleblock_          petscsetmoduleblock
14 #define petscsetfortranbasepointers_  petscsetfortranbasepointers
15 #define petsc_null_function_          petsc_null_function
16 #define petscsetmoduleblocknumeric_   petscsetmoduleblocknumeric
17 #define petscsetcomm_                 petscsetcomm
18 #endif
19 
20 #if defined(PETSC_HAVE_FORTRAN_UNDERSCORE_UNDERSCORE)
21 #define petsc_null_function_  petsc_null_function__
22 #endif
23 
24 PETSC_EXTERN void petscsetmoduleblock_();
25 PETSC_EXTERN void petscsetmoduleblockmpi_(MPI_Fint*,MPI_Fint*,MPI_Fint*);
26 PETSC_EXTERN void petscsetmoduleblocknumeric_(PetscReal*,PetscReal*,PetscReal*,PetscReal*,PetscReal*,PetscReal*,PetscReal*,PetscReal*);
27 PETSC_EXTERN void petscsetcomm_(MPI_Fint*,MPI_Fint*);
28 
29 /*@C
30    PetscInitializeFortran - Routine that should be called soon AFTER
31    the call to PetscInitialize() if one is using a C main program
32    that calls Fortran routines that in turn call PETSc routines.
33 
34    Collective on PETSC_COMM_WORLD
35 
36    Level: beginner
37 
38    Notes:
39    PetscInitializeFortran() initializes some of the default viewers,
40    communicators, etc. for use in the Fortran if a user's main program is
41    written in C.  PetscInitializeFortran() is NOT needed if a user's main
42    program is written in Fortran; in this case, just calling
43    PetscInitialize() in the main (Fortran) program is sufficient.
44 
45 .seealso:  PetscInitialize()
46 
47 @*/
PetscInitializeFortran(void)48 PetscErrorCode PetscInitializeFortran(void)
49 {
50   MPI_Fint c1=0,c2=0;
51 
52   if (PETSC_COMM_WORLD) c1 =  MPI_Comm_c2f(PETSC_COMM_WORLD);
53   c2 =  MPI_Comm_c2f(PETSC_COMM_SELF);
54   petscsetmoduleblock_();
55   petscsetcomm_(&c1,&c2);
56 
57 #if defined(PETSC_USE_REAL___FLOAT128)
58   {
59     MPI_Fint freal,fscalar,fsum;
60     freal   = MPI_Type_c2f(MPIU_REAL);
61     fscalar = MPI_Type_c2f(MPIU_SCALAR);
62     fsum    = MPI_Op_c2f(MPIU_SUM);
63     petscsetmoduleblockmpi_(&freal,&fscalar,&fsum);
64   }
65 #endif
66 
67   {
68     PetscReal pi = PETSC_PI;
69     PetscReal maxreal = PETSC_MAX_REAL;
70     PetscReal minreal = PETSC_MIN_REAL;
71     PetscReal eps = PETSC_MACHINE_EPSILON;
72     PetscReal seps = PETSC_SQRT_MACHINE_EPSILON;
73     PetscReal small = PETSC_SMALL;
74     PetscReal pinf = PETSC_INFINITY;
75     PetscReal pninf = PETSC_NINFINITY;
76     petscsetmoduleblocknumeric_(&pi,&maxreal,&minreal,&eps,&seps,&small,&pinf,&pninf);
77   }
78   return 0;
79 }
80 
petscinitializefortran_(int * ierr)81 PETSC_EXTERN void petscinitializefortran_(int *ierr)
82 {
83   *ierr = PetscInitializeFortran();
84 }
85 
petscsetfortranbasepointers_(char * fnull_character,void * fnull_integer,void * fnull_scalar,void * fnull_double,void * fnull_real,void * fnull_truth,void (* fnull_function)(void),PETSC_FORTRAN_CHARLEN_T len)86 PETSC_EXTERN void petscsetfortranbasepointers_(char *fnull_character,
87                                   void *fnull_integer,void *fnull_scalar,void * fnull_double,
88                                   void *fnull_real,
89                                   void* fnull_truth,void (*fnull_function)(void),PETSC_FORTRAN_CHARLEN_T len)
90 {
91   PETSC_NULL_CHARACTER_Fortran = fnull_character;
92   PETSC_NULL_INTEGER_Fortran   = fnull_integer;
93   PETSC_NULL_SCALAR_Fortran    = fnull_scalar;
94   PETSC_NULL_DOUBLE_Fortran    = fnull_double;
95   PETSC_NULL_REAL_Fortran      = fnull_real;
96   PETSC_NULL_BOOL_Fortran      = fnull_truth;
97   PETSC_NULL_FUNCTION_Fortran  = fnull_function;
98 }
99 
100 /*
101   A valid address for the fortran variable PETSC_NULL_FUNCTION
102 */
petsc_null_function_(void)103 PETSC_EXTERN void petsc_null_function_(void)
104 {
105   return;
106 }
107 
108 
109