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'
546 flux_scheme(level) =
'tvdlf'
548 limiter(level) =
'minmod'
549 gradient_limiter(level) =
'minmod'
556 typesourcesplit =
'sfs'
583 if(i==j.or.j==k.or.k==i)
then
585 else if(i+1==j.or.i-2==j)
then
602 inquire(file=trim(
par_files(i)), exist=file_exists)
604 if (.not. file_exists)
then
605 write(err_msg, *)
"The parameter file " // trim(
par_files(i)) // &
615 read(
unitpar, filelist,
end=101)
618 read(unitpar, savelist,
end=102)
621 read(unitpar, stoplist,
end=103)
624 read(unitpar, methodlist,
end=104)
627 read(unitpar, boundlist,
end=105)
630 read(unitpar, meshlist,
end=106)
633 read(unitpar, paramlist,
end=107)
636 read(unitpar, emissionlist,
end=108)
641 if (base_filename /= basename_prev) &
642 basename_full = trim(basename_full) // trim(base_filename)
643 basename_prev = base_filename
646 base_filename = basename_full
650 dummy_file = trim(base_filename)//
"DUMMY"
651 open(newunit=my_unit, file=trim(dummy_file), iostat=iostate)
652 if (iostate /= 0)
then
653 call mpistop(
"Can't write to output directory (" // &
654 trim(base_filename) //
")")
656 close(my_unit, status=
'delete')
660 if(source_split_usr) any_source_split=.true.
663 if(restart_from_file_arg /= undefined) &
664 restart_from_file=restart_from_file_arg
668 if(restart_from_file == undefined)
then
671 do index_latest_data = 9999, 0, -1
677 if(.not.file_exists) index_latest_data=-1
683 call mpi_bcast(index_latest_data, 1, mpi_integer, 0, icomm, ierrmpi)
685 if (resume_previous_run)
then
686 if (index_latest_data == -1)
then
687 if(mype==0)
write(*,*)
"No snapshots found to resume from, start a new run..."
690 write(restart_from_file,
"(a,i4.4,a)") trim(base_filename),index_latest_data,
".dat"
694 if (restart_from_file == undefined)
then
699 call mpistop(
"Please restart from a snapshot when firstprocess=T")
701 call mpistop(
'Change convert to .false. for a new run!')
704 if (small_pressure < 0.d0)
call mpistop(
"small_pressure should be positive.")
705 if (small_density < 0.d0)
call mpistop(
"small_density should be positive.")
706 if (ghostcell_comm_batched .and. ghostcell_comm_batch_size < 1) &
707 call mpistop(
"ghostcell_comm_batch_size should be positive.")
709 if (small_temperature>0.d0) small_pressure=small_density*small_temperature
711 if(convert) autoconvert=.false.
713 where (tsave_log < bigdouble) tsave(:, 1) = tsave_log
714 where (tsave_dat < bigdouble) tsave(:, 2) = tsave_dat
715 where (tsave_slice < bigdouble) tsave(:, 3) = tsave_slice
716 where (tsave_collapsed < bigdouble) tsave(:, 4) = tsave_collapsed
717 where (tsave_custom < bigdouble) tsave(:, 5) = tsave_custom
719 if (dtsave_log < bigdouble) dtsave(1) = dtsave_log
720 if (dtsave_dat < bigdouble) dtsave(2) = dtsave_dat
721 if (dtsave_slice < bigdouble) dtsave(3) = dtsave_slice
722 if (dtsave_collapsed < bigdouble) dtsave(4) = dtsave_collapsed
723 if (dtsave_custom < bigdouble) dtsave(5) = dtsave_custom
725 if (tsavestart_log < bigdouble) tsavestart(1) = tsavestart_log
726 if (tsavestart_dat < bigdouble) tsavestart(2) = tsavestart_dat
727 if (tsavestart_slice < bigdouble) tsavestart(3) = tsavestart_slice
728 if (tsavestart_collapsed < bigdouble) tsavestart(4) = tsavestart_collapsed
729 if (tsavestart_custom < bigdouble) tsavestart(5) = tsavestart_custom
731 if (ditsave_log < bigdouble) ditsave(1) = ditsave_log
732 if (ditsave_dat < bigdouble) ditsave(2) = ditsave_dat
733 if (ditsave_slice < bigdouble) ditsave(3) = ditsave_slice
734 if (ditsave_collapsed < bigdouble) ditsave(4) = ditsave_collapsed
735 if (ditsave_custom < bigdouble) ditsave(5) = ditsave_custom
737 if (wall_time_max < bigdouble) wall_time_max=wall_time_max*3600.d0
740 write(unitterm, *)
''
741 write(unitterm, *)
'Output type | tsavestart | dtsave | ditsave | itsave(1) | tsave(1)'
742 write(fmt_string, *)
'(A12," | ",E9.3E2," | ",E9.3E2," | ",I6," | "'//&
747 if (mype == 0)
write(unitterm, fmt_string) trim(output_names(ifile)), &
748 tsavestart(ifile), dtsave(ifile), ditsave(ifile), itsave(1, ifile), tsave(1, ifile)
751 if (mype == 0)
write(unitterm, *)
''
754 if(slicedir(islice) > ndim) &
755 write(uniterr,*)
'Warning in read_par_files: ', &
756 'Slice ', islice,
' direction',slicedir(islice),
'larger than ndim=',ndim
757 if(slicedir(islice) < 1) &
758 write(uniterr,*)
'Warning in read_par_files: ', &
759 'Slice ', islice,
' direction',slicedir(islice),
'too small, should be [',1,ndim,
']'
762 if(it_max==biginteger .and. time_max==bigdouble.and.mype==0)
write(uniterr,*) &
763 'Warning in read_par_files: it_max or time_max not given!'
765 select case (typecourant)
767 type_courant=type_maxsum
769 type_courant=type_summax
770 if (local_timestep)
then
771 call mpistop(
"Type courant summax incompatible with local_timestep")
774 type_courant=type_minimum
775 if (local_timestep)
then
776 call mpistop(
"Type courant minimum incompatible with local_timestep")
779 write(unitterm,*)
'Unknown typecourant=',typecourant
780 call mpistop(
"Error from read_par_files: no such typecourant!")
785 select case (flux_scheme(level))
787 flux_method(level)=fs_hll
789 flux_method(level)=fs_hllc
791 flux_method(level)=fs_hlld
793 flux_method(level)=fs_hllcd
795 flux_method(level)=fs_tvdlf
797 flux_method(level)=fs_tvdmu
799 flux_method(level)=fs_tvd
801 flux_method(level)=fs_cd
803 flux_method(level)=fs_cd4
805 flux_method(level)=fs_fd
807 flux_method(level)=fs_source
809 flux_method(level)=fs_nul
811 call mpistop(
"unkown or bad flux scheme")
813 if(flux_scheme(level)==
'tvd'.and.time_stepper/=
'onestep') &
814 call mpistop(
" tvd is onestep method, reset time_stepper='onestep'")
815 if(flux_scheme(level)==
'tvd')
then
816 if(mype==0.and.(.not.dimsplit))
write(unitterm,*) &
817 'Warning: setting dimsplit=T for tvd, as used for level=',level
820 if(flux_scheme(level)==
'hlld'.and.physics_type/=
'mhd' .and. physics_type/=
'twofl') &
821 call mpistop(
"Cannot use hlld flux if not using MHD or 2FL only charges physics!")
823 if(flux_scheme(level)==
'hllc'.and.physics_type==
'mf') &
824 call mpistop(
"Cannot use hllc flux if using magnetofriction physics!")
826 if(flux_scheme(level)==
'tvd'.and.physics_type==
'mf') &
827 call mpistop(
"Cannot use tvd flux if using magnetofriction physics!")
829 if(flux_scheme(level)==
'tvdmu'.and.physics_type==
'mf') &
830 call mpistop(
"Cannot use tvdmu flux if using magnetofriction physics!")
832 if (typepred1(level)==0)
then
833 select case (flux_scheme(level))
835 typepred1(level)=fs_cd
837 typepred1(level)=fs_cd4
839 typepred1(level)=fs_fd
840 case (
'tvdlf',
'tvdmu')
841 typepred1(level)=fs_hancock
843 typepred1(level)=fs_hll
845 typepred1(level)=fs_hllc
847 typepred1(level)=fs_hllcd
849 typepred1(level)=fs_hlld
850 case (
'nul',
'source',
'tvd')
851 typepred1(level)=fs_nul
853 call mpistop(
"No default predictor for this full step")
859 if(any(flux_scheme==
'fd')) need_global_cmax=.true.
862 select case (typecurl)
868 type_curl=stokesbased
870 write(unitterm,*)
"typecurl=",typecurl
871 call mpistop(
"unkown type of curl operator in read_par_files")
875 select case (time_stepper)
879 if (time_integrator==
'default')
then
880 time_integrator=
"Forward_Euler"
882 select case (time_integrator)
883 case (
"Forward_Euler")
884 t_integrator=forward_euler
886 t_integrator=imex_euler
890 write(unitterm,*)
"time_integrator=",time_integrator,
"time_stepper=",time_stepper
891 call mpistop(
"unkown onestep time_integrator in read_par_files")
893 use_imex_scheme=(t_integrator==imex_euler.or.t_integrator==imex_sp)
897 if (time_integrator==
'default')
then
898 time_integrator=
"Predictor_Corrector"
900 select case (time_integrator)
901 case (
"Predictor_Corrector")
902 t_integrator=predictor_corrector
907 case (
"IMEX_Midpoint")
908 t_integrator=imex_midpoint
909 case (
"IMEX_Trapezoidal")
910 t_integrator=imex_trapezoidal
912 t_integrator=imex_222
914 write(unitterm,*)
"time_integrator=",time_integrator,
"time_stepper=",time_stepper
915 call mpistop(
"unkown twostep time_integrator in read_par_files")
917 use_imex_scheme=(t_integrator==imex_midpoint.or.t_integrator==imex_trapezoidal&
918 .or.t_integrator==imex_222)
919 if (t_integrator==rk2_alf)
then
920 if(rk2_alfa<smalldouble.or.rk2_alfa>one)
call mpistop(
"set rk2_alfa within [0,1]")
922 rk_b2=1.0d0/(2.0d0*rk2_alfa)
928 if (time_integrator==
'default')
then
929 time_integrator=
'ssprk3'
931 select case (time_integrator)
937 t_integrator=imex_ars3
939 t_integrator=imex_232
941 t_integrator=imex_cb3a
943 write(unitterm,*)
"time_integrator=",time_integrator,
"time_stepper=",time_stepper
944 call mpistop(
"unkown threestep time_integrator in read_par_files")
946 if(t_integrator==rk3_bt)
then
947 select case(rk3_switch)
977 call mpistop(
"Unknown rk3_switch")
980 rk3_b3=1.0d0-rk3_b1-rk3_b2
982 rk3_c3=rk3_a31+rk3_a32
984 if(t_integrator==ssprk3)
then
985 select case(ssprk_order)
988 rk_beta22=1.0d0/4.0d0
989 rk_beta33=2.0d0/3.0d0
990 rk_alfa21=3.0d0/4.0d0
991 rk_alfa31=1.0d0/3.0d0
995 rk_beta11=1.0d0/2.0d0
996 rk_beta22=1.0d0/2.0d0
997 rk_beta33=1.0d0/3.0d0
999 rk_alfa31=1.0d0/3.0d0
1003 call mpistop(
"Unknown ssprk3_order")
1005 rk_alfa22=1.0d0-rk_alfa21
1006 rk_alfa33=1.0d0-rk_alfa31
1008 if(t_integrator==imex_ars3)
then
1009 ars_gamma=(3.0d0+dsqrt(3.0d0))/6.0d0
1011 if(t_integrator==imex_232)
then
1012 select case(imex_switch)
1014 im_delta=1.0d0-1.0d0/dsqrt(2.0d0)
1015 im_nu=(3.0d0+2.0d0*dsqrt(2.0d0))/6.0d0
1016 imex_a21=2.0d0*im_delta
1017 imex_a31=1.0d0-im_nu
1019 imex_b1=1.0d0/(2.0d0*dsqrt(2.0d0))
1020 imex_b2=1.0d0/(2.0d0*dsqrt(2.0d0))
1025 imex_a21=0.711664700366941d0
1026 imex_a31=0.077338168947683d0
1027 imex_a32=0.917273367886007d0
1028 imex_b1=0.398930808264688d0
1029 imex_b2=0.345755244189623d0
1030 imex_ha21=0.353842865099275d0
1031 imex_ha22=0.353842865099275d0
1033 call mpistop(
"Unknown imex_siwtch")
1036 imex_c3=imex_a31+imex_a32
1037 imex_b3=1.0d0-imex_b1-imex_b2
1039 if(t_integrator==imex_cb3a)
then
1040 imex_c2 = 0.8925502329346865
1043 imex_c3 = imex_c2 / (6.0d0*imex_c2**2 - 3.0d0*imex_c2 + 1.0d0)
1045 imex_b2 = (3.0d0*imex_c2 - 1.0d0) / (6.0d0*imex_c2**2)
1046 imex_b3 = (6.0d0*imex_c2**2 - 3.0d0*imex_c2 + 1.0d0) / (6.0d0*imex_c2**2)
1047 imex_a33 = (1.0d0/6.0d0 - imex_b2*imex_c2**2 - imex_b3*imex_c2*imex_c3) / (imex_b3*(imex_c3-imex_c2))
1048 imex_a32 = imex_c3 - imex_a33
1062 use_imex_scheme=(t_integrator==imex_ars3.or.t_integrator==imex_232.or.t_integrator==imex_cb3a)
1066 if (time_integrator==
'default')
then
1067 time_integrator=
"ssprk4"
1069 select case (time_integrator)
1075 write(unitterm,*)
"time_integrator=",time_integrator,
"time_stepper=",time_stepper
1076 call mpistop(
"unkown fourstep time_integrator in read_par_files")
1078 if(t_integrator==ssprk4)
then
1079 select case(ssprk_order)
1081 rk_beta11=1.0d0/2.0d0
1082 rk_beta22=1.0d0/2.0d0
1083 rk_beta33=1.0d0/6.0d0
1084 rk_beta44=1.0d0/2.0d0
1086 rk_alfa31=2.0d0/3.0d0
1092 rk_beta11=1.0d0/3.0d0
1093 rk_beta22=1.0d0/3.0d0
1094 rk_beta33=1.0d0/3.0d0
1095 rk_beta44=1.0d0/4.0d0
1098 rk_alfa41=1.0d0/4.0d0
1103 call mpistop(
"Unknown ssprk_order")
1105 rk_alfa22=1.0d0-rk_alfa21
1106 rk_alfa33=1.0d0-rk_alfa31
1107 rk_alfa44=1.0d0-rk_alfa41
1112 if (time_integrator==
'default')
then
1113 time_integrator=
"ssprk5"
1115 select case (time_integrator)
1119 write(unitterm,*)
"time_integrator=",time_integrator,
"time_stepper=",time_stepper
1120 call mpistop(
"unkown fivestep time_integrator in read_par_files")
1122 if(t_integrator==ssprk5)
then
1123 select case(ssprk_order)
1126 rk_beta11=0.391752226571890d0
1127 rk_beta22=0.368410593050371d0
1128 rk_beta33=0.251891774271694d0
1129 rk_beta44=0.544974750228521d0
1130 rk_beta54=0.063692468666290d0
1131 rk_beta55=0.226007483236906d0
1132 rk_alfa21=0.444370493651235d0
1133 rk_alfa31=0.620101851488403d0
1134 rk_alfa41=0.178079954393132d0
1135 rk_alfa53=0.517231671970585d0
1136 rk_alfa54=0.096059710526147d0
1138 rk_alfa22=0.555629506348765d0
1139 rk_alfa33=0.379898148511597d0
1140 rk_alfa44=0.821920045606868d0
1141 rk_alfa55=0.386708617503269d0
1142 rk_alfa22=1.0d0-rk_alfa21
1143 rk_alfa33=1.0d0-rk_alfa31
1144 rk_alfa44=1.0d0-rk_alfa41
1145 rk_alfa55=1.0d0-rk_alfa53-rk_alfa54
1147 rk_c3=rk_alfa22*rk_c2+rk_beta22
1148 rk_c4=rk_alfa33*rk_c3+rk_beta33
1149 rk_c5=rk_alfa44*rk_c4+rk_beta44
1151 rk_beta11=0.39175222700392d0
1152 rk_beta22=0.36841059262959d0
1153 rk_beta33=0.25189177424738d0
1154 rk_beta44=0.54497475021237d0
1157 rk_alfa21=0.44437049406734d0
1158 rk_alfa31=0.62010185138540d0
1159 rk_alfa41=0.17807995410773d0
1160 rk_alfa53=0.51723167208978d0
1163 rk_alfa22=1.0d0-rk_alfa21
1164 rk_alfa33=1.0d0-rk_alfa31
1165 rk_alfa44=1.0d0-rk_alfa41
1167 rka51=0.00683325884039d0
1168 rka54=0.12759831133288d0
1169 rkb54=0.08460416338212d0
1170 rk_beta54=rkb54-rk_beta44*rka51/rk_alfa41
1171 rk_alfa54=rka54-rk_alfa44*rka51/rk_alfa41
1173 rk_alfa55=1.0d0-rk_alfa53-rk_alfa54
1175 rk_c3=rk_alfa22*rk_c2+rk_beta22
1176 rk_c4=rk_alfa33*rk_c3+rk_beta33
1177 rk_c5=rk_alfa44*rk_c4+rk_beta44
1178 rk_beta55=1.0d0-rk_beta54-rk_alfa53*rk_c3-rk_alfa54*rk_c4-rk_alfa55*rk_c5
1180 call mpistop(
"Unknown ssprk_order")
1189 use_imex_scheme=.false.
1191 call mpistop(
"Unknown time_stepper in read_par_files")
1195 select case (stretch_dim(i))
1196 case (undefined,
'none')
1197 stretch_type(i) = stretch_none
1198 stretched_dim(i) = .false.
1199 case (
'uni',
'uniform')
1200 stretch_type(i) = stretch_uni
1201 stretched_dim(i) = .true.
1202 case (
'symm',
'symmetric')
1203 stretch_type(i) = stretch_symm
1204 stretched_dim(i) = .true.
1206 stretch_type(i) = stretch_none
1207 stretched_dim(i) = .false.
1208 if (mype == 0) print *,
'Got stretch_type = ', stretch_type(i)
1209 call mpistop(
'Unknown stretch type')
1214 if(typedimsplit ==
'default'.and. dimsplit) typedimsplit=
'xyyx'
1215 if(typedimsplit ==
'default'.and..not.dimsplit) typedimsplit=
'unsplit'
1216 dimsplit = typedimsplit /=
'unsplit'
1219 select case (typesourcesplit)
1221 sourcesplit=sourcesplit_sfs
1223 sourcesplit=sourcesplit_sf
1225 sourcesplit=sourcesplit_ssf
1227 sourcesplit=sourcesplit_ssfss
1229 write(unitterm,*)
'No such typesourcesplit=',typesourcesplit
1230 call mpistop(
"Error: Unknown typesourcesplit!")
1233 if(coordinate==-1)
then
1234 coordinate=cartesian
1236 write(*,*)
'Warning: coordinate system is not specified!'
1237 write(*,*)
'call set_coordinate_system in usr_init in mod_usr.t'
1238 write(*,*)
'Now use Cartesian coordinate'
1242 if(coordinate==cartesian)
then
1245 if(any(stretched_dim))
then
1246 coordinate=cartesian_stretched
1247 slab_uniform=.false.
1251 slab_uniform=.false.
1254 if(coordinate==spherical)
then
1256 if(mype==0)print *,
'Warning: spherical symmetry needs dimsplit=F, resetting'
1261 if (ndim==1) dimsplit=.false.
1264 select case(typeprolonglimit)
1279 allocate(type_limiter(nlevelshi))
1280 allocate(type_gradient_limiter(nlevelshi))
1282 do level=1,nlevelshi
1283 type_limiter(level) = limiter_type(limiter(level))
1284 type_gradient_limiter(level) = limiter_type(gradient_limiter(level))
1287 if (any(limiter(1:nlevelshi)==
'ppm')&
1288 .and.(flatsh.and.physics_type==
'rho'))
then
1289 call mpistop(
" PPM with flatsh=.true. can not be used with physics_type='rho'!")
1295 select case(typeboundary_min^d(iw))
1297 typeboundary(iw,2*^d-1)=bc_special
1299 typeboundary(iw,2*^d-1)=bc_cont
1301 typeboundary(iw,2*^d-1)=bc_symm
1303 typeboundary(iw,2*^d-1)=bc_asymm
1305 typeboundary(iw,2*^d-1)=bc_periodic
1307 typeboundary(iw,2*^d-1)=bc_aperiodic
1309 typeboundary(iw,2*^d-1)=bc_noinflow
1311 typeboundary(iw,2*^d-1)=12
1313 typeboundary(iw,2*^d-1)=bc_data
1315 typeboundary(iw,2*^d-1)=bc_icarus
1317 typeboundary(iw,2*^d-1)=bc_character
1319 write (unitterm,*)
"Undefined boundarytype found in read_par_files", &
1320 typeboundary_min^d(iw),
"for variable iw=",iw,
" and side iB=",2*^d-1
1324 select case(typeboundary_max^d(iw))
1326 typeboundary(iw,2*^d)=bc_special
1328 typeboundary(iw,2*^d)=bc_cont
1330 typeboundary(iw,2*^d)=bc_symm
1332 typeboundary(iw,2*^d)=bc_asymm
1334 typeboundary(iw,2*^d)=bc_periodic
1336 typeboundary(iw,2*^d)=bc_aperiodic
1338 typeboundary(iw,2*^d)=bc_noinflow
1340 typeboundary(iw,2*^d)=12
1342 typeboundary(iw,2*^d)=bc_data
1344 typeboundary(iw,2*^d-1)=bc_icarus
1345 case(
"bc_character")
1346 typeboundary(iw,2*^d)=bc_character
1348 write (unitterm,*)
"Undefined boundarytype found in read_par_files", &
1349 typeboundary_max^d(iw),
"for variable iw=",iw,
" and side iB=",2*^d
1355 if (nwfluxbc<nwflux)
then
1356 do iw=nwfluxbc+1,nwflux
1357 typeboundary(iw,:) = typeboundary(1, :)
1362 do iw=nwflux+1, nwflux+nwaux
1363 typeboundary(iw,:) = typeboundary(1, :)
1367 if (any(typeboundary == 0))
then
1368 call mpistop(
"Not all boundary conditions have been defined")
1372 periodb(idim)=(any(typeboundary(:,2*idim-1:2*idim)==bc_periodic))
1373 aperiodb(idim)=(any(typeboundary(:,2*idim-1:2*idim)==bc_aperiodic))
1374 if (periodb(idim).or.aperiodb(idim))
then
1376 if (typeboundary(iw,2*idim-1) .ne. typeboundary(iw,2*idim)) &
1377 call mpistop(
"Wrong counterpart in periodic boundary")
1379 if (typeboundary(iw,2*idim-1) /= bc_periodic .and. &
1380 typeboundary(iw,2*idim-1) /= bc_aperiodic)
then
1381 call mpistop(
"Each dimension should either have all "//&
1382 "or no variables periodic, some can be aperiodic")
1389 if(any(typeboundary(:,2*idim-1)==12))
then
1390 if(any(typeboundary(:,2*idim-1)/=12)) typeboundary(:,2*idim-1)=12
1391 select case(physics_type)
1392 case (
'rho',
'ard',
'rd',
'nonlinear',
'ffhd')
1394 typeboundary(:,2*idim-1)=bc_symm
1395 if(mype==0) print *,
'symmetric minimal pole'
1396 case (
'hd',
'rhd',
'srhd',
'mhd',
'rmhd')
1397 typeboundary(:,2*idim-1)=bc_symm
1399 if(phys_energy)
then
1404 select case(coordinate)
1407 typeboundary(r_+1,2*idim-1)=bc_asymm
1408 typeboundary(phi_+1,2*idim-1)=bc_asymm
1409 if(physics_type==
'mhd'.or.physics_type==
'rmhd')
then
1410 typeboundary(ndir+windex+r_,2*idim-1)=bc_asymm
1411 typeboundary(ndir+windex+phi_,2*idim-1)=bc_asymm
1414 typeboundary(3:ndir+1,2*idim-1)=bc_asymm
1415 if(physics_type==
'mhd'.or.physics_type==
'rmhd') typeboundary(ndir+windex+2:ndir+windex+ndir,2*idim-1)=bc_asymm
1417 call mpistop(
'Pole is in cylindrical, polar, spherical coordinates!')
1420 call mpistop(
'Pole treatment for twofl or mf not implemented yet')
1422 call mpistop(
'unknown physics type for setting minimal pole boundary treatment')
1425 if(any(typeboundary(:,2*idim)==12))
then
1426 if(any(typeboundary(:,2*idim)/=12)) typeboundary(:,2*idim)=12
1427 select case(physics_type)
1428 case (
'rho',
'ard',
'rd',
'nonlinear',
'ffhd')
1430 typeboundary(:,2*idim)=bc_symm
1431 if(mype==0) print *,
'symmetric maximal pole'
1432 case (
'hd',
'rhd',
'srhd',
'mhd',
'rmhd')
1433 typeboundary(:,2*idim)=bc_symm
1435 if(phys_energy)
then
1440 select case(coordinate)
1443 typeboundary(r_+1,2*idim)=bc_asymm
1444 typeboundary(phi_+1,2*idim)=bc_asymm
1445 if(physics_type==
'mhd'.or.physics_type==
'rmhd')
then
1446 typeboundary(ndir+windex+r_,2*idim)=bc_asymm
1447 typeboundary(ndir+windex+phi_,2*idim)=bc_asymm
1450 typeboundary(3:ndir+1,2*idim)=bc_asymm
1451 if(physics_type==
'mhd'.or.physics_type==
'rmhd') typeboundary(ndir+windex+2:ndir+windex+ndir,2*idim)=bc_asymm
1453 call mpistop(
'Pole is in cylindrical, polar, spherical coordinates!')
1456 call mpistop(
'Pole treatment for twofl or mf not implemented yet')
1458 call mpistop(
'unknown physics type for setting maximal pole boundary treatment')
1464 if(.not.phys_energy)
then
1469 if(any(limiter(1:nlevelshi)==
'mp5'))
then
1470 nghostcells=max(nghostcells,3)
1473 if(any(limiter(1:nlevelshi)==
'weno5'))
then
1474 nghostcells=max(nghostcells,3)
1477 if(any(limiter(1:nlevelshi)==
'weno5nm'))
then
1478 nghostcells=max(nghostcells,3)
1481 if(any(limiter(1:nlevelshi)==
'wenoz5'))
then
1482 nghostcells=max(nghostcells,3)
1485 if(any(limiter(1:nlevelshi)==
'wenoz5nm'))
then
1486 nghostcells=max(nghostcells,3)
1489 if(any(limiter(1:nlevelshi)==
'wenozp5'))
then
1490 nghostcells=max(nghostcells,3)
1493 if(any(limiter(1:nlevelshi)==
'wenozp5nm'))
then
1494 nghostcells=max(nghostcells,3)
1497 if(any(limiter(1:nlevelshi)==
'teno5ad'))
then
1498 nghostcells=max(nghostcells,3)
1501 if(any(limiter(1:nlevelshi)==
'weno5cu6'))
then
1502 nghostcells=max(nghostcells,3)
1505 if(any(limiter(1:nlevelshi)==
'ppm'))
then
1506 if(flatsh .or. flatcd)
then
1507 nghostcells=max(nghostcells,4)
1509 nghostcells=max(nghostcells,3)
1513 if(any(limiter(1:nlevelshi)==
'weno7'))
then
1514 nghostcells=max(nghostcells,4)
1517 if(any(limiter(1:nlevelshi)==
'mpweno7'))
then
1518 nghostcells=max(nghostcells,4)
1522 nghostcells = nghostcells + phys_wider_stencil
1525 if(stagger_grid .and. refine_max_level>1 .and. mod(nghostcells,2)/=0)
then
1526 nghostcells=nghostcells+1
1529 select case (coordinate)
1532 xprob^lim^de=xprob^lim^de*two*dpi;
1537 xprob^lim^d=xprob^lim^d*two*dpi;
1543 {ixghi^d = block_nx^d + 2*nghostcells\}
1544 {ixgshi^d = ixghi^d\}
1546 nx_vec = [{domain_nx^d|, }]
1547 block_nx_vec = [{block_nx^d|, }]
1549 if (any(nx_vec < 4) .or. any(mod(nx_vec, 2) == 1)) &
1550 call mpistop(
'Grid size (domain_nx^D) has to be even and >= 4')
1552 if (any(block_nx_vec < 4) .or. any(mod(block_nx_vec, 2) == 1)) &
1553 call mpistop(
'Block size (block_nx^D) has to be even and >= 4')
1555 {
if(mod(domain_nx^d,block_nx^d)/=0) &
1556 call mpistop(
'Grid (domain_nx^D) and block (block_nx^D) must be consistent') \}
1558 if(refine_max_level>nlevelshi.or.refine_max_level<1)
then
1559 write(unitterm,*)
'Error: refine_max_level',refine_max_level,
'>nlevelshi ',nlevelshi
1560 call mpistop(
"Reset nlevelshi and recompile!")
1563 if (any(stretched_dim))
then
1564 allocate(qstretch(0:nlevelshi,1:ndim),dxfirst(0:nlevelshi,1:ndim),&
1565 dxfirst_1mq(0:nlevelshi,1:ndim),dxmid(0:nlevelshi,1:ndim))
1566 allocate(nstretchedblocks(1:nlevelshi,1:ndim))
1567 qstretch(0:nlevelshi,1:ndim)=0.0d0
1568 dxfirst(0:nlevelshi,1:ndim)=0.0d0
1569 nstretchedblocks(1:nlevelshi,1:ndim)=0
1570 {
if (stretch_type(^d) == stretch_uni)
then
1572 if(qstretch_baselevel(^d)<1.0d0.or.qstretch_baselevel(^d)==bigdouble)
then
1574 write(*,*)
'stretched grid needs finite qstretch_baselevel>1'
1575 write(*,*)
'will try default value for qstretch_baselevel in dimension', ^d
1577 if(xprobmin^d>smalldouble)
then
1578 qstretch_baselevel(^d)=(xprobmax^d/xprobmin^d)**(1.d0/dble(domain_nx^d))
1580 call mpistop(
"can not set qstretch_baselevel automatically")
1583 if(mod(block_nx^d,2)==1) &
1584 call mpistop(
"stretched grid needs even block size block_nxD")
1585 if(mod(domain_nx^d/block_nx^d,2)/=0) &
1586 call mpistop(
"number level 1 blocks in D must be even")
1587 qstretch(1,^d)=qstretch_baselevel(^d)
1588 dxfirst(1,^d)=(xprobmax^d-xprobmin^d) &
1589 *(1.0d0-qstretch(1,^d))/(1.0d0-qstretch(1,^d)**domain_nx^d)
1590 qstretch(0,^d)=qstretch(1,^d)**2
1591 dxfirst(0,^d)=dxfirst(1,^d)*(1.0d0+qstretch(1,^d))
1592 if(refine_max_level>1)
then
1593 do ilev=2,refine_max_level
1594 qstretch(ilev,^d)=dsqrt(qstretch(ilev-1,^d))
1595 dxfirst(ilev,^d)=dxfirst(ilev-1,^d) &
1596 /(1.0d0+dsqrt(qstretch(ilev-1,^d)))
1601 {
if(stretch_type(^d) == stretch_uni)
then
1602 write(*,*)
'Stretched dimension ', ^d
1603 write(*,*)
'Using stretched grid with qs=',qstretch(0:refine_max_level,^d)
1604 write(*,*)
' and first cell sizes=',dxfirst(0:refine_max_level,^d)
1607 {
if(stretch_type(^d) == stretch_symm)
then
1609 write(*,*)
'will apply symmetric stretch in dimension', ^d
1611 if(mod(block_nx^d,2)==1) &
1612 call mpistop(
"stretched grid needs even block size block_nxD")
1614 if(nstretchedblocks_baselevel(^d)==0) &
1615 call mpistop(
"need finite even number of stretched blocks at baselevel")
1616 if(mod(nstretchedblocks_baselevel(^d),2)==1) &
1617 call mpistop(
"need even number of stretched blocks at baselevel")
1618 if(qstretch_baselevel(^d)<1.0d0.or.qstretch_baselevel(^d)==bigdouble) &
1619 call mpistop(
'stretched grid needs finite qstretch_baselevel>1')
1621 ipower=(nstretchedblocks_baselevel(^d)/2)*block_nx^d
1622 if(nstretchedblocks_baselevel(^d)==domain_nx^d/block_nx^d)
then
1623 xstretch^d=0.5d0*(xprobmax^d-xprobmin^d)
1625 xstretch^d=(xprobmax^d-xprobmin^d) &
1626 /(2.0d0+dble(domain_nx^d-nstretchedblocks_baselevel(^d)*block_nx^d) &
1627 *(1.0d0-qstretch_baselevel(^d))/(1.0d0-qstretch_baselevel(^d)**ipower))
1629 if(xstretch^d>(xprobmax^d-xprobmin^d)*0.5d0) &
1630 call mpistop(
" stretched grid part should not exceed full domain")
1631 dxfirst(1,^d)=xstretch^d*(1.0d0-qstretch_baselevel(^d)) &
1632 /(1.0d0-qstretch_baselevel(^d)**ipower)
1633 nstretchedblocks(1,^d)=nstretchedblocks_baselevel(^d)
1634 qstretch(1,^d)=qstretch_baselevel(^d)
1635 qstretch(0,^d)=qstretch(1,^d)**2
1636 dxfirst(0,^d)=dxfirst(1,^d)*(1.0d0+qstretch(1,^d))
1637 dxmid(1,^d)=dxfirst(1,^d)
1638 dxmid(0,^d)=dxfirst(1,^d)*2.0d0
1639 if(refine_max_level>1)
then
1640 do ilev=2,refine_max_level
1641 nstretchedblocks(ilev,^d)=2*nstretchedblocks(ilev-1,^d)
1642 qstretch(ilev,^d)=dsqrt(qstretch(ilev-1,^d))
1643 dxfirst(ilev,^d)=dxfirst(ilev-1,^d) &
1644 /(1.0d0+dsqrt(qstretch(ilev-1,^d)))
1645 dxmid(ilev,^d)=dxmid(ilev-1,^d)/2.0d0
1649 sizeuniformpart^d=dxfirst(1,^d) &
1650 *(domain_nx^d-nstretchedblocks_baselevel(^d)*block_nx^d)
1652 print *,
'uniform part of size=',sizeuniformpart^d
1653 print *,
'setting of domain is then=',2*xstretch^d+sizeuniformpart^d
1654 print *,
'versus=',xprobmax^d-xprobmin^d
1656 if(dabs(xprobmax^d-xprobmin^d-2*xstretch^d-sizeuniformpart^d)>smalldouble)
then
1657 call mpistop(
'mismatch in domain size!')
1660 dxfirst_1mq(0:refine_max_level,1:ndim)=dxfirst(0:refine_max_level,1:ndim) &
1661 /(1.0d0-qstretch(0:refine_max_level,1:ndim))
1664 dx_vec = [{xprobmax^d-xprobmin^d|, }] / nx_vec
1667 write(c_ndim,
'(I1)') ^nd
1668 write(unitterm,
'(A30,' // c_ndim //
'(I0," "))') &
1669 ' Domain size (cells): ', nx_vec
1670 write(unitterm,
'(A30,' // c_ndim //
'(E9.3," "))') &
1671 ' Level one dx: ', dx_vec
1674 if (any(dx_vec < smalldouble)) &
1675 call mpistop(
"Incorrect domain size (too small grid spacing)")
1679 if(sum(w_refine_weight(:))==0) w_refine_weight(1) = 1.d0
1680 if(dabs(sum(w_refine_weight(:))-1.d0)>smalldouble)
then
1681 write(unitterm,*)
"Sum of all elements in w_refine_weight be 1.d0"
1682 call mpistop(
"Reset w_refine_weight so the sum is 1.d0")
1685 select case (typeboundspeed)
1690 case(
'cmaxleftright')
1695 call mpistop(
"set typeboundspeed='Einfeldt' or 'cmaxmean' or 'cmaxleftright' or 'pvrs'")
1698 if (mype==0)
write(unitterm,
'(A30)', advance=
'no')
'Refine estimation: '
1700 select case (refine_criterion)
1702 if (mype==0)
write(unitterm,
'(A)')
"user defined"
1704 if (mype==0)
write(unitterm,
'(A)')
"relative error"
1706 if (mype==0)
write(unitterm,
'(A)')
"Lohner's original scheme"
1708 if (mype==0)
write(unitterm,
'(A)')
"Lohner's scheme"
1710 call mpistop(
"Unknown error estimator, change refine_criterion")
1713 if (tfixgrid<bigdouble/2.0d0)
then
1714 if(mype==0)print*,
'Warning, at time=',tfixgrid,
'the grid will be fixed'
1716 if (itfixgrid<biginteger/2)
then
1717 if(mype==0)print*,
'Warning, at iteration=',itfixgrid,
'the grid will be fixed'
1719 if (ditregrid>1)
then
1720 if(mype==0)print*,
'Note, Grid is reconstructed once every',ditregrid,
'iterations'
1725 select case(slicedir(islice))
1727 if(slicecoord(islice)<xprobmin^d.or.slicecoord(islice)>xprobmax^d) &
1728 write(uniterr,*)
'Warning in read_par_files: ', &
1729 'Slice ', islice,
' coordinate',slicecoord(islice),
'out of bounds for dimension ',slicedir(islice)
1735 write(unitterm,
'(A30,A,A)')
'restart_from_file: ',
' ', trim(restart_from_file)
1736 write(unitterm,
'(A30,L1)')
'converting: ', convert
1737 write(unitterm,
'(A)')
''
1740 deallocate(flux_scheme)
1892 integer,
intent(in) :: fh
1893 integer(MPI_OFFSET_KIND),
intent(out) :: offset_tree
1894 integer(MPI_OFFSET_KIND),
intent(out) :: offset_block
1896 double precision :: rbuf(ndim)
1897 double precision,
allocatable :: params(:)
1898 integer :: i, version
1899 integer :: ibuf(ndim), iw
1900 integer :: er, n_par, tmp_int
1901 integer,
dimension(MPI_STATUS_SIZE) :: st
1902 logical :: periodic(ndim)
1903 character(len=name_len),
allocatable :: var_names(:), param_names(:)
1904 character(len=name_len) :: phys_name, geom_name
1907 call mpi_file_read(fh, version, 1, mpi_integer, st, er)
1909 call mpistop(
"Incompatible file version (maybe old format?)")
1913 call mpi_file_read(fh, ibuf(1), 1, mpi_integer, st, er)
1914 offset_tree = ibuf(1)
1917 call mpi_file_read(fh, ibuf(1), 1, mpi_integer, st, er)
1918 offset_block = ibuf(1)
1921 call mpi_file_read(fh, ibuf(1), 1, mpi_integer, st, er)
1923 if (nw /= ibuf(1))
then
1924 write(*,*)
"nw=",nw,
" and nw found in restart file=",ibuf(1)
1925 write(*,*)
"Please be aware of changes in w at restart."
1930 call mpi_file_read(fh, ibuf(1), 1, mpi_integer, st, er)
1931 if (ibuf(1) /=
ndir)
then
1934 write(*,*)
"WARNING: ndir in restart file = ",ibuf(1),
" but current ndir = ",
ndir
1935 write(*,*)
"allow_ndir_change=T: loading anyway (block I/O is ndim-based)."
1936 write(*,*)
"Ensure usr_transform_w maps the source vars into the right slots."
1939 write(*,*)
"ndir in restart file = ",ibuf(1)
1940 write(*,*)
"ndir = ",
ndir
1941 call mpistop(
"reset ndir to ndir in restart file (or set allow_ndir_change=T)")
1946 call mpi_file_read(fh, ibuf(1), 1, mpi_integer, st, er)
1947 if (ibuf(1) /= ndim)
then
1948 write(*,*)
"ndim in restart file = ",ibuf(1)
1949 write(*,*)
"ndim = ",ndim
1950 call mpistop(
"reset ndim to ndim in restart file")
1954 call mpi_file_read(fh, ibuf(1), 1, mpi_integer, st, er)
1956 write(*,*)
"number of levels in restart file = ",ibuf(1)
1958 call mpistop(
"refine_max_level < num. levels in restart file")
1962 call mpi_file_read(fh,
nleafs, 1, mpi_integer, st, er)
1965 call mpi_file_read(fh,
nparents, 1, mpi_integer, st, er)
1968 call mpi_file_read(fh,
it, 1, mpi_integer, st, er)
1971 call mpi_file_read(fh,
global_time, 1, mpi_double_precision, st, er)
1974 call mpi_file_read(fh,rbuf(1:ndim),ndim,mpi_double_precision,st,er)
1975 if (maxval(abs(rbuf(1:ndim) - [ xprobmin^
d ])) > 0)
then
1976 write(*,*)
"Error: xprobmin differs from restart data: ", rbuf(1:ndim)
1977 call mpistop(
"change xprobmin^D in par file")
1981 call mpi_file_read(fh,rbuf(1:ndim),ndim,mpi_double_precision,st,er)
1982 if (maxval(abs(rbuf(1:ndim) - [ xprobmax^
d ])) > 0)
then
1983 write(*,*)
"Error: xprobmax differs from restart data: ", rbuf(1:ndim)
1984 call mpistop(
"change xprobmax^D in par file")
1988 call mpi_file_read(fh,ibuf(1:ndim), ndim, mpi_integer,st,er)
1989 if (any(ibuf(1:ndim) /= [
domain_nx^
d ]))
then
1990 write(*,*)
"Error: mesh size differs from restart data: ", ibuf(1:ndim)
1991 call mpistop(
"change domain_nx^D in par file")
1995 call mpi_file_read(fh,ibuf(1:ndim), ndim, mpi_integer,st,er)
1996 if (any(ibuf(1:ndim) /= [
block_nx^
d ]))
then
1997 write(*,*)
"Error: block size differs from restart data:", ibuf(1:ndim)
1998 call mpistop(
"change block_nx^D in par file")
2002 if (version > 4)
then
2003 call mpi_file_read(fh, periodic, ndim, mpi_logical, st, er)
2004 if ({periodic(^
d) .and. .not.
periodb(^
d) .or. .not.periodic(^
d) .and.
periodb(^
d)| .or. }) &
2005 call mpistop(
"change in periodicity in par file")
2007 call mpi_file_read(fh, geom_name, name_len, mpi_character, st, er)
2011 if (
mype==0)
write(*,*)
"WARNING: coordinates in data = ",trim(geom_name), &
2012 " vs current ",trim(
geometry_name),
"; allow_ndir_change=T (e.g. Cartesian_2D->2.5D), loading anyway."
2014 write(*,*)
"type of coordinates in data is: ", geom_name
2015 call mpistop(
"select the correct coordinates in mod_usr.t file")
2019 call mpi_file_read(fh, stagger_mark_dat, 1, mpi_logical, st, er)
2021 write(*,*)
"Warning: stagger grid flag differs from restart data:", stagger_mark_dat
2027 if (version > 3)
then
2031 call mpi_file_read(fh, var_names(iw), name_len, mpi_character, st, er)
2035 call mpi_file_read(fh, phys_name, name_len, mpi_character, st, er)
2041 call mpi_file_read(fh, n_par, 1, mpi_integer, st, er)
2042 allocate(params(n_par))
2043 allocate(param_names(n_par))
2044 call mpi_file_read(fh, params, n_par, mpi_double_precision, st, er)
2045 call mpi_file_read(fh, param_names, name_len * n_par, mpi_character, st, er)
2048 call mpi_file_read(fh, tmp_int, 1, mpi_integer, st, er)
2053 call mpi_file_read(fh, tmp_int, 1, mpi_integer, st, er)
2056 call mpi_file_read(fh, tmp_int, 1, mpi_integer, st, er)