xref: /petsc/src/ts/impls/pseudo/posindep.c (revision e090d5668ba2b2ea997ebb925e3a05be0dc5d9ab)
1*e090d566SSatish Balay /*$Id: posindep.c,v 1.43 2000/05/04 14:03:54 balay Exp balay $*/
22d3f70b5SBarry Smith /*
3fb4a63b6SLois Curfman McInnes        Code for Timestepping with implicit backwards Euler.
42d3f70b5SBarry Smith */
5*e090d566SSatish Balay #include "src/ts/tsimpl.h"                /*I   "petscts.h"   I*/
62d3f70b5SBarry Smith 
72d3f70b5SBarry Smith typedef struct {
82d3f70b5SBarry Smith   Vec  update;      /* work vector where new solution is formed */
92d3f70b5SBarry Smith   Vec  func;        /* work vector where F(t[i],u[i]) is stored */
102d3f70b5SBarry Smith   Vec  rhs;         /* work vector for RHS; vec_sol/dt */
112d3f70b5SBarry Smith 
122d3f70b5SBarry Smith   /* information used for Pseudo-timestepping */
132d3f70b5SBarry Smith 
147bf11e45SBarry Smith   int    (*dt)(TS,double*,void*);              /* compute next timestep, and related context */
152d3f70b5SBarry Smith   void   *dtctx;
167bf11e45SBarry Smith   int    (*verify)(TS,Vec,void*,double*,int*); /* verify previous timestep and related context */
177bf11e45SBarry Smith   void   *verifyctx;
182d3f70b5SBarry Smith 
197bf11e45SBarry Smith   double initial_fnorm,fnorm;                  /* original and current norm of F(u) */
20ca4b7087SBarry Smith   double fnorm_previous;
2128aa8177SBarry Smith 
2228aa8177SBarry Smith   double dt_increment;                  /* scaling that dt is incremented each time-step */
23ca4b7087SBarry Smith   int    increment_dt_from_initial_dt;
247bf11e45SBarry Smith } TS_Pseudo;
252d3f70b5SBarry Smith 
262d3f70b5SBarry Smith /* ------------------------------------------------------------------------------*/
272d3f70b5SBarry Smith 
2858562591SBarry Smith #undef __FUNC__
29b2863d3aSBarry Smith #define __FUNC__ /*<a name=""></a>*/"TSPseudoComputeTimeStep"
307bf11e45SBarry Smith /*@
317bf11e45SBarry Smith     TSPseudoComputeTimeStep - Computes the next timestep for a currently running
32564e8f4eSLois Curfman McInnes     pseudo-timestepping process.
332d3f70b5SBarry Smith 
3415091d37SBarry Smith     Collective on TS
3515091d37SBarry Smith 
367bf11e45SBarry Smith     Input Parameter:
377bf11e45SBarry Smith .   ts - timestep context
387bf11e45SBarry Smith 
397bf11e45SBarry Smith     Output Parameter:
40fb4a63b6SLois Curfman McInnes .   dt - newly computed timestep
41fb4a63b6SLois Curfman McInnes 
4215091d37SBarry Smith     Level: advanced
43564e8f4eSLois Curfman McInnes 
44564e8f4eSLois Curfman McInnes     Notes:
45564e8f4eSLois Curfman McInnes     The routine to be called here to compute the timestep should be
46564e8f4eSLois Curfman McInnes     set by calling TSPseudoSetTimeStep().
47564e8f4eSLois Curfman McInnes 
48fb4a63b6SLois Curfman McInnes .keywords: timestep, pseudo, compute
49564e8f4eSLois Curfman McInnes 
50564e8f4eSLois Curfman McInnes .seealso: TSPseudoDefaultTimeStep(), TSPseudoSetTimeStep()
517bf11e45SBarry Smith @*/
527bf11e45SBarry Smith int TSPseudoComputeTimeStep(TS ts,double *dt)
537bf11e45SBarry Smith {
547bf11e45SBarry Smith   TS_Pseudo *pseudo = (TS_Pseudo*)ts->data;
557bf11e45SBarry Smith   int       ierr;
567bf11e45SBarry Smith 
573a40ed3dSBarry Smith   PetscFunctionBegin;
587bf11e45SBarry Smith   PLogEventBegin(TS_PseudoComputeTimeStep,ts,0,0,0);
597bf11e45SBarry Smith   ierr = (*pseudo->dt)(ts,dt,pseudo->dtctx);CHKERRQ(ierr);
607bf11e45SBarry Smith   PLogEventEnd(TS_PseudoComputeTimeStep,ts,0,0,0);
613a40ed3dSBarry Smith   PetscFunctionReturn(0);
627bf11e45SBarry Smith }
637bf11e45SBarry Smith 
647bf11e45SBarry Smith 
657bf11e45SBarry Smith /* ------------------------------------------------------------------------------*/
6658562591SBarry Smith #undef __FUNC__
67b2863d3aSBarry Smith #define __FUNC__ /*<a name=""></a>*/"TSPseudoDefaultVerifyTimeStep"
687bf11e45SBarry Smith /*@C
69639f9d9dSBarry Smith    TSPseudoDefaultVerifyTimeStep - Default code to verify the quality of the last timestep.
707bf11e45SBarry Smith 
7115091d37SBarry Smith    Collective on TS
7215091d37SBarry Smith 
737bf11e45SBarry Smith    Input Parameters:
7415091d37SBarry Smith +  ts - the timestep context
757bf11e45SBarry Smith .  dtctx - unused timestep context
7615091d37SBarry Smith -  update - latest solution vector
777bf11e45SBarry Smith 
78564e8f4eSLois Curfman McInnes    Output Parameters:
7915091d37SBarry Smith +  newdt - the timestep to use for the next step
8015091d37SBarry Smith -  flag - flag indicating whether the last time step was acceptable
817bf11e45SBarry Smith 
8215091d37SBarry Smith    Level: advanced
83fee21e36SBarry Smith 
84564e8f4eSLois Curfman McInnes    Note:
85564e8f4eSLois Curfman McInnes    This routine always returns a flag of 1, indicating an acceptable
86564e8f4eSLois Curfman McInnes    timestep.
87564e8f4eSLois Curfman McInnes 
88564e8f4eSLois Curfman McInnes .keywords: timestep, pseudo, default, verify
89564e8f4eSLois Curfman McInnes 
90564e8f4eSLois Curfman McInnes .seealso: TSPseudoSetVerifyTimeStep(), TSPseudoVerifyTimeStep()
917bf11e45SBarry Smith @*/
927bf11e45SBarry Smith int TSPseudoDefaultVerifyTimeStep(TS ts,Vec update,void *dtctx,double *newdt,int *flag)
937bf11e45SBarry Smith {
943a40ed3dSBarry Smith   PetscFunctionBegin;
957bf11e45SBarry Smith   *flag = 1;
963a40ed3dSBarry Smith   PetscFunctionReturn(0);
977bf11e45SBarry Smith }
987bf11e45SBarry Smith 
997bf11e45SBarry Smith 
10058562591SBarry Smith #undef __FUNC__
101b2863d3aSBarry Smith #define __FUNC__ /*<a name=""></a>*/"TSPseudoVerifyTimeStep"
1027bf11e45SBarry Smith /*@
103564e8f4eSLois Curfman McInnes     TSPseudoVerifyTimeStep - Verifies whether the last timestep was acceptable.
1047bf11e45SBarry Smith 
10515091d37SBarry Smith     Collective on TS
10615091d37SBarry Smith 
107fb4a63b6SLois Curfman McInnes     Input Parameters:
10815091d37SBarry Smith +   ts - timestep context
10915091d37SBarry Smith -   update - latest solution vector
1107bf11e45SBarry Smith 
111fb4a63b6SLois Curfman McInnes     Output Parameters:
11215091d37SBarry Smith +   dt - newly computed timestep (if it had to shrink)
11315091d37SBarry Smith -   flag - indicates if current timestep was ok
1147bf11e45SBarry Smith 
11515091d37SBarry Smith     Level: advanced
116fee21e36SBarry Smith 
117564e8f4eSLois Curfman McInnes     Notes:
118564e8f4eSLois Curfman McInnes     The routine to be called here to compute the timestep should be
119564e8f4eSLois Curfman McInnes     set by calling TSPseudoSetVerifyTimeStep().
120564e8f4eSLois Curfman McInnes 
121564e8f4eSLois Curfman McInnes .keywords: timestep, pseudo, verify
122564e8f4eSLois Curfman McInnes 
123564e8f4eSLois Curfman McInnes .seealso: TSPseudoSetVerifyTimeStep(), TSPseudoDefaultVerifyTimeStep()
1247bf11e45SBarry Smith @*/
1257bf11e45SBarry Smith int TSPseudoVerifyTimeStep(TS ts,Vec update,double *dt,int *flag)
1267bf11e45SBarry Smith {
1277bf11e45SBarry Smith   TS_Pseudo *pseudo = (TS_Pseudo*)ts->data;
1287bf11e45SBarry Smith   int       ierr;
1297bf11e45SBarry Smith 
1303a40ed3dSBarry Smith   PetscFunctionBegin;
1313a40ed3dSBarry Smith   if (!pseudo->verify) {*flag = 1; PetscFunctionReturn(0);}
1327bf11e45SBarry Smith 
1337bf11e45SBarry Smith   ierr = (*pseudo->verify)(ts,update,pseudo->verifyctx,dt,flag);CHKERRQ(ierr);
1347bf11e45SBarry Smith 
1353a40ed3dSBarry Smith   PetscFunctionReturn(0);
1367bf11e45SBarry Smith }
1377bf11e45SBarry Smith 
1387bf11e45SBarry Smith /* --------------------------------------------------------------------------------*/
1397bf11e45SBarry Smith 
14058562591SBarry Smith #undef __FUNC__
141b2863d3aSBarry Smith #define __FUNC__ /*<a name=""></a>*/"TSStep_Pseudo"
1427bf11e45SBarry Smith static int TSStep_Pseudo(TS ts,int *steps,double *time)
1432d3f70b5SBarry Smith {
1442d3f70b5SBarry Smith   Vec       sol = ts->vec_sol;
145f2267985SLois Curfman McInnes   int       ierr,i,max_steps = ts->max_steps,its,ok,lits;
1467bf11e45SBarry Smith   TS_Pseudo *pseudo = (TS_Pseudo*)ts->data;
1477bf11e45SBarry Smith   double    current_time_step;
1482d3f70b5SBarry Smith 
1493a40ed3dSBarry Smith   PetscFunctionBegin;
1502d3f70b5SBarry Smith   *steps = -ts->steps;
1512d3f70b5SBarry Smith 
1527bf11e45SBarry Smith   ierr = VecCopy(sol,pseudo->update);CHKERRQ(ierr);
1532d3f70b5SBarry Smith   for (i=0; i<max_steps && ts->ptime < ts->max_time; i++) {
1547bf11e45SBarry Smith     ierr = TSPseudoComputeTimeStep(ts,&ts->time_step);CHKERRQ(ierr);
1557bf11e45SBarry Smith     current_time_step = ts->time_step;
1567bf11e45SBarry Smith     while (1) {
1577bf11e45SBarry Smith       ts->ptime  += current_time_step;
1587bf11e45SBarry Smith       ierr = SNESSolve(ts->snes,pseudo->update,&its);CHKERRQ(ierr);
159f2267985SLois Curfman McInnes       ierr = SNESGetNumberLinearIterations(ts->snes,&lits);CHKERRQ(ierr);
160f2267985SLois Curfman McInnes       ts->nonlinear_its += PetscAbsInt(its); ts->linear_its += lits;
1617bf11e45SBarry Smith       ierr = TSPseudoVerifyTimeStep(ts,pseudo->update,&ts->time_step,&ok);CHKERRQ(ierr);
1627bf11e45SBarry Smith       if (ok) break;
1637bf11e45SBarry Smith       ts->ptime        -= current_time_step;
1647bf11e45SBarry Smith       current_time_step = ts->time_step;
1657bf11e45SBarry Smith     }
1667bf11e45SBarry Smith     ierr = VecCopy(pseudo->update,sol);CHKERRQ(ierr);
1672d3f70b5SBarry Smith     ts->steps++;
1682d3f70b5SBarry Smith     ierr = TSMonitor(ts,ts->steps,ts->ptime,sol);CHKERRQ(ierr);
1692d3f70b5SBarry Smith   }
1702d3f70b5SBarry Smith 
1712d3f70b5SBarry Smith   *steps += ts->steps;
1722d3f70b5SBarry Smith   *time  = ts->ptime;
1733a40ed3dSBarry Smith   PetscFunctionReturn(0);
1742d3f70b5SBarry Smith }
1752d3f70b5SBarry Smith 
1762d3f70b5SBarry Smith /*------------------------------------------------------------*/
17758562591SBarry Smith #undef __FUNC__
178b2863d3aSBarry Smith #define __FUNC__ /*<a name=""></a>*/"TSDestroy_Pseudo"
179e1311b90SBarry Smith static int TSDestroy_Pseudo(TS ts)
1802d3f70b5SBarry Smith {
1817bf11e45SBarry Smith   TS_Pseudo *pseudo = (TS_Pseudo*)ts->data;
1822d3f70b5SBarry Smith   int       ierr;
1832d3f70b5SBarry Smith 
1843a40ed3dSBarry Smith   PetscFunctionBegin;
185e4ef1970SSatish Balay   if (pseudo->update) {ierr = VecDestroy(pseudo->update);CHKERRQ(ierr);}
1867bf11e45SBarry Smith   if (pseudo->func) {ierr = VecDestroy(pseudo->func);CHKERRQ(ierr);}
1877bf11e45SBarry Smith   if (pseudo->rhs)  {ierr = VecDestroy(pseudo->rhs);CHKERRQ(ierr);}
1882d3f70b5SBarry Smith   if (ts->Ashell)   {ierr = MatDestroy(ts->A);CHKERRQ(ierr);}
189606d414cSSatish Balay   ierr = PetscFree(pseudo);CHKERRQ(ierr);
1903a40ed3dSBarry Smith   PetscFunctionReturn(0);
1912d3f70b5SBarry Smith }
1922d3f70b5SBarry Smith 
1932d3f70b5SBarry Smith 
1942d3f70b5SBarry Smith /*------------------------------------------------------------*/
1952d3f70b5SBarry Smith /*
1962d3f70b5SBarry Smith     This matrix shell multiply where user provided Shell matrix
1972d3f70b5SBarry Smith */
1982d3f70b5SBarry Smith 
19958562591SBarry Smith #undef __FUNC__
200b2863d3aSBarry Smith #define __FUNC__ /*<a name=""></a>*/"TSPseudoMatMult"
2017bf11e45SBarry Smith int TSPseudoMatMult(Mat mat,Vec x,Vec y)
2022d3f70b5SBarry Smith {
2032d3f70b5SBarry Smith   TS     ts;
2042d3f70b5SBarry Smith   Scalar mdt,mone = -1.0;
2052d3f70b5SBarry Smith   int    ierr;
2062d3f70b5SBarry Smith 
2073a40ed3dSBarry Smith   PetscFunctionBegin;
2083a40ed3dSBarry Smith   ierr = MatShellGetContext(mat,(void **)&ts);CHKERRQ(ierr);
2092d3f70b5SBarry Smith   mdt = 1.0/ts->time_step;
2102d3f70b5SBarry Smith 
2112d3f70b5SBarry Smith   /* apply user provided function */
2122d3f70b5SBarry Smith   ierr = MatMult(ts->Ashell,x,y);CHKERRQ(ierr);
2132d3f70b5SBarry Smith   /* shift and scale by 1/dt - F */
2142d3f70b5SBarry Smith   ierr = VecAXPBY(&mdt,&mone,x,y);CHKERRQ(ierr);
2153a40ed3dSBarry Smith   PetscFunctionReturn(0);
2162d3f70b5SBarry Smith }
2172d3f70b5SBarry Smith 
2182d3f70b5SBarry Smith /*
2192d3f70b5SBarry Smith     This defines the nonlinear equation that is to be solved with SNES
2202d3f70b5SBarry Smith 
2212d3f70b5SBarry Smith               (U^{n+1} - U^{n})/dt - F(U^{n+1})
2222d3f70b5SBarry Smith */
22358562591SBarry Smith #undef __FUNC__
224b2863d3aSBarry Smith #define __FUNC__ /*<a name=""></a>*/"TSPseudoFunction"
2257bf11e45SBarry Smith int TSPseudoFunction(SNES snes,Vec x,Vec y,void *ctx)
2262d3f70b5SBarry Smith {
2272d3f70b5SBarry Smith   TS     ts = (TS) ctx;
2282d3f70b5SBarry Smith   Scalar mdt = 1.0/ts->time_step,*unp1,*un,*Funp1;
2292d3f70b5SBarry Smith   int    ierr,i,n;
2302d3f70b5SBarry Smith 
2313a40ed3dSBarry Smith   PetscFunctionBegin;
2322d3f70b5SBarry Smith   /* apply user provided function */
2332d3f70b5SBarry Smith   ierr = TSComputeRHSFunction(ts,ts->ptime,x,y);CHKERRQ(ierr);
2347bf11e45SBarry Smith   /* compute (u^{n+1) - u^{n})/dt - F(u^{n+1}) */
2352d3f70b5SBarry Smith   ierr = VecGetArray(ts->vec_sol,&un);CHKERRQ(ierr);
2362d3f70b5SBarry Smith   ierr = VecGetArray(x,&unp1);CHKERRQ(ierr);
2372d3f70b5SBarry Smith   ierr = VecGetArray(y,&Funp1);CHKERRQ(ierr);
2382d3f70b5SBarry Smith   ierr = VecGetLocalSize(x,&n);CHKERRQ(ierr);
2392d3f70b5SBarry Smith   for (i=0; i<n; i++) {
2402d3f70b5SBarry Smith     Funp1[i] = mdt*(unp1[i] - un[i]) - Funp1[i];
2412d3f70b5SBarry Smith   }
242888f2ed8SSatish Balay   ierr = VecRestoreArray(ts->vec_sol,&un);CHKERRQ(ierr);
243888f2ed8SSatish Balay   ierr = VecRestoreArray(x,&unp1);CHKERRQ(ierr);
244888f2ed8SSatish Balay   ierr = VecRestoreArray(y,&Funp1);CHKERRQ(ierr);
2452d3f70b5SBarry Smith 
2463a40ed3dSBarry Smith   PetscFunctionReturn(0);
2472d3f70b5SBarry Smith }
2482d3f70b5SBarry Smith 
2492d3f70b5SBarry Smith /*
2502d3f70b5SBarry Smith    This constructs the Jacobian needed for SNES
2512d3f70b5SBarry Smith 
2522d3f70b5SBarry Smith              J = I/dt - J_{F}   where J_{F} is the given Jacobian of F.
2532d3f70b5SBarry Smith */
25458562591SBarry Smith #undef __FUNC__
255b2863d3aSBarry Smith #define __FUNC__ /*<a name=""></a>*/"TSPseudoJacobian"
2567bf11e45SBarry Smith int TSPseudoJacobian(SNES snes,Vec x,Mat *AA,Mat *BB,MatStructure *str,void *ctx)
2572d3f70b5SBarry Smith {
2582d3f70b5SBarry Smith   TS      ts = (TS) ctx;
2592d3f70b5SBarry Smith   int     ierr;
2602d3f70b5SBarry Smith   Scalar  mone = -1.0,mdt = 1.0/ts->time_step;
2612d3f70b5SBarry Smith   MatType mtype;
2622d3f70b5SBarry Smith 
2633a40ed3dSBarry Smith   PetscFunctionBegin;
2642d3f70b5SBarry Smith   /* construct users Jacobian */
265a7a1495cSBarry Smith   ierr = TSComputeRHSJacobian(ts,ts->ptime,x,AA,BB,str);CHKERRQ(ierr);
2662d3f70b5SBarry Smith 
2672d3f70b5SBarry Smith   /* shift and scale Jacobian, if not a shell matrix */
268888f2ed8SSatish Balay   ierr = MatGetType(*AA,&mtype,PETSC_NULL);CHKERRQ(ierr);
2692d3f70b5SBarry Smith   if (mtype != MATSHELL) {
2702d3f70b5SBarry Smith     ierr = MatScale(&mone,*AA);CHKERRQ(ierr);
2712d3f70b5SBarry Smith     ierr = MatShift(&mdt,*AA);CHKERRQ(ierr);
2722d3f70b5SBarry Smith   }
273888f2ed8SSatish Balay   ierr = MatGetType(*BB,&mtype,PETSC_NULL);CHKERRQ(ierr);
2742d3f70b5SBarry Smith   if (*BB != *AA && *str != SAME_PRECONDITIONER && mtype != MATSHELL) {
2752d3f70b5SBarry Smith     ierr = MatScale(&mone,*BB);CHKERRQ(ierr);
2762d3f70b5SBarry Smith     ierr = MatShift(&mdt,*BB);CHKERRQ(ierr);
2772d3f70b5SBarry Smith   }
2782d3f70b5SBarry Smith 
2793a40ed3dSBarry Smith   PetscFunctionReturn(0);
2802d3f70b5SBarry Smith }
2812d3f70b5SBarry Smith 
2822d3f70b5SBarry Smith 
28358562591SBarry Smith #undef __FUNC__
284b2863d3aSBarry Smith #define __FUNC__ /*<a name=""></a>*/"TSSetUp_Pseudo"
2857bf11e45SBarry Smith static int TSSetUp_Pseudo(TS ts)
2862d3f70b5SBarry Smith {
2877bf11e45SBarry Smith   TS_Pseudo *pseudo = (TS_Pseudo*)ts->data;
2882d3f70b5SBarry Smith   int       ierr,M,m;
2892d3f70b5SBarry Smith 
2903a40ed3dSBarry Smith   PetscFunctionBegin;
2917bf11e45SBarry Smith   ierr = VecDuplicate(ts->vec_sol,&pseudo->update);CHKERRQ(ierr);
2927bf11e45SBarry Smith   ierr = VecDuplicate(ts->vec_sol,&pseudo->func);CHKERRQ(ierr);
2937bf11e45SBarry Smith   ierr = SNESSetFunction(ts->snes,pseudo->func,TSPseudoFunction,ts);CHKERRQ(ierr);
2942d3f70b5SBarry Smith   if (ts->Ashell) { /* construct new shell matrix */
2952d3f70b5SBarry Smith     ierr = VecGetSize(ts->vec_sol,&M);CHKERRQ(ierr);
2962d3f70b5SBarry Smith     ierr = VecGetLocalSize(ts->vec_sol,&m);CHKERRQ(ierr);
2972d3f70b5SBarry Smith     ierr = MatCreateShell(ts->comm,m,M,M,M,ts,&ts->A);CHKERRQ(ierr);
2987bf11e45SBarry Smith     ierr = MatShellSetOperation(ts->A,MATOP_MULT,(void*)TSPseudoMatMult);CHKERRQ(ierr);
2992d3f70b5SBarry Smith   }
3007bf11e45SBarry Smith   ierr = SNESSetJacobian(ts->snes,ts->A,ts->B,TSPseudoJacobian,ts);CHKERRQ(ierr);
3013a40ed3dSBarry Smith   PetscFunctionReturn(0);
3022d3f70b5SBarry Smith }
3032d3f70b5SBarry Smith /*------------------------------------------------------------*/
3042d3f70b5SBarry Smith 
30558562591SBarry Smith #undef __FUNC__
306b2863d3aSBarry Smith #define __FUNC__ /*<a name=""></a>*/"TSPseudoDefaultMonitor"
3072d3f70b5SBarry Smith int TSPseudoDefaultMonitor(TS ts,int step,double time,Vec v,void *ctx)
3082d3f70b5SBarry Smith {
3097bf11e45SBarry Smith   TS_Pseudo *pseudo = (TS_Pseudo*)ts->data;
310d132466eSBarry Smith   int       ierr;
3112d3f70b5SBarry Smith 
3123a40ed3dSBarry Smith   PetscFunctionBegin;
313d132466eSBarry Smith   ierr = (*PetscHelpPrintf)(ts->comm,"TS %d dt %g time %g fnorm %g\n",step,ts->time_step,time,pseudo->fnorm);CHKERRQ(ierr);
3143a40ed3dSBarry Smith   PetscFunctionReturn(0);
3152d3f70b5SBarry Smith }
3162d3f70b5SBarry Smith 
31758562591SBarry Smith #undef __FUNC__
318b2863d3aSBarry Smith #define __FUNC__ /*<a name=""></a>*/"TSSetFromOptions_Pseudo"
3197bf11e45SBarry Smith static int TSSetFromOptions_Pseudo(TS ts)
3202d3f70b5SBarry Smith {
321f1af5d2fSBarry Smith   int        ierr;
322f1af5d2fSBarry Smith   PetscTruth flg;
32328aa8177SBarry Smith   double     inc;
3242d3f70b5SBarry Smith 
3253a40ed3dSBarry Smith   PetscFunctionBegin;
3262d3f70b5SBarry Smith   ierr = SNESSetFromOptions(ts->snes);CHKERRQ(ierr);
3272d3f70b5SBarry Smith 
3282d3f70b5SBarry Smith   ierr = OptionsHasName(ts->prefix,"-ts_monitor",&flg);CHKERRQ(ierr);
3292d3f70b5SBarry Smith   if (flg) {
330329f5518SBarry Smith     ierr = TSSetMonitor(ts,TSPseudoDefaultMonitor,PETSC_NULL,PETSC_NULL);CHKERRQ(ierr);
33128aa8177SBarry Smith   }
33228aa8177SBarry Smith   ierr = OptionsGetDouble(ts->prefix,"-ts_pseudo_increment",&inc,&flg);CHKERRQ(ierr);
33328aa8177SBarry Smith   if (flg) {
33428aa8177SBarry Smith     ierr = TSPseudoSetTimeStepIncrement(ts,inc);CHKERRQ(ierr);
3352d3f70b5SBarry Smith   }
336ca4b7087SBarry Smith   ierr = OptionsHasName(ts->prefix,"-ts_pseudo_increment_dt_from_initial_dt",&flg);CHKERRQ(ierr);
337ca4b7087SBarry Smith   if (flg) {
338ca4b7087SBarry Smith     ierr = TSPseudoIncrementDtFromInitialDt(ts);CHKERRQ(ierr);
339ca4b7087SBarry Smith   }
3403a40ed3dSBarry Smith   PetscFunctionReturn(0);
3412d3f70b5SBarry Smith }
3422d3f70b5SBarry Smith 
34358562591SBarry Smith #undef __FUNC__
344b2863d3aSBarry Smith #define __FUNC__ /*<a name=""></a>*/"TSPrintHelp_Pseudo"
345ca4b7087SBarry Smith static int TSPrintHelp_Pseudo(TS ts,char *p)
3462d3f70b5SBarry Smith {
347d132466eSBarry Smith   int ierr;
348d132466eSBarry Smith 
3493a40ed3dSBarry Smith   PetscFunctionBegin;
350d132466eSBarry Smith   ierr = (*PetscHelpPrintf)(ts->comm," Options for TS Pseudo timestepper:\n");CHKERRQ(ierr);
351d132466eSBarry Smith   ierr = (*PetscHelpPrintf)(ts->comm," %sts_pseudo_increment <value> : default 1.1\n",p);CHKERRQ(ierr);
352d132466eSBarry Smith   ierr = (*PetscHelpPrintf)(ts->comm," %sts_pseudo_increment_dt_from_initial_dt : use initial_dt *\n",p);CHKERRQ(ierr);
353d132466eSBarry Smith   ierr = (*PetscHelpPrintf)(ts->comm,"     initial fnorm/current fnorm to determine new timestep\n");CHKERRQ(ierr);
354d132466eSBarry Smith   ierr = (*PetscHelpPrintf)(ts->comm,"     default is current_dt * previous fnorm/current fnorm\n");CHKERRQ(ierr);
3553a40ed3dSBarry Smith   PetscFunctionReturn(0);
3562d3f70b5SBarry Smith }
3572d3f70b5SBarry Smith 
35858562591SBarry Smith #undef __FUNC__
359b2863d3aSBarry Smith #define __FUNC__ /*<a name=""></a>*/"TSView_Pseudo"
360e1311b90SBarry Smith static int TSView_Pseudo(TS ts,Viewer viewer)
3612d3f70b5SBarry Smith {
3623a40ed3dSBarry Smith   PetscFunctionBegin;
3633a40ed3dSBarry Smith   PetscFunctionReturn(0);
3642d3f70b5SBarry Smith }
3652d3f70b5SBarry Smith 
36682bf6240SBarry Smith /* ----------------------------------------------------------------------------- */
36782bf6240SBarry Smith #undef __FUNC__
368b2863d3aSBarry Smith #define __FUNC__ /*<a name=""></a>*/"TSPseudoSetVerifyTimeStep"
36982bf6240SBarry Smith /*@
37082bf6240SBarry Smith    TSPseudoSetVerifyTimeStep - Sets a user-defined routine to verify the quality of the
37182bf6240SBarry Smith    last timestep.
37282bf6240SBarry Smith 
37315091d37SBarry Smith    Collective on TS
37415091d37SBarry Smith 
37582bf6240SBarry Smith    Input Parameters:
37615091d37SBarry Smith +  ts - timestep context
37782bf6240SBarry Smith .  dt - user-defined function to verify timestep
37815091d37SBarry Smith -  ctx - [optional] user-defined context for private data
37982bf6240SBarry Smith          for the timestep verification routine (may be PETSC_NULL)
38082bf6240SBarry Smith 
38115091d37SBarry Smith    Level: advanced
382fee21e36SBarry Smith 
38382bf6240SBarry Smith    Calling sequence of func:
38482bf6240SBarry Smith .  func (TS ts,Vec update,void *ctx,double *newdt,int *flag);
38582bf6240SBarry Smith 
38682bf6240SBarry Smith .  update - latest solution vector
38782bf6240SBarry Smith .  ctx - [optional] timestep context
38882bf6240SBarry Smith .  newdt - the timestep to use for the next step
38982bf6240SBarry Smith .  flag - flag indicating whether the last time step was acceptable
39082bf6240SBarry Smith 
39182bf6240SBarry Smith    Notes:
39282bf6240SBarry Smith    The routine set here will be called by TSPseudoVerifyTimeStep()
39382bf6240SBarry Smith    during the timestepping process.
39482bf6240SBarry Smith 
39582bf6240SBarry Smith .keywords: timestep, pseudo, set, verify
39682bf6240SBarry Smith 
39782bf6240SBarry Smith .seealso: TSPseudoDefaultVerifyTimeStep(), TSPseudoVerifyTimeStep()
39882bf6240SBarry Smith @*/
39982bf6240SBarry Smith int TSPseudoSetVerifyTimeStep(TS ts,int (*dt)(TS,Vec,void*,double*,int*),void* ctx)
40082bf6240SBarry Smith {
40182bf6240SBarry Smith   int ierr,(*f)(TS,int (*)(TS,Vec,void*,double *,int *),void *);
40282bf6240SBarry Smith 
40382bf6240SBarry Smith   PetscFunctionBegin;
40482bf6240SBarry Smith   PetscValidHeaderSpecific(ts,TS_COOKIE);
40582bf6240SBarry Smith 
40694d884c6SBarry Smith   ierr = PetscObjectQueryFunction((PetscObject)ts,"TSPseudoSetVerifyTimeStep_C",(void **)&f);CHKERRQ(ierr);
40782bf6240SBarry Smith   if (f) {
40882bf6240SBarry Smith     ierr = (*f)(ts,dt,ctx);CHKERRQ(ierr);
40982bf6240SBarry Smith   }
41082bf6240SBarry Smith   PetscFunctionReturn(0);
41182bf6240SBarry Smith }
41282bf6240SBarry Smith 
41382bf6240SBarry Smith #undef __FUNC__
414b2863d3aSBarry Smith #define __FUNC__ /*<a name=""></a>*/"TSPseudoSetTimeStepIncrement"
41582bf6240SBarry Smith /*@
41682bf6240SBarry Smith     TSPseudoSetTimeStepIncrement - Sets the scaling increment applied to
41782bf6240SBarry Smith     dt when using the TSPseudoDefaultTimeStep() routine.
41882bf6240SBarry Smith 
419fee21e36SBarry Smith    Collective on TS
420fee21e36SBarry Smith 
42115091d37SBarry Smith     Input Parameters:
42215091d37SBarry Smith +   ts - the timestep context
42315091d37SBarry Smith -   inc - the scaling factor >= 1.0
42415091d37SBarry Smith 
42582bf6240SBarry Smith     Options Database Key:
42682bf6240SBarry Smith $    -ts_pseudo_increment <increment>
42782bf6240SBarry Smith 
42815091d37SBarry Smith     Level: advanced
42915091d37SBarry Smith 
43082bf6240SBarry Smith .keywords: timestep, pseudo, set, increment
43182bf6240SBarry Smith 
43282bf6240SBarry Smith .seealso: TSPseudoSetTimeStep(), TSPseudoDefaultTimeStep()
43382bf6240SBarry Smith @*/
43482bf6240SBarry Smith int TSPseudoSetTimeStepIncrement(TS ts,double inc)
43582bf6240SBarry Smith {
43682bf6240SBarry Smith   int ierr,(*f)(TS,double);
43782bf6240SBarry Smith 
43882bf6240SBarry Smith   PetscFunctionBegin;
43982bf6240SBarry Smith   PetscValidHeaderSpecific(ts,TS_COOKIE);
44082bf6240SBarry Smith 
44194d884c6SBarry Smith   ierr = PetscObjectQueryFunction((PetscObject)ts,"TSPseudoSetTimeStepIncrement_C",(void **)&f);CHKERRQ(ierr);
44282bf6240SBarry Smith   if (f) {
44382bf6240SBarry Smith     ierr = (*f)(ts,inc);CHKERRQ(ierr);
44482bf6240SBarry Smith   }
44582bf6240SBarry Smith   PetscFunctionReturn(0);
44682bf6240SBarry Smith }
44782bf6240SBarry Smith 
44882bf6240SBarry Smith #undef __FUNC__
449b2863d3aSBarry Smith #define __FUNC__ /*<a name=""></a>*/"TSPseudoIncrementDtFromInitialDt"
45082bf6240SBarry Smith /*@
45182bf6240SBarry Smith     TSPseudoIncrementDtFromInitialDt - Indicates that a new timestep
45282bf6240SBarry Smith     is computed via the formula
45382bf6240SBarry Smith $         dt = initial_dt*initial_fnorm/current_fnorm
45482bf6240SBarry Smith       rather than the default update,
45582bf6240SBarry Smith $         dt = current_dt*previous_fnorm/current_fnorm.
45682bf6240SBarry Smith 
45715091d37SBarry Smith    Collective on TS
45815091d37SBarry Smith 
45982bf6240SBarry Smith     Input Parameter:
46082bf6240SBarry Smith .   ts - the timestep context
46182bf6240SBarry Smith 
46282bf6240SBarry Smith     Options Database Key:
46382bf6240SBarry Smith $    -ts_pseudo_increment_dt_from_initial_dt
46482bf6240SBarry Smith 
46515091d37SBarry Smith     Level: advanced
46615091d37SBarry Smith 
46782bf6240SBarry Smith .keywords: timestep, pseudo, set, increment
46882bf6240SBarry Smith 
46982bf6240SBarry Smith .seealso: TSPseudoSetTimeStep(), TSPseudoDefaultTimeStep()
47082bf6240SBarry Smith @*/
47182bf6240SBarry Smith int TSPseudoIncrementDtFromInitialDt(TS ts)
47282bf6240SBarry Smith {
47382bf6240SBarry Smith   int ierr,(*f)(TS);
47482bf6240SBarry Smith 
47582bf6240SBarry Smith   PetscFunctionBegin;
47682bf6240SBarry Smith   PetscValidHeaderSpecific(ts,TS_COOKIE);
47782bf6240SBarry Smith 
47894d884c6SBarry Smith   ierr = PetscObjectQueryFunction((PetscObject)ts,"TSPseudoIncrementDtFromInitialDt_C",(void **)&f);CHKERRQ(ierr);
47982bf6240SBarry Smith   if (f) {
48082bf6240SBarry Smith     ierr = (*f)(ts);CHKERRQ(ierr);
48182bf6240SBarry Smith   }
48282bf6240SBarry Smith   PetscFunctionReturn(0);
48382bf6240SBarry Smith }
48482bf6240SBarry Smith 
48582bf6240SBarry Smith 
48682bf6240SBarry Smith #undef __FUNC__
487b2863d3aSBarry Smith #define __FUNC__ /*<a name=""></a>*/"TSPseudoSetTimeStep"
48882bf6240SBarry Smith /*@
48982bf6240SBarry Smith    TSPseudoSetTimeStep - Sets the user-defined routine to be
49082bf6240SBarry Smith    called at each pseudo-timestep to update the timestep.
49182bf6240SBarry Smith 
49215091d37SBarry Smith    Collective on TS
49315091d37SBarry Smith 
49482bf6240SBarry Smith    Input Parameters:
49515091d37SBarry Smith +  ts - timestep context
49682bf6240SBarry Smith .  dt - function to compute timestep
49715091d37SBarry Smith -  ctx - [optional] user-defined context for private data
49882bf6240SBarry Smith          required by the function (may be PETSC_NULL)
49982bf6240SBarry Smith 
50015091d37SBarry Smith    Level: intermediate
501fee21e36SBarry Smith 
50282bf6240SBarry Smith    Calling sequence of func:
50382bf6240SBarry Smith .  func (TS ts,double *newdt,void *ctx);
50482bf6240SBarry Smith 
50582bf6240SBarry Smith .  newdt - the newly computed timestep
50682bf6240SBarry Smith .  ctx - [optional] timestep context
50782bf6240SBarry Smith 
50882bf6240SBarry Smith    Notes:
50982bf6240SBarry Smith    The routine set here will be called by TSPseudoComputeTimeStep()
51082bf6240SBarry Smith    during the timestepping process.
51182bf6240SBarry Smith 
51282bf6240SBarry Smith .keywords: timestep, pseudo, set
51382bf6240SBarry Smith 
51482bf6240SBarry Smith .seealso: TSPseudoDefaultTimeStep(), TSPseudoComputeTimeStep()
51582bf6240SBarry Smith @*/
51682bf6240SBarry Smith int TSPseudoSetTimeStep(TS ts,int (*dt)(TS,double*,void*),void* ctx)
51782bf6240SBarry Smith {
51882bf6240SBarry Smith   int ierr,(*f)(TS,int (*)(TS,double *,void *),void *);
51982bf6240SBarry Smith 
52082bf6240SBarry Smith   PetscFunctionBegin;
52182bf6240SBarry Smith   PetscValidHeaderSpecific(ts,TS_COOKIE);
52282bf6240SBarry Smith 
52394d884c6SBarry Smith   ierr = PetscObjectQueryFunction((PetscObject)ts,"TSPseudoSetTimeStep_C",(void **)&f);CHKERRQ(ierr);
52482bf6240SBarry Smith   if (f) {
52582bf6240SBarry Smith     ierr = (*f)(ts,dt,ctx);CHKERRQ(ierr);
52682bf6240SBarry Smith   }
52782bf6240SBarry Smith   PetscFunctionReturn(0);
52882bf6240SBarry Smith }
52982bf6240SBarry Smith 
53082bf6240SBarry Smith /* ----------------------------------------------------------------------------- */
53182bf6240SBarry Smith 
532fb2e594dSBarry Smith EXTERN_C_BEGIN
53382bf6240SBarry Smith #undef __FUNC__
534b2863d3aSBarry Smith #define __FUNC__ /*<a name=""></a>*/"TSPseudoSetVerifyTimeStep_Pseudo"
53582bf6240SBarry Smith int TSPseudoSetVerifyTimeStep_Pseudo(TS ts,int (*dt)(TS,Vec,void*,double*,int*),void* ctx)
53682bf6240SBarry Smith {
53782bf6240SBarry Smith   TS_Pseudo *pseudo;
53882bf6240SBarry Smith 
53982bf6240SBarry Smith   PetscFunctionBegin;
54082bf6240SBarry Smith   pseudo              = (TS_Pseudo*)ts->data;
54182bf6240SBarry Smith   pseudo->verify      = dt;
54282bf6240SBarry Smith   pseudo->verifyctx   = ctx;
54382bf6240SBarry Smith   PetscFunctionReturn(0);
54482bf6240SBarry Smith }
545fb2e594dSBarry Smith EXTERN_C_END
54682bf6240SBarry Smith 
547fb2e594dSBarry Smith EXTERN_C_BEGIN
54882bf6240SBarry Smith #undef __FUNC__
549b2863d3aSBarry Smith #define __FUNC__ /*<a name=""></a>*/"TSPseudoSetTimeStepIncrement_Pseudo"
55082bf6240SBarry Smith int TSPseudoSetTimeStepIncrement_Pseudo(TS ts,double inc)
55182bf6240SBarry Smith {
55282bf6240SBarry Smith   TS_Pseudo *pseudo;
55382bf6240SBarry Smith 
55482bf6240SBarry Smith   PetscFunctionBegin;
55582bf6240SBarry Smith   pseudo               = (TS_Pseudo*)ts->data;
55682bf6240SBarry Smith   pseudo->dt_increment = inc;
55782bf6240SBarry Smith   PetscFunctionReturn(0);
55882bf6240SBarry Smith }
559fb2e594dSBarry Smith EXTERN_C_END
56082bf6240SBarry Smith 
561fb2e594dSBarry Smith EXTERN_C_BEGIN
56282bf6240SBarry Smith #undef __FUNC__
563b2863d3aSBarry Smith #define __FUNC__ /*<a name=""></a>*/"TSPseudoIncrementDtFromInitialDt_Pseudo"
56482bf6240SBarry Smith int TSPseudoIncrementDtFromInitialDt_Pseudo(TS ts)
56582bf6240SBarry Smith {
56682bf6240SBarry Smith   TS_Pseudo *pseudo;
56782bf6240SBarry Smith 
56882bf6240SBarry Smith   PetscFunctionBegin;
56982bf6240SBarry Smith   pseudo                               = (TS_Pseudo*)ts->data;
57082bf6240SBarry Smith   pseudo->increment_dt_from_initial_dt = 1;
57182bf6240SBarry Smith   PetscFunctionReturn(0);
57282bf6240SBarry Smith }
573fb2e594dSBarry Smith EXTERN_C_END
57482bf6240SBarry Smith 
575fb2e594dSBarry Smith EXTERN_C_BEGIN
57682bf6240SBarry Smith #undef __FUNC__
577b2863d3aSBarry Smith #define __FUNC__ /*<a name=""></a>*/"TSPseudoSetTimeStep_Pseudo"
57882bf6240SBarry Smith int TSPseudoSetTimeStep_Pseudo(TS ts,int (*dt)(TS,double*,void*),void* ctx)
57982bf6240SBarry Smith {
58082bf6240SBarry Smith   TS_Pseudo *pseudo;
58182bf6240SBarry Smith 
58282bf6240SBarry Smith   PetscFunctionBegin;
58382bf6240SBarry Smith   pseudo          = (TS_Pseudo*)ts->data;
58482bf6240SBarry Smith   pseudo->dt      = dt;
58582bf6240SBarry Smith   pseudo->dtctx   = ctx;
58682bf6240SBarry Smith   PetscFunctionReturn(0);
58782bf6240SBarry Smith }
588fb2e594dSBarry Smith EXTERN_C_END
58982bf6240SBarry Smith 
59082bf6240SBarry Smith /* ----------------------------------------------------------------------------- */
59182bf6240SBarry Smith 
592fb2e594dSBarry Smith EXTERN_C_BEGIN
59358562591SBarry Smith #undef __FUNC__
594b2863d3aSBarry Smith #define __FUNC__ /*<a name=""></a>*/"TSCreate_Pseudo"
5957bf11e45SBarry Smith int TSCreate_Pseudo(TS ts)
5962d3f70b5SBarry Smith {
5977bf11e45SBarry Smith   TS_Pseudo *pseudo;
5982d3f70b5SBarry Smith   int       ierr;
5992d3f70b5SBarry Smith   MatType   mtype;
6002d3f70b5SBarry Smith 
6013a40ed3dSBarry Smith   PetscFunctionBegin;
6027bf11e45SBarry Smith   ts->destroy         = TSDestroy_Pseudo;
6037bf11e45SBarry Smith   ts->printhelp       = TSPrintHelp_Pseudo;
6047bf11e45SBarry Smith   ts->view            = TSView_Pseudo;
6052d3f70b5SBarry Smith 
6062d3f70b5SBarry Smith   if (ts->problem_type == TS_LINEAR) {
607a8c6a408SBarry Smith     SETERRQ(PETSC_ERR_ARG_WRONG,0,"Only for nonlinear problems");
6082d3f70b5SBarry Smith   }
6092d3f70b5SBarry Smith   if (!ts->A) {
610a8c6a408SBarry Smith     SETERRQ(PETSC_ERR_ARG_WRONGSTATE,0,"Must set Jacobian");
6112d3f70b5SBarry Smith   }
612888f2ed8SSatish Balay   ierr = MatGetType(ts->A,&mtype,PETSC_NULL);CHKERRQ(ierr);
6132d3f70b5SBarry Smith   if (mtype == MATSHELL) {
6142d3f70b5SBarry Smith     ts->Ashell = ts->A;
6152d3f70b5SBarry Smith   }
6167bf11e45SBarry Smith   ts->setup           = TSSetUp_Pseudo;
6177bf11e45SBarry Smith   ts->step            = TSStep_Pseudo;
6187bf11e45SBarry Smith   ts->setfromoptions  = TSSetFromOptions_Pseudo;
6197bf11e45SBarry Smith 
6207bf11e45SBarry Smith   /* create the required nonlinear solver context */
6212d3f70b5SBarry Smith   ierr = SNESCreate(ts->comm,SNES_NONLINEAR_EQUATIONS,&ts->snes);CHKERRQ(ierr);
6222d3f70b5SBarry Smith 
6237bf11e45SBarry Smith   pseudo   = PetscNew(TS_Pseudo);CHKPTRQ(pseudo);
624eed86810SBarry Smith   PLogObjectMemory(ts,sizeof(TS_Pseudo));
625eed86810SBarry Smith 
626549d3d68SSatish Balay   ierr     = PetscMemzero(pseudo,sizeof(TS_Pseudo));CHKERRQ(ierr);
6277bf11e45SBarry Smith   ts->data = (void*)pseudo;
6282d3f70b5SBarry Smith 
62928aa8177SBarry Smith   pseudo->dt_increment                 = 1.1;
630ca4b7087SBarry Smith   pseudo->increment_dt_from_initial_dt = 0;
63128aa8177SBarry Smith   pseudo->dt                           = TSPseudoDefaultTimeStep;
63282bf6240SBarry Smith 
633f1af5d2fSBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)ts,"TSPseudoSetVerifyTimeStep_C",
634e1311b90SBarry Smith                     "TSPseudoSetVerifyTimeStep_Pseudo",
6350c97f09dSSatish Balay                      TSPseudoSetVerifyTimeStep_Pseudo);CHKERRQ(ierr);
636f1af5d2fSBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)ts,"TSPseudoSetTimeStepIncrement_C",
637e1311b90SBarry Smith                     "TSPseudoSetTimeStepIncrement_Pseudo",
6380c97f09dSSatish Balay                      TSPseudoSetTimeStepIncrement_Pseudo);CHKERRQ(ierr);
639f1af5d2fSBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)ts,"TSPseudoIncrementDtFromInitialDt_C",
640e1311b90SBarry Smith                     "TSPseudoIncrementDtFromInitialDt_Pseudo",
6410c97f09dSSatish Balay                      TSPseudoIncrementDtFromInitialDt_Pseudo);CHKERRQ(ierr);
6420c97f09dSSatish Balay   ierr = PetscObjectComposeFunctionDynamic((PetscObject)ts,"TSPseudoSetTimeStep_C",
6430c97f09dSSatish Balay                     "TSPseudoSetTimeStep_Pseudo",
6440c97f09dSSatish Balay                      TSPseudoSetTimeStep_Pseudo);CHKERRQ(ierr);
6453a40ed3dSBarry Smith   PetscFunctionReturn(0);
6462d3f70b5SBarry Smith }
647fb2e594dSBarry Smith EXTERN_C_END
6482d3f70b5SBarry Smith 
64958562591SBarry Smith #undef __FUNC__
650b2863d3aSBarry Smith #define __FUNC__ /*<a name=""></a>*/"TSPseudoDefaultTimeStep"
65182bf6240SBarry Smith /*@C
65282bf6240SBarry Smith    TSPseudoDefaultTimeStep - Default code to compute pseudo-timestepping.
65382bf6240SBarry Smith    Use with TSPseudoSetTimeStep().
65428aa8177SBarry Smith 
65515091d37SBarry Smith    Collective on TS
65615091d37SBarry Smith 
65728aa8177SBarry Smith    Input Parameters:
65828aa8177SBarry Smith .  ts - the timestep context
65982bf6240SBarry Smith .  dtctx - unused timestep context
66028aa8177SBarry Smith 
66182bf6240SBarry Smith    Output Parameter:
66282bf6240SBarry Smith .  newdt - the timestep to use for the next step
66328aa8177SBarry Smith 
66415091d37SBarry Smith    Level: advanced
66515091d37SBarry Smith 
66682bf6240SBarry Smith .keywords: timestep, pseudo, default
667564e8f4eSLois Curfman McInnes 
66882bf6240SBarry Smith .seealso: TSPseudoSetTimeStep(), TSPseudoComputeTimeStep()
66928aa8177SBarry Smith @*/
67082bf6240SBarry Smith int TSPseudoDefaultTimeStep(TS ts,double* newdt,void* dtctx)
67128aa8177SBarry Smith {
67282bf6240SBarry Smith   TS_Pseudo *pseudo = (TS_Pseudo*)ts->data;
67382bf6240SBarry Smith   double    inc = pseudo->dt_increment,fnorm_previous = pseudo->fnorm_previous;
67482bf6240SBarry Smith   int       ierr;
67528aa8177SBarry Smith 
6763a40ed3dSBarry Smith   PetscFunctionBegin;
67782bf6240SBarry Smith   ierr = TSComputeRHSFunction(ts,ts->ptime,ts->vec_sol,pseudo->func);CHKERRQ(ierr);
67882bf6240SBarry Smith   ierr = VecNorm(pseudo->func,NORM_2,&pseudo->fnorm);CHKERRQ(ierr);
67982bf6240SBarry Smith   if (pseudo->initial_fnorm == 0.0) {
68082bf6240SBarry Smith     /* first time through so compute initial function norm */
68182bf6240SBarry Smith     pseudo->initial_fnorm = pseudo->fnorm;
68282bf6240SBarry Smith     fnorm_previous        = pseudo->fnorm;
68382bf6240SBarry Smith   }
68482bf6240SBarry Smith   if (pseudo->fnorm == 0.0) {
68582bf6240SBarry Smith     *newdt = 1.e12*inc*ts->time_step;
68682bf6240SBarry Smith   }
68782bf6240SBarry Smith   else if (pseudo->increment_dt_from_initial_dt) {
68882bf6240SBarry Smith     *newdt = inc*ts->initial_time_step*pseudo->initial_fnorm/pseudo->fnorm;
68982bf6240SBarry Smith   } else {
69082bf6240SBarry Smith     *newdt = inc*ts->time_step*fnorm_previous/pseudo->fnorm;
69182bf6240SBarry Smith   }
69282bf6240SBarry Smith   pseudo->fnorm_previous = pseudo->fnorm;
6933a40ed3dSBarry Smith   PetscFunctionReturn(0);
69428aa8177SBarry Smith }
6952d3f70b5SBarry Smith 
696