8 logical :: fix_conserve_at_step = .true.
22 integer,
intent(in) :: iit
24 integer :: iigrid, igrid, idimsplit
33 call advect(idimsplit,idimsplit)
38 do idimsplit=
ndim,1,-1
39 call advect(idimsplit,idimsplit)
56 subroutine advect(idim^LIM)
62 integer,
intent(in) :: idim^lim
63 integer :: iigrid, igrid
70 do iigrid=1,igridstail; igrid=igrids(iigrid);
71 ps1(igrid)%w=ps(igrid)%w
91 do iigrid=1,igridstail; igrid=igrids(iigrid);
92 ps1(igrid)%w=ps(igrid)%w
99 call mpistop(
"unkown onestep time_integrator in advect")
107 fix_conserve_at_step = .false.
117 do iigrid=1,igridstail_active; igrid=igrids_active(iigrid);
118 ps(igrid)%w = ps(igrid)%w+
rk_b1*(ps1(igrid)%w-ps(igrid)%w)/
rk_a21
128 do iigrid=1,igridstail_active; igrid=igrids_active(iigrid);
129 ps(igrid)%w = half*ps(igrid)%w+half*ps1(igrid)%w
130 if(
stagger_grid) ps(igrid)%ws = half*ps(igrid)%ws+half*ps1(igrid)%ws
139 do iigrid=1,igridstail_active; igrid=igrids_active(iigrid);
140 ps(igrid)%w = ps(igrid)%w+2.0d0*(ps2(igrid)%w-ps1(igrid)%w)
141 if(
stagger_grid) ps(igrid)%ws = ps(igrid)%ws+2.0d0*(ps2(igrid)%ws-ps1(igrid)%ws)
149 do iigrid=1,igridstail_active; igrid=igrids_active(iigrid);
150 ps2(igrid)%w = half*(ps(igrid)%w+ps1(igrid)%w)
151 if(
stagger_grid) ps2(igrid)%ws = half*(ps(igrid)%ws+ps1(igrid)%ws)
156 do iigrid=1,igridstail_active; igrid=igrids_active(iigrid);
157 ps1(igrid)%w = ps1(igrid)%w+half*
dt*ps(igrid)%w
158 if(
stagger_grid) ps1(igrid)%ws = ps1(igrid)%ws+half*
dt*ps(igrid)%ws
162 do iigrid=1,igridstail_active; igrid=igrids_active(iigrid);
163 ps(igrid)%w = ps2(igrid)%w+half*
dt*ps(igrid)%w
164 if(
stagger_grid) ps(igrid)%ws = ps2(igrid)%ws+half*
dt*ps(igrid)%ws
170 do iigrid=1,igridstail_active; igrid=igrids_active(iigrid);
171 ps(igrid)%w = ps(igrid)%w+ps2(igrid)%w-ps1(igrid)%w
172 if(
stagger_grid) ps(igrid)%ws = ps(igrid)%ws+ps2(igrid)%ws-ps1(igrid)%ws
186 do iigrid=1,igridstail_active; igrid=igrids_active(iigrid);
187 ps2(igrid)%w = ps(igrid)%w
200 do iigrid=1,igridstail_active; igrid=igrids_active(iigrid);
206 do iigrid=1,igridstail_active; igrid=igrids_active(iigrid);
207 ps(igrid)%w = half*(ps(igrid)%w + ps1(igrid)%w + ps2(igrid)%w)
208 if(
stagger_grid) ps(igrid)%ws = half*(ps(igrid)%ws + ps1(igrid)%ws + ps2(igrid)%ws)
212 do iigrid=1,igridstail_active; igrid=igrids_active(iigrid);
213 ps1(igrid)%w = ps1(igrid)%w + (1.0d0 - 2.0d0*
imex222_lambda)*ps2(igrid)%w
221 do iigrid=1,igridstail_active; igrid=igrids_active(iigrid);
222 ps2(igrid)%w = 2.0d0*ps2(igrid)%w - ps1(igrid)%w -
imex222_lambda*ps2(igrid)%w
231 do iigrid=1,igridstail_active; igrid=igrids_active(iigrid);
232 ps(igrid)%w = ps(igrid)%w + (ps2(igrid)%w - ps1(igrid)%w) / (2.0d0 *
imex222_lambda)
240 call mpistop(
"unkown twostep time_integrator in advect")
249 do iigrid=1,igridstail_active; igrid=igrids_active(iigrid);
256 do iigrid=1,igridstail_active; igrid=igrids_active(iigrid);
267 do iigrid=1,igridstail_active; igrid=igrids_active(iigrid);
268 ps3(igrid)%w=(ps1(igrid)%w-ps(igrid)%w)/
rk3_a21
273 do iigrid=1,igridstail_active; igrid=igrids_active(iigrid);
274 ps2(igrid)%w=ps(igrid)%w+
rk3_a31*ps3(igrid)%w
280 do iigrid=1,igridstail_active; igrid=igrids_active(iigrid);
281 ps(igrid)%w=ps(igrid)%w+
rk3_b1*ps3(igrid)%w &
284 ps(igrid)%ws=ps(igrid)%ws+
rk3_b1*ps3(igrid)%ws &
295 do iigrid=1,igridstail_active; igrid=igrids_active(iigrid);
296 ps4(igrid)%w=(ps1(igrid)%w-ps(igrid)%w)/
ars_gamma
302 do iigrid=1,igridstail_active; igrid=igrids_active(iigrid);
303 ps1(igrid)%w=(ps2(igrid)%w-ps1(igrid)%w)/
ars_gamma
308 do iigrid=1,igridstail_active; igrid=igrids_active(iigrid);
309 ps3(igrid)%w=ps(igrid)%w+(
ars_gamma-1.0d0)*ps4(igrid)%w+(1.0d0-2.0d0*
ars_gamma)*ps1(igrid)%w
311 ps3(igrid)%ws=ps(igrid)%ws+(
ars_gamma-1.0d0)*ps4(igrid)%ws+(1.0d0-2.0d0*
ars_gamma)*ps1(igrid)%ws
317 do iigrid=1,igridstail_active; igrid=igrids_active(iigrid);
318 ps2(igrid)%w=ps1(igrid)%w+(ps3(igrid)%w-(ps(igrid)%w+ &
321 ps2(igrid)%ws=ps1(igrid)%ws+(ps3(igrid)%ws-(ps(igrid)%ws+ &
328 do iigrid=1,igridstail_active; igrid=igrids_active(iigrid);
329 ps(igrid)%w=ps(igrid)%w+half*ps2(igrid)%w &
330 +half*(ps4(igrid)%w-ps3(igrid)%w)/
ars_gamma
332 ps(igrid)%ws=ps(igrid)%ws+half*ps2(igrid)%ws &
333 +half*(ps4(igrid)%ws-ps3(igrid)%ws)/
ars_gamma
343 do iigrid=1,igridstail_active; igrid=igrids_active(iigrid);
344 ps4(igrid)%w=(ps1(igrid)%w-ps(igrid)%w)/
imex_a21
345 ps3(igrid)%w=ps(igrid)%w
347 ps4(igrid)%ws=(ps1(igrid)%ws-ps(igrid)%ws)/
imex_a21
348 ps3(igrid)%ws=ps(igrid)%ws
354 do iigrid=1,igridstail_active; igrid=igrids_active(iigrid);
355 ps1(igrid)%w=ps1(igrid)%w+
imex_ha21*
dt*ps3(igrid)%w
362 do iigrid=1,igridstail_active; igrid=igrids_active(iigrid);
363 ps(igrid)%w=ps(igrid)%w+
imex_a31*ps4(igrid)%w &
366 ps(igrid)%ws=ps(igrid)%ws+
imex_a31*ps4(igrid)%ws &
372 do iigrid=1,igridstail_active; igrid=igrids_active(iigrid);
373 ps3(igrid)%w=ps1(igrid)%w-
imex_a21*ps4(igrid)%w &
376 ps3(igrid)%ws=ps1(igrid)%ws-
imex_a21*ps4(igrid)%ws &
383 do iigrid=1,igridstail_active; igrid=igrids_active(iigrid);
387 ps2(igrid)%ws=(ps(igrid)%ws-ps3(igrid)%ws-
imex_a31*ps4(igrid)%ws)/
imex_a32 &
393 do iigrid=1,igridstail_active; igrid=igrids_active(iigrid);
394 ps1(igrid)%w=ps3(igrid)%w+
imex_b1*ps4(igrid)%w+
imex_b2*ps2(igrid)%w
396 ps1(igrid)%ws=ps3(igrid)%ws+
imex_b1*ps4(igrid)%ws+
imex_b2*ps2(igrid)%ws
402 do iigrid=1,igridstail_active; igrid=igrids_active(iigrid);
403 ps(igrid)%w=ps1(igrid)%w+ps2(igrid)%w-ps(igrid)%w
405 ps(igrid)%ws=ps1(igrid)%ws+ps2(igrid)%ws-ps(igrid)%ws
420 do iigrid=1,igridstail_active; igrid=igrids_active(iigrid);
421 ps3(igrid)%w = ps(igrid)%w +
imex_a32/
imex_a22 * (ps2(igrid)%w - ps1(igrid)%w)
422 ps(igrid)%w = ps(igrid)%w +
imex_b2 /
imex_a22 * (ps2(igrid)%w - ps1(igrid)%w)
423 ps1(igrid)%w = ps3(igrid)%w
431 do iigrid=1,igridstail_active; igrid=igrids_active(iigrid);
432 ps(igrid)%w = ps(igrid)%w +
imex_b2 /
imex_ha32 * (ps3(igrid)%w - ps1(igrid)%w)
437 do iigrid=1,igridstail_active; igrid=igrids_active(iigrid);
438 ps(igrid)%w = ps(igrid)%w +
imex_b3 /
imex_a33 * (ps1(igrid)%w - ps3(igrid)%w)
445 call mpistop(
"unkown threestep time_integrator in advect")
458 do iigrid=1,igridstail_active; igrid=igrids_active(iigrid);
465 do iigrid=1,igridstail_active; igrid=igrids_active(iigrid);
472 do iigrid=1,igridstail_active; igrid=igrids_active(iigrid);
482 do iigrid=1,igridstail_active; igrid=igrids_active(iigrid);
483 ps2(igrid)%w=ps(igrid)%w
484 ps3(igrid)%w=ps(igrid)%w
486 ps2(igrid)%ws=ps(igrid)%ws
487 ps3(igrid)%ws=ps(igrid)%ws
495 do iigrid=1,igridstail_active; igrid=igrids_active(iigrid);
496 ps(igrid)%w=(1.0d0/3.0d0)*(-ps(igrid)%w+ps1(igrid)%w+2.0d0*ps2(igrid)%w+ps3(igrid)%w)
498 *(-ps(igrid)%ws+ps1(igrid)%ws+2.0d0*ps2(igrid)%ws+ps3(igrid)%ws)
504 call mpistop(
"unkown fourstep time_integrator in advect")
514 do iigrid=1,igridstail_active; igrid=igrids_active(iigrid);
521 do iigrid=1,igridstail_active; igrid=igrids_active(iigrid);
528 do iigrid=1,igridstail_active; igrid=igrids_active(iigrid);
534 do iigrid=1,igridstail_active; igrid=igrids_active(iigrid);
541 do iigrid=1,igridstail_active; igrid=igrids_active(iigrid);
542 ps(igrid)%w=ps3(igrid)%w+
rk_alfa55*ps2(igrid)%w &
545 ps(igrid)%ws=ps3(igrid)%ws+
rk_alfa55*ps2(igrid)%ws &
554 call mpistop(
"unkown fivestep time_integrator in advect")
558 call mpistop(
"unkown time_stepper in advect")
561 end subroutine advect
564 subroutine global_implicit_update(dtfactor,qdt,qtC,psa,psb)
571 double precision,
intent(in) :: qdt
572 double precision,
intent(in) :: qtc
573 double precision,
intent(in) :: dtfactor
575 integer :: iigrid, igrid
579 do iigrid=1,igridstail; igrid=igrids(iigrid);
580 psa(igrid)%w = psb(igrid)%w
589 call getbc(qtc,0.d0,psa,iwstart,nwgc)
591 end subroutine global_implicit_update
594 subroutine evaluate_implicit(qtC,psa)
598 double precision,
intent(in) :: qtc
603 end subroutine evaluate_implicit
606 subroutine advect1(method,dtfactor,idim^LIM,qtC,psa,qt,psb)
612 integer,
intent(in) :: idim^lim
615 double precision,
intent(in) :: dtfactor
616 double precision,
intent(in) :: qtc
617 double precision,
intent(in) :: qt
620 double precision :: qdt
621 integer :: iigrid, igrid
632 do iigrid=1,igridstail_active; igrid=igrids_active(iigrid);
635 call advect1_grid(igrid,method(
block%level),qdt,dtfactor,ixg^
ll,idim^lim,&
636 qtc,psa(igrid),qt,psb(igrid),
rnode(rpdx1_:
rnodehi,igrid),ps(igrid)%x)
651 do iigrid=1,igridstail_active; igrid=igrids_active(iigrid);
659 call getbc(qt+qdt,qdt,psb,iwstart,nwgc)
661 end subroutine advect1
664 subroutine advect1_grid(igrid,method,qdt,dtfactor,ixI^L,idim^LIM,qtC,sCT,qt,s,dxs,x)
676 integer,
intent(in) :: igrid,method
677 integer,
intent(in) :: ixi^
l, idim^lim
678 double precision,
intent(in) :: qdt, dtfactor, qtc, qt, dxs(
ndim), x(ixi^s,1:
ndim)
679 type(state),
target :: sct, s
682 double precision :: fc(ixi^s,1:nwflux,1:
ndim)
684 double precision :: fe(ixi^s,
sdim:3)
685 double precision :: wprim(ixi^s,1:nw)
689 if(iwstart>1) fc=0.d0
691 ixo^
l=ixi^
l^lsubnghostcells;
694 call finite_volume(method,qdt,dtfactor,ixi^
l,ixo^
l,idim^lim,qtc,sct,qt,s,fc,fe,dxs,x)
696 call centdiff(method,qdt,dtfactor,ixi^
l,ixo^
l,idim^lim,qtc,sct,qt,s,fc,fe,dxs,x)
698 call hancock(qdt,dtfactor,ixi^
l,ixo^
l,idim^lim,qtc,sct,qt,s,dxs,x)
700 call fd(qdt,dtfactor,ixi^
l,ixo^
l,idim^lim,qtc,sct,qt,s,fc,fe,dxs,x)
702 call centdiff(
fs_cd,qdt,dtfactor,ixi^
l,ixo^
l,idim^lim,qtc,sct,qt,s,fc,fe,dxs,x)
703 call tvdlimit(method,qdt,ixi^
l,ixo^
l,idim^lim,sct,qt+qdt,s,fc,dxs,x)
710 dtfactor*dble(idimmax-idimmin+1)/dble(
ndim),&
711 ixi^
l,ixo^
l,1,nw,qtc,sct%w,wprim,qt,s%w,x,.false.)
715 call mpistop(
"unknown flux scheme in advect1_grid")
729 end subroutine advect1_grid
739 integer,
intent(in) :: iit
740 double precision,
intent(in):: qt
742 integer:: iigrid, igrid
750 do iigrid=1,igridstail; igrid=igrids(iigrid);
755 qt,ps(igrid)%w,ps(igrid)%x)
758 call getbc(qt,
dt,ps,iwstart,nwgc)
772 integer,
intent(in) :: iit
773 double precision,
intent(in):: qt
775 integer:: iigrid, igrid
783 do iigrid=1,igridstail; igrid=igrids(iigrid);
789 qt,ps(igrid)%w,ps(igrid)%x)
792 call getbc(qt,
dt,ps,iwstart,nwgc)
Module containing all the time stepping schemes.
subroutine, public process_advanced(iit, qt)
process_advanced is user entry in time loop, just after advance allows to modify solution,...
subroutine, public advance(iit)
Advance all the grids over one time step, including all sources.
subroutine, public process(iit, qt)
process is a user entry in time loop, before output and advance allows to modify solution,...
subroutine, public mpistop(message)
Exit MPI-AMRVAC with an error message.
Module with finite difference methods for fluxes.
subroutine, public fd(qdt, dtfactor, ixil, ixol, idimslim, qtc, sct, qt, snew, fc, fe, dxs, x)
subroutine, public centdiff(method, qdt, dtfactor, ixil, ixol, idimslim, qtc, sct, qt, s, fc, fe, dxs, x)
Module with finite volume methods for fluxes.
subroutine, public finite_volume(method, qdt, dtfactor, ixil, ixol, idimslim, qtc, sct, qt, snew, fc, fe, dxs, x)
finite volume method
subroutine, public hancock(qdt, dtfactor, ixil, ixol, idimslim, qtc, sct, qt, snew, dxs, x)
The non-conservative Hancock predictor for TVDLF.
Module for flux conservation near refinement boundaries.
subroutine, public init_comm_fix_conserve(idimlim, nwfluxin)
subroutine, public fix_edges(psuse, idimlim)
subroutine, public recvflux(idimlim)
subroutine, public sendflux(idimlim)
subroutine, public store_flux(igrid, fc, idimlim, nwfluxin)
subroutine, public store_edge(igrid, ixil, fe, idimlim)
subroutine, public fix_conserve(psb, idimlim, nw0, nwfluxin)
update ghost cells of all blocks including physical boundaries
subroutine getbc(time, qdt, psb, nwstart, nwbc)
do update ghost cells of all blocks including physical boundaries
This module contains definitions of global parameters and variables and some generic functions/subrou...
type(state), pointer block
Block pointer for using one block and its previous state.
integer, parameter ssprk4
integer, dimension(:), allocatable typepred1
The spatial discretization for the predictor step when using a two step PC method.
integer, parameter fs_tvdlf
double precision rk_alfa41
double precision imex_a32
integer, parameter fs_hlld
integer, parameter imex_euler
integer, parameter fs_tvd
double precision rk_beta55
double precision global_time
The global simulation time.
double precision rk_alfa22
integer istep
Index of the sub-step in a multi-step time integrator.
integer, parameter threestep
integer, parameter imex_232
double precision rk_alfa55
double precision rk_beta22
integer, parameter fivestep
double precision imex_ha32
double precision ars_gamma
IMEX_ARS3 parameter ars_gamma.
integer, parameter fs_hllcd
integer, parameter ndim
Number of spatial dimensions for grid variables.
integer, parameter nlevelshi
The maximum number of levels in the grid refinement.
integer, parameter ssprk5
logical stagger_grid
True for using stagger grid.
integer, parameter imex_ars3
logical use_particles
Use particles module or not.
integer, parameter fs_tvdmu
double precision rk_alfa54
integer, parameter imex_trapezoidal
integer, parameter plevel_
double precision, dimension(:), allocatable, parameter d
double precision rk_alfa21
double precision dt
global time step
double precision imex222_lambda
IMEX-222(lambda) one-parameter family of schemes.
integer, dimension(:), allocatable flux_method
Which flux scheme of spatial discretization to use (per grid level)
integer, parameter fs_nul
double precision rk_beta54
integer, parameter rk2_alf
integer, parameter fs_hll
flux schemes
double precision rk_beta11
logical time_advance
do time evolving
double precision, dimension(:,:), allocatable rnode
Corner coordinates.
double precision rk_alfa31
integer, parameter imex_sp
double precision rk_alfa44
double precision imex_ha22
double precision imex_a31
integer, parameter twostep
integer, parameter onestep
double precision rk_a21
RK2(alfa) method parameters from Butcher tableau.
integer, parameter predictor_corrector
integer, parameter sdim
starting dimension for electric field
integer, parameter forward_euler
logical fix_conserve_global
Whether to apply flux conservation at refinement boundaries.
character(len=std_len) typedimsplit
double precision rk_alfa53
double precision imex_ha21
integer, parameter ssprk3
double precision, dimension(^nd) dxlevel
store unstretched cell size of current level
integer t_stepper
time stepper type
integer, parameter fs_cd4
integer, parameter rk3_bt
integer, parameter fourstep
double precision imex_a21
integer, parameter rnodehi
grid location info (corner coordinates and grid spacing)
integer, parameter fs_hllc
integer max_blocks
The maximum number of grid blocks in a processor.
double precision imex_a22
IMEX_CB3a extra parameters.
integer, parameter imex_cb3a
integer, parameter imex_222
double precision imex_a33
integer t_integrator
time integrator method
integer, parameter fs_hancock
integer, dimension(:,:), allocatable node
integer, parameter ssprk2
double precision rk_alfa33
integer, parameter fs_source
integer, parameter imex_midpoint
double precision rk_beta33
double precision rk_beta44
Module containing all the particle routines.
This module defines the procedures of a physics module. It contains function pointers for the various...
procedure(sub_convert), pointer phys_to_primitive
procedure(sub_evaluate_implicit), pointer phys_evaluate_implicit
procedure(sub_implicit_update), pointer phys_implicit_update
procedure(sub_face_to_center), pointer phys_face_to_center
procedure(sub_special_advance), pointer phys_special_advance
Module for handling split source terms (split from the fluxes)
subroutine, public addsource2(qdt, dtfactor, ixil, ixol, iwlim, qtc, wct, wctprim, qt, w, x, qsourcesplit, src_active)
Add source within ixO for iws: w=w+qdt*S[wCT].
subroutine, public add_split_source(prior)
Subroutines for TVD-MUSCL schemes.
subroutine, public tvdlimit(method, qdt, ixil, ixol, idimlim, s, qt, snew, fc, dxs, x)
Module with all the methods that users can customize in AMRVAC.
procedure(process_grid), pointer usr_process_grid
procedure(process_adv_grid), pointer usr_process_adv_grid
procedure(process_global), pointer usr_process_global
procedure(process_adv_global), pointer usr_process_adv_global