xref: /petsc/src/sys/objects/pinit.c (revision 812af9f3ac2ea7d5a8e4b00e36af681f20625899)
1e5c89e4eSSatish Balay #define PETSC_DLL
2e5c89e4eSSatish Balay /*
3e5c89e4eSSatish Balay    This file defines the initialization of PETSc, including PetscInitialize()
4e5c89e4eSSatish Balay */
5e5c89e4eSSatish Balay 
6d382aafbSBarry Smith #include "petscsys.h"        /*I  "petscsys.h"   I*/
78101f56cSMatthew Knepley 
87a025f21SVictor Minden #if defined(PETSC_HAVE_CUDA)
92f947c57SVictor Minden #include <cublas.h>
107a025f21SVictor Minden #endif
117a025f21SVictor Minden 
12a9f03627SSatish Balay #if defined(PETSC_USE_LOG)
13e5c89e4eSSatish Balay EXTERN PetscErrorCode PetscLogBegin_Private(void);
14a9f03627SSatish Balay #endif
15461e1b68SBarry Smith extern PetscTruth PetscOpenMPWorker;
16e5c89e4eSSatish Balay 
17e5c89e4eSSatish Balay /* -----------------------------------------------------------------------------------------*/
18e5c89e4eSSatish Balay 
19e5c89e4eSSatish Balay extern FILE *petsc_history;
20e5c89e4eSSatish Balay 
21e5c89e4eSSatish Balay EXTERN PetscErrorCode PetscInitialize_DynamicLibraries(void);
22e5c89e4eSSatish Balay EXTERN PetscErrorCode PetscFinalize_DynamicLibraries(void);
23e5c89e4eSSatish Balay EXTERN PetscErrorCode PetscFListDestroyAll(void);
24e5c89e4eSSatish Balay EXTERN PetscErrorCode PetscSequentialPhaseBegin_Private(MPI_Comm,int);
25e5c89e4eSSatish Balay EXTERN PetscErrorCode PetscSequentialPhaseEnd_Private(MPI_Comm,int);
26e5c89e4eSSatish Balay EXTERN PetscErrorCode PetscLogCloseHistoryFile(FILE **);
27e5c89e4eSSatish Balay 
28e5c89e4eSSatish Balay /* this is used by the _, __, and ___ macros (see include/petscerror.h) */
29e5c89e4eSSatish Balay PetscErrorCode __gierr = 0;
30e5c89e4eSSatish Balay 
31e5c89e4eSSatish Balay /* user may set this BEFORE calling PetscInitialize() */
32e8373e55SMatthew Knepley MPI_Comm PETSC_COMM_WORLD = MPI_COMM_NULL;
33e5c89e4eSSatish Balay 
34480cf27aSJed Brown PetscMPIInt Petsc_Counter_keyval   = MPI_KEYVAL_INVALID;
35480cf27aSJed Brown PetscMPIInt Petsc_InnerComm_keyval = MPI_KEYVAL_INVALID;
36480cf27aSJed Brown PetscMPIInt Petsc_OuterComm_keyval = MPI_KEYVAL_INVALID;
37480cf27aSJed Brown 
38e5c89e4eSSatish Balay /*
39e5c89e4eSSatish Balay      Declare and set all the string names of the PETSc enums
40e5c89e4eSSatish Balay */
41e5c89e4eSSatish Balay const char *PetscTruths[]    = {"FALSE","TRUE","PetscTruth","PETSC_",0};
42e5c89e4eSSatish Balay const char *PetscDataTypes[] = {"INT", "DOUBLE", "COMPLEX",
43e5c89e4eSSatish Balay                                 "LONG","SHORT",  "FLOAT",
44f68b968cSBarry Smith                                 "CHAR","LOGICAL","ENUM","TRUTH","LONGDOUBLE","PetscDataType","PETSC_",0};
45e5c89e4eSSatish Balay 
460f8e0872SSatish Balay PetscTruth PetscPreLoadingUsed = PETSC_FALSE;
470f8e0872SSatish Balay PetscTruth PetscPreLoadingOn   = PETSC_FALSE;
480f8e0872SSatish Balay 
49e5c89e4eSSatish Balay /*
50e5c89e4eSSatish Balay        Checks the options database for initializations related to the
51e5c89e4eSSatish Balay     PETSc components
52e5c89e4eSSatish Balay */
53e5c89e4eSSatish Balay #undef __FUNCT__
54e5c89e4eSSatish Balay #define __FUNCT__ "PetscOptionsCheckInitial_Components"
55e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscOptionsCheckInitial_Components(void)
56e5c89e4eSSatish Balay {
57e5c89e4eSSatish Balay   PetscTruth flg1;
58e5c89e4eSSatish Balay   PetscErrorCode ierr;
59e5c89e4eSSatish Balay 
60e5c89e4eSSatish Balay   PetscFunctionBegin;
61e5c89e4eSSatish Balay   ierr = PetscOptionsHasName(PETSC_NULL,"-help",&flg1);CHKERRQ(ierr);
62e5c89e4eSSatish Balay   if (flg1) {
63e5c89e4eSSatish Balay #if defined (PETSC_USE_LOG)
64e8e7597cSSatish Balay     MPI_Comm   comm = PETSC_COMM_WORLD;
65e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"------Additional PETSc component options--------\n");CHKERRQ(ierr);
66e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm," -log_summary_exclude: <vec,mat,pc.ksp,snes>\n");CHKERRQ(ierr);
676cf91177SBarry Smith     ierr = (*PetscHelpPrintf)(comm," -info_exclude: <null,vec,mat,pc,ksp,snes,ts>\n");CHKERRQ(ierr);
68e5c89e4eSSatish Balay     ierr = (*PetscHelpPrintf)(comm,"-----------------------------------------------\n");CHKERRQ(ierr);
69e5c89e4eSSatish Balay #endif
70e5c89e4eSSatish Balay   }
71e5c89e4eSSatish Balay   PetscFunctionReturn(0);
72e5c89e4eSSatish Balay }
73e5c89e4eSSatish Balay 
74e5c89e4eSSatish Balay #undef __FUNCT__
75e5c89e4eSSatish Balay #define __FUNCT__ "PetscInitializeNoArguments"
76e5c89e4eSSatish Balay /*@C
77e5c89e4eSSatish Balay       PetscInitializeNoArguments - Calls PetscInitialize() from C/C++ without
78e5c89e4eSSatish Balay         the command line arguments.
79e5c89e4eSSatish Balay 
80e5c89e4eSSatish Balay    Collective
81e5c89e4eSSatish Balay 
82e5c89e4eSSatish Balay    Level: advanced
83e5c89e4eSSatish Balay 
84e5c89e4eSSatish Balay .seealso: PetscInitialize(), PetscInitializeFortran()
85e5c89e4eSSatish Balay @*/
86e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscInitializeNoArguments(void)
87e5c89e4eSSatish Balay {
88e5c89e4eSSatish Balay   PetscErrorCode ierr;
89e5c89e4eSSatish Balay   int            argc = 0;
90e5c89e4eSSatish Balay   char           **args = 0;
91e5c89e4eSSatish Balay 
92e5c89e4eSSatish Balay   PetscFunctionBegin;
93e5c89e4eSSatish Balay   ierr = PetscInitialize(&argc,&args,PETSC_NULL,PETSC_NULL);
94e5c89e4eSSatish Balay   PetscFunctionReturn(ierr);
95e5c89e4eSSatish Balay }
96e5c89e4eSSatish Balay 
97e5c89e4eSSatish Balay #undef __FUNCT__
98e5c89e4eSSatish Balay #define __FUNCT__ "PetscInitialized"
99e5c89e4eSSatish Balay /*@
100e5c89e4eSSatish Balay       PetscInitialized - Determine whether PETSc is initialized.
101e5c89e4eSSatish Balay 
1026dc8fec2Sbcordonn 7   Level: beginner
103e5c89e4eSSatish Balay 
104e5c89e4eSSatish Balay .seealso: PetscInitialize(), PetscInitializeNoArguments(), PetscInitializeFortran()
105e5c89e4eSSatish Balay @*/
106e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscInitialized(PetscTruth *isInitialized)
107e5c89e4eSSatish Balay {
108e5c89e4eSSatish Balay   PetscFunctionBegin;
109e5c89e4eSSatish Balay   PetscValidPointer(isInitialized, 1);
110e5c89e4eSSatish Balay   *isInitialized = PetscInitializeCalled;
111e5c89e4eSSatish Balay   PetscFunctionReturn(0);
112e5c89e4eSSatish Balay }
113e5c89e4eSSatish Balay 
114e5c89e4eSSatish Balay #undef __FUNCT__
115e5c89e4eSSatish Balay #define __FUNCT__ "PetscFinalized"
116e5c89e4eSSatish Balay /*@
117e5c89e4eSSatish Balay       PetscFinalized - Determine whether PetscFinalize() has been called yet
118e5c89e4eSSatish Balay 
119e5c89e4eSSatish Balay    Level: developer
120e5c89e4eSSatish Balay 
121e5c89e4eSSatish Balay .seealso: PetscInitialize(), PetscInitializeNoArguments(), PetscInitializeFortran()
122e5c89e4eSSatish Balay @*/
123e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscFinalized(PetscTruth *isFinalized)
124e5c89e4eSSatish Balay {
125e5c89e4eSSatish Balay   PetscFunctionBegin;
126e5c89e4eSSatish Balay   PetscValidPointer(isFinalized, 1);
127e5c89e4eSSatish Balay   *isFinalized = PetscFinalizeCalled;
128e5c89e4eSSatish Balay   PetscFunctionReturn(0);
129e5c89e4eSSatish Balay }
130e5c89e4eSSatish Balay 
131e5c89e4eSSatish Balay EXTERN PetscErrorCode        PetscOptionsCheckInitial_Private(void);
132e5c89e4eSSatish Balay extern PetscTruth PetscBeganMPI;
133e5c89e4eSSatish Balay 
134e5c89e4eSSatish Balay /*
135e5c89e4eSSatish Balay        This function is the MPI reduction operation used to compute the sum of the
136e5c89e4eSSatish Balay    first half of the datatype and the max of the second half.
137e5c89e4eSSatish Balay */
138e5c89e4eSSatish Balay MPI_Op PetscMaxSum_Op = 0;
139e5c89e4eSSatish Balay 
140e5c89e4eSSatish Balay EXTERN_C_BEGIN
141e5c89e4eSSatish Balay #undef __FUNCT__
142e5c89e4eSSatish Balay #define __FUNCT__ "PetscMaxSum_Local"
1436f9d5503SSatish Balay void PETSC_DLLEXPORT MPIAPI PetscMaxSum_Local(void *in,void *out,int *cnt,MPI_Datatype *datatype)
144e5c89e4eSSatish Balay {
145e5c89e4eSSatish Balay   PetscInt *xin = (PetscInt*)in,*xout = (PetscInt*)out,i,count = *cnt;
146e5c89e4eSSatish Balay 
147e5c89e4eSSatish Balay   PetscFunctionBegin;
148e5c89e4eSSatish Balay   if (*datatype != MPIU_2INT) {
149e5c89e4eSSatish Balay     (*PetscErrorPrintf)("Can only handle MPIU_2INT data types");
150e5c89e4eSSatish Balay     MPI_Abort(MPI_COMM_WORLD,1);
151e5c89e4eSSatish Balay   }
152e5c89e4eSSatish Balay 
153e5c89e4eSSatish Balay   for (i=0; i<count; i++) {
154e5c89e4eSSatish Balay     xout[2*i]    = PetscMax(xout[2*i],xin[2*i]);
155e5c89e4eSSatish Balay     xout[2*i+1] += xin[2*i+1];
156e5c89e4eSSatish Balay   }
157*812af9f3SBarry Smith   PetscFunctionReturnVoid();
158e5c89e4eSSatish Balay }
159e5c89e4eSSatish Balay EXTERN_C_END
160e5c89e4eSSatish Balay 
161e5c89e4eSSatish Balay /*
162e5c89e4eSSatish Balay     Returns the max of the first entry owned by this processor and the
163e5c89e4eSSatish Balay sum of the second entry.
164b693b147SBarry Smith 
165b693b147SBarry Smith     The reason nprocs[2*i] contains lengths nprocs[2*i+1] contains flag of 1 if length is nonzero
166b693b147SBarry Smith is so that the PetscMaxSum_Op() can set TWO values, if we passed in only nprocs[i] with lengths
167b693b147SBarry Smith there would be no place to store the both needed results.
168e5c89e4eSSatish Balay */
169e5c89e4eSSatish Balay #undef __FUNCT__
170e5c89e4eSSatish Balay #define __FUNCT__ "PetscMaxSum"
171e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscMaxSum(MPI_Comm comm,const PetscInt nprocs[],PetscInt *max,PetscInt *sum)
172e5c89e4eSSatish Balay {
173e5c89e4eSSatish Balay   PetscMPIInt    size,rank;
174e5c89e4eSSatish Balay   PetscInt       *work;
175e5c89e4eSSatish Balay   PetscErrorCode ierr;
176e5c89e4eSSatish Balay 
177e5c89e4eSSatish Balay   PetscFunctionBegin;
178e5c89e4eSSatish Balay   ierr   = MPI_Comm_size(comm,&size);CHKERRQ(ierr);
179e5c89e4eSSatish Balay   ierr   = MPI_Comm_rank(comm,&rank);CHKERRQ(ierr);
180e5c89e4eSSatish Balay   ierr   = PetscMalloc(2*size*sizeof(PetscInt),&work);CHKERRQ(ierr);
181e5c89e4eSSatish Balay   ierr   = MPI_Allreduce((void*)nprocs,work,size,MPIU_2INT,PetscMaxSum_Op,comm);CHKERRQ(ierr);
182e5c89e4eSSatish Balay   *max   = work[2*rank];
183e5c89e4eSSatish Balay   *sum   = work[2*rank+1];
184e5c89e4eSSatish Balay   ierr   = PetscFree(work);CHKERRQ(ierr);
185e5c89e4eSSatish Balay   PetscFunctionReturn(0);
186e5c89e4eSSatish Balay }
187e5c89e4eSSatish Balay 
188e5c89e4eSSatish Balay /* ----------------------------------------------------------------------------*/
189e5c89e4eSSatish Balay MPI_Op PETSC_DLLEXPORT PetscADMax_Op = 0;
190e5c89e4eSSatish Balay 
191e5c89e4eSSatish Balay EXTERN_C_BEGIN
192e5c89e4eSSatish Balay #undef __FUNCT__
193e5c89e4eSSatish Balay #define __FUNCT__ "PetscADMax_Local"
1946f9d5503SSatish Balay void PETSC_DLLEXPORT MPIAPI PetscADMax_Local(void *in,void *out,PetscMPIInt *cnt,MPI_Datatype *datatype)
195e5c89e4eSSatish Balay {
196e5c89e4eSSatish Balay   PetscScalar *xin = (PetscScalar *)in,*xout = (PetscScalar*)out;
197e5c89e4eSSatish Balay   PetscInt    i,count = *cnt;
198e5c89e4eSSatish Balay 
199e5c89e4eSSatish Balay   PetscFunctionBegin;
200e5c89e4eSSatish Balay   if (*datatype != MPIU_2SCALAR) {
201e5c89e4eSSatish Balay     (*PetscErrorPrintf)("Can only handle MPIU_2SCALAR data (i.e. double or complex) types");
202e5c89e4eSSatish Balay     MPI_Abort(MPI_COMM_WORLD,1);
203e5c89e4eSSatish Balay   }
204e5c89e4eSSatish Balay 
205e5c89e4eSSatish Balay   for (i=0; i<count; i++) {
206e5c89e4eSSatish Balay     if (PetscRealPart(xout[2*i]) < PetscRealPart(xin[2*i])) {
207e5c89e4eSSatish Balay       xout[2*i]   = xin[2*i];
208e5c89e4eSSatish Balay       xout[2*i+1] = xin[2*i+1];
209e5c89e4eSSatish Balay     }
210e5c89e4eSSatish Balay   }
211*812af9f3SBarry Smith   PetscFunctionReturnVoid();
212e5c89e4eSSatish Balay }
213e5c89e4eSSatish Balay EXTERN_C_END
214e5c89e4eSSatish Balay 
215e5c89e4eSSatish Balay MPI_Op PETSC_DLLEXPORT PetscADMin_Op = 0;
216e5c89e4eSSatish Balay 
217e5c89e4eSSatish Balay EXTERN_C_BEGIN
218e5c89e4eSSatish Balay #undef __FUNCT__
219e5c89e4eSSatish Balay #define __FUNCT__ "PetscADMin_Local"
2206f9d5503SSatish Balay void PETSC_DLLEXPORT MPIAPI PetscADMin_Local(void *in,void *out,PetscMPIInt *cnt,MPI_Datatype *datatype)
221e5c89e4eSSatish Balay {
222e5c89e4eSSatish Balay   PetscScalar *xin = (PetscScalar *)in,*xout = (PetscScalar*)out;
223e5c89e4eSSatish Balay   PetscInt    i,count = *cnt;
224e5c89e4eSSatish Balay 
225e5c89e4eSSatish Balay   PetscFunctionBegin;
226e5c89e4eSSatish Balay   if (*datatype != MPIU_2SCALAR) {
227e5c89e4eSSatish Balay     (*PetscErrorPrintf)("Can only handle MPIU_2SCALAR data (i.e. double or complex) types");
228e5c89e4eSSatish Balay     MPI_Abort(MPI_COMM_WORLD,1);
229e5c89e4eSSatish Balay   }
230e5c89e4eSSatish Balay 
231e5c89e4eSSatish Balay   for (i=0; i<count; i++) {
232e5c89e4eSSatish Balay     if (PetscRealPart(xout[2*i]) > PetscRealPart(xin[2*i])) {
233e5c89e4eSSatish Balay       xout[2*i]   = xin[2*i];
234e5c89e4eSSatish Balay       xout[2*i+1] = xin[2*i+1];
235e5c89e4eSSatish Balay     }
236e5c89e4eSSatish Balay   }
237*812af9f3SBarry Smith   PetscFunctionReturnVoid();
238e5c89e4eSSatish Balay }
239e5c89e4eSSatish Balay EXTERN_C_END
240e5c89e4eSSatish Balay /* ---------------------------------------------------------------------------------------*/
241e5c89e4eSSatish Balay 
242e5c89e4eSSatish Balay #if defined(PETSC_USE_COMPLEX)
2432c876bd9SBarry Smith 
2442c876bd9SBarry Smith /*
2452c876bd9SBarry Smith     This operation is only needed when using complex numbers with older MPI that does not support complex numbers
2462c876bd9SBarry Smith */
2472c876bd9SBarry Smith #if !defined(PETSC_HAVE_MPI_C_DOUBLE_COMPLEX)
24806a205a8SBarry Smith MPI_Op MPIU_SUM = 0;
249e5c89e4eSSatish Balay 
250e5c89e4eSSatish Balay EXTERN_C_BEGIN
251e5c89e4eSSatish Balay #undef __FUNCT__
252e5c89e4eSSatish Balay #define __FUNCT__ "PetscSum_Local"
253e5c89e4eSSatish Balay void PETSC_DLLEXPORT PetscSum_Local(void *in,void *out,PetscMPIInt *cnt,MPI_Datatype *datatype)
254e5c89e4eSSatish Balay {
255e5c89e4eSSatish Balay   PetscScalar *xin = (PetscScalar *)in,*xout = (PetscScalar*)out;
256e5c89e4eSSatish Balay   PetscInt    i,count = *cnt;
257e5c89e4eSSatish Balay 
258e5c89e4eSSatish Balay   PetscFunctionBegin;
259e5c89e4eSSatish Balay   if (*datatype != MPIU_SCALAR) {
260e5c89e4eSSatish Balay     (*PetscErrorPrintf)("Can only handle MPIU_SCALAR data (i.e. double or complex) types");
261e5c89e4eSSatish Balay     MPI_Abort(MPI_COMM_WORLD,1);
262e5c89e4eSSatish Balay   }
263e5c89e4eSSatish Balay 
264e5c89e4eSSatish Balay   for (i=0; i<count; i++) {
265e5c89e4eSSatish Balay     xout[i] += xin[i];
266e5c89e4eSSatish Balay   }
267*812af9f3SBarry Smith   PetscFunctionReturnVoid();
268e5c89e4eSSatish Balay }
269e5c89e4eSSatish Balay EXTERN_C_END
270e5c89e4eSSatish Balay #endif
2712c876bd9SBarry Smith #endif
272e5c89e4eSSatish Balay 
273480cf27aSJed Brown EXTERN_C_BEGIN
274480cf27aSJed Brown #undef __FUNCT__
275480cf27aSJed Brown #define __FUNCT__ "Petsc_DelCounter"
276480cf27aSJed Brown /*
277480cf27aSJed Brown    Private routine to delete internal tag/name counter storage when a communicator is freed.
278480cf27aSJed Brown 
279480cf27aSJed Brown    This is called by MPI, not by users.
280480cf27aSJed Brown 
281480cf27aSJed Brown    Note: this is declared extern "C" because it is passed to MPI_Keyval_create()
282480cf27aSJed Brown 
283480cf27aSJed Brown */
284480cf27aSJed Brown PetscMPIInt PETSC_DLLEXPORT MPIAPI Petsc_DelCounter(MPI_Comm comm,PetscMPIInt keyval,void *count_val,void *extra_state)
285480cf27aSJed Brown {
286480cf27aSJed Brown   PetscErrorCode ierr;
287480cf27aSJed Brown 
288480cf27aSJed Brown   PetscFunctionBegin;
289480cf27aSJed Brown   ierr = PetscInfo1(0,"Deleting counter data in an MPI_Comm %ld\n",(long)comm);if (ierr) PetscFunctionReturn((PetscMPIInt)ierr);
290480cf27aSJed Brown   ierr = PetscFree(count_val);if (ierr) PetscFunctionReturn((PetscMPIInt)ierr);
291480cf27aSJed Brown   PetscFunctionReturn(MPI_SUCCESS);
292480cf27aSJed Brown }
293480cf27aSJed Brown EXTERN_C_END
294480cf27aSJed Brown 
295480cf27aSJed Brown EXTERN_C_BEGIN
296480cf27aSJed Brown #undef __FUNCT__
297480cf27aSJed Brown #define __FUNCT__ "Petsc_DelComm"
298480cf27aSJed Brown /*
299480cf27aSJed Brown   This does not actually free anything, it simply marks when a reference count to an internal MPI_Comm reaches zero and the
300480cf27aSJed Brown   the external MPI_Comm drops its reference to the internal MPI_Comm
301480cf27aSJed Brown 
302480cf27aSJed Brown   This is called by MPI, not by users.
303480cf27aSJed Brown 
304480cf27aSJed Brown   Note: this is declared extern "C" because it is passed to MPI_Keyval_create()
305480cf27aSJed Brown 
306480cf27aSJed Brown */
307480cf27aSJed Brown PetscMPIInt PETSC_DLLEXPORT MPIAPI Petsc_DelComm(MPI_Comm comm,PetscMPIInt keyval,void *attr_val,void *extra_state)
308480cf27aSJed Brown {
309480cf27aSJed Brown   PetscErrorCode ierr;
310480cf27aSJed Brown 
311480cf27aSJed Brown   PetscFunctionBegin;
312480cf27aSJed Brown   ierr = PetscInfo1(0,"Deleting PETSc communicator imbedded in a user MPI_Comm %ld\n",(long)comm);if (ierr) PetscFunctionReturn((PetscMPIInt)ierr);
313480cf27aSJed Brown   /* actually don't delete anything because we cannot increase the reference count of the communicator anyways */
314480cf27aSJed Brown   PetscFunctionReturn(MPI_SUCCESS);
315480cf27aSJed Brown }
316480cf27aSJed Brown EXTERN_C_END
317480cf27aSJed Brown 
318951e3c8eSBarry Smith #if defined(PETSC_USE_PETSC_MPI_EXTERNAL32)
319e39fd77fSBarry Smith #if !defined(PETSC_WORDS_BIGENDIAN)
320e39fd77fSBarry Smith EXTERN_C_BEGIN
321e39fd77fSBarry Smith extern PetscMPIInt PetscDataRep_extent_fn(MPI_Datatype,MPI_Aint*,void*);
322e39fd77fSBarry Smith extern PetscMPIInt PetscDataRep_read_conv_fn(void*, MPI_Datatype,PetscMPIInt,void*,MPI_Offset,void*);
323e39fd77fSBarry Smith extern PetscMPIInt PetscDataRep_write_conv_fn(void*, MPI_Datatype,PetscMPIInt,void*,MPI_Offset,void*);
324e39fd77fSBarry Smith EXTERN_C_END
325e39fd77fSBarry Smith #endif
326951e3c8eSBarry Smith #endif
327e39fd77fSBarry Smith 
3286ae9a8a6SBarry Smith int  PetscGlobalArgc   = 0;
3296ae9a8a6SBarry Smith char **PetscGlobalArgs = 0;
330e5c89e4eSSatish Balay 
331e5c89e4eSSatish Balay #undef __FUNCT__
332e5c89e4eSSatish Balay #define __FUNCT__ "PetscGetArgs"
333e5c89e4eSSatish Balay /*@C
334e5c89e4eSSatish Balay    PetscGetArgs - Allows you to access the raw command line arguments anywhere
335e5c89e4eSSatish Balay      after PetscInitialize() is called but before PetscFinalize().
336e5c89e4eSSatish Balay 
337e5c89e4eSSatish Balay    Not Collective
338e5c89e4eSSatish Balay 
339e5c89e4eSSatish Balay    Output Parameters:
340e5c89e4eSSatish Balay +  argc - count of number of command line arguments
341e5c89e4eSSatish Balay -  args - the command line arguments
342e5c89e4eSSatish Balay 
343e5c89e4eSSatish Balay    Level: intermediate
344e5c89e4eSSatish Balay 
345e5c89e4eSSatish Balay    Notes:
346e5c89e4eSSatish Balay       This is usually used to pass the command line arguments into other libraries
347e5c89e4eSSatish Balay    that are called internally deep in PETSc or the application.
348e5c89e4eSSatish Balay 
349f177e3b1SBarry Smith       The first argument contains the program name as is normal for C arguments.
350f177e3b1SBarry Smith 
351e5c89e4eSSatish Balay    Concepts: command line arguments
352e5c89e4eSSatish Balay 
353793721a6SBarry Smith .seealso: PetscFinalize(), PetscInitializeFortran(), PetscGetArguments()
354e5c89e4eSSatish Balay 
355e5c89e4eSSatish Balay @*/
356e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscGetArgs(int *argc,char ***args)
357e5c89e4eSSatish Balay {
358e5c89e4eSSatish Balay   PetscFunctionBegin;
35917186662SBarry Smith   if (!PetscInitializeCalled && PetscFinalizeCalled) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"You must call after PetscInitialize() but before PetscFinalize()");
360e5c89e4eSSatish Balay   *argc = PetscGlobalArgc;
361e5c89e4eSSatish Balay   *args = PetscGlobalArgs;
362e5c89e4eSSatish Balay   PetscFunctionReturn(0);
363e5c89e4eSSatish Balay }
364e5c89e4eSSatish Balay 
365e5c89e4eSSatish Balay #undef __FUNCT__
366793721a6SBarry Smith #define __FUNCT__ "PetscGetArguments"
367793721a6SBarry Smith /*@C
368793721a6SBarry Smith    PetscGetArguments - Allows you to access the  command line arguments anywhere
369793721a6SBarry Smith      after PetscInitialize() is called but before PetscFinalize().
370793721a6SBarry Smith 
371793721a6SBarry Smith    Not Collective
372793721a6SBarry Smith 
373793721a6SBarry Smith    Output Parameters:
374793721a6SBarry Smith .  args - the command line arguments
375793721a6SBarry Smith 
376793721a6SBarry Smith    Level: intermediate
377793721a6SBarry Smith 
378793721a6SBarry Smith    Notes:
379793721a6SBarry Smith       This does NOT start with the program name and IS null terminated (final arg is void)
380793721a6SBarry Smith 
381793721a6SBarry Smith    Concepts: command line arguments
382793721a6SBarry Smith 
383793721a6SBarry Smith .seealso: PetscFinalize(), PetscInitializeFortran(), PetscGetArgs(), PetscFreeArguments()
384793721a6SBarry Smith 
385793721a6SBarry Smith @*/
386793721a6SBarry Smith PetscErrorCode PETSC_DLLEXPORT PetscGetArguments(char ***args)
387793721a6SBarry Smith {
388793721a6SBarry Smith   PetscInt       i,argc = PetscGlobalArgc;
389793721a6SBarry Smith   PetscErrorCode ierr;
390793721a6SBarry Smith 
391793721a6SBarry Smith   PetscFunctionBegin;
39217186662SBarry Smith   if (!PetscInitializeCalled && PetscFinalizeCalled) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"You must call after PetscInitialize() but before PetscFinalize()");
393717030eeSLisandro Dalcin   if (!argc) {*args = 0; PetscFunctionReturn(0);}
394793721a6SBarry Smith   ierr = PetscMalloc(argc*sizeof(char*),args);CHKERRQ(ierr);
395793721a6SBarry Smith   for (i=0; i<argc-1; i++) {
396793721a6SBarry Smith     ierr = PetscStrallocpy(PetscGlobalArgs[i+1],&(*args)[i]);CHKERRQ(ierr);
397793721a6SBarry Smith   }
398793721a6SBarry Smith   (*args)[argc-1] = 0;
399793721a6SBarry Smith   PetscFunctionReturn(0);
400793721a6SBarry Smith }
401793721a6SBarry Smith 
402793721a6SBarry Smith #undef __FUNCT__
403793721a6SBarry Smith #define __FUNCT__ "PetscFreeArguments"
404793721a6SBarry Smith /*@C
405793721a6SBarry Smith    PetscFreeArguments - Frees the memory obtained with PetscGetArguments()
406793721a6SBarry Smith 
407793721a6SBarry Smith    Not Collective
408793721a6SBarry Smith 
409793721a6SBarry Smith    Output Parameters:
410793721a6SBarry Smith .  args - the command line arguments
411793721a6SBarry Smith 
412793721a6SBarry Smith    Level: intermediate
413793721a6SBarry Smith 
414793721a6SBarry Smith    Concepts: command line arguments
415793721a6SBarry Smith 
416793721a6SBarry Smith .seealso: PetscFinalize(), PetscInitializeFortran(), PetscGetArgs(), PetscGetArguments()
417793721a6SBarry Smith 
418793721a6SBarry Smith @*/
419793721a6SBarry Smith PetscErrorCode PETSC_DLLEXPORT PetscFreeArguments(char **args)
420793721a6SBarry Smith {
421793721a6SBarry Smith   PetscInt       i = 0;
422793721a6SBarry Smith   PetscErrorCode ierr;
423793721a6SBarry Smith 
424793721a6SBarry Smith   PetscFunctionBegin;
425717030eeSLisandro Dalcin   if (!args) {PetscFunctionReturn(0);}
426793721a6SBarry Smith   while (args[i]) {
427793721a6SBarry Smith     ierr = PetscFree(args[i]);CHKERRQ(ierr);
428793721a6SBarry Smith     i++;
429793721a6SBarry Smith   }
430793721a6SBarry Smith   ierr = PetscFree(args);CHKERRQ(ierr);
431793721a6SBarry Smith   PetscFunctionReturn(0);
432793721a6SBarry Smith }
433793721a6SBarry Smith 
434793721a6SBarry Smith #undef __FUNCT__
435e5c89e4eSSatish Balay #define __FUNCT__ "PetscInitialize"
436e5c89e4eSSatish Balay /*@C
437e5c89e4eSSatish Balay    PetscInitialize - Initializes the PETSc database and MPI.
438e5c89e4eSSatish Balay    PetscInitialize() calls MPI_Init() if that has yet to be called,
439e5c89e4eSSatish Balay    so this routine should always be called near the beginning of
440e5c89e4eSSatish Balay    your program -- usually the very first line!
441e5c89e4eSSatish Balay 
442e5c89e4eSSatish Balay    Collective on MPI_COMM_WORLD or PETSC_COMM_WORLD if it has been set
443e5c89e4eSSatish Balay 
444e5c89e4eSSatish Balay    Input Parameters:
445e5c89e4eSSatish Balay +  argc - count of number of command line arguments
446e5c89e4eSSatish Balay .  args - the command line arguments
447fc2bca9aSBarry Smith .  file - [optional] PETSc database file, also checks ~username/.petscrc and .petscrc use PETSC_NULL to not check for
448fc2bca9aSBarry Smith           code specific file. Use -skip_petscrc in the code specific file to skip the .petscrc files
449e5c89e4eSSatish Balay -  help - [optional] Help message to print, use PETSC_NULL for no message
450e5c89e4eSSatish Balay 
45105827820SBarry Smith    If you wish PETSc code to run ONLY on a subcommunicator of MPI_COMM_WORLD, create that
45205827820SBarry Smith    communicator first and assign it to PETSC_COMM_WORLD BEFORE calling PetscInitialize(). Thus if you are running a
45305827820SBarry Smith    four process job and two processes will run PETSc and have PetscInitialize() and PetscFinalize() and two process will not,
45405827820SBarry Smith    then do this. If ALL processes in the job are using PetscInitialize() and PetscFinalize() then you don't need to do this, even
45505827820SBarry Smith    if different subcommunicators of the job are doing different things with PETSc.
456e5c89e4eSSatish Balay 
457e5c89e4eSSatish Balay    Options Database Keys:
458e5c89e4eSSatish Balay +  -start_in_debugger [noxterm,dbx,xdb,gdb,...] - Starts program in debugger
459e5c89e4eSSatish Balay .  -on_error_attach_debugger [noxterm,dbx,xdb,gdb,...] - Starts debugger when error detected
460e5c89e4eSSatish Balay .  -on_error_emacs <machinename> causes emacsclient to jump to error file
461b52f573bSBarry Smith .  -on_error_abort calls abort() when error detected (no traceback)
462e8fb0fc0SBarry Smith .  -on_error_mpiabort calls MPI_abort() when error detected
463e8fb0fc0SBarry Smith .  -error_output_stderr prints error messages to stderr instead of the default stdout
464e8fb0fc0SBarry Smith .  -error_output_none does not print the error messages (but handles errors in the same way as if this was not called)
465e5c89e4eSSatish Balay .  -debugger_nodes [node1,node2,...] - Indicates nodes to start in debugger
466e5c89e4eSSatish Balay .  -debugger_pause [sleeptime] (in seconds) - Pauses debugger
467e5c89e4eSSatish Balay .  -stop_for_debugger - Print message on how to attach debugger manually to
468e5c89e4eSSatish Balay                         process and wait (-debugger_pause) seconds for attachment
4692fb0ec9aSBarry Smith .  -malloc - Indicates use of PETSc error-checking malloc (on by default for debug version of libraries)
470e5c89e4eSSatish Balay .  -malloc no - Indicates not to use error-checking malloc
4712fb0ec9aSBarry Smith .  -malloc_debug - check for memory corruption at EVERY malloc or free
472e5c89e4eSSatish Balay .  -fp_trap - Stops on floating point exceptions (Note that on the
473e5c89e4eSSatish Balay               IBM RS6000 this slows code by at least a factor of 10.)
474e5c89e4eSSatish Balay .  -no_signal_handler - Indicates not to trap error signals
475e5c89e4eSSatish Balay .  -shared_tmp - indicates /tmp directory is shared by all processors
476e5c89e4eSSatish Balay .  -not_shared_tmp - each processor has own /tmp
477e5c89e4eSSatish Balay .  -tmp - alternative name of /tmp directory
478e5c89e4eSSatish Balay .  -get_total_flops - returns total flops done by all processors
479e5c89e4eSSatish Balay -  -memory_info - Print memory usage at end of run
480e5c89e4eSSatish Balay 
481e5c89e4eSSatish Balay    Options Database Keys for Profiling:
4820598bfebSBarry Smith    See the <a href="../../docs/manual.pdf#nameddest=ch_profiling">profiling chapter of the users manual</a> for details.
483e5c89e4eSSatish Balay +  -log_trace [filename] - Print traces of all PETSc calls
484e5c89e4eSSatish Balay         to the screen (useful to determine where a program
485e5c89e4eSSatish Balay         hangs without running in the debugger).  See PetscLogTraceBegin().
4866cf91177SBarry Smith .  -info <optional filename> - Prints verbose information to the screen
4876cf91177SBarry Smith -  -info_exclude <null,vec,mat,pc,ksp,snes,ts> - Excludes some of the verbose messages
488e5c89e4eSSatish Balay 
489e5c89e4eSSatish Balay    Environmental Variables:
490e5c89e4eSSatish Balay +   PETSC_TMP - alternative tmp directory
491e5c89e4eSSatish Balay .   PETSC_SHARED_TMP - tmp is shared by all processes
492e5c89e4eSSatish Balay .   PETSC_NOT_SHARED_TMP - each process has its own private tmp
493e5c89e4eSSatish Balay .   PETSC_VIEWER_SOCKET_PORT - socket number to use for socket viewer
494e5c89e4eSSatish Balay -   PETSC_VIEWER_SOCKET_MACHINE - machine to use for socket viewer to connect to
495e5c89e4eSSatish Balay 
496e5c89e4eSSatish Balay 
497e5c89e4eSSatish Balay    Level: beginner
498e5c89e4eSSatish Balay 
499e5c89e4eSSatish Balay    Notes:
500e5c89e4eSSatish Balay    If for some reason you must call MPI_Init() separately, call
501e5c89e4eSSatish Balay    it before PetscInitialize().
502e5c89e4eSSatish Balay 
503e5c89e4eSSatish Balay    Fortran Version:
504e5c89e4eSSatish Balay    In Fortran this routine has the format
505e5c89e4eSSatish Balay $       call PetscInitialize(file,ierr)
506e5c89e4eSSatish Balay 
507e5c89e4eSSatish Balay +   ierr - error return code
5083dae0d48SMatthew Knepley -  file - [optional] PETSc database file, also checks ~username/.petscrc and .petscrc use PETSC_NULL_CHARACTER to not check for
509fc2bca9aSBarry Smith           code specific file. Use -skip_petscrc in the code specific file to skip the .petscrc files
510e5c89e4eSSatish Balay 
511e5c89e4eSSatish Balay    Important Fortran Note:
512e5c89e4eSSatish Balay    In Fortran, you MUST use PETSC_NULL_CHARACTER to indicate a
513e5c89e4eSSatish Balay    null character string; you CANNOT just use PETSC_NULL as
5140598bfebSBarry Smith    in the C version. See the <a href="../../docs/manual.pdf">users manual</a> for details.
515e5c89e4eSSatish Balay 
51601cb0274SBarry Smith    If your main program is C but you call Fortran code that also uses PETSc you need to call PetscInitializeFortran() soon after
51701cb0274SBarry Smith    calling PetscInitialize().
518e5c89e4eSSatish Balay 
519e5c89e4eSSatish Balay    Concepts: initializing PETSc
520e5c89e4eSSatish Balay 
52101cb0274SBarry Smith .seealso: PetscFinalize(), PetscInitializeFortran(), PetscGetArgs(), PetscInitializeNoArguments()
522e5c89e4eSSatish Balay 
523e5c89e4eSSatish Balay @*/
52433a40596SVictor Minden PetscErrorCode PETSC_DLLEXPORT PetscInitialize(int *argc,char ***args,const char file[],const char help[])
525e5c89e4eSSatish Balay {
526e5c89e4eSSatish Balay   PetscErrorCode ierr;
527aa5bb8c0SSatish Balay   PetscMPIInt    flag, size;
528aa5bb8c0SSatish Balay   PetscInt       nodesize;
529e5c89e4eSSatish Balay   PetscTruth     flg;
530e5c89e4eSSatish Balay   char           hostname[256];
531e5c89e4eSSatish Balay 
532e5c89e4eSSatish Balay   PetscFunctionBegin;
533e5c89e4eSSatish Balay   if (PetscInitializeCalled) PetscFunctionReturn(0);
534e5c89e4eSSatish Balay 
535ae9b4142SLisandro Dalcin   /* these must be initialized in a routine, not as a constant declaration*/
536d89683f4Sbcordonn   PETSC_STDOUT = stdout;
537ae9b4142SLisandro Dalcin   PETSC_STDERR = stderr;
538e5c89e4eSSatish Balay 
539e5c89e4eSSatish Balay   ierr = PetscOptionsCreate();CHKERRQ(ierr);
540e5c89e4eSSatish Balay 
541e5c89e4eSSatish Balay   /*
542e5c89e4eSSatish Balay      We initialize the program name here (before MPI_Init()) because MPICH has a bug in
543e5c89e4eSSatish Balay      it that it sets args[0] on all processors to be args[0] on the first processor.
544e5c89e4eSSatish Balay   */
545e5c89e4eSSatish Balay   if (argc && *argc) {
546e5c89e4eSSatish Balay     ierr = PetscSetProgramName(**args);CHKERRQ(ierr);
547e5c89e4eSSatish Balay   } else {
548e5c89e4eSSatish Balay     ierr = PetscSetProgramName("Unknown Name");CHKERRQ(ierr);
549e5c89e4eSSatish Balay   }
550e5c89e4eSSatish Balay 
551e5c89e4eSSatish Balay   ierr = MPI_Initialized(&flag);CHKERRQ(ierr);
552e5c89e4eSSatish Balay   if (!flag) {
553e32f2f54SBarry Smith     if (PETSC_COMM_WORLD != MPI_COMM_NULL) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"You cannot set PETSC_COMM_WORLD if you have not initialized MPI first");
554e5c89e4eSSatish Balay     ierr          = MPI_Init(argc,args);CHKERRQ(ierr);
555e5c89e4eSSatish Balay     PetscBeganMPI = PETSC_TRUE;
556e5c89e4eSSatish Balay   }
557e5c89e4eSSatish Balay   if (argc && args) {
558e5c89e4eSSatish Balay     PetscGlobalArgc = *argc;
559e5c89e4eSSatish Balay     PetscGlobalArgs = *args;
560e5c89e4eSSatish Balay   }
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 
5882c876bd9SBarry Smith #if !defined(PETSC_HAVE_MPI_C_DOUBLE_COMPLEX)
5892c876bd9SBarry Smith   ierr = MPI_Type_contiguous(2,MPIU_REAL,&MPI_C_DOUBLE_COMPLEX);CHKERRQ(ierr);
5902c876bd9SBarry Smith   ierr = MPI_Type_commit(&MPI_C_DOUBLE_COMPLEX);CHKERRQ(ierr);
591a83b8d76SBarry Smith   ierr = MPI_Type_contiguous(2,MPI_FLOAT,&MPI_C_COMPLEX);CHKERRQ(ierr);
592a83b8d76SBarry Smith   ierr = MPI_Type_commit(&MPI_C_COMPLEX);CHKERRQ(ierr);
59306a205a8SBarry Smith   ierr = MPI_Op_create(PetscSum_Local,1,&MPIU_SUM);CHKERRQ(ierr);
594e5c89e4eSSatish Balay #endif
5952c876bd9SBarry Smith #endif
596e5c89e4eSSatish Balay 
597e5c89e4eSSatish Balay   /*
598e5c89e4eSSatish Balay      Create the PETSc MPI reduction operator that sums of the first
599e5c89e4eSSatish Balay      half of the entries and maxes the second half.
600e5c89e4eSSatish Balay   */
601e5c89e4eSSatish Balay   ierr = MPI_Op_create(PetscMaxSum_Local,1,&PetscMaxSum_Op);CHKERRQ(ierr);
602e5c89e4eSSatish Balay 
603e5c89e4eSSatish Balay   ierr = MPI_Type_contiguous(2,MPIU_SCALAR,&MPIU_2SCALAR);CHKERRQ(ierr);
604e5c89e4eSSatish Balay   ierr = MPI_Type_commit(&MPIU_2SCALAR);CHKERRQ(ierr);
605e5c89e4eSSatish Balay   ierr = MPI_Op_create(PetscADMax_Local,1,&PetscADMax_Op);CHKERRQ(ierr);
606e5c89e4eSSatish Balay   ierr = MPI_Op_create(PetscADMin_Local,1,&PetscADMin_Op);CHKERRQ(ierr);
607e5c89e4eSSatish Balay 
608e5c89e4eSSatish Balay   ierr = MPI_Type_contiguous(2,MPIU_INT,&MPIU_2INT);CHKERRQ(ierr);
609e5c89e4eSSatish Balay   ierr = MPI_Type_commit(&MPIU_2INT);CHKERRQ(ierr);
610e5c89e4eSSatish Balay 
611e5c89e4eSSatish Balay   /*
612480cf27aSJed Brown      Attributes to be set on PETSc communicators
613480cf27aSJed Brown   */
614480cf27aSJed Brown   ierr = MPI_Keyval_create(MPI_NULL_COPY_FN,Petsc_DelCounter,&Petsc_Counter_keyval,(void*)0);CHKERRQ(ierr);
615480cf27aSJed Brown   ierr = MPI_Keyval_create(MPI_NULL_COPY_FN,Petsc_DelComm,&Petsc_InnerComm_keyval,(void*)0);CHKERRQ(ierr);
616480cf27aSJed Brown   ierr = MPI_Keyval_create(MPI_NULL_COPY_FN,Petsc_DelComm,&Petsc_OuterComm_keyval,(void*)0);CHKERRQ(ierr);
617480cf27aSJed Brown 
618480cf27aSJed Brown   /*
619e8fb0fc0SBarry Smith      Build the options database
620e5c89e4eSSatish Balay   */
621e5c89e4eSSatish Balay   ierr = PetscOptionsInsert(argc,args,file);CHKERRQ(ierr);
622e5c89e4eSSatish Balay 
6236dc8fec2Sbcordonn 
624e5c89e4eSSatish Balay   /*
625e5c89e4eSSatish Balay      Print main application help message
626e5c89e4eSSatish Balay   */
627e5c89e4eSSatish Balay   ierr = PetscOptionsHasName(PETSC_NULL,"-help",&flg);CHKERRQ(ierr);
628e5c89e4eSSatish Balay   if (help && flg) {
629e5c89e4eSSatish Balay     ierr = PetscPrintf(PETSC_COMM_WORLD,help);CHKERRQ(ierr);
630e5c89e4eSSatish Balay   }
631e5c89e4eSSatish Balay   ierr = PetscOptionsCheckInitial_Private();CHKERRQ(ierr);
632e5c89e4eSSatish Balay 
633e5c89e4eSSatish Balay   /* SHOULD PUT IN GUARDS: Make sure logging is initialized, even if we do not print it out */
634a9f03627SSatish Balay #if defined(PETSC_USE_LOG)
635e5c89e4eSSatish Balay   ierr = PetscLogBegin_Private();CHKERRQ(ierr);
636a9f03627SSatish Balay #endif
637e5c89e4eSSatish Balay 
638e5c89e4eSSatish Balay   /*
639e5c89e4eSSatish Balay      Load the dynamic libraries (on machines that support them), this registers all
640e5c89e4eSSatish Balay      the solvers etc. (On non-dynamic machines this initializes the PetscDraw and PetscViewer classes)
641e5c89e4eSSatish Balay   */
642e5c89e4eSSatish Balay   ierr = PetscInitialize_DynamicLibraries();CHKERRQ(ierr);
643e5c89e4eSSatish Balay 
644e5c89e4eSSatish Balay   ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRQ(ierr);
645ae15b995SBarry Smith   ierr = PetscInfo1(0,"PETSc successfully started: number of processors = %d\n",size);CHKERRQ(ierr);
646e5c89e4eSSatish Balay   ierr = PetscGetHostName(hostname,256);CHKERRQ(ierr);
647ae15b995SBarry Smith   ierr = PetscInfo1(0,"Running on machine: %s\n",hostname);CHKERRQ(ierr);
648e5c89e4eSSatish Balay 
649e5c89e4eSSatish Balay   ierr = PetscOptionsCheckInitial_Components();CHKERRQ(ierr);
650ef6c6fedSBoyana Norris   /* Check the options database for options related to the options database itself */
651ef6c6fedSBoyana Norris   ierr = PetscOptionsSetFromOptions();CHKERRQ(ierr);
652ef6c6fedSBoyana Norris 
653951e3c8eSBarry Smith #if defined(PETSC_USE_PETSC_MPI_EXTERNAL32)
654e39fd77fSBarry Smith   /*
655e39fd77fSBarry Smith       Tell MPI about our own data representation converter, this would/should be used if extern32 is not supported by the MPI
656e39fd77fSBarry Smith 
657e39fd77fSBarry Smith       Currently not used because it is not supported by MPICH.
658e39fd77fSBarry Smith   */
659e39fd77fSBarry Smith #if !defined(PETSC_WORDS_BIGENDIAN)
660708350f5SSatish Balay   ierr = MPI_Register_datarep((char *)"petsc",PetscDataRep_read_conv_fn,PetscDataRep_write_conv_fn,PetscDataRep_extent_fn,PETSC_NULL);CHKERRQ(ierr);
661e39fd77fSBarry Smith #endif
662951e3c8eSBarry Smith #endif
663e39fd77fSBarry Smith 
664793721a6SBarry Smith   ierr = PetscOptionsGetInt(PETSC_NULL,"-openmp_spawn_size",&nodesize,&flg);CHKERRQ(ierr);
665793721a6SBarry Smith   if (flg) {
66623464e94SBarry Smith #if defined(PETSC_HAVE_MPI_COMM_SPAWN)
6679505b675SBarry Smith     ierr = PetscOpenMPSpawn((PetscMPIInt) nodesize);CHKERRQ(ierr); /* worker nodes never return from here; they go directly to PetscEnd() */
66823464e94SBarry Smith #else
669e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"PETSc built without MPI 2 (MPI_Comm_spawn) support, use -openmp_merge_size instead");
67023464e94SBarry Smith #endif
671793721a6SBarry Smith   } else {
67223464e94SBarry Smith     ierr = PetscOptionsGetInt(PETSC_NULL,"-openmp_merge_size",&nodesize,&flg);CHKERRQ(ierr);
6738002f1cdSBarry Smith     if (flg) {
6749505b675SBarry Smith       ierr = PetscOpenMPMerge((PetscMPIInt) nodesize,PETSC_NULL,PETSC_NULL);CHKERRQ(ierr);
6759505b675SBarry Smith       if (PetscOpenMPWorker) { /* if worker then never enter user code */
6769505b675SBarry Smith         ierr = PetscEnd();
6779505b675SBarry Smith       }
6788002f1cdSBarry Smith     }
679793721a6SBarry Smith   }
68090d69ab7SBarry Smith   flg  = PETSC_FALSE;
68190d69ab7SBarry Smith   ierr = PetscOptionsGetTruth(PETSC_NULL,"-python",&flg,PETSC_NULL);CHKERRQ(ierr);
682192daf7cSBarry Smith   if (flg) {ierr = PetscPythonInitialize(PETSC_NULL,PETSC_NULL);CHKERRQ(ierr);}
683e5c89e4eSSatish Balay 
68435d88935SVictor Minden #if defined(PETSC_HAVE_CUDA)
6852f947c57SVictor Minden   cublasInit();
6863e39abd9SVictor Minden #endif
687301d30feSBarry Smith   /*
688301d30feSBarry Smith       Once we are completedly initialized then we can set this variables
689301d30feSBarry Smith   */
690301d30feSBarry Smith   PetscInitializeCalled = PETSC_TRUE;
691301d30feSBarry Smith   PetscFunctionReturn(0);
692e5c89e4eSSatish Balay }
693e5c89e4eSSatish Balay 
694e5c89e4eSSatish Balay 
695e5c89e4eSSatish Balay #undef __FUNCT__
696e5c89e4eSSatish Balay #define __FUNCT__ "PetscFinalize"
697e5c89e4eSSatish Balay /*@C
698e5c89e4eSSatish Balay    PetscFinalize - Checks for options to be called at the conclusion
699e5c89e4eSSatish Balay    of the program. MPI_Finalize() is called only if the user had not
700e5c89e4eSSatish Balay    called MPI_Init() before calling PetscInitialize().
701e5c89e4eSSatish Balay 
702e5c89e4eSSatish Balay    Collective on PETSC_COMM_WORLD
703e5c89e4eSSatish Balay 
704e5c89e4eSSatish Balay    Options Database Keys:
705e5c89e4eSSatish Balay +  -options_table - Calls PetscOptionsPrint()
706e5c89e4eSSatish Balay .  -options_left - Prints unused options that remain in the database
707e5c89e4eSSatish Balay .  -options_left no - Does not print unused options that remain in the database
708e5c89e4eSSatish Balay .  -mpidump - Calls PetscMPIDump()
709e5c89e4eSSatish Balay .  -malloc_dump - Calls PetscMallocDump()
710e5c89e4eSSatish Balay .  -malloc_info - Prints total memory usage
711e5c89e4eSSatish Balay -  -malloc_log - Prints summary of memory usage
712e5c89e4eSSatish Balay 
713e5c89e4eSSatish Balay    Options Database Keys for Profiling:
7140598bfebSBarry Smith    See the <a href="../../docs/manual.pdf#nameddest=ch_profiling">profiling chapter of the users manual</a> for details.
715e5c89e4eSSatish Balay +  -log_summary [filename] - Prints summary of flop and timing
716e5c89e4eSSatish Balay         information to screen. If the filename is specified the
717e5c89e4eSSatish Balay         summary is written to the file. (for code compiled with
718e5c89e4eSSatish Balay         PETSC_USE_LOG).  See PetscLogPrintSummary().
719e5c89e4eSSatish Balay .  -log_all [filename] - Logs extensive profiling information
720e5c89e4eSSatish Balay         (for code compiled with PETSC_USE_LOG). See PetscLogDump().
721e5c89e4eSSatish Balay .  -log [filename] - Logs basic profiline information (for
722e5c89e4eSSatish Balay         code compiled with PETSC_USE_LOG).  See PetscLogDump().
723e5c89e4eSSatish Balay .  -log_sync - Log the synchronization in scatters, inner products
724e5c89e4eSSatish Balay         and norms
725e5c89e4eSSatish Balay -  -log_mpe [filename] - Creates a logfile viewable by the
726e5c89e4eSSatish Balay       utility Upshot/Nupshot (in MPICH distribution)
727e5c89e4eSSatish Balay 
728e5c89e4eSSatish Balay    Level: beginner
729e5c89e4eSSatish Balay 
730e5c89e4eSSatish Balay    Note:
731e5c89e4eSSatish Balay    See PetscInitialize() for more general runtime options.
732e5c89e4eSSatish Balay 
733e5c89e4eSSatish Balay .seealso: PetscInitialize(), PetscOptionsPrint(), PetscMallocDump(), PetscMPIDump(), PetscEnd()
734e5c89e4eSSatish Balay @*/
735e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscFinalize(void)
736e5c89e4eSSatish Balay {
737e5c89e4eSSatish Balay   PetscErrorCode ierr;
738e5c89e4eSSatish Balay   PetscMPIInt    rank;
739e5c89e4eSSatish Balay   int            nopt;
74090d69ab7SBarry Smith   PetscTruth     flg1 = PETSC_FALSE,flg2 = PETSC_FALSE,flg3 = PETSC_FALSE;
741d5649816SBarry Smith #if defined(PETSC_HAVE_AMS)
742d5649816SBarry Smith   PetscTruth     flg = PETSC_FALSE;
743d5649816SBarry Smith #endif
744e5c89e4eSSatish Balay 
745e5c89e4eSSatish Balay   PetscFunctionBegin;
746e5c89e4eSSatish Balay 
747e5c89e4eSSatish Balay   if (!PetscInitializeCalled) {
748e5c89e4eSSatish Balay     (*PetscErrorPrintf)("PetscInitialize() must be called before PetscFinalize()\n");
749e5c89e4eSSatish Balay     PetscFunctionReturn(0);
750e5c89e4eSSatish Balay   }
751b022a5c1SBarry Smith   ierr = PetscInfo(PETSC_NULL,"PetscFinalize() called\n");
752b022a5c1SBarry Smith 
753d5649816SBarry Smith #if defined(PETSC_HAVE_AMS)
754d5649816SBarry Smith   ierr = PetscOptionsGetTruth(PETSC_NULL,"-options_gui",&flg,PETSC_NULL);CHKERRQ(ierr);
755d5649816SBarry Smith   if (flg) {
756d5649816SBarry Smith     ierr = PetscOptionsAMSDestroy();CHKERRQ(ierr);
757d5649816SBarry Smith   }
758d5649816SBarry Smith #endif
759d5649816SBarry Smith 
7608002f1cdSBarry Smith   ierr = PetscOpenMPFinalize();CHKERRQ(ierr);
7618002f1cdSBarry Smith 
76290d69ab7SBarry Smith   ierr = PetscOptionsGetTruth(PETSC_NULL,"-python",&flg1,PETSC_NULL);CHKERRQ(ierr);
763192daf7cSBarry Smith   if (flg1) {ierr = PetscPythonFinalize();CHKERRQ(ierr);}
764192daf7cSBarry Smith 
765e5c89e4eSSatish Balay   ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr);
76690d69ab7SBarry Smith   ierr = PetscOptionsGetTruth(PETSC_NULL,"-malloc_info",&flg2,PETSC_NULL);CHKERRQ(ierr);
767e5c89e4eSSatish Balay   if (!flg2) {
76890d69ab7SBarry Smith     flg2 = PETSC_FALSE;
76990d69ab7SBarry Smith     ierr = PetscOptionsGetTruth(PETSC_NULL,"-memory_info",&flg2,PETSC_NULL);CHKERRQ(ierr);
770e5c89e4eSSatish Balay   }
771e5c89e4eSSatish Balay   if (flg2) {
772e5c89e4eSSatish Balay     ierr = PetscMemoryShowUsage(PETSC_VIEWER_STDOUT_WORLD,"Summary of Memory Usage in PETSc\n");CHKERRQ(ierr);
773e5c89e4eSSatish Balay   }
774e5c89e4eSSatish Balay 
7753fa76a5bSLisandro Dalcin   /*
7763fa76a5bSLisandro Dalcin      Free all objects registered with PetscObjectRegisterDestroy() such as PETSC_VIEWER_XXX_().
7773fa76a5bSLisandro Dalcin   */
7783fa76a5bSLisandro Dalcin   ierr = PetscObjectRegisterDestroyAll();CHKERRQ(ierr);
7793fa76a5bSLisandro Dalcin 
7803fa76a5bSLisandro Dalcin   /*
7813fa76a5bSLisandro Dalcin        Free all the registered create functions, such as KSPList, VecList, SNESList, etc
7823fa76a5bSLisandro Dalcin   */
7833fa76a5bSLisandro Dalcin   ierr = PetscFListDestroyAll();CHKERRQ(ierr);
7843fa76a5bSLisandro Dalcin 
7853fa76a5bSLisandro Dalcin   /*
7863fa76a5bSLisandro Dalcin      Destroy any packages that registered a finalize
7873fa76a5bSLisandro Dalcin   */
788eb8be38cSBarry Smith   ierr = PetscRegisterFinalizeAll();CHKERRQ(ierr);
789e5c89e4eSSatish Balay 
790e5c89e4eSSatish Balay   /*
791e5c89e4eSSatish Balay      Destroy all the function registration lists created
792e5c89e4eSSatish Balay   */
793e5c89e4eSSatish Balay   ierr = PetscFinalize_DynamicLibraries();CHKERRQ(ierr);
794e5c89e4eSSatish Balay 
795e5c89e4eSSatish Balay #if defined(PETSC_USE_LOG)
79690d69ab7SBarry Smith   flg1 = PETSC_FALSE;
79790d69ab7SBarry Smith   ierr = PetscOptionsGetTruth(PETSC_NULL,"-get_total_flops",&flg1,PETSC_NULL);CHKERRQ(ierr);
798e5c89e4eSSatish Balay   if (flg1) {
799e5c89e4eSSatish Balay     PetscLogDouble flops = 0;
800e5c89e4eSSatish Balay     ierr = MPI_Reduce(&_TotalFlops,&flops,1,MPI_DOUBLE,MPI_SUM,0,PETSC_COMM_WORLD);CHKERRQ(ierr);
801e5c89e4eSSatish Balay     ierr = PetscPrintf(PETSC_COMM_WORLD,"Total flops over all processors %g\n",flops);CHKERRQ(ierr);
802e5c89e4eSSatish Balay   }
803e5c89e4eSSatish Balay #endif
804e5c89e4eSSatish Balay 
805e5c89e4eSSatish Balay #if defined(PETSC_USE_DEBUG)
806e5c89e4eSSatish Balay   if (PetscStackActive) {
807e5c89e4eSSatish Balay     ierr = PetscStackDestroy();CHKERRQ(ierr);
808e5c89e4eSSatish Balay   }
809e5c89e4eSSatish Balay #endif
810e5c89e4eSSatish Balay 
811e5c89e4eSSatish Balay #if defined(PETSC_USE_LOG)
812e5c89e4eSSatish Balay   {
813e5c89e4eSSatish Balay     char mname[PETSC_MAX_PATH_LEN];
814e5c89e4eSSatish Balay #if defined(PETSC_HAVE_MPE)
815e5c89e4eSSatish Balay     mname[0] = 0;
816e5c89e4eSSatish Balay     ierr = PetscOptionsGetString(PETSC_NULL,"-log_mpe",mname,PETSC_MAX_PATH_LEN,&flg1);CHKERRQ(ierr);
817e5c89e4eSSatish Balay     if (flg1){
818e5c89e4eSSatish Balay       if (mname[0]) {ierr = PetscLogMPEDump(mname);CHKERRQ(ierr);}
819e5c89e4eSSatish Balay       else          {ierr = PetscLogMPEDump(0);CHKERRQ(ierr);}
820e5c89e4eSSatish Balay     }
821e5c89e4eSSatish Balay #endif
822e5c89e4eSSatish Balay     mname[0] = 0;
823e5c89e4eSSatish Balay     ierr = PetscOptionsGetString(PETSC_NULL,"-log_summary",mname,PETSC_MAX_PATH_LEN,&flg1);CHKERRQ(ierr);
824e5c89e4eSSatish Balay     if (flg1) {
825e5c89e4eSSatish Balay       if (mname[0])  {ierr = PetscLogPrintSummary(PETSC_COMM_WORLD,mname);CHKERRQ(ierr);}
826e5c89e4eSSatish Balay       else           {ierr = PetscLogPrintSummary(PETSC_COMM_WORLD,0);CHKERRQ(ierr);}
827e5c89e4eSSatish Balay     }
828e5c89e4eSSatish Balay 
82978392ef1SBarry Smith     ierr = PetscOptionsGetString(PETSC_NULL,"-log_detailed",mname,PETSC_MAX_PATH_LEN,&flg1);CHKERRQ(ierr);
83078392ef1SBarry Smith     if (flg1) {
83178392ef1SBarry Smith       if (mname[0])  {ierr = PetscLogPrintDetailed(PETSC_COMM_WORLD,mname);CHKERRQ(ierr);}
83278392ef1SBarry Smith       else           {ierr = PetscLogPrintDetailed(PETSC_COMM_WORLD,0);CHKERRQ(ierr);}
83378392ef1SBarry Smith     }
83478392ef1SBarry Smith 
835e5c89e4eSSatish Balay     mname[0] = 0;
836e5c89e4eSSatish Balay     ierr = PetscOptionsGetString(PETSC_NULL,"-log_all",mname,PETSC_MAX_PATH_LEN,&flg1);CHKERRQ(ierr);
837e5c89e4eSSatish Balay     ierr = PetscOptionsGetString(PETSC_NULL,"-log",mname,PETSC_MAX_PATH_LEN,&flg2);CHKERRQ(ierr);
838e5c89e4eSSatish Balay     if (flg1 || flg2){
839e5c89e4eSSatish Balay       if (mname[0]) PetscLogDump(mname);
840e5c89e4eSSatish Balay       else          PetscLogDump(0);
841e5c89e4eSSatish Balay     }
842e5c89e4eSSatish Balay     ierr = PetscLogDestroy();CHKERRQ(ierr);
843e5c89e4eSSatish Balay   }
844e5c89e4eSSatish Balay #endif
84590d69ab7SBarry Smith   flg1 = PETSC_FALSE;
84690d69ab7SBarry Smith   ierr = PetscOptionsGetTruth(PETSC_NULL,"-no_signal_handler",&flg1,PETSC_NULL);CHKERRQ(ierr);
847e5c89e4eSSatish Balay   if (!flg1) { ierr = PetscPopSignalHandler();CHKERRQ(ierr);}
84890d69ab7SBarry Smith   flg1 = PETSC_FALSE;
84990d69ab7SBarry Smith   ierr = PetscOptionsGetTruth(PETSC_NULL,"-mpidump",&flg1,PETSC_NULL);CHKERRQ(ierr);
850e5c89e4eSSatish Balay   if (flg1) {
851e5c89e4eSSatish Balay     ierr = PetscMPIDump(stdout);CHKERRQ(ierr);
852e5c89e4eSSatish Balay   }
85390d69ab7SBarry Smith   flg1 = PETSC_FALSE;
85490d69ab7SBarry Smith   flg2 = PETSC_FALSE;
85590d69ab7SBarry Smith   ierr = PetscOptionsGetTruth(PETSC_NULL,"-malloc_dump",&flg1,PETSC_NULL);CHKERRQ(ierr);
85690d69ab7SBarry Smith   ierr = PetscOptionsGetTruth(PETSC_NULL,"-options_table",&flg2,PETSC_NULL);CHKERRQ(ierr);
857e5c89e4eSSatish Balay   if (flg2) {
858e5c89e4eSSatish Balay     if (!rank) {ierr = PetscOptionsPrint(stdout);CHKERRQ(ierr);}
859e5c89e4eSSatish Balay   }
860e5c89e4eSSatish Balay 
861e5c89e4eSSatish Balay   /* to prevent PETSc -options_left from warning */
862cb9801acSJed Brown   ierr = PetscOptionsHasName(PETSC_NULL,"-nox",&flg1);CHKERRQ(ierr);
863cb9801acSJed Brown   ierr = PetscOptionsHasName(PETSC_NULL,"-nox_warning",&flg1);CHKERRQ(ierr);
864e5c89e4eSSatish Balay 
865f43cc0c9SSatish Balay   if (!PetscOpenMPWorker) { /* worker processes skip this because they do not usually process options */
86633fc4174SSatish Balay     flg3 = PETSC_FALSE; /* default value is required */
867da8b8a77SBarry Smith     ierr = PetscOptionsGetTruth(PETSC_NULL,"-options_left",&flg3,&flg1);CHKERRQ(ierr);
868e5c89e4eSSatish Balay     ierr = PetscOptionsAllUsed(&nopt);CHKERRQ(ierr);
869e5c89e4eSSatish Balay     if (flg3) {
870e5c89e4eSSatish Balay       if (!flg2) { /* have not yet printed the options */
871e5c89e4eSSatish Balay 	ierr = PetscOptionsPrint(stdout);CHKERRQ(ierr);
872e5c89e4eSSatish Balay       }
873e5c89e4eSSatish Balay       if (!nopt) {
874e5c89e4eSSatish Balay 	ierr = PetscPrintf(PETSC_COMM_WORLD,"There are no unused options.\n");CHKERRQ(ierr);
875e5c89e4eSSatish Balay       } else if (nopt == 1) {
876e5c89e4eSSatish Balay 	ierr = PetscPrintf(PETSC_COMM_WORLD,"There is one unused database option. It is:\n");CHKERRQ(ierr);
877e5c89e4eSSatish Balay       } else {
878e5c89e4eSSatish Balay 	ierr = PetscPrintf(PETSC_COMM_WORLD,"There are %d unused database options. They are:\n",nopt);CHKERRQ(ierr);
879e5c89e4eSSatish Balay       }
880e5c89e4eSSatish Balay     }
881e5c89e4eSSatish Balay #if defined(PETSC_USE_DEBUG)
882da8b8a77SBarry Smith     if (nopt && !flg3 && !flg1) {
883e5c89e4eSSatish Balay       ierr = PetscPrintf(PETSC_COMM_WORLD,"WARNING! There are options you set that were not used!\n");CHKERRQ(ierr);
884e5c89e4eSSatish Balay       ierr = PetscPrintf(PETSC_COMM_WORLD,"WARNING! could be spelling mistake, etc!\n");CHKERRQ(ierr);
885e5c89e4eSSatish Balay       ierr = PetscOptionsLeft();CHKERRQ(ierr);
886e5c89e4eSSatish Balay     } else if (nopt && flg3) {
887e5c89e4eSSatish Balay #else
888e5c89e4eSSatish Balay     if (nopt && flg3) {
889e5c89e4eSSatish Balay #endif
890e5c89e4eSSatish Balay       ierr = PetscOptionsLeft();CHKERRQ(ierr);
891e5c89e4eSSatish Balay     }
892931f367cSBarry Smith   }
893e5c89e4eSSatish Balay 
89490d69ab7SBarry Smith   flg1 = PETSC_FALSE;
89590d69ab7SBarry Smith   ierr = PetscOptionsGetTruth(PETSC_NULL,"-log_history",&flg1,PETSC_NULL);CHKERRQ(ierr);
896e5c89e4eSSatish Balay   if (flg1) {
897e5c89e4eSSatish Balay     ierr = PetscLogCloseHistoryFile(&petsc_history);CHKERRQ(ierr);
898e5c89e4eSSatish Balay     petsc_history = 0;
899e5c89e4eSSatish Balay   }
900e5c89e4eSSatish Balay 
9016cf91177SBarry Smith   ierr = PetscInfoAllow(PETSC_FALSE,PETSC_NULL);CHKERRQ(ierr);
902e5c89e4eSSatish Balay 
90390d69ab7SBarry Smith   flg1 = PETSC_FALSE;
90490d69ab7SBarry Smith   flg3 = PETSC_FALSE;
90590d69ab7SBarry Smith   ierr = PetscOptionsGetTruth(PETSC_NULL,"-malloc_dump",&flg1,PETSC_NULL);CHKERRQ(ierr);
90690d69ab7SBarry Smith   ierr = PetscOptionsGetTruth(PETSC_NULL,"-malloc_log",&flg3,PETSC_NULL);CHKERRQ(ierr);
907e5c89e4eSSatish Balay   if (flg1) {
908e5c89e4eSSatish Balay     char fname[PETSC_MAX_PATH_LEN];
909e5c89e4eSSatish Balay     FILE *fd;
910ed9cf6e9SBarry Smith     int  err;
911e5c89e4eSSatish Balay 
912e5c89e4eSSatish Balay     fname[0] = 0;
913e5c89e4eSSatish Balay     ierr = PetscOptionsGetString(PETSC_NULL,"-malloc_dump",fname,250,&flg1);CHKERRQ(ierr);
914e5c89e4eSSatish Balay     if (flg1 && fname[0]) {
915e5c89e4eSSatish Balay       char sname[PETSC_MAX_PATH_LEN];
916e5c89e4eSSatish Balay 
917e5c89e4eSSatish Balay       sprintf(sname,"%s_%d",fname,rank);
918e32f2f54SBarry Smith       fd   = fopen(sname,"w"); if (!fd) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_OPEN,"Cannot open log file: %s",sname);
919e5c89e4eSSatish Balay       ierr = PetscMallocDump(fd);CHKERRQ(ierr);
920ed9cf6e9SBarry Smith       err = fclose(fd);
921e32f2f54SBarry Smith       if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fclose() failed on file");
922e5c89e4eSSatish Balay     } else {
923e5c89e4eSSatish Balay       MPI_Comm local_comm;
924e5c89e4eSSatish Balay 
925e5c89e4eSSatish Balay       ierr = MPI_Comm_dup(MPI_COMM_WORLD,&local_comm);CHKERRQ(ierr);
926e5c89e4eSSatish Balay       ierr = PetscSequentialPhaseBegin_Private(local_comm,1);CHKERRQ(ierr);
927e5c89e4eSSatish Balay         ierr = PetscMallocDump(stdout);CHKERRQ(ierr);
928e5c89e4eSSatish Balay       ierr = PetscSequentialPhaseEnd_Private(local_comm,1);CHKERRQ(ierr);
929e5c89e4eSSatish Balay       ierr = MPI_Comm_free(&local_comm);CHKERRQ(ierr);
930e5c89e4eSSatish Balay     }
931e5c89e4eSSatish Balay   }
932e5c89e4eSSatish Balay   if (flg3) {
933e5c89e4eSSatish Balay     char fname[PETSC_MAX_PATH_LEN];
934e5c89e4eSSatish Balay     FILE *fd;
935e5c89e4eSSatish Balay 
936e5c89e4eSSatish Balay     fname[0] = 0;
937e5c89e4eSSatish Balay     ierr = PetscOptionsGetString(PETSC_NULL,"-malloc_log",fname,250,&flg1);CHKERRQ(ierr);
938e5c89e4eSSatish Balay     if (flg1 && fname[0]) {
939e5c89e4eSSatish Balay       char sname[PETSC_MAX_PATH_LEN];
940ed9cf6e9SBarry Smith       int  err;
941e5c89e4eSSatish Balay 
942e5c89e4eSSatish Balay       sprintf(sname,"%s_%d",fname,rank);
943e32f2f54SBarry Smith       fd   = fopen(sname,"w"); if (!fd) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_OPEN,"Cannot open log file: %s",sname);
944e5c89e4eSSatish Balay       ierr = PetscMallocDumpLog(fd);CHKERRQ(ierr);
945ed9cf6e9SBarry Smith       err = fclose(fd);
946e32f2f54SBarry Smith       if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fclose() failed on file");
947e5c89e4eSSatish Balay     } else {
948e5c89e4eSSatish Balay       ierr = PetscMallocDumpLog(stdout);CHKERRQ(ierr);
949e5c89e4eSSatish Balay     }
950e5c89e4eSSatish Balay   }
951e5c89e4eSSatish Balay   /* Can be destroyed only after all the options are used */
952e5c89e4eSSatish Balay   ierr = PetscOptionsDestroy();CHKERRQ(ierr);
953e5c89e4eSSatish Balay 
954e5c89e4eSSatish Balay   PetscGlobalArgc = 0;
955e5c89e4eSSatish Balay   PetscGlobalArgs = 0;
956e5c89e4eSSatish Balay 
957e5c89e4eSSatish Balay #if defined(PETSC_USE_COMPLEX)
9582c876bd9SBarry Smith #if !defined(PETSC_HAVE_MPI_C_DOUBLE_COMPLEX)
95906a205a8SBarry Smith   ierr = MPI_Op_free(&MPIU_SUM);CHKERRQ(ierr);
9602c876bd9SBarry Smith   ierr = MPI_Type_free(&MPI_C_DOUBLE_COMPLEX);CHKERRQ(ierr);
961a83b8d76SBarry Smith   ierr = MPI_Type_free(&MPI_C_COMPLEX);CHKERRQ(ierr);
9622c876bd9SBarry Smith #endif
963e5c89e4eSSatish Balay #endif
964e5c89e4eSSatish Balay   ierr = MPI_Type_free(&MPIU_2SCALAR);CHKERRQ(ierr);
965e5c89e4eSSatish Balay   ierr = MPI_Type_free(&MPIU_2INT);CHKERRQ(ierr);
966e5c89e4eSSatish Balay   ierr = MPI_Op_free(&PetscMaxSum_Op);CHKERRQ(ierr);
967e5c89e4eSSatish Balay   ierr = MPI_Op_free(&PetscADMax_Op);CHKERRQ(ierr);
968e5c89e4eSSatish Balay   ierr = MPI_Op_free(&PetscADMin_Op);CHKERRQ(ierr);
969e5c89e4eSSatish Balay 
970480cf27aSJed Brown   ierr = MPI_Keyval_free(&Petsc_Counter_keyval);CHKERRQ(ierr);
971480cf27aSJed Brown   ierr = MPI_Keyval_free(&Petsc_InnerComm_keyval);CHKERRQ(ierr);
972480cf27aSJed Brown   ierr = MPI_Keyval_free(&Petsc_OuterComm_keyval);CHKERRQ(ierr);
973480cf27aSJed Brown 
974ae15b995SBarry Smith   ierr = PetscInfo(0,"PETSc successfully ended!\n");CHKERRQ(ierr);
975e5c89e4eSSatish Balay   if (PetscBeganMPI) {
97699608316SBarry Smith #if defined(PETSC_HAVE_MPI_FINALIZED)
97799b1327fSBarry Smith     PetscMPIInt flag;
97899b1327fSBarry Smith     ierr = MPI_Finalized(&flag);CHKERRQ(ierr);
979e32f2f54SBarry Smith     if (flag) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"MPI_Finalize() has already been called, even though MPI_Init() was called by PetscInitialize()");
98099608316SBarry Smith #endif
981e5c89e4eSSatish Balay     ierr = MPI_Finalize();CHKERRQ(ierr);
982e5c89e4eSSatish Balay   }
983e5c89e4eSSatish Balay 
9849c4c166aSBarry Smith   if (PETSC_ZOPEFD){
98522b84c2fSbcordonn     if (PETSC_ZOPEFD != PETSC_STDOUT) fprintf(PETSC_ZOPEFD, "<<<end>>>");
9869c4c166aSBarry Smith     else fprintf(PETSC_STDOUT, "<<<end>>>");
9879c4c166aSBarry Smith   }
98836186564Sbcordonn 
98935d88935SVictor Minden #if defined(PETSC_HAVE_CUDA)
9902f947c57SVictor Minden   cublasShutdown();
991440a5bbfSVictor Minden #endif
992e5c89e4eSSatish Balay /*
993e5c89e4eSSatish Balay 
994e5c89e4eSSatish Balay      Note: In certain cases PETSC_COMM_WORLD is never MPI_Comm_free()ed because
995e5c89e4eSSatish Balay    the communicator has some outstanding requests on it. Specifically if the
996e5c89e4eSSatish Balay    flag PETSC_HAVE_BROKEN_REQUEST_FREE is set (for IBM MPI implementation). See
997e5c89e4eSSatish Balay    src/vec/utils/vpscat.c. Due to this the memory allocated in PetscCommDuplicate()
998e5c89e4eSSatish Balay    is never freed as it should be. Thus one may obtain messages of the form
9990e5e90baSSatish Balay    [ 1] 8 bytes PetscCommDuplicate() line 645 in src/sys/mpiu.c indicating the
1000e5c89e4eSSatish Balay    memory was not freed.
1001e5c89e4eSSatish Balay 
1002e5c89e4eSSatish Balay */
10031d1a0024SBarry Smith   ierr = PetscMallocClear();CHKERRQ(ierr);
1004e5c89e4eSSatish Balay   PetscInitializeCalled = PETSC_FALSE;
1005e5c89e4eSSatish Balay   PetscFinalizeCalled   = PETSC_TRUE;
1006e5c89e4eSSatish Balay   PetscFunctionReturn(ierr);
1007e5c89e4eSSatish Balay }
1008e5c89e4eSSatish Balay 
1009