Actual source code: tsreg.c
petsc-3.7.1 2016-05-15
Report Typos and Errors

      1: #include <petsc/private/tsimpl.h>      /*I "petscts.h"  I*/

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

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

     11:   Collective on TS

     13:   Input Parameters:
     14: + ts   - The TS context
     15: - type - A known method

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

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

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

     39:    Level: intermediate

     41: .keywords: TS, set, type

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

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

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

     57:   PetscFunctionListFind(TSList,type,&r);
     58:   if (!r) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE, "Unknown TS type: %s", type);
     59:   if (ts->ops->destroy) {
     60:     (*(ts)->ops->destroy)(ts);

     62:     ts->ops->destroy = NULL;
     63:   }
     64:   PetscMemzero(ts->ops,sizeof(*ts->ops));

     66:   ts->setupcalled = PETSC_FALSE;

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

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

     78:   Not Collective

     80:   Input Parameter:
     81: . ts - The TS

     83:   Output Parameter:
     84: . type - The name of TS method

     86:   Level: intermediate

     88: .keywords: TS, timestepper, get, type, name
     89: .seealso TSSetType()
     90: @*/
     91: PetscErrorCode  TSGetType(TS ts, TSType *type)
     92: {
     96:   *type = ((PetscObject)ts)->type_name;
     97:   return(0);
     98: }

    100: /*--------------------------------------------------------------------------------------------------------------------*/

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

    107:   Not Collective

    109:   Input Parameters:
    110: + name        - The name of a new user-defined creation routine
    111: - create_func - The creation routine itself

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

    116:   Sample usage:
    117: .vb
    118:   TSRegister("my_ts",  MyTSCreate);
    119: .ve

    121:   Then, your ts type can be chosen with the procedural interface via
    122: .vb
    123:     TS ts;
    124:     TSCreate(MPI_Comm, &ts);
    125:     TSSetType(ts, "my_ts")
    126: .ve
    127:   or at runtime via the option
    128: .vb
    129:     -ts_type my_ts
    130: .ve

    132:   Level: advanced

    134: .keywords: TS, register

    136: .seealso: TSRegisterAll(), TSRegisterDestroy()
    137: @*/
    138: PetscErrorCode  TSRegister(const char sname[], PetscErrorCode (*function)(TS))
    139: {

    143:   PetscFunctionListAdd(&TSList,sname,function);
    144:   return(0);
    145: }