28 integer,
protected,
public ::
u_ = 1
29 integer,
protected,
public ::
v_ = 2
30 integer,
protected,
public ::
w_ = 3
36 double precision,
public,
protected ::
dtreacpar = 0.5d0
40 integer :: number_of_species = 2
41 integer :: equation_type = 1
42 integer,
parameter :: eq_gray_scott = 1
43 integer,
parameter :: eq_schnakenberg = 2
44 integer,
parameter :: eq_brusselator = 3
45 integer,
parameter :: eq_logistic = 4
46 integer,
parameter :: eq_analyt_hunds = 5
47 integer,
parameter :: eq_belousov_fn = 6
48 integer,
parameter :: eq_ext_brusselator = 7
49 integer,
parameter :: eq_lorenz = 8
50 integer,
parameter :: eq_no_reac = 9
53 double precision,
public,
protected ::
d1 = 0.05d0
55 double precision,
public,
protected ::
d2 = 1.0d0
57 double precision,
public,
protected ::
d3 = 1.0d0
63 double precision,
public,
protected ::
a1(^nd) = 0.0d0
65 double precision,
public,
protected ::
a2(^nd) = 0.0d0
67 double precision,
public,
protected ::
a3(^nd) = 0.0d0
70 double precision,
public,
protected ::
sb_alpha = 0.1305d0
71 double precision,
public,
protected ::
sb_beta = 0.7695d0
72 double precision,
public,
protected ::
sb_kappa = 100.0d0
75 double precision,
public,
protected ::
gs_f = 0.046d0
77 double precision,
public,
protected ::
gs_k = 0.063d0
80 double precision,
public,
protected ::
br_a = 4.5d0
81 double precision,
public,
protected ::
br_b = 8.0d0
82 double precision,
public,
protected ::
br_c = 1.0d0
83 double precision,
public,
protected ::
br_d = 1.0d0
86 double precision,
public,
protected ::
lg_lambda = 1.0d0
90 double precision,
public,
protected ::
bzfn_delta = 1.0d0
92 double precision,
public,
protected ::
bzfn_mu = 1.0d0
95 double precision,
public,
protected ::
lor_r = 28.0d0
97 double precision,
public,
protected ::
lor_sigma = 10.0d0
99 double precision,
public,
protected ::
lor_b = 8.0d0 / 3.0d0
102 logical :: ard_source_split = .false.
114 subroutine ard_params_read(files)
116 character(len=*),
intent(in) :: files(:)
119 namelist /ard_list/
d1,
d2,
d3,
adv_pow,
a1,
a2,
a3,
sb_alpha,
sb_beta,
sb_kappa, &
124 do n = 1,
size(files)
125 open(
unitpar, file=trim(files(n)), status=
'old')
126 read(
unitpar, ard_list,
end=111)
133 equation_type = eq_gray_scott
134 number_of_species = 2
135 case (
"schnakenberg")
136 equation_type = eq_schnakenberg
137 number_of_species = 2
139 equation_type = eq_brusselator
140 number_of_species = 2
142 equation_type = eq_logistic
143 number_of_species = 1
144 case (
"analyt_hunds")
145 equation_type = eq_analyt_hunds
146 number_of_species = 1
147 case (
"belousov_fieldnoyes")
148 equation_type = eq_belousov_fn
149 number_of_species = 3
150 case (
"ext_brusselator")
151 equation_type = eq_ext_brusselator
152 number_of_species = 3
154 equation_type = eq_lorenz
155 number_of_species = 3
157 equation_type = eq_no_reac
158 number_of_species = 1
160 call mpistop(
"Unknown equation_name (valid: gray-scott, schnakenberg, ...)")
163 end subroutine ard_params_read
166 subroutine ard_write_info(fh)
168 integer,
intent(in) :: fh
169 integer,
parameter :: n_par = 0
170 integer,
dimension(MPI_STATUS_SIZE) :: st
174 call mpi_file_write(fh, n_par, 1, mpi_integer, st, er)
175 end subroutine ard_write_info
188 allocate(start_indices(number_species),stop_indices(number_species))
192 u_ = var_set_fluxvar(
"u",
"u")
193 if (number_of_species >= 2)
then
194 v_ = var_set_fluxvar(
"v",
"v")
196 if (number_of_species >= 3)
then
197 w_ = var_set_fluxvar(
"w",
"w")
203 stop_indices(1)=nwflux
210 call mpistop(
"phys_check error: flux_type has wrong shape")
230 subroutine ard_check_params
235 use mod_particles,
only: npayload,nusrpayload,ngridvars,num_particles,physics_type_particles
236 integer :: n, i, iw, species_list(number_of_species)
245 select case(number_of_species)
248 if (
d1 == 0.0d0)
then
249 write(*, *)
"Diffusion coefficient cannot be zero in IMEX scheme"
250 call mpistop(
"Zero diffusion in IMEX scheme")
253 species_list = [
u_,
v_]
254 if ((
d1 == 0.0d0) .or. (
d2 == 0.0d0))
then
255 write(*, *)
"Diffusion coefficient cannot be zero in IMEX scheme"
256 call mpistop(
"Zero diffusion in IMEX scheme")
259 species_list = [
u_,
v_,
w_]
260 if ((
d1 == 0.0d0) .or. (
d2 == 0.0d0) .or. (
d3 == 0.0d0))
then
261 write(*, *)
"Diffusion coefficient cannot be zero in IMEX scheme"
262 call mpistop(
"Zero diffusion in IMEX scheme")
266 do i = 1, number_of_species
278 ard_mg_bc(i, n)%bc_type = mg_bc_dirichlet
289 else if (.not.
associated(
ard_mg_bc(i, n)%boundary_cond))
then
290 call mpistop(
"special BC for MG not defined")
299 write(*,*)
"ard_check_params warning: unknown boundary type"
300 ard_mg_bc(i, n)%bc_type = mg_bc_dirichlet
309 write(*,*)
'====ARD run with settings===================='
310 write(*,*)
'Using mod_ard_phys with settings:'
311 write(*,*)
'Dimensionality :',
ndim
312 write(*,*)
'vector components:',
ndir
314 write(*,*)
'number of variables nw=',nw
315 write(*,*)
' start index iwstart=',iwstart
316 write(*,*)
'number of vector variables=',nvector
317 write(*,*)
'number of stagger variables nws=',nws
318 write(*,*)
'number of variables with BCs=',nwgc
319 write(*,*)
'number of vars with fluxes=',nwflux
320 write(*,*)
'number of vars with flux + BC=',nwfluxbc
321 write(*,*)
'number of auxiliary variables=',nwaux
322 write(*,*)
'number of extra vars without flux=',nwextra
323 write(*,*)
'number of extra vars for wextra=',nw_extra
324 write(*,*)
'number of auxiliary I/O variables=',
nwauxio
327 write(*,*)
'*****Using particles: npayload,ngridvars :', npayload,ngridvars
328 write(*,*)
'*****Using particles: nusrpayload :', nusrpayload
329 write(*,*)
'*****Using particles: num_particles :', num_particles
330 write(*,*)
'*****Using particles: physics_type_particles=',physics_type_particles
333 write(*,*)
'==========================================='
337 end subroutine ard_check_params
339 subroutine ard_to_conserved(ixI^L, ixO^L, w, x)
341 integer,
intent(in) :: ixi^
l, ixo^
l
342 double precision,
intent(inout) :: w(ixi^s, nw)
343 double precision,
intent(in) :: x(ixi^s, 1:^nd)
346 end subroutine ard_to_conserved
348 subroutine ard_to_primitive(ixI^L, ixO^L, w, x)
350 integer,
intent(in) :: ixi^
l, ixo^
l
351 double precision,
intent(inout) :: w(ixi^s, nw)
352 double precision,
intent(in) :: x(ixi^s, 1:^nd)
355 end subroutine ard_to_primitive
357 subroutine ard_get_cmax(w, x, ixI^L, ixO^L, idim, cmax)
359 integer,
intent(in) :: ixi^
l, ixo^
l, idim
360 double precision,
intent(in) :: w(ixi^s, nw), x(ixi^s, 1:^nd)
361 double precision,
intent(inout) :: cmax(ixi^s)
363 cmax(ixo^s) = abs(
a1(idim) * w(ixo^s,
u_)**(
adv_pow-1))
364 if (number_of_species >= 2)
then
365 cmax(ixo^s) = max(cmax(ixo^s), abs(
a2(idim) * w(ixo^s,
v_)**(
adv_pow-1)))
367 if (number_of_species >= 3)
then
368 cmax(ixo^s) = max(cmax(ixo^s), abs(
a3(idim) * w(ixo^s,
w_)**(
adv_pow-1)))
371 end subroutine ard_get_cmax
373 subroutine ard_get_cbounds(wLC, wRC, wLp, wRp, x, ixI^L, ixO^L, idim,Hspeed, cmax, cmin)
376 integer,
intent(in) :: ixi^
l, ixo^
l, idim
377 double precision,
intent(in) :: wlc(ixi^s,
nw), wrc(ixi^s,
nw)
378 double precision,
intent(in) :: wlp(ixi^s,
nw), wrp(ixi^s,
nw)
379 double precision,
intent(in) :: x(ixi^s, 1:^nd)
382 double precision,
intent(inout),
optional :: cmin(ixi^s,1:
number_species)
384 double precision :: wmean(ixi^s,
nw)
390 if (
present(cmin))
then
391 cmin(ixo^s,1) = min(
a1(idim) * wmean(ixo^s,
u_)**(
adv_pow-1), zero)
392 cmax(ixo^s,1) = max(
a1(idim) * wmean(ixo^s,
u_)**(
adv_pow-1), zero)
393 if (number_of_species >= 2)
then
394 cmin(ixo^s,1) = min(cmin(ixo^s,1),
a2(idim) * wmean(ixo^s,
v_)**(
adv_pow-1))
395 cmax(ixo^s,1) = max(cmax(ixo^s,1),
a2(idim) * wmean(ixo^s,
v_)**(
adv_pow-1))
397 if (number_of_species >= 3)
then
398 cmin(ixo^s,1) = min(cmin(ixo^s,1),
a3(idim) * wmean(ixo^s,
w_)**(
adv_pow-1))
399 cmax(ixo^s,1) = max(cmax(ixo^s,1),
a3(idim) * wmean(ixo^s,
w_)**(
adv_pow-1))
402 cmax(ixo^s,1) = maxval(abs(
a1(idim) * wmean(ixo^s,
u_)**(
adv_pow-1)))
403 if (number_of_species >=2)
then
404 cmax(ixo^s,1) = max(cmax(ixo^s,1), maxval(abs(
a2(idim) * wmean(ixo^s,
v_)**(
adv_pow-1))))
406 if (number_of_species >=3)
then
407 cmax(ixo^s,1) = max(cmax(ixo^s,1), maxval(abs(
a3(idim) * wmean(ixo^s,
w_)**(
adv_pow-1))))
411 end subroutine ard_get_cbounds
413 subroutine ard_get_dt(w, ixI^L, ixO^L, dtnew, dx^D, x)
415 integer,
intent(in) :: ixi^
l, ixo^
l
416 double precision,
intent(in) ::
dx^
d, x(ixi^s, 1:^nd)
417 double precision,
intent(in) :: w(ixi^s, 1:nw)
418 double precision,
intent(inout) :: dtnew
419 double precision :: maxrate
420 double precision :: maxd
421 double precision :: maxa
428 if (number_of_species >= 2)
then
431 if (number_of_species >= 3)
then
437 select case (equation_type)
439 maxrate = max(maxval(w(ixo^s,
v_))**2 +
gs_f, &
441 case (eq_schnakenberg)
442 maxrate =
sb_kappa * max(maxval(abs(w(ixo^s,
v_) * w(ixo^s,
u_) - 1)), &
443 maxval(w(ixo^s,
u_))**2)
444 case (eq_brusselator)
445 maxrate = max( maxval(w(ixo^s,
u_)*w(ixo^s,
v_) - (
br_b+1)), &
446 maxval(w(ixo^s,
u_)**2) )
447 case (eq_ext_brusselator)
448 maxrate = max( maxval(w(ixo^s,
u_)*w(ixo^s,
v_) - (
br_b+1)) +
br_c, &
449 maxval(w(ixo^s,
u_)**2) )
450 maxrate = max(maxrate,
br_d)
453 case (eq_analyt_hunds)
454 maxrate = maxval(w(ixo^s,
u_)*abs(1 - w(ixo^s,
u_))) /
d1
455 case (eq_belousov_fn)
468 call mpistop(
"Unknown equation type")
473 end subroutine ard_get_dt
476 subroutine ard_get_flux(wC, w, x, ixI^L, ixO^L, idim, f)
478 integer,
intent(in) :: ixi^
l, ixo^
l, idim
479 double precision,
intent(in) :: wc(ixi^s, 1:nw)
480 double precision,
intent(in) :: w(ixi^s, 1:nw)
481 double precision,
intent(in) :: x(ixi^s, 1:^nd)
482 double precision,
intent(out) :: f(ixi^s, nwflux)
485 if (number_of_species >=2)
then
488 if (number_of_species >=3)
then
492 end subroutine ard_get_flux
494 subroutine ard_add_source_geom(qdt, dtfactor, ixI^L, ixO^L, wCT, wprim,w, x)
501 integer,
intent(in) :: ixi^
l, ixo^
l
502 double precision,
intent(in) :: qdt, dtfactor, x(ixi^s, 1:^nd)
503 double precision,
intent(inout) :: wct(ixi^s, 1:nw), wprim(ixi^s,1:nw),w(ixi^s, 1:nw)
505 end subroutine ard_add_source_geom
508 subroutine ard_add_source(qdt,dtfactor,ixI^L,ixO^L,wCT,wCTprim,w,x,qsourcesplit,active)
510 integer,
intent(in) :: ixi^
l, ixo^
l
511 double precision,
intent(in) :: qdt, dtfactor
512 double precision,
intent(in) :: wct(ixi^s, 1:nw),wctprim(ixi^s,1:nw), x(ixi^s, 1:
ndim)
513 double precision,
intent(inout) :: w(ixi^s, 1:nw)
514 double precision :: lpl_u(ixo^s), lpl_v(ixo^s), lpl_w(ixo^s)
515 logical,
intent(in) :: qsourcesplit
516 logical,
intent(inout) :: active
519 if (qsourcesplit .eqv. ard_source_split)
then
521 call ard_laplacian(ixi^
l, ixo^
l, wct(ixi^s,
u_), lpl_u)
522 if (number_of_species >= 2)
then
523 call ard_laplacian(ixi^
l, ixo^
l, wct(ixi^s,
v_), lpl_v)
525 if (number_of_species >= 3)
then
526 call ard_laplacian(ixi^
l, ixo^
l, wct(ixi^s,
w_), lpl_w)
535 select case (equation_type)
537 w(ixo^s,
u_) = w(ixo^s,
u_) + qdt * (
d1 * lpl_u - &
538 wct(ixo^s,
u_) * wct(ixo^s,
v_)**2 + &
539 gs_f * (1 - wct(ixo^s,
u_)))
540 w(ixo^s,
v_) = w(ixo^s,
v_) + qdt * (
d2 * lpl_v + &
541 wct(ixo^s,
u_) * wct(ixo^s,
v_)**2 - &
543 case (eq_schnakenberg)
544 w(ixo^s,
u_) = w(ixo^s,
u_) + qdt * (
d1 * lpl_u &
546 wct(ixo^s,
u_)**2 * wct(ixo^s,
v_)))
547 w(ixo^s,
v_) = w(ixo^s,
v_) + qdt * (
d2 * lpl_v &
549 case (eq_brusselator)
550 w(ixo^s,
u_) = w(ixo^s,
u_) + qdt * (
d1 * lpl_u &
552 + wct(ixo^s,
u_)**2 * wct(ixo^s,
v_))
553 w(ixo^s,
v_) = w(ixo^s,
v_) + qdt * (
d2 * lpl_v &
554 +
br_b * wct(ixo^s,
u_) - wct(ixo^s,
u_)**2 * wct(ixo^s,
v_))
555 case (eq_ext_brusselator)
556 w(ixo^s,
u_) = w(ixo^s,
u_) + qdt * (
d1 * lpl_u &
558 + wct(ixo^s,
u_)**2 * wct(ixo^s,
v_) &
560 w(ixo^s,
v_) = w(ixo^s,
v_) + qdt * (
d2 * lpl_v &
562 - wct(ixo^s,
u_)**2 * wct(ixo^s,
v_))
563 w(ixo^s,
w_) = w(ixo^s,
w_) + qdt * (
d3 * lpl_w &
566 w(ixo^s,
u_) = w(ixo^s,
u_) + qdt * (
d1 * lpl_u &
568 case (eq_analyt_hunds)
569 w(ixo^s,
u_) = w(ixo^s,
u_) + qdt * (
d1 * lpl_u &
570 + 1.0d0/
d1 * wct(ixo^s,
u_)**2 * (1 - wct(ixo^s,
u_)))
571 case (eq_belousov_fn)
572 w(ixo^s,
u_) = w(ixo^s,
u_) + qdt * (
d1 * lpl_u &
574 - wct(ixo^s,
u_)*wct(ixo^s,
w_) + wct(ixo^s,
u_) &
575 - wct(ixo^s,
u_)**2))
576 w(ixo^s,
v_) = w(ixo^s,
v_) + qdt * (
d2 * lpl_v &
577 + wct(ixo^s,
u_) - wct(ixo^s,
v_))
578 w(ixo^s,
w_) = w(ixo^s,
w_) + qdt * (
d3 * lpl_w &
583 w(ixo^s,
u_) = w(ixo^s,
u_) + qdt * (
d1 * lpl_u &
586 w(ixo^s,
v_) = w(ixo^s,
v_) + qdt * (
d2 * lpl_v &
587 +
lor_r * wct(ixo^s,
u_) - wct(ixo^s,
v_) &
588 - wct(ixo^s,
u_)*wct(ixo^s,
w_))
590 w(ixo^s,
w_) = w(ixo^s,
w_) + qdt * (
d3 * lpl_w &
591 + wct(ixo^s,
u_)*wct(ixo^s,
v_) -
lor_b * wct(ixo^s,
w_))
593 w(ixo^s,
u_) = w(ixo^s,
u_) + qdt *
d1 * lpl_u
595 call mpistop(
"Unknown equation type")
602 end subroutine ard_add_source
606 subroutine ard_laplacian(ixI^L,ixO^L,var,lpl)
608 integer,
intent(in) :: ixi^
l, ixo^
l
609 double precision,
intent(in) :: var(ixi^s)
610 double precision,
intent(out) :: lpl(ixo^s)
611 integer :: idir, jxo^
l, hxo^
l
612 double precision :: h_inv2
617 hxo^
l=ixo^
l-
kr(idir,^
d);
618 jxo^
l=ixo^
l+
kr(idir,^
d);
620 lpl(ixo^s) = lpl(ixo^s) + h_inv2 * &
621 (var(jxo^s) - 2 * var(ixo^s) + var(hxo^s))
624 call mpistop(
"ard_laplacian not implemented in this geometry")
627 end subroutine ard_laplacian
629 subroutine put_laplacians_onegrid(ixI^L,ixO^L,w)
631 integer,
intent(in) :: ixi^
l, ixo^
l
632 double precision,
intent(inout) :: w(ixi^s, 1:nw)
634 double precision :: lpl_u(ixo^s), lpl_v(ixo^s), lpl_w(ixo^s)
636 call ard_laplacian(ixi^
l, ixo^
l, w(ixi^s,
u_), lpl_u)
637 if (number_of_species >= 2)
then
638 call ard_laplacian(ixi^
l, ixo^
l, w(ixi^s,
v_), lpl_v)
640 if (number_of_species >= 3)
then
641 call ard_laplacian(ixi^
l, ixo^
l, w(ixi^s,
w_), lpl_w)
644 w(ixo^s,
u_) =
d1*lpl_u
645 if (number_of_species >= 2)
then
646 w(ixo^s,
v_) =
d2*lpl_v
648 if (number_of_species >= 3)
then
649 w(ixo^s,
w_) =
d3*lpl_w
652 end subroutine put_laplacians_onegrid
655 subroutine ard_evaluate_implicit(qtC,psa)
658 double precision,
intent(in) :: qtc
660 integer :: iigrid, igrid, level
666 do iigrid=1,igridstail; igrid=igrids(iigrid);
668 call put_laplacians_onegrid(ixg^
ll,ixo^
l,psa(igrid)%w)
672 end subroutine ard_evaluate_implicit
675 subroutine ard_implicit_update(dtfactor,qdt,qtC,psa,psb)
681 double precision,
intent(in) :: qdt
682 double precision,
intent(in) :: qtc
683 double precision,
intent(in) :: dtfactor
686 double precision :: res, max_residual, lambda
688 integer :: iw_to,iw_from
689 integer :: iigrid, igrid, id
696 if (qdt <
dtmin)
then
698 print *,
'skipping implicit solve: dt too small!'
705 mg%operator_type = mg_helmholtz
706 call mg_set_methods(mg)
708 if (.not. mg%is_allocated)
call mpistop(
"multigrid tree not allocated yet")
711 lambda = 1/(dtfactor * qdt *
d1)
712 call helmholtz_set_lambda(lambda)
715 call mg_copy_to_tree(
u_, mg_irhs, factor=-lambda, state_from=psb)
716 call mg_copy_to_tree(
u_, mg_iphi, state_from=psb)
718 call mg_fas_fmg(mg, .true., max_res=res)
720 call mg_fas_vcycle(mg, max_res=res)
721 if (res < max_residual)
exit
724 if (res > max_residual)
call mpistop(
"u_multigrid: no convergence")
726 call mg_copy_from_tree_gc(mg_iphi,
u_, state_to=psa)
730 if (number_of_species >= 2)
then
731 lambda = 1/(dtfactor * qdt *
d2)
732 call helmholtz_set_lambda(lambda)
735 call mg_copy_to_tree(
v_, mg_irhs, factor=-lambda, state_from=psb)
736 call mg_copy_to_tree(
v_, mg_iphi, state_from=psb)
738 call mg_fas_fmg(mg, .true., max_res=res)
740 call mg_fas_vcycle(mg, max_res=res)
741 if (res < max_residual)
exit
744 if (res > max_residual)
call mpistop(
"v_multigrid: no convergence")
745 call mg_copy_from_tree_gc(mg_iphi,
v_, state_to=psa)
750 if (number_of_species >= 3)
then
751 lambda = 1/(dtfactor * qdt *
d3)
752 call helmholtz_set_lambda(lambda)
755 call mg_copy_to_tree(
w_, mg_irhs, factor=-lambda, state_from=psb)
756 call mg_copy_to_tree(
w_, mg_iphi, state_from=psb)
758 call mg_fas_fmg(mg, .true., max_res=res)
760 call mg_fas_vcycle(mg, max_res=res)
761 if (res < max_residual)
exit
764 if (res > max_residual)
call mpistop(
"w_multigrid: no convergence")
765 call mg_copy_from_tree_gc(mg_iphi,
w_, state_to=psa)
769 end subroutine ard_implicit_update
Module containing the physics routines for advection-reaction-diffusion equations.
double precision, public, protected br_a
Parameters for Brusselator model.
double precision, dimension(^nd), public, protected a3
Advection coefficients for third species (w) (if applicable).
double precision, public, protected lg_lambda
Parameter for logistic model (Fisher / KPP equation).
double precision, public, protected gs_k
Kill rate for Gray-Scott model.
integer, public, protected v_
For 2 or more equations.
double precision, public, protected sb_alpha
Parameters for Schnakenberg model.
double precision, public, protected gs_f
Feed rate for Gray-Scott model.
double precision, public, protected sb_beta
double precision, public, protected br_b
double precision, public, protected br_c
subroutine, public ard_phys_init()
double precision, public, protected sb_kappa
character(len=20), public, protected equation_name
Name of the system to be solved.
integer, public, protected u_
Indices of the unknowns.
double precision, public, protected lor_b
Parameter for Lorenz system (aspect ratio of the convection rolls).
double precision, public, protected dtreacpar
Parameter with which to multiply the reaction timestep restriction.
double precision, public, protected bzfn_mu
double precision, public, protected lor_sigma
Parameter for Lorenz system (Prandtl number).
integer, public, protected adv_pow
Power of the unknown in the advection term (1 for linear).
double precision, public, protected d1
Diffusion coefficient for first species (u).
double precision, public, protected d2
Diffusion coefficient for second species (v) (if applicable).
type(mg_bc_t), dimension(3, mg_num_neighbors), public ard_mg_bc
Boundary condition information for the multigrid method.
double precision, public, protected bzfn_epsilon
Parameters for the Field-Noyes model of the Belousov-Zhabotinsky reaction.
logical, public, protected ard_particles
Whether particles module is added.
double precision, public, protected lor_r
Parameter for Lorenz system (Rayleigh number).
double precision, dimension(^nd), public, protected a2
Advection coefficients for second species (v) (if applicable).
double precision, public, protected d3
Diffusion coefficient for third species (w) (if applicable).
double precision, public, protected bzfn_lambda
integer, public, protected w_
For 3 or more equations.
double precision, public, protected ard_mg_tol
multigrid: max_residual = ard_mg_tol/qdt
double precision, dimension(^nd), public, protected a1
Advection coefficients for first species (u).
double precision, public, protected bzfn_delta
double precision, public, protected br_d
subroutine, public mpistop(message)
Exit MPI-AMRVAC with an error message.
Module with basic grid data structures.
Module with geometry-related routines (e.g., divergence, curl).
This module contains definitions of global parameters and variables and some generic functions/subrou...
double precision dtdiffpar
For resistive MHD, the time step is also limited by the diffusion time: .
integer, parameter unitpar
file handle for IO
integer, parameter bc_asymm
double precision global_time
The global simulation time.
logical use_imex_scheme
whether IMEX in use or not
integer, dimension(3, 3) kr
Kronecker delta tensor.
integer, dimension(:, :), allocatable typeboundary
Array indicating the type of boundary condition per variable and per physical boundary.
integer, parameter ndim
Number of spatial dimensions for grid variables.
logical use_particles
Use particles module or not.
character(len=std_len), dimension(:), allocatable par_files
Which par files are used as input.
integer mype
The rank of the current MPI task.
integer ndir
Number of spatial dimensions (components) for vector variables.
integer ixm
the mesh range of a physical block without ghost cells
double precision, dimension(:), allocatable, parameter d
logical slab
Cartesian geometry or not.
integer, parameter bc_periodic
integer, parameter bc_special
boundary condition types
integer nwauxio
Number of auxiliary variables that are only included in output.
double precision, dimension(:,:), allocatable rnode
Corner coordinates.
integer, parameter bc_cont
double precision, dimension(:,:), allocatable dx
spatial steps for all dimensions at all levels
integer nghostcells
Number of ghost cells surrounding a grid.
integer, parameter bc_symm
logical fix_conserve_global
Whether to apply flux conservation at refinement boundaries.
double precision, dimension(^nd) dxlevel
store unstretched cell size of current level
logical use_multigrid
Use multigrid (only available in 2D and 3D).
double precision dtmin
Stop the simulation when the time step becomes smaller than this value.
integer max_blocks
The maximum number of grid blocks in a processor.
Module to couple the octree-mg library to AMRVAC. This file uses the VACPP preprocessor,...
Module containing all the particle routines.
subroutine particles_init()
Initialize particle data and parameters.
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_write_info), pointer phys_write_info
procedure(sub_get_flux), pointer phys_get_flux
procedure(sub_evaluate_implicit), pointer phys_evaluate_implicit
procedure(sub_get_cbounds), pointer phys_get_cbounds
procedure(sub_get_dt), pointer phys_get_dt
procedure(sub_add_source_geom), pointer phys_add_source_geom
procedure(sub_check_params), pointer phys_check_params
integer, parameter flux_default
Indicates a normal flux.
integer, dimension(:, :), allocatable flux_type
Array per direction per variable, which can be used to specify that certain fluxes have to be treated...
procedure(sub_convert), pointer phys_to_conserved
character(len=name_len) physics_type
String describing the physics type of the simulation.
procedure(sub_implicit_update), pointer phys_implicit_update
procedure(sub_add_source), pointer phys_add_source
procedure(sub_get_cmax), pointer phys_get_cmax
logical phys_energy
Solve energy equation or not.
Module with all the methods that users can customize in AMRVAC.
procedure(special_mg_bc), pointer usr_special_mg_bc
integer nw
Total number of variables.
integer number_species
number of species: each species has different characterictic speeds and should be used accordingly in...
integer nwflux
Number of flux variables.
The data structure that contains information about a tree node/grid block.