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