> On Jul 8, 2019, at 6:53 PM, Manuel Valera via petsc-users 
> <[email protected]> wrote:
> 
> Hi Zhang,
> 
> Thanks to your help i have implemented the TS routine for my temperature DMDA 
> array, and it works correctly including in MPI.
> 
> The breakthrough for me was realizing that TS steps and max time steps are 
> all set up once, and used/advanced all at once when invoked with TSSolution. 
> So what i did was to add all of the TSCreate / initialization into the main 
> loop so i am basically creating and destroying the TS objects every time step.

   Why? You can create the TS objects once outside and then inside advance them 
one step at a time inside the loop if you want. 

> I hope the overhead time is not to bad when i scale to bigger problems.

   I would say it is only extremely strange conditions would you need to 
recreate the TS for each timestep. Better to now figure out how to reuse them.

   


> 
> Next step would be to apply the same to advance the velocities, but problem 
> now is that they are in a 4D dmda array of 3 degrees of freedom, any 
> suggestions on how to implement this? does TS support multiple degrees of 
> freedom arrays?

   TS doesn't care how you access the vector entries in your function 
evaluations. All TS every sees is a Vec. 

   I am scared that you said 4D dmda array of 3 degrees of freedom. PETSc DMDA 
only goes up to 3 dimensions. So if you truely need 4 dim plus 3 dof per point 
you need to "fake it" but putting the last dimension into the dof slot. In 
other words use a 3d DMDA and have for dof  3*n where n is the size of the 4th 
dimension. The code to access the values will now be a little cumbersome since 
you can only access the array as 4d and the 4th dimension contains both the 3 
and the last dimension but it is not too bad.

   But if you mean 3 physical dimensions plus 3 dof then everything is fine 
just use the 3d DMDA.

   Barry



> 
> Thanks, 
> 
> On Thu, Jul 4, 2019 at 9:18 PM Zhang, Hong <[email protected]> wrote:
> 
> 
>> On Jul 3, 2019, at 3:10 PM, Manuel Valera <[email protected]> wrote:
>> 
>> 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)
> 
> The second last argument should be the user context. If you pass NULL, the 
> ctx variable in your FormRHSFunction will be NULL.  
> 
>> 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);
> 
> t_loc is the input, it should be not modified.
> 
>>         call 
>> DMGlobalToLocalBegin(daScalars,gTemperature,INSERT_VALUES,t_loc,ierr);CHKERRQ(ierr)
>>         call 
>> DMGlobalToLocalEnd(daScalars,gTemperature,INSERT_VALUES,t_loc,ierr);CHKERRQ(ierr)
> 
> FormRHSFunction is supposed to implement rhs_loc = f(t,t_loc). So you want to 
> scatter ghost points for t_loc, not gTemperature.
> 
>>         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)
> 
> There is no need to scatter ghost points for rhs_loc.
> 
>> 
>> 
>>         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. 
> For explicit time integration, one needs to provide only RHSFunction.
> 
>>      • This 't' parameter in the RHSFunction is controlled by PETSC? i am 
>> not providing anything for it directly, where is it coming from?
> 
> It is controlled by PETSc. If your problem is autonomous (the RHS does not 
> depend on t), it can be simply ignored.
>  
>>      • 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.
> For explicit time integration, Jacobian is not needed.
> 
> Hong
> 
>> 
>> 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 <[email protected]> wrote:
>> 
>> 
>>> On Jun 26, 2019, at 4:17 PM, Manuel Valera via petsc-users 
>>> <[email protected]> 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,
>>> 
>>> 
>> 
> 

Reply via email to