xref: /petsc/src/snes/interface/dlregissnes.c (revision 76d6960897ba55d8238485170da43545084300c6)
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 @*/
SNESFinalizePackage(void)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 
33*0b4b7b1cSBarry Smith   Note:
34*0b4b7b1cSBarry Smith   This function never needs to be called by PETSc users.
35*0b4b7b1cSBarry Smith 
36420bcc1bSBarry Smith .seealso: [](ch_snes), `SNES`, `PetscInitialize()`
371153da11SBarry Smith @*/
SNESInitializePackage(void)38d71ae5a4SJacob Faibussowitsch PetscErrorCode SNESInitializePackage(void)
39d71ae5a4SJacob Faibussowitsch {
401153da11SBarry Smith   char      logList[256];
418e81d068SLisandro Dalcin   PetscBool opt, pkg, cls;
421153da11SBarry Smith 
431153da11SBarry Smith   PetscFunctionBegin;
443ba16761SJacob Faibussowitsch   if (SNESPackageInitialized) PetscFunctionReturn(PETSC_SUCCESS);
45b022a5c1SBarry Smith   SNESPackageInitialized = PETSC_TRUE;
4637e1895aSJed Brown   /* Initialize subpackages */
479566063dSJacob Faibussowitsch   PetscCall(SNESMSInitializePackage());
481153da11SBarry Smith   /* Register Classes */
499566063dSJacob Faibussowitsch   PetscCall(PetscClassIdRegister("SNES", &SNES_CLASSID));
509566063dSJacob Faibussowitsch   PetscCall(PetscClassIdRegister("DMSNES", &DMSNES_CLASSID));
519566063dSJacob Faibussowitsch   PetscCall(PetscClassIdRegister("SNESLineSearch", &SNESLINESEARCH_CLASSID));
523a336bb1SMatthew G. Knepley   PetscCall(PetscClassIdRegister("DM Adaptor", &DMADAPTOR_CLASSID));
531153da11SBarry Smith   /* Register Constructors */
549566063dSJacob Faibussowitsch   PetscCall(SNESRegisterAll());
559566063dSJacob Faibussowitsch   PetscCall(SNESLineSearchRegisterAll());
563a336bb1SMatthew G. Knepley   PetscCall(DMAdaptorRegisterAll());
573a336bb1SMatthew G. Knepley   PetscCall(PetscRegisterFinalize(DMAdaptorRegisterDestroy));
588b724c91SMatthew G. Knepley   PetscCall(DMAdaptorMonitorRegisterAll());
598b724c91SMatthew G. Knepley   PetscCall(PetscRegisterFinalize(DMAdaptorMonitorRegisterDestroy));
601153da11SBarry Smith   /* Register Events */
619566063dSJacob Faibussowitsch   PetscCall(PetscLogEventRegister("SNESSolve", SNES_CLASSID, &SNES_Solve));
62fc8bc0e3SRichard Tran Mills   PetscCall(PetscLogEventRegister("SNESSetUp", SNES_CLASSID, &SNES_SetUp));
639566063dSJacob Faibussowitsch   PetscCall(PetscLogEventRegister("SNESFunctionEval", SNES_CLASSID, &SNES_FunctionEval));
649566063dSJacob Faibussowitsch   PetscCall(PetscLogEventRegister("SNESObjectiveEval", SNES_CLASSID, &SNES_ObjectiveEval));
659566063dSJacob Faibussowitsch   PetscCall(PetscLogEventRegister("SNESNGSEval", SNES_CLASSID, &SNES_NGSEval));
669566063dSJacob Faibussowitsch   PetscCall(PetscLogEventRegister("SNESNGSFuncEval", SNES_CLASSID, &SNES_NGSFuncEval));
6797276fddSZach Atkins   PetscCall(PetscLogEventRegister("SNESNewtonALEval", SNES_CLASSID, &SNES_NewtonALEval));
689566063dSJacob Faibussowitsch   PetscCall(PetscLogEventRegister("SNESJacobianEval", SNES_CLASSID, &SNES_JacobianEval));
699566063dSJacob Faibussowitsch   PetscCall(PetscLogEventRegister("SNESNPCSolve", SNES_CLASSID, &SNES_NPCSolve));
709566063dSJacob Faibussowitsch   PetscCall(PetscLogEventRegister("SNESLineSearch", SNESLINESEARCH_CLASSID, &SNESLINESEARCH_Apply));
71e94e781bSJacob Faibussowitsch   /* Process Info */
72e94e781bSJacob Faibussowitsch   {
73e94e781bSJacob Faibussowitsch     PetscClassId classids[3];
74e94e781bSJacob Faibussowitsch 
75e94e781bSJacob Faibussowitsch     classids[0] = SNES_CLASSID;
76e94e781bSJacob Faibussowitsch     classids[1] = DMSNES_CLASSID;
77e94e781bSJacob Faibussowitsch     classids[2] = SNESLINESEARCH_CLASSID;
789566063dSJacob Faibussowitsch     PetscCall(PetscInfoProcessClass("snes", 1, classids));
799566063dSJacob Faibussowitsch     PetscCall(PetscInfoProcessClass("dm", 1, &classids[1]));
809566063dSJacob Faibussowitsch     PetscCall(PetscInfoProcessClass("sneslinesearch", 1, &classids[2]));
811153da11SBarry Smith   }
821153da11SBarry Smith   /* Process summary exclusions */
839566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetString(NULL, NULL, "-log_exclude", logList, sizeof(logList), &opt));
841153da11SBarry Smith   if (opt) {
859566063dSJacob Faibussowitsch     PetscCall(PetscStrInList("snes", logList, ',', &pkg));
869566063dSJacob Faibussowitsch     if (pkg) PetscCall(PetscLogEventExcludeClass(SNES_CLASSID));
879566063dSJacob Faibussowitsch     PetscCall(PetscStrInList("dm", logList, ',', &cls));
889566063dSJacob Faibussowitsch     if (pkg || cls) PetscCall(PetscLogEventExcludeClass(DMSNES_CLASSID));
899566063dSJacob Faibussowitsch     PetscCall(PetscStrInList("sneslinesearch", logList, ',', &cls));
909566063dSJacob Faibussowitsch     if (pkg || cls) PetscCall(PetscLogEventExcludeClass(SNESLINESEARCH_CLASSID));
911153da11SBarry Smith   }
928e81d068SLisandro Dalcin   /* Register package finalizer */
939566063dSJacob Faibussowitsch   PetscCall(PetscRegisterFinalize(SNESFinalizePackage));
943ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
951153da11SBarry Smith }
961153da11SBarry Smith 
97aa2d57e9SJed Brown #if defined(PETSC_HAVE_DYNAMIC_LIBRARIES)
981153da11SBarry Smith /*
991153da11SBarry Smith   PetscDLLibraryRegister - This function is called when the dynamic library it is in is opened.
1001153da11SBarry Smith 
1011153da11SBarry Smith   This registers all of the SNES methods that are in the basic PETSc libpetscsnes library.
1021153da11SBarry Smith 
1031153da11SBarry Smith  */
PetscDLLibraryRegister_petscsnes(void)104d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscDLLibraryRegister_petscsnes(void)
105d71ae5a4SJacob Faibussowitsch {
1061153da11SBarry Smith   PetscFunctionBegin;
1079566063dSJacob Faibussowitsch   PetscCall(SNESInitializePackage());
1083ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1091153da11SBarry Smith }
1101153da11SBarry Smith 
111aa2d57e9SJed Brown #endif /* PETSC_HAVE_DYNAMIC_LIBRARIES */
112