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 @*/
PetscInitializeFortran(void)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