16 integer,
private :: itag
19 double precision,
private :: rk2_alfa
23 logical,
private :: stagger_mark_dat=.false.
26 character(len=*),
parameter ::
fmt_r =
'es16.8'
27 character(len=*),
parameter ::
fmt_r2 =
'es10.2'
28 character(len=*),
parameter ::
fmt_i =
'i8'
40 integer :: len, stat, n, i, ipars
41 integer,
parameter :: max_files = 20
42 integer :: n_par_files
43 character(len=max_files*std_len) :: all_par_files
44 character(len=std_len) :: tmp_files(max_files), arg
45 logical :: unknown_arg, help, morepars
48 print *,
'-----------------------------------------------------------------------------'
49 print *,
'-----------------------------------------------------------------------------'
50 print *,
'| __ __ ____ ___ _ __ __ ______ ___ ____ |'
51 print *,
'| | \/ | _ \_ _| / \ | \/ | _ \ \ / / \ / ___| |'
52 print *,
'| | |\/| | |_) | |_____ / _ \ | |\/| | |_) \ \ / / _ \| | |'
53 print *,
'| | | | | __/| |_____/ ___ \| | | | _ < \ V / ___ \ |___ |'
54 print *,
'| |_| |_|_| |___| /_/ \_\_| |_|_| \_\ \_/_/ \_\____| |'
55 print *,
'-----------------------------------------------------------------------------'
56 print *,
'-----------------------------------------------------------------------------'
62 all_par_files=
"amrvac.par"
75 CALL get_command_argument(i, arg)
76 IF (len_trim(arg) == 0)
EXIT
80 CALL get_command_argument(i, arg)
82 all_par_files=trim(arg)
85 do while (ipars<max_files.and.morepars)
86 CALL get_command_argument(i+ipars,arg)
88 if (index(trim(arg),
"-")==1.or.len_trim(arg)==0)
then
92 all_par_files=trim(all_par_files)//
" "//trim(arg)
101 CALL get_command_argument(i, arg)
106 CALL get_command_argument(i, arg)
109 case(
"-collapsenext")
111 CALL get_command_argument(i, arg)
114 case(
"-snapshotnext")
116 CALL get_command_argument(i, arg)
124 if(
mype==0)print *,
'convert specified: convert=T'
125 case(
"--help",
"-help")
136 if (unknown_arg)
then
137 print*,
"======================================="
138 print*,
"Error: Command line argument ' ",trim(arg),
" ' not recognized"
139 print*,
"======================================="
146 print *,
'Usage example:'
147 print *,
'mpirun -np 4 ./amrvac -i file.par [file2.par ...]'
148 print *,
' (later .par files override earlier ones)'
150 print *,
'Optional arguments:'
151 print *,
'-convert Convert snapshot files'
152 print *,
'-if file0001.dat Use this snapshot to restart from'
153 print *,
' (you can modify e.g. output names)'
154 print *,
'-resume Automatically resume previous run'
155 print *,
' (useful for long runs on HPC systems)'
156 print *,
'-snapshotnext N Manual index for next snapshot'
157 print *,
'-slicenext N Manual index for next slice output'
158 print *,
'-collapsenext N Manual index for next collapsed output'
167 tmp_files, n_par_files)
185 logical :: fileopen, file_exists
186 integer :: i, j, k, ifile, io_state
187 integer :: iB, isave, iw, level, idim, islice
188 integer :: nx_vec(^ND), block_nx_vec(^ND)
189 integer :: my_unit, iostate
191 double precision :: dx_vec(^ND)
194 character(len=80) :: fmt_string
195 character(len=std_len) :: err_msg, restart_from_file_arg
196 character(len=std_len) :: basename_full, basename_prev, dummy_file
197 character(len=std_len),
dimension(:),
allocatable :: &
198 typeboundary_min^D, typeboundary_max^D
199 character(len=std_len),
allocatable :: limiter(:)
200 character(len=std_len),
allocatable :: gradient_limiter(:)
201 character(len=name_len) :: stretch_dim(ndim)
204 character(len=std_len) :: typesourcesplit
206 character(len=std_len),
allocatable :: flux_scheme(:)
208 character(len=std_len) :: typeboundspeed
210 character(len=std_len) :: time_stepper
212 character(len=std_len) :: time_integrator
214 character(len=std_len) :: typecurl
216 character(len=std_len) :: typeprolonglimit
222 character(len=std_len) :: typecourant
224 double precision,
dimension(nsavehi) :: tsave_log, tsave_dat, tsave_slice, &
225 tsave_collapsed, tsave_custom
226 double precision :: dtsave_log, dtsave_dat, dtsave_slice, &
227 dtsave_collapsed, dtsave_custom
228 integer :: ditsave_log, ditsave_dat, ditsave_slice, &
229 ditsave_collapsed, ditsave_custom
230 double precision :: tsavestart_log, tsavestart_dat, tsavestart_slice, &
231 tsavestart_collapsed, tsavestart_custom
232 integer :: windex, ipower
233 double precision :: sizeuniformpart^D
234 double precision :: im_delta,im_nu,rka54,rka51,rkb54,rka55
247 tsave_log, tsave_dat, tsave_slice, tsave_collapsed, tsave_custom, &
248 dtsave_log, dtsave_dat, dtsave_slice, dtsave_collapsed, dtsave_custom, &
249 ditsave_log, ditsave_dat, ditsave_slice, ditsave_collapsed, ditsave_custom,&
250 tsavestart_log, tsavestart_dat, tsavestart_slice, tsavestart_collapsed,&
256 namelist /methodlist/ time_stepper,time_integrator, &
315 allocate(typeboundary_min^d(nwfluxbc))
316 allocate(typeboundary_max^d(nwfluxbc))
379 typeprolonglimit =
'default'
417 tsave(isave,ifile) = bigdouble
418 itsave(isave,ifile) = biginteger
427 tsave_log = bigdouble
428 tsave_dat = bigdouble
429 tsave_slice = bigdouble
430 tsave_collapsed = bigdouble
431 tsave_custom = bigdouble
433 dtsave_log = bigdouble
434 dtsave_dat = bigdouble
435 dtsave_slice = bigdouble
436 dtsave_collapsed = bigdouble
437 dtsave_custom = bigdouble
439 ditsave_log = biginteger
440 ditsave_dat = biginteger
441 ditsave_slice = biginteger
442 ditsave_collapsed = biginteger
443 ditsave_custom = biginteger
445 tsavestart_log = bigdouble
446 tsavestart_dat = bigdouble
447 tsavestart_slice = bigdouble
448 tsavestart_collapsed = bigdouble
449 tsavestart_custom = bigdouble
469 typecourant =
'maxsum'
479 typeboundspeed =
'Einfeldt'
481 time_stepper =
'twostep'
482 time_integrator =
'default'
514 flux_scheme(level) =
'tvdlf'
516 limiter(level) =
'minmod'
517 gradient_limiter(level) =
'minmod'
522 typesourcesplit =
'sfs'
549 if(i==j.or.j==k.or.k==i)
then
551 else if(i+1==j.or.i-2==j)
then
568 inquire(file=trim(
par_files(i)), exist=file_exists)
570 if (.not. file_exists)
then
571 write(err_msg, *)
"The parameter file " // trim(
par_files(i)) // &
581 read(
unitpar, filelist,
end=101)
584 read(unitpar, savelist,
end=102)
587 read(unitpar, stoplist,
end=103)
590 read(unitpar, methodlist,
end=104)
593 read(unitpar, boundlist,
end=105)
596 read(unitpar, meshlist,
end=106)
599 read(unitpar, paramlist,
end=107)
602 read(unitpar, emissionlist,
end=108)
607 if (base_filename /= basename_prev) &
608 basename_full = trim(basename_full) // trim(base_filename)
609 basename_prev = base_filename
612 base_filename = basename_full
616 dummy_file = trim(base_filename)//
"DUMMY"
617 open(newunit=my_unit, file=trim(dummy_file), iostat=iostate)
618 if (iostate /= 0)
then
619 call mpistop(
"Can't write to output directory (" // &
620 trim(base_filename) //
")")
622 close(my_unit, status=
'delete')
626 if(source_split_usr) any_source_split=.true.
629 if(restart_from_file_arg /= undefined) &
630 restart_from_file=restart_from_file_arg
634 if(restart_from_file == undefined)
then
637 do index_latest_data = 9999, 0, -1
643 if(.not.file_exists) index_latest_data=-1
649 call mpi_bcast(index_latest_data, 1, mpi_integer, 0, icomm, ierrmpi)
651 if (resume_previous_run)
then
652 if (index_latest_data == -1)
then
653 if(mype==0)
write(*,*)
"No snapshots found to resume from, start a new run..."
656 write(restart_from_file,
"(a,i4.4,a)") trim(base_filename),index_latest_data,
".dat"
660 if (restart_from_file == undefined)
then
665 call mpistop(
"Please restart from a snapshot when firstprocess=T")
667 call mpistop(
'Change convert to .false. for a new run!')
670 if (small_pressure < 0.d0)
call mpistop(
"small_pressure should be positive.")
671 if (small_density < 0.d0)
call mpistop(
"small_density should be positive.")
673 if (small_temperature>0.d0) small_pressure=small_density*small_temperature
675 if(convert) autoconvert=.false.
677 where (tsave_log < bigdouble) tsave(:, 1) = tsave_log
678 where (tsave_dat < bigdouble) tsave(:, 2) = tsave_dat
679 where (tsave_slice < bigdouble) tsave(:, 3) = tsave_slice
680 where (tsave_collapsed < bigdouble) tsave(:, 4) = tsave_collapsed
681 where (tsave_custom < bigdouble) tsave(:, 5) = tsave_custom
683 if (dtsave_log < bigdouble) dtsave(1) = dtsave_log
684 if (dtsave_dat < bigdouble) dtsave(2) = dtsave_dat
685 if (dtsave_slice < bigdouble) dtsave(3) = dtsave_slice
686 if (dtsave_collapsed < bigdouble) dtsave(4) = dtsave_collapsed
687 if (dtsave_custom < bigdouble) dtsave(5) = dtsave_custom
689 if (tsavestart_log < bigdouble) tsavestart(1) = tsavestart_log
690 if (tsavestart_dat < bigdouble) tsavestart(2) = tsavestart_dat
691 if (tsavestart_slice < bigdouble) tsavestart(3) = tsavestart_slice
692 if (tsavestart_collapsed < bigdouble) tsavestart(4) = tsavestart_collapsed
693 if (tsavestart_custom < bigdouble) tsavestart(5) = tsavestart_custom
695 if (ditsave_log < bigdouble) ditsave(1) = ditsave_log
696 if (ditsave_dat < bigdouble) ditsave(2) = ditsave_dat
697 if (ditsave_slice < bigdouble) ditsave(3) = ditsave_slice
698 if (ditsave_collapsed < bigdouble) ditsave(4) = ditsave_collapsed
699 if (ditsave_custom < bigdouble) ditsave(5) = ditsave_custom
701 if (wall_time_max < bigdouble) wall_time_max=wall_time_max*3600.d0
704 write(unitterm, *)
''
705 write(unitterm, *)
'Output type | tsavestart | dtsave | ditsave | itsave(1) | tsave(1)'
706 write(fmt_string, *)
'(A12," | ",E9.3E2," | ",E9.3E2," | ",I6," | "'//&
711 if (mype == 0)
write(unitterm, fmt_string) trim(output_names(ifile)), &
712 tsavestart(ifile), dtsave(ifile), ditsave(ifile), itsave(1, ifile), tsave(1, ifile)
715 if (mype == 0)
write(unitterm, *)
''
718 if(slicedir(islice) > ndim) &
719 write(uniterr,*)
'Warning in read_par_files: ', &
720 'Slice ', islice,
' direction',slicedir(islice),
'larger than ndim=',ndim
721 if(slicedir(islice) < 1) &
722 write(uniterr,*)
'Warning in read_par_files: ', &
723 'Slice ', islice,
' direction',slicedir(islice),
'too small, should be [',1,ndim,
']'
726 if(it_max==biginteger .and. time_max==bigdouble.and.mype==0)
write(uniterr,*) &
727 'Warning in read_par_files: it_max or time_max not given!'
729 select case (typecourant)
731 type_courant=type_maxsum
733 type_courant=type_summax
735 type_courant=type_minimum
737 write(unitterm,*)
'Unknown typecourant=',typecourant
738 call mpistop(
"Error from read_par_files: no such typecourant!")
742 select case (flux_scheme(level))
744 flux_method(level)=fs_hll
746 flux_method(level)=fs_hllc
748 flux_method(level)=fs_hlld
750 flux_method(level)=fs_hllcd
752 flux_method(level)=fs_tvdlf
754 flux_method(level)=fs_tvdmu
756 flux_method(level)=fs_tvd
758 flux_method(level)=fs_cd
760 flux_method(level)=fs_cd4
762 flux_method(level)=fs_fd
764 flux_method(level)=fs_source
766 flux_method(level)=fs_nul
768 call mpistop(
"unkown or bad flux scheme")
770 if(flux_scheme(level)==
'tvd'.and.time_stepper/=
'onestep') &
771 call mpistop(
" tvd is onestep method, reset time_stepper='onestep'")
772 if(flux_scheme(level)==
'tvd')
then
773 if(mype==0.and.(.not.dimsplit))
write(unitterm,*) &
774 'Warning: setting dimsplit=T for tvd, as used for level=',level
777 if(flux_scheme(level)==
'hlld'.and.physics_type/=
'mhd' .and. physics_type/=
'twofl') &
778 call mpistop(
"Cannot use hlld flux if not using MHD or 2FL only charges physics!")
780 if(flux_scheme(level)==
'hllc'.and.physics_type==
'mf') &
781 call mpistop(
"Cannot use hllc flux if using magnetofriction physics!")
783 if(flux_scheme(level)==
'tvd'.and.physics_type==
'mf') &
784 call mpistop(
"Cannot use tvd flux if using magnetofriction physics!")
786 if(flux_scheme(level)==
'tvdmu'.and.physics_type==
'mf') &
787 call mpistop(
"Cannot use tvdmu flux if using magnetofriction physics!")
789 if (typepred1(level)==0)
then
790 select case (flux_scheme(level))
792 typepred1(level)=fs_cd
794 typepred1(level)=fs_cd4
796 typepred1(level)=fs_fd
797 case (
'tvdlf',
'tvdmu')
798 typepred1(level)=fs_hancock
800 typepred1(level)=fs_hll
802 typepred1(level)=fs_hllc
804 typepred1(level)=fs_hllcd
806 typepred1(level)=fs_hlld
807 case (
'nul',
'source',
'tvd')
808 typepred1(level)=fs_nul
810 call mpistop(
"No default predictor for this full step")
816 if(any(flux_scheme==
'fd')) need_global_cmax=.true.
817 if(any(limiter==
'schmid1')) need_global_a2max=.true.
820 select case (typecurl)
826 type_curl=stokesbased
828 write(unitterm,*)
"typecurl=",typecurl
829 call mpistop(
"unkown type of curl operator in read_par_files")
833 select case (time_stepper)
837 if (time_integrator==
'default')
then
838 time_integrator=
"Forward_Euler"
840 select case (time_integrator)
841 case (
"Forward_Euler")
842 t_integrator=forward_euler
844 t_integrator=imex_euler
848 write(unitterm,*)
"time_integrator=",time_integrator,
"time_stepper=",time_stepper
849 call mpistop(
"unkown onestep time_integrator in read_par_files")
851 use_imex_scheme=(t_integrator==imex_euler.or.t_integrator==imex_sp)
855 if (time_integrator==
'default')
then
856 time_integrator=
"Predictor_Corrector"
858 select case (time_integrator)
859 case (
"Predictor_Corrector")
860 t_integrator=predictor_corrector
865 case (
"IMEX_Midpoint")
866 t_integrator=imex_midpoint
867 case (
"IMEX_Trapezoidal")
868 t_integrator=imex_trapezoidal
870 t_integrator=imex_222
872 write(unitterm,*)
"time_integrator=",time_integrator,
"time_stepper=",time_stepper
873 call mpistop(
"unkown twostep time_integrator in read_par_files")
875 use_imex_scheme=(t_integrator==imex_midpoint.or.t_integrator==imex_trapezoidal&
876 .or.t_integrator==imex_222)
877 if (t_integrator==rk2_alf)
then
878 if(rk2_alfa<smalldouble.or.rk2_alfa>one)
call mpistop(
"set rk2_alfa within [0,1]")
880 rk_b2=1.0d0/(2.0d0*rk2_alfa)
886 if (time_integrator==
'default')
then
887 time_integrator=
'ssprk3'
889 select case (time_integrator)
895 t_integrator=imex_ars3
897 t_integrator=imex_232
899 t_integrator=imex_cb3a
901 write(unitterm,*)
"time_integrator=",time_integrator,
"time_stepper=",time_stepper
902 call mpistop(
"unkown threestep time_integrator in read_par_files")
904 if(t_integrator==rk3_bt)
then
905 select case(rk3_switch)
935 call mpistop(
"Unknown rk3_switch")
938 rk3_b3=1.0d0-rk3_b1-rk3_b2
940 rk3_c3=rk3_a31+rk3_a32
942 if(t_integrator==ssprk3)
then
943 select case(ssprk_order)
946 rk_beta22=1.0d0/4.0d0
947 rk_beta33=2.0d0/3.0d0
948 rk_alfa21=3.0d0/4.0d0
949 rk_alfa31=1.0d0/3.0d0
953 rk_beta11=1.0d0/2.0d0
954 rk_beta22=1.0d0/2.0d0
955 rk_beta33=1.0d0/3.0d0
957 rk_alfa31=1.0d0/3.0d0
961 call mpistop(
"Unknown ssprk3_order")
963 rk_alfa22=1.0d0-rk_alfa21
964 rk_alfa33=1.0d0-rk_alfa31
966 if(t_integrator==imex_ars3)
then
967 ars_gamma=(3.0d0+dsqrt(3.0d0))/6.0d0
969 if(t_integrator==imex_232)
then
970 select case(imex_switch)
972 im_delta=1.0d0-1.0d0/dsqrt(2.0d0)
973 im_nu=(3.0d0+2.0d0*dsqrt(2.0d0))/6.0d0
974 imex_a21=2.0d0*im_delta
977 imex_b1=1.0d0/(2.0d0*dsqrt(2.0d0))
978 imex_b2=1.0d0/(2.0d0*dsqrt(2.0d0))
983 imex_a21=0.711664700366941d0
984 imex_a31=0.077338168947683d0
985 imex_a32=0.917273367886007d0
986 imex_b1=0.398930808264688d0
987 imex_b2=0.345755244189623d0
988 imex_ha21=0.353842865099275d0
989 imex_ha22=0.353842865099275d0
991 call mpistop(
"Unknown imex_siwtch")
994 imex_c3=imex_a31+imex_a32
995 imex_b3=1.0d0-imex_b1-imex_b2
997 if(t_integrator==imex_cb3a)
then
998 imex_c2 = 0.8925502329346865
1001 imex_c3 = imex_c2 / (6.0d0*imex_c2**2 - 3.0d0*imex_c2 + 1.0d0)
1003 imex_b2 = (3.0d0*imex_c2 - 1.0d0) / (6.0d0*imex_c2**2)
1004 imex_b3 = (6.0d0*imex_c2**2 - 3.0d0*imex_c2 + 1.0d0) / (6.0d0*imex_c2**2)
1005 imex_a33 = (1.0d0/6.0d0 - imex_b2*imex_c2**2 - imex_b3*imex_c2*imex_c3) / (imex_b3*(imex_c3-imex_c2))
1006 imex_a32 = imex_c3 - imex_a33
1020 use_imex_scheme=(t_integrator==imex_ars3.or.t_integrator==imex_232.or.t_integrator==imex_cb3a)
1024 if (time_integrator==
'default')
then
1025 time_integrator=
"ssprk4"
1027 select case (time_integrator)
1033 write(unitterm,*)
"time_integrator=",time_integrator,
"time_stepper=",time_stepper
1034 call mpistop(
"unkown fourstep time_integrator in read_par_files")
1036 if(t_integrator==ssprk4)
then
1037 select case(ssprk_order)
1039 rk_beta11=1.0d0/2.0d0
1040 rk_beta22=1.0d0/2.0d0
1041 rk_beta33=1.0d0/6.0d0
1042 rk_beta44=1.0d0/2.0d0
1044 rk_alfa31=2.0d0/3.0d0
1050 rk_beta11=1.0d0/3.0d0
1051 rk_beta22=1.0d0/3.0d0
1052 rk_beta33=1.0d0/3.0d0
1053 rk_beta44=1.0d0/4.0d0
1056 rk_alfa41=1.0d0/4.0d0
1061 call mpistop(
"Unknown ssprk_order")
1063 rk_alfa22=1.0d0-rk_alfa21
1064 rk_alfa33=1.0d0-rk_alfa31
1065 rk_alfa44=1.0d0-rk_alfa41
1070 if (time_integrator==
'default')
then
1071 time_integrator=
"ssprk5"
1073 select case (time_integrator)
1077 write(unitterm,*)
"time_integrator=",time_integrator,
"time_stepper=",time_stepper
1078 call mpistop(
"unkown fivestep time_integrator in read_par_files")
1080 if(t_integrator==ssprk5)
then
1081 select case(ssprk_order)
1084 rk_beta11=0.391752226571890d0
1085 rk_beta22=0.368410593050371d0
1086 rk_beta33=0.251891774271694d0
1087 rk_beta44=0.544974750228521d0
1088 rk_beta54=0.063692468666290d0
1089 rk_beta55=0.226007483236906d0
1090 rk_alfa21=0.444370493651235d0
1091 rk_alfa31=0.620101851488403d0
1092 rk_alfa41=0.178079954393132d0
1093 rk_alfa53=0.517231671970585d0
1094 rk_alfa54=0.096059710526147d0
1096 rk_alfa22=0.555629506348765d0
1097 rk_alfa33=0.379898148511597d0
1098 rk_alfa44=0.821920045606868d0
1099 rk_alfa55=0.386708617503269d0
1100 rk_alfa22=1.0d0-rk_alfa21
1101 rk_alfa33=1.0d0-rk_alfa31
1102 rk_alfa44=1.0d0-rk_alfa41
1103 rk_alfa55=1.0d0-rk_alfa53-rk_alfa54
1105 rk_c3=rk_alfa22*rk_c2+rk_beta22
1106 rk_c4=rk_alfa33*rk_c3+rk_beta33
1107 rk_c5=rk_alfa44*rk_c4+rk_beta44
1109 rk_beta11=0.39175222700392d0
1110 rk_beta22=0.36841059262959d0
1111 rk_beta33=0.25189177424738d0
1112 rk_beta44=0.54497475021237d0
1115 rk_alfa21=0.44437049406734d0
1116 rk_alfa31=0.62010185138540d0
1117 rk_alfa41=0.17807995410773d0
1118 rk_alfa53=0.51723167208978d0
1121 rk_alfa22=1.0d0-rk_alfa21
1122 rk_alfa33=1.0d0-rk_alfa31
1123 rk_alfa44=1.0d0-rk_alfa41
1125 rka51=0.00683325884039d0
1126 rka54=0.12759831133288d0
1127 rkb54=0.08460416338212d0
1128 rk_beta54=rkb54-rk_beta44*rka51/rk_alfa41
1129 rk_alfa54=rka54-rk_alfa44*rka51/rk_alfa41
1131 rk_alfa55=1.0d0-rk_alfa53-rk_alfa54
1133 rk_c3=rk_alfa22*rk_c2+rk_beta22
1134 rk_c4=rk_alfa33*rk_c3+rk_beta33
1135 rk_c5=rk_alfa44*rk_c4+rk_beta44
1136 rk_beta55=1.0d0-rk_beta54-rk_alfa53*rk_c3-rk_alfa54*rk_c4-rk_alfa55*rk_c5
1138 call mpistop(
"Unknown ssprk_order")
1147 use_imex_scheme=.false.
1149 call mpistop(
"Unknown time_stepper in read_par_files")
1153 select case (stretch_dim(i))
1154 case (undefined,
'none')
1155 stretch_type(i) = stretch_none
1156 stretched_dim(i) = .false.
1157 case (
'uni',
'uniform')
1158 stretch_type(i) = stretch_uni
1159 stretched_dim(i) = .true.
1160 case (
'symm',
'symmetric')
1161 stretch_type(i) = stretch_symm
1162 stretched_dim(i) = .true.
1164 stretch_type(i) = stretch_none
1165 stretched_dim(i) = .false.
1166 if (mype == 0) print *,
'Got stretch_type = ', stretch_type(i)
1167 call mpistop(
'Unknown stretch type')
1172 if(typedimsplit ==
'default'.and. dimsplit) typedimsplit=
'xyyx'
1173 if(typedimsplit ==
'default'.and..not.dimsplit) typedimsplit=
'unsplit'
1174 dimsplit = typedimsplit /=
'unsplit'
1177 select case (typesourcesplit)
1179 sourcesplit=sourcesplit_sfs
1181 sourcesplit=sourcesplit_sf
1183 sourcesplit=sourcesplit_ssf
1185 sourcesplit=sourcesplit_ssfss
1187 write(unitterm,*)
'No such typesourcesplit=',typesourcesplit
1188 call mpistop(
"Error: Unknown typesourcesplit!")
1191 if(coordinate==-1)
then
1192 coordinate=cartesian
1194 write(*,*)
'Warning: coordinate system is not specified!'
1195 write(*,*)
'call set_coordinate_system in usr_init in mod_usr.t'
1196 write(*,*)
'Now use Cartesian coordinate'
1200 if(coordinate==cartesian)
then
1203 if(any(stretched_dim))
then
1204 coordinate=cartesian_stretched
1205 slab_uniform=.false.
1209 slab_uniform=.false.
1212 if(coordinate==spherical)
then
1214 if(mype==0)print *,
'Warning: spherical symmetry needs dimsplit=F, resetting'
1219 if (ndim==1) dimsplit=.false.
1222 select case(typeprolonglimit)
1237 allocate(type_limiter(nlevelshi))
1238 allocate(type_gradient_limiter(nlevelshi))
1240 do level=1,nlevelshi
1241 type_limiter(level) = limiter_type(limiter(level))
1242 type_gradient_limiter(level) = limiter_type(gradient_limiter(level))
1245 if (any(limiter(1:nlevelshi)==
'ppm')&
1246 .and.(flatsh.and.physics_type==
'rho'))
then
1247 call mpistop(
" PPM with flatsh=.true. can not be used with physics_type='rho'!")
1253 select case(typeboundary_min^d(iw))
1255 typeboundary(iw,2*^d-1)=bc_special
1257 typeboundary(iw,2*^d-1)=bc_cont
1259 typeboundary(iw,2*^d-1)=bc_symm
1261 typeboundary(iw,2*^d-1)=bc_asymm
1263 typeboundary(iw,2*^d-1)=bc_periodic
1265 typeboundary(iw,2*^d-1)=bc_aperiodic
1267 typeboundary(iw,2*^d-1)=bc_noinflow
1269 typeboundary(iw,2*^d-1)=12
1271 typeboundary(iw,2*^d-1)=bc_data
1273 typeboundary(iw,2*^d-1)=bc_icarus
1275 typeboundary(iw,2*^d-1)=bc_character
1277 write (unitterm,*)
"Undefined boundarytype found in read_par_files", &
1278 typeboundary_min^d(iw),
"for variable iw=",iw,
" and side iB=",2*^d-1
1282 select case(typeboundary_max^d(iw))
1284 typeboundary(iw,2*^d)=bc_special
1286 typeboundary(iw,2*^d)=bc_cont
1288 typeboundary(iw,2*^d)=bc_symm
1290 typeboundary(iw,2*^d)=bc_asymm
1292 typeboundary(iw,2*^d)=bc_periodic
1294 typeboundary(iw,2*^d)=bc_aperiodic
1296 typeboundary(iw,2*^d)=bc_noinflow
1298 typeboundary(iw,2*^d)=12
1300 typeboundary(iw,2*^d)=bc_data
1302 typeboundary(iw,2*^d-1)=bc_icarus
1303 case(
"bc_character")
1304 typeboundary(iw,2*^d)=bc_character
1306 write (unitterm,*)
"Undefined boundarytype found in read_par_files", &
1307 typeboundary_max^d(iw),
"for variable iw=",iw,
" and side iB=",2*^d
1313 if (nwfluxbc<nwflux)
then
1314 do iw = nwfluxbc+1, nwflux
1315 typeboundary(iw,:) = typeboundary(1, :)
1320 do iw = nwflux+1, nwflux+nwaux
1321 typeboundary(iw,:) = typeboundary(1, :)
1325 if (any(typeboundary == 0))
then
1326 call mpistop(
"Not all boundary conditions have been defined")
1330 periodb(idim)=(any(typeboundary(:,2*idim-1:2*idim)==bc_periodic))
1331 aperiodb(idim)=(any(typeboundary(:,2*idim-1:2*idim)==bc_aperiodic))
1332 if (periodb(idim).or.aperiodb(idim))
then
1334 if (typeboundary(iw,2*idim-1) .ne. typeboundary(iw,2*idim)) &
1335 call mpistop(
"Wrong counterpart in periodic boundary")
1337 if (typeboundary(iw,2*idim-1) /= bc_periodic .and. &
1338 typeboundary(iw,2*idim-1) /= bc_aperiodic)
then
1339 call mpistop(
"Each dimension should either have all "//&
1340 "or no variables periodic, some can be aperiodic")
1347 if(any(typeboundary(:,2*idim-1)==12))
then
1348 if(any(typeboundary(:,2*idim-1)/=12)) typeboundary(:,2*idim-1)=12
1349 if(phys_energy)
then
1354 typeboundary(:,2*idim-1)=bc_symm
1355 if(physics_type/=
'rho')
then
1356 select case(coordinate)
1358 typeboundary(phi_+1,2*idim-1)=bc_asymm
1359 if(physics_type==
'mhd') typeboundary(ndir+windex+phi_,2*idim-1)=bc_asymm
1361 typeboundary(3:ndir+1,2*idim-1)=bc_asymm
1362 if(physics_type==
'mhd') typeboundary(ndir+windex+2:ndir+windex+ndir,2*idim-1)=bc_asymm
1364 call mpistop(
'Pole is in cylindrical, polar, spherical coordinates!')
1368 if(any(typeboundary(:,2*idim)==12))
then
1369 if(any(typeboundary(:,2*idim)/=12)) typeboundary(:,2*idim)=12
1370 if(phys_energy)
then
1375 typeboundary(:,2*idim)=bc_symm
1376 if(physics_type/=
'rho')
then
1377 select case(coordinate)
1379 typeboundary(phi_+1,2*idim)=bc_asymm
1380 if(physics_type==
'mhd') typeboundary(ndir+windex+phi_,2*idim)=bc_asymm
1382 typeboundary(3:ndir+1,2*idim)=bc_asymm
1383 if(physics_type==
'mhd') typeboundary(ndir+windex+2:ndir+windex+ndir,2*idim)=bc_asymm
1385 call mpistop(
'Pole is in cylindrical, polar, spherical coordinates!')
1392 if(.not.phys_energy)
then
1397 if(any(limiter(1:nlevelshi)==
'mp5'))
then
1398 nghostcells=max(nghostcells,3)
1401 if(any(limiter(1:nlevelshi)==
'weno5'))
then
1402 nghostcells=max(nghostcells,3)
1405 if(any(limiter(1:nlevelshi)==
'weno5nm'))
then
1406 nghostcells=max(nghostcells,3)
1409 if(any(limiter(1:nlevelshi)==
'wenoz5'))
then
1410 nghostcells=max(nghostcells,3)
1413 if(any(limiter(1:nlevelshi)==
'wenoz5nm'))
then
1414 nghostcells=max(nghostcells,3)
1417 if(any(limiter(1:nlevelshi)==
'wenozp5'))
then
1418 nghostcells=max(nghostcells,3)
1421 if(any(limiter(1:nlevelshi)==
'wenozp5nm'))
then
1422 nghostcells=max(nghostcells,3)
1425 if(any(limiter(1:nlevelshi)==
'teno5ad'))
then
1426 nghostcells=max(nghostcells,3)
1429 if(any(limiter(1:nlevelshi)==
'weno5cu6'))
then
1430 nghostcells=max(nghostcells,3)
1433 if(any(limiter(1:nlevelshi)==
'ppm'))
then
1434 if(flatsh .or. flatcd)
then
1435 nghostcells=max(nghostcells,4)
1437 nghostcells=max(nghostcells,3)
1441 if(any(limiter(1:nlevelshi)==
'weno7'))
then
1442 nghostcells=max(nghostcells,4)
1445 if(any(limiter(1:nlevelshi)==
'mpweno7'))
then
1446 nghostcells=max(nghostcells,4)
1450 nghostcells = nghostcells + phys_wider_stencil
1453 if(stagger_grid .and. refine_max_level>1 .and. mod(nghostcells,2)/=0)
then
1454 nghostcells=nghostcells+1
1457 select case (coordinate)
1460 xprob^lim^de=xprob^lim^de*two*dpi;
1465 xprob^lim^d=xprob^lim^d*two*dpi;
1471 {ixghi^d = block_nx^d + 2*nghostcells\}
1472 {ixgshi^d = ixghi^d\}
1474 nx_vec = [{domain_nx^d|, }]
1475 block_nx_vec = [{block_nx^d|, }]
1477 if (any(nx_vec < 4) .or. any(mod(nx_vec, 2) == 1)) &
1478 call mpistop(
'Grid size (domain_nx^D) has to be even and >= 4')
1480 if (any(block_nx_vec < 4) .or. any(mod(block_nx_vec, 2) == 1)) &
1481 call mpistop(
'Block size (block_nx^D) has to be even and >= 4')
1483 {
if(mod(domain_nx^d,block_nx^d)/=0) &
1484 call mpistop(
'Grid (domain_nx^D) and block (block_nx^D) must be consistent') \}
1486 if(refine_max_level>nlevelshi.or.refine_max_level<1)
then
1487 write(unitterm,*)
'Error: refine_max_level',refine_max_level,
'>nlevelshi ',nlevelshi
1488 call mpistop(
"Reset nlevelshi and recompile!")
1491 if (any(stretched_dim))
then
1492 allocate(qstretch(0:nlevelshi,1:ndim),dxfirst(0:nlevelshi,1:ndim),&
1493 dxfirst_1mq(0:nlevelshi,1:ndim),dxmid(0:nlevelshi,1:ndim))
1494 allocate(nstretchedblocks(1:nlevelshi,1:ndim))
1495 qstretch(0:nlevelshi,1:ndim)=0.0d0
1496 dxfirst(0:nlevelshi,1:ndim)=0.0d0
1497 nstretchedblocks(1:nlevelshi,1:ndim)=0
1498 {
if (stretch_type(^d) == stretch_uni)
then
1500 if(qstretch_baselevel(^d)<1.0d0.or.qstretch_baselevel(^d)==bigdouble)
then
1502 write(*,*)
'stretched grid needs finite qstretch_baselevel>1'
1503 write(*,*)
'will try default value for qstretch_baselevel in dimension', ^d
1505 if(xprobmin^d>smalldouble)
then
1506 qstretch_baselevel(^d)=(xprobmax^d/xprobmin^d)**(1.d0/dble(domain_nx^d))
1508 call mpistop(
"can not set qstretch_baselevel automatically")
1511 if(mod(block_nx^d,2)==1) &
1512 call mpistop(
"stretched grid needs even block size block_nxD")
1513 if(mod(domain_nx^d/block_nx^d,2)/=0) &
1514 call mpistop(
"number level 1 blocks in D must be even")
1515 qstretch(1,^d)=qstretch_baselevel(^d)
1516 dxfirst(1,^d)=(xprobmax^d-xprobmin^d) &
1517 *(1.0d0-qstretch(1,^d))/(1.0d0-qstretch(1,^d)**domain_nx^d)
1518 qstretch(0,^d)=qstretch(1,^d)**2
1519 dxfirst(0,^d)=dxfirst(1,^d)*(1.0d0+qstretch(1,^d))
1520 if(refine_max_level>1)
then
1521 do ilev=2,refine_max_level
1522 qstretch(ilev,^d)=dsqrt(qstretch(ilev-1,^d))
1523 dxfirst(ilev,^d)=dxfirst(ilev-1,^d) &
1524 /(1.0d0+dsqrt(qstretch(ilev-1,^d)))
1529 {
if(stretch_type(^d) == stretch_uni)
then
1530 write(*,*)
'Stretched dimension ', ^d
1531 write(*,*)
'Using stretched grid with qs=',qstretch(0:refine_max_level,^d)
1532 write(*,*)
' and first cell sizes=',dxfirst(0:refine_max_level,^d)
1535 {
if(stretch_type(^d) == stretch_symm)
then
1537 write(*,*)
'will apply symmetric stretch in dimension', ^d
1539 if(mod(block_nx^d,2)==1) &
1540 call mpistop(
"stretched grid needs even block size block_nxD")
1542 if(nstretchedblocks_baselevel(^d)==0) &
1543 call mpistop(
"need finite even number of stretched blocks at baselevel")
1544 if(mod(nstretchedblocks_baselevel(^d),2)==1) &
1545 call mpistop(
"need even number of stretched blocks at baselevel")
1546 if(qstretch_baselevel(^d)<1.0d0.or.qstretch_baselevel(^d)==bigdouble) &
1547 call mpistop(
'stretched grid needs finite qstretch_baselevel>1')
1549 ipower=(nstretchedblocks_baselevel(^d)/2)*block_nx^d
1550 if(nstretchedblocks_baselevel(^d)==domain_nx^d/block_nx^d)
then
1551 xstretch^d=0.5d0*(xprobmax^d-xprobmin^d)
1553 xstretch^d=(xprobmax^d-xprobmin^d) &
1554 /(2.0d0+dble(domain_nx^d-nstretchedblocks_baselevel(^d)*block_nx^d) &
1555 *(1.0d0-qstretch_baselevel(^d))/(1.0d0-qstretch_baselevel(^d)**ipower))
1557 if(xstretch^d>(xprobmax^d-xprobmin^d)*0.5d0) &
1558 call mpistop(
" stretched grid part should not exceed full domain")
1559 dxfirst(1,^d)=xstretch^d*(1.0d0-qstretch_baselevel(^d)) &
1560 /(1.0d0-qstretch_baselevel(^d)**ipower)
1561 nstretchedblocks(1,^d)=nstretchedblocks_baselevel(^d)
1562 qstretch(1,^d)=qstretch_baselevel(^d)
1563 qstretch(0,^d)=qstretch(1,^d)**2
1564 dxfirst(0,^d)=dxfirst(1,^d)*(1.0d0+qstretch(1,^d))
1565 dxmid(1,^d)=dxfirst(1,^d)
1566 dxmid(0,^d)=dxfirst(1,^d)*2.0d0
1567 if(refine_max_level>1)
then
1568 do ilev=2,refine_max_level
1569 nstretchedblocks(ilev,^d)=2*nstretchedblocks(ilev-1,^d)
1570 qstretch(ilev,^d)=dsqrt(qstretch(ilev-1,^d))
1571 dxfirst(ilev,^d)=dxfirst(ilev-1,^d) &
1572 /(1.0d0+dsqrt(qstretch(ilev-1,^d)))
1573 dxmid(ilev,^d)=dxmid(ilev-1,^d)/2.0d0
1577 sizeuniformpart^d=dxfirst(1,^d) &
1578 *(domain_nx^d-nstretchedblocks_baselevel(^d)*block_nx^d)
1580 print *,
'uniform part of size=',sizeuniformpart^d
1581 print *,
'setting of domain is then=',2*xstretch^d+sizeuniformpart^d
1582 print *,
'versus=',xprobmax^d-xprobmin^d
1584 if(dabs(xprobmax^d-xprobmin^d-2*xstretch^d-sizeuniformpart^d)>smalldouble)
then
1585 call mpistop(
'mismatch in domain size!')
1588 dxfirst_1mq(0:refine_max_level,1:ndim)=dxfirst(0:refine_max_level,1:ndim) &
1589 /(1.0d0-qstretch(0:refine_max_level,1:ndim))
1592 dx_vec = [{xprobmax^d-xprobmin^d|, }] / nx_vec
1595 write(c_ndim,
'(I1)') ^nd
1596 write(unitterm,
'(A30,' // c_ndim //
'(I0," "))') &
1597 ' Domain size (cells): ', nx_vec
1598 write(unitterm,
'(A30,' // c_ndim //
'(E9.3," "))') &
1599 ' Level one dx: ', dx_vec
1602 if (any(dx_vec < smalldouble)) &
1603 call mpistop(
"Incorrect domain size (too small grid spacing)")
1607 if(sum(w_refine_weight(:))==0) w_refine_weight(1) = 1.d0
1608 if(dabs(sum(w_refine_weight(:))-1.d0)>smalldouble)
then
1609 write(unitterm,*)
"Sum of all elements in w_refine_weight be 1.d0"
1610 call mpistop(
"Reset w_refine_weight so the sum is 1.d0")
1613 select case (typeboundspeed)
1618 case(
'cmaxleftright')
1621 call mpistop(
"set typeboundspeed='Einfieldt' or 'cmaxmean' or 'cmaxleftright'")
1624 if (mype==0)
write(unitterm,
'(A30)', advance=
'no')
'Refine estimation: '
1626 select case (refine_criterion)
1628 if (mype==0)
write(unitterm,
'(A)')
"user defined"
1630 if (mype==0)
write(unitterm,
'(A)')
"relative error"
1632 if (mype==0)
write(unitterm,
'(A)')
"Lohner's original scheme"
1634 if (mype==0)
write(unitterm,
'(A)')
"Lohner's scheme"
1636 call mpistop(
"Unknown error estimator, change refine_criterion")
1639 if (tfixgrid<bigdouble/2.0d0)
then
1640 if(mype==0)print*,
'Warning, at time=',tfixgrid,
'the grid will be fixed'
1642 if (itfixgrid<biginteger/2)
then
1643 if(mype==0)print*,
'Warning, at iteration=',itfixgrid,
'the grid will be fixed'
1645 if (ditregrid>1)
then
1646 if(mype==0)print*,
'Note, Grid is reconstructed once every',ditregrid,
'iterations'
1651 select case(slicedir(islice))
1653 if(slicecoord(islice)<xprobmin^d.or.slicecoord(islice)>xprobmax^d) &
1654 write(uniterr,*)
'Warning in read_par_files: ', &
1655 'Slice ', islice,
' coordinate',slicecoord(islice),
'out of bounds for dimension ',slicedir(islice)
1661 write(unitterm,
'(A30,A,A)')
'restart_from_file: ',
' ', trim(restart_from_file)
1662 write(unitterm,
'(A30,L1)')
'converting: ', convert
1663 write(unitterm,
'(A)')
''
1666 deallocate(flux_scheme)
1673 character(len=*),
intent(in) :: line
1675 character(len=*),
intent(in) :: delims
1677 integer,
intent(in) :: n_max
1679 integer,
intent(inout) :: n_found
1681 character(len=*),
intent(inout) :: fields(n_max)
1682 logical,
intent(out),
optional :: fully_read
1684 integer :: ixs_start(n_max)
1685 integer :: ixs_end(n_max)
1686 integer :: ix, ix_prev
1691 do while (n_found < n_max)
1693 ix = verify(line(ix_prev+1:), delims)
1696 n_found = n_found + 1
1697 ixs_start(n_found) = ix_prev + ix
1700 ix = scan(line(ixs_start(n_found)+1:), delims) - 1
1703 ixs_end(n_found) = len(line)
1705 ixs_end(n_found) = ixs_start(n_found) + ix
1708 fields(n_found) = line(ixs_start(n_found):ixs_end(n_found))
1709 ix_prev = ixs_end(n_found)
1712 if (
present(fully_read))
then
1713 ix = verify(line(ix_prev+1:), delims)
1714 fully_read = (ix == 0)
1748 case (
'regression_test')
1752 call mpistop(
"usr_print_log not defined")
1757 call mpistop(
"Error in SaveFile: Unknown typefilelog")
1764 write(*,*)
'No save method is defined for ifile=',ifile
1777 integer,
intent(in) :: ix
1778 character(len=std_len) :: filename
1780 write(filename,
"(a,i4.4,a)") trim(
base_filename), ix,
".dat"
1785 character(len=*),
intent(in) :: filename
1789 i = len_trim(filename) - 7
1805 integer,
intent(in) :: fh
1806 integer(kind=MPI_OFFSET_KIND),
intent(in) :: offset_tree
1807 integer(kind=MPI_OFFSET_KIND),
intent(in) :: offset_block
1820 integer,
intent(in) :: fh
1821 integer(MPI_OFFSET_KIND),
intent(out) :: offset_tree
1822 integer(MPI_OFFSET_KIND),
intent(out) :: offset_block
1823 integer :: i, version
1824 integer :: ibuf(ndim), iw
1825 double precision :: rbuf(ndim)
1826 integer,
dimension(MPI_STATUS_SIZE) :: st
1827 character(len=name_len),
allocatable :: var_names(:), param_names(:)
1828 double precision,
allocatable :: params(:)
1829 character(len=name_len) :: phys_name, geom_name
1830 integer :: er, n_par, tmp_int
1831 logical :: periodic(ndim)
1834 call mpi_file_read(fh, version, 1, mpi_integer, st, er)
1836 call mpistop(
"Incompatible file version (maybe old format?)")
1840 call mpi_file_read(fh, ibuf(1), 1, mpi_integer, st, er)
1841 offset_tree = ibuf(1)
1844 call mpi_file_read(fh, ibuf(1), 1, mpi_integer, st, er)
1845 offset_block = ibuf(1)
1848 call mpi_file_read(fh, ibuf(1), 1, mpi_integer, st, er)
1850 if (nw /= ibuf(1))
then
1851 write(*,*)
"nw=",nw,
" and nw found in restart file=",ibuf(1)
1852 write(*,*)
"Please be aware of changes in w at restart."
1857 call mpi_file_read(fh, ibuf(1), 1, mpi_integer, st, er)
1858 if (ibuf(1) /=
ndir)
then
1859 write(*,*)
"ndir in restart file = ",ibuf(1)
1860 write(*,*)
"ndir = ",
ndir
1861 call mpistop(
"reset ndir to ndir in restart file")
1865 call mpi_file_read(fh, ibuf(1), 1, mpi_integer, st, er)
1866 if (ibuf(1) /= ndim)
then
1867 write(*,*)
"ndim in restart file = ",ibuf(1)
1868 write(*,*)
"ndim = ",ndim
1869 call mpistop(
"reset ndim to ndim in restart file")
1873 call mpi_file_read(fh, ibuf(1), 1, mpi_integer, st, er)
1875 write(*,*)
"number of levels in restart file = ",ibuf(1)
1877 call mpistop(
"refine_max_level < num. levels in restart file")
1881 call mpi_file_read(fh,
nleafs, 1, mpi_integer, st, er)
1884 call mpi_file_read(fh,
nparents, 1, mpi_integer, st, er)
1887 call mpi_file_read(fh,
it, 1, mpi_integer, st, er)
1890 call mpi_file_read(fh,
global_time, 1, mpi_double_precision, st, er)
1893 call mpi_file_read(fh,rbuf(1:ndim),ndim,mpi_double_precision,st,er)
1894 if (maxval(abs(rbuf(1:ndim) - [ xprobmin^
d ])) > 0)
then
1895 write(*,*)
"Error: xprobmin differs from restart data: ", rbuf(1:ndim)
1896 call mpistop(
"change xprobmin^D in par file")
1900 call mpi_file_read(fh,rbuf(1:ndim),ndim,mpi_double_precision,st,er)
1901 if (maxval(abs(rbuf(1:ndim) - [ xprobmax^
d ])) > 0)
then
1902 write(*,*)
"Error: xprobmax differs from restart data: ", rbuf(1:ndim)
1903 call mpistop(
"change xprobmax^D in par file")
1907 call mpi_file_read(fh,ibuf(1:ndim), ndim, mpi_integer,st,er)
1908 if (any(ibuf(1:ndim) /= [
domain_nx^
d ]))
then
1909 write(*,*)
"Error: mesh size differs from restart data: ", ibuf(1:ndim)
1910 call mpistop(
"change domain_nx^D in par file")
1914 call mpi_file_read(fh,ibuf(1:ndim), ndim, mpi_integer,st,er)
1915 if (any(ibuf(1:ndim) /= [
block_nx^
d ]))
then
1916 write(*,*)
"Error: block size differs from restart data:", ibuf(1:ndim)
1917 call mpistop(
"change block_nx^D in par file")
1921 if (version > 4)
then
1922 call mpi_file_read(fh, periodic, ndim, mpi_logical, st, er)
1923 if ({periodic(^
d) .and. .not.
periodb(^
d) .or. .not.periodic(^
d) .and.
periodb(^
d)| .or. }) &
1924 call mpistop(
"change in periodicity in par file")
1926 call mpi_file_read(fh, geom_name, name_len, mpi_character, st, er)
1929 write(*,*)
"type of coordinates in data is: ", geom_name
1930 call mpistop(
"select the correct coordinates in mod_usr.t file")
1933 call mpi_file_read(fh, stagger_mark_dat, 1, mpi_logical, st, er)
1935 write(*,*)
"Warning: stagger grid flag differs from restart data:", stagger_mark_dat
1941 if (version > 3)
then
1945 call mpi_file_read(fh, var_names(iw), name_len, mpi_character, st, er)
1949 call mpi_file_read(fh, phys_name, name_len, mpi_character, st, er)
1955 call mpi_file_read(fh, n_par, 1, mpi_integer, st, er)
1956 allocate(params(n_par))
1957 allocate(param_names(n_par))
1958 call mpi_file_read(fh, params, n_par, mpi_double_precision, st, er)
1959 call mpi_file_read(fh, param_names, name_len * n_par, mpi_character, st, er)
1962 call mpi_file_read(fh, tmp_int, 1, mpi_integer, st, er)
1967 call mpi_file_read(fh, tmp_int, 1, mpi_integer, st, er)
1970 call mpi_file_read(fh, tmp_int, 1, mpi_integer, st, er)
1995 integer :: file_handle, igrid, Morton_no, iwrite
1996 integer :: ipe, ix_buffer(2*ndim+1), n_values
1997 integer :: ixO^L, n_ghost(2*ndim)
1998 integer :: ixOs^L,n_values_stagger
1999 integer :: iorecvstatus(MPI_STATUS_SIZE)
2000 integer :: ioastatus(MPI_STATUS_SIZE)
2001 integer :: igrecvstatus(MPI_STATUS_SIZE)
2002 integer :: istatus(MPI_STATUS_SIZE)
2004 integer(kind=MPI_OFFSET_KIND) :: offset_tree_info
2005 integer(kind=MPI_OFFSET_KIND) :: offset_block_data
2006 integer(kind=MPI_OFFSET_KIND) :: offset_offsets
2007 double precision,
allocatable :: w_buffer(:)
2009 integer,
allocatable :: block_ig(:, :)
2010 integer,
allocatable :: block_lvl(:)
2011 integer(kind=MPI_OFFSET_KIND),
allocatable :: block_offset(:)
2018 n_values = n_values +
count_ix(ixgs^
ll) * nws
2020 allocate(w_buffer(n_values))
2023 allocate(block_ig(ndim,
nleafs))
2024 allocate(block_lvl(
nleafs))
2025 allocate(block_offset(
nleafs+1))
2032 offset_tree_info = -1
2033 offset_block_data = -1
2037 call mpi_file_get_position(file_handle, offset_tree_info,
ierrmpi)
2044 igrid =
sfc(1, morton_no)
2045 ipe =
sfc(2, morton_no)
2048 block_ig(:, morton_no) = [ pnode%ig^
d ]
2049 block_lvl(morton_no) = pnode%level
2050 block_offset(morton_no) = 0
2053 call mpi_file_write(file_handle, block_lvl,
size(block_lvl), &
2054 mpi_integer, istatus,
ierrmpi)
2056 call mpi_file_write(file_handle, block_ig,
size(block_ig), &
2057 mpi_integer, istatus,
ierrmpi)
2060 call mpi_file_get_position(file_handle, offset_offsets,
ierrmpi)
2061 call mpi_file_write(file_handle, block_offset(1:
nleafs),
nleafs, &
2064 call mpi_file_get_position(file_handle, offset_block_data,
ierrmpi)
2067 if (offset_block_data - offset_tree_info /= &
2069 nleafs * ((1+ndim) * size_int + 2 * size_int))
then
2071 print *,
"Warning: MPI_OFFSET type /= 8 bytes"
2072 print *,
"This *could* cause problems when reading .dat files"
2076 block_offset(1) = offset_block_data
2086 w_buffer(1:n_values) = pack(ps(igrid)%w(ixo^s, 1:nw), .true.)
2087 {ixosmin^
d = ixomin^
d -1\}
2088 {ixosmax^
d = ixomax^
d \}
2089 n_values_stagger=
count_ix(ixos^l)*nws
2090 w_buffer(n_values+1:n_values+n_values_stagger) = pack(ps(igrid)%ws(ixos^s, 1:nws), .true.)
2091 n_values=n_values+n_values_stagger
2093 w_buffer(1:n_values) = pack(ps(igrid)%w(ixo^s, 1:nw), .true.)
2095 ix_buffer(1) = n_values
2096 ix_buffer(2:) = n_ghost
2099 call mpi_send(ix_buffer, 2*ndim+1, &
2101 call mpi_send(w_buffer, n_values, &
2105 call mpi_file_write(file_handle, ix_buffer(2:), &
2106 2*ndim, mpi_integer, istatus,
ierrmpi)
2107 call mpi_file_write(file_handle, w_buffer, &
2108 n_values, mpi_double_precision, istatus,
ierrmpi)
2111 block_offset(iwrite+1) = block_offset(iwrite) + &
2112 int(n_values, mpi_offset_kind) * size_double + &
2124 call mpi_recv(ix_buffer, 2*ndim+1, mpi_integer, ipe, itag,
icomm,&
2126 n_values = ix_buffer(1)
2128 call mpi_recv(w_buffer, n_values, mpi_double_precision,&
2131 call mpi_file_write(file_handle, ix_buffer(2:), &
2132 2*ndim, mpi_integer, istatus,
ierrmpi)
2133 call mpi_file_write(file_handle, w_buffer, &
2134 n_values, mpi_double_precision, istatus,
ierrmpi)
2137 block_offset(iwrite+1) = block_offset(iwrite) + &
2138 int(n_values, mpi_offset_kind) * size_double + &
2144 call mpi_file_seek(file_handle, offset_offsets, mpi_seek_set,
ierrmpi)
2145 call mpi_file_write(file_handle, block_offset(1:
nleafs),
nleafs, &
2149 call mpi_file_seek(file_handle, 0_mpi_offset_kind, mpi_seek_set,
ierrmpi)
2153 call mpi_file_close(file_handle,
ierrmpi)
2171 integer :: ix_buffer(2*ndim+1), n_values, n_values_stagger
2172 integer :: ixO^L, ixOs^L
2173 integer :: file_handle, amode, igrid, Morton_no, iread
2174 integer :: istatus(MPI_STATUS_SIZE)
2175 integer :: iorecvstatus(MPI_STATUS_SIZE)
2176 integer :: ipe,inrecv,nrecv, file_version
2178 integer(MPI_OFFSET_KIND) :: offset_tree_info
2179 integer(MPI_OFFSET_KIND) :: offset_block_data
2180 double precision,
allocatable :: w_buffer(:)
2181 double precision,
dimension(:^D&,:),
allocatable :: w
2182 double precision :: ws(ixGs^T,1:ndim)
2189 mpi_info_null,file_handle,
ierrmpi)
2190 call mpi_file_read(file_handle, file_version, 1, mpi_integer, &
2194 call mpi_bcast(file_version,1,mpi_integer,0,
icomm,
ierrmpi)
2197 if (
mype == 0) print *,
"Unknown version, trying old snapshot reader..."
2198 call mpi_file_close(file_handle,
ierrmpi)
2212 else if (
mype == 0)
then
2213 call mpi_file_seek(file_handle, 0_mpi_offset_kind, mpi_seek_set,
ierrmpi)
2228 call mpi_bcast(stagger_mark_dat,1,mpi_logical,0,
icomm,
ierrmpi)
2232 if(stagger_mark_dat)
then
2233 n_values = n_values +
count_ix(ixgs^
ll) * nws
2235 allocate(w_buffer(n_values))
2241 call mpi_file_seek(file_handle, offset_tree_info, &
2253 call mpi_file_seek(file_handle, offset_block_data, mpi_seek_set,
ierrmpi)
2261 call mpi_file_read(file_handle,ix_buffer(1:2*ndim), 2*ndim, &
2265 {ixomin^
d = ixmlo^
d - ix_buffer(^
d)\}
2266 {ixomax^
d = ixmhi^
d + ix_buffer(ndim+^
d)\}
2268 if(stagger_mark_dat)
then
2269 {ixosmin^
d = ixomin^
d - 1\}
2270 {ixosmax^
d = ixomax^
d\}
2271 n_values_stagger = n_values
2272 n_values = n_values +
count_ix(ixos^l) * nws
2275 call mpi_file_read(file_handle, w_buffer, n_values, &
2276 mpi_double_precision, istatus,
ierrmpi)
2278 if (
mype == ipe)
then
2281 if(stagger_mark_dat)
then
2282 w(ixo^s, 1:
nw_found) = reshape(w_buffer(1:n_values_stagger), &
2285 ps(igrid)%ws(ixos^s,1:nws)=reshape(w_buffer(n_values_stagger+1:n_values), &
2286 shape(ws(ixos^s, 1:nws)))
2288 w(ixo^s, 1:
nw_found) = reshape(w_buffer(1:n_values), &
2301 ps(igrid)%w(ixo^s,1:nw)=w(ixo^s,1:nw)
2304 ps(igrid)%w(ixo^s,1:nw)=w(ixo^s,1:nw)
2307 call mpi_send([ ixo^l, n_values ], 2*ndim+1, &
2309 call mpi_send(w_buffer, n_values, &
2315 call mpi_file_close(file_handle,
ierrmpi)
2324 call mpi_recv(ix_buffer, 2*ndim+1, mpi_integer, 0, itag,
icomm,&
2326 {ixomin^
d = ix_buffer(^
d)\}
2327 {ixomax^
d = ix_buffer(ndim+^
d)\}
2328 n_values = ix_buffer(2*ndim+1)
2330 call mpi_recv(w_buffer, n_values, mpi_double_precision,&
2333 if(stagger_mark_dat)
then
2335 {ixosmin^
d = ixomin^
d - 1\}
2336 {ixosmax^
d = ixomax^
d\}
2337 w(ixo^s, 1:
nw_found) = reshape(w_buffer(1:n_values_stagger), &
2340 ps(igrid)%ws(ixos^s,1:nws)=reshape(w_buffer(n_values_stagger+1:n_values), &
2341 shape(ws(ixos^s, 1:nws)))
2343 w(ixo^s, 1:
nw_found) = reshape(w_buffer(1:n_values), &
2356 ps(igrid)%w(ixo^s,1:nw)=w(ixo^s,1:nw)
2359 ps(igrid)%w(ixo^s,1:nw)=w(ixo^s,1:nw)
2374 double precision :: wio(ixG^T,1:nw)
2375 integer :: fh, igrid, Morton_no, iread
2376 integer :: levmaxini, ndimini, ndirini
2377 integer :: nwini, neqparini, nxini^D
2378 integer(kind=MPI_OFFSET_KIND) :: offset
2379 integer :: istatus(MPI_STATUS_SIZE)
2380 integer,
allocatable :: iorecvstatus(:,:)
2381 integer :: ipe,inrecv,nrecv
2382 integer :: sendini(7+^ND)
2383 character(len=80) :: filename
2385 double precision :: eqpar_dummy(100)
2389 mpi_mode_rdonly,mpi_info_null,fh,
ierrmpi)
2391 offset=-int(7*size_int+size_double,kind=mpi_offset_kind)
2392 call mpi_file_seek(fh,offset,mpi_seek_end,
ierrmpi)
2396 call mpi_file_read(fh,levmaxini,1,mpi_integer,istatus,
ierrmpi)
2397 call mpi_file_read(fh,ndimini,1,mpi_integer,istatus,
ierrmpi)
2398 call mpi_file_read(fh,ndirini,1,mpi_integer,istatus,
ierrmpi)
2399 call mpi_file_read(fh,nwini,1,mpi_integer,istatus,
ierrmpi)
2400 call mpi_file_read(fh,neqparini,1,mpi_integer,istatus,
ierrmpi)
2401 call mpi_file_read(fh,
it,1,mpi_integer,istatus,
ierrmpi)
2406 write(*,*)
"number of levels in restart file = ",levmaxini
2408 call mpistop(
"refine_max_level < number of levels in restart file")
2410 if (ndimini/=
ndim)
then
2411 write(*,*)
"ndim in restart file = ",ndimini
2412 write(*,*)
"ndim = ",
ndim
2413 call mpistop(
"reset ndim to ndim in restart file")
2415 if (ndirini/=
ndir)
then
2416 write(*,*)
"ndir in restart file = ",ndirini
2417 write(*,*)
"ndir = ",
ndir
2418 call mpistop(
"reset ndir to ndir in restart file")
2421 write(*,*)
"nw=",nw,
" and nw in restart file=",nwini
2422 call mpistop(
"currently, changing nw at restart is not allowed")
2425 offset=offset-int(ndimini*size_int+neqparini*size_double,kind=mpi_offset_kind)
2426 call mpi_file_seek(fh,offset,mpi_seek_end,
ierrmpi)
2428 {
call mpi_file_read(fh,nxini^d,1,mpi_integer,istatus,
ierrmpi)\}
2430 write(*,*)
"Error: reset resolution to ",nxini^d+2*
nghostcells
2431 call mpistop(
"change with setamrvac")
2434 call mpi_file_read(fh,eqpar_dummy,neqparini, &
2435 mpi_double_precision,istatus,
ierrmpi)
2441 sendini=(/
nleafs,levmaxini,ndimini,ndirini,nwini,neqparini,
it ,^d&nxini^d /)
2443 call mpi_bcast(sendini,7+^nd,mpi_integer,0,
icomm,
ierrmpi)
2444 nleafs=sendini(1);levmaxini=sendini(2);ndimini=sendini(3);
2445 ndirini=sendini(4);nwini=sendini(5);
2446 neqparini=sendini(6);
it=sendini(7);
2447 nxini^d=sendini(7+^d);
2454 int(
nleafs,kind=mpi_offset_kind)
2455 call mpi_file_seek(fh,offset,mpi_seek_set,
ierrmpi)
2472 *int(morton_no-1,kind=mpi_offset_kind)
2473 call mpi_file_read_at(fh,offset,ps(igrid)%w,1,
type_block_io, &
2482 *int(morton_no-1,kind=mpi_offset_kind)
2489 call mpi_file_close(fh,
ierrmpi)
2492 allocate(iorecvstatus(mpi_status_size,nrecv))
2499 iorecvstatus(:,inrecv),
ierrmpi)
2501 deallocate(iorecvstatus)
2516 integer :: i, iw, level
2517 double precision :: wmean(1:nw), total_volume
2518 double precision :: volume_coverage(refine_max_level)
2519 integer :: nx^D, nc, ncells, dit
2520 double precision :: dtTimeLast, now, cellupdatesPerSecond
2521 double precision :: activeBlocksPerCore, wctPerCodeTime, timeToFinish
2522 character(len=40) :: fmt_string
2523 character(len=80) :: filename
2524 character(len=2048) :: line
2525 logical,
save :: opened = .false.
2526 integer :: amode, istatus(MPI_STATUS_SIZE)
2527 integer,
parameter :: my_unit = 20
2538 nx^d=ixmhi^d-ixmlo^d+1;
2548 cellupdatespersecond = dble(ncells) * dble(
nstep) * &
2549 dble(dit) / (dttimelast * dble(
npe))
2555 wctpercodetime = dttimelast / max(dit *
dt, epsilon(1.0d0))
2561 if (.not. opened)
then
2567 open(unit=my_unit,file=trim(filename),status=
'replace')
2568 close(my_unit, status=
'delete')
2571 amode = ior(mpi_mode_create,mpi_mode_wronly)
2572 amode = ior(amode,mpi_mode_append)
2574 call mpi_file_open(mpi_comm_self, filename, amode, &
2580 line =
"it global_time dt"
2582 i = len_trim(line) + 2
2583 write(line(i:),
"(a,a)") trim(cons_wnames(level)),
" "
2587 do level = 1, refine_max_level
2588 i = len_trim(line) + 2
2589 write(line(i:),
"(a,i0)")
"c", level
2593 do level=1,refine_max_level
2594 i = len_trim(line) + 2
2595 write(line(i:),
"(a,i0)")
"n", level
2599 line = trim(line) //
" | Xload Xmemory 'Cell_Updates /second/core'"
2600 line = trim(line) //
" 'Active_Blocks/Core' 'Wct Per Code Time [s]'"
2601 line = trim(line) //
" 'TimeToFinish [hrs]'"
2605 call mpi_file_write(
log_fh, trim(line) // new_line(
'a'), &
2606 len_trim(line)+1, mpi_character, istatus,
ierrmpi)
2612 fmt_string =
'(' //
fmt_i //
',2' //
fmt_r //
')'
2614 i = len_trim(line) + 2
2616 write(fmt_string,
'(a,i0,a)')
'(', nw,
fmt_r //
')'
2617 write(line(i:), fmt_string) wmean(1:nw)
2618 i = len_trim(line) + 2
2620 write(fmt_string,
'(a,i0,a)')
'(', refine_max_level,
fmt_r //
')'
2621 write(line(i:), fmt_string) volume_coverage(1:refine_max_level)
2622 i = len_trim(line) + 2
2624 write(fmt_string,
'(a,i0,a)')
'(', refine_max_level,
fmt_i //
')'
2625 write(line(i:), fmt_string)
nleafs_level(1:refine_max_level)
2626 i = len_trim(line) + 2
2628 fmt_string =
'(a,6' //
fmt_r2 //
')'
2629 write(line(i:), fmt_string)
'| ',
xload,
xmemory, cellupdatespersecond, &
2630 activeblockspercore, wctpercodetime, timetofinish
2632 call mpi_file_write(
log_fh, trim(line) // new_line(
'a') , &
2633 len_trim(line)+1, mpi_character, istatus,
ierrmpi)
2643 integer,
parameter :: n_modes = 2
2644 character(len=40) :: fmt_string
2645 character(len=2048) :: line
2646 logical,
save :: file_open = .false.
2648 double precision :: modes(nw, n_modes), volume
2649 integer :: amode, istatus(MPI_STATUS_SIZE)
2650 character(len=80) :: filename
2652 do power = 1, n_modes
2657 if (.not. file_open)
then
2659 amode = ior(mpi_mode_create,mpi_mode_wronly)
2660 amode = ior(amode,mpi_mode_append)
2662 call mpi_file_open(mpi_comm_self, filename, amode, &
2666 line=
"# time mean(w) mean(w**2)"
2667 call mpi_file_write(
log_fh, trim(line) // new_line(
'a'), &
2668 len_trim(line)+1, mpi_character, istatus,
ierrmpi)
2671 write(fmt_string,
"(a,i0,a)")
"(", nw * n_modes + 1,
fmt_r //
")"
2673 call mpi_file_write(
log_fh, trim(line) // new_line(
'a') , &
2674 len_trim(line)+1, mpi_character, istatus,
ierrmpi)
2684 integer,
intent(in) :: power
2685 double precision,
intent(out) :: mode(nw)
2686 double precision,
intent(out) :: volume
2687 integer :: iigrid, igrid, iw
2688 double precision :: wsum(nw+1)
2689 double precision :: dsum_recv(1:nw+1)
2694 do iigrid = 1, igridstail
2695 igrid = igrids(iigrid)
2698 wsum(nw+1) = wsum(nw+1) + sum(ps(igrid)%dvolume(
ixm^t))
2702 wsum(iw) = wsum(iw) + &
2703 sum(ps(igrid)%dvolume(
ixm^t)*ps(igrid)%w(
ixm^t,iw)**power)
2708 call mpi_allreduce(wsum, dsum_recv, nw+1, mpi_double_precision, &
2712 volume = dsum_recv(nw+1)
2713 mode = dsum_recv(1:nw) / volume
2722 double precision,
intent(out) :: vol_cov(1:refine_max_level)
2723 double precision :: dsum_recv(1:refine_max_level)
2724 integer :: iigrid, igrid, iw, level
2727 vol_cov(1:refine_max_level)=zero
2729 do iigrid = 1, igridstail
2730 igrid = igrids(iigrid);
2732 vol_cov(level) = vol_cov(level)+ &
2737 call mpi_allreduce(vol_cov, dsum_recv, refine_max_level, mpi_double_precision, &
2741 vol_cov = dsum_recv / sum(dsum_recv)
2749 pure function func(w_vec, w_size)
result(val)
2750 integer,
intent(in) :: w_size
2751 double precision,
intent(in) :: w_vec(w_size)
2752 double precision :: val
2755 double precision,
intent(out) :: f_avg
2756 double precision,
intent(out) :: volume
2757 integer :: iigrid, igrid, i^D
2758 double precision :: wsum(2)
2759 double precision :: dsum_recv(2)
2764 do iigrid = 1, igridstail
2765 igrid = igrids(iigrid)
2768 wsum(2) = wsum(2) + sum(ps(igrid)%dvolume(
ixm^t))
2771 {
do i^d = ixmlo^d, ixmhi^d\}
2772 wsum(1) = wsum(1) + ps(igrid)%dvolume(i^d) * &
2773 func(ps(igrid)%w(i^d, :), nw)
2778 call mpi_allreduce(wsum, dsum_recv, 2, mpi_double_precision, &
2779 mpi_sum, icomm, ierrmpi)
2782 volume = dsum_recv(2)
2783 f_avg = dsum_recv(1) / volume
2791 double precision,
intent(out) :: wmax(nw)
2793 integer :: iigrid, igrid, iw
2794 double precision :: wmax_mype(nw),wmax_recv(nw)
2796 wmax_mype(1:nw) = -bigdouble
2799 do iigrid = 1, igridstail
2800 igrid = igrids(iigrid)
2802 wmax_mype(iw)=max(wmax_mype(iw),maxval(ps(igrid)%w(
ixm^t,iw)))
2807 call mpi_allreduce(wmax_mype, wmax_recv, nw, mpi_double_precision, &
2810 wmax(1:nw)=wmax_recv(1:nw)
2818 double precision,
intent(out) :: wmin(nw)
2820 integer :: iigrid, igrid, iw
2821 double precision :: wmin_mype(nw),wmin_recv(nw)
2823 wmin_mype(1:nw) = bigdouble
2826 do iigrid = 1, igridstail
2827 igrid = igrids(iigrid)
2829 wmin_mype(iw)=min(wmin_mype(iw),minval(ps(igrid)%w(
ixm^t,iw)))
2834 call mpi_allreduce(wmin_mype, wmin_recv, nw, mpi_double_precision, &
2837 wmin(1:nw)=wmin_recv(1:nw)
subroutine, public alloc_node(igrid)
allocate arrays on igrid node
Collapses D-dimensional output to D-1 view by line-of-sight integration.
subroutine write_collapsed
subroutine, public mpistop(message)
Exit MPI-AMRVAC with an error message.
subroutine generate_plotfile
Module with basic grid data structures.
integer, dimension(:), allocatable, save nleafs_level
How many leaves are present per refinement level.
integer, dimension(:), allocatable, save sfc_to_igrid
Go from a Morton number to an igrid index (for a single processor)
integer, dimension(:), allocatable, save morton_start
First Morton number per processor.
integer, save nleafs
Number of leaf block.
integer, dimension(:), allocatable, save morton_stop
Last Morton number per processor.
integer, dimension(:,:), allocatable, save sfc
Array to go from a Morton number to an igrid and processor index. Sfc(1:3, MN) contains [igrid,...
integer, save nparents
Number of parent blocks.
type(tree_node_ptr), dimension(:,:), allocatable, save igrid_to_node
Array to go from an [igrid, ipe] index to a node pointer.
subroutine, public write_forest(file_handle)
subroutine, public read_forest(file_handle)
Module with geometry-related routines (e.g., divergence, curl)
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(:), 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 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.
double precision tvdlfeps
integer spectrum_wl
wave length for spectrum
logical nocartesian
IO switches for conversion.
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
logical reset_it
If true, reset iteration count to 0.
double precision small_pressure
integer ixghi
Upper index of grid block arrays.
character(len=std_len) geometry_name
integer, dimension(3, 3, 3) lvc
Levi-Civita tensor.
logical activate_unit_arcsec
use arcsec as length unit of images/spectra
logical source_split_usr
Use split or unsplit way to add user's source terms, default: unsplit.
integer domain_nx
number of cells for each dimension in level-one mesh
integer, parameter unitpar
file handle for IO
character(len=std_len) filename_spectrum
Base file name for synthetic EUV spectrum output.
logical resume_previous_run
If true, restart a previous run from the latest snapshot.
double precision global_time
The global simulation time.
integer, dimension(nsavehi, nfile) itsave
Save output of type N on iterations itsave(:, N)
double precision time_max
End time for the simulation.
integer, dimension(3, 3) kr
Kronecker delta tensor.
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 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 saveprim
If true, convert from conservative to primitive variables in output.
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.
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.
double precision, dimension(:), allocatable amr_wavefilter
refinement: lohner estimate wavefilter setting
integer, parameter rpxmin
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.
logical stagger_grid
True for using stagger grid.
double precision time_convert_factor
Conversion factor for time unit.
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.
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...
integer, parameter nsavehi
Maximum number of saves that can be defined by tsave or itsave.
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...
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, parameter plevel_
logical, dimension(ndim) collapse
If collapse(DIM) is true, generate output integrated over DIM.
integer, dimension(:), allocatable, parameter d
logical local_timestep
each cell has its own timestep or not
character(len=std_len) usr_filename
User parameter file.
logical ghost_copy
whether copy values instead of interpolation in ghost cells of finer blocks
double precision length_convert_factor
integer ndir
Number of spatial dimensions (components) for vector variables.
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)
character(len=std_len) collapse_type
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
integer snapshotnext
IO: snapshot and collapsed views output numbers/labels.
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.
integer nwauxio
Number of auxiliary variables that are only included in output.
double precision, dimension(ndim) qstretch_baselevel
stretch factor between cells at AMR level 1, per dimension
double precision, dimension(ndim, 2) writespshift
integer imex_switch
IMEX_232 choice and parameters.
double precision time_between_print
to monitor timeintegration loop at given wall-clock time intervals
integer, parameter unitterm
Unit for standard output.
double precision, dimension(nfile) dtsave
Repeatedly save output of type N when dtsave(N) simulation time has passed.
logical, dimension(:), allocatable w_write
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, dimension(:,:), allocatable rnode
Corner coordinates.
integer, parameter filelog_
Constant indicating log output.
logical final_dt_reduction
If true, allow final dt reduction for matching time_max on output.
logical, dimension(:), allocatable writelevel
integer, parameter fileout_
Constant indicating regular output.
double precision los_theta
direction of the line of sight (LOS)
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, dimension(:,:), allocatable dx
double precision tfixgrid
Fix the AMR grid after this time.
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.
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 convert
If true and restart_from_file is given, convert snapshots to other file formats.
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, parameter rpxmax
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.
logical big_image
big image
double precision instrument_resolution_factor
times for enhancing spatial resolution for EUV image/spectra
double precision small_density
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.
double precision, dimension(:), allocatable derefine_ratio
integer, parameter nfile
Number of output methods.
integer max_blocks
The maximum number of grid blocks in a processor.
integer, parameter fileanalysis_
Constant indicating analysis output (see Writing a custom analysis subroutine)
integer rk3_switch
RK3 Butcher table.
character(len=std_len) typefilelog
Which type of log to write: 'normal', 'special', 'regression_test'.
integer direction_slit
direction of the slit (for dat resolution only)
double precision, dimension(1:3) x_origin
where the is the origin (X=0,Y=0) of image
logical final_dt_exit
Force timeloop exit when final dt < dtmin.
integer, dimension(nfile) isaveit
integer, dimension(:,:), allocatable node
integer, dimension(nfile) isavet
logical check_small_values
check and optionally fix unphysical small values (density, gas pressure)
integer log_fh
MPI file handle for logfile.
Module with slope/flux limiters.
double precision cada3_radius
radius of the asymptotic region [0.001, 10], larger means more accurate in smooth region but more ove...
double precision schmid_rad
Module containing all the particle routines.
This module defines the procedures of a physics module. It contains function pointers for the various...
integer phys_wider_stencil
To use wider stencils in flux calculations. A value of 1 will extend it by one cell in both direction...
character(len=name_len) physics_type
String describing the physics type of the simulation.
logical phys_energy
Solve energy equation or not.
Writes D-1 slice, can do so in various formats, depending on slice_type.
integer slicenext
the file number of slices
character(len=std_len) slice_type
choose data type of slice: vtu, vtuCC, dat, or csv
integer, dimension(nslicemax) slicedir
The slice direction for each slice.
integer nslices
Number of slices to output.
double precision, dimension(nslicemax) slicecoord
Slice coordinates, see Slice output.
Module for handling problematic values in simulations, such as negative pressures.
integer, public small_values_daverage
Average over this many cells in each direction.
logical, public trace_small_values
trace small values in the source file using traceback flag of compiler
logical, dimension(:), allocatable, public small_values_fix_iw
Whether to apply small value fixes to certain variables.
character(len=20), public small_values_method
How to handle small values.
Module for handling split source terms (split from the fluxes)
double precision timelast
Module with all the methods that users can customize in AMRVAC.
procedure(p_no_args), pointer usr_print_log
procedure(p_no_args), pointer usr_write_analysis
procedure(transform_w), pointer usr_transform_w
The data structure that contains information about a tree node/grid block.