Actual source code: zstartf.c
1: /*$Id: zstartf.c,v 1.34 2001/09/10 03:48:36 bsmith Exp $*/
3: #include src/fortran/custom/zpetsc.h
4: #include petscsys.h
7: #ifdef PETSC_HAVE_FORTRAN_CAPS
8: #define petscinitializefortran_ PETSCINITIALIZEFORTRAN
9: #define petscsetcommonblock_ PETSCSETCOMMONBLOCK
10: #define petscsetfortranbasepointers_ PETSCSETFORTRANBASEPOINTERS
11: #define petsc_null_function_ PETSC_NULL_FUNCTION
12: #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
13: #define petscinitializefortran_ petscinitializefortran
14: #define petscsetcommonblock_ petscsetcommonblock
15: #define petscsetfortranbasepointers_ petscsetfortranbasepointers
16: #define petsc_null_function_ petsc_null_function
17: #endif
19: #if defined(PETSC_HAVE_FORTRAN_UNDERSCORE_UNDERSCORE)
20: #define petsc_null_function_ petsc_null_function__
21: #endif
23: EXTERN_C_BEGIN
24: extern void PETSC_STDCALL petscsetcommonblock_(int*,int*);
25: EXTERN_C_END
27: /*@C
28: PetscInitializeFortran - Routine that should be called from C AFTER
29: the call to PetscInitialize() if one is using a C main program
30: that calls Fortran routines that in turn call PETSc routines.
32: Collective on PETSC_COMM_WORLD
34: Level: beginner
36: Notes:
37: PetscInitializeFortran() initializes some of the default viewers,
38: communicators, etc. for use in the Fortran if a user's main program is
39: written in C. PetscInitializeFortran() is NOT needed if a user's main
40: program is written in Fortran; in this case, just calling
41: PetscInitialize() in the main (Fortran) program is sufficient.
43: .seealso: PetscInitialize()
45: .keywords: Mixing C and Fortran, passing PETSc objects to Fortran
46: @*/
48: int PetscInitializeFortran(void)
49: {
50: int c1=0,c2=0;
52: if (PETSC_COMM_WORLD) {
53: c1 = PetscFromPointerComm(PETSC_COMM_WORLD);
54: }
55: if (PETSC_COMM_SELF) {
56: c2 = PetscFromPointerComm(PETSC_COMM_SELF);
57: }
58: petscsetcommonblock_(&c1,&c2);
59: return 0;
60: }
61:
62: EXTERN_C_BEGIN
64: void PETSC_STDCALL petscinitializefortran_(int *ierr)
65: {
66: *PetscInitializeFortran();
67: }
69: #if defined(PETSC_USES_CPTOFCD)
70: void PETSC_STDCALL petscsetfortranbasepointers_(_fcd fnull_character,void *fnull_integer,
71: void* fnull,void *fnull_scalar,void * fnull_double, void *fnull_real,
72: void (*fnull_function)(void))
73: {
74: PETSC_NULL_CHARACTER_Fortran = _fcdtocp(fnull_character);
75: PETSC_NULL_INTEGER_Fortran = fnull_integer;
76: PETSC_NULL_Fortran = fnull;
77: PETSC_NULL_SCALAR_Fortran = fnull_scalar;
78: PETSC_NULL_DOUBLE_Fortran = fnull_double;
79: PETSC_NULL_REAL_Fortran = fnull_real;
80: PETSC_NULL_FUNCTION_Fortran = fnull_function;
81: }
82: #else
83: void PETSC_STDCALL petscsetfortranbasepointers_(char *fnull_character PETSC_MIXED_LEN(len),
84: void *fnull_integer,void* fnull,void *fnull_scalar,void * fnull_double,
85: void *fnull_real,
86: void (*fnull_function)(void) PETSC_END_LEN(len))
87: {
88: PETSC_NULL_CHARACTER_Fortran = fnull_character;
89: PETSC_NULL_INTEGER_Fortran = fnull_integer;
90: PETSC_NULL_SCALAR_Fortran = fnull_scalar;
91: PETSC_NULL_DOUBLE_Fortran = fnull_double;
92: PETSC_NULL_REAL_Fortran = fnull_real;
93: PETSC_NULL_FUNCTION_Fortran = fnull_function;
94: }
95: #endif
97: /*
98: A valid address for the fortran variable PETSC_NULL_FUNCTION
99: */
100: void petsc_null_function_(void)
101: {
102: return;
103: }
105: EXTERN_C_END