xref: /petsc/src/snes/interface/dlregissnes.c (revision 97276fddab9e156c6aa2d4453777ea460476b6f0)
1af0996ceSBarry Smith #include <petsc/private/snesimpl.h>
2af0996ceSBarry Smith #include <petsc/private/linesearchimpl.h>
33a336bb1SMatthew G. Knepley #include <petsc/private/dmadaptorimpl.h>
41153da11SBarry Smith 
5ace3abfcSBarry Smith static PetscBool SNESPackageInitialized = PETSC_FALSE;
6bf7f4e0aSPeter Brune 
7b022a5c1SBarry Smith /*@C
8420bcc1bSBarry Smith   SNESFinalizePackage - This function destroys everything in the PETSc interface to the `SNES` package. It is
9dc4c0fb0SBarry Smith   called from `PetscFinalize()`.
10b022a5c1SBarry Smith 
11b022a5c1SBarry Smith   Level: developer
12b022a5c1SBarry Smith 
13420bcc1bSBarry Smith .seealso: [](ch_snes), `SNES`, `PetscFinalize()`
14b022a5c1SBarry Smith @*/
15d71ae5a4SJacob Faibussowitsch PetscErrorCode SNESFinalizePackage(void)
16d71ae5a4SJacob Faibussowitsch {
17b022a5c1SBarry Smith   PetscFunctionBegin;
189566063dSJacob Faibussowitsch   PetscCall(PetscFunctionListDestroy(&SNESList));
199566063dSJacob Faibussowitsch   PetscCall(PetscFunctionListDestroy(&SNESLineSearchList));
20b022a5c1SBarry Smith   SNESPackageInitialized          = PETSC_FALSE;
21b022a5c1SBarry Smith   SNESRegisterAllCalled           = PETSC_FALSE;
22a95a41ebSToby Isaac   SNESLineSearchRegisterAllCalled = PETSC_FALSE;
233ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
24b022a5c1SBarry Smith }
25b022a5c1SBarry Smith 
261153da11SBarry Smith /*@C
27dc4c0fb0SBarry Smith   SNESInitializePackage - This function initializes everything in the `SNES` package. It is called
28dc4c0fb0SBarry Smith   from PetscDLLibraryRegister_petscsnes() when using dynamic libraries, and on the first call to `SNESCreate()`
298a690491SBarry Smith   when using shared or static libraries.
301153da11SBarry Smith 
311153da11SBarry Smith   Level: developer
321153da11SBarry Smith 
33420bcc1bSBarry Smith .seealso: [](ch_snes), `SNES`, `PetscInitialize()`
341153da11SBarry Smith @*/
35d71ae5a4SJacob Faibussowitsch PetscErrorCode SNESInitializePackage(void)
36d71ae5a4SJacob Faibussowitsch {
371153da11SBarry Smith   char      logList[256];
388e81d068SLisandro Dalcin   PetscBool opt, pkg, cls;
391153da11SBarry Smith 
401153da11SBarry Smith   PetscFunctionBegin;
413ba16761SJacob Faibussowitsch   if (SNESPackageInitialized) PetscFunctionReturn(PETSC_SUCCESS);
42b022a5c1SBarry Smith   SNESPackageInitialized = PETSC_TRUE;
4337e1895aSJed Brown   /* Initialize subpackages */
449566063dSJacob Faibussowitsch   PetscCall(SNESMSInitializePackage());
451153da11SBarry Smith   /* Register Classes */
469566063dSJacob Faibussowitsch   PetscCall(PetscClassIdRegister("SNES", &SNES_CLASSID));
479566063dSJacob Faibussowitsch   PetscCall(PetscClassIdRegister("DMSNES", &DMSNES_CLASSID));
489566063dSJacob Faibussowitsch   PetscCall(PetscClassIdRegister("SNESLineSearch", &SNESLINESEARCH_CLASSID));
493a336bb1SMatthew G. Knepley   PetscCall(PetscClassIdRegister("DM Adaptor", &DMADAPTOR_CLASSID));
501153da11SBarry Smith   /* Register Constructors */
519566063dSJacob Faibussowitsch   PetscCall(SNESRegisterAll());
529566063dSJacob Faibussowitsch   PetscCall(SNESLineSearchRegisterAll());
533a336bb1SMatthew G. Knepley   PetscCall(DMAdaptorRegisterAll());
543a336bb1SMatthew G. Knepley   PetscCall(PetscRegisterFinalize(DMAdaptorRegisterDestroy));
558b724c91SMatthew G. Knepley   PetscCall(DMAdaptorMonitorRegisterAll());
568b724c91SMatthew G. Knepley   PetscCall(PetscRegisterFinalize(DMAdaptorMonitorRegisterDestroy));
571153da11SBarry Smith   /* Register Events */
589566063dSJacob Faibussowitsch   PetscCall(PetscLogEventRegister("SNESSolve", SNES_CLASSID, &SNES_Solve));
59fc8bc0e3SRichard Tran Mills   PetscCall(PetscLogEventRegister("SNESSetUp", SNES_CLASSID, &SNES_SetUp));
609566063dSJacob Faibussowitsch   PetscCall(PetscLogEventRegister("SNESFunctionEval", SNES_CLASSID, &SNES_FunctionEval));
619566063dSJacob Faibussowitsch   PetscCall(PetscLogEventRegister("SNESObjectiveEval", SNES_CLASSID, &SNES_ObjectiveEval));
629566063dSJacob Faibussowitsch   PetscCall(PetscLogEventRegister("SNESNGSEval", SNES_CLASSID, &SNES_NGSEval));
639566063dSJacob Faibussowitsch   PetscCall(PetscLogEventRegister("SNESNGSFuncEval", SNES_CLASSID, &SNES_NGSFuncEval));
64*97276fddSZach Atkins   PetscCall(PetscLogEventRegister("SNESNewtonALEval", SNES_CLASSID, &SNES_NewtonALEval));
659566063dSJacob Faibussowitsch   PetscCall(PetscLogEventRegister("SNESJacobianEval", SNES_CLASSID, &SNES_JacobianEval));
669566063dSJacob Faibussowitsch   PetscCall(PetscLogEventRegister("SNESNPCSolve", SNES_CLASSID, &SNES_NPCSolve));
679566063dSJacob Faibussowitsch   PetscCall(PetscLogEventRegister("SNESLineSearch", SNESLINESEARCH_CLASSID, &SNESLINESEARCH_Apply));
68e94e781bSJacob Faibussowitsch   /* Process Info */
69e94e781bSJacob Faibussowitsch   {
70e94e781bSJacob Faibussowitsch     PetscClassId classids[3];
71e94e781bSJacob Faibussowitsch 
72e94e781bSJacob Faibussowitsch     classids[0] = SNES_CLASSID;
73e94e781bSJacob Faibussowitsch     classids[1] = DMSNES_CLASSID;
74e94e781bSJacob Faibussowitsch     classids[2] = SNESLINESEARCH_CLASSID;
759566063dSJacob Faibussowitsch     PetscCall(PetscInfoProcessClass("snes", 1, classids));
769566063dSJacob Faibussowitsch     PetscCall(PetscInfoProcessClass("dm", 1, &classids[1]));
779566063dSJacob Faibussowitsch     PetscCall(PetscInfoProcessClass("sneslinesearch", 1, &classids[2]));
781153da11SBarry Smith   }
791153da11SBarry Smith   /* Process summary exclusions */
809566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetString(NULL, NULL, "-log_exclude", logList, sizeof(logList), &opt));
811153da11SBarry Smith   if (opt) {
829566063dSJacob Faibussowitsch     PetscCall(PetscStrInList("snes", logList, ',', &pkg));
839566063dSJacob Faibussowitsch     if (pkg) PetscCall(PetscLogEventExcludeClass(SNES_CLASSID));
849566063dSJacob Faibussowitsch     PetscCall(PetscStrInList("dm", logList, ',', &cls));
859566063dSJacob Faibussowitsch     if (pkg || cls) PetscCall(PetscLogEventExcludeClass(DMSNES_CLASSID));
869566063dSJacob Faibussowitsch     PetscCall(PetscStrInList("sneslinesearch", logList, ',', &cls));
879566063dSJacob Faibussowitsch     if (pkg || cls) PetscCall(PetscLogEventExcludeClass(SNESLINESEARCH_CLASSID));
881153da11SBarry Smith   }
898e81d068SLisandro Dalcin   /* Register package finalizer */
909566063dSJacob Faibussowitsch   PetscCall(PetscRegisterFinalize(SNESFinalizePackage));
913ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
921153da11SBarry Smith }
931153da11SBarry Smith 
94aa2d57e9SJed Brown #if defined(PETSC_HAVE_DYNAMIC_LIBRARIES)
951153da11SBarry Smith /*
961153da11SBarry Smith   PetscDLLibraryRegister - This function is called when the dynamic library it is in is opened.
971153da11SBarry Smith 
981153da11SBarry Smith   This registers all of the SNES methods that are in the basic PETSc libpetscsnes library.
991153da11SBarry Smith 
1001153da11SBarry Smith  */
101d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscDLLibraryRegister_petscsnes(void)
102d71ae5a4SJacob Faibussowitsch {
1031153da11SBarry Smith   PetscFunctionBegin;
1049566063dSJacob Faibussowitsch   PetscCall(SNESInitializePackage());
1053ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1061153da11SBarry Smith }
1071153da11SBarry Smith 
108aa2d57e9SJed Brown #endif /* PETSC_HAVE_DYNAMIC_LIBRARIES */
109