MPI-AMRVAC 3.2
The MPI - Adaptive Mesh Refinement - Versatile Advection Code (development version)
Loading...
Searching...
No Matches
mod_global_parameters.t
Go to the documentation of this file.
1!> This module contains definitions of global parameters and variables and some
2!> generic functions/subroutines used in AMRVAC.
3!>
5 use mpi
11
12 implicit none
13 public
14
15 !> minimum and maximum domain boundaries for each dimension
16 double precision :: xprob^l
17 !> store unstretched cell size of current level
18 double precision :: dxlevel(^nd)
19 !> stretch factor between cells at AMR level 1, per dimension
20 double precision :: qstretch_baselevel(^nd)
21
22 !> physical extent of stretched border in symmetric stretching
23 double precision :: xstretch^d
24
25 !> to monitor timeintegration loop at given wall-clock time intervals
26 double precision :: time_between_print
27
28 !> accumulated wall-clock time spent on boundary conditions
29 double precision :: time_bc
30
31 !> global time step
32 double precision :: dt
33
34 !> The Courant (CFL) number used for the simulation
35 double precision :: courantpar
36
37
38 !> If dtpar is positive, it sets the timestep dt, otherwise courantpar is used
39 !> to limit the time step based on the Courant condition.
40 double precision :: dtpar
41
42 !> For resistive MHD, the time step is also limited by the diffusion time:
43 !> \f$ dt < dtdiffpar \times dx^2/eta \f$
44 double precision :: dtdiffpar
45
46 !> The global simulation time
47 double precision :: global_time
48
49 !> Start time for the simulation
50 double precision :: time_init
51
52 !> End time for the simulation
53 double precision :: time_max
54
55 !> Ending wall time (in hours) for the simulation
56 double precision :: wall_time_max
57
58 !> Stop the simulation when the time step becomes smaller than this value
59 double precision :: dtmin
60
61 !> Conversion factor for length unit
62 double precision :: length_convert_factor
63
64 !> Conversion factor for time unit
65 double precision :: time_convert_factor
66
67 !> Fix the AMR grid after this time
68 double precision :: tfixgrid
69
70 ! Physics factors
71 !> Physical scaling factor for length
72 double precision :: unit_length=1.d0
73
74 !> Physical scaling factor for time
75 double precision :: unit_time=1.d0
76
77 !> Physical scaling factor for density
78 double precision :: unit_density=1.d0
79
80 !> Physical scaling factor for velocity
81 double precision :: unit_velocity=1.d0
82
83 !> Physical scaling factor for temperature
84 double precision :: unit_temperature=1.d0
85
86 !> Physical scaling factor for pressure
87 double precision :: unit_pressure=1.d0
88
89 !> Physical scaling factor for magnetic field
90 double precision :: unit_magneticfield=1.d0
91
92 !> Physical scaling factor for number density
93 double precision :: unit_numberdensity=1.d0
94
95 !> Physical scaling factor for charge
96 double precision :: unit_charge=1.d0
97
98 !> Physical scaling factor for mass
99 double precision :: unit_mass=1.d0
100
101 !> Normalised speed of light
102 double precision :: c_norm=1.d0
103
104 !> Normalised radiation constant
105 double precision :: arad_norm=1.d0
106
107 !> Physical scaling factor for Opacity
108 double precision :: unit_opacity=1.d0
109
110 !> Physical scaling factor for radiation flux
111 double precision :: unit_radflux=1.d0
112
113 !> Physical scaling factor for radiation energy density
114 double precision :: unit_erad=1.d0
115
116 !> Physical factors useful for radiation fld
118
119 !> error handling
121 double precision :: phys_trac_mask
122
123 double precision :: minfip=1.d0, maxfip=4.d0
124
125 !> amplitude of background dipolar, quadrupolar, octupolar, user's field
126 double precision :: bdip=0.d0
127 double precision :: bquad=0.d0
128 double precision :: boct=0.d0
129 double precision :: busr=0.d0
130 !> Stores the memory and load imbalance, used in printlog
131 double precision :: xload, xmemory
132 double precision :: tvdlfeps
133
134 !> RK2(alfa) method parameters from Butcher tableau
135 double precision :: rk_a21,rk_b1,rk_b2
136 !> IMEX-222(lambda) one-parameter family of schemes
137 double precision :: imex222_lambda
142 !> IMEX_ARS3 parameter ars_gamma
143 double precision :: ars_gamma
145 double precision :: imex_b3,imex_c2,imex_c3
146 !> IMEX_CB3a extra parameters
147 double precision :: imex_a22, imex_a33, imex_ha32
148
149 !> global fastest wave speed needed in fd scheme and glm method
150 double precision :: cmax_global
151
152 !> global fastest flow speed needed in glm method
153 double precision :: vmax_global
154
155 !> times for enhancing spatial resolution for EUV image/spectra
157 !> the white light emission below it (unit=Rsun) is not visible
158 double precision :: r_occultor
159 !> direction of the line of sight (LOS)
160 double precision :: los_theta,los_phi
161 !> rotation of image
162 double precision :: image_rotate
163 !> where the is the origin (X=0,Y=0) of image
164 double precision :: x_origin(1:3)
165 !> Base file name for synthetic EUV spectrum output
166 character(len=std_len) :: filename_spectrum
167 !> Synthetic emission transfer mode: thin or thick
168 character(len=std_len) :: radiation_transfer
169 !> Synthetic emission ray traversal method
170 character(len=std_len) :: ray_method
171 !> Synthetic emission physical model selector
172 character(len=std_len) :: emission_model
173 !> Post-process dat-resolution EUV images onto the instrument pixel grid
175 !> Observing frequency for radio free-free synthesis in Hz
176 double precision :: radio_frequency
177 !> Gaussian radio beam full width at half maximum in arcsec
178 double precision :: radio_beam_fwhm
179 !> Output pixel size for radio beam post-processing in arcsec; <=0 uses FWHM/3
180 double precision :: radio_beam_pixel_size
181 !> Number of image pixels processed in one ray-segment MPI batch
183 !> Maximum ray segments per pixel batch, as a factor of radsyn_pixel_batch; <=0 uses memory budget.
184 !> Default value is set from the best spherical u512 benchmark behavior seen so far.
186 !> Approximate per-rank temporary memory budget, in MiB, for automatic ray-segment batch sizing
187 double precision :: radsyn_segment_memory_mb
188 !> Maximum ray segments per segmented MPI all-to-all round, as a factor of radsyn_pixel_batch
190 !> Print synthetic-emission ray-tracing profiling counters
191 logical :: radsyn_verbose
192 !> spectral window
194 !> location of the slit
195 double precision :: location_slit
196 !> for spherical coordinate, region below it (unit=Rsun) is treated as not transparent
197 double precision :: r_opt_thick
198
199 !> domain percentage cut off shifted from each boundary when converting data
200 double precision :: writespshift(^nd,2)
201
202 double precision, allocatable :: entropycoef(:)
203
204 !> extent of grid blocks in domain per dimension, in array over levels
205 double precision, dimension(:), allocatable :: dg^d
206 !> Corner coordinates
207 double precision, allocatable :: rnode(:,:)
208 double precision, allocatable :: rnode_sub(:,:)
209
210 !> spatial steps for all dimensions at all levels
211 double precision, allocatable :: dx(:,:)
212
213 !> Error tolerance for refinement decision
214 double precision, allocatable :: refine_threshold(:)
215 !> Error tolerance ratio for derefinement decision
216 double precision, allocatable :: derefine_ratio(:)
217
218 !> Stretching factors and first cell size for each AMR level and dimension
219 double precision, allocatable :: qstretch(:,:), dxfirst(:,:), &
220 dxfirst_1mq(:,:), dxmid(:,:)
221
222 !> Conversion factors the primitive variables
223 double precision, allocatable :: w_convert_factor(:)
224
225 !> Weights of variables used to calculate error for mesh refinement
226 double precision, allocatable :: w_refine_weight(:)
227
228 !> refinement: lohner estimate wavefilter setting
229 double precision, allocatable :: amr_wavefilter(:)
230
231 !> Maximum number of saves that can be defined by tsave or itsave
232 integer, parameter :: nsavehi=100
233 !> Number of output methods
234 integer, parameter :: nfile = 5
235
236 !> Save output of type N on times tsave(:, N)
237 double precision :: tsave(nsavehi,nfile)
238
239 double precision :: tsavelast(nfile)
240
241 !> Repeatedly save output of type N when dtsave(N) simulation time has passed
242 double precision :: dtsave(nfile)
243
244 !> Start of read out (not counting specified read outs)
245 double precision :: tsavestart(nfile)
246
247 !> Number of spatial dimensions for grid variables
248 integer, parameter :: ndim=^nd
249
250 !> The number of MPI tasks
251 integer :: npe
252
253 !> The rank of the current MPI task
254 integer :: mype
255
256 !> The MPI communicator
257 integer :: icomm
258
259 !> A global MPI error return code
260 integer :: ierrmpi
261
262 !> Per-rank load-balance timing diagnostic toggle (off by default).
263 !> When .true., per-rank wall times are gathered every step and written
264 !> to <basename>_rank_timing.log.
265 logical :: lb_diagnose = .false.
266
267 !> Cost-weighted automatic load balancer toggle (off by default).
268 !> When .true., the SFC partitioner cuts on cumulative measured per-block
269 !> cost rather than on equal block counts.
270 logical :: lb_automatic = .false.
271
272 !> Rebalance every lb_interval cycles when lb_automatic is on.
273 integer :: lb_interval = 10
274
275 !> Exponential-moving-average decay for the per-block cost.
276 !> costlist <- lb_alpha*costlist + (1-lb_alpha)*measured.
277 !> 0 = no memory (volatile), 1 = no update.
278 double precision :: lb_alpha = 0.9d0
279
280 !> Per-step per-block (per-rank, indexed by igrid) cost accumulator.
281 !> Reset at start of each advance call; filled inside iigrid loops by the
282 !> per-block timer wrappers in mod_advance.t and mod_supertimestepping.t.
283 double precision, dimension(:), allocatable :: block_cost
284
285 !> Persistent global per-Morton-leaf EWMA cost. Sized to max_blocks*npe
286 !> (the upper bound on nleafs); only the first nleafs entries are
287 !> meaningful. Morton numbering is invariant across load_balance
288 !> migration, so costlist values are correctly preserved when blocks
289 !> change rank. Refinement events insert/remove Morton indices, after
290 !> which the EWMA recovers over ~5 cycles. Indexed 1..nleafs. Updated
291 !> by EWMA blend inside get_Morton_range_costed.
292 double precision, dimension(:), allocatable :: costlist
293
294 !> MPI file handle for logfile
295 integer :: log_fh
296 !> MPI type for block including ghost cells and its size
298 !> MPI type for block coarsened by 2, and for its children blocks
300 !> MPI type for staggered block coarsened by 2, and for its children blocks
301 integer :: type_coarse_block_stg(^nd,2^d&), type_sub_block_stg(^ND,2^D&)
302 !> MPI type for IO: block excluding ghost cells
304 !> MPI type for IO of staggered variables
306 !> MPI type for IO: cell corner (xc) or cell center (xcc) coordinates
308 !> MPI type for IO: cell corner (wc) or cell center (wcc) variables
310
311 ! geometry and domain setups
312 !> the mesh range of a physical block without ghost cells
313 integer :: ixm^ll
314
315 !> Indices for cylindrical coordinates FOR TESTS, negative value when not used:
316 integer :: r_ = -1
317 integer :: phi_ = -1
318 integer :: z_ = -1
319
320 !> Number of spatial dimensions (components) for vector variables
321 integer :: ndir=ndim
322
323 !> starting dimension for electric field
324 {^ifoned
325 integer, parameter :: sdim=3
326 }
327 {^iftwod
328 integer, parameter :: sdim=3
329 }
330 {^ifthreed
331 integer, parameter :: sdim=1
332 }
333
334 !> number of cells for each dimension in level-one mesh
335 integer :: domain_nx^d
336
337 !> number of cells for each dimension in grid block excluding ghostcells
338 integer :: block_nx^d
339
340 !> Lower index of grid block arrays (always 1)
341 integer, parameter :: {ixglo^d = 1|, }
342
343 !> Upper index of grid block arrays
344 integer :: ixghi^d
345
346 !> Lower index of stagger grid block arrays (always 0)
347 integer, parameter :: {ixgslo^d = 0|, }
348
349 !> Upper index of stagger grid block arrays
350 integer :: ixgshi^d
351
352 !> Number of ghost cells surrounding a grid
353 integer :: nghostcells = 2
354
355 integer, parameter :: stretch_none = 0 !< No stretching
356 integer, parameter :: stretch_uni = 1 !< Unidirectional stretching from a side
357 integer, parameter :: stretch_symm = 2 !< Symmetric stretching around the center
358
359 !> What kind of stretching is used per dimension
360 integer :: stretch_type(ndim)
361 !> (even) number of (symmetrically) stretched
362 !> blocks at AMR level 1, per dimension
364 !> (even) number of (symmetrically) stretched blocks per level and dimension
365 integer, allocatable :: nstretchedblocks(:,:)
366
367 !> grid hierarchy info (level and grid indices)
368 integer, parameter :: nodehi=^nd+1
369 integer, parameter :: plevel_=1
370 integer, parameter :: pig^d_=plevel_+^d
371
372 integer, allocatable :: node(:,:)
373 integer, allocatable :: node_sub(:,:)
374
375 !> grid location info (corner coordinates and grid spacing)
376 integer, parameter :: rnodehi=3*^nd
377 integer, parameter :: rpxmin0_=0
378 integer, parameter :: rpxmin^d_=rpxmin0_+^d
379 integer, parameter :: rpxmax0_=^nd
380 integer, parameter :: rpxmax^d_=rpxmax0_+^d
381 integer, parameter :: rpdx^d_=2*^nd+^d
382
383 !> index number of the latest existing data file
385
386 !> Save output of type N on iterations itsave(:, N)
387 integer :: itsave(nsavehi,nfile)
388
389 integer :: itsavelast(nfile)
390
391 !> Repeatedly save output of type N when ditsave(N) time steps have passed
392 integer :: ditsave(nfile)
393
394 integer :: isavet(nfile)
395
396 integer :: isaveit(nfile)
397
398 !> The level at which to produce line-integrated / collapsed output
399 integer :: collapselevel
400
401 !> Number of saved files of each type
402 integer :: n_saves(1:nfile)
403
404 !> IO: snapshot and collapsed views output numbers/labels
406
407 !> IO: slice output number/label
408 integer :: slicenext
409
410 !> Constant indicating log output
411 integer, parameter :: filelog_ = 1
412
413 !> Constant indicating regular output
414 integer, parameter :: fileout_ = 2
415
416 !> Constant indicating slice output
417 integer, parameter :: fileslice_ = 3
418
419 !> Constant indicating collapsed output
420 integer, parameter :: filecollapse_ = 4
421
422 !> Constant indicating analysis output (see @ref analysis.md)
423 integer, parameter :: fileanalysis_ = 5
424
425 !> Unit for standard input
426 integer, parameter :: unitstdin=5
427
428 !> Unit for standard output
429 integer, parameter :: unitterm=6
430
431 !> Unit for error messages
432 integer, parameter :: uniterr=6
433
434 !> file handle for IO
435 integer, parameter :: unitpar=9
436 integer, parameter :: unitconvert=10
437 integer, parameter :: unitslice=11
438 integer, parameter :: unitsnapshot=12
439 integer, parameter :: unitcollapse=13
440 integer, parameter :: unitanalysis=14
441
442 !> Number of auxiliary variables that are only included in output
443 integer :: nwauxio
444
446
447 !> Resume from the snapshot with this index
448 integer :: snapshotini
449
450 !> number of equilibrium set variables, besides the mag field
451 integer :: number_equi_vars = 0
452
453 integer :: phys_trac_type=1
455 integer :: phys_trac_nzones=1
456 double precision :: phys_trac_zone_splits(10)=-1.d0
457
458 !> integer switchers for type courant
459 integer, parameter :: type_maxsum=1
460 integer, parameter :: type_summax=2
461 integer, parameter :: type_minimum=3
462
463 ! AMR switches
464 !> The maximum number of grid blocks in a processor
465 integer :: max_blocks
466
467 !> The maximum number of levels in the grid refinement
468 integer, parameter :: nlevelshi = 20
469
470 !> Maximal number of AMR levels
472
473 !> Fix the AMR grid after this many time steps
474 integer :: itfixgrid
475
476 !> Reconstruct the AMR grid once every ditregrid iteration(s)
477 integer :: ditregrid
478
479 !> select types of refine criterion
481
482 !> Number of cells as buffer zone
483 integer :: nbufferx^d
484
485 integer :: levmin
486 integer :: levmax
487 integer :: levmax_sub
488
489 ! Miscellaneous
490 !> problem switch allowing different setups in same usr_mod.t
491 integer :: iprob
492
493 !> Kronecker delta tensor
494 integer :: kr(3,3)
495
496 !> Levi-Civita tensor
497 integer :: lvc(3,3,3)
498
499 !> How to compute the CFL-limited time step
500 integer :: type_courant=1
501
502 !> Number of time steps taken
503 integer :: it
504
505 !> Stop the simulation after this many time steps have been taken
506 integer :: it_max
507
508 !> initial iteration count
509 integer :: it_init
510
511 !> If > 1, then in the first slowsteps-1 time steps dt is reduced
512 !> by a factor \f$ 1 - (1- step/slowsteps)^2 \f$
513 integer :: slowsteps
514
515 ! Method switches
516
517 !> Index of the sub-step in a multi-step time integrator
518 integer :: istep
519
520 !> How many sub-steps the time integrator takes
521 integer :: nstep
522
523 !> flux schemes
524 integer, parameter :: fs_hll=1
525 integer, parameter :: fs_hllc=2
526 integer, parameter :: fs_hlld=3
527 integer, parameter :: fs_hllcd=4
528 integer, parameter :: fs_tvdlf=5
529 integer, parameter :: fs_tvdmu=6
530 integer, parameter :: fs_tvd=7
531 integer, parameter :: fs_hancock=8
532 integer, parameter :: fs_cd=9
533 integer, parameter :: fs_cd4=10
534 integer, parameter :: fs_fd=11
535 integer, parameter :: fs_source=12
536 integer, parameter :: fs_nul=13
537
538 !> time stepper type
539 integer :: t_stepper=0
540 integer, parameter :: onestep=1
541 integer, parameter :: twostep=2
542 integer, parameter :: threestep=3
543 integer, parameter :: fourstep=4
544 integer, parameter :: fivestep=5
545
546 !> time integrator method
547 integer :: t_integrator=0
548 integer, parameter :: forward_euler=1
549 integer, parameter :: predictor_corrector=2
550 integer, parameter :: ssprk3=3
551 integer, parameter :: ssprk4=4
552 integer, parameter :: ssprk5=5
553
554 integer, parameter :: imex_euler=6
555 integer, parameter :: imex_sp=7
556 integer, parameter :: rk2_alf=8
557 integer, parameter :: ssprk2=9
558 integer, parameter :: imex_midpoint=10
559 integer, parameter :: imex_trapezoidal=11
560 integer, parameter :: imex_222=12
561
562 integer, parameter :: rk3_bt=13
563 integer, parameter :: imex_ars3=14
564 integer, parameter :: imex_232=15
565 integer, parameter :: imex_cb3a=16
566
567 integer, parameter :: rk4=17
568
569 !> number of grid blocks in domain per dimension, in array over levels
570 integer, dimension(:), allocatable :: ng^d
571
572 !> Which flux scheme of spatial discretization to use (per grid level)
573 integer, allocatable :: flux_method(:)
574
575 !> The spatial discretization for the predictor step when using a two
576 !> step PC method
577 integer, allocatable :: typepred1(:)
578
579 !> Type of slope limiter used for reconstructing variables on cell edges
580 integer, allocatable :: type_limiter(:)
581
582 !> Type of slope limiter used for computing gradients or divergences, when
583 !> typegrad or typediv are set to 'limited'
584 integer, allocatable :: type_gradient_limiter(:)
585
586 !> background magnetic field location indicator
587 integer :: b0i=0
588
589 !> Limiter used for prolongation to refined grids and ghost cells
590 integer :: prolong_limiter=0
591
592 !> bound (left/min and right.max) speed of Riemann fan
593 integer :: boundspeed
594
595 integer :: nxdiffusehllc
596 !> SSPRK choice of methods (both threestep and fourstep, Shu-Osher 2N* implementation)
597 !> also fivestep SSPRK54
598 integer :: ssprk_order
599 !> RK3 Butcher table
600 integer :: rk3_switch
601 !> IMEX_232 choice and parameters
602 integer :: imex_switch
603
604 !> Array indicating the type of boundary condition per variable and per
605 !> physical boundary
606 integer, allocatable :: typeboundary(:, :)
607 !> boundary condition types
608 integer, parameter :: bc_special=1
609 integer, parameter :: bc_cont=2
610 integer, parameter :: bc_symm=3
611 integer, parameter :: bc_asymm=4
612 integer, parameter :: bc_periodic=5
613 integer, parameter :: bc_aperiodic=6
614 integer, parameter :: bc_noinflow=7
615 integer, parameter :: bc_data=8
616 integer, parameter :: bc_character=9
617 integer, parameter :: bc_icarus=10
618
619 !> wavelength for output
620 integer :: wavelength
621 ! minimum and maximum energy of SXR (keV)
623 !> wave length for spectrum
624 integer :: spectrum_wl
625 !> direction of the slit (for dat resolution only)
626 integer :: direction_slit
627
628
629 !> Cartesian geometry or not
630 logical :: slab
631
632 !> uniform Cartesian geometry or not (stretched Cartesian)
633 logical :: slab_uniform
634
635 !> each cell has its own timestep or not
636 logical :: local_timestep = .false.
637
638 !> whether or not to save an output file
639 logical :: save_file(nfile)
640
641 !> If true, adjust mod_geometry routines to account for grid stretching (but
642 !> the flux computation will not)
644 !> True if a dimension is stretched
645 logical :: stretched_dim(ndim)
646
647 !> If true, restart a previous run from the latest snapshot
649
650 !> If true and restart_from_file is given, convert snapshots to
651 !> other file formats
652 logical :: convert
653
654 !> If true, already convert to output format during the run
655 logical :: autoconvert
656
657 !> If true, convert from conservative to primitive variables in output
658 logical :: saveprim
659
660 !> do time evolving
661 logical :: time_advance
662
663 !> Force timeloop exit when final dt < dtmin
664 logical :: final_dt_exit
665
666 !> If true, reset iteration count and global_time to original values, and
667 !> start writing snapshots at index 0
668 logical :: reset_time
669
670 !> If true, reset iteration count to 0
671 logical :: reset_it
672
673 !> If true, allow final dt reduction for matching time_max on output
675
676 !> If true, call initonegrid_usr upon restarting
677 logical :: firstprocess
678
679 !> If true, wall time is up, modify snapshotnext for later overwrite
680 logical :: pass_wall_time
681
682 !> If true, do H-correction to fix the carbuncle problem at grid-aligned shocks
683 logical :: h_correction=.false.
684
685 !> If true, rebuild the AMR grid upon restarting
686 logical :: reset_grid
687 !> True for using stagger grid
688 logical :: stagger_grid=.false.
689 !> Limit outstanding ghost-cell send requests to avoid MPI request pressure.
690 !> In large-scale MHD tests, the original all-at-once ghost-cell exchange could
691 !> stall during spherical u512 initialization. Batching avoids
692 !> that failure mode, while u256 5-step tests showed less than 0.1% total
693 !> runtime difference. The original path is still available by setting this to
694 !> false; if batching remains stable in broader tests, the old path can be
695 !> removed later.
696 logical :: ghostcell_comm_batched=.true.
698 !> True for record electric field
699 logical :: record_electric_field=.false.
700
701 !> resolution of the images
702 logical :: dat_resolution
703 !> output optical-depth map for synthetic emission when available
704 logical :: output_tau
705 !> output absorption fraction for thick/thin EUV synthesis when available
707
708 !> If collapse(DIM) is true, generate output integrated over DIM
709 logical :: collapse(ndim)
710 !> IO switches for conversion
711 logical :: nocartesian
712
713 !> Use particles module or not
714 logical :: use_particles=.false.
715
716 !> Use multigrid (only available in 2D and 3D)
717 logical :: use_multigrid = .false.
718
719 !> prolongate primitive variables in level-jump ghost cells
720 logical :: prolongprimitive=.false.
721
722 !> coarsen primitive variables in level-jump ghost cells
723 logical :: coarsenprimitive=.false.
724
725 !> Save a snapshot before crash a run met unphysical values
726 logical :: crash=.false.
727
728 !> check and optionally fix unphysical small values (density, gas pressure)
729 logical :: check_small_values=.true.
730
731 !> fix small values with average or replace methods
732 logical :: fix_small_values=.false.
733
734 !> split magnetic field as background B0 field
735 logical :: b0field=.false.
736 logical :: b0fieldalloccoarse=.false.
737 !> Use SI units (.true.) or use cgs units (.false.)
738 logical :: si_unit=.false.
739
740 !> Use TRAC for MHD or 1D HD
741 logical :: phys_trac=.false.
742
743 !> Use escape probability for radiative cooling modification
744 logical :: phys_escape_prob=.false.
745
746 !> Whether to apply flux conservation at refinement boundaries
747 logical :: fix_conserve_global = .true.
749 double precision :: flux_adaptive_diffusion_min
753 !> Use split or unsplit way to add user's source terms, default: unsplit
755 !> if any normal source term is added in split fasion
756 logical :: any_source_split=.false.
757 logical :: dimsplit
758 !> whether IMEX in use or not
760
761 !> need global maximal wave speed
762 logical :: need_global_cmax=.false.
763
764 ! Boundary region parameters
765
766 !> True for dimensions with periodic boundaries
767 logical :: periodb(ndim)
768
769 !> Indicates whether there is a pole at a boundary
770 logical :: poleb(2,ndim)
771
772 !> True for dimensions with aperiodic boundaries
773 logical :: aperiodb(ndim)
774
775 !> True for save physical boundary cells in dat files
777
778 !> whether copy values instead of interpolation in ghost cells of finer blocks
779 logical :: ghost_copy=.false.
780
781 !> if there is an internal boundary
783
784 !> use arcsec as length unit of images/spectra
786 !> big image
787 logical :: big_image
788
789 !> True if a block has any physical boundary
790 logical, allocatable :: phyboundblock(:)
791
792 !> if true write the w variable in output
793 logical, allocatable :: w_write(:)
794
795 logical, allocatable :: writelevel(:)
796
797 logical, allocatable :: loglimit(:), logflag(:)
798
799 ! Parameters
800 character(len=*), parameter :: undefined = 'undefined'
801
802 !> Names of the output methods
803 character(len=40), parameter :: output_names(nfile) = &
804 ['log ', 'normal ', 'slice ', 'collapsed', 'analysis ']
805 !> Which format to use when converting
806 !>
807 !> Options are: tecplot, tecplotCC, vtu, vtuCC, vtuB, vtuBCC,
808 !> tecplotmpi, tecplotCCmpi, vtumpi, vtuCCmpi, vtuBmpi, vtuBCCmpi, pvtumpi, pvtuCCmpi,
809 !> pvtuBmpi, pvtuBCCmpi, tecline, teclinempi, onegrid
810 character(len=std_len) :: convert_type
811
812 character(len=std_len) :: collapse_type
813
814 !> User parameter file
815 character(len=std_len) :: usr_filename
816
817 !> Base file name for simulation output, which will be followed by a number
818 character(len=std_len) :: base_filename
819
820 !> If not 'unavailable', resume from snapshot with this base file name
821 character(len=std_len) :: restart_from_file
822
823 !> Which type of log to write: 'normal', 'special', 'regression_test'
824 character(len=std_len) :: typefilelog
825
826 character(len=std_len) :: typeaverage
827 character(len=std_len) :: typedimsplit
828 character(len=std_len) :: geometry_name='default'
829 character(len=std_len) :: typepoly
830 !> Base file name for synthetic EUV emission output
831 character(len=std_len) :: filename_euv
832 !> Base file name for synthetic SXR emission output
833 character(len=std_len) :: filename_sxr
834 !> Base file name for synthetic white light
835 character(len=std_len) :: filename_whitelight
836 !> white light observation instrument
837 character(len=std_len) :: whitelight_instrument
838
839 !> Which type of TVD method to use
840 character(len=std_len) :: typetvd
841
842 character(len=std_len) :: typediv,typegrad
843
844 !> Which par files are used as input
845 character(len=std_len), allocatable :: par_files(:)
846
847 !> Which type of entropy fix to use with Riemann-type solvers
848 character(len=std_len), allocatable :: typeentropy(:)
849
850 !> Block pointer for using one block and its previous state
851 type(state), pointer :: block
852
853 !$OMP THREADPRIVATE(block,dxlevel,b0i)
854
855contains
856
857 !> Cross product of two vectors
858 pure subroutine cross_product(ixI^L,ixO^L,a,b,axb)
859 integer, intent(in) :: ixi^l, ixo^l
860 double precision, intent(in) :: a(ixi^s,3), b(ixi^s,3)
861 double precision, intent(out) :: axb(ixi^s,3)
862
863 axb(ixo^s,1)=a(ixo^s,2)*b(ixo^s,3)-a(ixo^s,3)*b(ixo^s,2)
864 axb(ixo^s,2)=a(ixo^s,3)*b(ixo^s,1)-a(ixo^s,1)*b(ixo^s,3)
865 axb(ixo^s,3)=a(ixo^s,1)*b(ixo^s,2)-a(ixo^s,2)*b(ixo^s,1)
866 end subroutine cross_product
867
868end module mod_global_parameters
Module with basic data types used in amrvac.
This module contains variables that describe the connectivity of the mesh and also data structures fo...
Module for physical and numeric constants.
This module contains definitions of global parameters and variables and some generic functions/subrou...
character(len=std_len), dimension(:), allocatable typeentropy
Which type of entropy fix to use with Riemann-type solvers.
double precision, dimension(nfile) tsavelast
double precision, dimension(:), allocatable w_convert_factor
Conversion factors the primitive variables.
type(state), pointer block
Block pointer for using one block and its previous state.
double precision xload
Stores the memory and load imbalance, used in printlog.
integer nstep
How many sub-steps the time integrator takes.
logical h_correction
If true, do H-correction to fix the carbuncle problem at grid-aligned shocks.
integer it_max
Stop the simulation after this many time steps have been taken.
logical, dimension(ndim) aperiodb
True for dimensions with aperiodic boundaries.
logical internalboundary
if there is an internal boundary
double precision r_opt_thick
for spherical coordinate, region below it (unit=Rsun) is treated as not transparent
character(len=std_len) filename_sxr
Base file name for synthetic SXR emission output.
integer spectrum_wl
wave length for spectrum
logical nocartesian
IO switches for conversion.
double precision arad_norm
Normalised radiation constant.
integer, dimension(:), allocatable typepred1
The spatial discretization for the predictor step when using a two step PC method.
double precision dtdiffpar
For resistive MHD, the time step is also limited by the diffusion time: .
character(len=std_len) typegrad
integer ixgshi
Upper index of stagger grid block arrays.
logical reset_it
If true, reset iteration count to 0.
double precision unit_charge
Physical scaling factor for charge.
integer, parameter bc_noinflow
integer type_coarse_block
MPI type for block coarsened by 2, and for its children blocks.
integer ixghi
Upper index of grid block arrays.
integer, parameter stretch_uni
Unidirectional stretching from a side.
pure subroutine cross_product(ixil, ixol, a, b, axb)
Cross product of two vectors.
character(len=std_len) geometry_name
integer, dimension(3, 3, 3) lvc
Levi-Civita tensor.
double precision unit_time
Physical scaling factor for time.
double precision, dimension(:), allocatable costlist
Persistent global per-Morton-leaf EWMA cost. Sized to max_blocks*npe (the upper bound on nleafs); onl...
double precision unit_density
Physical scaling factor for density.
logical activate_unit_arcsec
use arcsec as length unit of images/spectra
character(len=std_len) typepoly
logical source_split_usr
Use split or unsplit way to add user's source terms, default: unsplit.
integer, parameter imex_euler
logical lb_diagnose
Per-rank load-balance timing diagnostic toggle (off by default). When .true., per-rank wall times are...
double precision unit_opacity
Physical scaling factor for Opacity.
integer domain_nx
number of cells for each dimension in level-one mesh
integer, parameter unitpar
file handle for IO
double precision, dimension(:), allocatable block_cost
Per-step per-block (per-rank, indexed by igrid) cost accumulator. Reset at start of each advance call...
character(len=std_len) filename_spectrum
Base file name for synthetic EUV spectrum output.
logical, dimension(nfile) save_file
whether or not to save an output file
logical any_source_split
if any normal source term is added in split fasion
logical resume_previous_run
If true, restart a previous run from the latest snapshot.
double precision global_time
The global simulation time.
integer type_block_xc_io
MPI type for IO: cell corner (xc) or cell center (xcc) coordinates.
integer, dimension(nsavehi, nfile) itsave
Save output of type N on iterations itsave(:, N)
double precision unit_mass
Physical scaling factor for mass.
logical use_imex_scheme
whether IMEX in use or not
integer istep
Index of the sub-step in a multi-step time integrator.
double precision time_max
End time for the simulation.
logical output_absorption_fraction
output absorption fraction for thick/thin EUV synthesis when available
double precision radio_beam_fwhm
Gaussian radio beam full width at half maximum in arcsec.
integer, dimension(3, 3) kr
Kronecker delta tensor.
double precision xstretch
physical extent of stretched border in symmetric stretching
logical, dimension(:), allocatable logflag
double precision time_init
Start time for the simulation.
logical stretch_uncentered
If true, adjust mod_geometry routines to account for grid stretching (but the flux computation will n...
logical firstprocess
If true, call initonegrid_usr upon restarting.
integer snapshotini
Resume from the snapshot with this index.
double precision small_temperature
error handling
double precision xprob
minimum and maximum domain boundaries for each dimension
integer it
Number of time steps taken.
character(len=std_len) filename_euv
Base file name for synthetic EUV emission output.
logical, dimension(:), allocatable loglimit
double precision, dimension(:), allocatable dg
extent of grid blocks in domain per dimension, in array over levels
integer, parameter bc_character
integer it_init
initial iteration count
integer, dimension(:, :), allocatable typeboundary
Array indicating the type of boundary condition per variable and per physical boundary.
integer ditregrid
Reconstruct the AMR grid once every ditregrid iteration(s)
logical instrument_postprocess
Post-process dat-resolution EUV images onto the instrument pixel grid.
logical saveprim
If true, convert from conservative to primitive variables in output.
double precision ars_gamma
IMEX_ARS3 parameter ars_gamma.
double precision unit_numberdensity
Physical scaling factor for number density.
double precision flux_adaptive_diffusion_min
character(len=std_len) filename_whitelight
Base file name for synthetic white light.
character(len=std_len) convert_type
Which format to use when converting.
double precision unit_pressure
Physical scaling factor for pressure.
integer, parameter type_maxsum
integer switchers for type courant
integer, parameter ndim
Number of spatial dimensions for grid variables.
integer itfixgrid
Fix the AMR grid after this many time steps.
integer, parameter filecollapse_
Constant indicating collapsed output.
integer prolong_limiter
Limiter used for prolongation to refined grids and ghost cells.
double precision, dimension(:), allocatable amr_wavefilter
refinement: lohner estimate wavefilter setting
double precision unit_length
Physical scaling factor for length.
integer, parameter nlevelshi
The maximum number of levels in the grid refinement.
double precision location_slit
location of the slit
logical save_physical_boundary
True for save physical boundary cells in dat files.
double precision vmax_global
global fastest flow speed needed in glm method
logical phys_escape_prob
Use escape probability for radiative cooling modification.
logical stagger_grid
True for using stagger grid.
double precision const_rad_a
Physical factors useful for radiation fld.
double precision cmax_global
global fastest wave speed needed in fd scheme and glm method
double precision time_convert_factor
Conversion factor for time unit.
logical, dimension(:), allocatable phyboundblock
True if a block has any physical boundary.
integer, dimension(:,:), allocatable nstretchedblocks
(even) number of (symmetrically) stretched blocks per level and dimension
integer, dimension(^nd, 2^d &) type_coarse_block_stg
MPI type for staggered block coarsened by 2, and for its children blocks.
logical use_particles
Use particles module or not.
character(len=std_len), dimension(:), allocatable par_files
Which par files are used as input.
integer icomm
The MPI communicator.
logical coarsenprimitive
coarsen primitive variables in level-jump ghost cells
integer, dimension(:), allocatable ng
number of grid blocks in domain per dimension, in array over levels
logical reset_time
If true, reset iteration count and global_time to original values, and start writing snapshots at ind...
double precision bdip
amplitude of background dipolar, quadrupolar, octupolar, user's field
integer b0i
background magnetic field location indicator
integer, parameter imex_trapezoidal
integer, parameter nsavehi
Maximum number of saves that can be defined by tsave or itsave.
logical ghostcell_comm_batched
Limit outstanding ghost-cell send requests to avoid MPI request pressure. In large-scale MHD tests,...
character(len=std_len) whitelight_instrument
white light observation instrument
integer mype
The rank of the current MPI task.
double precision dtpar
If dtpar is positive, it sets the timestep dt, otherwise courantpar is used to limit the time step ba...
integer, dimension(1:nfile) n_saves
Number of saved files of each type.
character(len=std_len) typediv
integer block_nx
number of cells for each dimension in grid block excluding ghostcells
integer type_block_io
MPI type for IO: block excluding ghost cells.
double precision, dimension(nfile) tsavestart
Start of read out (not counting specified read outs)
integer, dimension(nfile) ditsave
Repeatedly save output of type N when ditsave(N) time steps have passed.
integer, dimension(2^d &) type_sub_block
logical, dimension(ndim) collapse
If collapse(DIM) is true, generate output integrated over DIM.
integer, parameter unitstdin
Unit for standard input.
logical local_timestep
each cell has its own timestep or not
double precision dt
global time step
double precision radio_frequency
Observing frequency for radio free-free synthesis in Hz.
integer refine_criterion
select types of refine criterion
character(len=std_len) usr_filename
User parameter file.
logical ghost_copy
whether copy values instead of interpolation in ghost cells of finer blocks
integer slicenext
IO: slice output number/label.
double precision length_convert_factor
Conversion factor for length unit.
integer, parameter nodehi
grid hierarchy info (level and grid indices)
integer ndir
Number of spatial dimensions (components) for vector variables.
integer, parameter uniterr
Unit for error messages.
double precision imex222_lambda
IMEX-222(lambda) one-parameter family of schemes.
double precision courantpar
The Courant (CFL) number used for the simulation.
double precision wall_time_max
Ending wall time (in hours) for the simulation.
integer ixm
the mesh range of a physical block without ghost cells
integer ierrmpi
A global MPI error return code.
logical autoconvert
If true, already convert to output format during the run.
integer, dimension(:), allocatable flux_method
Which flux scheme of spatial discretization to use (per grid level)
double precision, dimension(:), allocatable, parameter d
character(len=std_len) collapse_type
logical slab
Cartesian geometry or not.
integer slowsteps
If > 1, then in the first slowsteps-1 time steps dt is reduced by a factor .
integer ssprk_order
SSPRK choice of methods (both threestep and fourstep, Shu-Osher 2N* implementation) also fivestep SSP...
double precision image_rotate
rotation of image
double precision, dimension(:,:), allocatable qstretch
Stretching factors and first cell size for each AMR level and dimension.
integer, parameter bc_periodic
integer type_block_wc_io
MPI type for IO: cell corner (wc) or cell center (wcc) variables.
double precision radio_beam_pixel_size
Output pixel size for radio beam post-processing in arcsec; <=0 uses FWHM/3.
integer type_courant
How to compute the CFL-limited time step.
integer, parameter bc_special
boundary condition types
integer snapshotnext
IO: snapshot and collapsed views output numbers/labels.
double precision unit_magneticfield
Physical scaling factor for magnetic field.
integer, parameter unitanalysis
logical, dimension(ndim) stretched_dim
True if a dimension is stretched.
logical dat_resolution
resolution of the images
double precision r_occultor
the white light emission below it (unit=Rsun) is not visible
integer, dimension(ndim) nstretchedblocks_baselevel
(even) number of (symmetrically) stretched blocks at AMR level 1, per dimension
integer npe
The number of MPI tasks.
logical output_tau
output optical-depth map for synthetic emission when available
double precision, dimension(^nd) qstretch_baselevel
stretch factor between cells at AMR level 1, per dimension
integer nwauxio
Number of auxiliary variables that are only included in output.
double precision unit_velocity
Physical scaling factor for velocity.
integer index_latest_data
index number of the latest existing data file
integer, dimension(nfile) itsavelast
integer, parameter stretch_none
No stretching.
integer imex_switch
IMEX_232 choice and parameters.
integer, parameter fs_hll
flux schemes
double precision time_between_print
to monitor timeintegration loop at given wall-clock time intervals
integer, parameter unitterm
Unit for standard output.
logical lb_automatic
Cost-weighted automatic load balancer toggle (off by default). When .true., the SFC partitioner cuts ...
double precision, dimension(nfile) dtsave
Repeatedly save output of type N when dtsave(N) simulation time has passed.
integer lb_interval
Rebalance every lb_interval cycles when lb_automatic is on.
logical, dimension(:), allocatable w_write
if true write the w variable in output
logical time_advance
do time evolving
logical prolongprimitive
prolongate primitive variables in level-jump ghost cells
integer iprob
problem switch allowing different setups in same usr_mod.t
character(len=std_len) restart_from_file
If not 'unavailable', resume from snapshot with this base file name.
logical, dimension(ndim) periodb
True for dimensions with periodic boundaries.
double precision c_norm
Normalised speed of light.
integer radsyn_segment_batch_factor
Maximum ray segments per pixel batch, as a factor of radsyn_pixel_batch; <=0 uses memory budget....
logical b0field
split magnetic field as background B0 field
double precision, dimension(:,:), allocatable rnode
Corner coordinates.
integer, parameter filelog_
Constant indicating log output.
character(len=40), dimension(nfile), parameter output_names
Names of the output methods.
double precision unit_temperature
Physical scaling factor for temperature.
double precision unit_radflux
Physical scaling factor for radiation flux.
integer, dimension(:), allocatable type_limiter
Type of slope limiter used for reconstructing variables on cell edges.
double precision, dimension(10) phys_trac_zone_splits
logical final_dt_reduction
If true, allow final dt reduction for matching time_max on output.
logical si_unit
Use SI units (.true.) or use cgs units (.false.)
logical, dimension(:), allocatable writelevel
integer, parameter unitcollapse
integer, parameter fileout_
Constant indicating regular output.
double precision los_theta
direction of the line of sight (LOS)
integer, parameter type_summax
character(len=std_len) typetvd
Which type of TVD method to use.
integer nbufferx
Number of cells as buffer zone.
double precision, dimension(:), allocatable entropycoef
double precision time_bc
accumulated wall-clock time spent on boundary conditions
double precision, dimension(:,:), allocatable dx
spatial steps for all dimensions at all levels
integer type_block
MPI type for block including ghost cells and its size.
double precision rk_a21
RK2(alfa) method parameters from Butcher tableau.
integer, parameter predictor_corrector
double precision tfixgrid
Fix the AMR grid after this time.
integer, parameter unitsnapshot
character(len=std_len) radiation_transfer
Synthetic emission transfer mode: thin or thick.
integer nghostcells
Number of ghost cells surrounding a grid.
double precision, dimension(:), allocatable w_refine_weight
Weights of variables used to calculate error for mesh refinement.
integer, parameter sdim
starting dimension for electric field
double precision flux_adaptive_diffusion_scale
integer, parameter forward_euler
logical phys_trac
Use TRAC for MHD or 1D HD.
logical fix_conserve_global
Whether to apply flux conservation at refinement boundaries.
character(len=std_len) typedimsplit
character(len=std_len) typeaverage
character(len= *), parameter undefined
double precision, dimension(nsavehi, nfile) tsave
Save output of type N on times tsave(:, N)
double precision spectrum_window_max
logical need_global_cmax
need global maximal wave speed
logical convert
If true and restart_from_file is given, convert snapshots to other file formats.
logical fix_small_values
fix small values with average or replace methods
integer wavelength
wavelength for output
integer collapselevel
The level at which to produce line-integrated / collapsed output.
logical reset_grid
If true, rebuild the AMR grid upon restarting.
integer, dimension(ndim) stretch_type
What kind of stretching is used per dimension.
logical crash
Save a snapshot before crash a run met unphysical values.
double precision, dimension(^nd) dxlevel
store unstretched cell size of current level
integer t_stepper
time stepper type
double precision, dimension(:,:), allocatable rnode_sub
logical use_multigrid
Use multigrid (only available in 2D and 3D)
integer radsyn_pixel_batch
Number of image pixels processed in one ray-segment MPI batch.
logical slab_uniform
uniform Cartesian geometry or not (stretched Cartesian)
logical radsyn_verbose
Print synthetic-emission ray-tracing profiling counters.
double precision, dimension(:), allocatable refine_threshold
Error tolerance for refinement decision.
character(len=std_len) base_filename
Base file name for simulation output, which will be followed by a number.
integer, parameter rnodehi
grid location info (corner coordinates and grid spacing)
double precision instrument_resolution_factor
times for enhancing spatial resolution for EUV image/spectra
double precision radsyn_segment_memory_mb
Approximate per-rank temporary memory budget, in MiB, for automatic ray-segment batch sizing.
double precision spectrum_window_min
spectral window
double precision dtmin
Stop the simulation when the time step becomes smaller than this value.
integer refine_max_level
Maximal number of AMR levels.
integer, parameter fileslice_
Constant indicating slice output.
character(len=std_len) ray_method
Synthetic emission ray traversal method.
double precision, dimension(:), allocatable derefine_ratio
Error tolerance ratio for derefinement decision.
integer, parameter nfile
Number of output methods.
integer max_blocks
The maximum number of grid blocks in a processor.
integer, parameter stretch_symm
Symmetric stretching around the center.
integer, parameter fileanalysis_
Constant indicating analysis output (see Writing a custom analysis subroutine)
integer r_
Indices for cylindrical coordinates FOR TESTS, negative value when not used:
integer rk3_switch
RK3 Butcher table.
integer, parameter bc_aperiodic
character(len=std_len) typefilelog
Which type of log to write: 'normal', 'special', 'regression_test'.
double precision imex_a22
IMEX_CB3a extra parameters.
integer direction_slit
direction of the slit (for dat resolution only)
integer type_block_io_stg
MPI type for IO of staggered variables.
logical, dimension(2, ndim) poleb
Indicates whether there is a pole at a boundary.
integer boundspeed
bound (left/min and right.max) speed of Riemann fan
logical pass_wall_time
If true, wall time is up, modify snapshotnext for later overwrite.
integer, parameter ixgslo
Lower index of stagger grid block arrays (always 0)
double precision, dimension(1:3) x_origin
where the is the origin (X=0,Y=0) of image
double precision, dimension(^nd, 2) writespshift
domain percentage cut off shifted from each boundary when converting data
character(len=std_len) emission_model
Synthetic emission physical model selector.
logical record_electric_field
True for record electric field.
integer, parameter unitconvert
double precision unit_erad
Physical scaling factor for radiation energy density.
double precision, dimension(:,:), allocatable dxfirst
integer t_integrator
time integrator method
integer, parameter fs_hancock
logical final_dt_exit
Force timeloop exit when final dt < dtmin.
integer, dimension(nfile) isaveit
integer, dimension(:), allocatable type_gradient_limiter
Type of slope limiter used for computing gradients or divergences, when typegrad or typediv are set t...
integer number_equi_vars
number of equilibrium set variables, besides the mag field
integer, dimension(:,:), allocatable node
integer, dimension(:,:), allocatable node_sub
integer radsyn_segment_comm_factor
Maximum ray segments per segmented MPI all-to-all round, as a factor of radsyn_pixel_batch.
integer, parameter type_minimum
double precision lb_alpha
Exponential-moving-average decay for the per-block cost. costlist <- lb_alpha*costlist + (1-lb_alpha)...
integer, dimension(nfile) isavet
integer, parameter imex_midpoint
double precision, dimension(:,:), allocatable dxfirst_1mq
logical check_small_values
check and optionally fix unphysical small values (density, gas pressure)
double precision, dimension(:,:), allocatable dxmid
integer, parameter ixglo
Lower index of grid block arrays (always 1)
integer log_fh
MPI file handle for logfile.