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