xref: /petsc/src/sys/objects/pinit.c (revision 73260a9bf5f079fa3cde3d9bd07e3ae1f3545c60)
1 
2 /*
3    This file defines the initialization of PETSc, including PetscInitialize()
4 */
5 
6 #include <petscsys.h>        /*I  "petscsys.h"   I*/
7 
8 #if defined(PETSC_HAVE_CUSP)
9 #include <cublas.h>
10 #endif
11 
12 #if defined(PETSC_USE_LOG)
13 extern PetscErrorCode PetscLogBegin_Private(void);
14 #endif
15 extern PetscBool  PetscHMPIWorker;
16 extern PetscBool  PetscUseThreadPool;
17 /* -----------------------------------------------------------------------------------------*/
18 
19 extern FILE *petsc_history;
20 
21 extern PetscErrorCode PetscInitialize_DynamicLibraries(void);
22 extern PetscErrorCode PetscFinalize_DynamicLibraries(void);
23 extern PetscErrorCode PetscFListDestroyAll(void);
24 extern PetscErrorCode PetscSequentialPhaseBegin_Private(MPI_Comm,int);
25 extern PetscErrorCode PetscSequentialPhaseEnd_Private(MPI_Comm,int);
26 extern PetscErrorCode PetscCloseHistoryFile(FILE **);
27 extern PetscErrorCode (*PetscThreadFinalize)(void);
28 extern int* ThreadCoreAffinity;
29 /* this is used by the _, __, and ___ macros (see include/petscerror.h) */
30 PetscErrorCode __gierr = 0;
31 
32 /* user may set this BEFORE calling PetscInitialize() */
33 MPI_Comm PETSC_COMM_WORLD = MPI_COMM_NULL;
34 
35 PetscMPIInt Petsc_Counter_keyval   = MPI_KEYVAL_INVALID;
36 PetscMPIInt Petsc_InnerComm_keyval = MPI_KEYVAL_INVALID;
37 PetscMPIInt Petsc_OuterComm_keyval = MPI_KEYVAL_INVALID;
38 
39 /*
40      Declare and set all the string names of the PETSc enums
41 */
42 const char *PetscBools[]     = {"FALSE","TRUE","PetscBool","PETSC_",0};
43 const char *PetscCopyModes[] = {"COPY_VALUES","OWN_POINTER","USE_POINTER","PetscCopyMode","PETSC_",0};
44 const char *PetscDataTypes[] = {"INT","DOUBLE","COMPLEX","LONG","SHORT","FLOAT",
45                                 "CHAR","LOGICAL","ENUM","BOOL","LONGDOUBLE","PetscDataType","PETSC_",0};
46 
47 PetscBool  PetscPreLoadingUsed = PETSC_FALSE;
48 PetscBool  PetscPreLoadingOn   = PETSC_FALSE;
49 
50 /*
51        Checks the options database for initializations related to the
52     PETSc components
53 */
54 #undef __FUNCT__
55 #define __FUNCT__ "PetscOptionsCheckInitial_Components"
56 PetscErrorCode  PetscOptionsCheckInitial_Components(void)
57 {
58   PetscBool  flg1;
59   PetscErrorCode ierr;
60 
61   PetscFunctionBegin;
62   ierr = PetscOptionsHasName(PETSC_NULL,"-help",&flg1);CHKERRQ(ierr);
63   if (flg1) {
64 #if defined (PETSC_USE_LOG)
65     MPI_Comm   comm = PETSC_COMM_WORLD;
66     ierr = (*PetscHelpPrintf)(comm,"------Additional PETSc component options--------\n");CHKERRQ(ierr);
67     ierr = (*PetscHelpPrintf)(comm," -log_summary_exclude: <vec,mat,pc.ksp,snes>\n");CHKERRQ(ierr);
68     ierr = (*PetscHelpPrintf)(comm," -info_exclude: <null,vec,mat,pc,ksp,snes,ts>\n");CHKERRQ(ierr);
69     ierr = (*PetscHelpPrintf)(comm,"-----------------------------------------------\n");CHKERRQ(ierr);
70 #endif
71   }
72   PetscFunctionReturn(0);
73 }
74 
75 #if defined(PETSC_HAVE_MATLAB_ENGINE)
76 extern PetscBool PetscBeganMPI;
77 
78 #undef __FUNCT__
79 #define __FUNCT__ "PetscInitializeMatlab"
80 /*
81       PetscInitializeMatlab - Calls PetscInitialize() from C/C++ without the pointers to argc and args
82 
83    Collective
84 
85    Level: advanced
86 
87     Notes: this is called only by the PETSc MATLAB interface. Even though it might start MPI it sets the flag to
88      indicate that it did NOT start MPI so that the PetscFinalize() does not end MPI, thus allowing PetscInitialize() to
89      be called multiple times from MATLAB without the problem of trying to initialize MPI more than once.
90 
91      Turns off PETSc signal handling because that can interact with MATLAB's signal handling causing random crashes.
92 
93 .seealso: PetscInitialize(), PetscInitializeFortran(), PetscInitializeNoArguments()
94 */
95 PetscErrorCode  PetscInitializeMatlab(int argc,char **args,const char *filename,const char *help)
96 {
97   PetscErrorCode ierr;
98   int            myargc = argc;
99   char           **myargs = args;
100 
101   PetscFunctionBegin;
102   ierr = PetscInitialize(&myargc,&myargs,filename,help);
103   ierr = PetscPopSignalHandler();CHKERRQ(ierr);
104   PetscBeganMPI = PETSC_FALSE;
105   PetscFunctionReturn(ierr);
106 }
107 
108 #undef __FUNCT__
109 #define __FUNCT__ "PetscInitializedMatlab"
110 /*
111       PetscInitializedMatlab - Has PETSc been initialized already?
112 
113    Not Collective
114 
115    Level: advanced
116 
117     Notes: this is called only by the PETSc MATLAB interface.
118 
119 .seealso: PetscInitialize(), PetscInitializeFortran(), PetscInitializeNoArguments()
120 */
121 int  PetscInitializedMatlab(void)
122 {
123   PetscBool flg;
124 
125   PetscInitialized(&flg);
126   if (flg) return 1;
127   else return 0;
128 }
129 
130 #undef __FUNCT__
131 #define __FUNCT__ "PetscGetPETSC_COMM_SELFMatlab"
132 /*
133       Used by MATLAB interface to get communicator
134 */
135 PetscErrorCode  PetscGetPETSC_COMM_SELFMatlab(MPI_Comm *comm)
136 {
137   PetscFunctionBegin;
138   *comm = PETSC_COMM_SELF;
139   PetscFunctionReturn(0);
140 }
141 #endif
142 
143 #undef __FUNCT__
144 #define __FUNCT__ "PetscInitializeNoArguments"
145 /*@C
146       PetscInitializeNoArguments - Calls PetscInitialize() from C/C++ without
147         the command line arguments.
148 
149    Collective
150 
151    Level: advanced
152 
153 .seealso: PetscInitialize(), PetscInitializeFortran()
154 @*/
155 PetscErrorCode  PetscInitializeNoArguments(void)
156 {
157   PetscErrorCode ierr;
158   int            argc = 0;
159   char           **args = 0;
160 
161   PetscFunctionBegin;
162   ierr = PetscInitialize(&argc,&args,PETSC_NULL,PETSC_NULL);
163   PetscFunctionReturn(ierr);
164 }
165 
166 #undef __FUNCT__
167 #define __FUNCT__ "PetscInitialized"
168 /*@
169       PetscInitialized - Determine whether PETSc is initialized.
170 
171 7   Level: beginner
172 
173 .seealso: PetscInitialize(), PetscInitializeNoArguments(), PetscInitializeFortran()
174 @*/
175 PetscErrorCode  PetscInitialized(PetscBool  *isInitialized)
176 {
177   PetscFunctionBegin;
178   PetscValidPointer(isInitialized, 1);
179   *isInitialized = PetscInitializeCalled;
180   PetscFunctionReturn(0);
181 }
182 
183 #undef __FUNCT__
184 #define __FUNCT__ "PetscFinalized"
185 /*@
186       PetscFinalized - Determine whether PetscFinalize() has been called yet
187 
188    Level: developer
189 
190 .seealso: PetscInitialize(), PetscInitializeNoArguments(), PetscInitializeFortran()
191 @*/
192 PetscErrorCode  PetscFinalized(PetscBool  *isFinalized)
193 {
194   PetscFunctionBegin;
195   PetscValidPointer(isFinalized, 1);
196   *isFinalized = PetscFinalizeCalled;
197   PetscFunctionReturn(0);
198 }
199 
200 extern PetscErrorCode        PetscOptionsCheckInitial_Private(void);
201 extern PetscBool  PetscBeganMPI;
202 
203 /*
204        This function is the MPI reduction operation used to compute the sum of the
205    first half of the datatype and the max of the second half.
206 */
207 MPI_Op PetscMaxSum_Op = 0;
208 
209 EXTERN_C_BEGIN
210 #undef __FUNCT__
211 #define __FUNCT__ "PetscMaxSum_Local"
212 void  MPIAPI PetscMaxSum_Local(void *in,void *out,int *cnt,MPI_Datatype *datatype)
213 {
214   PetscInt *xin = (PetscInt*)in,*xout = (PetscInt*)out,i,count = *cnt;
215 
216   PetscFunctionBegin;
217   if (*datatype != MPIU_2INT) {
218     (*PetscErrorPrintf)("Can only handle MPIU_2INT data types");
219     MPI_Abort(MPI_COMM_WORLD,1);
220   }
221 
222   for (i=0; i<count; i++) {
223     xout[2*i]    = PetscMax(xout[2*i],xin[2*i]);
224     xout[2*i+1] += xin[2*i+1];
225   }
226   PetscFunctionReturnVoid();
227 }
228 EXTERN_C_END
229 
230 /*
231     Returns the max of the first entry owned by this processor and the
232 sum of the second entry.
233 
234     The reason nprocs[2*i] contains lengths nprocs[2*i+1] contains flag of 1 if length is nonzero
235 is so that the PetscMaxSum_Op() can set TWO values, if we passed in only nprocs[i] with lengths
236 there would be no place to store the both needed results.
237 */
238 #undef __FUNCT__
239 #define __FUNCT__ "PetscMaxSum"
240 PetscErrorCode  PetscMaxSum(MPI_Comm comm,const PetscInt nprocs[],PetscInt *max,PetscInt *sum)
241 {
242   PetscMPIInt    size,rank;
243   PetscInt       *work;
244   PetscErrorCode ierr;
245 
246   PetscFunctionBegin;
247   ierr   = MPI_Comm_size(comm,&size);CHKERRQ(ierr);
248   ierr   = MPI_Comm_rank(comm,&rank);CHKERRQ(ierr);
249   ierr   = PetscMalloc(2*size*sizeof(PetscInt),&work);CHKERRQ(ierr);
250   ierr   = MPI_Allreduce((void*)nprocs,work,size,MPIU_2INT,PetscMaxSum_Op,comm);CHKERRQ(ierr);
251   *max   = work[2*rank];
252   *sum   = work[2*rank+1];
253   ierr   = PetscFree(work);CHKERRQ(ierr);
254   PetscFunctionReturn(0);
255 }
256 
257 /* ----------------------------------------------------------------------------*/
258 MPI_Op  PetscADMax_Op = 0;
259 
260 EXTERN_C_BEGIN
261 #undef __FUNCT__
262 #define __FUNCT__ "PetscADMax_Local"
263 void  MPIAPI PetscADMax_Local(void *in,void *out,PetscMPIInt *cnt,MPI_Datatype *datatype)
264 {
265   PetscScalar *xin = (PetscScalar *)in,*xout = (PetscScalar*)out;
266   PetscInt    i,count = *cnt;
267 
268   PetscFunctionBegin;
269   if (*datatype != MPIU_2SCALAR) {
270     (*PetscErrorPrintf)("Can only handle MPIU_2SCALAR data (i.e. double or complex) types");
271     MPI_Abort(MPI_COMM_WORLD,1);
272   }
273 
274   for (i=0; i<count; i++) {
275     if (PetscRealPart(xout[2*i]) < PetscRealPart(xin[2*i])) {
276       xout[2*i]   = xin[2*i];
277       xout[2*i+1] = xin[2*i+1];
278     }
279   }
280   PetscFunctionReturnVoid();
281 }
282 EXTERN_C_END
283 
284 MPI_Op  PetscADMin_Op = 0;
285 
286 EXTERN_C_BEGIN
287 #undef __FUNCT__
288 #define __FUNCT__ "PetscADMin_Local"
289 void  MPIAPI PetscADMin_Local(void *in,void *out,PetscMPIInt *cnt,MPI_Datatype *datatype)
290 {
291   PetscScalar *xin = (PetscScalar *)in,*xout = (PetscScalar*)out;
292   PetscInt    i,count = *cnt;
293 
294   PetscFunctionBegin;
295   if (*datatype != MPIU_2SCALAR) {
296     (*PetscErrorPrintf)("Can only handle MPIU_2SCALAR data (i.e. double or complex) types");
297     MPI_Abort(MPI_COMM_WORLD,1);
298   }
299 
300   for (i=0; i<count; i++) {
301     if (PetscRealPart(xout[2*i]) > PetscRealPart(xin[2*i])) {
302       xout[2*i]   = xin[2*i];
303       xout[2*i+1] = xin[2*i+1];
304     }
305   }
306   PetscFunctionReturnVoid();
307 }
308 EXTERN_C_END
309 /* ---------------------------------------------------------------------------------------*/
310 
311 #if (defined(PETSC_USE_COMPLEX) && !defined(PETSC_HAVE_MPI_C_DOUBLE_COMPLEX)) || defined(PETSC_USE_REAL___FLOAT128)
312 MPI_Op MPIU_SUM = 0;
313 
314 EXTERN_C_BEGIN
315 #undef __FUNCT__
316 #define __FUNCT__ "PetscSum_Local"
317 void  PetscSum_Local(void *in,void *out,PetscMPIInt *cnt,MPI_Datatype *datatype)
318 {
319   PetscInt    i,count = *cnt;
320 
321   PetscFunctionBegin;
322   if (*datatype == MPIU_SCALAR) {
323     PetscScalar *xin = (PetscScalar *)in,*xout = (PetscScalar*)out;
324     for (i=0; i<count; i++) {
325       xout[i] += xin[i];
326     }
327   } else if (*datatype == MPIU_REAL) {
328     PetscReal *xin = (PetscReal *)in,*xout = (PetscReal*)out;
329     for (i=0; i<count; i++) {
330       xout[i] += xin[i];
331     }
332   } else {
333     (*PetscErrorPrintf)("Can only handle MPIU_REAL or MPIU_SCALAR data (i.e. double or complex) types");
334     MPI_Abort(MPI_COMM_WORLD,1);
335   }
336   PetscFunctionReturnVoid();
337 }
338 EXTERN_C_END
339 #endif
340 
341 #if defined(PETSC_USE_REAL___FLOAT128)
342 MPI_Op MPIU_MAX = 0;
343 MPI_Op MPIU_MIN = 0;
344 
345 EXTERN_C_BEGIN
346 #undef __FUNCT__
347 #define __FUNCT__ "PetscMax_Local"
348 void  PetscMax_Local(void *in,void *out,PetscMPIInt *cnt,MPI_Datatype *datatype)
349 {
350   PetscScalar *xin = (PetscScalar *)in,*xout = (PetscScalar*)out;
351   PetscInt    i,count = *cnt;
352 
353   PetscFunctionBegin;
354   if (*datatype != MPIU_SCALAR) {
355     (*PetscErrorPrintf)("Can only handle MPIU_SCALAR data (i.e. double or complex) types");
356     MPI_Abort(MPI_COMM_WORLD,1);
357   }
358 
359   for (i=0; i<count; i++) {
360     xout[i] += PetscMax(xout[i],xin[i]);
361   }
362   PetscFunctionReturnVoid();
363 }
364 EXTERN_C_END
365 
366 EXTERN_C_BEGIN
367 #undef __FUNCT__
368 #define __FUNCT__ "PetscMin_Local"
369 void  PetscMin_Local(void *in,void *out,PetscMPIInt *cnt,MPI_Datatype *datatype)
370 {
371   PetscScalar *xin = (PetscScalar *)in,*xout = (PetscScalar*)out;
372   PetscInt    i,count = *cnt;
373 
374   PetscFunctionBegin;
375   if (*datatype != MPIU_SCALAR) {
376     (*PetscErrorPrintf)("Can only handle MPIU_SCALAR data (i.e. double or complex) types");
377     MPI_Abort(MPI_COMM_WORLD,1);
378   }
379 
380   for (i=0; i<count; i++) {
381     xout[i] += PetscMin(xout[i],xin[i]);
382   }
383   PetscFunctionReturnVoid();
384 }
385 EXTERN_C_END
386 #endif
387 
388 EXTERN_C_BEGIN
389 #undef __FUNCT__
390 #define __FUNCT__ "Petsc_DelCounter"
391 /*
392    Private routine to delete internal tag/name counter storage when a communicator is freed.
393 
394    This is called by MPI, not by users.
395 
396    Note: this is declared extern "C" because it is passed to MPI_Keyval_create()
397 
398 */
399 PetscMPIInt  MPIAPI Petsc_DelCounter(MPI_Comm comm,PetscMPIInt keyval,void *count_val,void *extra_state)
400 {
401   PetscErrorCode ierr;
402 
403   PetscFunctionBegin;
404   ierr = PetscInfo1(0,"Deleting counter data in an MPI_Comm %ld\n",(long)comm);if (ierr) PetscFunctionReturn((PetscMPIInt)ierr);
405   ierr = PetscFree(count_val);if (ierr) PetscFunctionReturn((PetscMPIInt)ierr);
406   PetscFunctionReturn(MPI_SUCCESS);
407 }
408 EXTERN_C_END
409 
410 EXTERN_C_BEGIN
411 #undef __FUNCT__
412 #define __FUNCT__ "Petsc_DelComm"
413 /*
414   This does not actually free anything, it simply marks when a reference count to an internal MPI_Comm reaches zero and the
415   the external MPI_Comm drops its reference to the internal MPI_Comm
416 
417   This is called by MPI, not by users.
418 
419   Note: this is declared extern "C" because it is passed to MPI_Keyval_create()
420 
421 */
422 PetscMPIInt  MPIAPI Petsc_DelComm(MPI_Comm comm,PetscMPIInt keyval,void *attr_val,void *extra_state)
423 {
424   PetscErrorCode ierr;
425 
426   PetscFunctionBegin;
427   ierr = PetscInfo1(0,"Deleting PETSc communicator imbedded in a user MPI_Comm %ld\n",(long)comm);if (ierr) PetscFunctionReturn((PetscMPIInt)ierr);
428   /* actually don't delete anything because we cannot increase the reference count of the communicator anyways */
429   PetscFunctionReturn(MPI_SUCCESS);
430 }
431 EXTERN_C_END
432 
433 #if defined(PETSC_USE_PETSC_MPI_EXTERNAL32)
434 #if !defined(PETSC_WORDS_BIGENDIAN)
435 EXTERN_C_BEGIN
436 extern PetscMPIInt PetscDataRep_extent_fn(MPI_Datatype,MPI_Aint*,void*);
437 extern PetscMPIInt PetscDataRep_read_conv_fn(void*, MPI_Datatype,PetscMPIInt,void*,MPI_Offset,void*);
438 extern PetscMPIInt PetscDataRep_write_conv_fn(void*, MPI_Datatype,PetscMPIInt,void*,MPI_Offset,void*);
439 EXTERN_C_END
440 #endif
441 #endif
442 
443 int  PetscGlobalArgc   = 0;
444 char **PetscGlobalArgs = 0;
445 
446 #undef __FUNCT__
447 #define __FUNCT__ "PetscGetArgs"
448 /*@C
449    PetscGetArgs - Allows you to access the raw command line arguments anywhere
450      after PetscInitialize() is called but before PetscFinalize().
451 
452    Not Collective
453 
454    Output Parameters:
455 +  argc - count of number of command line arguments
456 -  args - the command line arguments
457 
458    Level: intermediate
459 
460    Notes:
461       This is usually used to pass the command line arguments into other libraries
462    that are called internally deep in PETSc or the application.
463 
464       The first argument contains the program name as is normal for C arguments.
465 
466    Concepts: command line arguments
467 
468 .seealso: PetscFinalize(), PetscInitializeFortran(), PetscGetArguments()
469 
470 @*/
471 PetscErrorCode  PetscGetArgs(int *argc,char ***args)
472 {
473   PetscFunctionBegin;
474   if (!PetscInitializeCalled && PetscFinalizeCalled) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"You must call after PetscInitialize() but before PetscFinalize()");
475   *argc = PetscGlobalArgc;
476   *args = PetscGlobalArgs;
477   PetscFunctionReturn(0);
478 }
479 
480 #undef __FUNCT__
481 #define __FUNCT__ "PetscGetArguments"
482 /*@C
483    PetscGetArguments - Allows you to access the  command line arguments anywhere
484      after PetscInitialize() is called but before PetscFinalize().
485 
486    Not Collective
487 
488    Output Parameters:
489 .  args - the command line arguments
490 
491    Level: intermediate
492 
493    Notes:
494       This does NOT start with the program name and IS null terminated (final arg is void)
495 
496    Concepts: command line arguments
497 
498 .seealso: PetscFinalize(), PetscInitializeFortran(), PetscGetArgs(), PetscFreeArguments()
499 
500 @*/
501 PetscErrorCode  PetscGetArguments(char ***args)
502 {
503   PetscInt       i,argc = PetscGlobalArgc;
504   PetscErrorCode ierr;
505 
506   PetscFunctionBegin;
507   if (!PetscInitializeCalled && PetscFinalizeCalled) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"You must call after PetscInitialize() but before PetscFinalize()");
508   if (!argc) {*args = 0; PetscFunctionReturn(0);}
509   ierr = PetscMalloc(argc*sizeof(char*),args);CHKERRQ(ierr);
510   for (i=0; i<argc-1; i++) {
511     ierr = PetscStrallocpy(PetscGlobalArgs[i+1],&(*args)[i]);CHKERRQ(ierr);
512   }
513   (*args)[argc-1] = 0;
514   PetscFunctionReturn(0);
515 }
516 
517 #undef __FUNCT__
518 #define __FUNCT__ "PetscFreeArguments"
519 /*@C
520    PetscFreeArguments - Frees the memory obtained with PetscGetArguments()
521 
522    Not Collective
523 
524    Output Parameters:
525 .  args - the command line arguments
526 
527    Level: intermediate
528 
529    Concepts: command line arguments
530 
531 .seealso: PetscFinalize(), PetscInitializeFortran(), PetscGetArgs(), PetscGetArguments()
532 
533 @*/
534 PetscErrorCode  PetscFreeArguments(char **args)
535 {
536   PetscInt       i = 0;
537   PetscErrorCode ierr;
538 
539   PetscFunctionBegin;
540   if (!args) {PetscFunctionReturn(0);}
541   while (args[i]) {
542     ierr = PetscFree(args[i]);CHKERRQ(ierr);
543     i++;
544   }
545   ierr = PetscFree(args);CHKERRQ(ierr);
546   PetscFunctionReturn(0);
547 }
548 
549 #undef __FUNCT__
550 #define __FUNCT__ "PetscInitialize"
551 /*@C
552    PetscInitialize - Initializes the PETSc database and MPI.
553    PetscInitialize() calls MPI_Init() if that has yet to be called,
554    so this routine should always be called near the beginning of
555    your program -- usually the very first line!
556 
557    Collective on MPI_COMM_WORLD or PETSC_COMM_WORLD if it has been set
558 
559    Input Parameters:
560 +  argc - count of number of command line arguments
561 .  args - the command line arguments
562 .  file - [optional] PETSc database file, also checks ~username/.petscrc and .petscrc use PETSC_NULL to not check for
563           code specific file. Use -skip_petscrc in the code specific file to skip the .petscrc files
564 -  help - [optional] Help message to print, use PETSC_NULL for no message
565 
566    If you wish PETSc code to run ONLY on a subcommunicator of MPI_COMM_WORLD, create that
567    communicator first and assign it to PETSC_COMM_WORLD BEFORE calling PetscInitialize(). Thus if you are running a
568    four process job and two processes will run PETSc and have PetscInitialize() and PetscFinalize() and two process will not,
569    then do this. If ALL processes in the job are using PetscInitialize() and PetscFinalize() then you don't need to do this, even
570    if different subcommunicators of the job are doing different things with PETSc.
571 
572    Options Database Keys:
573 +  -start_in_debugger [noxterm,dbx,xdb,gdb,...] - Starts program in debugger
574 .  -on_error_attach_debugger [noxterm,dbx,xdb,gdb,...] - Starts debugger when error detected
575 .  -on_error_emacs <machinename> causes emacsclient to jump to error file
576 .  -on_error_abort calls abort() when error detected (no traceback)
577 .  -on_error_mpiabort calls MPI_abort() when error detected
578 .  -error_output_stderr prints error messages to stderr instead of the default stdout
579 .  -error_output_none does not print the error messages (but handles errors in the same way as if this was not called)
580 .  -debugger_nodes [node1,node2,...] - Indicates nodes to start in debugger
581 .  -debugger_pause [sleeptime] (in seconds) - Pauses debugger
582 .  -stop_for_debugger - Print message on how to attach debugger manually to
583                         process and wait (-debugger_pause) seconds for attachment
584 .  -malloc - Indicates use of PETSc error-checking malloc (on by default for debug version of libraries)
585 .  -malloc no - Indicates not to use error-checking malloc
586 .  -malloc_debug - check for memory corruption at EVERY malloc or free
587 .  -fp_trap - Stops on floating point exceptions (Note that on the
588               IBM RS6000 this slows code by at least a factor of 10.)
589 .  -no_signal_handler - Indicates not to trap error signals
590 .  -shared_tmp - indicates /tmp directory is shared by all processors
591 .  -not_shared_tmp - each processor has own /tmp
592 .  -tmp - alternative name of /tmp directory
593 .  -get_total_flops - returns total flops done by all processors
594 .  -memory_info - Print memory usage at end of run
595 -  -server <port> - start PETSc webserver (default port is 8080)
596 
597    Options Database Keys for Profiling:
598    See the <a href="../../docs/manual.pdf#nameddest=ch_profiling">profiling chapter of the users manual</a> for details.
599 +  -log_trace [filename] - Print traces of all PETSc calls
600         to the screen (useful to determine where a program
601         hangs without running in the debugger).  See PetscLogTraceBegin().
602 .  -info <optional filename> - Prints verbose information to the screen
603 -  -info_exclude <null,vec,mat,pc,ksp,snes,ts> - Excludes some of the verbose messages
604 
605    Environmental Variables:
606 +   PETSC_TMP - alternative tmp directory
607 .   PETSC_SHARED_TMP - tmp is shared by all processes
608 .   PETSC_NOT_SHARED_TMP - each process has its own private tmp
609 .   PETSC_VIEWER_SOCKET_PORT - socket number to use for socket viewer
610 -   PETSC_VIEWER_SOCKET_MACHINE - machine to use for socket viewer to connect to
611 
612 
613    Level: beginner
614 
615    Notes:
616    If for some reason you must call MPI_Init() separately, call
617    it before PetscInitialize().
618 
619    Fortran Version:
620    In Fortran this routine has the format
621 $       call PetscInitialize(file,ierr)
622 
623 +   ierr - error return code
624 -  file - [optional] PETSc database file, also checks ~username/.petscrc and .petscrc use PETSC_NULL_CHARACTER to not check for
625           code specific file. Use -skip_petscrc in the code specific file to skip the .petscrc files
626 
627    Important Fortran Note:
628    In Fortran, you MUST use PETSC_NULL_CHARACTER to indicate a
629    null character string; you CANNOT just use PETSC_NULL as
630    in the C version. See the <a href="../../docs/manual.pdf">users manual</a> for details.
631 
632    If your main program is C but you call Fortran code that also uses PETSc you need to call PetscInitializeFortran() soon after
633    calling PetscInitialize().
634 
635    Concepts: initializing PETSc
636 
637 .seealso: PetscFinalize(), PetscInitializeFortran(), PetscGetArgs(), PetscInitializeNoArguments()
638 
639 @*/
640 PetscErrorCode  PetscInitialize(int *argc,char ***args,const char file[],const char help[])
641 {
642   PetscErrorCode ierr;
643   PetscMPIInt    flag, size;
644   PetscInt       nodesize;
645   PetscBool      flg;
646   char           hostname[256];
647 
648   PetscFunctionBegin;
649   if (PetscInitializeCalled) PetscFunctionReturn(0);
650 
651   /* these must be initialized in a routine, not as a constant declaration*/
652   PETSC_STDOUT = stdout;
653   PETSC_STDERR = stderr;
654 
655   ierr = PetscOptionsCreate();CHKERRQ(ierr);
656 
657   /*
658      We initialize the program name here (before MPI_Init()) because MPICH has a bug in
659      it that it sets args[0] on all processors to be args[0] on the first processor.
660   */
661   if (argc && *argc) {
662     ierr = PetscSetProgramName(**args);CHKERRQ(ierr);
663   } else {
664     ierr = PetscSetProgramName("Unknown Name");CHKERRQ(ierr);
665   }
666 
667   ierr = MPI_Initialized(&flag);CHKERRQ(ierr);
668   if (!flag) {
669     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");
670     ierr          = MPI_Init(argc,args);CHKERRQ(ierr);
671     PetscBeganMPI = PETSC_TRUE;
672   }
673   if (argc && args) {
674     PetscGlobalArgc = *argc;
675     PetscGlobalArgs = *args;
676   }
677   PetscFinalizeCalled   = PETSC_FALSE;
678 
679   if (PETSC_COMM_WORLD == MPI_COMM_NULL) {
680     PETSC_COMM_WORLD = MPI_COMM_WORLD;
681   }
682   ierr = MPI_Errhandler_set(PETSC_COMM_WORLD,MPI_ERRORS_RETURN);CHKERRQ(ierr);
683 
684   /* Done after init due to a bug in MPICH-GM? */
685   ierr = PetscErrorPrintfInitialize();CHKERRQ(ierr);
686 
687   ierr = MPI_Comm_rank(MPI_COMM_WORLD,&PetscGlobalRank);CHKERRQ(ierr);
688   ierr = MPI_Comm_size(MPI_COMM_WORLD,&PetscGlobalSize);CHKERRQ(ierr);
689 
690 #if defined(PETSC_USE_COMPLEX)
691   /*
692      Initialized the global complex variable; this is because with
693      shared libraries the constructors for global variables
694      are not called; at least on IRIX.
695   */
696   {
697 #if defined(PETSC_CLANGUAGE_CXX)
698     PetscScalar ic(0.0,1.0);
699     PETSC_i = ic;
700 #else
701     PETSC_i = I;
702 #endif
703   }
704 
705 #if !defined(PETSC_HAVE_MPI_C_DOUBLE_COMPLEX)
706   ierr = MPI_Type_contiguous(2,MPIU_REAL,&MPI_C_DOUBLE_COMPLEX);CHKERRQ(ierr);
707   ierr = MPI_Type_commit(&MPI_C_DOUBLE_COMPLEX);CHKERRQ(ierr);
708   ierr = MPI_Type_contiguous(2,MPI_FLOAT,&MPI_C_COMPLEX);CHKERRQ(ierr);
709   ierr = MPI_Type_commit(&MPI_C_COMPLEX);CHKERRQ(ierr);
710   ierr = MPI_Op_create(PetscSum_Local,1,&MPIU_SUM);CHKERRQ(ierr);
711 #endif
712 #endif
713 
714   /*
715      Create the PETSc MPI reduction operator that sums of the first
716      half of the entries and maxes the second half.
717   */
718   ierr = MPI_Op_create(PetscMaxSum_Local,1,&PetscMaxSum_Op);CHKERRQ(ierr);
719 
720 #if defined(PETSC_USE_REAL___FLOAT128)
721   ierr = MPI_Type_contiguous(2,MPI_DOUBLE,&MPIU___FLOAT128);CHKERRQ(ierr);
722   ierr = MPI_Type_commit(&MPIU___FLOAT128);CHKERRQ(ierr);
723   ierr = MPI_Op_create(PetscSum_Local,1,&MPIU_SUM);CHKERRQ(ierr);
724   ierr = MPI_Op_create(PetscMax_Local,1,&MPIU_MAX);CHKERRQ(ierr);
725   ierr = MPI_Op_create(PetscMin_Local,1,&MPIU_MIN);CHKERRQ(ierr);
726 #endif
727 
728   ierr = MPI_Type_contiguous(2,MPIU_SCALAR,&MPIU_2SCALAR);CHKERRQ(ierr);
729   ierr = MPI_Type_commit(&MPIU_2SCALAR);CHKERRQ(ierr);
730   ierr = MPI_Op_create(PetscADMax_Local,1,&PetscADMax_Op);CHKERRQ(ierr);
731   ierr = MPI_Op_create(PetscADMin_Local,1,&PetscADMin_Op);CHKERRQ(ierr);
732 
733   ierr = MPI_Type_contiguous(2,MPIU_INT,&MPIU_2INT);CHKERRQ(ierr);
734   ierr = MPI_Type_commit(&MPIU_2INT);CHKERRQ(ierr);
735 
736   /*
737      Attributes to be set on PETSc communicators
738   */
739   ierr = MPI_Keyval_create(MPI_NULL_COPY_FN,Petsc_DelCounter,&Petsc_Counter_keyval,(void*)0);CHKERRQ(ierr);
740   ierr = MPI_Keyval_create(MPI_NULL_COPY_FN,Petsc_DelComm,&Petsc_InnerComm_keyval,(void*)0);CHKERRQ(ierr);
741   ierr = MPI_Keyval_create(MPI_NULL_COPY_FN,Petsc_DelComm,&Petsc_OuterComm_keyval,(void*)0);CHKERRQ(ierr);
742 
743   /*
744      Build the options database
745   */
746   ierr = PetscOptionsInsert(argc,args,file);CHKERRQ(ierr);
747 
748 
749   /*
750      Print main application help message
751   */
752   ierr = PetscOptionsHasName(PETSC_NULL,"-help",&flg);CHKERRQ(ierr);
753   if (help && flg) {
754     ierr = PetscPrintf(PETSC_COMM_WORLD,help);CHKERRQ(ierr);
755   }
756   ierr = PetscOptionsCheckInitial_Private();CHKERRQ(ierr);
757 
758   /* SHOULD PUT IN GUARDS: Make sure logging is initialized, even if we do not print it out */
759 #if defined(PETSC_USE_LOG)
760   ierr = PetscLogBegin_Private();CHKERRQ(ierr);
761 #endif
762 
763   /*
764      Load the dynamic libraries (on machines that support them), this registers all
765      the solvers etc. (On non-dynamic machines this initializes the PetscDraw and PetscViewer classes)
766   */
767   ierr = PetscInitialize_DynamicLibraries();CHKERRQ(ierr);
768 
769   ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRQ(ierr);
770   ierr = PetscInfo1(0,"PETSc successfully started: number of processors = %d\n",size);CHKERRQ(ierr);
771   ierr = PetscGetHostName(hostname,256);CHKERRQ(ierr);
772   ierr = PetscInfo1(0,"Running on machine: %s\n",hostname);CHKERRQ(ierr);
773 
774   ierr = PetscOptionsCheckInitial_Components();CHKERRQ(ierr);
775   /* Check the options database for options related to the options database itself */
776   ierr = PetscOptionsSetFromOptions();CHKERRQ(ierr);
777 
778 #if defined(PETSC_USE_PETSC_MPI_EXTERNAL32)
779   /*
780       Tell MPI about our own data representation converter, this would/should be used if extern32 is not supported by the MPI
781 
782       Currently not used because it is not supported by MPICH.
783   */
784 #if !defined(PETSC_WORDS_BIGENDIAN)
785   ierr = MPI_Register_datarep((char *)"petsc",PetscDataRep_read_conv_fn,PetscDataRep_write_conv_fn,PetscDataRep_extent_fn,PETSC_NULL);CHKERRQ(ierr);
786 #endif
787 #endif
788 
789   ierr = PetscOptionsGetInt(PETSC_NULL,"-hmpi_spawn_size",&nodesize,&flg);CHKERRQ(ierr);
790   if (flg) {
791 #if defined(PETSC_HAVE_MPI_COMM_SPAWN)
792     ierr = PetscHMPISpawn((PetscMPIInt) nodesize);CHKERRQ(ierr); /* worker nodes never return from here; they go directly to PetscEnd() */
793 #else
794     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"PETSc built without MPI 2 (MPI_Comm_spawn) support, use -hmpi_merge_size instead");
795 #endif
796   } else {
797     ierr = PetscOptionsGetInt(PETSC_NULL,"-hmpi_merge_size",&nodesize,&flg);CHKERRQ(ierr);
798     if (flg) {
799       ierr = PetscHMPIMerge((PetscMPIInt) nodesize,PETSC_NULL,PETSC_NULL);CHKERRQ(ierr);
800       if (PetscHMPIWorker) { /* if worker then never enter user code */
801         ierr = PetscEnd();
802       }
803     }
804   }
805 
806 #if defined(PETSC_HAVE_CUDA)
807   cublasInit();
808 #endif
809 
810 #if defined(PETSC_HAVE_AMS)
811   ierr = PetscOptionsHasName(PETSC_NULL,"-ams_publish_objects",&flg);CHKERRQ(ierr);
812   if (flg) {
813     PetscAMSPublishAll = PETSC_TRUE;
814   }
815 #endif
816 
817   ierr = PetscOptionsHasName(PETSC_NULL,"-python",&flg);CHKERRQ(ierr);
818   if (flg) {
819     PetscInitializeCalled = PETSC_TRUE;
820     ierr = PetscPythonInitialize(PETSC_NULL,PETSC_NULL);CHKERRQ(ierr);
821   }
822 
823   /*
824       Once we are completedly initialized then we can set this variables
825   */
826   PetscInitializeCalled = PETSC_TRUE;
827   PetscFunctionReturn(0);
828 }
829 
830 extern PetscObject *PetscObjects;
831 extern PetscInt    PetscObjectsCounts, PetscObjectsMaxCounts;
832 
833 #undef __FUNCT__
834 #define __FUNCT__ "PetscFinalize"
835 /*@C
836    PetscFinalize - Checks for options to be called at the conclusion
837    of the program. MPI_Finalize() is called only if the user had not
838    called MPI_Init() before calling PetscInitialize().
839 
840    Collective on PETSC_COMM_WORLD
841 
842    Options Database Keys:
843 +  -options_table - Calls PetscOptionsView()
844 .  -options_left - Prints unused options that remain in the database
845 .  -objects_left  - Prints list of all objects that have not been freed
846 .  -mpidump - Calls PetscMPIDump()
847 .  -malloc_dump - Calls PetscMallocDump()
848 .  -malloc_info - Prints total memory usage
849 -  -malloc_log - Prints summary of memory usage
850 
851    Options Database Keys for Profiling:
852    See the <a href="../../docs/manual.pdf#nameddest=ch_profiling">profiling chapter of the users manual</a> for details.
853 +  -log_summary [filename] - Prints summary of flop and timing
854         information to screen. If the filename is specified the
855         summary is written to the file.  See PetscLogView().
856 .  -log_summary_python [filename] - Prints data on of flop and timing usage to a file or screen.
857         See PetscLogPrintSViewPython().
858 .  -log_all [filename] - Logs extensive profiling information
859         See PetscLogDump().
860 .  -log [filename] - Logs basic profiline information  See PetscLogDump().
861 .  -log_sync - Log the synchronization in scatters, inner products
862         and norms
863 -  -log_mpe [filename] - Creates a logfile viewable by the
864       utility Upshot/Nupshot (in MPICH distribution)
865 
866    Level: beginner
867 
868    Note:
869    See PetscInitialize() for more general runtime options.
870 
871 .seealso: PetscInitialize(), PetscOptionsView(), PetscMallocDump(), PetscMPIDump(), PetscEnd()
872 @*/
873 PetscErrorCode  PetscFinalize(void)
874 {
875   PetscErrorCode ierr;
876   PetscMPIInt    rank;
877   PetscInt       i,nopt;
878   PetscBool      flg1 = PETSC_FALSE,flg2 = PETSC_FALSE,flg3 = PETSC_FALSE,objects_left = PETSC_FALSE;
879 #if defined(PETSC_HAVE_AMS)
880   PetscBool      flg = PETSC_FALSE;
881 #endif
882 #if defined(PETSC_USE_LOG)
883   char           mname[PETSC_MAX_PATH_LEN];
884 #endif
885 
886   PetscFunctionBegin;
887 
888   if (!PetscInitializeCalled) {
889     printf("PetscInitialize() must be called before PetscFinalize()\n");
890     PetscFunctionReturn(PETSC_ERR_ARG_WRONGSTATE);
891   }
892   ierr = PetscInfo(PETSC_NULL,"PetscFinalize() called\n");
893 
894 #if defined(PETSC_HAVE_AMS)
895   ierr = PetscOptionsGetBool(PETSC_NULL,"-options_gui",&flg,PETSC_NULL);CHKERRQ(ierr);
896   if (flg) {
897     ierr = PetscOptionsAMSDestroy();CHKERRQ(ierr);
898   }
899 #endif
900 
901   ierr = PetscHMPIFinalize();CHKERRQ(ierr);
902 #if defined(PETSC_HAVE_PTHREADCLASSES)
903   if (PetscThreadFinalize) {
904     /* thread pool case */
905     ierr = (*PetscThreadFinalize)();CHKERRQ(ierr);
906   }
907   free(ThreadCoreAffinity);
908 #endif
909 
910   ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr);
911   ierr = PetscOptionsGetBool(PETSC_NULL,"-malloc_info",&flg2,PETSC_NULL);CHKERRQ(ierr);
912   if (!flg2) {
913     flg2 = PETSC_FALSE;
914     ierr = PetscOptionsGetBool(PETSC_NULL,"-memory_info",&flg2,PETSC_NULL);CHKERRQ(ierr);
915   }
916   if (flg2) {
917     ierr = PetscMemoryShowUsage(PETSC_VIEWER_STDOUT_WORLD,"Summary of Memory Usage in PETSc\n");CHKERRQ(ierr);
918   }
919 
920 #if defined(PETSC_USE_LOG)
921   flg1 = PETSC_FALSE;
922   ierr = PetscOptionsGetBool(PETSC_NULL,"-get_total_flops",&flg1,PETSC_NULL);CHKERRQ(ierr);
923   if (flg1) {
924     PetscLogDouble flops = 0;
925     ierr = MPI_Reduce(&_TotalFlops,&flops,1,MPI_DOUBLE,MPI_SUM,0,PETSC_COMM_WORLD);CHKERRQ(ierr);
926     ierr = PetscPrintf(PETSC_COMM_WORLD,"Total flops over all processors %g\n",flops);CHKERRQ(ierr);
927   }
928 #endif
929 
930 
931 #if defined(PETSC_USE_LOG)
932 #if defined(PETSC_HAVE_MPE)
933   mname[0] = 0;
934   ierr = PetscOptionsGetString(PETSC_NULL,"-log_mpe",mname,PETSC_MAX_PATH_LEN,&flg1);CHKERRQ(ierr);
935   if (flg1){
936     if (mname[0]) {ierr = PetscLogMPEDump(mname);CHKERRQ(ierr);}
937     else          {ierr = PetscLogMPEDump(0);CHKERRQ(ierr);}
938   }
939 #endif
940   mname[0] = 0;
941   ierr = PetscOptionsGetString(PETSC_NULL,"-log_summary",mname,PETSC_MAX_PATH_LEN,&flg1);CHKERRQ(ierr);
942   if (flg1) {
943     PetscViewer viewer;
944     if (mname[0])  {
945       ierr = PetscViewerASCIIOpen(PETSC_COMM_WORLD,mname,&viewer);CHKERRQ(ierr);
946       ierr = PetscLogView(viewer);CHKERRQ(ierr);
947       ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr);
948     } else {
949       viewer = PETSC_VIEWER_STDOUT_WORLD;
950       ierr = PetscLogView(viewer);CHKERRQ(ierr);
951     }
952   }
953 
954   mname[0] = 0;
955   ierr = PetscOptionsGetString(PETSC_NULL,"-log_summary_python",mname,PETSC_MAX_PATH_LEN,&flg1);CHKERRQ(ierr);
956   if (flg1) {
957     PetscViewer viewer;
958     if (mname[0])  {
959       ierr = PetscViewerASCIIOpen(PETSC_COMM_WORLD,mname,&viewer);CHKERRQ(ierr);
960       ierr = PetscLogViewPython(viewer);CHKERRQ(ierr);
961       ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr);
962     } else {
963       viewer = PETSC_VIEWER_STDOUT_WORLD;
964       ierr = PetscLogViewPython(viewer);CHKERRQ(ierr);
965     }
966   }
967 
968   ierr = PetscOptionsGetString(PETSC_NULL,"-log_detailed",mname,PETSC_MAX_PATH_LEN,&flg1);CHKERRQ(ierr);
969   if (flg1) {
970     if (mname[0])  {ierr = PetscLogPrintDetailed(PETSC_COMM_WORLD,mname);CHKERRQ(ierr);}
971     else           {ierr = PetscLogPrintDetailed(PETSC_COMM_WORLD,0);CHKERRQ(ierr);}
972   }
973 
974   mname[0] = 0;
975   ierr = PetscOptionsGetString(PETSC_NULL,"-log_all",mname,PETSC_MAX_PATH_LEN,&flg1);CHKERRQ(ierr);
976   ierr = PetscOptionsGetString(PETSC_NULL,"-log",mname,PETSC_MAX_PATH_LEN,&flg2);CHKERRQ(ierr);
977   if (flg1 || flg2){
978     if (mname[0]) PetscLogDump(mname);
979     else          PetscLogDump(0);
980   }
981 #endif
982 
983 #if defined(PETSC_USE_DEBUG) && !defined(PETSC_USE_PTHREAD)
984   if (PetscStackActive) {
985     ierr = PetscStackDestroy();CHKERRQ(ierr);
986   }
987 #endif
988 
989   flg1 = PETSC_FALSE;
990   ierr = PetscOptionsGetBool(PETSC_NULL,"-no_signal_handler",&flg1,PETSC_NULL);CHKERRQ(ierr);
991   if (!flg1) { ierr = PetscPopSignalHandler();CHKERRQ(ierr);}
992   flg1 = PETSC_FALSE;
993   ierr = PetscOptionsGetBool(PETSC_NULL,"-mpidump",&flg1,PETSC_NULL);CHKERRQ(ierr);
994   if (flg1) {
995     ierr = PetscMPIDump(stdout);CHKERRQ(ierr);
996   }
997   flg1 = PETSC_FALSE;
998   flg2 = PETSC_FALSE;
999   /* preemptive call to avoid listing this option in options table as unused */
1000   ierr = PetscOptionsHasName(PETSC_NULL,"-malloc_dump",&flg1);CHKERRQ(ierr);
1001   ierr = PetscOptionsGetBool(PETSC_NULL,"-options_table",&flg2,PETSC_NULL);CHKERRQ(ierr);
1002 
1003   if (flg2) {
1004     ierr = PetscOptionsView(PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr);
1005   }
1006 
1007   /* to prevent PETSc -options_left from warning */
1008   ierr = PetscOptionsHasName(PETSC_NULL,"-nox",&flg1);CHKERRQ(ierr);
1009   ierr = PetscOptionsHasName(PETSC_NULL,"-nox_warning",&flg1);CHKERRQ(ierr);
1010   ierr = PetscOptionsGetBool(PETSC_NULL,"-objects_left",&objects_left,PETSC_NULL);CHKERRQ(ierr);
1011 
1012   if (!PetscHMPIWorker) { /* worker processes skip this because they do not usually process options */
1013     flg3 = PETSC_FALSE; /* default value is required */
1014     ierr = PetscOptionsGetBool(PETSC_NULL,"-options_left",&flg3,&flg1);CHKERRQ(ierr);
1015     ierr = PetscOptionsAllUsed(&nopt);CHKERRQ(ierr);
1016     if (flg3) {
1017       if (!flg2) { /* have not yet printed the options */
1018 	ierr = PetscOptionsView(PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr);
1019       }
1020       if (!nopt) {
1021 	ierr = PetscPrintf(PETSC_COMM_WORLD,"There are no unused options.\n");CHKERRQ(ierr);
1022       } else if (nopt == 1) {
1023 	ierr = PetscPrintf(PETSC_COMM_WORLD,"There is one unused database option. It is:\n");CHKERRQ(ierr);
1024       } else {
1025 	ierr = PetscPrintf(PETSC_COMM_WORLD,"There are %D unused database options. They are:\n",nopt);CHKERRQ(ierr);
1026       }
1027     }
1028 #if defined(PETSC_USE_DEBUG)
1029     if (nopt && !flg3 && !flg1) {
1030       ierr = PetscPrintf(PETSC_COMM_WORLD,"WARNING! There are options you set that were not used!\n");CHKERRQ(ierr);
1031       ierr = PetscPrintf(PETSC_COMM_WORLD,"WARNING! could be spelling mistake, etc!\n");CHKERRQ(ierr);
1032       ierr = PetscOptionsLeft();CHKERRQ(ierr);
1033     } else if (nopt && flg3) {
1034 #else
1035     if (nopt && flg3) {
1036 #endif
1037       ierr = PetscOptionsLeft();CHKERRQ(ierr);
1038     }
1039   }
1040 
1041   /*
1042      Free all objects registered with PetscObjectRegisterDestroy() such as PETSC_VIEWER_XXX_().
1043   */
1044   ierr = PetscObjectRegisterDestroyAll();CHKERRQ(ierr);
1045 
1046   /*
1047        List all objects the user may have forgot to free
1048   */
1049   if (objects_left && PetscObjectsCounts) {
1050     ierr = PetscPrintf(PETSC_COMM_WORLD,"The following objects %D were never freed\n",PetscObjectsCounts);
1051   }
1052   for (i=0; i<PetscObjectsMaxCounts; i++) {
1053     if (PetscObjects[i]) {
1054       if (objects_left) {
1055         ierr = PetscPrintf(PETSC_COMM_WORLD,"  %s %s %s\n",PetscObjects[i]->class_name,PetscObjects[i]->type_name,PetscObjects[i]->name);CHKERRQ(ierr);
1056       }
1057     }
1058   }
1059   /* cannot actually destroy the left over objects, but destroy the list */
1060   PetscObjectsCounts    = 0;
1061   PetscObjectsMaxCounts = 0;
1062   ierr = PetscFree(PetscObjects);CHKERRQ(ierr);
1063 
1064 
1065 #if defined(PETSC_USE_LOG)
1066   ierr = PetscLogDestroy();CHKERRQ(ierr);
1067 #endif
1068 
1069   /*
1070        Free all the registered create functions, such as KSPList, VecList, SNESList, etc
1071   */
1072   ierr = PetscFListDestroyAll();CHKERRQ(ierr);
1073 
1074   /*
1075      Destroy any packages that registered a finalize
1076   */
1077   ierr = PetscRegisterFinalizeAll();CHKERRQ(ierr);
1078 
1079   /*
1080      Destroy all the function registration lists created
1081   */
1082   ierr = PetscFinalize_DynamicLibraries();CHKERRQ(ierr);
1083 
1084   if (petsc_history) {
1085     ierr = PetscCloseHistoryFile(&petsc_history);CHKERRQ(ierr);
1086     petsc_history = 0;
1087   }
1088 
1089   ierr = PetscInfoAllow(PETSC_FALSE,PETSC_NULL);CHKERRQ(ierr);
1090 
1091   {
1092     char fname[PETSC_MAX_PATH_LEN];
1093     FILE *fd;
1094     int  err;
1095 
1096     fname[0] = 0;
1097     ierr = PetscOptionsGetString(PETSC_NULL,"-malloc_dump",fname,250,&flg1);CHKERRQ(ierr);
1098     if (flg1 && fname[0]) {
1099       char sname[PETSC_MAX_PATH_LEN];
1100 
1101       sprintf(sname,"%s_%d",fname,rank);
1102       fd   = fopen(sname,"w"); if (!fd) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_OPEN,"Cannot open log file: %s",sname);
1103       ierr = PetscMallocDump(fd);CHKERRQ(ierr);
1104       err = fclose(fd);
1105       if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fclose() failed on file");
1106     } else if (flg1) {
1107       MPI_Comm local_comm;
1108 
1109       ierr = MPI_Comm_dup(MPI_COMM_WORLD,&local_comm);CHKERRQ(ierr);
1110       ierr = PetscSequentialPhaseBegin_Private(local_comm,1);CHKERRQ(ierr);
1111         ierr = PetscMallocDump(stdout);CHKERRQ(ierr);
1112       ierr = PetscSequentialPhaseEnd_Private(local_comm,1);CHKERRQ(ierr);
1113       ierr = MPI_Comm_free(&local_comm);CHKERRQ(ierr);
1114     }
1115   }
1116   {
1117     char fname[PETSC_MAX_PATH_LEN];
1118     FILE *fd;
1119 
1120     fname[0] = 0;
1121     ierr = PetscOptionsGetString(PETSC_NULL,"-malloc_log",fname,250,&flg1);CHKERRQ(ierr);
1122     if (flg1 && fname[0]) {
1123       char sname[PETSC_MAX_PATH_LEN];
1124       int  err;
1125 
1126       sprintf(sname,"%s_%d",fname,rank);
1127       fd   = fopen(sname,"w"); if (!fd) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_OPEN,"Cannot open log file: %s",sname);
1128       ierr = PetscMallocDumpLog(fd);CHKERRQ(ierr);
1129       err = fclose(fd);
1130       if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fclose() failed on file");
1131     } else if (flg1) {
1132       ierr = PetscMallocDumpLog(stdout);CHKERRQ(ierr);
1133     }
1134   }
1135   /* Can be destroyed only after all the options are used */
1136   ierr = PetscOptionsDestroy();CHKERRQ(ierr);
1137 
1138   PetscGlobalArgc = 0;
1139   PetscGlobalArgs = 0;
1140 
1141 #if defined(PETSC_USE_REAL___FLOAT128)
1142   ierr = MPI_Type_free(&MPIU___FLOAT128);CHKERRQ(ierr);
1143   ierr = MPI_Op_free(&MPIU_SUM);CHKERRQ(ierr);
1144   ierr = MPI_Op_free(&MPIU_MAX);CHKERRQ(ierr);
1145   ierr = MPI_Op_free(&MPIU_MIN);CHKERRQ(ierr);
1146 #endif
1147 
1148 #if defined(PETSC_USE_COMPLEX)
1149 #if !defined(PETSC_HAVE_MPI_C_DOUBLE_COMPLEX)
1150   ierr = MPI_Op_free(&MPIU_SUM);CHKERRQ(ierr);
1151   ierr = MPI_Type_free(&MPI_C_DOUBLE_COMPLEX);CHKERRQ(ierr);
1152   ierr = MPI_Type_free(&MPI_C_COMPLEX);CHKERRQ(ierr);
1153 #endif
1154 #endif
1155   ierr = MPI_Type_free(&MPIU_2SCALAR);CHKERRQ(ierr);
1156   ierr = MPI_Type_free(&MPIU_2INT);CHKERRQ(ierr);
1157   ierr = MPI_Op_free(&PetscMaxSum_Op);CHKERRQ(ierr);
1158   ierr = MPI_Op_free(&PetscADMax_Op);CHKERRQ(ierr);
1159   ierr = MPI_Op_free(&PetscADMin_Op);CHKERRQ(ierr);
1160 
1161   /*
1162      Destroy any known inner communicators and attributes pointing to them
1163      Note this will not destroy any new communicators the user has created
1164  */
1165   {
1166     PetscCommCounter *counter;
1167     PetscMPIInt      flg;
1168     MPI_Comm         icomm;
1169     void             *ptr;
1170     ierr  = MPI_Attr_get(PETSC_COMM_SELF,Petsc_InnerComm_keyval,&ptr,&flg);CHKERRQ(ierr);
1171     if (flg) {
1172       /*  Use PetscMemcpy() because casting from pointer to integer of different size is not allowed with some compilers  */
1173       ierr = PetscMemcpy(&icomm,&ptr,sizeof(MPI_Comm));CHKERRQ(ierr);
1174       ierr = MPI_Attr_get(icomm,Petsc_Counter_keyval,&counter,&flg);CHKERRQ(ierr);
1175       if (!flg) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_CORRUPT,"Inner MPI_Comm does not have expected tag/name counter, problem with corrupted memory");
1176 
1177       ierr = MPI_Attr_delete(icomm,Petsc_Counter_keyval);CHKERRQ(ierr);
1178       ierr = MPI_Attr_delete(icomm,Petsc_OuterComm_keyval);CHKERRQ(ierr);
1179       ierr = MPI_Comm_free(&icomm);CHKERRQ(ierr);
1180       ierr = MPI_Attr_delete(PETSC_COMM_SELF,Petsc_InnerComm_keyval);CHKERRQ(ierr);
1181     }
1182     ierr  = MPI_Attr_get(PETSC_COMM_WORLD,Petsc_InnerComm_keyval,&ptr,&flg);CHKERRQ(ierr);
1183     if (flg) {
1184       /*  Use PetscMemcpy() because casting from pointer to integer of different size is not allowed with some compilers  */
1185       ierr = PetscMemcpy(&icomm,&ptr,sizeof(MPI_Comm));CHKERRQ(ierr);
1186       ierr = MPI_Attr_get(icomm,Petsc_Counter_keyval,&counter,&flg);CHKERRQ(ierr);
1187       if (!flg) SETERRQ(PETSC_COMM_WORLD,PETSC_ERR_ARG_CORRUPT,"Inner MPI_Comm does not have expected tag/name counter, problem with corrupted memory");
1188 
1189       ierr = MPI_Attr_delete(icomm,Petsc_Counter_keyval);CHKERRQ(ierr);
1190       ierr = MPI_Attr_delete(icomm,Petsc_OuterComm_keyval);CHKERRQ(ierr);
1191       ierr = MPI_Comm_free(&icomm);CHKERRQ(ierr);
1192       ierr = MPI_Attr_delete(PETSC_COMM_WORLD,Petsc_InnerComm_keyval);CHKERRQ(ierr);
1193     }
1194   }
1195 
1196   ierr = MPI_Keyval_free(&Petsc_Counter_keyval);CHKERRQ(ierr);
1197   ierr = MPI_Keyval_free(&Petsc_InnerComm_keyval);CHKERRQ(ierr);
1198   ierr = MPI_Keyval_free(&Petsc_OuterComm_keyval);CHKERRQ(ierr);
1199 
1200   ierr = PetscInfo(0,"PETSc successfully ended!\n");CHKERRQ(ierr);
1201   if (PetscBeganMPI) {
1202 #if defined(PETSC_HAVE_MPI_FINALIZED)
1203     PetscMPIInt flag;
1204     ierr = MPI_Finalized(&flag);CHKERRQ(ierr);
1205     if (flag) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"MPI_Finalize() has already been called, even though MPI_Init() was called by PetscInitialize()");
1206 #endif
1207     ierr = MPI_Finalize();CHKERRQ(ierr);
1208   }
1209 
1210   if (PETSC_ZOPEFD){
1211     if (PETSC_ZOPEFD != PETSC_STDOUT) fprintf(PETSC_ZOPEFD, "<<<end>>>");
1212     else fprintf(PETSC_STDOUT, "<<<end>>>");
1213   }
1214 
1215 #if defined(PETSC_HAVE_CUDA)
1216   cublasShutdown();
1217 #endif
1218 /*
1219 
1220      Note: In certain cases PETSC_COMM_WORLD is never MPI_Comm_free()ed because
1221    the communicator has some outstanding requests on it. Specifically if the
1222    flag PETSC_HAVE_BROKEN_REQUEST_FREE is set (for IBM MPI implementation). See
1223    src/vec/utils/vpscat.c. Due to this the memory allocated in PetscCommDuplicate()
1224    is never freed as it should be. Thus one may obtain messages of the form
1225    [ 1] 8 bytes PetscCommDuplicate() line 645 in src/sys/mpiu.c indicating the
1226    memory was not freed.
1227 
1228 */
1229   ierr = PetscMallocClear();CHKERRQ(ierr);
1230   PetscInitializeCalled = PETSC_FALSE;
1231   PetscFinalizeCalled   = PETSC_TRUE;
1232   PetscFunctionReturn(ierr);
1233 }
1234 
1235