Actual source code: tsreg.c
petsc-3.10.5 2019-03-28
Report Typos and Errors

      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: .keywords: TS, set, type

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

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

     53:   PetscObjectTypeCompare((PetscObject) ts, type, &match);
     54:   if (match) return(0);

     56:   PetscFunctionListFind(TSList,type,&r);
     57:   if (!r) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE, "Unknown TS type: %s", type);
     58:   if (ts->ops->destroy) {
     59:     (*(ts)->ops->destroy)(ts);
     60:   }
     61:   PetscMemzero(ts->ops,sizeof(*ts->ops));
     62:   ts->usessnes           = PETSC_FALSE;
     63:   ts->default_adapt_type = TSADAPTNONE;

     65:   ts->setupcalled = PETSC_FALSE;

     67:   PetscObjectChangeTypeName((PetscObject)ts, type);
     68:   (*r)(ts);
     69:   return(0);
     70: }

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

     75:   Not Collective

     77:   Input Parameter:
     78: . ts - The TS

     80:   Output Parameter:
     81: . type - The name of TS method

     83:   Level: intermediate

     85: .keywords: TS, timestepper, get, type, name
     86: .seealso TSSetType()
     87: @*/
     88: PetscErrorCode  TSGetType(TS ts, TSType *type)
     89: {
     93:   *type = ((PetscObject)ts)->type_name;
     94:   return(0);
     95: }

     97: /*--------------------------------------------------------------------------------------------------------------------*/

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

    102:   Not Collective

    104:   Input Parameters:
    105: + name        - The name of a new user-defined creation routine
    106: - create_func - The creation routine itself

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

    111:   Sample usage:
    112: .vb
    113:   TSRegister("my_ts",  MyTSCreate);
    114: .ve

    116:   Then, your ts type can be chosen with the procedural interface via
    117: .vb
    118:     TS ts;
    119:     TSCreate(MPI_Comm, &ts);
    120:     TSSetType(ts, "my_ts")
    121: .ve
    122:   or at runtime via the option
    123: .vb
    124:     -ts_type my_ts
    125: .ve

    127:   Level: advanced

    129: .keywords: TS, register

    131: .seealso: TSRegisterAll(), TSRegisterDestroy()
    132: @*/
    133: PetscErrorCode  TSRegister(const char sname[], PetscErrorCode (*function)(TS))
    134: {

    138:   TSInitializePackage();
    139:   PetscFunctionListAdd(&TSList,sname,function);
    140:   return(0);
    141: }