188 double precision,
dimension(nsavehi) :: tsave_log, tsave_dat, tsave_slice, &
189 tsave_collapsed, tsave_custom
190 double precision :: dtsave_log, dtsave_dat, dtsave_slice, &
191 dtsave_collapsed, dtsave_custom
192 double precision :: tsavestart_log, tsavestart_dat, tsavestart_slice, &
193 tsavestart_collapsed, tsavestart_custom
194 double precision :: sizeuniformpart^D
195 double precision :: im_delta,im_nu,rka54,rka51,rkb54,rka55
196 double precision :: dx_vec(^ND)
197 integer :: ditsave_log, ditsave_dat, ditsave_slice, &
198 ditsave_collapsed, ditsave_custom
199 integer :: windex, ipower
200 integer :: i, j, k, ifile, io_state
201 integer :: iB, isave, iw, level, idim, islice
202 integer :: nx_vec(^ND), block_nx_vec(^ND)
203 integer :: my_unit, iostate
205 logical :: fileopen, file_exists
208 character(len=80) :: fmt_string
209 character(len=std_len) :: err_msg, restart_from_file_arg
210 character(len=std_len) :: basename_full, basename_prev, dummy_file
211 character(len=std_len),
dimension(:),
allocatable :: &
212 typeboundary_min^D, typeboundary_max^D
213 character(len=std_len),
allocatable :: limiter(:)
214 character(len=std_len),
allocatable :: gradient_limiter(:)
215 character(len=name_len) :: stretch_dim(ndim)
218 character(len=std_len) :: typesourcesplit
220 character(len=std_len),
allocatable :: flux_scheme(:)
222 character(len=std_len) :: typeboundspeed
224 character(len=std_len) :: time_stepper
226 character(len=std_len) :: time_integrator
228 character(len=std_len) :: typecurl
230 character(len=std_len) :: typeprolonglimit
236 character(len=std_len) :: typecourant
251 tsave_log, tsave_dat, tsave_slice, tsave_collapsed, tsave_custom, &
252 dtsave_log, dtsave_dat, dtsave_slice, dtsave_collapsed, dtsave_custom, &
253 ditsave_log, ditsave_dat, ditsave_slice, ditsave_collapsed, ditsave_custom,&
254 tsavestart_log, tsavestart_dat, tsavestart_slice, tsavestart_collapsed,&
261 namelist /methodlist/ time_stepper, time_integrator, &
328 allocate(typeboundary_min^d(nwfluxbc))
329 allocate(typeboundary_max^d(nwfluxbc))
392 typeprolonglimit =
'default'
430 tsave(isave,ifile) = bigdouble
431 itsave(isave,ifile) = biginteger
440 tsave_log = bigdouble
441 tsave_dat = bigdouble
442 tsave_slice = bigdouble
443 tsave_collapsed = bigdouble
444 tsave_custom = bigdouble
446 dtsave_log = bigdouble
447 dtsave_dat = bigdouble
448 dtsave_slice = bigdouble
449 dtsave_collapsed = bigdouble
450 dtsave_custom = bigdouble
452 ditsave_log = biginteger
453 ditsave_dat = biginteger
454 ditsave_slice = biginteger
455 ditsave_collapsed = biginteger
456 ditsave_custom = biginteger
458 tsavestart_log = bigdouble
459 tsavestart_dat = bigdouble
460 tsavestart_slice = bigdouble
461 tsavestart_collapsed = bigdouble
462 tsavestart_custom = bigdouble
487 typecourant =
'maxsum'
496 typeboundspeed =
'Einfeldt'
498 time_stepper =
'twostep'
499 time_integrator =
'default'
547 flux_scheme(level) =
'tvdlf'
549 limiter(level) =
'minmod'
550 gradient_limiter(level) =
'minmod'
557 typesourcesplit =
'sfs'
584 if(i==j.or.j==k.or.k==i)
then
586 else if(i+1==j.or.i-2==j)
then
603 inquire(file=trim(
par_files(i)), exist=file_exists)
605 if (.not. file_exists)
then
606 write(err_msg, *)
"The parameter file " // trim(
par_files(i)) // &
616 read(
unitpar, filelist,
end=101)
619 read(unitpar, savelist,
end=102)
622 read(unitpar, stoplist,
end=103)
625 read(unitpar, methodlist,
end=104)
628 read(unitpar, boundlist,
end=105)
631 read(unitpar, meshlist,
end=106)
634 read(unitpar, paramlist,
end=107)
637 read(unitpar, emissionlist,
end=108)
642 if (base_filename /= basename_prev) &
643 basename_full = trim(basename_full) // trim(base_filename)
644 basename_prev = base_filename
647 base_filename = basename_full
651 dummy_file = trim(base_filename)//
"DUMMY"
652 open(newunit=my_unit, file=trim(dummy_file), iostat=iostate)
653 if (iostate /= 0)
then
654 call mpistop(
"Can't write to output directory (" // &
655 trim(base_filename) //
")")
657 close(my_unit, status=
'delete')
661 if(source_split_usr) any_source_split=.true.
664 if(restart_from_file_arg /= undefined) &
665 restart_from_file=restart_from_file_arg
669 if(restart_from_file == undefined)
then
672 do index_latest_data = 9999, 0, -1
678 if(.not.file_exists) index_latest_data=-1
684 call mpi_bcast(index_latest_data, 1, mpi_integer, 0, icomm, ierrmpi)
686 if (resume_previous_run)
then
687 if (index_latest_data == -1)
then
688 if(mype==0)
write(*,*)
"No snapshots found to resume from, start a new run..."
691 write(restart_from_file,
"(a,i4.4,a)") trim(base_filename),index_latest_data,
".dat"
695 if (restart_from_file == undefined)
then
700 call mpistop(
"Please restart from a snapshot when firstprocess=T")
702 call mpistop(
'Change convert to .false. for a new run!')
705 if (small_pressure < 0.d0)
call mpistop(
"small_pressure should be positive.")
706 if (small_density < 0.d0)
call mpistop(
"small_density should be positive.")
707 if (ghostcell_comm_batched .and. ghostcell_comm_batch_size < 1) &
708 call mpistop(
"ghostcell_comm_batch_size should be positive.")
710 if (small_temperature>0.d0) small_pressure=small_density*small_temperature
712 if(convert) autoconvert=.false.
714 where (tsave_log < bigdouble) tsave(:, 1) = tsave_log
715 where (tsave_dat < bigdouble) tsave(:, 2) = tsave_dat
716 where (tsave_slice < bigdouble) tsave(:, 3) = tsave_slice
717 where (tsave_collapsed < bigdouble) tsave(:, 4) = tsave_collapsed
718 where (tsave_custom < bigdouble) tsave(:, 5) = tsave_custom
720 if (dtsave_log < bigdouble) dtsave(1) = dtsave_log
721 if (dtsave_dat < bigdouble) dtsave(2) = dtsave_dat
722 if (dtsave_slice < bigdouble) dtsave(3) = dtsave_slice
723 if (dtsave_collapsed < bigdouble) dtsave(4) = dtsave_collapsed
724 if (dtsave_custom < bigdouble) dtsave(5) = dtsave_custom
726 if (tsavestart_log < bigdouble) tsavestart(1) = tsavestart_log
727 if (tsavestart_dat < bigdouble) tsavestart(2) = tsavestart_dat
728 if (tsavestart_slice < bigdouble) tsavestart(3) = tsavestart_slice
729 if (tsavestart_collapsed < bigdouble) tsavestart(4) = tsavestart_collapsed
730 if (tsavestart_custom < bigdouble) tsavestart(5) = tsavestart_custom
732 if (ditsave_log < bigdouble) ditsave(1) = ditsave_log
733 if (ditsave_dat < bigdouble) ditsave(2) = ditsave_dat
734 if (ditsave_slice < bigdouble) ditsave(3) = ditsave_slice
735 if (ditsave_collapsed < bigdouble) ditsave(4) = ditsave_collapsed
736 if (ditsave_custom < bigdouble) ditsave(5) = ditsave_custom
738 if (wall_time_max < bigdouble) wall_time_max=wall_time_max*3600.d0
741 write(unitterm, *)
''
742 write(unitterm, *)
'Output type | tsavestart | dtsave | ditsave | itsave(1) | tsave(1)'
743 write(fmt_string, *)
'(A12," | ",E9.3E2," | ",E9.3E2," | ",I6," | "'//&
748 if (mype == 0)
write(unitterm, fmt_string) trim(output_names(ifile)), &
749 tsavestart(ifile), dtsave(ifile), ditsave(ifile), itsave(1, ifile), tsave(1, ifile)
752 if (mype == 0)
write(unitterm, *)
''
755 if(slicedir(islice) > ndim) &
756 write(uniterr,*)
'Warning in read_par_files: ', &
757 'Slice ', islice,
' direction',slicedir(islice),
'larger than ndim=',ndim
758 if(slicedir(islice) < 1) &
759 write(uniterr,*)
'Warning in read_par_files: ', &
760 'Slice ', islice,
' direction',slicedir(islice),
'too small, should be [',1,ndim,
']'
763 if(it_max==biginteger .and. time_max==bigdouble.and.mype==0)
write(uniterr,*) &
764 'Warning in read_par_files: it_max or time_max not given!'
766 select case (typecourant)
768 type_courant=type_maxsum
770 type_courant=type_summax
771 if (local_timestep)
then
772 call mpistop(
"Type courant summax incompatible with local_timestep")
775 type_courant=type_minimum
776 if (local_timestep)
then
777 call mpistop(
"Type courant minimum incompatible with local_timestep")
780 write(unitterm,*)
'Unknown typecourant=',typecourant
781 call mpistop(
"Error from read_par_files: no such typecourant!")
786 select case (flux_scheme(level))
788 flux_method(level)=fs_hll
790 flux_method(level)=fs_hllc
792 flux_method(level)=fs_hlld
794 flux_method(level)=fs_hllcd
796 flux_method(level)=fs_tvdlf
798 flux_method(level)=fs_tvdmu
800 flux_method(level)=fs_tvd
802 flux_method(level)=fs_cd
804 flux_method(level)=fs_cd4
806 flux_method(level)=fs_fd
808 flux_method(level)=fs_source
810 flux_method(level)=fs_nul
812 call mpistop(
"unkown or bad flux scheme")
814 if(flux_scheme(level)==
'tvd'.and.time_stepper/=
'onestep') &
815 call mpistop(
" tvd is onestep method, reset time_stepper='onestep'")
816 if(flux_scheme(level)==
'tvd')
then
817 if(mype==0.and.(.not.dimsplit))
write(unitterm,*) &
818 'Warning: setting dimsplit=T for tvd, as used for level=',level
821 if(flux_scheme(level)==
'hlld'.and.physics_type/=
'mhd' .and. physics_type/=
'twofl') &
822 call mpistop(
"Cannot use hlld flux if not using MHD or 2FL only charges physics!")
824 if(flux_scheme(level)==
'hllc'.and.physics_type==
'mf') &
825 call mpistop(
"Cannot use hllc flux if using magnetofriction physics!")
827 if(flux_scheme(level)==
'tvd'.and.physics_type==
'mf') &
828 call mpistop(
"Cannot use tvd flux if using magnetofriction physics!")
830 if(flux_scheme(level)==
'tvdmu'.and.physics_type==
'mf') &
831 call mpistop(
"Cannot use tvdmu flux if using magnetofriction physics!")
833 if (typepred1(level)==0)
then
834 select case (flux_scheme(level))
836 typepred1(level)=fs_cd
838 typepred1(level)=fs_cd4
840 typepred1(level)=fs_fd
841 case (
'tvdlf',
'tvdmu')
842 typepred1(level)=fs_hancock
844 typepred1(level)=fs_hll
846 typepred1(level)=fs_hllc
848 typepred1(level)=fs_hllcd
850 typepred1(level)=fs_hlld
851 case (
'nul',
'source',
'tvd')
852 typepred1(level)=fs_nul
854 call mpistop(
"No default predictor for this full step")
860 if(any(flux_scheme==
'fd')) need_global_cmax=.true.
863 select case (typecurl)
869 type_curl=stokesbased
871 write(unitterm,*)
"typecurl=",typecurl
872 call mpistop(
"unkown type of curl operator in read_par_files")
876 select case (time_stepper)
880 if (time_integrator==
'default')
then
881 time_integrator=
"Forward_Euler"
883 select case (time_integrator)
884 case (
"Forward_Euler")
885 t_integrator=forward_euler
887 t_integrator=imex_euler
891 write(unitterm,*)
"time_integrator=",time_integrator,
"time_stepper=",time_stepper
892 call mpistop(
"unkown onestep time_integrator in read_par_files")
894 use_imex_scheme=(t_integrator==imex_euler.or.t_integrator==imex_sp)
898 if (time_integrator==
'default')
then
899 time_integrator=
"Predictor_Corrector"
901 select case (time_integrator)
902 case (
"Predictor_Corrector")
903 t_integrator=predictor_corrector
908 case (
"IMEX_Midpoint")
909 t_integrator=imex_midpoint
910 case (
"IMEX_Trapezoidal")
911 t_integrator=imex_trapezoidal
913 t_integrator=imex_222
915 write(unitterm,*)
"time_integrator=",time_integrator,
"time_stepper=",time_stepper
916 call mpistop(
"unkown twostep time_integrator in read_par_files")
918 use_imex_scheme=(t_integrator==imex_midpoint.or.t_integrator==imex_trapezoidal&
919 .or.t_integrator==imex_222)
920 if (t_integrator==rk2_alf)
then
921 if(rk2_alfa<smalldouble.or.rk2_alfa>one)
call mpistop(
"set rk2_alfa within [0,1]")
923 rk_b2=1.0d0/(2.0d0*rk2_alfa)
929 if (time_integrator==
'default')
then
930 time_integrator=
'ssprk3'
932 select case (time_integrator)
938 t_integrator=imex_ars3
940 t_integrator=imex_232
942 t_integrator=imex_cb3a
944 write(unitterm,*)
"time_integrator=",time_integrator,
"time_stepper=",time_stepper
945 call mpistop(
"unkown threestep time_integrator in read_par_files")
947 if(t_integrator==rk3_bt)
then
948 select case(rk3_switch)
978 call mpistop(
"Unknown rk3_switch")
981 rk3_b3=1.0d0-rk3_b1-rk3_b2
983 rk3_c3=rk3_a31+rk3_a32
985 if(t_integrator==ssprk3)
then
986 select case(ssprk_order)
989 rk_beta22=1.0d0/4.0d0
990 rk_beta33=2.0d0/3.0d0
991 rk_alfa21=3.0d0/4.0d0
992 rk_alfa31=1.0d0/3.0d0
996 rk_beta11=1.0d0/2.0d0
997 rk_beta22=1.0d0/2.0d0
998 rk_beta33=1.0d0/3.0d0
1000 rk_alfa31=1.0d0/3.0d0
1004 call mpistop(
"Unknown ssprk3_order")
1006 rk_alfa22=1.0d0-rk_alfa21
1007 rk_alfa33=1.0d0-rk_alfa31
1009 if(t_integrator==imex_ars3)
then
1010 ars_gamma=(3.0d0+dsqrt(3.0d0))/6.0d0
1012 if(t_integrator==imex_232)
then
1013 select case(imex_switch)
1015 im_delta=1.0d0-1.0d0/dsqrt(2.0d0)
1016 im_nu=(3.0d0+2.0d0*dsqrt(2.0d0))/6.0d0
1017 imex_a21=2.0d0*im_delta
1018 imex_a31=1.0d0-im_nu
1020 imex_b1=1.0d0/(2.0d0*dsqrt(2.0d0))
1021 imex_b2=1.0d0/(2.0d0*dsqrt(2.0d0))
1026 imex_a21=0.711664700366941d0
1027 imex_a31=0.077338168947683d0
1028 imex_a32=0.917273367886007d0
1029 imex_b1=0.398930808264688d0
1030 imex_b2=0.345755244189623d0
1031 imex_ha21=0.353842865099275d0
1032 imex_ha22=0.353842865099275d0
1034 call mpistop(
"Unknown imex_siwtch")
1037 imex_c3=imex_a31+imex_a32
1038 imex_b3=1.0d0-imex_b1-imex_b2
1040 if(t_integrator==imex_cb3a)
then
1041 imex_c2 = 0.8925502329346865
1044 imex_c3 = imex_c2 / (6.0d0*imex_c2**2 - 3.0d0*imex_c2 + 1.0d0)
1046 imex_b2 = (3.0d0*imex_c2 - 1.0d0) / (6.0d0*imex_c2**2)
1047 imex_b3 = (6.0d0*imex_c2**2 - 3.0d0*imex_c2 + 1.0d0) / (6.0d0*imex_c2**2)
1048 imex_a33 = (1.0d0/6.0d0 - imex_b2*imex_c2**2 - imex_b3*imex_c2*imex_c3) / (imex_b3*(imex_c3-imex_c2))
1049 imex_a32 = imex_c3 - imex_a33
1063 use_imex_scheme=(t_integrator==imex_ars3.or.t_integrator==imex_232.or.t_integrator==imex_cb3a)
1067 if (time_integrator==
'default')
then
1068 time_integrator=
"ssprk4"
1070 select case (time_integrator)
1076 write(unitterm,*)
"time_integrator=",time_integrator,
"time_stepper=",time_stepper
1077 call mpistop(
"unkown fourstep time_integrator in read_par_files")
1079 if(t_integrator==ssprk4)
then
1080 select case(ssprk_order)
1082 rk_beta11=1.0d0/2.0d0
1083 rk_beta22=1.0d0/2.0d0
1084 rk_beta33=1.0d0/6.0d0
1085 rk_beta44=1.0d0/2.0d0
1087 rk_alfa31=2.0d0/3.0d0
1093 rk_beta11=1.0d0/3.0d0
1094 rk_beta22=1.0d0/3.0d0
1095 rk_beta33=1.0d0/3.0d0
1096 rk_beta44=1.0d0/4.0d0
1099 rk_alfa41=1.0d0/4.0d0
1104 call mpistop(
"Unknown ssprk_order")
1106 rk_alfa22=1.0d0-rk_alfa21
1107 rk_alfa33=1.0d0-rk_alfa31
1108 rk_alfa44=1.0d0-rk_alfa41
1113 if (time_integrator==
'default')
then
1114 time_integrator=
"ssprk5"
1116 select case (time_integrator)
1120 write(unitterm,*)
"time_integrator=",time_integrator,
"time_stepper=",time_stepper
1121 call mpistop(
"unkown fivestep time_integrator in read_par_files")
1123 if(t_integrator==ssprk5)
then
1124 select case(ssprk_order)
1127 rk_beta11=0.391752226571890d0
1128 rk_beta22=0.368410593050371d0
1129 rk_beta33=0.251891774271694d0
1130 rk_beta44=0.544974750228521d0
1131 rk_beta54=0.063692468666290d0
1132 rk_beta55=0.226007483236906d0
1133 rk_alfa21=0.444370493651235d0
1134 rk_alfa31=0.620101851488403d0
1135 rk_alfa41=0.178079954393132d0
1136 rk_alfa53=0.517231671970585d0
1137 rk_alfa54=0.096059710526147d0
1139 rk_alfa22=0.555629506348765d0
1140 rk_alfa33=0.379898148511597d0
1141 rk_alfa44=0.821920045606868d0
1142 rk_alfa55=0.386708617503269d0
1143 rk_alfa22=1.0d0-rk_alfa21
1144 rk_alfa33=1.0d0-rk_alfa31
1145 rk_alfa44=1.0d0-rk_alfa41
1146 rk_alfa55=1.0d0-rk_alfa53-rk_alfa54
1148 rk_c3=rk_alfa22*rk_c2+rk_beta22
1149 rk_c4=rk_alfa33*rk_c3+rk_beta33
1150 rk_c5=rk_alfa44*rk_c4+rk_beta44
1152 rk_beta11=0.39175222700392d0
1153 rk_beta22=0.36841059262959d0
1154 rk_beta33=0.25189177424738d0
1155 rk_beta44=0.54497475021237d0
1158 rk_alfa21=0.44437049406734d0
1159 rk_alfa31=0.62010185138540d0
1160 rk_alfa41=0.17807995410773d0
1161 rk_alfa53=0.51723167208978d0
1164 rk_alfa22=1.0d0-rk_alfa21
1165 rk_alfa33=1.0d0-rk_alfa31
1166 rk_alfa44=1.0d0-rk_alfa41
1168 rka51=0.00683325884039d0
1169 rka54=0.12759831133288d0
1170 rkb54=0.08460416338212d0
1171 rk_beta54=rkb54-rk_beta44*rka51/rk_alfa41
1172 rk_alfa54=rka54-rk_alfa44*rka51/rk_alfa41
1174 rk_alfa55=1.0d0-rk_alfa53-rk_alfa54
1176 rk_c3=rk_alfa22*rk_c2+rk_beta22
1177 rk_c4=rk_alfa33*rk_c3+rk_beta33
1178 rk_c5=rk_alfa44*rk_c4+rk_beta44
1179 rk_beta55=1.0d0-rk_beta54-rk_alfa53*rk_c3-rk_alfa54*rk_c4-rk_alfa55*rk_c5
1181 call mpistop(
"Unknown ssprk_order")
1190 use_imex_scheme=.false.
1192 call mpistop(
"Unknown time_stepper in read_par_files")
1196 select case (stretch_dim(i))
1197 case (undefined,
'none')
1198 stretch_type(i) = stretch_none
1199 stretched_dim(i) = .false.
1200 case (
'uni',
'uniform')
1201 stretch_type(i) = stretch_uni
1202 stretched_dim(i) = .true.
1203 case (
'symm',
'symmetric')
1204 stretch_type(i) = stretch_symm
1205 stretched_dim(i) = .true.
1207 stretch_type(i) = stretch_none
1208 stretched_dim(i) = .false.
1209 if (mype == 0) print *,
'Got stretch_type = ', stretch_type(i)
1210 call mpistop(
'Unknown stretch type')
1215 if(typedimsplit ==
'default'.and. dimsplit) typedimsplit=
'xyyx'
1216 if(typedimsplit ==
'default'.and..not.dimsplit) typedimsplit=
'unsplit'
1217 dimsplit = typedimsplit /=
'unsplit'
1220 select case (typesourcesplit)
1222 sourcesplit=sourcesplit_sfs
1224 sourcesplit=sourcesplit_sf
1226 sourcesplit=sourcesplit_ssf
1228 sourcesplit=sourcesplit_ssfss
1230 write(unitterm,*)
'No such typesourcesplit=',typesourcesplit
1231 call mpistop(
"Error: Unknown typesourcesplit!")
1234 if(coordinate==-1)
then
1235 coordinate=cartesian
1237 write(*,*)
'Warning: coordinate system is not specified!'
1238 write(*,*)
'call set_coordinate_system in usr_init in mod_usr.t'
1239 write(*,*)
'Now use Cartesian coordinate'
1243 if(coordinate==cartesian)
then
1246 if(any(stretched_dim))
then
1247 coordinate=cartesian_stretched
1248 slab_uniform=.false.
1252 slab_uniform=.false.
1255 if(coordinate==spherical)
then
1257 if(mype==0)print *,
'Warning: spherical symmetry needs dimsplit=F, resetting'
1262 if (ndim==1) dimsplit=.false.
1265 select case(typeprolonglimit)
1280 allocate(type_limiter(nlevelshi))
1281 allocate(type_gradient_limiter(nlevelshi))
1283 do level=1,nlevelshi
1284 type_limiter(level) = limiter_type(limiter(level))
1285 type_gradient_limiter(level) = limiter_type(gradient_limiter(level))
1288 if (any(limiter(1:nlevelshi)==
'ppm')&
1289 .and.(flatsh.and.physics_type==
'rho'))
then
1290 call mpistop(
" PPM with flatsh=.true. can not be used with physics_type='rho'!")
1296 select case(typeboundary_min^d(iw))
1298 typeboundary(iw,2*^d-1)=bc_special
1300 typeboundary(iw,2*^d-1)=bc_cont
1302 typeboundary(iw,2*^d-1)=bc_symm
1304 typeboundary(iw,2*^d-1)=bc_asymm
1306 typeboundary(iw,2*^d-1)=bc_periodic
1308 typeboundary(iw,2*^d-1)=bc_aperiodic
1310 typeboundary(iw,2*^d-1)=bc_noinflow
1312 typeboundary(iw,2*^d-1)=12
1314 typeboundary(iw,2*^d-1)=bc_data
1316 typeboundary(iw,2*^d-1)=bc_icarus
1318 typeboundary(iw,2*^d-1)=bc_character
1320 write (unitterm,*)
"Undefined boundarytype found in read_par_files", &
1321 typeboundary_min^d(iw),
"for variable iw=",iw,
" and side iB=",2*^d-1
1325 select case(typeboundary_max^d(iw))
1327 typeboundary(iw,2*^d)=bc_special
1329 typeboundary(iw,2*^d)=bc_cont
1331 typeboundary(iw,2*^d)=bc_symm
1333 typeboundary(iw,2*^d)=bc_asymm
1335 typeboundary(iw,2*^d)=bc_periodic
1337 typeboundary(iw,2*^d)=bc_aperiodic
1339 typeboundary(iw,2*^d)=bc_noinflow
1341 typeboundary(iw,2*^d)=12
1343 typeboundary(iw,2*^d)=bc_data
1345 typeboundary(iw,2*^d-1)=bc_icarus
1346 case(
"bc_character")
1347 typeboundary(iw,2*^d)=bc_character
1349 write (unitterm,*)
"Undefined boundarytype found in read_par_files", &
1350 typeboundary_max^d(iw),
"for variable iw=",iw,
" and side iB=",2*^d
1356 if (nwfluxbc<nwflux)
then
1357 do iw=nwfluxbc+1,nwflux
1358 typeboundary(iw,:) = typeboundary(1, :)
1363 do iw=nwflux+1, nwflux+nwaux
1364 typeboundary(iw,:) = typeboundary(1, :)
1368 if (any(typeboundary == 0))
then
1369 call mpistop(
"Not all boundary conditions have been defined")
1373 periodb(idim)=(any(typeboundary(:,2*idim-1:2*idim)==bc_periodic))
1374 aperiodb(idim)=(any(typeboundary(:,2*idim-1:2*idim)==bc_aperiodic))
1375 if (periodb(idim).or.aperiodb(idim))
then
1377 if (typeboundary(iw,2*idim-1) .ne. typeboundary(iw,2*idim)) &
1378 call mpistop(
"Wrong counterpart in periodic boundary")
1380 if (typeboundary(iw,2*idim-1) /= bc_periodic .and. &
1381 typeboundary(iw,2*idim-1) /= bc_aperiodic)
then
1382 call mpistop(
"Each dimension should either have all "//&
1383 "or no variables periodic, some can be aperiodic")
1390 if(any(typeboundary(:,2*idim-1)==12))
then
1391 if(any(typeboundary(:,2*idim-1)/=12)) typeboundary(:,2*idim-1)=12
1392 select case(physics_type)
1393 case (
'rho',
'ard',
'nonlinear',
'ffhd')
1395 typeboundary(:,2*idim-1)=bc_symm
1396 if(mype==0) print *,
'symmetric minimal pole'
1397 case (
'hd',
'rhd',
'srhd',
'mhd',
'rmhd')
1398 typeboundary(:,2*idim-1)=bc_symm
1400 if(phys_energy)
then
1405 select case(coordinate)
1408 typeboundary(r_+1,2*idim-1)=bc_asymm
1409 typeboundary(phi_+1,2*idim-1)=bc_asymm
1410 if(physics_type==
'mhd'.or.physics_type==
'rmhd')
then
1411 typeboundary(ndir+windex+r_,2*idim-1)=bc_asymm
1412 typeboundary(ndir+windex+phi_,2*idim-1)=bc_asymm
1415 typeboundary(3:ndir+1,2*idim-1)=bc_asymm
1416 if(physics_type==
'mhd'.or.physics_type==
'rmhd') typeboundary(ndir+windex+2:ndir+windex+ndir,2*idim-1)=bc_asymm
1418 call mpistop(
'Pole is in cylindrical, polar, spherical coordinates!')
1421 call mpistop(
'Pole treatment for twofl or mf not implemented yet')
1423 call mpistop(
'unknown physics type for setting minimal pole boundary treatment')
1426 if(any(typeboundary(:,2*idim)==12))
then
1427 if(any(typeboundary(:,2*idim)/=12)) typeboundary(:,2*idim)=12
1428 select case(physics_type)
1429 case (
'rho',
'ard',
'nonlinear',
'ffhd')
1431 typeboundary(:,2*idim)=bc_symm
1432 if(mype==0) print *,
'symmetric maximal pole'
1433 case (
'hd',
'rhd',
'srhd',
'mhd',
'rmhd')
1434 typeboundary(:,2*idim)=bc_symm
1436 if(phys_energy)
then
1441 select case(coordinate)
1444 typeboundary(r_+1,2*idim)=bc_asymm
1445 typeboundary(phi_+1,2*idim)=bc_asymm
1446 if(physics_type==
'mhd'.or.physics_type==
'rmhd')
then
1447 typeboundary(ndir+windex+r_,2*idim)=bc_asymm
1448 typeboundary(ndir+windex+phi_,2*idim)=bc_asymm
1451 typeboundary(3:ndir+1,2*idim)=bc_asymm
1452 if(physics_type==
'mhd'.or.physics_type==
'rmhd') typeboundary(ndir+windex+2:ndir+windex+ndir,2*idim)=bc_asymm
1454 call mpistop(
'Pole is in cylindrical, polar, spherical coordinates!')
1457 call mpistop(
'Pole treatment for twofl or mf not implemented yet')
1459 call mpistop(
'unknown physics type for setting maximal pole boundary treatment')
1465 if(.not.phys_energy)
then
1470 if(any(limiter(1:nlevelshi)==
'mp5'))
then
1471 nghostcells=max(nghostcells,3)
1474 if(any(limiter(1:nlevelshi)==
'weno5'))
then
1475 nghostcells=max(nghostcells,3)
1478 if(any(limiter(1:nlevelshi)==
'weno5nm'))
then
1479 nghostcells=max(nghostcells,3)
1482 if(any(limiter(1:nlevelshi)==
'wenoz5'))
then
1483 nghostcells=max(nghostcells,3)
1486 if(any(limiter(1:nlevelshi)==
'wenoz5nm'))
then
1487 nghostcells=max(nghostcells,3)
1490 if(any(limiter(1:nlevelshi)==
'wenozp5'))
then
1491 nghostcells=max(nghostcells,3)
1494 if(any(limiter(1:nlevelshi)==
'wenozp5nm'))
then
1495 nghostcells=max(nghostcells,3)
1498 if(any(limiter(1:nlevelshi)==
'teno5ad'))
then
1499 nghostcells=max(nghostcells,3)
1502 if(any(limiter(1:nlevelshi)==
'weno5cu6'))
then
1503 nghostcells=max(nghostcells,3)
1506 if(any(limiter(1:nlevelshi)==
'ppm'))
then
1507 if(flatsh .or. flatcd)
then
1508 nghostcells=max(nghostcells,4)
1510 nghostcells=max(nghostcells,3)
1514 if(any(limiter(1:nlevelshi)==
'weno7'))
then
1515 nghostcells=max(nghostcells,4)
1518 if(any(limiter(1:nlevelshi)==
'mpweno7'))
then
1519 nghostcells=max(nghostcells,4)
1523 nghostcells = nghostcells + phys_wider_stencil
1526 if(stagger_grid .and. refine_max_level>1 .and. mod(nghostcells,2)/=0)
then
1527 nghostcells=nghostcells+1
1530 select case (coordinate)
1533 xprob^lim^de=xprob^lim^de*two*dpi;
1538 xprob^lim^d=xprob^lim^d*two*dpi;
1544 {ixghi^d = block_nx^d + 2*nghostcells\}
1545 {ixgshi^d = ixghi^d\}
1547 nx_vec = [{domain_nx^d|, }]
1548 block_nx_vec = [{block_nx^d|, }]
1550 if (any(nx_vec < 4) .or. any(mod(nx_vec, 2) == 1)) &
1551 call mpistop(
'Grid size (domain_nx^D) has to be even and >= 4')
1553 if (any(block_nx_vec < 4) .or. any(mod(block_nx_vec, 2) == 1)) &
1554 call mpistop(
'Block size (block_nx^D) has to be even and >= 4')
1556 {
if(mod(domain_nx^d,block_nx^d)/=0) &
1557 call mpistop(
'Grid (domain_nx^D) and block (block_nx^D) must be consistent') \}
1559 if(refine_max_level>nlevelshi.or.refine_max_level<1)
then
1560 write(unitterm,*)
'Error: refine_max_level',refine_max_level,
'>nlevelshi ',nlevelshi
1561 call mpistop(
"Reset nlevelshi and recompile!")
1564 if (any(stretched_dim))
then
1565 allocate(qstretch(0:nlevelshi,1:ndim),dxfirst(0:nlevelshi,1:ndim),&
1566 dxfirst_1mq(0:nlevelshi,1:ndim),dxmid(0:nlevelshi,1:ndim))
1567 allocate(nstretchedblocks(1:nlevelshi,1:ndim))
1568 qstretch(0:nlevelshi,1:ndim)=0.0d0
1569 dxfirst(0:nlevelshi,1:ndim)=0.0d0
1570 nstretchedblocks(1:nlevelshi,1:ndim)=0
1571 {
if (stretch_type(^d) == stretch_uni)
then
1573 if(qstretch_baselevel(^d)<1.0d0.or.qstretch_baselevel(^d)==bigdouble)
then
1575 write(*,*)
'stretched grid needs finite qstretch_baselevel>1'
1576 write(*,*)
'will try default value for qstretch_baselevel in dimension', ^d
1578 if(xprobmin^d>smalldouble)
then
1579 qstretch_baselevel(^d)=(xprobmax^d/xprobmin^d)**(1.d0/dble(domain_nx^d))
1581 call mpistop(
"can not set qstretch_baselevel automatically")
1584 if(mod(block_nx^d,2)==1) &
1585 call mpistop(
"stretched grid needs even block size block_nxD")
1586 if(mod(domain_nx^d/block_nx^d,2)/=0) &
1587 call mpistop(
"number level 1 blocks in D must be even")
1588 qstretch(1,^d)=qstretch_baselevel(^d)
1589 dxfirst(1,^d)=(xprobmax^d-xprobmin^d) &
1590 *(1.0d0-qstretch(1,^d))/(1.0d0-qstretch(1,^d)**domain_nx^d)
1591 qstretch(0,^d)=qstretch(1,^d)**2
1592 dxfirst(0,^d)=dxfirst(1,^d)*(1.0d0+qstretch(1,^d))
1593 if(refine_max_level>1)
then
1594 do ilev=2,refine_max_level
1595 qstretch(ilev,^d)=dsqrt(qstretch(ilev-1,^d))
1596 dxfirst(ilev,^d)=dxfirst(ilev-1,^d) &
1597 /(1.0d0+dsqrt(qstretch(ilev-1,^d)))
1602 {
if(stretch_type(^d) == stretch_uni)
then
1603 write(*,*)
'Stretched dimension ', ^d
1604 write(*,*)
'Using stretched grid with qs=',qstretch(0:refine_max_level,^d)
1605 write(*,*)
' and first cell sizes=',dxfirst(0:refine_max_level,^d)
1608 {
if(stretch_type(^d) == stretch_symm)
then
1610 write(*,*)
'will apply symmetric stretch in dimension', ^d
1612 if(mod(block_nx^d,2)==1) &
1613 call mpistop(
"stretched grid needs even block size block_nxD")
1615 if(nstretchedblocks_baselevel(^d)==0) &
1616 call mpistop(
"need finite even number of stretched blocks at baselevel")
1617 if(mod(nstretchedblocks_baselevel(^d),2)==1) &
1618 call mpistop(
"need even number of stretched blocks at baselevel")
1619 if(qstretch_baselevel(^d)<1.0d0.or.qstretch_baselevel(^d)==bigdouble) &
1620 call mpistop(
'stretched grid needs finite qstretch_baselevel>1')
1622 ipower=(nstretchedblocks_baselevel(^d)/2)*block_nx^d
1623 if(nstretchedblocks_baselevel(^d)==domain_nx^d/block_nx^d)
then
1624 xstretch^d=0.5d0*(xprobmax^d-xprobmin^d)
1626 xstretch^d=(xprobmax^d-xprobmin^d) &
1627 /(2.0d0+dble(domain_nx^d-nstretchedblocks_baselevel(^d)*block_nx^d) &
1628 *(1.0d0-qstretch_baselevel(^d))/(1.0d0-qstretch_baselevel(^d)**ipower))
1630 if(xstretch^d>(xprobmax^d-xprobmin^d)*0.5d0) &
1631 call mpistop(
" stretched grid part should not exceed full domain")
1632 dxfirst(1,^d)=xstretch^d*(1.0d0-qstretch_baselevel(^d)) &
1633 /(1.0d0-qstretch_baselevel(^d)**ipower)
1634 nstretchedblocks(1,^d)=nstretchedblocks_baselevel(^d)
1635 qstretch(1,^d)=qstretch_baselevel(^d)
1636 qstretch(0,^d)=qstretch(1,^d)**2
1637 dxfirst(0,^d)=dxfirst(1,^d)*(1.0d0+qstretch(1,^d))
1638 dxmid(1,^d)=dxfirst(1,^d)
1639 dxmid(0,^d)=dxfirst(1,^d)*2.0d0
1640 if(refine_max_level>1)
then
1641 do ilev=2,refine_max_level
1642 nstretchedblocks(ilev,^d)=2*nstretchedblocks(ilev-1,^d)
1643 qstretch(ilev,^d)=dsqrt(qstretch(ilev-1,^d))
1644 dxfirst(ilev,^d)=dxfirst(ilev-1,^d) &
1645 /(1.0d0+dsqrt(qstretch(ilev-1,^d)))
1646 dxmid(ilev,^d)=dxmid(ilev-1,^d)/2.0d0
1650 sizeuniformpart^d=dxfirst(1,^d) &
1651 *(domain_nx^d-nstretchedblocks_baselevel(^d)*block_nx^d)
1653 print *,
'uniform part of size=',sizeuniformpart^d
1654 print *,
'setting of domain is then=',2*xstretch^d+sizeuniformpart^d
1655 print *,
'versus=',xprobmax^d-xprobmin^d
1657 if(dabs(xprobmax^d-xprobmin^d-2*xstretch^d-sizeuniformpart^d)>smalldouble)
then
1658 call mpistop(
'mismatch in domain size!')
1661 dxfirst_1mq(0:refine_max_level,1:ndim)=dxfirst(0:refine_max_level,1:ndim) &
1662 /(1.0d0-qstretch(0:refine_max_level,1:ndim))
1665 dx_vec = [{xprobmax^d-xprobmin^d|, }] / nx_vec
1668 write(c_ndim,
'(I1)') ^nd
1669 write(unitterm,
'(A30,' // c_ndim //
'(I0," "))') &
1670 ' Domain size (cells): ', nx_vec
1671 write(unitterm,
'(A30,' // c_ndim //
'(E9.3," "))') &
1672 ' Level one dx: ', dx_vec
1675 if (any(dx_vec < smalldouble)) &
1676 call mpistop(
"Incorrect domain size (too small grid spacing)")
1680 if(sum(w_refine_weight(:))==0) w_refine_weight(1) = 1.d0
1681 if(dabs(sum(w_refine_weight(:))-1.d0)>smalldouble)
then
1682 write(unitterm,*)
"Sum of all elements in w_refine_weight be 1.d0"
1683 call mpistop(
"Reset w_refine_weight so the sum is 1.d0")
1686 select case (typeboundspeed)
1691 case(
'cmaxleftright')
1696 call mpistop(
"set typeboundspeed='Einfeldt' or 'cmaxmean' or 'cmaxleftright' or 'pvrs'")
1699 if (mype==0)
write(unitterm,
'(A30)', advance=
'no')
'Refine estimation: '
1701 select case (refine_criterion)
1703 if (mype==0)
write(unitterm,
'(A)')
"user defined"
1705 if (mype==0)
write(unitterm,
'(A)')
"relative error"
1707 if (mype==0)
write(unitterm,
'(A)')
"Lohner's original scheme"
1709 if (mype==0)
write(unitterm,
'(A)')
"Lohner's scheme"
1711 call mpistop(
"Unknown error estimator, change refine_criterion")
1714 if (tfixgrid<bigdouble/2.0d0)
then
1715 if(mype==0)print*,
'Warning, at time=',tfixgrid,
'the grid will be fixed'
1717 if (itfixgrid<biginteger/2)
then
1718 if(mype==0)print*,
'Warning, at iteration=',itfixgrid,
'the grid will be fixed'
1720 if (ditregrid>1)
then
1721 if(mype==0)print*,
'Note, Grid is reconstructed once every',ditregrid,
'iterations'
1726 select case(slicedir(islice))
1728 if(slicecoord(islice)<xprobmin^d.or.slicecoord(islice)>xprobmax^d) &
1729 write(uniterr,*)
'Warning in read_par_files: ', &
1730 'Slice ', islice,
' coordinate',slicecoord(islice),
'out of bounds for dimension ',slicedir(islice)
1736 write(unitterm,
'(A30,A,A)')
'restart_from_file: ',
' ', trim(restart_from_file)
1737 write(unitterm,
'(A30,L1)')
'converting: ', convert
1738 write(unitterm,
'(A)')
''
1741 deallocate(flux_scheme)
1893 integer,
intent(in) :: fh
1894 integer(MPI_OFFSET_KIND),
intent(out) :: offset_tree
1895 integer(MPI_OFFSET_KIND),
intent(out) :: offset_block
1897 double precision :: rbuf(ndim)
1898 double precision,
allocatable :: params(:)
1899 integer :: i, version
1900 integer :: ibuf(ndim), iw
1901 integer :: er, n_par, tmp_int
1902 integer,
dimension(MPI_STATUS_SIZE) :: st
1903 logical :: periodic(ndim)
1904 character(len=name_len),
allocatable :: var_names(:), param_names(:)
1905 character(len=name_len) :: phys_name, geom_name
1908 call mpi_file_read(fh, version, 1, mpi_integer, st, er)
1910 call mpistop(
"Incompatible file version (maybe old format?)")
1914 call mpi_file_read(fh, ibuf(1), 1, mpi_integer, st, er)
1915 offset_tree = ibuf(1)
1918 call mpi_file_read(fh, ibuf(1), 1, mpi_integer, st, er)
1919 offset_block = ibuf(1)
1922 call mpi_file_read(fh, ibuf(1), 1, mpi_integer, st, er)
1924 if (nw /= ibuf(1))
then
1925 write(*,*)
"nw=",nw,
" and nw found in restart file=",ibuf(1)
1926 write(*,*)
"Please be aware of changes in w at restart."
1931 call mpi_file_read(fh, ibuf(1), 1, mpi_integer, st, er)
1932 if (ibuf(1) /=
ndir)
then
1935 write(*,*)
"WARNING: ndir in restart file = ",ibuf(1),
" but current ndir = ",
ndir
1936 write(*,*)
"allow_ndir_change=T: loading anyway (block I/O is ndim-based)."
1937 write(*,*)
"Ensure usr_transform_w maps the source vars into the right slots."
1940 write(*,*)
"ndir in restart file = ",ibuf(1)
1941 write(*,*)
"ndir = ",
ndir
1942 call mpistop(
"reset ndir to ndir in restart file (or set allow_ndir_change=T)")
1947 call mpi_file_read(fh, ibuf(1), 1, mpi_integer, st, er)
1948 if (ibuf(1) /= ndim)
then
1949 write(*,*)
"ndim in restart file = ",ibuf(1)
1950 write(*,*)
"ndim = ",ndim
1951 call mpistop(
"reset ndim to ndim in restart file")
1955 call mpi_file_read(fh, ibuf(1), 1, mpi_integer, st, er)
1957 write(*,*)
"number of levels in restart file = ",ibuf(1)
1959 call mpistop(
"refine_max_level < num. levels in restart file")
1963 call mpi_file_read(fh,
nleafs, 1, mpi_integer, st, er)
1966 call mpi_file_read(fh,
nparents, 1, mpi_integer, st, er)
1969 call mpi_file_read(fh,
it, 1, mpi_integer, st, er)
1972 call mpi_file_read(fh,
global_time, 1, mpi_double_precision, st, er)
1975 call mpi_file_read(fh,rbuf(1:ndim),ndim,mpi_double_precision,st,er)
1976 if (maxval(abs(rbuf(1:ndim) - [ xprobmin^
d ])) > 0)
then
1977 write(*,*)
"Error: xprobmin differs from restart data: ", rbuf(1:ndim)
1978 call mpistop(
"change xprobmin^D in par file")
1982 call mpi_file_read(fh,rbuf(1:ndim),ndim,mpi_double_precision,st,er)
1983 if (maxval(abs(rbuf(1:ndim) - [ xprobmax^
d ])) > 0)
then
1984 write(*,*)
"Error: xprobmax differs from restart data: ", rbuf(1:ndim)
1985 call mpistop(
"change xprobmax^D in par file")
1989 call mpi_file_read(fh,ibuf(1:ndim), ndim, mpi_integer,st,er)
1990 if (any(ibuf(1:ndim) /= [
domain_nx^
d ]))
then
1991 write(*,*)
"Error: mesh size differs from restart data: ", ibuf(1:ndim)
1992 call mpistop(
"change domain_nx^D in par file")
1996 call mpi_file_read(fh,ibuf(1:ndim), ndim, mpi_integer,st,er)
1997 if (any(ibuf(1:ndim) /= [
block_nx^
d ]))
then
1998 write(*,*)
"Error: block size differs from restart data:", ibuf(1:ndim)
1999 call mpistop(
"change block_nx^D in par file")
2003 if (version > 4)
then
2004 call mpi_file_read(fh, periodic, ndim, mpi_logical, st, er)
2005 if ({periodic(^
d) .and. .not.
periodb(^
d) .or. .not.periodic(^
d) .and.
periodb(^
d)| .or. }) &
2006 call mpistop(
"change in periodicity in par file")
2008 call mpi_file_read(fh, geom_name, name_len, mpi_character, st, er)
2012 if (
mype==0)
write(*,*)
"WARNING: coordinates in data = ",trim(geom_name), &
2013 " vs current ",trim(
geometry_name),
"; allow_ndir_change=T (e.g. Cartesian_2D->2.5D), loading anyway."
2015 write(*,*)
"type of coordinates in data is: ", geom_name
2016 call mpistop(
"select the correct coordinates in mod_usr.t file")
2020 call mpi_file_read(fh, stagger_mark_dat, 1, mpi_logical, st, er)
2022 write(*,*)
"Warning: stagger grid flag differs from restart data:", stagger_mark_dat
2028 if (version > 3)
then
2032 call mpi_file_read(fh, var_names(iw), name_len, mpi_character, st, er)
2036 call mpi_file_read(fh, phys_name, name_len, mpi_character, st, er)
2042 call mpi_file_read(fh, n_par, 1, mpi_integer, st, er)
2043 allocate(params(n_par))
2044 allocate(param_names(n_par))
2045 call mpi_file_read(fh, params, n_par, mpi_double_precision, st, er)
2046 call mpi_file_read(fh, param_names, name_len * n_par, mpi_character, st, er)
2049 call mpi_file_read(fh, tmp_int, 1, mpi_integer, st, er)
2054 call mpi_file_read(fh, tmp_int, 1, mpi_integer, st, er)
2057 call mpi_file_read(fh, tmp_int, 1, mpi_integer, st, er)