Date: 2022-03-31T04:48:40+00:00

Actual source code: tsreg.c

      1: #include <petsc/private/tsimpl.h>

      3: PetscFunctionList TSList              = NULL;
      4: PetscBool         TSRegisterAllCalled = PETSC_FALSE;

      6: /*@C
      7:   TSSetType - Sets the method to be used as the timestepping solver.

      9:   Collective on TS

     11:   Input Parameters:
     12: + ts   - The TS context
     13: - type - A known method

     15:   Options Database Command:
     16: . -ts_type <type> - Sets the method; use -help for a list of available methods (for instance, euler)

     18:    Notes:
     19:    See "petsc/include/petscts.h" for available methods (for instance)
     20: +  TSEULER - Euler
     21: .  TSSUNDIALS - SUNDIALS interface
     22: .  TSBEULER - Backward Euler
     23: -  TSPSEUDO - Pseudo-timestepping

     25:    Normally, it is best to use the TSSetFromOptions() command and
     26:    then set the TS type from the options database rather than by using
     27:    this routine.  Using the options database provides the user with
     28:    maximum flexibility in evaluating the many different solvers.
     29:    The TSSetType() routine is provided for those situations where it
     30:    is necessary to set the timestepping solver independently of the
     31:    command line or options database.  This might be the case, for example,
     32:    when the choice of solver changes during the execution of the
     33:    program, and the user's application is taking responsibility for
     34:    choosing the appropriate method.  In other words, this routine is
     35:    not for beginners.

     37:    Level: intermediate

     39: .seealso: TS, TSSolve(), TSCreate(), TSSetFromOptions(), TSDestroy(), TSType

     41: @*/
     42: PetscErrorCode  TSSetType(TS ts,TSType type)
     43: {
     44:   PetscErrorCode (*r)(TS);
     45:   PetscBool      match;

     49:   PetscObjectTypeCompare((PetscObject) ts, type, &match);
     50:   if (match) return 0;

     52:   PetscFunctionListFind(TSList,type,&r);
     54:   if (ts->ops->destroy) {
     55:     (*(ts)->ops->destroy)(ts);
     56:   }
     57:   PetscMemzero(ts->ops,sizeof(*ts->ops));
     58:   ts->usessnes           = PETSC_FALSE;
     59:   ts->default_adapt_type = TSADAPTNONE;

     61:   ts->setupcalled = PETSC_FALSE;

     63:   PetscObjectChangeTypeName((PetscObject)ts, type);
     64:   (*r)(ts);
     65:   return 0;
     66: }

     68: /*@C
     69:   TSGetType - Gets the TS method type (as a string).

     71:   Not Collective

     73:   Input Parameter:
     74: . ts - The TS

     76:   Output Parameter:
     77: . type - The name of TS method

     79:   Level: intermediate

     81: .seealso TSSetType()
     82: @*/
     83: PetscErrorCode  TSGetType(TS ts, TSType *type)
     84: {
     87:   *type = ((PetscObject)ts)->type_name;
     88:   return 0;
     89: }

     91: /*--------------------------------------------------------------------------------------------------------------------*/

     93: /*@C
     94:   TSRegister - Adds a creation method to the TS package.

     96:   Not Collective

     98:   Input Parameters:
     99: + name        - The name of a new user-defined creation routine
    100: - create_func - The creation routine itself

    102:   Notes:
    103:   TSRegister() may be called multiple times to add several user-defined tses.

    105:   Sample usage:
    106: .vb
    107:   TSRegister("my_ts",  MyTSCreate);
    108: .ve

    110:   Then, your ts type can be chosen with the procedural interface via
    111: .vb
    112:     TS ts;
    113:     TSCreate(MPI_Comm, &ts);
    114:     TSSetType(ts, "my_ts")
    115: .ve
    116:   or at runtime via the option
    117: .vb
    118:     -ts_type my_ts
    119: .ve

    121:   Level: advanced

    123: .seealso: TSRegisterAll(), TSRegisterDestroy()
    124: @*/
    125: PetscErrorCode  TSRegister(const char sname[], PetscErrorCode (*function)(TS))
    126: {
    127:   TSInitializePackage();
    128:   PetscFunctionListAdd(&TSList,sname,function);
    129:   return 0;
    130: }