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