xref: /petsc/src/sys/objects/pinit.c (revision 0577ce7cd15ec52a37d32cbb9813e43d659c8ad3)
1 #define PETSC_DLL
2 /*
3    This file defines the initialization of PETSc, including PetscInitialize()
4 */
5 
6 #include "petsc.h"        /*I  "petsc.h"   I*/
7 #include "petscsys.h"
8 
9 #if defined(PETSC_USE_LOG)
10 EXTERN PetscErrorCode PetscLogBegin_Private(void);
11 #endif
12 extern PetscTruth PetscOpenMPWorker;
13 
14 /* -----------------------------------------------------------------------------------------*/
15 
16 extern FILE *petsc_history;
17 
18 EXTERN PetscErrorCode PetscInitialize_DynamicLibraries(void);
19 EXTERN PetscErrorCode PetscFinalize_DynamicLibraries(void);
20 EXTERN PetscErrorCode PetscFListDestroyAll(void);
21 EXTERN PetscErrorCode PetscSequentialPhaseBegin_Private(MPI_Comm,int);
22 EXTERN PetscErrorCode PetscSequentialPhaseEnd_Private(MPI_Comm,int);
23 EXTERN PetscErrorCode PetscLogCloseHistoryFile(FILE **);
24 EXTERN PetscErrorCode PetscOptionsHelpDestroyList(void);
25 
26 /* this is used by the _, __, and ___ macros (see include/petscerror.h) */
27 PetscErrorCode __gierr = 0;
28 
29 /* user may set this BEFORE calling PetscInitialize() */
30 MPI_Comm PETSC_COMM_WORLD = 0;
31 
32 /*
33      Declare and set all the string names of the PETSc enums
34 */
35 const char *PetscTruths[]    = {"FALSE","TRUE","PetscTruth","PETSC_",0};
36 const char *PetscDataTypes[] = {"INT", "DOUBLE", "COMPLEX",
37                                 "LONG","SHORT",  "FLOAT",
38                                 "CHAR","LOGICAL","ENUM","TRUTH","LONGDOUBLE","PetscDataType","PETSC_",0};
39 
40 PetscTruth PetscPreLoadingUsed = PETSC_FALSE;
41 PetscTruth PetscPreLoadingOn   = PETSC_FALSE;
42 
43 /*
44        Checks the options database for initializations related to the
45     PETSc components
46 */
47 #undef __FUNCT__
48 #define __FUNCT__ "PetscOptionsCheckInitial_Components"
49 PetscErrorCode PETSC_DLLEXPORT PetscOptionsCheckInitial_Components(void)
50 {
51   PetscTruth flg1;
52   PetscErrorCode ierr;
53 
54   PetscFunctionBegin;
55   ierr = PetscOptionsHasName(PETSC_NULL,"-help",&flg1);CHKERRQ(ierr);
56   if (flg1) {
57 #if defined (PETSC_USE_LOG)
58     MPI_Comm   comm = PETSC_COMM_WORLD;
59     ierr = (*PetscHelpPrintf)(comm,"------Additional PETSc component options--------\n");CHKERRQ(ierr);
60     ierr = (*PetscHelpPrintf)(comm," -log_summary_exclude: <vec,mat,pc.ksp,snes>\n");CHKERRQ(ierr);
61     ierr = (*PetscHelpPrintf)(comm," -info_exclude: <null,vec,mat,pc,ksp,snes,ts>\n");CHKERRQ(ierr);
62     ierr = (*PetscHelpPrintf)(comm,"-----------------------------------------------\n");CHKERRQ(ierr);
63 #endif
64   }
65   PetscFunctionReturn(0);
66 }
67 
68 #undef __FUNCT__
69 #define __FUNCT__ "PetscInitializeNoArguments"
70 /*@C
71       PetscInitializeNoArguments - Calls PetscInitialize() from C/C++ without
72         the command line arguments.
73 
74    Collective
75 
76    Level: advanced
77 
78 .seealso: PetscInitialize(), PetscInitializeFortran()
79 @*/
80 PetscErrorCode PETSC_DLLEXPORT PetscInitializeNoArguments(void)
81 {
82   PetscErrorCode ierr;
83   int            argc = 0;
84   char           **args = 0;
85 
86   PetscFunctionBegin;
87   ierr = PetscInitialize(&argc,&args,PETSC_NULL,PETSC_NULL);
88   PetscFunctionReturn(ierr);
89 }
90 
91 #undef __FUNCT__
92 #define __FUNCT__ "PetscInitialized"
93 /*@
94       PetscInitialized - Determine whether PETSc is initialized.
95 
96 7   Level: beginner
97 
98 .seealso: PetscInitialize(), PetscInitializeNoArguments(), PetscInitializeFortran()
99 @*/
100 PetscErrorCode PETSC_DLLEXPORT PetscInitialized(PetscTruth *isInitialized)
101 {
102   PetscFunctionBegin;
103   PetscValidPointer(isInitialized, 1);
104   *isInitialized = PetscInitializeCalled;
105   PetscFunctionReturn(0);
106 }
107 
108 #undef __FUNCT__
109 #define __FUNCT__ "PetscFinalized"
110 /*@
111       PetscFinalized - Determine whether PetscFinalize() has been called yet
112 
113    Level: developer
114 
115 .seealso: PetscInitialize(), PetscInitializeNoArguments(), PetscInitializeFortran()
116 @*/
117 PetscErrorCode PETSC_DLLEXPORT PetscFinalized(PetscTruth *isFinalized)
118 {
119   PetscFunctionBegin;
120   PetscValidPointer(isFinalized, 1);
121   *isFinalized = PetscFinalizeCalled;
122   PetscFunctionReturn(0);
123 }
124 
125 EXTERN PetscErrorCode        PetscOptionsCheckInitial_Private(void);
126 extern PetscTruth PetscBeganMPI;
127 
128 /*
129        This function is the MPI reduction operation used to compute the sum of the
130    first half of the datatype and the max of the second half.
131 */
132 MPI_Op PetscMaxSum_Op = 0;
133 
134 EXTERN_C_BEGIN
135 #undef __FUNCT__
136 #define __FUNCT__ "PetscMaxSum_Local"
137 void PETSC_DLLEXPORT MPIAPI PetscMaxSum_Local(void *in,void *out,int *cnt,MPI_Datatype *datatype)
138 {
139   PetscInt *xin = (PetscInt*)in,*xout = (PetscInt*)out,i,count = *cnt;
140 
141   PetscFunctionBegin;
142   if (*datatype != MPIU_2INT) {
143     (*PetscErrorPrintf)("Can only handle MPIU_2INT data types");
144     MPI_Abort(MPI_COMM_WORLD,1);
145   }
146 
147   for (i=0; i<count; i++) {
148     xout[2*i]    = PetscMax(xout[2*i],xin[2*i]);
149     xout[2*i+1] += xin[2*i+1];
150   }
151   PetscStackPop;
152   return;
153 }
154 EXTERN_C_END
155 
156 /*
157     Returns the max of the first entry owned by this processor and the
158 sum of the second entry.
159 
160     The reason nprocs[2*i] contains lengths nprocs[2*i+1] contains flag of 1 if length is nonzero
161 is so that the PetscMaxSum_Op() can set TWO values, if we passed in only nprocs[i] with lengths
162 there would be no place to store the both needed results.
163 */
164 #undef __FUNCT__
165 #define __FUNCT__ "PetscMaxSum"
166 PetscErrorCode PETSC_DLLEXPORT PetscMaxSum(MPI_Comm comm,const PetscInt nprocs[],PetscInt *max,PetscInt *sum)
167 {
168   PetscMPIInt    size,rank;
169   PetscInt       *work;
170   PetscErrorCode ierr;
171 
172   PetscFunctionBegin;
173   ierr   = MPI_Comm_size(comm,&size);CHKERRQ(ierr);
174   ierr   = MPI_Comm_rank(comm,&rank);CHKERRQ(ierr);
175   ierr   = PetscMalloc(2*size*sizeof(PetscInt),&work);CHKERRQ(ierr);
176   ierr   = MPI_Allreduce((void*)nprocs,work,size,MPIU_2INT,PetscMaxSum_Op,comm);CHKERRQ(ierr);
177   *max   = work[2*rank];
178   *sum   = work[2*rank+1];
179   ierr   = PetscFree(work);CHKERRQ(ierr);
180   PetscFunctionReturn(0);
181 }
182 
183 /* ----------------------------------------------------------------------------*/
184 MPI_Op PETSC_DLLEXPORT PetscADMax_Op = 0;
185 
186 EXTERN_C_BEGIN
187 #undef __FUNCT__
188 #define __FUNCT__ "PetscADMax_Local"
189 void PETSC_DLLEXPORT MPIAPI PetscADMax_Local(void *in,void *out,PetscMPIInt *cnt,MPI_Datatype *datatype)
190 {
191   PetscScalar *xin = (PetscScalar *)in,*xout = (PetscScalar*)out;
192   PetscInt    i,count = *cnt;
193 
194   PetscFunctionBegin;
195   if (*datatype != MPIU_2SCALAR) {
196     (*PetscErrorPrintf)("Can only handle MPIU_2SCALAR data (i.e. double or complex) types");
197     MPI_Abort(MPI_COMM_WORLD,1);
198   }
199 
200   for (i=0; i<count; i++) {
201     if (PetscRealPart(xout[2*i]) < PetscRealPart(xin[2*i])) {
202       xout[2*i]   = xin[2*i];
203       xout[2*i+1] = xin[2*i+1];
204     }
205   }
206 
207   PetscStackPop;
208   return;
209 }
210 EXTERN_C_END
211 
212 MPI_Op PETSC_DLLEXPORT PetscADMin_Op = 0;
213 
214 EXTERN_C_BEGIN
215 #undef __FUNCT__
216 #define __FUNCT__ "PetscADMin_Local"
217 void PETSC_DLLEXPORT MPIAPI PetscADMin_Local(void *in,void *out,PetscMPIInt *cnt,MPI_Datatype *datatype)
218 {
219   PetscScalar *xin = (PetscScalar *)in,*xout = (PetscScalar*)out;
220   PetscInt    i,count = *cnt;
221 
222   PetscFunctionBegin;
223   if (*datatype != MPIU_2SCALAR) {
224     (*PetscErrorPrintf)("Can only handle MPIU_2SCALAR data (i.e. double or complex) types");
225     MPI_Abort(MPI_COMM_WORLD,1);
226   }
227 
228   for (i=0; i<count; i++) {
229     if (PetscRealPart(xout[2*i]) > PetscRealPart(xin[2*i])) {
230       xout[2*i]   = xin[2*i];
231       xout[2*i+1] = xin[2*i+1];
232     }
233   }
234 
235   PetscStackPop;
236   return;
237 }
238 EXTERN_C_END
239 /* ---------------------------------------------------------------------------------------*/
240 
241 #if defined(PETSC_USE_COMPLEX)
242 MPI_Op PetscSum_Op = 0;
243 
244 EXTERN_C_BEGIN
245 #undef __FUNCT__
246 #define __FUNCT__ "PetscSum_Local"
247 void PETSC_DLLEXPORT PetscSum_Local(void *in,void *out,PetscMPIInt *cnt,MPI_Datatype *datatype)
248 {
249   PetscScalar *xin = (PetscScalar *)in,*xout = (PetscScalar*)out;
250   PetscInt    i,count = *cnt;
251 
252   PetscFunctionBegin;
253   if (*datatype != MPIU_SCALAR) {
254     (*PetscErrorPrintf)("Can only handle MPIU_SCALAR data (i.e. double or complex) types");
255     MPI_Abort(MPI_COMM_WORLD,1);
256   }
257 
258   for (i=0; i<count; i++) {
259     xout[i] += xin[i];
260   }
261 
262   PetscStackPop;
263   return;
264 }
265 EXTERN_C_END
266 #endif
267 
268 #if defined(PETSC_USE_PETSC_MPI_EXTERNAL32)
269 #if !defined(PETSC_WORDS_BIGENDIAN)
270 EXTERN_C_BEGIN
271 extern PetscMPIInt PetscDataRep_extent_fn(MPI_Datatype,MPI_Aint*,void*);
272 extern PetscMPIInt PetscDataRep_read_conv_fn(void*, MPI_Datatype,PetscMPIInt,void*,MPI_Offset,void*);
273 extern PetscMPIInt PetscDataRep_write_conv_fn(void*, MPI_Datatype,PetscMPIInt,void*,MPI_Offset,void*);
274 EXTERN_C_END
275 #endif
276 #endif
277 
278 int  PetscGlobalArgc   = 0;
279 char **PetscGlobalArgs = 0;
280 
281 #undef __FUNCT__
282 #define __FUNCT__ "PetscGetArgs"
283 /*@C
284    PetscGetArgs - Allows you to access the raw command line arguments anywhere
285      after PetscInitialize() is called but before PetscFinalize().
286 
287    Not Collective
288 
289    Output Parameters:
290 +  argc - count of number of command line arguments
291 -  args - the command line arguments
292 
293    Level: intermediate
294 
295    Notes:
296       This is usually used to pass the command line arguments into other libraries
297    that are called internally deep in PETSc or the application.
298 
299    Concepts: command line arguments
300 
301 .seealso: PetscFinalize(), PetscInitializeFortran(), PetscGetArguments()
302 
303 @*/
304 PetscErrorCode PETSC_DLLEXPORT PetscGetArgs(int *argc,char ***args)
305 {
306   PetscFunctionBegin;
307   if (!PetscInitializeCalled && PetscFinalizeCalled) {
308     SETERRQ(PETSC_ERR_ORDER,"You must call after PetscInitialize() but before PetscFinalize()");
309   }
310   *argc = PetscGlobalArgc;
311   *args = PetscGlobalArgs;
312   PetscFunctionReturn(0);
313 }
314 
315 #undef __FUNCT__
316 #define __FUNCT__ "PetscGetArguments"
317 /*@C
318    PetscGetArguments - Allows you to access the  command line arguments anywhere
319      after PetscInitialize() is called but before PetscFinalize().
320 
321    Not Collective
322 
323    Output Parameters:
324 .  args - the command line arguments
325 
326    Level: intermediate
327 
328    Notes:
329       This does NOT start with the program name and IS null terminated (final arg is void)
330 
331    Concepts: command line arguments
332 
333 .seealso: PetscFinalize(), PetscInitializeFortran(), PetscGetArgs(), PetscFreeArguments()
334 
335 @*/
336 PetscErrorCode PETSC_DLLEXPORT PetscGetArguments(char ***args)
337 {
338   PetscInt       i,argc = PetscGlobalArgc;
339   PetscErrorCode ierr;
340 
341   PetscFunctionBegin;
342   if (!PetscInitializeCalled && PetscFinalizeCalled) {
343     SETERRQ(PETSC_ERR_ORDER,"You must call after PetscInitialize() but before PetscFinalize()");
344   }
345   if (!argc) {*args = 0; PetscFunctionReturn(0);}
346   ierr = PetscMalloc(argc*sizeof(char*),args);CHKERRQ(ierr);
347   for (i=0; i<argc-1; i++) {
348     ierr = PetscStrallocpy(PetscGlobalArgs[i+1],&(*args)[i]);CHKERRQ(ierr);
349   }
350   (*args)[argc-1] = 0;
351   PetscFunctionReturn(0);
352 }
353 
354 #undef __FUNCT__
355 #define __FUNCT__ "PetscFreeArguments"
356 /*@C
357    PetscFreeArguments - Frees the memory obtained with PetscGetArguments()
358 
359    Not Collective
360 
361    Output Parameters:
362 .  args - the command line arguments
363 
364    Level: intermediate
365 
366    Concepts: command line arguments
367 
368 .seealso: PetscFinalize(), PetscInitializeFortran(), PetscGetArgs(), PetscGetArguments()
369 
370 @*/
371 PetscErrorCode PETSC_DLLEXPORT PetscFreeArguments(char **args)
372 {
373   PetscInt       i = 0;
374   PetscErrorCode ierr;
375 
376   PetscFunctionBegin;
377   if (!args) {PetscFunctionReturn(0);}
378   while (args[i]) {
379     ierr = PetscFree(args[i]);CHKERRQ(ierr);
380     i++;
381   }
382   ierr = PetscFree(args);CHKERRQ(ierr);
383   PetscFunctionReturn(0);
384 }
385 
386 #undef __FUNCT__
387 #define __FUNCT__ "PetscInitialize"
388 /*@C
389    PetscInitialize - Initializes the PETSc database and MPI.
390    PetscInitialize() calls MPI_Init() if that has yet to be called,
391    so this routine should always be called near the beginning of
392    your program -- usually the very first line!
393 
394    Collective on MPI_COMM_WORLD or PETSC_COMM_WORLD if it has been set
395 
396    Input Parameters:
397 +  argc - count of number of command line arguments
398 .  args - the command line arguments
399 .  file - [optional] PETSc database file, also checks ~username/.petscrc and .petscrc use PETSC_NULL to not check for
400           code specific file. Use -skip_petscrc in the code specific file to skip the .petscrc files
401 -  help - [optional] Help message to print, use PETSC_NULL for no message
402 
403    If you wish PETSc to run on a subcommunicator of MPI_COMM_WORLD, create that
404    communicator first and assign it to PETSC_COMM_WORLD BEFORE calling PetscInitialize()
405 
406    Options Database Keys:
407 +  -start_in_debugger [noxterm,dbx,xdb,gdb,...] - Starts program in debugger
408 .  -on_error_attach_debugger [noxterm,dbx,xdb,gdb,...] - Starts debugger when error detected
409 .  -on_error_emacs <machinename> causes emacsclient to jump to error file
410 .  -on_error_abort calls abort() when error detected (no traceback)
411 .  -on_error_mpiabort calls MPI_abort() when error detected
412 .  -error_output_stderr prints error messages to stderr instead of the default stdout
413 .  -error_output_none does not print the error messages (but handles errors in the same way as if this was not called)
414 .  -debugger_nodes [node1,node2,...] - Indicates nodes to start in debugger
415 .  -debugger_pause [sleeptime] (in seconds) - Pauses debugger
416 .  -stop_for_debugger - Print message on how to attach debugger manually to
417                         process and wait (-debugger_pause) seconds for attachment
418 .  -malloc - Indicates use of PETSc error-checking malloc (on by default for debug version of libraries)
419 .  -malloc no - Indicates not to use error-checking malloc
420 .  -malloc_debug - check for memory corruption at EVERY malloc or free
421 .  -fp_trap - Stops on floating point exceptions (Note that on the
422               IBM RS6000 this slows code by at least a factor of 10.)
423 .  -no_signal_handler - Indicates not to trap error signals
424 .  -shared_tmp - indicates /tmp directory is shared by all processors
425 .  -not_shared_tmp - each processor has own /tmp
426 .  -tmp - alternative name of /tmp directory
427 .  -get_total_flops - returns total flops done by all processors
428 -  -memory_info - Print memory usage at end of run
429 
430    Options Database Keys for Profiling:
431    See the Profiling chapter of the users manual for details.
432 +  -log_trace [filename] - Print traces of all PETSc calls
433         to the screen (useful to determine where a program
434         hangs without running in the debugger).  See PetscLogTraceBegin().
435 .  -info <optional filename> - Prints verbose information to the screen
436 -  -info_exclude <null,vec,mat,pc,ksp,snes,ts> - Excludes some of the verbose messages
437 
438    Environmental Variables:
439 +   PETSC_TMP - alternative tmp directory
440 .   PETSC_SHARED_TMP - tmp is shared by all processes
441 .   PETSC_NOT_SHARED_TMP - each process has its own private tmp
442 .   PETSC_VIEWER_SOCKET_PORT - socket number to use for socket viewer
443 -   PETSC_VIEWER_SOCKET_MACHINE - machine to use for socket viewer to connect to
444 
445 
446    Level: beginner
447 
448    Notes:
449    If for some reason you must call MPI_Init() separately, call
450    it before PetscInitialize().
451 
452    Fortran Version:
453    In Fortran this routine has the format
454 $       call PetscInitialize(file,ierr)
455 
456 +   ierr - error return code
457 -  file - [optional] PETSc database file, also checks ~username/.petscrc and .petscrc use PETSC_NULL_CHARACTER to not check for
458           code specific file. Use -skip_petscrc in the code specific file to skip the .petscrc files
459 
460    Important Fortran Note:
461    In Fortran, you MUST use PETSC_NULL_CHARACTER to indicate a
462    null character string; you CANNOT just use PETSC_NULL as
463    in the C version.  See the users manual for details.
464 
465 
466    Concepts: initializing PETSc
467 
468 .seealso: PetscFinalize(), PetscInitializeFortran(), PetscGetArgs()
469 
470 @*/
471 PetscErrorCode PETSC_DLLEXPORT PetscInitialize(int *argc,char ***args,const char file[],const char help[])
472 {
473   PetscErrorCode ierr;
474   PetscMPIInt    flag, size;
475   PetscInt       nodesize;
476   PetscTruth     flg;
477   char           hostname[256];
478 
479   PetscFunctionBegin;
480   if (PetscInitializeCalled) PetscFunctionReturn(0);
481   if (PetscFinalizeCalled)
482     SETERRQ(1,"You can not initialize PETSc a second time")
483 
484   /* these must be initialized in a routine, not as a constant declaration*/
485   PETSC_STDOUT = stdout;
486   PETSC_STDERR = stderr;
487 
488   ierr = PetscOptionsCreate();CHKERRQ(ierr);
489 
490   /*
491      We initialize the program name here (before MPI_Init()) because MPICH has a bug in
492      it that it sets args[0] on all processors to be args[0] on the first processor.
493   */
494   if (argc && *argc) {
495     ierr = PetscSetProgramName(**args);CHKERRQ(ierr);
496   } else {
497     ierr = PetscSetProgramName("Unknown Name");CHKERRQ(ierr);
498   }
499 
500   ierr = MPI_Initialized(&flag);CHKERRQ(ierr);
501   if (!flag) {
502     if (PETSC_COMM_WORLD) SETERRQ(PETSC_ERR_SUP,"You cannot set PETSC_COMM_WORLD if you have not initialized MPI first");
503     ierr          = MPI_Init(argc,args);CHKERRQ(ierr);
504     PetscBeganMPI = PETSC_TRUE;
505   }
506   if (argc && args) {
507     PetscGlobalArgc = *argc;
508     PetscGlobalArgs = *args;
509   }
510   PetscInitializeCalled = PETSC_TRUE;
511   PetscFinalizeCalled   = PETSC_FALSE;
512 
513   if (!PETSC_COMM_WORLD) {
514     PETSC_COMM_WORLD = MPI_COMM_WORLD;
515   }
516 
517   /* Done after init due to a bug in MPICH-GM? */
518   ierr = PetscErrorPrintfInitialize();CHKERRQ(ierr);
519 
520   ierr = MPI_Comm_rank(MPI_COMM_WORLD,&PetscGlobalRank);CHKERRQ(ierr);
521   ierr = MPI_Comm_size(MPI_COMM_WORLD,&PetscGlobalSize);CHKERRQ(ierr);
522 
523 #if defined(PETSC_USE_COMPLEX)
524   /*
525      Initialized the global complex variable; this is because with
526      shared libraries the constructors for global variables
527      are not called; at least on IRIX.
528   */
529   {
530 #if defined(PETSC_CLANGUAGE_CXX)
531     PetscScalar ic(0.0,1.0);
532     PETSC_i = ic;
533 #else
534     PETSC_i = I;
535 #endif
536   }
537 
538   ierr = MPI_Type_contiguous(2,MPIU_REAL,&MPIU_COMPLEX);CHKERRQ(ierr);
539   ierr = MPI_Type_commit(&MPIU_COMPLEX);CHKERRQ(ierr);
540   ierr = MPI_Op_create(PetscSum_Local,1,&PetscSum_Op);CHKERRQ(ierr);
541 #endif
542 
543   /*
544      Create the PETSc MPI reduction operator that sums of the first
545      half of the entries and maxes the second half.
546   */
547   ierr = MPI_Op_create(PetscMaxSum_Local,1,&PetscMaxSum_Op);CHKERRQ(ierr);
548 
549   ierr = MPI_Type_contiguous(2,MPIU_SCALAR,&MPIU_2SCALAR);CHKERRQ(ierr);
550   ierr = MPI_Type_commit(&MPIU_2SCALAR);CHKERRQ(ierr);
551   ierr = MPI_Op_create(PetscADMax_Local,1,&PetscADMax_Op);CHKERRQ(ierr);
552   ierr = MPI_Op_create(PetscADMin_Local,1,&PetscADMin_Op);CHKERRQ(ierr);
553 
554   ierr = MPI_Type_contiguous(2,MPIU_INT,&MPIU_2INT);CHKERRQ(ierr);
555   ierr = MPI_Type_commit(&MPIU_2INT);CHKERRQ(ierr);
556 
557   /*
558      Build the options database
559   */
560   ierr = PetscOptionsInsert(argc,args,file);CHKERRQ(ierr);
561 
562 
563   /*
564      Print main application help message
565   */
566   ierr = PetscOptionsHasName(PETSC_NULL,"-help",&flg);CHKERRQ(ierr);
567   if (help && flg) {
568     ierr = PetscPrintf(PETSC_COMM_WORLD,help);CHKERRQ(ierr);
569   }
570   ierr = PetscOptionsCheckInitial_Private();CHKERRQ(ierr);
571 
572   /* SHOULD PUT IN GUARDS: Make sure logging is initialized, even if we do not print it out */
573 #if defined(PETSC_USE_LOG)
574   ierr = PetscLogBegin_Private();CHKERRQ(ierr);
575 #endif
576 
577   /*
578      Load the dynamic libraries (on machines that support them), this registers all
579      the solvers etc. (On non-dynamic machines this initializes the PetscDraw and PetscViewer classes)
580   */
581   ierr = PetscInitialize_DynamicLibraries();CHKERRQ(ierr);
582 
583   ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRQ(ierr);
584   ierr = PetscInfo1(0,"PETSc successfully started: number of processors = %d\n",size);CHKERRQ(ierr);
585   ierr = PetscGetHostName(hostname,256);CHKERRQ(ierr);
586   ierr = PetscInfo1(0,"Running on machine: %s\n",hostname);CHKERRQ(ierr);
587 
588   ierr = PetscOptionsCheckInitial_Components();CHKERRQ(ierr);
589   /* Check the options database for options related to the options database itself */
590   ierr = PetscOptionsSetFromOptions(); CHKERRQ(ierr);
591 
592 #if defined(PETSC_USE_PETSC_MPI_EXTERNAL32)
593   /*
594       Tell MPI about our own data representation converter, this would/should be used if extern32 is not supported by the MPI
595 
596       Currently not used because it is not supported by MPICH.
597   */
598 #if !defined(PETSC_WORDS_BIGENDIAN)
599   ierr = MPI_Register_datarep((char *)"petsc",PetscDataRep_read_conv_fn,PetscDataRep_write_conv_fn,PetscDataRep_extent_fn,PETSC_NULL);CHKERRQ(ierr);
600 #endif
601 #endif
602 
603   ierr = PetscOptionsGetInt(PETSC_NULL,"-openmp_spawn_size",&nodesize,&flg);CHKERRQ(ierr);
604   if (flg) {
605 #if defined(PETSC_HAVE_MPI_COMM_SPAWN)
606     ierr = PetscOpenMPSpawn((PetscMPIInt) nodesize);CHKERRQ(ierr);
607 #else
608     SETERRQ(PETSC_ERR_SUP,"PETSc built without MPI 2 (MPI_Comm_spawn) support, use -openmp_merge_size instead");
609 #endif
610   } else {
611     ierr = PetscOptionsGetInt(PETSC_NULL,"-openmp_merge_size",&nodesize,&flg);CHKERRQ(ierr);
612     if (flg) {
613       ierr = PetscOpenMPMerge((PetscMPIInt) nodesize);CHKERRQ(ierr);
614     }
615   }
616   ierr = PetscOptionsHasName(PETSC_NULL,"-python",&flg);CHKERRQ(ierr);
617   if (flg) {ierr = PetscPythonInitialize(PETSC_NULL,PETSC_NULL);CHKERRQ(ierr);}
618 
619   PetscFunctionReturn(ierr);
620 }
621 
622 
623 #undef __FUNCT__
624 #define __FUNCT__ "PetscFinalize"
625 /*@C
626    PetscFinalize - Checks for options to be called at the conclusion
627    of the program. MPI_Finalize() is called only if the user had not
628    called MPI_Init() before calling PetscInitialize().
629 
630    Collective on PETSC_COMM_WORLD
631 
632    Options Database Keys:
633 +  -options_table - Calls PetscOptionsPrint()
634 .  -options_left - Prints unused options that remain in the database
635 .  -options_left no - Does not print unused options that remain in the database
636 .  -mpidump - Calls PetscMPIDump()
637 .  -malloc_dump - Calls PetscMallocDump()
638 .  -malloc_info - Prints total memory usage
639 -  -malloc_log - Prints summary of memory usage
640 
641    Options Database Keys for Profiling:
642    See the Profiling chapter of the users manual for details.
643 +  -log_summary [filename] - Prints summary of flop and timing
644         information to screen. If the filename is specified the
645         summary is written to the file. (for code compiled with
646         PETSC_USE_LOG).  See PetscLogPrintSummary().
647 .  -log_all [filename] - Logs extensive profiling information
648         (for code compiled with PETSC_USE_LOG). See PetscLogDump().
649 .  -log [filename] - Logs basic profiline information (for
650         code compiled with PETSC_USE_LOG).  See PetscLogDump().
651 .  -log_sync - Log the synchronization in scatters, inner products
652         and norms
653 -  -log_mpe [filename] - Creates a logfile viewable by the
654       utility Upshot/Nupshot (in MPICH distribution)
655 
656    Level: beginner
657 
658    Note:
659    See PetscInitialize() for more general runtime options.
660 
661 .seealso: PetscInitialize(), PetscOptionsPrint(), PetscMallocDump(), PetscMPIDump(), PetscEnd()
662 @*/
663 PetscErrorCode PETSC_DLLEXPORT PetscFinalize(void)
664 {
665   PetscErrorCode ierr;
666   PetscMPIInt    rank;
667   int            nopt;
668   PetscTruth     flg1,flg2,flg3;
669   extern FILE   *PETSC_ZOPEFD;
670 
671   PetscFunctionBegin;
672 
673   if (!PetscInitializeCalled) {
674     (*PetscErrorPrintf)("PetscInitialize() must be called before PetscFinalize()\n");
675     PetscFunctionReturn(0);
676   }
677   ierr = PetscOpenMPFinalize();CHKERRQ(ierr);
678 
679   ierr = PetscOptionsHasName(PETSC_NULL,"-python",&flg1);CHKERRQ(ierr);
680   if (flg1) {ierr = PetscPythonFinalize();CHKERRQ(ierr);}
681 
682   ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr);
683   ierr = PetscOptionsHasName(PETSC_NULL,"-malloc_info",&flg2);CHKERRQ(ierr);
684   if (!flg2) {
685     ierr = PetscOptionsHasName(PETSC_NULL,"-memory_info",&flg2);CHKERRQ(ierr);
686   }
687   if (flg2) {
688     ierr = PetscMemoryShowUsage(PETSC_VIEWER_STDOUT_WORLD,"Summary of Memory Usage in PETSc\n");CHKERRQ(ierr);
689   }
690 
691   /*
692      Free all objects registered with PetscObjectRegisterDestroy() such as PETSC_VIEWER_XXX_().
693   */
694   ierr = PetscObjectRegisterDestroyAll();CHKERRQ(ierr);
695 
696   /*
697        Free all the registered create functions, such as KSPList, VecList, SNESList, etc
698   */
699   ierr = PetscFListDestroyAll();CHKERRQ(ierr);
700 
701   /*
702      Destroy any packages that registered a finalize
703   */
704   ierr = PetscRegisterFinalizeAll();CHKERRQ(ierr);
705 
706   /*
707      Destroy all the function registration lists created
708   */
709   ierr = PetscFinalize_DynamicLibraries();CHKERRQ(ierr);
710 
711 #if defined(PETSC_USE_LOG)
712   ierr = PetscOptionsHasName(PETSC_NULL,"-get_total_flops",&flg1);CHKERRQ(ierr);
713   if (flg1) {
714     PetscLogDouble flops = 0;
715     ierr = MPI_Reduce(&_TotalFlops,&flops,1,MPI_DOUBLE,MPI_SUM,0,PETSC_COMM_WORLD);CHKERRQ(ierr);
716     ierr = PetscPrintf(PETSC_COMM_WORLD,"Total flops over all processors %g\n",flops);CHKERRQ(ierr);
717   }
718 #endif
719 
720   ierr = PetscOptionsHelpDestroyList();CHKERRQ(ierr);
721 
722 #if defined(PETSC_USE_DEBUG)
723   if (PetscStackActive) {
724     ierr = PetscStackDestroy();CHKERRQ(ierr);
725   }
726 #endif
727 
728 #if defined(PETSC_USE_LOG)
729   {
730     char mname[PETSC_MAX_PATH_LEN];
731 #if defined(PETSC_HAVE_MPE)
732     mname[0] = 0;
733     ierr = PetscOptionsGetString(PETSC_NULL,"-log_mpe",mname,PETSC_MAX_PATH_LEN,&flg1);CHKERRQ(ierr);
734     if (flg1){
735       if (mname[0]) {ierr = PetscLogMPEDump(mname);CHKERRQ(ierr);}
736       else          {ierr = PetscLogMPEDump(0);CHKERRQ(ierr);}
737     }
738 #endif
739     mname[0] = 0;
740     ierr = PetscOptionsGetString(PETSC_NULL,"-log_summary",mname,PETSC_MAX_PATH_LEN,&flg1);CHKERRQ(ierr);
741     if (flg1) {
742       if (mname[0])  {ierr = PetscLogPrintSummary(PETSC_COMM_WORLD,mname);CHKERRQ(ierr);}
743       else           {ierr = PetscLogPrintSummary(PETSC_COMM_WORLD,0);CHKERRQ(ierr);}
744     }
745 
746     ierr = PetscOptionsGetString(PETSC_NULL,"-log_detailed",mname,PETSC_MAX_PATH_LEN,&flg1);CHKERRQ(ierr);
747     if (flg1) {
748       if (mname[0])  {ierr = PetscLogPrintDetailed(PETSC_COMM_WORLD,mname);CHKERRQ(ierr);}
749       else           {ierr = PetscLogPrintDetailed(PETSC_COMM_WORLD,0);CHKERRQ(ierr);}
750     }
751 
752     mname[0] = 0;
753     ierr = PetscOptionsGetString(PETSC_NULL,"-log_all",mname,PETSC_MAX_PATH_LEN,&flg1);CHKERRQ(ierr);
754     ierr = PetscOptionsGetString(PETSC_NULL,"-log",mname,PETSC_MAX_PATH_LEN,&flg2);CHKERRQ(ierr);
755     if (flg1 || flg2){
756       if (mname[0]) PetscLogDump(mname);
757       else          PetscLogDump(0);
758     }
759     ierr = PetscLogDestroy();CHKERRQ(ierr);
760   }
761 #endif
762   ierr = PetscOptionsHasName(PETSC_NULL,"-no_signal_handler",&flg1);CHKERRQ(ierr);
763   if (!flg1) { ierr = PetscPopSignalHandler();CHKERRQ(ierr);}
764   ierr = PetscOptionsHasName(PETSC_NULL,"-mpidump",&flg1);CHKERRQ(ierr);
765   if (flg1) {
766     ierr = PetscMPIDump(stdout);CHKERRQ(ierr);
767   }
768   ierr = PetscOptionsHasName(PETSC_NULL,"-malloc_dump",&flg1);CHKERRQ(ierr);
769   ierr = PetscOptionsHasName(PETSC_NULL,"-options_table",&flg2);CHKERRQ(ierr);
770   if (flg2) {
771     if (!rank) {ierr = PetscOptionsPrint(stdout);CHKERRQ(ierr);}
772   }
773 
774   /* to prevent PETSc -options_left from warning */
775   ierr = PetscOptionsHasName(PETSC_NULL,"-nox",&flg1);CHKERRQ(ierr)
776   ierr = PetscOptionsHasName(PETSC_NULL,"-nox_warning",&flg1);CHKERRQ(ierr)
777 
778   if (!PetscOpenMPWorker) { /* worker processes skip this because they do not usually process options */
779     flg3 = PETSC_FALSE; /* default value is required */
780     ierr = PetscOptionsGetTruth(PETSC_NULL,"-options_left",&flg3,&flg1);CHKERRQ(ierr);
781     ierr = PetscOptionsAllUsed(&nopt);CHKERRQ(ierr);
782     if (flg3) {
783       if (!flg2) { /* have not yet printed the options */
784 	ierr = PetscOptionsPrint(stdout);CHKERRQ(ierr);
785       }
786       if (!nopt) {
787 	ierr = PetscPrintf(PETSC_COMM_WORLD,"There are no unused options.\n");CHKERRQ(ierr);
788       } else if (nopt == 1) {
789 	ierr = PetscPrintf(PETSC_COMM_WORLD,"There is one unused database option. It is:\n");CHKERRQ(ierr);
790       } else {
791 	ierr = PetscPrintf(PETSC_COMM_WORLD,"There are %d unused database options. They are:\n",nopt);CHKERRQ(ierr);
792       }
793     }
794 #if defined(PETSC_USE_DEBUG)
795     if (nopt && !flg3 && !flg1) {
796       ierr = PetscPrintf(PETSC_COMM_WORLD,"WARNING! There are options you set that were not used!\n");CHKERRQ(ierr);
797       ierr = PetscPrintf(PETSC_COMM_WORLD,"WARNING! could be spelling mistake, etc!\n");CHKERRQ(ierr);
798       ierr = PetscOptionsLeft();CHKERRQ(ierr);
799     } else if (nopt && flg3) {
800 #else
801     if (nopt && flg3) {
802 #endif
803       ierr = PetscOptionsLeft();CHKERRQ(ierr);
804     }
805   }
806 
807   ierr = PetscOptionsHasName(PETSC_NULL,"-log_history",&flg1);CHKERRQ(ierr);
808   if (flg1) {
809     ierr = PetscLogCloseHistoryFile(&petsc_history);CHKERRQ(ierr);
810     petsc_history = 0;
811   }
812 
813   ierr = PetscInfoAllow(PETSC_FALSE,PETSC_NULL);CHKERRQ(ierr);
814 
815   ierr = PetscOptionsHasName(PETSC_NULL,"-malloc_dump",&flg1);CHKERRQ(ierr);
816   ierr = PetscOptionsHasName(PETSC_NULL,"-malloc_log",&flg3);CHKERRQ(ierr);
817   if (flg1) {
818     char fname[PETSC_MAX_PATH_LEN];
819     FILE *fd;
820     int  err;
821 
822     fname[0] = 0;
823     ierr = PetscOptionsGetString(PETSC_NULL,"-malloc_dump",fname,250,&flg1);CHKERRQ(ierr);
824     if (flg1 && fname[0]) {
825       char sname[PETSC_MAX_PATH_LEN];
826 
827       sprintf(sname,"%s_%d",fname,rank);
828       fd   = fopen(sname,"w"); if (!fd) SETERRQ1(PETSC_ERR_FILE_OPEN,"Cannot open log file: %s",sname);
829       ierr = PetscMallocDump(fd);CHKERRQ(ierr);
830       err = fclose(fd);
831       if (err) SETERRQ(PETSC_ERR_SYS,"fclose() failed on file");
832     } else {
833       MPI_Comm local_comm;
834 
835       ierr = MPI_Comm_dup(MPI_COMM_WORLD,&local_comm);CHKERRQ(ierr);
836       ierr = PetscSequentialPhaseBegin_Private(local_comm,1);CHKERRQ(ierr);
837         ierr = PetscMallocDump(stdout);CHKERRQ(ierr);
838       ierr = PetscSequentialPhaseEnd_Private(local_comm,1);CHKERRQ(ierr);
839       ierr = MPI_Comm_free(&local_comm);CHKERRQ(ierr);
840     }
841   }
842   if (flg3) {
843     char fname[PETSC_MAX_PATH_LEN];
844     FILE *fd;
845 
846     fname[0] = 0;
847     ierr = PetscOptionsGetString(PETSC_NULL,"-malloc_log",fname,250,&flg1);CHKERRQ(ierr);
848     if (flg1 && fname[0]) {
849       char sname[PETSC_MAX_PATH_LEN];
850       int  err;
851 
852       sprintf(sname,"%s_%d",fname,rank);
853       fd   = fopen(sname,"w"); if (!fd) SETERRQ1(PETSC_ERR_FILE_OPEN,"Cannot open log file: %s",sname);
854       ierr = PetscMallocDumpLog(fd);CHKERRQ(ierr);
855       err = fclose(fd);
856       if (err) SETERRQ(PETSC_ERR_SYS,"fclose() failed on file");
857     } else {
858       ierr = PetscMallocDumpLog(stdout);CHKERRQ(ierr);
859     }
860   }
861   /* Can be destroyed only after all the options are used */
862   ierr = PetscOptionsDestroy();CHKERRQ(ierr);
863 
864   PetscGlobalArgc = 0;
865   PetscGlobalArgs = 0;
866 
867 #if defined(PETSC_USE_COMPLEX)
868   ierr = MPI_Op_free(&PetscSum_Op);CHKERRQ(ierr);
869   ierr = MPI_Type_free(&MPIU_COMPLEX);CHKERRQ(ierr);
870 #endif
871   ierr = MPI_Type_free(&MPIU_2SCALAR);CHKERRQ(ierr);
872   ierr = MPI_Type_free(&MPIU_2INT);CHKERRQ(ierr);
873   ierr = MPI_Op_free(&PetscMaxSum_Op);CHKERRQ(ierr);
874   ierr = MPI_Op_free(&PetscADMax_Op);CHKERRQ(ierr);
875   ierr = MPI_Op_free(&PetscADMin_Op);CHKERRQ(ierr);
876 
877   ierr = PetscInfo(0,"PETSc successfully ended!\n");CHKERRQ(ierr);
878   if (PetscBeganMPI) {
879 #if defined(PETSC_HAVE_MPI_FINALIZED)
880     PetscMPIInt flag;
881     ierr = MPI_Finalized(&flag);CHKERRQ(ierr);
882     if (flag) SETERRQ(PETSC_ERR_LIB,"MPI_Finalize() has already been called, even though MPI_Init() was called by PetscInitialize()");
883 #endif
884     ierr = MPI_Finalize();CHKERRQ(ierr);
885   }
886 
887   if(PETSC_ZOPEFD != NULL){
888     if (PETSC_ZOPEFD != PETSC_STDOUT) fprintf(PETSC_ZOPEFD, "<<<end>>>");
889     else fprintf(PETSC_STDOUT, "<<<end>>>");}
890 
891 /*
892 
893      Note: In certain cases PETSC_COMM_WORLD is never MPI_Comm_free()ed because
894    the communicator has some outstanding requests on it. Specifically if the
895    flag PETSC_HAVE_BROKEN_REQUEST_FREE is set (for IBM MPI implementation). See
896    src/vec/utils/vpscat.c. Due to this the memory allocated in PetscCommDuplicate()
897    is never freed as it should be. Thus one may obtain messages of the form
898    [ 1] 8 bytes PetscCommDuplicate() line 645 in src/sys/mpiu.c indicating the
899    memory was not freed.
900 
901 */
902   ierr = PetscMallocClear();CHKERRQ(ierr);
903   PetscInitializeCalled = PETSC_FALSE;
904   PetscFinalizeCalled   = PETSC_TRUE;
905   PetscFunctionReturn(ierr);
906 }
907 
908 /*
909      These may be used in code that ADIC is to be used on
910 */
911 
912 #undef __FUNCT__
913 #define __FUNCT__ "PetscGlobalMax"
914 /*@
915       PetscGlobalMax - Computes the maximum value over several processors
916 
917      Collective on MPI_Comm
918 
919    Input Parameters:
920 +   local - the local value
921 -   comm - the processors that find the maximum
922 
923    Output Parameter:
924 .   result - the maximum value
925 
926    Level: intermediate
927 
928    Notes:
929      These functions are to be used inside user functions that are to be processed with
930    ADIC. PETSc will automatically provide differentiated versions of these functions
931 
932 .seealso: PetscGlobalMin(), PetscGlobalSum()
933 @*/
934 PetscErrorCode PETSC_DLLEXPORT PetscGlobalMax(PetscReal* local,PetscReal* result,MPI_Comm comm)
935 {
936   return MPI_Allreduce(local,result,1,MPIU_REAL,MPI_MAX,comm);
937 }
938 
939 #undef __FUNCT__
940 #define __FUNCT__ "PetscGlobalMin"
941 /*@
942       PetscGlobalMin - Computes the minimum value over several processors
943 
944      Collective on MPI_Comm
945 
946    Input Parameters:
947 +   local - the local value
948 -   comm - the processors that find the minimum
949 
950    Output Parameter:
951 .   result - the minimum value
952 
953    Level: intermediate
954 
955    Notes:
956      These functions are to be used inside user functions that are to be processed with
957    ADIC. PETSc will automatically provide differentiated versions of these functions
958 
959 .seealso: PetscGlobalMax(), PetscGlobalSum()
960 @*/
961 PetscErrorCode PETSC_DLLEXPORT PetscGlobalMin(PetscReal* local,PetscReal* result,MPI_Comm comm)
962 {
963   return MPI_Allreduce(local,result,1,MPIU_REAL,MPI_MIN,comm);
964 }
965 
966 #undef __FUNCT__
967 #define __FUNCT__ "PetscGlobalSum"
968 /*@
969       PetscGlobalSum - Computes the sum over sever processors
970 
971      Collective on MPI_Comm
972 
973    Input Parameters:
974 +   local - the local value
975 -   comm - the processors that find the sum
976 
977    Output Parameter:
978 .   result - the sum
979 
980    Level: intermediate
981 
982    Notes:
983      These functions are to be used inside user functions that are to be processed with
984    ADIC. PETSc will automatically provide differentiated versions of these functions
985 
986 .seealso: PetscGlobalMin(), PetscGlobalMax()
987 @*/
988 PetscErrorCode PETSC_DLLEXPORT PetscGlobalSum(PetscScalar* local,PetscScalar* result,MPI_Comm comm)
989 {
990   return MPI_Allreduce(local,result,1,MPIU_SCALAR,PetscSum_Op,comm);
991 }
992 
993 
994