xref: /petsc/src/ts/interface/tsreg.c (revision 4b91b6eae087708c6d6dc4e372cbc7b84f10f223)
13f3760d9SBarry Smith 
2c6db04a5SJed Brown #include <private/tsimpl.h>      /*I "petscts.h"  I*/
33f3760d9SBarry Smith 
4bdad233fSMatthew Knepley PetscFList TSList                       = PETSC_NULL;
5ace3abfcSBarry Smith PetscBool  TSRegisterAllCalled          = PETSC_FALSE;
63f3760d9SBarry Smith 
74a2ae208SSatish Balay #undef __FUNCT__
84a2ae208SSatish Balay #define __FUNCT__ "TSSetType"
982bf6240SBarry Smith /*@C
10ae12b187SLois Curfman McInnes   TSSetType - Sets the method for the timestepping solver.
113f3760d9SBarry Smith 
12fee21e36SBarry Smith   Collective on TS
13fee21e36SBarry Smith 
14bef22f13SLois Curfman McInnes   Input Parameters:
15bdad233fSMatthew Knepley + ts   - The TS context
16bdad233fSMatthew Knepley - type - A known method
17bef22f13SLois Curfman McInnes 
18ae12b187SLois Curfman McInnes   Options Database Command:
19bdad233fSMatthew Knepley . -ts_type <type> - Sets the method; use -help for a list of available methods (for instance, euler)
20ae12b187SLois Curfman McInnes 
213f3760d9SBarry Smith    Notes:
22e090d566SSatish Balay    See "petsc/include/petscts.h" for available methods (for instance)
239596e0b4SJed Brown +  TSEULER - Euler
249596e0b4SJed Brown .  TSSUNDIALS - SUNDIALS interface
259596e0b4SJed Brown .  TSBEULER - Backward Euler
269596e0b4SJed Brown -  TSPSEUDO - Pseudo-timestepping
273f3760d9SBarry Smith 
28ae12b187SLois Curfman McInnes    Normally, it is best to use the TSSetFromOptions() command and
29ae12b187SLois Curfman McInnes    then set the TS type from the options database rather than by using
30ae12b187SLois Curfman McInnes    this routine.  Using the options database provides the user with
31ae12b187SLois Curfman McInnes    maximum flexibility in evaluating the many different solvers.
32ae12b187SLois Curfman McInnes    The TSSetType() routine is provided for those situations where it
33ae12b187SLois Curfman McInnes    is necessary to set the timestepping solver independently of the
34ae12b187SLois Curfman McInnes    command line or options database.  This might be the case, for example,
35ae12b187SLois Curfman McInnes    when the choice of solver changes during the execution of the
36ae12b187SLois Curfman McInnes    program, and the user's application is taking responsibility for
37ae12b187SLois Curfman McInnes    choosing the appropriate method.  In other words, this routine is
38d5d37b61SLois Curfman McInnes    not for beginners.
39d5d37b61SLois Curfman McInnes 
40d5d37b61SLois Curfman McInnes    Level: intermediate
413f3760d9SBarry Smith 
42ae12b187SLois Curfman McInnes .keywords: TS, set, type
43437fc6d7SBarry Smith 
443f3760d9SBarry Smith @*/
457087cfbeSBarry Smith PetscErrorCode  TSSetType(TS ts,const TSType type)
463f3760d9SBarry Smith {
476849ba73SBarry Smith   PetscErrorCode (*r)(TS);
48ace3abfcSBarry Smith   PetscBool      match;
49dfbe8321SBarry Smith   PetscErrorCode ierr;
50df8cb225SBarry Smith 
513a40ed3dSBarry Smith   PetscFunctionBegin;
520700a824SBarry Smith   PetscValidHeaderSpecific(ts, TS_CLASSID,1);
53bdad233fSMatthew Knepley   ierr = PetscTypeCompare((PetscObject) ts, type, &match);CHKERRQ(ierr);
54958c9bccSBarry Smith   if (match) PetscFunctionReturn(0);
55bdad233fSMatthew Knepley 
56*4b91b6eaSBarry Smith   ierr = PetscFListFind( TSList,((PetscObject)ts)->comm, type,PETSC_TRUE, (void (**)(void)) &r);CHKERRQ(ierr);
57e32f2f54SBarry Smith   if (!r) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE, "Unknown TS type: %s", type);
58958c9bccSBarry Smith   if (ts->ksp) {
5994b7f48cSBarry Smith     ierr = KSPDestroy(ts->ksp);CHKERRQ(ierr);
6094b7f48cSBarry Smith     ts->ksp = PETSC_NULL;
61bdad233fSMatthew Knepley   }
62958c9bccSBarry Smith   if (ts->snes) {
63bdad233fSMatthew Knepley     ierr = SNESDestroy(ts->snes);CHKERRQ(ierr);
64bdad233fSMatthew Knepley     ts->snes = PETSC_NULL;
65bdad233fSMatthew Knepley   }
66958c9bccSBarry Smith   if (ts->ops->destroy) {
67bdad233fSMatthew Knepley     ierr = (*(ts)->ops->destroy)(ts);CHKERRQ(ierr);
68bdad233fSMatthew Knepley   }
69bdad233fSMatthew Knepley   ierr = (*r)(ts);CHKERRQ(ierr);
70bdad233fSMatthew Knepley   ierr = PetscObjectChangeTypeName((PetscObject)ts, type);CHKERRQ(ierr);
719fb22e1aSBarry Smith #if defined(PETSC_HAVE_AMS)
729fb22e1aSBarry Smith   if (PetscAMSPublishAll) {
739fb22e1aSBarry Smith     ierr = PetscObjectAMSPublish((PetscObject)ts);CHKERRQ(ierr);
749fb22e1aSBarry Smith   }
759fb22e1aSBarry Smith #endif
763a40ed3dSBarry Smith   PetscFunctionReturn(0);
773f3760d9SBarry Smith }
783f3760d9SBarry Smith 
794a2ae208SSatish Balay #undef __FUNCT__
804a2ae208SSatish Balay #define __FUNCT__ "TSGetType"
813f3760d9SBarry Smith /*@C
82fee21e36SBarry Smith   TSGetType - Gets the TS method type (as a string).
833f3760d9SBarry Smith 
84bef22f13SLois Curfman McInnes   Not Collective
85bef22f13SLois Curfman McInnes 
863f3760d9SBarry Smith   Input Parameter:
87bdad233fSMatthew Knepley . ts - The TS
883f3760d9SBarry Smith 
893f3760d9SBarry Smith   Output Parameter:
90bdad233fSMatthew Knepley . type - The name of TS method
913f3760d9SBarry Smith 
92d5d37b61SLois Curfman McInnes   Level: intermediate
93d5d37b61SLois Curfman McInnes 
94df8cb225SBarry Smith .keywords: TS, timestepper, get, type, name
95bdad233fSMatthew Knepley .seealso TSSetType()
963f3760d9SBarry Smith @*/
977087cfbeSBarry Smith PetscErrorCode  TSGetType(TS ts, const TSType *type)
983f3760d9SBarry Smith {
993a40ed3dSBarry Smith   PetscFunctionBegin;
1000700a824SBarry Smith   PetscValidHeaderSpecific(ts,TS_CLASSID,1);
1014482741eSBarry Smith   PetscValidPointer(type,2);
1027adad957SLisandro Dalcin   *type = ((PetscObject)ts)->type_name;
1033a40ed3dSBarry Smith   PetscFunctionReturn(0);
1043f3760d9SBarry Smith }
1053f3760d9SBarry Smith 
106bdad233fSMatthew Knepley /*--------------------------------------------------------------------------------------------------------------------*/
1073cea93caSBarry Smith 
108bdad233fSMatthew Knepley #undef __FUNCT__
109bdad233fSMatthew Knepley #define __FUNCT__ "TSRegister"
1103cea93caSBarry Smith /*@C
1113cea93caSBarry Smith   TSRegister - See TSRegisterDynamic()
1123cea93caSBarry Smith 
1137f6c08e0SMatthew Knepley   Level: advanced
1143cea93caSBarry Smith @*/
1157087cfbeSBarry Smith PetscErrorCode  TSRegister(const char sname[], const char path[], const char name[], PetscErrorCode (*function)(TS))
116bdad233fSMatthew Knepley {
117e2d1d2b7SBarry Smith   char           fullname[PETSC_MAX_PATH_LEN];
118dfbe8321SBarry Smith   PetscErrorCode ierr;
119bdad233fSMatthew Knepley 
120bdad233fSMatthew Knepley   PetscFunctionBegin;
121bdad233fSMatthew Knepley   ierr = PetscStrcpy(fullname, path);CHKERRQ(ierr);
122bdad233fSMatthew Knepley   ierr = PetscStrcat(fullname, ":");CHKERRQ(ierr);
123bdad233fSMatthew Knepley   ierr = PetscStrcat(fullname, name);CHKERRQ(ierr);
124bdad233fSMatthew Knepley   ierr = PetscFListAdd(&TSList, sname, fullname, (void (*)(void)) function);CHKERRQ(ierr);
125bdad233fSMatthew Knepley   PetscFunctionReturn(0);
126bdad233fSMatthew Knepley }
127bdad233fSMatthew Knepley 
128bdad233fSMatthew Knepley /*-------------------------------------------------------------------------------------------------------------------*/
129bdad233fSMatthew Knepley #undef __FUNCT__
130bdad233fSMatthew Knepley #define __FUNCT__ "TSRegisterDestroy"
131bdad233fSMatthew Knepley /*@C
1323cea93caSBarry Smith    TSRegisterDestroy - Frees the list of timestepping routines that were registered by TSRegister()/TSRegisterDynamic().
133bdad233fSMatthew Knepley 
134bdad233fSMatthew Knepley    Not Collective
135bdad233fSMatthew Knepley 
136bdad233fSMatthew Knepley    Level: advanced
137bdad233fSMatthew Knepley 
138bdad233fSMatthew Knepley .keywords: TS, timestepper, register, destroy
139437fc6d7SBarry Smith .seealso: TSRegister(), TSRegisterAll(), TSRegisterDynamic()
140bdad233fSMatthew Knepley @*/
1417087cfbeSBarry Smith PetscErrorCode  TSRegisterDestroy(void)
142bdad233fSMatthew Knepley {
143dfbe8321SBarry Smith   PetscErrorCode ierr;
144bdad233fSMatthew Knepley 
145bdad233fSMatthew Knepley   PetscFunctionBegin;
1461441b1d3SBarry Smith   ierr = PetscFListDestroy(&TSList);CHKERRQ(ierr);
147bdad233fSMatthew Knepley   TSRegisterAllCalled = PETSC_FALSE;
148bdad233fSMatthew Knepley   PetscFunctionReturn(0);
149bdad233fSMatthew Knepley }
150bdad233fSMatthew Knepley 
151