[petsc-users] Implementing TS routine

Manuel Valera mvalera-w at sdsu.edu
Wed Jul 3 15:10:38 CDT 2019


Thanks Zhang for your answer,

I ended up getting a compiling and running TS routine... that does not give
me the answers, and i am not sure what i am doing wrong,

My TS code so far looks like this:

(...initialization...)

call TSCreate(PETSC_COMM_WORLD,ts,ierr)
call TSSetProblemType(ts,TS_NONLINEAR,ierr)
call TSSetSolution(ts,gTemperature,ierr)
call TSSetRHSFunction(ts,PETSC_NULL_VEC,FormRHSFunction,PETSC_NULL_VEC,ierr)
call TSSetType(ts,TSSSP,ierr)
call TSSetTimeStep(ts,dt,ierr)
call TSSetDM(ts,daScalars,ierr)
call TSSetMaxTime(ts,TotalTime,ierr)
call TSSetExactFinalTime(ts,TS_EXACTFINALTIME_STEPOVER,ierr)
call TSSetFromOptions(ts,ierr)
call TSSetUp(ts,ierr)

(... then inside main calculations loop i have...)

call TSSolve(ts,gTemperature,ierr)

(...and my RHSFunction looks like this...)

subroutine FormRHSFunction(ts,t,t_loc,rhs_loc,ctx,ierr)

  use petscvec
  use petscts
  use petscdmda
  use petscdm

  USE utils
  USE dmdaobjs
  USE probsize
  USE modelparams

  implicit none

  TS            :: ts
  PetscReal     :: t
  Vec           :: ctx,t_loc,rhs_loc
  PetscErrorCode    :: ierr



        call TSGetDM(ts,daScalars,ierr)

        call DMGetLocalVector(daScalars,t_loc,ierr);
        call
DMGlobalToLocalBegin(daScalars,gTemperature,INSERT_VALUES,t_loc,ierr);CHKERRQ(ierr)
        call
DMGlobalToLocalEnd(daScalars,gTemperature,INSERT_VALUES,t_loc,ierr);CHKERRQ(ierr)

        call DMDASolveTExplicit(3)

        call DMGetLocalVector(daScalars,rhs_loc,ierr);
        call
DMGlobalToLocalBegin(daScalars,TRHSS_ts,INSERT_VALUES,rhs_loc,ierr);CHKERRQ(ierr)
        call
DMGlobalToLocalEnd(daScalars,TRHSS_ts,INSERT_VALUES,rhs_loc,ierr);CHKERRQ(ierr)


        call DMRestoreLocalVector(daScalars,t_loc,ierr);CHKERRQ(ierr)
        call DMRestoreLocalVector(daScalars,rhs_loc,ierr);CHKERRQ(ierr)

end subroutine FormRHSFunction

Where DMDASolveTExplicit(3) is the old function to calculate time
integration with runge kutta, modified to only generate the f(t,u) which in
this case is rhs_loc,

I still have several doubts:


   - Will this explicit RHS calculation work with TS routines? my time
   integration is explicit so far and it would involve a fair deal of extra
   work to make it implicit.
   - This 't' parameter in the RHSFunction is controlled by PETSC? i am not
   providing anything for it directly, where is it coming from?
   - Do i need to provide a Jacobian or the TS routine will try to guess
   one? This is related to the first point where my time scheme being explicit
   does not use a jacobian.


Thanks, any help is appreciated, if you see any errors or need more
information please let me know,

Regards,

Manuel

On Wed, Jun 26, 2019 at 9:54 PM Zhang, Hong <hongzhang at anl.gov> wrote:

>
>
> On Jun 26, 2019, at 4:17 PM, Manuel Valera via petsc-users <
> petsc-users at mcs.anl.gov> wrote:
>
> Hi PETSc,
>
> I am trying to implement the Time stepping routines in my model, i have a
> working runge-kutta time scheme that goes to the following steps:
>
>
>    - Interpolate u,v,w to the time advancing variable position.
>    - Calculate nonlinear coefficients and advect velocities with a
>    forward-backward shock capturing scheme.
>    - Calculate the variable laplacian
>    - Sum terms to create RHS (nonlinear advected velocities + laplacian)
>    - Finally, the runge kutta integration is done in a typical way that
>    looks like:
>
>                    newtemp(t+1) = prevtemp(t) + dt*RHS
>
>
> So my questions are:
>
>    - I think my problem is nonlinear, but is being made linearized by the
>    advecting scheme, is this correct? this is to know if i should use the
>    linear or nonlinear routines for TS.
>
> TSComputeRHSFunctionLinear is just a convenience function for linear ODEs
> in the form udot=Au. Using it won’t buy you much. So for TS starters, it is
> fine to assume your problem is nonlinear and think of the form udot=f(t,u)
> where f is the RHS function.
>
>
>    - How do i know what are the appropriate routines i should be using
>    here? so far i think i should use the following:
>
> call TSCreate(PETSC_COMM_WORLD,ts,ierr)
> call TSSetProblemType(ts,TS_LINEAR,ierr)
> call TSSetTimeStep(ts,dt,ierr)
>
> call TSSetFromOptions(ts,ierr)
>
> call TSSetRHSFunction(ts,NULL,TSComputeRHSFunctionLinear,NULL,ierr)
> call TSSolve(ts,loctemperature,ierr)
>
> Should i use call TSSetRHSJacobian for the temperature jacobian in this
> case?
>
>
> I would suggest to write your own RHSFunction and set it to TS with
> TSSetRHSFunction().
>
>
>
> I am using
> https://www.mcs.anl.gov/petsc/petsc-current/src/ts/examples/tutorials/ex4.c.html as
> a  general guide, is there a more appropriate example?
>
>
> ex4 is a good example. In addition, ex9 uses finite volume method with
> slope limiters to solve a variety of problems such as advection equation,
> burgers equation and shallow water equation. It might be an overkill, but
> it seems to be close to the problem you are trying to solve. Note that you
> might want to use the SSP methods (-ts_type ssp) instead of the classic
> Runge-Kutta methods for problems with shocks.
>
> Hong (Mr.)
>
>
> The dt value and total timesteps are controlled by the model,
>
> Thanks for your help,
>
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20190703/95156008/attachment.html>


More information about the petsc-users mailing list