Actual source code: tsreg.c

      1: #define PETSCTS_DLL

     3:  #include src/ts/tsimpl.h

      5: PetscFList TSList                       = PETSC_NULL;
      6: PetscTruth TSRegisterAllCalled          = PETSC_FALSE;

     10: /*@C
     11:   TSSetType - Sets the method for the timestepping solver.

     13:   Collective on TS

     15:   Input Parameters:
     16: + ts   - The TS context
     17: - type - A known method

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

     22:    Notes:
     23:    See "petsc/include/petscts.h" for available methods (for instance)
     24: +  TS_EULER - Euler
     25: .  TS_PVODE - PVODE interface
     26: .  TS_BEULER - Backward Euler
     27: -  TS_PSEUDO - Pseudo-timestepping

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

     41:    Level: intermediate

     43: .keywords: TS, set, type

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

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

     57:   /* Get the function pointers for the method requested */
     58:   if (!TSRegisterAllCalled) {
     59:     TSRegisterAll(PETSC_NULL);
     60:   }
     61:   PetscFListFind(ts->comm, TSList, type, (void (**)(void)) &r);
     62:   if (!r) SETERRQ1(PETSC_ERR_ARG_UNKNOWN_TYPE, "Unknown TS type: %s", type);
     63:   if (ts->ksp) {
     64:     KSPDestroy(ts->ksp);
     65:     ts->ksp = PETSC_NULL;
     66:   }
     67:   if (ts->snes) {
     68:     SNESDestroy(ts->snes);
     69:     ts->snes = PETSC_NULL;
     70:   }
     71:   if (ts->ops->destroy) {
     72:     (*(ts)->ops->destroy)(ts);
     73:   }
     74:   (*r)(ts);
     75:   PetscObjectChangeTypeName((PetscObject)ts, type);
     76:   return(0);
     77: }

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

     84:   Not Collective

     86:   Input Parameter:
     87: . ts - The TS

     89:   Output Parameter:
     90: . type - The name of TS method

     92:   Level: intermediate

     94: .keywords: TS, timestepper, get, type, name
     95: .seealso TSSetType()
     96: @*/
     97: PetscErrorCode PETSCTS_DLLEXPORT TSGetType(TS ts, TSType *type)
     98: {

    104:   if (!TSRegisterAllCalled) {
    105:     TSRegisterAll(PETSC_NULL);
    106:   }
    107:   *type = ts->type_name;
    108:   return(0);
    109: }

    111: /*--------------------------------------------------------------------------------------------------------------------*/

    115: /*@C
    116:   TSRegister - See TSRegisterDynamic()

    118:   Level: advanced
    119: @*/
    120: PetscErrorCode PETSCTS_DLLEXPORT TSRegister(const char sname[], const char path[], const char name[], PetscErrorCode (*function)(TS))
    121: {
    122:   char           fullname[PETSC_MAX_PATH_LEN];

    126:   PetscStrcpy(fullname, path);
    127:   PetscStrcat(fullname, ":");
    128:   PetscStrcat(fullname, name);
    129:   PetscFListAdd(&TSList, sname, fullname, (void (*)(void)) function);
    130:   return(0);
    131: }

    133: /*-------------------------------------------------------------------------------------------------------------------*/
    136: /*@C
    137:    TSRegisterDestroy - Frees the list of timestepping routines that were registered by TSRegister()/TSRegisterDynamic().

    139:    Not Collective

    141:    Level: advanced

    143: .keywords: TS, timestepper, register, destroy
    144: .seealso: TSRegister(), TSRegisterAll(), TSRegisterDynamic()
    145: @*/
    146: PetscErrorCode PETSCTS_DLLEXPORT TSRegisterDestroy(void)
    147: {

    151:   if (TSList) {
    152:     PetscFListDestroy(&TSList);
    153:     TSList = PETSC_NULL;
    154:   }
    155:   TSRegisterAllCalled = PETSC_FALSE;
    156:   return(0);
    157: }