Actual source code: tsreg.c

  1: /*$Id: tsreg.c,v 1.71 2001/08/06 21:18:08 bsmith Exp $*/

 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: int TSSetType(TS ts, const TSType type)
 47: {
 48:   int      (*r)(TS);
 49:   PetscTruth match;
 50:   int        ierr;

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

 57:   /* Get the function pointers for the method requested */
 58:   if (TSRegisterAllCalled == PETSC_FALSE) {
 59:     TSRegisterAll(PETSC_NULL);
 60:   }
 61:   PetscFListFind(ts->comm, TSList, type, (void (**)(void)) &r);
 62:   if (!r) SETERRQ1(PETSC_ERR_ARG_OUTOFRANGE, "Unknown TS type: %s", type);

 64:   if (ts->ksp != PETSC_NULL) {
 65:     KSPDestroy(ts->ksp);
 66:     ts->ksp = PETSC_NULL;
 67:   }
 68:   if (ts->snes != PETSC_NULL) {
 69:     SNESDestroy(ts->snes);
 70:     ts->snes = PETSC_NULL;
 71:   }
 72:   if (ts->ops->destroy != PETSC_NULL) {
 73:     (*(ts)->ops->destroy)(ts);
 74:   }
 75:   (*r)(ts);

 77:   PetscObjectChangeTypeName((PetscObject)ts, type);
 78:   return(0);
 79: }

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

 86:   Not Collective

 88:   Input Parameter:
 89: . ts - The TS

 91:   Output Parameter:
 92: . type - The name of TS method

 94:   Level: intermediate

 96: .keywords: TS, timestepper, get, type, name
 97: .seealso TSSetType()
 98: @*/
 99: int TSGetType(TS ts, TSType *type)
100: {

106:   if (TSRegisterAllCalled == PETSC_FALSE) {
107:     TSRegisterAll(PETSC_NULL);
108:   }
109:   *type = ts->type_name;
110:   return(0);
111: }

113: /*--------------------------------------------------------------------------------------------------------------------*/

117: /*@C
118:   TSRegister - See TSRegisterDynamic()

120:   Level: advanced
121: @*/
122: int TSRegister(const char sname[], const char path[], const char name[], int (*function)(TS))
123: {
124:   char fullname[256];
125:   int  ierr;

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

135: /*-------------------------------------------------------------------------------------------------------------------*/
138: /*@C
139:    TSRegisterDestroy - Frees the list of timestepping routines that were registered by TSRegister()/TSRegisterDynamic().

141:    Not Collective

143:    Level: advanced

145: .keywords: TS, timestepper, register, destroy
146: .seealso: TSRegister(), TSRegisterAll(), TSRegisterDynamic()
147: @*/
148: int TSRegisterDestroy(void)
149: {

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