PETSC_EXTERN PetscErrorCode SNESCreate_MS(SNES snes) { PetscErrorCode ierr; SNES_MS *ms; PetscFunctionBegin; ierr = SNESMSInitializePackage();CHKERRQ(ierr); snes->ops->setup = SNESSetUp_MS; snes->ops->solve = SNESSolve_MS; snes->ops->destroy = SNESDestroy_MS; snes->ops->setfromoptions = SNESSetFromOptions_MS; snes->ops->view = SNESView_MS; snes->ops->reset = SNESReset_MS; snes->usespc = PETSC_FALSE; snes->usesksp = PETSC_TRUE; ierr = PetscNewLog(snes,&ms);CHKERRQ(ierr); snes->data = (void*)ms; ms->damping = 0.9; ms->norms = PETSC_FALSE; ierr = PetscObjectComposeFunction((PetscObject)snes,"SNESMSSetType_C",SNESMSSetType_MS);CHKERRQ(ierr); PetscFunctionReturn(0); }
/*MC SNESMS - multi-stage smoothers Options Database: + -snes_ms_type - type of multi-stage smoother - -snes_ms_damping - damping for multi-stage method Notes: These multistage methods are explicit Runge-Kutta methods that are often used as smoothers for FAS multigrid for transport problems. In the linear case, these are equivalent to polynomial smoothers (such as Chebyshev). Multi-stage smoothers should usually be preconditioned by point-block Jacobi to ensure proper scaling and to normalize the wave speeds. The methods are specified in low storage form (Ketcheson 2010). New methods can be registered with SNESMSRegister(). References: Ketcheson (2010) Runge-Kutta methods with minimum storage implementations. Jameson (1983) Solution of the Euler equations for two dimensional transonic flow by a multigrid method. Pierce and Giles (1997) Preconditioned multigrid methods for compressible flow calculations on stretched meshes. Level: beginner .seealso: SNESCreate(), SNES, SNESSetType(), SNESMS, SNESFAS, KSPCHEBYSHEV M*/ EXTERN_C_BEGIN #undef __FUNCT__ #define __FUNCT__ "SNESCreate_MS" PetscErrorCode SNESCreate_MS(SNES snes) { PetscErrorCode ierr; SNES_MS *ms; PetscFunctionBegin; #if !defined(PETSC_USE_DYNAMIC_LIBRARIES) ierr = SNESMSInitializePackage(PETSC_NULL);CHKERRQ(ierr); #endif snes->ops->setup = SNESSetUp_MS; snes->ops->solve = SNESSolve_MS; snes->ops->destroy = SNESDestroy_MS; snes->ops->setfromoptions = SNESSetFromOptions_MS; snes->ops->view = SNESView_MS; snes->ops->reset = SNESReset_MS; snes->usespc = PETSC_FALSE; snes->usesksp = PETSC_TRUE; ierr = PetscNewLog(snes,SNES_MS,&ms);CHKERRQ(ierr); snes->data = (void*)ms; ms->damping = 0.9; ms->norms = PETSC_FALSE; ierr = PetscObjectComposeFunctionDynamic((PetscObject)snes,"SNESMSSetType_C","SNESMSSetType_MS",SNESMSSetType_MS);CHKERRQ(ierr); PetscFunctionReturn(0); }
/*@C SNESInitializePackage - This function initializes everything in the SNES package. It is called from PetscDLLibraryRegister() when using dynamic libraries, and on the first call to SNESCreate() when using static libraries. Level: developer .keywords: SNES, initialize, package .seealso: PetscInitialize() @*/ PetscErrorCode SNESInitializePackage(void) { char logList[256]; char *className; PetscBool opt; PetscErrorCode ierr; PetscFunctionBegin; if (SNESPackageInitialized) PetscFunctionReturn(0); SNESPackageInitialized = PETSC_TRUE; /* Initialize subpackages */ ierr = SNESMSInitializePackage();CHKERRQ(ierr); /* Register Classes */ ierr = PetscClassIdRegister("SNES",&SNES_CLASSID);CHKERRQ(ierr); ierr = PetscClassIdRegister("SNESLineSearch",&SNESLINESEARCH_CLASSID);CHKERRQ(ierr); ierr = PetscClassIdRegister("DMSNES",&DMSNES_CLASSID);CHKERRQ(ierr); /* Register Constructors */ ierr = SNESRegisterAll();CHKERRQ(ierr); ierr = SNESLineSearchRegisterAll();CHKERRQ(ierr); /* Register Events */ ierr = PetscLogEventRegister("SNESSolve", SNES_CLASSID,&SNES_Solve);CHKERRQ(ierr); ierr = PetscLogEventRegister("SNESFunctionEval", SNES_CLASSID,&SNES_FunctionEval);CHKERRQ(ierr); ierr = PetscLogEventRegister("SNESObjectiveEval", SNES_CLASSID,&SNES_ObjectiveEval);CHKERRQ(ierr); ierr = PetscLogEventRegister("SNESNGSEval", SNES_CLASSID,&SNES_NGSEval);CHKERRQ(ierr); ierr = PetscLogEventRegister("SNESNGSFuncEval", SNES_CLASSID,&SNES_NGSFuncEval);CHKERRQ(ierr); ierr = PetscLogEventRegister("SNESJacobianEval", SNES_CLASSID,&SNES_JacobianEval);CHKERRQ(ierr); ierr = PetscLogEventRegister("SNESLineSearch", SNESLINESEARCH_CLASSID,&SNESLINESEARCH_Apply);CHKERRQ(ierr); ierr = PetscLogEventRegister("SNESNPCSolve", SNES_CLASSID,&SNES_NPCSolve);CHKERRQ(ierr); /* Process info exclusions */ ierr = PetscOptionsGetString(NULL,NULL, "-info_exclude", logList, 256, &opt);CHKERRQ(ierr); if (opt) { ierr = PetscStrstr(logList, "snes", &className);CHKERRQ(ierr); if (className) { ierr = PetscInfoDeactivateClass(SNES_CLASSID);CHKERRQ(ierr); } } /* Process summary exclusions */ ierr = PetscOptionsGetString(NULL,NULL, "-log_exclude", logList, 256, &opt);CHKERRQ(ierr); if (opt) { ierr = PetscStrstr(logList, "snes", &className);CHKERRQ(ierr); if (className) { ierr = PetscLogEventDeactivateClass(SNES_CLASSID);CHKERRQ(ierr); } } ierr = PetscRegisterFinalize(SNESFinalizePackage);CHKERRQ(ierr); PetscFunctionReturn(0); }