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)
1406 typeboundary(phi_+1,2*idim-1)=bc_asymm
1407 if(physics_type==
'mhd'.or.physics_type==
'rmhd') typeboundary(ndir+windex+phi_,2*idim-1)=bc_asymm
1409 typeboundary(3:ndir+1,2*idim-1)=bc_asymm
1410 if(physics_type==
'mhd'.or.physics_type==
'rmhd') typeboundary(ndir+windex+2:ndir+windex+ndir,2*idim-1)=bc_asymm
1412 call mpistop(
'Pole is in cylindrical, polar, spherical coordinates!')
1415 call mpistop(
'Pole treatment for twofl or mf not implemented yet')
1417 call mpistop(
'unknown physics type for setting minimal pole boundary treatment')
1420 if(any(typeboundary(:,2*idim)==12))
then
1421 if(any(typeboundary(:,2*idim)/=12)) typeboundary(:,2*idim)=12
1422 select case(physics_type)
1423 case (
'rho',
'ard',
'rd',
'nonlinear',
'ffhd')
1425 typeboundary(:,2*idim)=bc_symm
1426 if(mype==0) print *,
'symmetric maximal pole'
1427 case (
'hd',
'rhd',
'srhd',
'mhd',
'rmhd')
1428 typeboundary(:,2*idim)=bc_symm
1430 if(phys_energy)
then
1435 select case(coordinate)
1437 typeboundary(phi_+1,2*idim)=bc_asymm
1438 if(physics_type==
'mhd'.or.physics_type==
'rmhd') typeboundary(ndir+windex+phi_,2*idim)=bc_asymm
1440 typeboundary(3:ndir+1,2*idim)=bc_asymm
1441 if(physics_type==
'mhd'.or.physics_type==
'rmhd') typeboundary(ndir+windex+2:ndir+windex+ndir,2*idim)=bc_asymm
1443 call mpistop(
'Pole is in cylindrical, polar, spherical coordinates!')
1446 call mpistop(
'Pole treatment for twofl or mf not implemented yet')
1448 call mpistop(
'unknown physics type for setting maximal pole boundary treatment')
1454 if(.not.phys_energy)
then
1459 if(any(limiter(1:nlevelshi)==
'mp5'))
then
1460 nghostcells=max(nghostcells,3)
1463 if(any(limiter(1:nlevelshi)==
'weno5'))
then
1464 nghostcells=max(nghostcells,3)
1467 if(any(limiter(1:nlevelshi)==
'weno5nm'))
then
1468 nghostcells=max(nghostcells,3)
1471 if(any(limiter(1:nlevelshi)==
'wenoz5'))
then
1472 nghostcells=max(nghostcells,3)
1475 if(any(limiter(1:nlevelshi)==
'wenoz5nm'))
then
1476 nghostcells=max(nghostcells,3)
1479 if(any(limiter(1:nlevelshi)==
'wenozp5'))
then
1480 nghostcells=max(nghostcells,3)
1483 if(any(limiter(1:nlevelshi)==
'wenozp5nm'))
then
1484 nghostcells=max(nghostcells,3)
1487 if(any(limiter(1:nlevelshi)==
'teno5ad'))
then
1488 nghostcells=max(nghostcells,3)
1491 if(any(limiter(1:nlevelshi)==
'weno5cu6'))
then
1492 nghostcells=max(nghostcells,3)
1495 if(any(limiter(1:nlevelshi)==
'ppm'))
then
1496 if(flatsh .or. flatcd)
then
1497 nghostcells=max(nghostcells,4)
1499 nghostcells=max(nghostcells,3)
1503 if(any(limiter(1:nlevelshi)==
'weno7'))
then
1504 nghostcells=max(nghostcells,4)
1507 if(any(limiter(1:nlevelshi)==
'mpweno7'))
then
1508 nghostcells=max(nghostcells,4)
1512 nghostcells = nghostcells + phys_wider_stencil
1515 if(stagger_grid .and. refine_max_level>1 .and. mod(nghostcells,2)/=0)
then
1516 nghostcells=nghostcells+1
1519 select case (coordinate)
1522 xprob^lim^de=xprob^lim^de*two*dpi;
1527 xprob^lim^d=xprob^lim^d*two*dpi;
1533 {ixghi^d = block_nx^d + 2*nghostcells\}
1534 {ixgshi^d = ixghi^d\}
1536 nx_vec = [{domain_nx^d|, }]
1537 block_nx_vec = [{block_nx^d|, }]
1539 if (any(nx_vec < 4) .or. any(mod(nx_vec, 2) == 1)) &
1540 call mpistop(
'Grid size (domain_nx^D) has to be even and >= 4')
1542 if (any(block_nx_vec < 4) .or. any(mod(block_nx_vec, 2) == 1)) &
1543 call mpistop(
'Block size (block_nx^D) has to be even and >= 4')
1545 {
if(mod(domain_nx^d,block_nx^d)/=0) &
1546 call mpistop(
'Grid (domain_nx^D) and block (block_nx^D) must be consistent') \}
1548 if(refine_max_level>nlevelshi.or.refine_max_level<1)
then
1549 write(unitterm,*)
'Error: refine_max_level',refine_max_level,
'>nlevelshi ',nlevelshi
1550 call mpistop(
"Reset nlevelshi and recompile!")
1553 if (any(stretched_dim))
then
1554 allocate(qstretch(0:nlevelshi,1:ndim),dxfirst(0:nlevelshi,1:ndim),&
1555 dxfirst_1mq(0:nlevelshi,1:ndim),dxmid(0:nlevelshi,1:ndim))
1556 allocate(nstretchedblocks(1:nlevelshi,1:ndim))
1557 qstretch(0:nlevelshi,1:ndim)=0.0d0
1558 dxfirst(0:nlevelshi,1:ndim)=0.0d0
1559 nstretchedblocks(1:nlevelshi,1:ndim)=0
1560 {
if (stretch_type(^d) == stretch_uni)
then
1562 if(qstretch_baselevel(^d)<1.0d0.or.qstretch_baselevel(^d)==bigdouble)
then
1564 write(*,*)
'stretched grid needs finite qstretch_baselevel>1'
1565 write(*,*)
'will try default value for qstretch_baselevel in dimension', ^d
1567 if(xprobmin^d>smalldouble)
then
1568 qstretch_baselevel(^d)=(xprobmax^d/xprobmin^d)**(1.d0/dble(domain_nx^d))
1570 call mpistop(
"can not set qstretch_baselevel automatically")
1573 if(mod(block_nx^d,2)==1) &
1574 call mpistop(
"stretched grid needs even block size block_nxD")
1575 if(mod(domain_nx^d/block_nx^d,2)/=0) &
1576 call mpistop(
"number level 1 blocks in D must be even")
1577 qstretch(1,^d)=qstretch_baselevel(^d)
1578 dxfirst(1,^d)=(xprobmax^d-xprobmin^d) &
1579 *(1.0d0-qstretch(1,^d))/(1.0d0-qstretch(1,^d)**domain_nx^d)
1580 qstretch(0,^d)=qstretch(1,^d)**2
1581 dxfirst(0,^d)=dxfirst(1,^d)*(1.0d0+qstretch(1,^d))
1582 if(refine_max_level>1)
then
1583 do ilev=2,refine_max_level
1584 qstretch(ilev,^d)=dsqrt(qstretch(ilev-1,^d))
1585 dxfirst(ilev,^d)=dxfirst(ilev-1,^d) &
1586 /(1.0d0+dsqrt(qstretch(ilev-1,^d)))
1591 {
if(stretch_type(^d) == stretch_uni)
then
1592 write(*,*)
'Stretched dimension ', ^d
1593 write(*,*)
'Using stretched grid with qs=',qstretch(0:refine_max_level,^d)
1594 write(*,*)
' and first cell sizes=',dxfirst(0:refine_max_level,^d)
1597 {
if(stretch_type(^d) == stretch_symm)
then
1599 write(*,*)
'will apply symmetric stretch in dimension', ^d
1601 if(mod(block_nx^d,2)==1) &
1602 call mpistop(
"stretched grid needs even block size block_nxD")
1604 if(nstretchedblocks_baselevel(^d)==0) &
1605 call mpistop(
"need finite even number of stretched blocks at baselevel")
1606 if(mod(nstretchedblocks_baselevel(^d),2)==1) &
1607 call mpistop(
"need even number of stretched blocks at baselevel")
1608 if(qstretch_baselevel(^d)<1.0d0.or.qstretch_baselevel(^d)==bigdouble) &
1609 call mpistop(
'stretched grid needs finite qstretch_baselevel>1')
1611 ipower=(nstretchedblocks_baselevel(^d)/2)*block_nx^d
1612 if(nstretchedblocks_baselevel(^d)==domain_nx^d/block_nx^d)
then
1613 xstretch^d=0.5d0*(xprobmax^d-xprobmin^d)
1615 xstretch^d=(xprobmax^d-xprobmin^d) &
1616 /(2.0d0+dble(domain_nx^d-nstretchedblocks_baselevel(^d)*block_nx^d) &
1617 *(1.0d0-qstretch_baselevel(^d))/(1.0d0-qstretch_baselevel(^d)**ipower))
1619 if(xstretch^d>(xprobmax^d-xprobmin^d)*0.5d0) &
1620 call mpistop(
" stretched grid part should not exceed full domain")
1621 dxfirst(1,^d)=xstretch^d*(1.0d0-qstretch_baselevel(^d)) &
1622 /(1.0d0-qstretch_baselevel(^d)**ipower)
1623 nstretchedblocks(1,^d)=nstretchedblocks_baselevel(^d)
1624 qstretch(1,^d)=qstretch_baselevel(^d)
1625 qstretch(0,^d)=qstretch(1,^d)**2
1626 dxfirst(0,^d)=dxfirst(1,^d)*(1.0d0+qstretch(1,^d))
1627 dxmid(1,^d)=dxfirst(1,^d)
1628 dxmid(0,^d)=dxfirst(1,^d)*2.0d0
1629 if(refine_max_level>1)
then
1630 do ilev=2,refine_max_level
1631 nstretchedblocks(ilev,^d)=2*nstretchedblocks(ilev-1,^d)
1632 qstretch(ilev,^d)=dsqrt(qstretch(ilev-1,^d))
1633 dxfirst(ilev,^d)=dxfirst(ilev-1,^d) &
1634 /(1.0d0+dsqrt(qstretch(ilev-1,^d)))
1635 dxmid(ilev,^d)=dxmid(ilev-1,^d)/2.0d0
1639 sizeuniformpart^d=dxfirst(1,^d) &
1640 *(domain_nx^d-nstretchedblocks_baselevel(^d)*block_nx^d)
1642 print *,
'uniform part of size=',sizeuniformpart^d
1643 print *,
'setting of domain is then=',2*xstretch^d+sizeuniformpart^d
1644 print *,
'versus=',xprobmax^d-xprobmin^d
1646 if(dabs(xprobmax^d-xprobmin^d-2*xstretch^d-sizeuniformpart^d)>smalldouble)
then
1647 call mpistop(
'mismatch in domain size!')
1650 dxfirst_1mq(0:refine_max_level,1:ndim)=dxfirst(0:refine_max_level,1:ndim) &
1651 /(1.0d0-qstretch(0:refine_max_level,1:ndim))
1654 dx_vec = [{xprobmax^d-xprobmin^d|, }] / nx_vec
1657 write(c_ndim,
'(I1)') ^nd
1658 write(unitterm,
'(A30,' // c_ndim //
'(I0," "))') &
1659 ' Domain size (cells): ', nx_vec
1660 write(unitterm,
'(A30,' // c_ndim //
'(E9.3," "))') &
1661 ' Level one dx: ', dx_vec
1664 if (any(dx_vec < smalldouble)) &
1665 call mpistop(
"Incorrect domain size (too small grid spacing)")
1669 if(sum(w_refine_weight(:))==0) w_refine_weight(1) = 1.d0
1670 if(dabs(sum(w_refine_weight(:))-1.d0)>smalldouble)
then
1671 write(unitterm,*)
"Sum of all elements in w_refine_weight be 1.d0"
1672 call mpistop(
"Reset w_refine_weight so the sum is 1.d0")
1675 select case (typeboundspeed)
1680 case(
'cmaxleftright')
1685 call mpistop(
"set typeboundspeed='Einfeldt' or 'cmaxmean' or 'cmaxleftright' or 'pvrs'")
1688 if (mype==0)
write(unitterm,
'(A30)', advance=
'no')
'Refine estimation: '
1690 select case (refine_criterion)
1692 if (mype==0)
write(unitterm,
'(A)')
"user defined"
1694 if (mype==0)
write(unitterm,
'(A)')
"relative error"
1696 if (mype==0)
write(unitterm,
'(A)')
"Lohner's original scheme"
1698 if (mype==0)
write(unitterm,
'(A)')
"Lohner's scheme"
1700 call mpistop(
"Unknown error estimator, change refine_criterion")
1703 if (tfixgrid<bigdouble/2.0d0)
then
1704 if(mype==0)print*,
'Warning, at time=',tfixgrid,
'the grid will be fixed'
1706 if (itfixgrid<biginteger/2)
then
1707 if(mype==0)print*,
'Warning, at iteration=',itfixgrid,
'the grid will be fixed'
1709 if (ditregrid>1)
then
1710 if(mype==0)print*,
'Note, Grid is reconstructed once every',ditregrid,
'iterations'
1715 select case(slicedir(islice))
1717 if(slicecoord(islice)<xprobmin^d.or.slicecoord(islice)>xprobmax^d) &
1718 write(uniterr,*)
'Warning in read_par_files: ', &
1719 'Slice ', islice,
' coordinate',slicecoord(islice),
'out of bounds for dimension ',slicedir(islice)
1725 write(unitterm,
'(A30,A,A)')
'restart_from_file: ',
' ', trim(restart_from_file)
1726 write(unitterm,
'(A30,L1)')
'converting: ', convert
1727 write(unitterm,
'(A)')
''
1730 deallocate(flux_scheme)
1882 integer,
intent(in) :: fh
1883 integer(MPI_OFFSET_KIND),
intent(out) :: offset_tree
1884 integer(MPI_OFFSET_KIND),
intent(out) :: offset_block
1886 double precision :: rbuf(ndim)
1887 double precision,
allocatable :: params(:)
1888 integer :: i, version
1889 integer :: ibuf(ndim), iw
1890 integer :: er, n_par, tmp_int
1891 integer,
dimension(MPI_STATUS_SIZE) :: st
1892 logical :: periodic(ndim)
1893 character(len=name_len),
allocatable :: var_names(:), param_names(:)
1894 character(len=name_len) :: phys_name, geom_name
1897 call mpi_file_read(fh, version, 1, mpi_integer, st, er)
1899 call mpistop(
"Incompatible file version (maybe old format?)")
1903 call mpi_file_read(fh, ibuf(1), 1, mpi_integer, st, er)
1904 offset_tree = ibuf(1)
1907 call mpi_file_read(fh, ibuf(1), 1, mpi_integer, st, er)
1908 offset_block = ibuf(1)
1911 call mpi_file_read(fh, ibuf(1), 1, mpi_integer, st, er)
1913 if (nw /= ibuf(1))
then
1914 write(*,*)
"nw=",nw,
" and nw found in restart file=",ibuf(1)
1915 write(*,*)
"Please be aware of changes in w at restart."
1920 call mpi_file_read(fh, ibuf(1), 1, mpi_integer, st, er)
1921 if (ibuf(1) /=
ndir)
then
1924 write(*,*)
"WARNING: ndir in restart file = ",ibuf(1),
" but current ndir = ",
ndir
1925 write(*,*)
"allow_ndir_change=T: loading anyway (block I/O is ndim-based)."
1926 write(*,*)
"Ensure usr_transform_w maps the source vars into the right slots."
1929 write(*,*)
"ndir in restart file = ",ibuf(1)
1930 write(*,*)
"ndir = ",
ndir
1931 call mpistop(
"reset ndir to ndir in restart file (or set allow_ndir_change=T)")
1936 call mpi_file_read(fh, ibuf(1), 1, mpi_integer, st, er)
1937 if (ibuf(1) /= ndim)
then
1938 write(*,*)
"ndim in restart file = ",ibuf(1)
1939 write(*,*)
"ndim = ",ndim
1940 call mpistop(
"reset ndim to ndim in restart file")
1944 call mpi_file_read(fh, ibuf(1), 1, mpi_integer, st, er)
1946 write(*,*)
"number of levels in restart file = ",ibuf(1)
1948 call mpistop(
"refine_max_level < num. levels in restart file")
1952 call mpi_file_read(fh,
nleafs, 1, mpi_integer, st, er)
1955 call mpi_file_read(fh,
nparents, 1, mpi_integer, st, er)
1958 call mpi_file_read(fh,
it, 1, mpi_integer, st, er)
1961 call mpi_file_read(fh,
global_time, 1, mpi_double_precision, st, er)
1964 call mpi_file_read(fh,rbuf(1:ndim),ndim,mpi_double_precision,st,er)
1965 if (maxval(abs(rbuf(1:ndim) - [ xprobmin^
d ])) > 0)
then
1966 write(*,*)
"Error: xprobmin differs from restart data: ", rbuf(1:ndim)
1967 call mpistop(
"change xprobmin^D in par file")
1971 call mpi_file_read(fh,rbuf(1:ndim),ndim,mpi_double_precision,st,er)
1972 if (maxval(abs(rbuf(1:ndim) - [ xprobmax^
d ])) > 0)
then
1973 write(*,*)
"Error: xprobmax differs from restart data: ", rbuf(1:ndim)
1974 call mpistop(
"change xprobmax^D in par file")
1978 call mpi_file_read(fh,ibuf(1:ndim), ndim, mpi_integer,st,er)
1979 if (any(ibuf(1:ndim) /= [
domain_nx^
d ]))
then
1980 write(*,*)
"Error: mesh size differs from restart data: ", ibuf(1:ndim)
1981 call mpistop(
"change domain_nx^D in par file")
1985 call mpi_file_read(fh,ibuf(1:ndim), ndim, mpi_integer,st,er)
1986 if (any(ibuf(1:ndim) /= [
block_nx^
d ]))
then
1987 write(*,*)
"Error: block size differs from restart data:", ibuf(1:ndim)
1988 call mpistop(
"change block_nx^D in par file")
1992 if (version > 4)
then
1993 call mpi_file_read(fh, periodic, ndim, mpi_logical, st, er)
1994 if ({periodic(^
d) .and. .not.
periodb(^
d) .or. .not.periodic(^
d) .and.
periodb(^
d)| .or. }) &
1995 call mpistop(
"change in periodicity in par file")
1997 call mpi_file_read(fh, geom_name, name_len, mpi_character, st, er)
2001 if (
mype==0)
write(*,*)
"WARNING: coordinates in data = ",trim(geom_name), &
2002 " vs current ",trim(
geometry_name),
"; allow_ndir_change=T (e.g. Cartesian_2D->2.5D), loading anyway."
2004 write(*,*)
"type of coordinates in data is: ", geom_name
2005 call mpistop(
"select the correct coordinates in mod_usr.t file")
2009 call mpi_file_read(fh, stagger_mark_dat, 1, mpi_logical, st, er)
2011 write(*,*)
"Warning: stagger grid flag differs from restart data:", stagger_mark_dat
2017 if (version > 3)
then
2021 call mpi_file_read(fh, var_names(iw), name_len, mpi_character, st, er)
2025 call mpi_file_read(fh, phys_name, name_len, mpi_character, st, er)
2031 call mpi_file_read(fh, n_par, 1, mpi_integer, st, er)
2032 allocate(params(n_par))
2033 allocate(param_names(n_par))
2034 call mpi_file_read(fh, params, n_par, mpi_double_precision, st, er)
2035 call mpi_file_read(fh, param_names, name_len * n_par, mpi_character, st, er)
2038 call mpi_file_read(fh, tmp_int, 1, mpi_integer, st, er)
2043 call mpi_file_read(fh, tmp_int, 1, mpi_integer, st, er)
2046 call mpi_file_read(fh, tmp_int, 1, mpi_integer, st, er)