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