xref: /petsc/src/sys/objects/pinit.c (revision 480cf27a35d7f918150db1e11a95c81e19d0da9c)
1e5c89e4eSSatish Balay #define PETSC_DLL
2e5c89e4eSSatish Balay /*
3e5c89e4eSSatish Balay    This file defines the initialization of PETSc, including PetscInitialize()
4e5c89e4eSSatish Balay */
5e5c89e4eSSatish Balay 
6e5c89e4eSSatish Balay #include "petsc.h"        /*I  "petsc.h"   I*/
7e5c89e4eSSatish Balay #include "petscsys.h"
88101f56cSMatthew Knepley 
9a9f03627SSatish Balay #if defined(PETSC_USE_LOG)
10e5c89e4eSSatish Balay EXTERN PetscErrorCode PetscLogBegin_Private(void);
11a9f03627SSatish Balay #endif
12461e1b68SBarry Smith extern PetscTruth PetscOpenMPWorker;
13e5c89e4eSSatish Balay 
14e5c89e4eSSatish Balay /* -----------------------------------------------------------------------------------------*/
15e5c89e4eSSatish Balay 
16e5c89e4eSSatish Balay extern FILE *petsc_history;
17e5c89e4eSSatish Balay 
18e5c89e4eSSatish Balay EXTERN PetscErrorCode PetscInitialize_DynamicLibraries(void);
19e5c89e4eSSatish Balay EXTERN PetscErrorCode PetscFinalize_DynamicLibraries(void);
20e5c89e4eSSatish Balay EXTERN PetscErrorCode PetscFListDestroyAll(void);
21e5c89e4eSSatish Balay EXTERN PetscErrorCode PetscSequentialPhaseBegin_Private(MPI_Comm,int);
22e5c89e4eSSatish Balay EXTERN PetscErrorCode PetscSequentialPhaseEnd_Private(MPI_Comm,int);
23e5c89e4eSSatish Balay EXTERN PetscErrorCode PetscLogCloseHistoryFile(FILE **);
2461b37b28SSatish Balay EXTERN PetscErrorCode PetscOptionsHelpDestroyList(void);
25e5c89e4eSSatish Balay 
26e5c89e4eSSatish Balay /* this is used by the _, __, and ___ macros (see include/petscerror.h) */
27e5c89e4eSSatish Balay PetscErrorCode __gierr = 0;
28e5c89e4eSSatish Balay 
29e5c89e4eSSatish Balay /* user may set this BEFORE calling PetscInitialize() */
30e8373e55SMatthew Knepley MPI_Comm PETSC_COMM_WORLD = MPI_COMM_NULL;
31e5c89e4eSSatish Balay 
32*480cf27aSJed Brown PetscMPIInt Petsc_Counter_keyval   = MPI_KEYVAL_INVALID;
33*480cf27aSJed Brown PetscMPIInt Petsc_InnerComm_keyval = MPI_KEYVAL_INVALID;
34*480cf27aSJed Brown PetscMPIInt Petsc_OuterComm_keyval = MPI_KEYVAL_INVALID;
35*480cf27aSJed Brown 
36e5c89e4eSSatish Balay /*
37e5c89e4eSSatish Balay      Declare and set all the string names of the PETSc enums
38e5c89e4eSSatish Balay */
39e5c89e4eSSatish Balay const char *PetscTruths[]    = {"FALSE","TRUE","PetscTruth","PETSC_",0};
40e5c89e4eSSatish Balay const char *PetscDataTypes[] = {"INT", "DOUBLE", "COMPLEX",
41e5c89e4eSSatish Balay                                 "LONG","SHORT",  "FLOAT",
42f68b968cSBarry Smith                                 "CHAR","LOGICAL","ENUM","TRUTH","LONGDOUBLE","PetscDataType","PETSC_",0};
43e5c89e4eSSatish Balay 
440f8e0872SSatish Balay PetscTruth PetscPreLoadingUsed = PETSC_FALSE;
450f8e0872SSatish Balay PetscTruth PetscPreLoadingOn   = PETSC_FALSE;
460f8e0872SSatish Balay 
47e5c89e4eSSatish Balay /*
48e5c89e4eSSatish Balay        Checks the options database for initializations related to the
49e5c89e4eSSatish Balay     PETSc components
50e5c89e4eSSatish Balay */
51e5c89e4eSSatish Balay #undef __FUNCT__
52e5c89e4eSSatish Balay #define __FUNCT__ "PetscOptionsCheckInitial_Components"
53e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscOptionsCheckInitial_Components(void)
54e5c89e4eSSatish Balay {
55e5c89e4eSSatish Balay   PetscTruth flg1;
56e5c89e4eSSatish Balay   PetscErrorCode ierr;
57e5c89e4eSSatish Balay 
58e5c89e4eSSatish Balay   PetscFunctionBegin;
59e5c89e4eSSatish Balay   ierr = PetscOptionsHasName(PETSC_NULL,"-help",&flg1);CHKERRQ(ierr);
60e5c89e4eSSatish Balay   if (flg1) {
61e5c89e4eSSatish Balay #if defined (PETSC_USE_LOG)
62e8e7597cSSatish Balay     MPI_Comm   comm = PETSC_COMM_WORLD;
63e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"------Additional PETSc component options--------\n");CHKERRQ(ierr);
64e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -log_summary_exclude: <vec,mat,pc.ksp,snes>\n");CHKERRQ(ierr);
656cf91177SBarry Smith     ierr = (*PetscHelpPrintf)(comm," -info_exclude: <null,vec,mat,pc,ksp,snes,ts>\n");CHKERRQ(ierr);
66e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"-----------------------------------------------\n");CHKERRQ(ierr);
67e5c89e4eSSatish Balay #endif
68e5c89e4eSSatish Balay   }
69e5c89e4eSSatish Balay   PetscFunctionReturn(0);
70e5c89e4eSSatish Balay }
71e5c89e4eSSatish Balay 
72e5c89e4eSSatish Balay #undef __FUNCT__
73e5c89e4eSSatish Balay #define __FUNCT__ "PetscInitializeNoArguments"
74e5c89e4eSSatish Balay /*@C
75e5c89e4eSSatish Balay       PetscInitializeNoArguments - Calls PetscInitialize() from C/C++ without
76e5c89e4eSSatish Balay         the command line arguments.
77e5c89e4eSSatish Balay 
78e5c89e4eSSatish Balay    Collective
79e5c89e4eSSatish Balay 
80e5c89e4eSSatish Balay    Level: advanced
81e5c89e4eSSatish Balay 
82e5c89e4eSSatish Balay .seealso: PetscInitialize(), PetscInitializeFortran()
83e5c89e4eSSatish Balay @*/
84e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscInitializeNoArguments(void)
85e5c89e4eSSatish Balay {
86e5c89e4eSSatish Balay   PetscErrorCode ierr;
87e5c89e4eSSatish Balay   int            argc = 0;
88e5c89e4eSSatish Balay   char           **args = 0;
89e5c89e4eSSatish Balay 
90e5c89e4eSSatish Balay   PetscFunctionBegin;
91e5c89e4eSSatish Balay   ierr = PetscInitialize(&argc,&args,PETSC_NULL,PETSC_NULL);
92e5c89e4eSSatish Balay   PetscFunctionReturn(ierr);
93e5c89e4eSSatish Balay }
94e5c89e4eSSatish Balay 
95e5c89e4eSSatish Balay #undef __FUNCT__
96e5c89e4eSSatish Balay #define __FUNCT__ "PetscInitialized"
97e5c89e4eSSatish Balay /*@
98e5c89e4eSSatish Balay       PetscInitialized - Determine whether PETSc is initialized.
99e5c89e4eSSatish Balay 
1006dc8fec2Sbcordonn 7   Level: beginner
101e5c89e4eSSatish Balay 
102e5c89e4eSSatish Balay .seealso: PetscInitialize(), PetscInitializeNoArguments(), PetscInitializeFortran()
103e5c89e4eSSatish Balay @*/
104e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscInitialized(PetscTruth *isInitialized)
105e5c89e4eSSatish Balay {
106e5c89e4eSSatish Balay   PetscFunctionBegin;
107e5c89e4eSSatish Balay   PetscValidPointer(isInitialized, 1);
108e5c89e4eSSatish Balay   *isInitialized = PetscInitializeCalled;
109e5c89e4eSSatish Balay   PetscFunctionReturn(0);
110e5c89e4eSSatish Balay }
111e5c89e4eSSatish Balay 
112e5c89e4eSSatish Balay #undef __FUNCT__
113e5c89e4eSSatish Balay #define __FUNCT__ "PetscFinalized"
114e5c89e4eSSatish Balay /*@
115e5c89e4eSSatish Balay       PetscFinalized - Determine whether PetscFinalize() has been called yet
116e5c89e4eSSatish Balay 
117e5c89e4eSSatish Balay    Level: developer
118e5c89e4eSSatish Balay 
119e5c89e4eSSatish Balay .seealso: PetscInitialize(), PetscInitializeNoArguments(), PetscInitializeFortran()
120e5c89e4eSSatish Balay @*/
121e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscFinalized(PetscTruth *isFinalized)
122e5c89e4eSSatish Balay {
123e5c89e4eSSatish Balay   PetscFunctionBegin;
124e5c89e4eSSatish Balay   PetscValidPointer(isFinalized, 1);
125e5c89e4eSSatish Balay   *isFinalized = PetscFinalizeCalled;
126e5c89e4eSSatish Balay   PetscFunctionReturn(0);
127e5c89e4eSSatish Balay }
128e5c89e4eSSatish Balay 
129e5c89e4eSSatish Balay EXTERN PetscErrorCode        PetscOptionsCheckInitial_Private(void);
130e5c89e4eSSatish Balay extern PetscTruth PetscBeganMPI;
131e5c89e4eSSatish Balay 
132e5c89e4eSSatish Balay /*
133e5c89e4eSSatish Balay        This function is the MPI reduction operation used to compute the sum of the
134e5c89e4eSSatish Balay    first half of the datatype and the max of the second half.
135e5c89e4eSSatish Balay */
136e5c89e4eSSatish Balay MPI_Op PetscMaxSum_Op = 0;
137e5c89e4eSSatish Balay 
138e5c89e4eSSatish Balay EXTERN_C_BEGIN
139e5c89e4eSSatish Balay #undef __FUNCT__
140e5c89e4eSSatish Balay #define __FUNCT__ "PetscMaxSum_Local"
1416f9d5503SSatish Balay void PETSC_DLLEXPORT MPIAPI PetscMaxSum_Local(void *in,void *out,int *cnt,MPI_Datatype *datatype)
142e5c89e4eSSatish Balay {
143e5c89e4eSSatish Balay   PetscInt *xin = (PetscInt*)in,*xout = (PetscInt*)out,i,count = *cnt;
144e5c89e4eSSatish Balay 
145e5c89e4eSSatish Balay   PetscFunctionBegin;
146e5c89e4eSSatish Balay   if (*datatype != MPIU_2INT) {
147e5c89e4eSSatish Balay     (*PetscErrorPrintf)("Can only handle MPIU_2INT data types");
148e5c89e4eSSatish Balay     MPI_Abort(MPI_COMM_WORLD,1);
149e5c89e4eSSatish Balay   }
150e5c89e4eSSatish Balay 
151e5c89e4eSSatish Balay   for (i=0; i<count; i++) {
152e5c89e4eSSatish Balay     xout[2*i]    = PetscMax(xout[2*i],xin[2*i]);
153e5c89e4eSSatish Balay     xout[2*i+1] += xin[2*i+1];
154e5c89e4eSSatish Balay   }
155e5c89e4eSSatish Balay   PetscStackPop;
156e5c89e4eSSatish Balay   return;
157e5c89e4eSSatish Balay }
158e5c89e4eSSatish Balay EXTERN_C_END
159e5c89e4eSSatish Balay 
160e5c89e4eSSatish Balay /*
161e5c89e4eSSatish Balay     Returns the max of the first entry owned by this processor and the
162e5c89e4eSSatish Balay sum of the second entry.
163b693b147SBarry Smith 
164b693b147SBarry Smith     The reason nprocs[2*i] contains lengths nprocs[2*i+1] contains flag of 1 if length is nonzero
165b693b147SBarry Smith is so that the PetscMaxSum_Op() can set TWO values, if we passed in only nprocs[i] with lengths
166b693b147SBarry Smith there would be no place to store the both needed results.
167e5c89e4eSSatish Balay */
168e5c89e4eSSatish Balay #undef __FUNCT__
169e5c89e4eSSatish Balay #define __FUNCT__ "PetscMaxSum"
170e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscMaxSum(MPI_Comm comm,const PetscInt nprocs[],PetscInt *max,PetscInt *sum)
171e5c89e4eSSatish Balay {
172e5c89e4eSSatish Balay   PetscMPIInt    size,rank;
173e5c89e4eSSatish Balay   PetscInt       *work;
174e5c89e4eSSatish Balay   PetscErrorCode ierr;
175e5c89e4eSSatish Balay 
176e5c89e4eSSatish Balay   PetscFunctionBegin;
177e5c89e4eSSatish Balay   ierr   = MPI_Comm_size(comm,&size);CHKERRQ(ierr);
178e5c89e4eSSatish Balay   ierr   = MPI_Comm_rank(comm,&rank);CHKERRQ(ierr);
179e5c89e4eSSatish Balay   ierr   = PetscMalloc(2*size*sizeof(PetscInt),&work);CHKERRQ(ierr);
180e5c89e4eSSatish Balay   ierr   = MPI_Allreduce((void*)nprocs,work,size,MPIU_2INT,PetscMaxSum_Op,comm);CHKERRQ(ierr);
181e5c89e4eSSatish Balay   *max   = work[2*rank];
182e5c89e4eSSatish Balay   *sum   = work[2*rank+1];
183e5c89e4eSSatish Balay   ierr   = PetscFree(work);CHKERRQ(ierr);
184e5c89e4eSSatish Balay   PetscFunctionReturn(0);
185e5c89e4eSSatish Balay }
186e5c89e4eSSatish Balay 
187e5c89e4eSSatish Balay /* ----------------------------------------------------------------------------*/
188e5c89e4eSSatish Balay MPI_Op PETSC_DLLEXPORT PetscADMax_Op = 0;
189e5c89e4eSSatish Balay 
190e5c89e4eSSatish Balay EXTERN_C_BEGIN
191e5c89e4eSSatish Balay #undef __FUNCT__
192e5c89e4eSSatish Balay #define __FUNCT__ "PetscADMax_Local"
1936f9d5503SSatish Balay void PETSC_DLLEXPORT MPIAPI PetscADMax_Local(void *in,void *out,PetscMPIInt *cnt,MPI_Datatype *datatype)
194e5c89e4eSSatish Balay {
195e5c89e4eSSatish Balay   PetscScalar *xin = (PetscScalar *)in,*xout = (PetscScalar*)out;
196e5c89e4eSSatish Balay   PetscInt    i,count = *cnt;
197e5c89e4eSSatish Balay 
198e5c89e4eSSatish Balay   PetscFunctionBegin;
199e5c89e4eSSatish Balay   if (*datatype != MPIU_2SCALAR) {
200e5c89e4eSSatish Balay     (*PetscErrorPrintf)("Can only handle MPIU_2SCALAR data (i.e. double or complex) types");
201e5c89e4eSSatish Balay     MPI_Abort(MPI_COMM_WORLD,1);
202e5c89e4eSSatish Balay   }
203e5c89e4eSSatish Balay 
204e5c89e4eSSatish Balay   for (i=0; i<count; i++) {
205e5c89e4eSSatish Balay     if (PetscRealPart(xout[2*i]) < PetscRealPart(xin[2*i])) {
206e5c89e4eSSatish Balay       xout[2*i]   = xin[2*i];
207e5c89e4eSSatish Balay       xout[2*i+1] = xin[2*i+1];
208e5c89e4eSSatish Balay     }
209e5c89e4eSSatish Balay   }
210e5c89e4eSSatish Balay 
211e5c89e4eSSatish Balay   PetscStackPop;
212e5c89e4eSSatish Balay   return;
213e5c89e4eSSatish Balay }
214e5c89e4eSSatish Balay EXTERN_C_END
215e5c89e4eSSatish Balay 
216e5c89e4eSSatish Balay MPI_Op PETSC_DLLEXPORT PetscADMin_Op = 0;
217e5c89e4eSSatish Balay 
218e5c89e4eSSatish Balay EXTERN_C_BEGIN
219e5c89e4eSSatish Balay #undef __FUNCT__
220e5c89e4eSSatish Balay #define __FUNCT__ "PetscADMin_Local"
2216f9d5503SSatish Balay void PETSC_DLLEXPORT MPIAPI PetscADMin_Local(void *in,void *out,PetscMPIInt *cnt,MPI_Datatype *datatype)
222e5c89e4eSSatish Balay {
223e5c89e4eSSatish Balay   PetscScalar *xin = (PetscScalar *)in,*xout = (PetscScalar*)out;
224e5c89e4eSSatish Balay   PetscInt    i,count = *cnt;
225e5c89e4eSSatish Balay 
226e5c89e4eSSatish Balay   PetscFunctionBegin;
227e5c89e4eSSatish Balay   if (*datatype != MPIU_2SCALAR) {
228e5c89e4eSSatish Balay     (*PetscErrorPrintf)("Can only handle MPIU_2SCALAR data (i.e. double or complex) types");
229e5c89e4eSSatish Balay     MPI_Abort(MPI_COMM_WORLD,1);
230e5c89e4eSSatish Balay   }
231e5c89e4eSSatish Balay 
232e5c89e4eSSatish Balay   for (i=0; i<count; i++) {
233e5c89e4eSSatish Balay     if (PetscRealPart(xout[2*i]) > PetscRealPart(xin[2*i])) {
234e5c89e4eSSatish Balay       xout[2*i]   = xin[2*i];
235e5c89e4eSSatish Balay       xout[2*i+1] = xin[2*i+1];
236e5c89e4eSSatish Balay     }
237e5c89e4eSSatish Balay   }
238e5c89e4eSSatish Balay 
239e5c89e4eSSatish Balay   PetscStackPop;
240e5c89e4eSSatish Balay   return;
241e5c89e4eSSatish Balay }
242e5c89e4eSSatish Balay EXTERN_C_END
243e5c89e4eSSatish Balay /* ---------------------------------------------------------------------------------------*/
244e5c89e4eSSatish Balay 
245e5c89e4eSSatish Balay #if defined(PETSC_USE_COMPLEX)
246e5c89e4eSSatish Balay MPI_Op PetscSum_Op = 0;
247e5c89e4eSSatish Balay 
248e5c89e4eSSatish Balay EXTERN_C_BEGIN
249e5c89e4eSSatish Balay #undef __FUNCT__
250e5c89e4eSSatish Balay #define __FUNCT__ "PetscSum_Local"
251e5c89e4eSSatish Balay void PETSC_DLLEXPORT PetscSum_Local(void *in,void *out,PetscMPIInt *cnt,MPI_Datatype *datatype)
252e5c89e4eSSatish Balay {
253e5c89e4eSSatish Balay   PetscScalar *xin = (PetscScalar *)in,*xout = (PetscScalar*)out;
254e5c89e4eSSatish Balay   PetscInt    i,count = *cnt;
255e5c89e4eSSatish Balay 
256e5c89e4eSSatish Balay   PetscFunctionBegin;
257e5c89e4eSSatish Balay   if (*datatype != MPIU_SCALAR) {
258e5c89e4eSSatish Balay     (*PetscErrorPrintf)("Can only handle MPIU_SCALAR data (i.e. double or complex) types");
259e5c89e4eSSatish Balay     MPI_Abort(MPI_COMM_WORLD,1);
260e5c89e4eSSatish Balay   }
261e5c89e4eSSatish Balay 
262e5c89e4eSSatish Balay   for (i=0; i<count; i++) {
263e5c89e4eSSatish Balay     xout[i] += xin[i];
264e5c89e4eSSatish Balay   }
265e5c89e4eSSatish Balay 
266e5c89e4eSSatish Balay   PetscStackPop;
267e5c89e4eSSatish Balay   return;
268e5c89e4eSSatish Balay }
269e5c89e4eSSatish Balay EXTERN_C_END
270e5c89e4eSSatish Balay #endif
271e5c89e4eSSatish Balay 
272*480cf27aSJed Brown EXTERN_C_BEGIN
273*480cf27aSJed Brown #undef __FUNCT__
274*480cf27aSJed Brown #define __FUNCT__ "Petsc_DelCounter"
275*480cf27aSJed Brown /*
276*480cf27aSJed Brown    Private routine to delete internal tag/name counter storage when a communicator is freed.
277*480cf27aSJed Brown 
278*480cf27aSJed Brown    This is called by MPI, not by users.
279*480cf27aSJed Brown 
280*480cf27aSJed Brown    Note: this is declared extern "C" because it is passed to MPI_Keyval_create()
281*480cf27aSJed Brown 
282*480cf27aSJed Brown */
283*480cf27aSJed Brown PetscMPIInt PETSC_DLLEXPORT MPIAPI Petsc_DelCounter(MPI_Comm comm,PetscMPIInt keyval,void *count_val,void *extra_state)
284*480cf27aSJed Brown {
285*480cf27aSJed Brown   PetscErrorCode ierr;
286*480cf27aSJed Brown 
287*480cf27aSJed Brown   PetscFunctionBegin;
288*480cf27aSJed Brown   ierr = PetscInfo1(0,"Deleting counter data in an MPI_Comm %ld\n",(long)comm);if (ierr) PetscFunctionReturn((PetscMPIInt)ierr);
289*480cf27aSJed Brown   ierr = PetscFree(count_val);if (ierr) PetscFunctionReturn((PetscMPIInt)ierr);
290*480cf27aSJed Brown   PetscFunctionReturn(MPI_SUCCESS);
291*480cf27aSJed Brown }
292*480cf27aSJed Brown EXTERN_C_END
293*480cf27aSJed Brown 
294*480cf27aSJed Brown EXTERN_C_BEGIN
295*480cf27aSJed Brown #undef __FUNCT__
296*480cf27aSJed Brown #define __FUNCT__ "Petsc_DelComm"
297*480cf27aSJed Brown /*
298*480cf27aSJed Brown   This does not actually free anything, it simply marks when a reference count to an internal MPI_Comm reaches zero and the
299*480cf27aSJed Brown   the external MPI_Comm drops its reference to the internal MPI_Comm
300*480cf27aSJed Brown 
301*480cf27aSJed Brown   This is called by MPI, not by users.
302*480cf27aSJed Brown 
303*480cf27aSJed Brown   Note: this is declared extern "C" because it is passed to MPI_Keyval_create()
304*480cf27aSJed Brown 
305*480cf27aSJed Brown */
306*480cf27aSJed Brown PetscMPIInt PETSC_DLLEXPORT MPIAPI Petsc_DelComm(MPI_Comm comm,PetscMPIInt keyval,void *attr_val,void *extra_state)
307*480cf27aSJed Brown {
308*480cf27aSJed Brown   PetscErrorCode ierr;
309*480cf27aSJed Brown 
310*480cf27aSJed Brown   PetscFunctionBegin;
311*480cf27aSJed Brown   ierr = PetscInfo1(0,"Deleting PETSc communicator imbedded in a user MPI_Comm %ld\n",(long)comm);if (ierr) PetscFunctionReturn((PetscMPIInt)ierr);
312*480cf27aSJed Brown   /* actually don't delete anything because we cannot increase the reference count of the communicator anyways */
313*480cf27aSJed Brown   PetscFunctionReturn(MPI_SUCCESS);
314*480cf27aSJed Brown }
315*480cf27aSJed Brown EXTERN_C_END
316*480cf27aSJed Brown 
317951e3c8eSBarry Smith #if defined(PETSC_USE_PETSC_MPI_EXTERNAL32)
318e39fd77fSBarry Smith #if !defined(PETSC_WORDS_BIGENDIAN)
319e39fd77fSBarry Smith EXTERN_C_BEGIN
320e39fd77fSBarry Smith extern PetscMPIInt PetscDataRep_extent_fn(MPI_Datatype,MPI_Aint*,void*);
321e39fd77fSBarry Smith extern PetscMPIInt PetscDataRep_read_conv_fn(void*, MPI_Datatype,PetscMPIInt,void*,MPI_Offset,void*);
322e39fd77fSBarry Smith extern PetscMPIInt PetscDataRep_write_conv_fn(void*, MPI_Datatype,PetscMPIInt,void*,MPI_Offset,void*);
323e39fd77fSBarry Smith EXTERN_C_END
324e39fd77fSBarry Smith #endif
325951e3c8eSBarry Smith #endif
326e39fd77fSBarry Smith 
3276ae9a8a6SBarry Smith int  PetscGlobalArgc   = 0;
3286ae9a8a6SBarry Smith char **PetscGlobalArgs = 0;
329e5c89e4eSSatish Balay 
330e5c89e4eSSatish Balay #undef __FUNCT__
331e5c89e4eSSatish Balay #define __FUNCT__ "PetscGetArgs"
332e5c89e4eSSatish Balay /*@C
333e5c89e4eSSatish Balay    PetscGetArgs - Allows you to access the raw command line arguments anywhere
334e5c89e4eSSatish Balay      after PetscInitialize() is called but before PetscFinalize().
335e5c89e4eSSatish Balay 
336e5c89e4eSSatish Balay    Not Collective
337e5c89e4eSSatish Balay 
338e5c89e4eSSatish Balay    Output Parameters:
339e5c89e4eSSatish Balay +  argc - count of number of command line arguments
340e5c89e4eSSatish Balay -  args - the command line arguments
341e5c89e4eSSatish Balay 
342e5c89e4eSSatish Balay    Level: intermediate
343e5c89e4eSSatish Balay 
344e5c89e4eSSatish Balay    Notes:
345e5c89e4eSSatish Balay       This is usually used to pass the command line arguments into other libraries
346e5c89e4eSSatish Balay    that are called internally deep in PETSc or the application.
347e5c89e4eSSatish Balay 
348e5c89e4eSSatish Balay    Concepts: command line arguments
349e5c89e4eSSatish Balay 
350793721a6SBarry Smith .seealso: PetscFinalize(), PetscInitializeFortran(), PetscGetArguments()
351e5c89e4eSSatish Balay 
352e5c89e4eSSatish Balay @*/
353e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscGetArgs(int *argc,char ***args)
354e5c89e4eSSatish Balay {
355e5c89e4eSSatish Balay   PetscFunctionBegin;
356717030eeSLisandro Dalcin   if (!PetscInitializeCalled && PetscFinalizeCalled) {
357e5c89e4eSSatish Balay     SETERRQ(PETSC_ERR_ORDER,"You must call after PetscInitialize() but before PetscFinalize()");
358e5c89e4eSSatish Balay   }
359e5c89e4eSSatish Balay   *argc = PetscGlobalArgc;
360e5c89e4eSSatish Balay   *args = PetscGlobalArgs;
361e5c89e4eSSatish Balay   PetscFunctionReturn(0);
362e5c89e4eSSatish Balay }
363e5c89e4eSSatish Balay 
364e5c89e4eSSatish Balay #undef __FUNCT__
365793721a6SBarry Smith #define __FUNCT__ "PetscGetArguments"
366793721a6SBarry Smith /*@C
367793721a6SBarry Smith    PetscGetArguments - Allows you to access the  command line arguments anywhere
368793721a6SBarry Smith      after PetscInitialize() is called but before PetscFinalize().
369793721a6SBarry Smith 
370793721a6SBarry Smith    Not Collective
371793721a6SBarry Smith 
372793721a6SBarry Smith    Output Parameters:
373793721a6SBarry Smith .  args - the command line arguments
374793721a6SBarry Smith 
375793721a6SBarry Smith    Level: intermediate
376793721a6SBarry Smith 
377793721a6SBarry Smith    Notes:
378793721a6SBarry Smith       This does NOT start with the program name and IS null terminated (final arg is void)
379793721a6SBarry Smith 
380793721a6SBarry Smith    Concepts: command line arguments
381793721a6SBarry Smith 
382793721a6SBarry Smith .seealso: PetscFinalize(), PetscInitializeFortran(), PetscGetArgs(), PetscFreeArguments()
383793721a6SBarry Smith 
384793721a6SBarry Smith @*/
385793721a6SBarry Smith PetscErrorCode PETSC_DLLEXPORT PetscGetArguments(char ***args)
386793721a6SBarry Smith {
387793721a6SBarry Smith   PetscInt       i,argc = PetscGlobalArgc;
388793721a6SBarry Smith   PetscErrorCode ierr;
389793721a6SBarry Smith 
390793721a6SBarry Smith   PetscFunctionBegin;
391717030eeSLisandro Dalcin   if (!PetscInitializeCalled && PetscFinalizeCalled) {
392793721a6SBarry Smith     SETERRQ(PETSC_ERR_ORDER,"You must call after PetscInitialize() but before PetscFinalize()");
393793721a6SBarry Smith   }
394717030eeSLisandro Dalcin   if (!argc) {*args = 0; PetscFunctionReturn(0);}
395793721a6SBarry Smith   ierr = PetscMalloc(argc*sizeof(char*),args);CHKERRQ(ierr);
396793721a6SBarry Smith   for (i=0; i<argc-1; i++) {
397793721a6SBarry Smith     ierr = PetscStrallocpy(PetscGlobalArgs[i+1],&(*args)[i]);CHKERRQ(ierr);
398793721a6SBarry Smith   }
399793721a6SBarry Smith   (*args)[argc-1] = 0;
400793721a6SBarry Smith   PetscFunctionReturn(0);
401793721a6SBarry Smith }
402793721a6SBarry Smith 
403793721a6SBarry Smith #undef __FUNCT__
404793721a6SBarry Smith #define __FUNCT__ "PetscFreeArguments"
405793721a6SBarry Smith /*@C
406793721a6SBarry Smith    PetscFreeArguments - Frees the memory obtained with PetscGetArguments()
407793721a6SBarry Smith 
408793721a6SBarry Smith    Not Collective
409793721a6SBarry Smith 
410793721a6SBarry Smith    Output Parameters:
411793721a6SBarry Smith .  args - the command line arguments
412793721a6SBarry Smith 
413793721a6SBarry Smith    Level: intermediate
414793721a6SBarry Smith 
415793721a6SBarry Smith    Concepts: command line arguments
416793721a6SBarry Smith 
417793721a6SBarry Smith .seealso: PetscFinalize(), PetscInitializeFortran(), PetscGetArgs(), PetscGetArguments()
418793721a6SBarry Smith 
419793721a6SBarry Smith @*/
420793721a6SBarry Smith PetscErrorCode PETSC_DLLEXPORT PetscFreeArguments(char **args)
421793721a6SBarry Smith {
422793721a6SBarry Smith   PetscInt       i = 0;
423793721a6SBarry Smith   PetscErrorCode ierr;
424793721a6SBarry Smith 
425793721a6SBarry Smith   PetscFunctionBegin;
426717030eeSLisandro Dalcin   if (!args) {PetscFunctionReturn(0);}
427793721a6SBarry Smith   while (args[i]) {
428793721a6SBarry Smith     ierr = PetscFree(args[i]);CHKERRQ(ierr);
429793721a6SBarry Smith     i++;
430793721a6SBarry Smith   }
431793721a6SBarry Smith   ierr = PetscFree(args);CHKERRQ(ierr);
432793721a6SBarry Smith   PetscFunctionReturn(0);
433793721a6SBarry Smith }
434793721a6SBarry Smith 
435793721a6SBarry Smith #undef __FUNCT__
436e5c89e4eSSatish Balay #define __FUNCT__ "PetscInitialize"
437e5c89e4eSSatish Balay /*@C
438e5c89e4eSSatish Balay    PetscInitialize - Initializes the PETSc database and MPI.
439e5c89e4eSSatish Balay    PetscInitialize() calls MPI_Init() if that has yet to be called,
440e5c89e4eSSatish Balay    so this routine should always be called near the beginning of
441e5c89e4eSSatish Balay    your program -- usually the very first line!
442e5c89e4eSSatish Balay 
443e5c89e4eSSatish Balay    Collective on MPI_COMM_WORLD or PETSC_COMM_WORLD if it has been set
444e5c89e4eSSatish Balay 
445e5c89e4eSSatish Balay    Input Parameters:
446e5c89e4eSSatish Balay +  argc - count of number of command line arguments
447e5c89e4eSSatish Balay .  args - the command line arguments
448fc2bca9aSBarry Smith .  file - [optional] PETSc database file, also checks ~username/.petscrc and .petscrc use PETSC_NULL to not check for
449fc2bca9aSBarry Smith           code specific file. Use -skip_petscrc in the code specific file to skip the .petscrc files
450e5c89e4eSSatish Balay -  help - [optional] Help message to print, use PETSC_NULL for no message
451e5c89e4eSSatish Balay 
45205827820SBarry Smith    If you wish PETSc code to run ONLY on a subcommunicator of MPI_COMM_WORLD, create that
45305827820SBarry Smith    communicator first and assign it to PETSC_COMM_WORLD BEFORE calling PetscInitialize(). Thus if you are running a
45405827820SBarry Smith    four process job and two processes will run PETSc and have PetscInitialize() and PetscFinalize() and two process will not,
45505827820SBarry Smith    then do this. If ALL processes in the job are using PetscInitialize() and PetscFinalize() then you don't need to do this, even
45605827820SBarry Smith    if different subcommunicators of the job are doing different things with PETSc.
457e5c89e4eSSatish Balay 
458e5c89e4eSSatish Balay    Options Database Keys:
459e5c89e4eSSatish Balay +  -start_in_debugger [noxterm,dbx,xdb,gdb,...] - Starts program in debugger
460e5c89e4eSSatish Balay .  -on_error_attach_debugger [noxterm,dbx,xdb,gdb,...] - Starts debugger when error detected
461e5c89e4eSSatish Balay .  -on_error_emacs <machinename> causes emacsclient to jump to error file
462b52f573bSBarry Smith .  -on_error_abort calls abort() when error detected (no traceback)
463e8fb0fc0SBarry Smith .  -on_error_mpiabort calls MPI_abort() when error detected
464e8fb0fc0SBarry Smith .  -error_output_stderr prints error messages to stderr instead of the default stdout
465e8fb0fc0SBarry Smith .  -error_output_none does not print the error messages (but handles errors in the same way as if this was not called)
466e5c89e4eSSatish Balay .  -debugger_nodes [node1,node2,...] - Indicates nodes to start in debugger
467e5c89e4eSSatish Balay .  -debugger_pause [sleeptime] (in seconds) - Pauses debugger
468e5c89e4eSSatish Balay .  -stop_for_debugger - Print message on how to attach debugger manually to
469e5c89e4eSSatish Balay                         process and wait (-debugger_pause) seconds for attachment
4702fb0ec9aSBarry Smith .  -malloc - Indicates use of PETSc error-checking malloc (on by default for debug version of libraries)
471e5c89e4eSSatish Balay .  -malloc no - Indicates not to use error-checking malloc
4722fb0ec9aSBarry Smith .  -malloc_debug - check for memory corruption at EVERY malloc or free
473e5c89e4eSSatish Balay .  -fp_trap - Stops on floating point exceptions (Note that on the
474e5c89e4eSSatish Balay               IBM RS6000 this slows code by at least a factor of 10.)
475e5c89e4eSSatish Balay .  -no_signal_handler - Indicates not to trap error signals
476e5c89e4eSSatish Balay .  -shared_tmp - indicates /tmp directory is shared by all processors
477e5c89e4eSSatish Balay .  -not_shared_tmp - each processor has own /tmp
478e5c89e4eSSatish Balay .  -tmp - alternative name of /tmp directory
479e5c89e4eSSatish Balay .  -get_total_flops - returns total flops done by all processors
480e5c89e4eSSatish Balay -  -memory_info - Print memory usage at end of run
481e5c89e4eSSatish Balay 
482e5c89e4eSSatish Balay    Options Database Keys for Profiling:
483e5c89e4eSSatish Balay    See the Profiling chapter of the users manual for details.
484e5c89e4eSSatish Balay +  -log_trace [filename] - Print traces of all PETSc calls
485e5c89e4eSSatish Balay         to the screen (useful to determine where a program
486e5c89e4eSSatish Balay         hangs without running in the debugger).  See PetscLogTraceBegin().
4876cf91177SBarry Smith .  -info <optional filename> - Prints verbose information to the screen
4886cf91177SBarry Smith -  -info_exclude <null,vec,mat,pc,ksp,snes,ts> - Excludes some of the verbose messages
489e5c89e4eSSatish Balay 
490e5c89e4eSSatish Balay    Environmental Variables:
491e5c89e4eSSatish Balay +   PETSC_TMP - alternative tmp directory
492e5c89e4eSSatish Balay .   PETSC_SHARED_TMP - tmp is shared by all processes
493e5c89e4eSSatish Balay .   PETSC_NOT_SHARED_TMP - each process has its own private tmp
494e5c89e4eSSatish Balay .   PETSC_VIEWER_SOCKET_PORT - socket number to use for socket viewer
495e5c89e4eSSatish Balay -   PETSC_VIEWER_SOCKET_MACHINE - machine to use for socket viewer to connect to
496e5c89e4eSSatish Balay 
497e5c89e4eSSatish Balay 
498e5c89e4eSSatish Balay    Level: beginner
499e5c89e4eSSatish Balay 
500e5c89e4eSSatish Balay    Notes:
501e5c89e4eSSatish Balay    If for some reason you must call MPI_Init() separately, call
502e5c89e4eSSatish Balay    it before PetscInitialize().
503e5c89e4eSSatish Balay 
504e5c89e4eSSatish Balay    Fortran Version:
505e5c89e4eSSatish Balay    In Fortran this routine has the format
506e5c89e4eSSatish Balay $       call PetscInitialize(file,ierr)
507e5c89e4eSSatish Balay 
508e5c89e4eSSatish Balay +   ierr - error return code
5093dae0d48SMatthew Knepley -  file - [optional] PETSc database file, also checks ~username/.petscrc and .petscrc use PETSC_NULL_CHARACTER to not check for
510fc2bca9aSBarry Smith           code specific file. Use -skip_petscrc in the code specific file to skip the .petscrc files
511e5c89e4eSSatish Balay 
512e5c89e4eSSatish Balay    Important Fortran Note:
513e5c89e4eSSatish Balay    In Fortran, you MUST use PETSC_NULL_CHARACTER to indicate a
514e5c89e4eSSatish Balay    null character string; you CANNOT just use PETSC_NULL as
515e5c89e4eSSatish Balay    in the C version.  See the users manual for details.
516e5c89e4eSSatish Balay 
517e5c89e4eSSatish Balay 
518e5c89e4eSSatish Balay    Concepts: initializing PETSc
519e5c89e4eSSatish Balay 
5200e4b4fe4Svictor .seealso: PetscFinalize(), PetscInitializeFortran(), PetscGetArgs()
521e5c89e4eSSatish Balay 
522e5c89e4eSSatish Balay @*/
523e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscInitialize(int *argc,char ***args,const char file[],const char help[])
524e5c89e4eSSatish Balay {
525e5c89e4eSSatish Balay   PetscErrorCode ierr;
526aa5bb8c0SSatish Balay   PetscMPIInt    flag, size;
527aa5bb8c0SSatish Balay   PetscInt       nodesize;
528e5c89e4eSSatish Balay   PetscTruth     flg;
529e5c89e4eSSatish Balay   char           hostname[256];
530e5c89e4eSSatish Balay 
531e5c89e4eSSatish Balay   PetscFunctionBegin;
532e5c89e4eSSatish Balay   if (PetscInitializeCalled) PetscFunctionReturn(0);
533e5c89e4eSSatish Balay 
534ae9b4142SLisandro Dalcin   /* these must be initialized in a routine, not as a constant declaration*/
535d89683f4Sbcordonn   PETSC_STDOUT = stdout;
536ae9b4142SLisandro Dalcin   PETSC_STDERR = stderr;
537e5c89e4eSSatish Balay 
538e5c89e4eSSatish Balay   ierr = PetscOptionsCreate();CHKERRQ(ierr);
539e5c89e4eSSatish Balay 
540e5c89e4eSSatish Balay   /*
541e5c89e4eSSatish Balay      We initialize the program name here (before MPI_Init()) because MPICH has a bug in
542e5c89e4eSSatish Balay      it that it sets args[0] on all processors to be args[0] on the first processor.
543e5c89e4eSSatish Balay   */
544e5c89e4eSSatish Balay   if (argc && *argc) {
545e5c89e4eSSatish Balay     ierr = PetscSetProgramName(**args);CHKERRQ(ierr);
546e5c89e4eSSatish Balay   } else {
547e5c89e4eSSatish Balay     ierr = PetscSetProgramName("Unknown Name");CHKERRQ(ierr);
548e5c89e4eSSatish Balay   }
549e5c89e4eSSatish Balay 
550e5c89e4eSSatish Balay   ierr = MPI_Initialized(&flag);CHKERRQ(ierr);
551e5c89e4eSSatish Balay   if (!flag) {
552e8373e55SMatthew Knepley     if (PETSC_COMM_WORLD != MPI_COMM_NULL) SETERRQ(PETSC_ERR_SUP,"You cannot set PETSC_COMM_WORLD if you have not initialized MPI first");
553e5c89e4eSSatish Balay     ierr          = MPI_Init(argc,args);CHKERRQ(ierr);
554e5c89e4eSSatish Balay     PetscBeganMPI = PETSC_TRUE;
555e5c89e4eSSatish Balay   }
556e5c89e4eSSatish Balay   if (argc && args) {
557e5c89e4eSSatish Balay     PetscGlobalArgc = *argc;
558e5c89e4eSSatish Balay     PetscGlobalArgs = *args;
559e5c89e4eSSatish Balay   }
560e5c89e4eSSatish Balay   PetscInitializeCalled = PETSC_TRUE;
561e5c89e4eSSatish Balay   PetscFinalizeCalled   = PETSC_FALSE;
562e5c89e4eSSatish Balay 
563e8373e55SMatthew Knepley   if (PETSC_COMM_WORLD == MPI_COMM_NULL) {
564e5c89e4eSSatish Balay     PETSC_COMM_WORLD = MPI_COMM_WORLD;
565e5c89e4eSSatish Balay   }
566e5c89e4eSSatish Balay 
567e5c89e4eSSatish Balay   /* Done after init due to a bug in MPICH-GM? */
568e5c89e4eSSatish Balay   ierr = PetscErrorPrintfInitialize();CHKERRQ(ierr);
569e5c89e4eSSatish Balay 
570e5c89e4eSSatish Balay   ierr = MPI_Comm_rank(MPI_COMM_WORLD,&PetscGlobalRank);CHKERRQ(ierr);
571e5c89e4eSSatish Balay   ierr = MPI_Comm_size(MPI_COMM_WORLD,&PetscGlobalSize);CHKERRQ(ierr);
572e5c89e4eSSatish Balay 
573e5c89e4eSSatish Balay #if defined(PETSC_USE_COMPLEX)
574e5c89e4eSSatish Balay   /*
575e5c89e4eSSatish Balay      Initialized the global complex variable; this is because with
576e5c89e4eSSatish Balay      shared libraries the constructors for global variables
577e5c89e4eSSatish Balay      are not called; at least on IRIX.
578e5c89e4eSSatish Balay   */
579e5c89e4eSSatish Balay   {
580762437b8SSatish Balay #if defined(PETSC_CLANGUAGE_CXX)
581e5c89e4eSSatish Balay     PetscScalar ic(0.0,1.0);
582e5c89e4eSSatish Balay     PETSC_i = ic;
583b7940d39SSatish Balay #else
5843433f298SSatish Balay     PETSC_i = I;
585b7940d39SSatish Balay #endif
586762437b8SSatish Balay   }
587762437b8SSatish Balay 
588e5c89e4eSSatish Balay   ierr = MPI_Type_contiguous(2,MPIU_REAL,&MPIU_COMPLEX);CHKERRQ(ierr);
589e5c89e4eSSatish Balay   ierr = MPI_Type_commit(&MPIU_COMPLEX);CHKERRQ(ierr);
590e5c89e4eSSatish Balay   ierr = MPI_Op_create(PetscSum_Local,1,&PetscSum_Op);CHKERRQ(ierr);
591e5c89e4eSSatish Balay #endif
592e5c89e4eSSatish Balay 
593e5c89e4eSSatish Balay   /*
594e5c89e4eSSatish Balay      Create the PETSc MPI reduction operator that sums of the first
595e5c89e4eSSatish Balay      half of the entries and maxes the second half.
596e5c89e4eSSatish Balay   */
597e5c89e4eSSatish Balay   ierr = MPI_Op_create(PetscMaxSum_Local,1,&PetscMaxSum_Op);CHKERRQ(ierr);
598e5c89e4eSSatish Balay 
599e5c89e4eSSatish Balay   ierr = MPI_Type_contiguous(2,MPIU_SCALAR,&MPIU_2SCALAR);CHKERRQ(ierr);
600e5c89e4eSSatish Balay   ierr = MPI_Type_commit(&MPIU_2SCALAR);CHKERRQ(ierr);
601e5c89e4eSSatish Balay   ierr = MPI_Op_create(PetscADMax_Local,1,&PetscADMax_Op);CHKERRQ(ierr);
602e5c89e4eSSatish Balay   ierr = MPI_Op_create(PetscADMin_Local,1,&PetscADMin_Op);CHKERRQ(ierr);
603e5c89e4eSSatish Balay 
604e5c89e4eSSatish Balay   ierr = MPI_Type_contiguous(2,MPIU_INT,&MPIU_2INT);CHKERRQ(ierr);
605e5c89e4eSSatish Balay   ierr = MPI_Type_commit(&MPIU_2INT);CHKERRQ(ierr);
606e5c89e4eSSatish Balay 
607e5c89e4eSSatish Balay   /*
608*480cf27aSJed Brown      Attributes to be set on PETSc communicators
609*480cf27aSJed Brown   */
610*480cf27aSJed Brown   ierr = MPI_Keyval_create(MPI_NULL_COPY_FN,Petsc_DelCounter,&Petsc_Counter_keyval,(void*)0);CHKERRQ(ierr);
611*480cf27aSJed Brown   ierr = MPI_Keyval_create(MPI_NULL_COPY_FN,Petsc_DelComm,&Petsc_InnerComm_keyval,(void*)0);CHKERRQ(ierr);
612*480cf27aSJed Brown   ierr = MPI_Keyval_create(MPI_NULL_COPY_FN,Petsc_DelComm,&Petsc_OuterComm_keyval,(void*)0);CHKERRQ(ierr);
613*480cf27aSJed Brown 
614*480cf27aSJed Brown   /*
615e8fb0fc0SBarry Smith      Build the options database
616e5c89e4eSSatish Balay   */
617e5c89e4eSSatish Balay   ierr = PetscOptionsInsert(argc,args,file);CHKERRQ(ierr);
618e5c89e4eSSatish Balay 
6196dc8fec2Sbcordonn 
620e5c89e4eSSatish Balay   /*
621e5c89e4eSSatish Balay      Print main application help message
622e5c89e4eSSatish Balay   */
623e5c89e4eSSatish Balay   ierr = PetscOptionsHasName(PETSC_NULL,"-help",&flg);CHKERRQ(ierr);
624e5c89e4eSSatish Balay   if (help && flg) {
625e5c89e4eSSatish Balay     ierr = PetscPrintf(PETSC_COMM_WORLD,help);CHKERRQ(ierr);
626e5c89e4eSSatish Balay   }
627e5c89e4eSSatish Balay   ierr = PetscOptionsCheckInitial_Private();CHKERRQ(ierr);
628e5c89e4eSSatish Balay 
629e5c89e4eSSatish Balay   /* SHOULD PUT IN GUARDS: Make sure logging is initialized, even if we do not print it out */
630a9f03627SSatish Balay #if defined(PETSC_USE_LOG)
631e5c89e4eSSatish Balay   ierr = PetscLogBegin_Private();CHKERRQ(ierr);
632a9f03627SSatish Balay #endif
633e5c89e4eSSatish Balay 
634e5c89e4eSSatish Balay   /*
635e5c89e4eSSatish Balay      Load the dynamic libraries (on machines that support them), this registers all
636e5c89e4eSSatish Balay      the solvers etc. (On non-dynamic machines this initializes the PetscDraw and PetscViewer classes)
637e5c89e4eSSatish Balay   */
638e5c89e4eSSatish Balay   ierr = PetscInitialize_DynamicLibraries();CHKERRQ(ierr);
639e5c89e4eSSatish Balay 
640e5c89e4eSSatish Balay   ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRQ(ierr);
641ae15b995SBarry Smith   ierr = PetscInfo1(0,"PETSc successfully started: number of processors = %d\n",size);CHKERRQ(ierr);
642e5c89e4eSSatish Balay   ierr = PetscGetHostName(hostname,256);CHKERRQ(ierr);
643ae15b995SBarry Smith   ierr = PetscInfo1(0,"Running on machine: %s\n",hostname);CHKERRQ(ierr);
644e5c89e4eSSatish Balay 
645e5c89e4eSSatish Balay   ierr = PetscOptionsCheckInitial_Components();CHKERRQ(ierr);
646ef6c6fedSBoyana Norris   /* Check the options database for options related to the options database itself */
647ef6c6fedSBoyana Norris   ierr = PetscOptionsSetFromOptions();CHKERRQ(ierr);
648ef6c6fedSBoyana Norris 
649951e3c8eSBarry Smith #if defined(PETSC_USE_PETSC_MPI_EXTERNAL32)
650e39fd77fSBarry Smith   /*
651e39fd77fSBarry Smith       Tell MPI about our own data representation converter, this would/should be used if extern32 is not supported by the MPI
652e39fd77fSBarry Smith 
653e39fd77fSBarry Smith       Currently not used because it is not supported by MPICH.
654e39fd77fSBarry Smith   */
655e39fd77fSBarry Smith #if !defined(PETSC_WORDS_BIGENDIAN)
656708350f5SSatish Balay   ierr = MPI_Register_datarep((char *)"petsc",PetscDataRep_read_conv_fn,PetscDataRep_write_conv_fn,PetscDataRep_extent_fn,PETSC_NULL);CHKERRQ(ierr);
657e39fd77fSBarry Smith #endif
658951e3c8eSBarry Smith #endif
659e39fd77fSBarry Smith 
660793721a6SBarry Smith   ierr = PetscOptionsGetInt(PETSC_NULL,"-openmp_spawn_size",&nodesize,&flg);CHKERRQ(ierr);
661793721a6SBarry Smith   if (flg) {
66223464e94SBarry Smith #if defined(PETSC_HAVE_MPI_COMM_SPAWN)
663aa5bb8c0SSatish Balay     ierr = PetscOpenMPSpawn((PetscMPIInt) nodesize);CHKERRQ(ierr);
66423464e94SBarry Smith #else
6650205a749SBarry Smith     SETERRQ(PETSC_ERR_SUP,"PETSc built without MPI 2 (MPI_Comm_spawn) support, use -openmp_merge_size instead");
66623464e94SBarry Smith #endif
667793721a6SBarry Smith   } else {
66823464e94SBarry Smith     ierr = PetscOptionsGetInt(PETSC_NULL,"-openmp_merge_size",&nodesize,&flg);CHKERRQ(ierr);
6698002f1cdSBarry Smith     if (flg) {
670aa5bb8c0SSatish Balay       ierr = PetscOpenMPMerge((PetscMPIInt) nodesize);CHKERRQ(ierr);
6718002f1cdSBarry Smith     }
672793721a6SBarry Smith   }
67390d69ab7SBarry Smith   flg  = PETSC_FALSE;
67490d69ab7SBarry Smith   ierr = PetscOptionsGetTruth(PETSC_NULL,"-python",&flg,PETSC_NULL);CHKERRQ(ierr);
675192daf7cSBarry Smith   if (flg) {ierr = PetscPythonInitialize(PETSC_NULL,PETSC_NULL);CHKERRQ(ierr);}
676e5c89e4eSSatish Balay 
677e5c89e4eSSatish Balay   PetscFunctionReturn(ierr);
678e5c89e4eSSatish Balay }
679e5c89e4eSSatish Balay 
680e5c89e4eSSatish Balay 
681e5c89e4eSSatish Balay #undef __FUNCT__
682e5c89e4eSSatish Balay #define __FUNCT__ "PetscFinalize"
683e5c89e4eSSatish Balay /*@C
684e5c89e4eSSatish Balay    PetscFinalize - Checks for options to be called at the conclusion
685e5c89e4eSSatish Balay    of the program. MPI_Finalize() is called only if the user had not
686e5c89e4eSSatish Balay    called MPI_Init() before calling PetscInitialize().
687e5c89e4eSSatish Balay 
688e5c89e4eSSatish Balay    Collective on PETSC_COMM_WORLD
689e5c89e4eSSatish Balay 
690e5c89e4eSSatish Balay    Options Database Keys:
691e5c89e4eSSatish Balay +  -options_table - Calls PetscOptionsPrint()
692e5c89e4eSSatish Balay .  -options_left - Prints unused options that remain in the database
693e5c89e4eSSatish Balay .  -options_left no - Does not print unused options that remain in the database
694e5c89e4eSSatish Balay .  -mpidump - Calls PetscMPIDump()
695e5c89e4eSSatish Balay .  -malloc_dump - Calls PetscMallocDump()
696e5c89e4eSSatish Balay .  -malloc_info - Prints total memory usage
697e5c89e4eSSatish Balay -  -malloc_log - Prints summary of memory usage
698e5c89e4eSSatish Balay 
699e5c89e4eSSatish Balay    Options Database Keys for Profiling:
700e5c89e4eSSatish Balay    See the Profiling chapter of the users manual for details.
701e5c89e4eSSatish Balay +  -log_summary [filename] - Prints summary of flop and timing
702e5c89e4eSSatish Balay         information to screen. If the filename is specified the
703e5c89e4eSSatish Balay         summary is written to the file. (for code compiled with
704e5c89e4eSSatish Balay         PETSC_USE_LOG).  See PetscLogPrintSummary().
705e5c89e4eSSatish Balay .  -log_all [filename] - Logs extensive profiling information
706e5c89e4eSSatish Balay         (for code compiled with PETSC_USE_LOG). See PetscLogDump().
707e5c89e4eSSatish Balay .  -log [filename] - Logs basic profiline information (for
708e5c89e4eSSatish Balay         code compiled with PETSC_USE_LOG).  See PetscLogDump().
709e5c89e4eSSatish Balay .  -log_sync - Log the synchronization in scatters, inner products
710e5c89e4eSSatish Balay         and norms
711e5c89e4eSSatish Balay -  -log_mpe [filename] - Creates a logfile viewable by the
712e5c89e4eSSatish Balay       utility Upshot/Nupshot (in MPICH distribution)
713e5c89e4eSSatish Balay 
714e5c89e4eSSatish Balay    Level: beginner
715e5c89e4eSSatish Balay 
716e5c89e4eSSatish Balay    Note:
717e5c89e4eSSatish Balay    See PetscInitialize() for more general runtime options.
718e5c89e4eSSatish Balay 
719e5c89e4eSSatish Balay .seealso: PetscInitialize(), PetscOptionsPrint(), PetscMallocDump(), PetscMPIDump(), PetscEnd()
720e5c89e4eSSatish Balay @*/
721e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscFinalize(void)
722e5c89e4eSSatish Balay {
723e5c89e4eSSatish Balay   PetscErrorCode ierr;
724e5c89e4eSSatish Balay   PetscMPIInt    rank;
725e5c89e4eSSatish Balay   int            nopt;
72690d69ab7SBarry Smith   PetscTruth     flg1 = PETSC_FALSE,flg2 = PETSC_FALSE,flg3 = PETSC_FALSE;
727ac8aedf1SMatthew Knepley   extern FILE   *PETSC_ZOPEFD;
728e5c89e4eSSatish Balay 
729e5c89e4eSSatish Balay   PetscFunctionBegin;
730e5c89e4eSSatish Balay 
731e5c89e4eSSatish Balay   if (!PetscInitializeCalled) {
732e5c89e4eSSatish Balay     (*PetscErrorPrintf)("PetscInitialize() must be called before PetscFinalize()\n");
733e5c89e4eSSatish Balay     PetscFunctionReturn(0);
734e5c89e4eSSatish Balay   }
735b022a5c1SBarry Smith   ierr = PetscInfo(PETSC_NULL,"PetscFinalize() called\n");
736b022a5c1SBarry Smith 
7378002f1cdSBarry Smith   ierr = PetscOpenMPFinalize();CHKERRQ(ierr);
7388002f1cdSBarry Smith 
73990d69ab7SBarry Smith   ierr = PetscOptionsGetTruth(PETSC_NULL,"-python",&flg1,PETSC_NULL);CHKERRQ(ierr);
740192daf7cSBarry Smith   if (flg1) {ierr = PetscPythonFinalize();CHKERRQ(ierr);}
741192daf7cSBarry Smith 
742e5c89e4eSSatish Balay   ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr);
74390d69ab7SBarry Smith   ierr = PetscOptionsGetTruth(PETSC_NULL,"-malloc_info",&flg2,PETSC_NULL);CHKERRQ(ierr);
744e5c89e4eSSatish Balay   if (!flg2) {
74590d69ab7SBarry Smith     flg2 = PETSC_FALSE;
74690d69ab7SBarry Smith     ierr = PetscOptionsGetTruth(PETSC_NULL,"-memory_info",&flg2,PETSC_NULL);CHKERRQ(ierr);
747e5c89e4eSSatish Balay   }
748e5c89e4eSSatish Balay   if (flg2) {
749e5c89e4eSSatish Balay     ierr = PetscMemoryShowUsage(PETSC_VIEWER_STDOUT_WORLD,"Summary of Memory Usage in PETSc\n");CHKERRQ(ierr);
750e5c89e4eSSatish Balay   }
751e5c89e4eSSatish Balay 
7523fa76a5bSLisandro Dalcin   /*
7533fa76a5bSLisandro Dalcin      Free all objects registered with PetscObjectRegisterDestroy() such as PETSC_VIEWER_XXX_().
7543fa76a5bSLisandro Dalcin   */
7553fa76a5bSLisandro Dalcin   ierr = PetscObjectRegisterDestroyAll();CHKERRQ(ierr);
7563fa76a5bSLisandro Dalcin 
7573fa76a5bSLisandro Dalcin   /*
7583fa76a5bSLisandro Dalcin        Free all the registered create functions, such as KSPList, VecList, SNESList, etc
7593fa76a5bSLisandro Dalcin   */
7603fa76a5bSLisandro Dalcin   ierr = PetscFListDestroyAll();CHKERRQ(ierr);
7613fa76a5bSLisandro Dalcin 
7623fa76a5bSLisandro Dalcin   /*
7633fa76a5bSLisandro Dalcin      Destroy any packages that registered a finalize
7643fa76a5bSLisandro Dalcin   */
765eb8be38cSBarry Smith   ierr = PetscRegisterFinalizeAll();CHKERRQ(ierr);
766e5c89e4eSSatish Balay 
767e5c89e4eSSatish Balay   /*
768e5c89e4eSSatish Balay      Destroy all the function registration lists created
769e5c89e4eSSatish Balay   */
770e5c89e4eSSatish Balay   ierr = PetscFinalize_DynamicLibraries();CHKERRQ(ierr);
771e5c89e4eSSatish Balay 
772e5c89e4eSSatish Balay #if defined(PETSC_USE_LOG)
77390d69ab7SBarry Smith   flg1 = PETSC_FALSE;
77490d69ab7SBarry Smith   ierr = PetscOptionsGetTruth(PETSC_NULL,"-get_total_flops",&flg1,PETSC_NULL);CHKERRQ(ierr);
775e5c89e4eSSatish Balay   if (flg1) {
776e5c89e4eSSatish Balay     PetscLogDouble flops = 0;
777e5c89e4eSSatish Balay     ierr = MPI_Reduce(&_TotalFlops,&flops,1,MPI_DOUBLE,MPI_SUM,0,PETSC_COMM_WORLD);CHKERRQ(ierr);
778e5c89e4eSSatish Balay     ierr = PetscPrintf(PETSC_COMM_WORLD,"Total flops over all processors %g\n",flops);CHKERRQ(ierr);
779e5c89e4eSSatish Balay   }
780e5c89e4eSSatish Balay #endif
781e5c89e4eSSatish Balay 
78261b37b28SSatish Balay   ierr = PetscOptionsHelpDestroyList();CHKERRQ(ierr);
783e5c89e4eSSatish Balay 
784e5c89e4eSSatish Balay #if defined(PETSC_USE_DEBUG)
785e5c89e4eSSatish Balay   if (PetscStackActive) {
786e5c89e4eSSatish Balay     ierr = PetscStackDestroy();CHKERRQ(ierr);
787e5c89e4eSSatish Balay   }
788e5c89e4eSSatish Balay #endif
789e5c89e4eSSatish Balay 
790e5c89e4eSSatish Balay #if defined(PETSC_USE_LOG)
791e5c89e4eSSatish Balay   {
792e5c89e4eSSatish Balay     char mname[PETSC_MAX_PATH_LEN];
793e5c89e4eSSatish Balay #if defined(PETSC_HAVE_MPE)
794e5c89e4eSSatish Balay     mname[0] = 0;
795e5c89e4eSSatish Balay     ierr = PetscOptionsGetString(PETSC_NULL,"-log_mpe",mname,PETSC_MAX_PATH_LEN,&flg1);CHKERRQ(ierr);
796e5c89e4eSSatish Balay     if (flg1){
797e5c89e4eSSatish Balay       if (mname[0]) {ierr = PetscLogMPEDump(mname);CHKERRQ(ierr);}
798e5c89e4eSSatish Balay       else          {ierr = PetscLogMPEDump(0);CHKERRQ(ierr);}
799e5c89e4eSSatish Balay     }
800e5c89e4eSSatish Balay #endif
801e5c89e4eSSatish Balay     mname[0] = 0;
802e5c89e4eSSatish Balay     ierr = PetscOptionsGetString(PETSC_NULL,"-log_summary",mname,PETSC_MAX_PATH_LEN,&flg1);CHKERRQ(ierr);
803e5c89e4eSSatish Balay     if (flg1) {
804e5c89e4eSSatish Balay       if (mname[0])  {ierr = PetscLogPrintSummary(PETSC_COMM_WORLD,mname);CHKERRQ(ierr);}
805e5c89e4eSSatish Balay       else           {ierr = PetscLogPrintSummary(PETSC_COMM_WORLD,0);CHKERRQ(ierr);}
806e5c89e4eSSatish Balay     }
807e5c89e4eSSatish Balay 
80878392ef1SBarry Smith     ierr = PetscOptionsGetString(PETSC_NULL,"-log_detailed",mname,PETSC_MAX_PATH_LEN,&flg1);CHKERRQ(ierr);
80978392ef1SBarry Smith     if (flg1) {
81078392ef1SBarry Smith       if (mname[0])  {ierr = PetscLogPrintDetailed(PETSC_COMM_WORLD,mname);CHKERRQ(ierr);}
81178392ef1SBarry Smith       else           {ierr = PetscLogPrintDetailed(PETSC_COMM_WORLD,0);CHKERRQ(ierr);}
81278392ef1SBarry Smith     }
81378392ef1SBarry Smith 
814e5c89e4eSSatish Balay     mname[0] = 0;
815e5c89e4eSSatish Balay     ierr = PetscOptionsGetString(PETSC_NULL,"-log_all",mname,PETSC_MAX_PATH_LEN,&flg1);CHKERRQ(ierr);
816e5c89e4eSSatish Balay     ierr = PetscOptionsGetString(PETSC_NULL,"-log",mname,PETSC_MAX_PATH_LEN,&flg2);CHKERRQ(ierr);
817e5c89e4eSSatish Balay     if (flg1 || flg2){
818e5c89e4eSSatish Balay       if (mname[0]) PetscLogDump(mname);
819e5c89e4eSSatish Balay       else          PetscLogDump(0);
820e5c89e4eSSatish Balay     }
821e5c89e4eSSatish Balay     ierr = PetscLogDestroy();CHKERRQ(ierr);
822e5c89e4eSSatish Balay   }
823e5c89e4eSSatish Balay #endif
82490d69ab7SBarry Smith   flg1 = PETSC_FALSE;
82590d69ab7SBarry Smith   ierr = PetscOptionsGetTruth(PETSC_NULL,"-no_signal_handler",&flg1,PETSC_NULL);CHKERRQ(ierr);
826e5c89e4eSSatish Balay   if (!flg1) { ierr = PetscPopSignalHandler();CHKERRQ(ierr);}
82790d69ab7SBarry Smith   flg1 = PETSC_FALSE;
82890d69ab7SBarry Smith   ierr = PetscOptionsGetTruth(PETSC_NULL,"-mpidump",&flg1,PETSC_NULL);CHKERRQ(ierr);
829e5c89e4eSSatish Balay   if (flg1) {
830e5c89e4eSSatish Balay     ierr = PetscMPIDump(stdout);CHKERRQ(ierr);
831e5c89e4eSSatish Balay   }
83290d69ab7SBarry Smith   flg1 = PETSC_FALSE;
83390d69ab7SBarry Smith   flg2 = PETSC_FALSE;
83490d69ab7SBarry Smith   ierr = PetscOptionsGetTruth(PETSC_NULL,"-malloc_dump",&flg1,PETSC_NULL);CHKERRQ(ierr);
83590d69ab7SBarry Smith   ierr = PetscOptionsGetTruth(PETSC_NULL,"-options_table",&flg2,PETSC_NULL);CHKERRQ(ierr);
836e5c89e4eSSatish Balay   if (flg2) {
837e5c89e4eSSatish Balay     if (!rank) {ierr = PetscOptionsPrint(stdout);CHKERRQ(ierr);}
838e5c89e4eSSatish Balay   }
839e5c89e4eSSatish Balay 
840e5c89e4eSSatish Balay   /* to prevent PETSc -options_left from warning */
8417122e292SLisandro Dalcin   ierr = PetscOptionsHasName(PETSC_NULL,"-nox",&flg1);CHKERRQ(ierr)
842e5c89e4eSSatish Balay   ierr = PetscOptionsHasName(PETSC_NULL,"-nox_warning",&flg1);CHKERRQ(ierr)
843e5c89e4eSSatish Balay 
844f43cc0c9SSatish Balay   if (!PetscOpenMPWorker) { /* worker processes skip this because they do not usually process options */
84533fc4174SSatish Balay     flg3 = PETSC_FALSE; /* default value is required */
846da8b8a77SBarry Smith     ierr = PetscOptionsGetTruth(PETSC_NULL,"-options_left",&flg3,&flg1);CHKERRQ(ierr);
847e5c89e4eSSatish Balay     ierr = PetscOptionsAllUsed(&nopt);CHKERRQ(ierr);
848e5c89e4eSSatish Balay     if (flg3) {
849e5c89e4eSSatish Balay       if (!flg2) { /* have not yet printed the options */
850e5c89e4eSSatish Balay 	ierr = PetscOptionsPrint(stdout);CHKERRQ(ierr);
851e5c89e4eSSatish Balay       }
852e5c89e4eSSatish Balay       if (!nopt) {
853e5c89e4eSSatish Balay 	ierr = PetscPrintf(PETSC_COMM_WORLD,"There are no unused options.\n");CHKERRQ(ierr);
854e5c89e4eSSatish Balay       } else if (nopt == 1) {
855e5c89e4eSSatish Balay 	ierr = PetscPrintf(PETSC_COMM_WORLD,"There is one unused database option. It is:\n");CHKERRQ(ierr);
856e5c89e4eSSatish Balay       } else {
857e5c89e4eSSatish Balay 	ierr = PetscPrintf(PETSC_COMM_WORLD,"There are %d unused database options. They are:\n",nopt);CHKERRQ(ierr);
858e5c89e4eSSatish Balay       }
859e5c89e4eSSatish Balay     }
860e5c89e4eSSatish Balay #if defined(PETSC_USE_DEBUG)
861da8b8a77SBarry Smith     if (nopt && !flg3 && !flg1) {
862e5c89e4eSSatish Balay       ierr = PetscPrintf(PETSC_COMM_WORLD,"WARNING! There are options you set that were not used!\n");CHKERRQ(ierr);
863e5c89e4eSSatish Balay       ierr = PetscPrintf(PETSC_COMM_WORLD,"WARNING! could be spelling mistake, etc!\n");CHKERRQ(ierr);
864e5c89e4eSSatish Balay       ierr = PetscOptionsLeft();CHKERRQ(ierr);
865e5c89e4eSSatish Balay     } else if (nopt && flg3) {
866e5c89e4eSSatish Balay #else
867e5c89e4eSSatish Balay     if (nopt && flg3) {
868e5c89e4eSSatish Balay #endif
869e5c89e4eSSatish Balay       ierr = PetscOptionsLeft();CHKERRQ(ierr);
870e5c89e4eSSatish Balay     }
871931f367cSBarry Smith   }
872e5c89e4eSSatish Balay 
87390d69ab7SBarry Smith   flg1 = PETSC_FALSE;
87490d69ab7SBarry Smith   ierr = PetscOptionsGetTruth(PETSC_NULL,"-log_history",&flg1,PETSC_NULL);CHKERRQ(ierr);
875e5c89e4eSSatish Balay   if (flg1) {
876e5c89e4eSSatish Balay     ierr = PetscLogCloseHistoryFile(&petsc_history);CHKERRQ(ierr);
877e5c89e4eSSatish Balay     petsc_history = 0;
878e5c89e4eSSatish Balay   }
879e5c89e4eSSatish Balay 
8806cf91177SBarry Smith   ierr = PetscInfoAllow(PETSC_FALSE,PETSC_NULL);CHKERRQ(ierr);
881e5c89e4eSSatish Balay 
88290d69ab7SBarry Smith   flg1 = PETSC_FALSE;
88390d69ab7SBarry Smith   flg3 = PETSC_FALSE;
88490d69ab7SBarry Smith   ierr = PetscOptionsGetTruth(PETSC_NULL,"-malloc_dump",&flg1,PETSC_NULL);CHKERRQ(ierr);
88590d69ab7SBarry Smith   ierr = PetscOptionsGetTruth(PETSC_NULL,"-malloc_log",&flg3,PETSC_NULL);CHKERRQ(ierr);
886e5c89e4eSSatish Balay   if (flg1) {
887e5c89e4eSSatish Balay     char fname[PETSC_MAX_PATH_LEN];
888e5c89e4eSSatish Balay     FILE *fd;
889ed9cf6e9SBarry Smith     int  err;
890e5c89e4eSSatish Balay 
891e5c89e4eSSatish Balay     fname[0] = 0;
892e5c89e4eSSatish Balay     ierr = PetscOptionsGetString(PETSC_NULL,"-malloc_dump",fname,250,&flg1);CHKERRQ(ierr);
893e5c89e4eSSatish Balay     if (flg1 && fname[0]) {
894e5c89e4eSSatish Balay       char sname[PETSC_MAX_PATH_LEN];
895e5c89e4eSSatish Balay 
896e5c89e4eSSatish Balay       sprintf(sname,"%s_%d",fname,rank);
897e5c89e4eSSatish Balay       fd   = fopen(sname,"w"); if (!fd) SETERRQ1(PETSC_ERR_FILE_OPEN,"Cannot open log file: %s",sname);
898e5c89e4eSSatish Balay       ierr = PetscMallocDump(fd);CHKERRQ(ierr);
899ed9cf6e9SBarry Smith       err = fclose(fd);
900ed9cf6e9SBarry Smith       if (err) SETERRQ(PETSC_ERR_SYS,"fclose() failed on file");
901e5c89e4eSSatish Balay     } else {
902e5c89e4eSSatish Balay       MPI_Comm local_comm;
903e5c89e4eSSatish Balay 
904e5c89e4eSSatish Balay       ierr = MPI_Comm_dup(MPI_COMM_WORLD,&local_comm);CHKERRQ(ierr);
905e5c89e4eSSatish Balay       ierr = PetscSequentialPhaseBegin_Private(local_comm,1);CHKERRQ(ierr);
906e5c89e4eSSatish Balay         ierr = PetscMallocDump(stdout);CHKERRQ(ierr);
907e5c89e4eSSatish Balay       ierr = PetscSequentialPhaseEnd_Private(local_comm,1);CHKERRQ(ierr);
908e5c89e4eSSatish Balay       ierr = MPI_Comm_free(&local_comm);CHKERRQ(ierr);
909e5c89e4eSSatish Balay     }
910e5c89e4eSSatish Balay   }
911e5c89e4eSSatish Balay   if (flg3) {
912e5c89e4eSSatish Balay     char fname[PETSC_MAX_PATH_LEN];
913e5c89e4eSSatish Balay     FILE *fd;
914e5c89e4eSSatish Balay 
915e5c89e4eSSatish Balay     fname[0] = 0;
916e5c89e4eSSatish Balay     ierr = PetscOptionsGetString(PETSC_NULL,"-malloc_log",fname,250,&flg1);CHKERRQ(ierr);
917e5c89e4eSSatish Balay     if (flg1 && fname[0]) {
918e5c89e4eSSatish Balay       char sname[PETSC_MAX_PATH_LEN];
919ed9cf6e9SBarry Smith       int  err;
920e5c89e4eSSatish Balay 
921e5c89e4eSSatish Balay       sprintf(sname,"%s_%d",fname,rank);
922e5c89e4eSSatish Balay       fd   = fopen(sname,"w"); if (!fd) SETERRQ1(PETSC_ERR_FILE_OPEN,"Cannot open log file: %s",sname);
923e5c89e4eSSatish Balay       ierr = PetscMallocDumpLog(fd);CHKERRQ(ierr);
924ed9cf6e9SBarry Smith       err = fclose(fd);
925ed9cf6e9SBarry Smith       if (err) SETERRQ(PETSC_ERR_SYS,"fclose() failed on file");
926e5c89e4eSSatish Balay     } else {
927e5c89e4eSSatish Balay       ierr = PetscMallocDumpLog(stdout);CHKERRQ(ierr);
928e5c89e4eSSatish Balay     }
929e5c89e4eSSatish Balay   }
930e5c89e4eSSatish Balay   /* Can be destroyed only after all the options are used */
931e5c89e4eSSatish Balay   ierr = PetscOptionsDestroy();CHKERRQ(ierr);
932e5c89e4eSSatish Balay 
933e5c89e4eSSatish Balay   PetscGlobalArgc = 0;
934e5c89e4eSSatish Balay   PetscGlobalArgs = 0;
935e5c89e4eSSatish Balay 
936e5c89e4eSSatish Balay #if defined(PETSC_USE_COMPLEX)
937e5c89e4eSSatish Balay   ierr = MPI_Op_free(&PetscSum_Op);CHKERRQ(ierr);
938e5c89e4eSSatish Balay   ierr = MPI_Type_free(&MPIU_COMPLEX);CHKERRQ(ierr);
939e5c89e4eSSatish Balay #endif
940e5c89e4eSSatish Balay   ierr = MPI_Type_free(&MPIU_2SCALAR);CHKERRQ(ierr);
941e5c89e4eSSatish Balay   ierr = MPI_Type_free(&MPIU_2INT);CHKERRQ(ierr);
942e5c89e4eSSatish Balay   ierr = MPI_Op_free(&PetscMaxSum_Op);CHKERRQ(ierr);
943e5c89e4eSSatish Balay   ierr = MPI_Op_free(&PetscADMax_Op);CHKERRQ(ierr);
944e5c89e4eSSatish Balay   ierr = MPI_Op_free(&PetscADMin_Op);CHKERRQ(ierr);
945e5c89e4eSSatish Balay 
946*480cf27aSJed Brown   ierr = MPI_Keyval_free(&Petsc_Counter_keyval);CHKERRQ(ierr);
947*480cf27aSJed Brown   ierr = MPI_Keyval_free(&Petsc_InnerComm_keyval);CHKERRQ(ierr);
948*480cf27aSJed Brown   ierr = MPI_Keyval_free(&Petsc_OuterComm_keyval);CHKERRQ(ierr);
949*480cf27aSJed Brown 
950ae15b995SBarry Smith   ierr = PetscInfo(0,"PETSc successfully ended!\n");CHKERRQ(ierr);
951e5c89e4eSSatish Balay   if (PetscBeganMPI) {
95299608316SBarry Smith #if defined(PETSC_HAVE_MPI_FINALIZED)
95399b1327fSBarry Smith     PetscMPIInt flag;
95499b1327fSBarry Smith     ierr = MPI_Finalized(&flag);CHKERRQ(ierr);
95599b1327fSBarry Smith     if (flag) SETERRQ(PETSC_ERR_LIB,"MPI_Finalize() has already been called, even though MPI_Init() was called by PetscInitialize()");
95699608316SBarry Smith #endif
957e5c89e4eSSatish Balay     ierr = MPI_Finalize();CHKERRQ(ierr);
958e5c89e4eSSatish Balay   }
959e5c89e4eSSatish Balay 
96022b84c2fSbcordonn   if(PETSC_ZOPEFD != NULL){
96122b84c2fSbcordonn     if (PETSC_ZOPEFD != PETSC_STDOUT) fprintf(PETSC_ZOPEFD, "<<<end>>>");
96222b84c2fSbcordonn     else fprintf(PETSC_STDOUT, "<<<end>>>");}
96336186564Sbcordonn 
964e5c89e4eSSatish Balay /*
965e5c89e4eSSatish Balay 
966e5c89e4eSSatish Balay      Note: In certain cases PETSC_COMM_WORLD is never MPI_Comm_free()ed because
967e5c89e4eSSatish Balay    the communicator has some outstanding requests on it. Specifically if the
968e5c89e4eSSatish Balay    flag PETSC_HAVE_BROKEN_REQUEST_FREE is set (for IBM MPI implementation). See
969e5c89e4eSSatish Balay    src/vec/utils/vpscat.c. Due to this the memory allocated in PetscCommDuplicate()
970e5c89e4eSSatish Balay    is never freed as it should be. Thus one may obtain messages of the form
9710e5e90baSSatish Balay    [ 1] 8 bytes PetscCommDuplicate() line 645 in src/sys/mpiu.c indicating the
972e5c89e4eSSatish Balay    memory was not freed.
973e5c89e4eSSatish Balay 
974e5c89e4eSSatish Balay */
9751d1a0024SBarry Smith   ierr = PetscMallocClear();CHKERRQ(ierr);
976e5c89e4eSSatish Balay   PetscInitializeCalled = PETSC_FALSE;
977e5c89e4eSSatish Balay   PetscFinalizeCalled   = PETSC_TRUE;
978e5c89e4eSSatish Balay   PetscFunctionReturn(ierr);
979e5c89e4eSSatish Balay }
980e5c89e4eSSatish Balay 
981e5c89e4eSSatish Balay /*
982e5c89e4eSSatish Balay      These may be used in code that ADIC is to be used on
983e5c89e4eSSatish Balay */
984e5c89e4eSSatish Balay 
985e5c89e4eSSatish Balay #undef __FUNCT__
986e5c89e4eSSatish Balay #define __FUNCT__ "PetscGlobalMax"
98799f316e7SMatthew Knepley /*@
988e5c89e4eSSatish Balay       PetscGlobalMax - Computes the maximum value over several processors
989e5c89e4eSSatish Balay 
990e5c89e4eSSatish Balay      Collective on MPI_Comm
991e5c89e4eSSatish Balay 
992e5c89e4eSSatish Balay    Input Parameters:
993e5c89e4eSSatish Balay +   local - the local value
994e5c89e4eSSatish Balay -   comm - the processors that find the maximum
995e5c89e4eSSatish Balay 
996e5c89e4eSSatish Balay    Output Parameter:
997e5c89e4eSSatish Balay .   result - the maximum value
998e5c89e4eSSatish Balay 
999e5c89e4eSSatish Balay    Level: intermediate
1000e5c89e4eSSatish Balay 
1001e5c89e4eSSatish Balay    Notes:
1002e5c89e4eSSatish Balay      These functions are to be used inside user functions that are to be processed with
1003e5c89e4eSSatish Balay    ADIC. PETSc will automatically provide differentiated versions of these functions
1004e5c89e4eSSatish Balay 
1005e5c89e4eSSatish Balay .seealso: PetscGlobalMin(), PetscGlobalSum()
1006e5c89e4eSSatish Balay @*/
1007e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscGlobalMax(PetscReal* local,PetscReal* result,MPI_Comm comm)
1008e5c89e4eSSatish Balay {
1009e5c89e4eSSatish Balay   return MPI_Allreduce(local,result,1,MPIU_REAL,MPI_MAX,comm);
1010e5c89e4eSSatish Balay }
1011e5c89e4eSSatish Balay 
1012e5c89e4eSSatish Balay #undef __FUNCT__
1013e5c89e4eSSatish Balay #define __FUNCT__ "PetscGlobalMin"
101499f316e7SMatthew Knepley /*@
1015e5c89e4eSSatish Balay       PetscGlobalMin - Computes the minimum value over several processors
1016e5c89e4eSSatish Balay 
1017e5c89e4eSSatish Balay      Collective on MPI_Comm
1018e5c89e4eSSatish Balay 
1019e5c89e4eSSatish Balay    Input Parameters:
1020e5c89e4eSSatish Balay +   local - the local value
1021e5c89e4eSSatish Balay -   comm - the processors that find the minimum
1022e5c89e4eSSatish Balay 
1023e5c89e4eSSatish Balay    Output Parameter:
1024e5c89e4eSSatish Balay .   result - the minimum value
1025e5c89e4eSSatish Balay 
1026e5c89e4eSSatish Balay    Level: intermediate
1027e5c89e4eSSatish Balay 
1028e5c89e4eSSatish Balay    Notes:
1029e5c89e4eSSatish Balay      These functions are to be used inside user functions that are to be processed with
1030e5c89e4eSSatish Balay    ADIC. PETSc will automatically provide differentiated versions of these functions
1031e5c89e4eSSatish Balay 
1032e5c89e4eSSatish Balay .seealso: PetscGlobalMax(), PetscGlobalSum()
1033e5c89e4eSSatish Balay @*/
1034e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscGlobalMin(PetscReal* local,PetscReal* result,MPI_Comm comm)
1035e5c89e4eSSatish Balay {
1036e5c89e4eSSatish Balay   return MPI_Allreduce(local,result,1,MPIU_REAL,MPI_MIN,comm);
1037e5c89e4eSSatish Balay }
1038e5c89e4eSSatish Balay 
1039e5c89e4eSSatish Balay #undef __FUNCT__
1040e5c89e4eSSatish Balay #define __FUNCT__ "PetscGlobalSum"
104199f316e7SMatthew Knepley /*@
1042e5c89e4eSSatish Balay       PetscGlobalSum - Computes the sum over sever processors
1043e5c89e4eSSatish Balay 
1044e5c89e4eSSatish Balay      Collective on MPI_Comm
1045e5c89e4eSSatish Balay 
1046e5c89e4eSSatish Balay    Input Parameters:
1047e5c89e4eSSatish Balay +   local - the local value
1048e5c89e4eSSatish Balay -   comm - the processors that find the sum
1049e5c89e4eSSatish Balay 
1050e5c89e4eSSatish Balay    Output Parameter:
1051e5c89e4eSSatish Balay .   result - the sum
1052e5c89e4eSSatish Balay 
1053e5c89e4eSSatish Balay    Level: intermediate
1054e5c89e4eSSatish Balay 
1055e5c89e4eSSatish Balay    Notes:
1056e5c89e4eSSatish Balay      These functions are to be used inside user functions that are to be processed with
1057e5c89e4eSSatish Balay    ADIC. PETSc will automatically provide differentiated versions of these functions
1058e5c89e4eSSatish Balay 
1059e5c89e4eSSatish Balay .seealso: PetscGlobalMin(), PetscGlobalMax()
1060e5c89e4eSSatish Balay @*/
1061e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscGlobalSum(PetscScalar* local,PetscScalar* result,MPI_Comm comm)
1062e5c89e4eSSatish Balay {
1063e5c89e4eSSatish Balay   return MPI_Allreduce(local,result,1,MPIU_SCALAR,PetscSum_Op,comm);
1064e5c89e4eSSatish Balay }
1065e5c89e4eSSatish Balay 
1066e5c89e4eSSatish Balay 
1067