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
137 do iigrid=1,igridstail_active; igrid=igrids_active(iigrid);
138 ps2(igrid)%w = ps(igrid)%w
145 do iigrid=1,igridstail_active; igrid=igrids_active(iigrid);
146 ps(igrid)%w = ps(igrid)%w+2.0d0*(ps2(igrid)%w-ps1(igrid)%w)
147 if(
stagger_grid) ps(igrid)%ws = ps(igrid)%ws+2.0d0*(ps2(igrid)%ws-ps1(igrid)%ws)
155 do iigrid=1,igridstail_active; igrid=igrids_active(iigrid);
156 ps2(igrid)%w = half*(ps(igrid)%w+ps1(igrid)%w)
157 if(
stagger_grid) ps2(igrid)%ws = half*(ps(igrid)%ws+ps1(igrid)%ws)
162 do iigrid=1,igridstail_active; igrid=igrids_active(iigrid);
163 ps1(igrid)%w = ps1(igrid)%w+half*
dt*ps(igrid)%w
164 if(
stagger_grid) ps1(igrid)%ws = ps1(igrid)%ws+half*
dt*ps(igrid)%ws
168 do iigrid=1,igridstail_active; igrid=igrids_active(iigrid);
169 ps(igrid)%w = ps2(igrid)%w+half*
dt*ps(igrid)%w
170 if(
stagger_grid) ps(igrid)%ws = ps2(igrid)%ws+half*
dt*ps(igrid)%ws
176 do iigrid=1,igridstail_active; igrid=igrids_active(iigrid);
177 ps(igrid)%w = ps(igrid)%w+ps2(igrid)%w-ps1(igrid)%w
178 if(
stagger_grid) ps(igrid)%ws = ps(igrid)%ws+ps2(igrid)%ws-ps1(igrid)%ws
192 do iigrid=1,igridstail_active; igrid=igrids_active(iigrid);
193 ps2(igrid)%w = ps(igrid)%w
206 do iigrid=1,igridstail_active; igrid=igrids_active(iigrid);
212 do iigrid=1,igridstail_active; igrid=igrids_active(iigrid);
213 ps(igrid)%w = half*(ps(igrid)%w + ps1(igrid)%w + ps2(igrid)%w)
214 if(
stagger_grid) ps(igrid)%ws = half*(ps(igrid)%ws + ps1(igrid)%ws + ps2(igrid)%ws)
218 do iigrid=1,igridstail_active; igrid=igrids_active(iigrid);
219 ps1(igrid)%w = ps1(igrid)%w + (1.0d0 - 2.0d0*
imex222_lambda)*ps2(igrid)%w
227 do iigrid=1,igridstail_active; igrid=igrids_active(iigrid);
228 ps2(igrid)%w = 2.0d0*ps2(igrid)%w - ps1(igrid)%w -
imex222_lambda*ps2(igrid)%w
237 do iigrid=1,igridstail_active; igrid=igrids_active(iigrid);
238 ps(igrid)%w = ps(igrid)%w + (ps2(igrid)%w - ps1(igrid)%w) / (2.0d0 *
imex222_lambda)
246 call mpistop(
"unkown twostep time_integrator in advect")
255 do iigrid=1,igridstail_active; igrid=igrids_active(iigrid);
262 do iigrid=1,igridstail_active; igrid=igrids_active(iigrid);
273 do iigrid=1,igridstail_active; igrid=igrids_active(iigrid);
274 ps3(igrid)%w=(ps1(igrid)%w-ps(igrid)%w)/
rk3_a21
279 do iigrid=1,igridstail_active; igrid=igrids_active(iigrid);
280 ps2(igrid)%w=ps(igrid)%w+
rk3_a31*ps3(igrid)%w
286 do iigrid=1,igridstail_active; igrid=igrids_active(iigrid);
287 ps(igrid)%w=ps(igrid)%w+
rk3_b1*ps3(igrid)%w &
290 ps(igrid)%ws=ps(igrid)%ws+
rk3_b1*ps3(igrid)%ws &
301 do iigrid=1,igridstail_active; igrid=igrids_active(iigrid);
302 ps4(igrid)%w=(ps1(igrid)%w-ps(igrid)%w)/
ars_gamma
308 do iigrid=1,igridstail_active; igrid=igrids_active(iigrid);
309 ps1(igrid)%w=(ps2(igrid)%w-ps1(igrid)%w)/
ars_gamma
314 do iigrid=1,igridstail_active; igrid=igrids_active(iigrid);
315 ps3(igrid)%w=ps(igrid)%w+(
ars_gamma-1.0d0)*ps4(igrid)%w+(1.0d0-2.0d0*
ars_gamma)*ps1(igrid)%w
317 ps3(igrid)%ws=ps(igrid)%ws+(
ars_gamma-1.0d0)*ps4(igrid)%ws+(1.0d0-2.0d0*
ars_gamma)*ps1(igrid)%ws
323 do iigrid=1,igridstail_active; igrid=igrids_active(iigrid);
324 ps2(igrid)%w=ps1(igrid)%w+(ps3(igrid)%w-(ps(igrid)%w+ &
327 ps2(igrid)%ws=ps1(igrid)%ws+(ps3(igrid)%ws-(ps(igrid)%ws+ &
334 do iigrid=1,igridstail_active; igrid=igrids_active(iigrid);
335 ps(igrid)%w=ps(igrid)%w+half*ps2(igrid)%w &
336 +half*(ps4(igrid)%w-ps3(igrid)%w)/
ars_gamma
338 ps(igrid)%ws=ps(igrid)%ws+half*ps2(igrid)%ws &
339 +half*(ps4(igrid)%ws-ps3(igrid)%ws)/
ars_gamma
349 do iigrid=1,igridstail_active; igrid=igrids_active(iigrid);
350 ps4(igrid)%w=(ps1(igrid)%w-ps(igrid)%w)/
imex_a21
351 ps3(igrid)%w=ps(igrid)%w
353 ps4(igrid)%ws=(ps1(igrid)%ws-ps(igrid)%ws)/
imex_a21
354 ps3(igrid)%ws=ps(igrid)%ws
360 do iigrid=1,igridstail_active; igrid=igrids_active(iigrid);
361 ps1(igrid)%w=ps1(igrid)%w+
imex_ha21*
dt*ps3(igrid)%w
368 do iigrid=1,igridstail_active; igrid=igrids_active(iigrid);
369 ps(igrid)%w=ps(igrid)%w+
imex_a31*ps4(igrid)%w &
372 ps(igrid)%ws=ps(igrid)%ws+
imex_a31*ps4(igrid)%ws &
378 do iigrid=1,igridstail_active; igrid=igrids_active(iigrid);
379 ps3(igrid)%w=ps1(igrid)%w-
imex_a21*ps4(igrid)%w &
382 ps3(igrid)%ws=ps1(igrid)%ws-
imex_a21*ps4(igrid)%ws &
389 do iigrid=1,igridstail_active; igrid=igrids_active(iigrid);
393 ps2(igrid)%ws=(ps(igrid)%ws-ps3(igrid)%ws-
imex_a31*ps4(igrid)%ws)/
imex_a32 &
399 do iigrid=1,igridstail_active; igrid=igrids_active(iigrid);
400 ps1(igrid)%w=ps3(igrid)%w+
imex_b1*ps4(igrid)%w+
imex_b2*ps2(igrid)%w
402 ps1(igrid)%ws=ps3(igrid)%ws+
imex_b1*ps4(igrid)%ws+
imex_b2*ps2(igrid)%ws
408 do iigrid=1,igridstail_active; igrid=igrids_active(iigrid);
409 ps(igrid)%w=ps1(igrid)%w+ps2(igrid)%w-ps(igrid)%w
411 ps(igrid)%ws=ps1(igrid)%ws+ps2(igrid)%ws-ps(igrid)%ws
426 do iigrid=1,igridstail_active; igrid=igrids_active(iigrid);
427 ps3(igrid)%w = ps(igrid)%w +
imex_a32/
imex_a22 * (ps2(igrid)%w - ps1(igrid)%w)
428 ps(igrid)%w = ps(igrid)%w +
imex_b2 /
imex_a22 * (ps2(igrid)%w - ps1(igrid)%w)
429 ps1(igrid)%w = ps3(igrid)%w
437 do iigrid=1,igridstail_active; igrid=igrids_active(iigrid);
438 ps(igrid)%w = ps(igrid)%w +
imex_b2 /
imex_ha32 * (ps3(igrid)%w - ps1(igrid)%w)
443 do iigrid=1,igridstail_active; igrid=igrids_active(iigrid);
444 ps(igrid)%w = ps(igrid)%w +
imex_b3 /
imex_a33 * (ps1(igrid)%w - ps3(igrid)%w)
451 call mpistop(
"unkown threestep time_integrator in advect")
464 do iigrid=1,igridstail_active; igrid=igrids_active(iigrid);
471 do iigrid=1,igridstail_active; igrid=igrids_active(iigrid);
478 do iigrid=1,igridstail_active; igrid=igrids_active(iigrid);
488 do iigrid=1,igridstail_active; igrid=igrids_active(iigrid);
489 ps2(igrid)%w=ps(igrid)%w
490 ps3(igrid)%w=ps(igrid)%w
492 ps2(igrid)%ws=ps(igrid)%ws
493 ps3(igrid)%ws=ps(igrid)%ws
501 do iigrid=1,igridstail_active; igrid=igrids_active(iigrid);
502 ps(igrid)%w=(1.0d0/3.0d0)*(-ps(igrid)%w+ps1(igrid)%w+2.0d0*ps2(igrid)%w+ps3(igrid)%w)
504 *(-ps(igrid)%ws+ps1(igrid)%ws+2.0d0*ps2(igrid)%ws+ps3(igrid)%ws)
510 call mpistop(
"unkown fourstep time_integrator in advect")
520 do iigrid=1,igridstail_active; igrid=igrids_active(iigrid);
527 do iigrid=1,igridstail_active; igrid=igrids_active(iigrid);
534 do iigrid=1,igridstail_active; igrid=igrids_active(iigrid);
540 do iigrid=1,igridstail_active; igrid=igrids_active(iigrid);
547 do iigrid=1,igridstail_active; igrid=igrids_active(iigrid);
548 ps(igrid)%w=ps3(igrid)%w+
rk_alfa55*ps2(igrid)%w &
551 ps(igrid)%ws=ps3(igrid)%ws+
rk_alfa55*ps2(igrid)%ws &
560 call mpistop(
"unkown fivestep time_integrator in advect")
564 call mpistop(
"unkown time_stepper in advect")
567 end subroutine advect
570 subroutine global_implicit_update(dtfactor,qdt,qtC,psa,psb)
577 double precision,
intent(in) :: qdt
578 double precision,
intent(in) :: qtc
579 double precision,
intent(in) :: dtfactor
581 integer :: iigrid, igrid
585 do iigrid=1,igridstail; igrid=igrids(iigrid);
586 psa(igrid)%w = psb(igrid)%w
594 call getbc(qtc,0.d0,psa,iwstart,nwgc)
596 end subroutine global_implicit_update
599 subroutine evaluate_implicit(qtC,psa)
604 double precision,
intent(in) :: qtc
610 end subroutine evaluate_implicit
613 subroutine advect1(method,dtfactor,idim^LIM,qtC,psa,qt,psb)
619 integer,
intent(in) :: idim^lim
622 double precision,
intent(in) :: dtfactor
623 double precision,
intent(in) :: qtc
624 double precision,
intent(in) :: qt
627 double precision :: qdt
628 integer :: iigrid, igrid
639 do iigrid=1,igridstail_active; igrid=igrids_active(iigrid);
642 call advect1_grid(igrid,method(
block%level),qdt,dtfactor,ixg^
ll,idim^lim,&
643 qtc,psa(igrid),qt,psb(igrid),
rnode(rpdx1_:
rnodehi,igrid),ps(igrid)%x)
658 do iigrid=1,igridstail_active; igrid=igrids_active(iigrid);
666 call getbc(qt+qdt,qdt,psb,iwstart,nwgc)
668 end subroutine advect1
671 subroutine advect1_grid(igrid,method,qdt,dtfactor,ixI^L,idim^LIM,qtC,sCT,qt,s,dxs,x)
683 integer,
intent(in) :: igrid,method
684 integer,
intent(in) :: ixi^
l, idim^lim
685 double precision,
intent(in) :: qdt, dtfactor, qtc, qt, dxs(
ndim), x(ixi^s,1:
ndim)
686 type(state),
target :: sct, s
689 double precision :: fc(ixi^s,1:nwflux,1:
ndim)
691 double precision :: fe(ixi^s,
sdim:3)
692 double precision :: wprim(ixi^s,1:nw)
695 ixo^
l=ixi^
l^lsubnghostcells;
698 call finite_volume(method,qdt,dtfactor,ixi^
l,ixo^
l,idim^lim,qtc,sct,qt,s,fc,fe,dxs,x)
700 call centdiff(method,qdt,dtfactor,ixi^
l,ixo^
l,idim^lim,qtc,sct,qt,s,fc,fe,dxs,x)
702 call hancock(qdt,dtfactor,ixi^
l,ixo^
l,idim^lim,qtc,sct,qt,s,dxs,x)
704 call fd(qdt,dtfactor,ixi^
l,ixo^
l,idim^lim,qtc,sct,qt,s,fc,fe,dxs,x)
706 call centdiff(
fs_cd,qdt,dtfactor,ixi^
l,ixo^
l,idim^lim,qtc,sct,qt,s,fc,fe,dxs,x)
707 call tvdlimit(method,qdt,ixi^
l,ixo^
l,idim^lim,sct,qt+qdt,s,fc,dxs,x)
712 dtfactor*dble(idimmax-idimmin+1)/dble(
ndim),&
713 ixi^
l,ixo^
l,1,nw,qtc,sct%w,wprim,qt,s%w,x,.false.)
717 call mpistop(
"unknown flux scheme in advect1_grid")
731 end subroutine advect1_grid
741 integer,
intent(in) :: iit
742 double precision,
intent(in):: qt
744 integer:: iigrid, igrid
752 do iigrid=1,igridstail; igrid=igrids(iigrid);
757 qt,ps(igrid)%w,ps(igrid)%x)
760 call getbc(qt,
dt,ps,iwstart,nwgc)
774 integer,
intent(in) :: iit
775 double precision,
intent(in):: qt
777 integer:: iigrid, igrid
785 do iigrid=1,igridstail; igrid=igrids(iigrid);
791 qt,ps(igrid)%w,ps(igrid)%x)
794 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