PetscErrorCode PCGAMGClassicalInitializePackage(void) { PetscErrorCode ierr; PetscFunctionBegin; if (PCGAMGClassicalPackageInitialized) PetscFunctionReturn(0); ierr = PetscFunctionListAdd(&PCGAMGClassicalProlongatorList,PCGAMGCLASSICALDIRECT,PCGAMGProlongator_Classical_Direct);CHKERRQ(ierr); ierr = PetscFunctionListAdd(&PCGAMGClassicalProlongatorList,PCGAMGCLASSICALSTANDARD,PCGAMGProlongator_Classical_Standard);CHKERRQ(ierr); ierr = PetscRegisterFinalize(PCGAMGClassicalFinalizePackage);CHKERRQ(ierr); PetscFunctionReturn(0); }
/*@C TSSSPInitializePackage - This function initializes everything in the TSSSP package. It is called from PetscDLLibraryRegister() when using dynamic libraries, and on the first call to TSCreate_SSP() when using static libraries. Level: developer .keywords: TS, TSSSP, initialize, package .seealso: PetscInitialize() @*/ PetscErrorCode TSSSPInitializePackage(void) { PetscErrorCode ierr; PetscFunctionBegin; if (TSSSPPackageInitialized) PetscFunctionReturn(0); TSSSPPackageInitialized = PETSC_TRUE; ierr = PetscFunctionListAdd(&TSSSPList,TSSSPRKS2, TSSSPStep_RK_2);CHKERRQ(ierr); ierr = PetscFunctionListAdd(&TSSSPList,TSSSPRKS3, TSSSPStep_RK_3);CHKERRQ(ierr); ierr = PetscFunctionListAdd(&TSSSPList,TSSSPRK104,TSSSPStep_RK_10_4);CHKERRQ(ierr); ierr = PetscRegisterFinalize(TSSSPFinalizePackage);CHKERRQ(ierr); PetscFunctionReturn(0); }
/*MC TaoLineSearchRegister - Adds a line-search algorithm to the registry Not collective Input Parameters: + sname - name of a new user-defined solver - func - routine to Create method context Notes: TaoLineSearchRegister() may be called multiple times to add several user-defined solvers. Sample usage: .vb TaoLineSearchRegister("my_linesearch",MyLinesearchCreate); .ve Then, your solver can be chosen with the procedural interface via $ TaoLineSearchSetType(ls,"my_linesearch") or at runtime via the option $ -tao_ls_type my_linesearch Level: developer .seealso: TaoLineSearchRegisterDestroy() M*/ PetscErrorCode TaoLineSearchRegister(const char sname[], PetscErrorCode (*func)(TaoLineSearch)) { PetscErrorCode ierr; PetscFunctionBegin; ierr = PetscFunctionListAdd(&TaoLineSearchList, sname, (void (*)(void))func);CHKERRQ(ierr); PetscFunctionReturn(0); }
/*@C PetscDrawRegister - Adds a method to the graphics package. Not Collective Input Parameters: + name_solver - name of a new user-defined solver - routine_create - routine to create method context Level: developer Notes: PetscDrawRegister() may be called multiple times to add several user-defined solvers. Sample usage: .vb PetscDrawRegister("my_draw_type", MyDrawCreate); .ve Then, your solver can be chosen with the procedural interface via $ PetscDrawSetType(ksp,"my_draw_type") or at runtime via the option $ -draw_type my_draw_type Concepts: graphics^registering new draw classes Concepts: PetscDraw^registering new draw classes .seealso: PetscDrawRegisterAll(), PetscDrawRegisterDestroy() @*/ PetscErrorCode PetscDrawRegister(const char *sname,PetscErrorCode (*function)(PetscDraw)) { PetscErrorCode ierr; PetscFunctionBegin; ierr = PetscFunctionListAdd(&PetscDrawList,sname,function);CHKERRQ(ierr); PetscFunctionReturn(0); }
PetscErrorCode OpRegister(const char *name,PetscErrorCode (*f)(Op)) { PetscErrorCode ierr; PetscFunctionBegin; ierr = PetscFunctionListAdd(&OpList,name,f);CHKERRQ(ierr); PetscFunctionReturn(0); }
/*@C PFRegister - Adds a method to the mathematical function package. Not collective Input Parameters: + name_solver - name of a new user-defined solver - routine_create - routine to create method context Notes: PFRegister() may be called multiple times to add several user-defined functions Sample usage: .vb PFRegister("my_function",MyFunctionSetCreate); .ve Then, your solver can be chosen with the procedural interface via $ PFSetType(pf,"my_function") or at runtime via the option $ -pf_type my_function Level: advanced .keywords: PF, register .seealso: PFRegisterAll(), PFRegisterDestroy(), PFRegister() @*/ PetscErrorCode PFRegister(const char sname[],PetscErrorCode (*function)(PF,void*)) { PetscErrorCode ierr; PetscFunctionBegin; ierr = PetscFunctionListAdd(&PFList,sname,function);CHKERRQ(ierr); PetscFunctionReturn(0); }
/*@C MatColoringRegister - Adds a new sparse matrix coloring to the matrix package. Not Collective Input Parameters: + sname - name of Coloring (for example MATCOLORINGSL) - function - function pointer that creates the coloring Level: developer Sample usage: .vb MatColoringRegister("my_color",MyColor); .ve Then, your partitioner can be chosen with the procedural interface via $ MatColoringSetType(part,"my_color") or at runtime via the option $ -mat_coloring_type my_color .keywords: matrix, Coloring, register .seealso: MatColoringRegisterDestroy(), MatColoringRegisterAll() @*/ PetscErrorCode MatColoringRegister(const char sname[],PetscErrorCode (*function)(MatColoring)) { PetscErrorCode ierr; PetscFunctionBegin; ierr = PetscFunctionListAdd(&MatColoringList,sname,function);CHKERRQ(ierr); PetscFunctionReturn(0); }
/*@C KSPRegister - Adds a method to the Krylov subspace solver package. Not Collective Input Parameters: + name_solver - name of a new user-defined solver - routine_create - routine to create method context Notes: KSPRegister() may be called multiple times to add several user-defined solvers. Sample usage: .vb KSPRegister("my_solver",MySolverCreate); .ve Then, your solver can be chosen with the procedural interface via $ KSPSetType(ksp,"my_solver") or at runtime via the option $ -ksp_type my_solver Level: advanced .keywords: KSP, register .seealso: KSPRegisterAll(), KSPRegisterDestroy() @*/ PetscErrorCode KSPRegister(const char sname[],PetscErrorCode (*function)(KSP)) { PetscErrorCode ierr; PetscFunctionBegin; ierr = PetscFunctionListAdd(&KSPList,sname,function);CHKERRQ(ierr); PetscFunctionReturn(0); }
/*@C TSAdaptRegister - adds a TSAdapt implementation Not Collective Input Parameters: + name_scheme - name of user-defined adaptivity scheme - routine_create - routine to create method context Notes: TSAdaptRegister() may be called multiple times to add several user-defined families. Sample usage: .vb TSAdaptRegister("my_scheme",MySchemeCreate); .ve Then, your scheme can be chosen with the procedural interface via $ TSAdaptSetType(ts,"my_scheme") or at runtime via the option $ -ts_adapt_type my_scheme Level: advanced .keywords: TSAdapt, register .seealso: TSAdaptRegisterAll() @*/ PetscErrorCode TSAdaptRegister(const char sname[],PetscErrorCode (*function)(TSAdapt)) { PetscErrorCode ierr; PetscFunctionBegin; ierr = PetscFunctionListAdd(&TSAdaptList,sname,function);CHKERRQ(ierr); PetscFunctionReturn(0); }
/*@C TSTrajectoryRegister - Adds a way of storing trajectories to the TS package Not Collective Input Parameters: + name - the name of a new user-defined creation routine - create_func - the creation routine itself Notes: TSTrajectoryRegister() may be called multiple times to add several user-defined tses. Level: advanced .keywords: TS, trajectory, timestep, register .seealso: TSTrajectoryRegisterAll() @*/ PetscErrorCode TSTrajectoryRegister(const char sname[],PetscErrorCode (*function)(TSTrajectory,TS)) { PetscErrorCode ierr; PetscFunctionBegin; ierr = PetscFunctionListAdd(&TSTrajectoryList,sname,function);CHKERRQ(ierr); PetscFunctionReturn(0); }
/*@C RGRegister - See Adds a mathematical function to the RG package. Not collective Input Parameters: + name - name of a new user-defined RG - function - routine to create context Notes: RGRegister() may be called multiple times to add several user-defined inner products. Level: advanced .seealso: RGRegisterAll() @*/ PetscErrorCode RGRegister(const char *name,PetscErrorCode (*function)(RG)) { PetscErrorCode ierr; PetscFunctionBegin; ierr = PetscFunctionListAdd(&RGList,name,function);CHKERRQ(ierr); PetscFunctionReturn(0); }
PetscErrorCode PetscObjectComposeFunction_Petsc(PetscObject obj,const char name[],void (*ptr)(void)) { PetscErrorCode ierr; PetscFunctionBegin; PetscValidHeader(obj,1); ierr = PetscFunctionListAdd(&obj->qlist,name,ptr);CHKERRQ(ierr); PetscFunctionReturn(0); }
/*@C PetscRandomRegister - Adds a new PetscRandom component implementation Not Collective Input Parameters: + name - The name of a new user-defined creation routine - create_func - The creation routine itself Notes: PetscRandomRegister() may be called multiple times to add several user-defined randome number generators Sample usage: .vb PetscRandomRegister("my_rand", MyPetscRandomtorCreate); .ve Then, your random type can be chosen with the procedural interface via .vb PetscRandomCreate(MPI_Comm, PetscRandom *); PetscRandomSetType(PetscRandom,"my_random_name"); .ve or at runtime via the option .vb -random_type my_random_name .ve Notes: For an example of the code needed to interface your own random number generator see src/sys/random/impls/rand/rand.c Level: advanced .keywords: PetscRandom, register .seealso: PetscRandomRegisterAll(), PetscRandomRegisterDestroy(), PetscRandomRegister() @*/ PetscErrorCode PetscRandomRegister(const char sname[], PetscErrorCode (*function)(PetscRandom)) { PetscErrorCode ierr; PetscFunctionBegin; ierr = PetscRandomInitializePackage();CHKERRQ(ierr); ierr = PetscFunctionListAdd(&PetscRandomList,sname,function);CHKERRQ(ierr); PetscFunctionReturn(0); }
/*@C MatMFFDRegister - Adds a method to the MatMFFD registry. Not Collective Input Parameters: + name_solver - name of a new user-defined compute-h module - routine_create - routine to create method context Level: developer Notes: MatMFFDRegister() may be called multiple times to add several user-defined solvers. Sample usage: .vb MatMFFDRegister("my_h",MyHCreate); .ve Then, your solver can be chosen with the procedural interface via $ MatMFFDSetType(mfctx,"my_h") or at runtime via the option $ -mat_mffd_type my_h .keywords: MatMFFD, register .seealso: MatMFFDRegisterAll(), MatMFFDRegisterDestroy() @*/ PetscErrorCode MatMFFDRegister(const char sname[],PetscErrorCode (*function)(MatMFFD)) { PetscErrorCode ierr; PetscFunctionBegin; ierr = MatInitializePackage();CHKERRQ(ierr); ierr = PetscFunctionListAdd(&MatMFFDList,sname,function);CHKERRQ(ierr); PetscFunctionReturn(0); }
/*@C PetscSFRegister - See PetscSFRegisterDynamic() Level: advanced @*/ PetscErrorCode PetscSFRegister(const char sname[],const char path[],const char name[],PetscErrorCode (*function)(PetscSF)) { char fullname[PETSC_MAX_PATH_LEN]; PetscErrorCode ierr; PetscFunctionBegin; ierr = PetscFunctionListConcat(path,name,fullname);CHKERRQ(ierr); ierr = PetscFunctionListAdd(PETSC_COMM_WORLD,&PetscSFunctionList,sname,fullname,(void (*)(void))function);CHKERRQ(ierr); PetscFunctionReturn(0); }
PetscErrorCode MatColoringRegister(const char sname[],const char path[],const char name[],PetscErrorCode (*function)(Mat,MatColoringType,ISColoring*)) { PetscErrorCode ierr; char fullname[PETSC_MAX_PATH_LEN]; PetscFunctionBegin; ierr = PetscFunctionListConcat(path,name,fullname);CHKERRQ(ierr); ierr = PetscFunctionListAdd(PETSC_COMM_WORLD,&MatColoringList,sname,fullname,(void (*)(void))function);CHKERRQ(ierr); PetscFunctionReturn(0); }
/*@ PetscFunctionListDuplicate - Creates a new list from a given object list. Input Parameters: . fl - pointer to list Output Parameters: . nl - the new list (should point to 0 to start, otherwise appends) Level: developer .seealso: PetscFunctionList, PetscFunctionListAdd(), PetscFlistDestroy() @*/ PetscErrorCode PetscFunctionListDuplicate(PetscFunctionList fl,PetscFunctionList *nl) { PetscErrorCode ierr; PetscFunctionBegin; while (fl) { ierr = PetscFunctionListAdd(nl,fl->name,fl->routine);CHKERRQ(ierr); fl = fl->next; } PetscFunctionReturn(0); }
/*@C TSRegister - See TSRegisterDynamic() Level: advanced @*/ PetscErrorCode TSRegister(const char sname[], const char path[], const char name[], PetscErrorCode (*function)(TS)) { char fullname[PETSC_MAX_PATH_LEN]; PetscErrorCode ierr; PetscFunctionBegin; ierr = PetscStrcpy(fullname, path);CHKERRQ(ierr); ierr = PetscStrcat(fullname, ":");CHKERRQ(ierr); ierr = PetscStrcat(fullname, name);CHKERRQ(ierr); ierr = PetscFunctionListAdd(PETSC_COMM_WORLD,&TSList, sname, fullname, (void (*)(void)) function);CHKERRQ(ierr); PetscFunctionReturn(0); }
int main(int argc,char **argv) { PetscFunctionList plist = NULL; char pname[256]; TS ts; /* nonlinear solver */ Vec x,r; /* solution, residual vectors */ Mat A; /* Jacobian matrix */ Problem problem; PetscBool use_monitor; PetscInt steps,maxsteps = 1000,nonlinits,linits,snesfails,rejects; PetscReal ftime; MonitorCtx mon; PetscErrorCode ierr; PetscMPIInt size; /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Initialize program - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ PetscInitialize(&argc,&argv,(char*)0,help); ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRQ(ierr); if (size > 1) SETERRQ(PETSC_COMM_WORLD,PETSC_ERR_SUP,"Only for sequential runs"); /* Register the available problems */ ierr = PetscFunctionListAdd(&plist,"rober",&RoberCreate);CHKERRQ(ierr); ierr = PetscFunctionListAdd(&plist,"ce",&CECreate);CHKERRQ(ierr); ierr = PetscFunctionListAdd(&plist,"orego",&OregoCreate);CHKERRQ(ierr); ierr = PetscStrcpy(pname,"ce");CHKERRQ(ierr); /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Set runtime options - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ ierr = PetscOptionsBegin(PETSC_COMM_WORLD,NULL,"Timestepping benchmark options","");CHKERRQ(ierr); { ierr = PetscOptionsFList("-problem_type","Name of problem to run","",plist,pname,pname,sizeof(pname),NULL);CHKERRQ(ierr); use_monitor = PETSC_FALSE; ierr = PetscOptionsBool("-monitor_error","Display errors relative to exact solutions","",use_monitor,&use_monitor,NULL);CHKERRQ(ierr); } ierr = PetscOptionsEnd();CHKERRQ(ierr); /* Create the new problem */ ierr = PetscNew(&problem);CHKERRQ(ierr); problem->comm = MPI_COMM_WORLD; { PetscErrorCode (*pcreate)(Problem); ierr = PetscFunctionListFind(plist,pname,&pcreate);CHKERRQ(ierr); if (!pcreate) SETERRQ1(PETSC_COMM_SELF,1,"No problem '%s'",pname); ierr = (*pcreate)(problem);CHKERRQ(ierr); } /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Create necessary matrix and vectors - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ ierr = MatCreate(PETSC_COMM_WORLD,&A);CHKERRQ(ierr); ierr = MatSetSizes(A,problem->n,problem->n,PETSC_DETERMINE,PETSC_DETERMINE);CHKERRQ(ierr); ierr = MatSetFromOptions(A);CHKERRQ(ierr); ierr = MatSetUp(A);CHKERRQ(ierr); ierr = MatGetVecs(A,&x,NULL);CHKERRQ(ierr); ierr = VecDuplicate(x,&r);CHKERRQ(ierr); mon.comm = PETSC_COMM_WORLD; mon.problem = problem; ierr = VecDuplicate(x,&mon.x);CHKERRQ(ierr); /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Create timestepping solver context - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ ierr = TSCreate(PETSC_COMM_WORLD,&ts);CHKERRQ(ierr); ierr = TSSetProblemType(ts,TS_NONLINEAR);CHKERRQ(ierr); ierr = TSSetType(ts,TSROSW);CHKERRQ(ierr); /* Rosenbrock-W */ ierr = TSSetIFunction(ts,NULL,problem->function,problem->data);CHKERRQ(ierr); ierr = TSSetIJacobian(ts,A,A,problem->jacobian,problem->data);CHKERRQ(ierr); ierr = TSSetDuration(ts,maxsteps,problem->final_time);CHKERRQ(ierr); ierr = TSSetMaxStepRejections(ts,10);CHKERRQ(ierr); ierr = TSSetMaxSNESFailures(ts,-1);CHKERRQ(ierr); /* unlimited */ if (use_monitor) { ierr = TSMonitorSet(ts,&MonitorError,&mon,NULL);CHKERRQ(ierr); } /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Set initial conditions - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ ierr = (*problem->solution)(0,x,problem->data);CHKERRQ(ierr); ierr = TSSetInitialTimeStep(ts,0.0,.001);CHKERRQ(ierr); ierr = TSSetSolution(ts,x);CHKERRQ(ierr); /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Set runtime options - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ ierr = TSSetFromOptions(ts);CHKERRQ(ierr); /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Solve nonlinear system - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ ierr = TSSolve(ts,x);CHKERRQ(ierr); ierr = TSGetSolveTime(ts,&ftime);CHKERRQ(ierr); ierr = TSGetTimeStepNumber(ts,&steps);CHKERRQ(ierr); ierr = TSGetSNESFailures(ts,&snesfails);CHKERRQ(ierr); ierr = TSGetStepRejections(ts,&rejects);CHKERRQ(ierr); ierr = TSGetSNESIterations(ts,&nonlinits);CHKERRQ(ierr); ierr = TSGetKSPIterations(ts,&linits);CHKERRQ(ierr); ierr = PetscPrintf(PETSC_COMM_WORLD,"steps %D (%D rejected, %D SNES fails), ftime %G, nonlinits %D, linits %D\n",steps,rejects,snesfails,ftime,nonlinits,linits);CHKERRQ(ierr); if (problem->hasexact) { ierr = MonitorError(ts,steps,ftime,x,&mon);CHKERRQ(ierr); } /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Free work space. All PETSc objects should be destroyed when they are no longer needed. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ ierr = MatDestroy(&A);CHKERRQ(ierr); ierr = VecDestroy(&x);CHKERRQ(ierr); ierr = VecDestroy(&r);CHKERRQ(ierr); ierr = VecDestroy(&mon.x);CHKERRQ(ierr); ierr = TSDestroy(&ts);CHKERRQ(ierr); if (problem->destroy) { ierr = (*problem->destroy)(problem);CHKERRQ(ierr); } ierr = PetscFree(problem);CHKERRQ(ierr); ierr = PetscFunctionListDestroy(&plist);CHKERRQ(ierr); ierr = PetscFinalize(); PetscFunctionReturn(0); }