xref: /petsc/src/sys/objects/finit.c (revision 0baf8eba40dbc839082666f9f7396a225d6f663c)
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