183 double precision,
dimension(nsavehi) :: tsave_log, tsave_dat, tsave_slice, &
184 tsave_collapsed, tsave_custom
185 double precision :: dtsave_log, dtsave_dat, dtsave_slice, &
186 dtsave_collapsed, dtsave_custom
187 double precision :: tsavestart_log, tsavestart_dat, tsavestart_slice, &
188 tsavestart_collapsed, tsavestart_custom
189 double precision :: sizeuniformpart^D
190 double precision :: im_delta,im_nu,rka54,rka51,rkb54,rka55
191 double precision :: dx_vec(^ND)
192 integer :: ditsave_log, ditsave_dat, ditsave_slice, &
193 ditsave_collapsed, ditsave_custom
194 integer :: windex, ipower
195 integer :: i, j, k, ifile, io_state
196 integer :: iB, isave, iw, level, idim, islice
197 integer :: nx_vec(^ND), block_nx_vec(^ND)
198 integer :: my_unit, iostate
200 logical :: fileopen, file_exists
203 character(len=80) :: fmt_string
204 character(len=std_len) :: err_msg, restart_from_file_arg
205 character(len=std_len) :: basename_full, basename_prev, dummy_file
206 character(len=std_len),
dimension(:),
allocatable :: &
207 typeboundary_min^D, typeboundary_max^D
208 character(len=std_len),
allocatable :: limiter(:)
209 character(len=std_len),
allocatable :: gradient_limiter(:)
210 character(len=name_len) :: stretch_dim(ndim)
213 character(len=std_len) :: typesourcesplit
215 character(len=std_len),
allocatable :: flux_scheme(:)
217 character(len=std_len) :: typeboundspeed
219 character(len=std_len) :: time_stepper
221 character(len=std_len) :: time_integrator
223 character(len=std_len) :: typecurl
225 character(len=std_len) :: typeprolonglimit
231 character(len=std_len) :: typecourant
245 tsave_log, tsave_dat, tsave_slice, tsave_collapsed, tsave_custom, &
246 dtsave_log, dtsave_dat, dtsave_slice, dtsave_collapsed, dtsave_custom, &
247 ditsave_log, ditsave_dat, ditsave_slice, ditsave_collapsed, ditsave_custom,&
248 tsavestart_log, tsavestart_dat, tsavestart_slice, tsavestart_collapsed,&
254 namelist /methodlist/ time_stepper, time_integrator, &
313 allocate(typeboundary_min^d(nwfluxbc))
314 allocate(typeboundary_max^d(nwfluxbc))
377 typeprolonglimit =
'default'
415 tsave(isave,ifile) = bigdouble
416 itsave(isave,ifile) = biginteger
425 tsave_log = bigdouble
426 tsave_dat = bigdouble
427 tsave_slice = bigdouble
428 tsave_collapsed = bigdouble
429 tsave_custom = bigdouble
431 dtsave_log = bigdouble
432 dtsave_dat = bigdouble
433 dtsave_slice = bigdouble
434 dtsave_collapsed = bigdouble
435 dtsave_custom = bigdouble
437 ditsave_log = biginteger
438 ditsave_dat = biginteger
439 ditsave_slice = biginteger
440 ditsave_collapsed = biginteger
441 ditsave_custom = biginteger
443 tsavestart_log = bigdouble
444 tsavestart_dat = bigdouble
445 tsavestart_slice = bigdouble
446 tsavestart_collapsed = bigdouble
447 tsavestart_custom = bigdouble
471 typecourant =
'maxsum'
480 typeboundspeed =
'Einfeldt'
482 time_stepper =
'twostep'
483 time_integrator =
'default'
515 flux_scheme(level) =
'tvdlf'
517 limiter(level) =
'minmod'
518 gradient_limiter(level) =
'minmod'
523 typesourcesplit =
'sfs'
550 if(i==j.or.j==k.or.k==i)
then
552 else if(i+1==j.or.i-2==j)
then
569 inquire(file=trim(
par_files(i)), exist=file_exists)
571 if (.not. file_exists)
then
572 write(err_msg, *)
"The parameter file " // trim(
par_files(i)) // &
582 read(
unitpar, filelist,
end=101)
585 read(unitpar, savelist,
end=102)
588 read(unitpar, stoplist,
end=103)
591 read(unitpar, methodlist,
end=104)
594 read(unitpar, boundlist,
end=105)
597 read(unitpar, meshlist,
end=106)
600 read(unitpar, paramlist,
end=107)
603 read(unitpar, emissionlist,
end=108)
608 if (base_filename /= basename_prev) &
609 basename_full = trim(basename_full) // trim(base_filename)
610 basename_prev = base_filename
613 base_filename = basename_full
617 dummy_file = trim(base_filename)//
"DUMMY"
618 open(newunit=my_unit, file=trim(dummy_file), iostat=iostate)
619 if (iostate /= 0)
then
620 call mpistop(
"Can't write to output directory (" // &
621 trim(base_filename) //
")")
623 close(my_unit, status=
'delete')
627 if(source_split_usr) any_source_split=.true.
630 if(restart_from_file_arg /= undefined) &
631 restart_from_file=restart_from_file_arg
635 if(restart_from_file == undefined)
then
638 do index_latest_data = 9999, 0, -1
644 if(.not.file_exists) index_latest_data=-1
650 call mpi_bcast(index_latest_data, 1, mpi_integer, 0, icomm, ierrmpi)
652 if (resume_previous_run)
then
653 if (index_latest_data == -1)
then
654 if(mype==0)
write(*,*)
"No snapshots found to resume from, start a new run..."
657 write(restart_from_file,
"(a,i4.4,a)") trim(base_filename),index_latest_data,
".dat"
661 if (restart_from_file == undefined)
then
666 call mpistop(
"Please restart from a snapshot when firstprocess=T")
668 call mpistop(
'Change convert to .false. for a new run!')
671 if (small_pressure < 0.d0)
call mpistop(
"small_pressure should be positive.")
672 if (small_density < 0.d0)
call mpistop(
"small_density should be positive.")
674 if (small_temperature>0.d0) small_pressure=small_density*small_temperature
676 if(convert) autoconvert=.false.
678 where (tsave_log < bigdouble) tsave(:, 1) = tsave_log
679 where (tsave_dat < bigdouble) tsave(:, 2) = tsave_dat
680 where (tsave_slice < bigdouble) tsave(:, 3) = tsave_slice
681 where (tsave_collapsed < bigdouble) tsave(:, 4) = tsave_collapsed
682 where (tsave_custom < bigdouble) tsave(:, 5) = tsave_custom
684 if (dtsave_log < bigdouble) dtsave(1) = dtsave_log
685 if (dtsave_dat < bigdouble) dtsave(2) = dtsave_dat
686 if (dtsave_slice < bigdouble) dtsave(3) = dtsave_slice
687 if (dtsave_collapsed < bigdouble) dtsave(4) = dtsave_collapsed
688 if (dtsave_custom < bigdouble) dtsave(5) = dtsave_custom
690 if (tsavestart_log < bigdouble) tsavestart(1) = tsavestart_log
691 if (tsavestart_dat < bigdouble) tsavestart(2) = tsavestart_dat
692 if (tsavestart_slice < bigdouble) tsavestart(3) = tsavestart_slice
693 if (tsavestart_collapsed < bigdouble) tsavestart(4) = tsavestart_collapsed
694 if (tsavestart_custom < bigdouble) tsavestart(5) = tsavestart_custom
696 if (ditsave_log < bigdouble) ditsave(1) = ditsave_log
697 if (ditsave_dat < bigdouble) ditsave(2) = ditsave_dat
698 if (ditsave_slice < bigdouble) ditsave(3) = ditsave_slice
699 if (ditsave_collapsed < bigdouble) ditsave(4) = ditsave_collapsed
700 if (ditsave_custom < bigdouble) ditsave(5) = ditsave_custom
702 if (wall_time_max < bigdouble) wall_time_max=wall_time_max*3600.d0
705 write(unitterm, *)
''
706 write(unitterm, *)
'Output type | tsavestart | dtsave | ditsave | itsave(1) | tsave(1)'
707 write(fmt_string, *)
'(A12," | ",E9.3E2," | ",E9.3E2," | ",I6," | "'//&
712 if (mype == 0)
write(unitterm, fmt_string) trim(output_names(ifile)), &
713 tsavestart(ifile), dtsave(ifile), ditsave(ifile), itsave(1, ifile), tsave(1, ifile)
716 if (mype == 0)
write(unitterm, *)
''
719 if(slicedir(islice) > ndim) &
720 write(uniterr,*)
'Warning in read_par_files: ', &
721 'Slice ', islice,
' direction',slicedir(islice),
'larger than ndim=',ndim
722 if(slicedir(islice) < 1) &
723 write(uniterr,*)
'Warning in read_par_files: ', &
724 'Slice ', islice,
' direction',slicedir(islice),
'too small, should be [',1,ndim,
']'
727 if(it_max==biginteger .and. time_max==bigdouble.and.mype==0)
write(uniterr,*) &
728 'Warning in read_par_files: it_max or time_max not given!'
730 select case (typecourant)
732 type_courant=type_maxsum
734 type_courant=type_summax
735 if (local_timestep)
then
736 call mpistop(
"Type courant summax incompatible with local_timestep")
739 type_courant=type_minimum
740 if (local_timestep)
then
741 call mpistop(
"Type courant minimum incompatible with local_timestep")
744 write(unitterm,*)
'Unknown typecourant=',typecourant
745 call mpistop(
"Error from read_par_files: no such typecourant!")
750 select case (flux_scheme(level))
752 flux_method(level)=fs_hll
754 flux_method(level)=fs_hllc
756 flux_method(level)=fs_hlld
758 flux_method(level)=fs_hllcd
760 flux_method(level)=fs_tvdlf
762 flux_method(level)=fs_tvdmu
764 flux_method(level)=fs_tvd
766 flux_method(level)=fs_cd
768 flux_method(level)=fs_cd4
770 flux_method(level)=fs_fd
772 flux_method(level)=fs_source
774 flux_method(level)=fs_nul
776 call mpistop(
"unkown or bad flux scheme")
778 if(flux_scheme(level)==
'tvd'.and.time_stepper/=
'onestep') &
779 call mpistop(
" tvd is onestep method, reset time_stepper='onestep'")
780 if(flux_scheme(level)==
'tvd')
then
781 if(mype==0.and.(.not.dimsplit))
write(unitterm,*) &
782 'Warning: setting dimsplit=T for tvd, as used for level=',level
785 if(flux_scheme(level)==
'hlld'.and.physics_type/=
'mhd' .and. physics_type/=
'twofl') &
786 call mpistop(
"Cannot use hlld flux if not using MHD or 2FL only charges physics!")
788 if(flux_scheme(level)==
'hllc'.and.physics_type==
'mf') &
789 call mpistop(
"Cannot use hllc flux if using magnetofriction physics!")
791 if(flux_scheme(level)==
'tvd'.and.physics_type==
'mf') &
792 call mpistop(
"Cannot use tvd flux if using magnetofriction physics!")
794 if(flux_scheme(level)==
'tvdmu'.and.physics_type==
'mf') &
795 call mpistop(
"Cannot use tvdmu flux if using magnetofriction physics!")
797 if (typepred1(level)==0)
then
798 select case (flux_scheme(level))
800 typepred1(level)=fs_cd
802 typepred1(level)=fs_cd4
804 typepred1(level)=fs_fd
805 case (
'tvdlf',
'tvdmu')
806 typepred1(level)=fs_hancock
808 typepred1(level)=fs_hll
810 typepred1(level)=fs_hllc
812 typepred1(level)=fs_hllcd
814 typepred1(level)=fs_hlld
815 case (
'nul',
'source',
'tvd')
816 typepred1(level)=fs_nul
818 call mpistop(
"No default predictor for this full step")
824 if(any(flux_scheme==
'fd')) need_global_cmax=.true.
827 select case (typecurl)
833 type_curl=stokesbased
835 write(unitterm,*)
"typecurl=",typecurl
836 call mpistop(
"unkown type of curl operator in read_par_files")
840 select case (time_stepper)
844 if (time_integrator==
'default')
then
845 time_integrator=
"Forward_Euler"
847 select case (time_integrator)
848 case (
"Forward_Euler")
849 t_integrator=forward_euler
851 t_integrator=imex_euler
855 write(unitterm,*)
"time_integrator=",time_integrator,
"time_stepper=",time_stepper
856 call mpistop(
"unkown onestep time_integrator in read_par_files")
858 use_imex_scheme=(t_integrator==imex_euler.or.t_integrator==imex_sp)
862 if (time_integrator==
'default')
then
863 time_integrator=
"Predictor_Corrector"
865 select case (time_integrator)
866 case (
"Predictor_Corrector")
867 t_integrator=predictor_corrector
872 case (
"IMEX_Midpoint")
873 t_integrator=imex_midpoint
874 case (
"IMEX_Trapezoidal")
875 t_integrator=imex_trapezoidal
877 t_integrator=imex_222
879 write(unitterm,*)
"time_integrator=",time_integrator,
"time_stepper=",time_stepper
880 call mpistop(
"unkown twostep time_integrator in read_par_files")
882 use_imex_scheme=(t_integrator==imex_midpoint.or.t_integrator==imex_trapezoidal&
883 .or.t_integrator==imex_222)
884 if (t_integrator==rk2_alf)
then
885 if(rk2_alfa<smalldouble.or.rk2_alfa>one)
call mpistop(
"set rk2_alfa within [0,1]")
887 rk_b2=1.0d0/(2.0d0*rk2_alfa)
893 if (time_integrator==
'default')
then
894 time_integrator=
'ssprk3'
896 select case (time_integrator)
902 t_integrator=imex_ars3
904 t_integrator=imex_232
906 t_integrator=imex_cb3a
908 write(unitterm,*)
"time_integrator=",time_integrator,
"time_stepper=",time_stepper
909 call mpistop(
"unkown threestep time_integrator in read_par_files")
911 if(t_integrator==rk3_bt)
then
912 select case(rk3_switch)
942 call mpistop(
"Unknown rk3_switch")
945 rk3_b3=1.0d0-rk3_b1-rk3_b2
947 rk3_c3=rk3_a31+rk3_a32
949 if(t_integrator==ssprk3)
then
950 select case(ssprk_order)
953 rk_beta22=1.0d0/4.0d0
954 rk_beta33=2.0d0/3.0d0
955 rk_alfa21=3.0d0/4.0d0
956 rk_alfa31=1.0d0/3.0d0
960 rk_beta11=1.0d0/2.0d0
961 rk_beta22=1.0d0/2.0d0
962 rk_beta33=1.0d0/3.0d0
964 rk_alfa31=1.0d0/3.0d0
968 call mpistop(
"Unknown ssprk3_order")
970 rk_alfa22=1.0d0-rk_alfa21
971 rk_alfa33=1.0d0-rk_alfa31
973 if(t_integrator==imex_ars3)
then
974 ars_gamma=(3.0d0+dsqrt(3.0d0))/6.0d0
976 if(t_integrator==imex_232)
then
977 select case(imex_switch)
979 im_delta=1.0d0-1.0d0/dsqrt(2.0d0)
980 im_nu=(3.0d0+2.0d0*dsqrt(2.0d0))/6.0d0
981 imex_a21=2.0d0*im_delta
984 imex_b1=1.0d0/(2.0d0*dsqrt(2.0d0))
985 imex_b2=1.0d0/(2.0d0*dsqrt(2.0d0))
990 imex_a21=0.711664700366941d0
991 imex_a31=0.077338168947683d0
992 imex_a32=0.917273367886007d0
993 imex_b1=0.398930808264688d0
994 imex_b2=0.345755244189623d0
995 imex_ha21=0.353842865099275d0
996 imex_ha22=0.353842865099275d0
998 call mpistop(
"Unknown imex_siwtch")
1001 imex_c3=imex_a31+imex_a32
1002 imex_b3=1.0d0-imex_b1-imex_b2
1004 if(t_integrator==imex_cb3a)
then
1005 imex_c2 = 0.8925502329346865
1008 imex_c3 = imex_c2 / (6.0d0*imex_c2**2 - 3.0d0*imex_c2 + 1.0d0)
1010 imex_b2 = (3.0d0*imex_c2 - 1.0d0) / (6.0d0*imex_c2**2)
1011 imex_b3 = (6.0d0*imex_c2**2 - 3.0d0*imex_c2 + 1.0d0) / (6.0d0*imex_c2**2)
1012 imex_a33 = (1.0d0/6.0d0 - imex_b2*imex_c2**2 - imex_b3*imex_c2*imex_c3) / (imex_b3*(imex_c3-imex_c2))
1013 imex_a32 = imex_c3 - imex_a33
1027 use_imex_scheme=(t_integrator==imex_ars3.or.t_integrator==imex_232.or.t_integrator==imex_cb3a)
1031 if (time_integrator==
'default')
then
1032 time_integrator=
"ssprk4"
1034 select case (time_integrator)
1040 write(unitterm,*)
"time_integrator=",time_integrator,
"time_stepper=",time_stepper
1041 call mpistop(
"unkown fourstep time_integrator in read_par_files")
1043 if(t_integrator==ssprk4)
then
1044 select case(ssprk_order)
1046 rk_beta11=1.0d0/2.0d0
1047 rk_beta22=1.0d0/2.0d0
1048 rk_beta33=1.0d0/6.0d0
1049 rk_beta44=1.0d0/2.0d0
1051 rk_alfa31=2.0d0/3.0d0
1057 rk_beta11=1.0d0/3.0d0
1058 rk_beta22=1.0d0/3.0d0
1059 rk_beta33=1.0d0/3.0d0
1060 rk_beta44=1.0d0/4.0d0
1063 rk_alfa41=1.0d0/4.0d0
1068 call mpistop(
"Unknown ssprk_order")
1070 rk_alfa22=1.0d0-rk_alfa21
1071 rk_alfa33=1.0d0-rk_alfa31
1072 rk_alfa44=1.0d0-rk_alfa41
1077 if (time_integrator==
'default')
then
1078 time_integrator=
"ssprk5"
1080 select case (time_integrator)
1084 write(unitterm,*)
"time_integrator=",time_integrator,
"time_stepper=",time_stepper
1085 call mpistop(
"unkown fivestep time_integrator in read_par_files")
1087 if(t_integrator==ssprk5)
then
1088 select case(ssprk_order)
1091 rk_beta11=0.391752226571890d0
1092 rk_beta22=0.368410593050371d0
1093 rk_beta33=0.251891774271694d0
1094 rk_beta44=0.544974750228521d0
1095 rk_beta54=0.063692468666290d0
1096 rk_beta55=0.226007483236906d0
1097 rk_alfa21=0.444370493651235d0
1098 rk_alfa31=0.620101851488403d0
1099 rk_alfa41=0.178079954393132d0
1100 rk_alfa53=0.517231671970585d0
1101 rk_alfa54=0.096059710526147d0
1103 rk_alfa22=0.555629506348765d0
1104 rk_alfa33=0.379898148511597d0
1105 rk_alfa44=0.821920045606868d0
1106 rk_alfa55=0.386708617503269d0
1107 rk_alfa22=1.0d0-rk_alfa21
1108 rk_alfa33=1.0d0-rk_alfa31
1109 rk_alfa44=1.0d0-rk_alfa41
1110 rk_alfa55=1.0d0-rk_alfa53-rk_alfa54
1112 rk_c3=rk_alfa22*rk_c2+rk_beta22
1113 rk_c4=rk_alfa33*rk_c3+rk_beta33
1114 rk_c5=rk_alfa44*rk_c4+rk_beta44
1116 rk_beta11=0.39175222700392d0
1117 rk_beta22=0.36841059262959d0
1118 rk_beta33=0.25189177424738d0
1119 rk_beta44=0.54497475021237d0
1122 rk_alfa21=0.44437049406734d0
1123 rk_alfa31=0.62010185138540d0
1124 rk_alfa41=0.17807995410773d0
1125 rk_alfa53=0.51723167208978d0
1128 rk_alfa22=1.0d0-rk_alfa21
1129 rk_alfa33=1.0d0-rk_alfa31
1130 rk_alfa44=1.0d0-rk_alfa41
1132 rka51=0.00683325884039d0
1133 rka54=0.12759831133288d0
1134 rkb54=0.08460416338212d0
1135 rk_beta54=rkb54-rk_beta44*rka51/rk_alfa41
1136 rk_alfa54=rka54-rk_alfa44*rka51/rk_alfa41
1138 rk_alfa55=1.0d0-rk_alfa53-rk_alfa54
1140 rk_c3=rk_alfa22*rk_c2+rk_beta22
1141 rk_c4=rk_alfa33*rk_c3+rk_beta33
1142 rk_c5=rk_alfa44*rk_c4+rk_beta44
1143 rk_beta55=1.0d0-rk_beta54-rk_alfa53*rk_c3-rk_alfa54*rk_c4-rk_alfa55*rk_c5
1145 call mpistop(
"Unknown ssprk_order")
1154 use_imex_scheme=.false.
1156 call mpistop(
"Unknown time_stepper in read_par_files")
1160 select case (stretch_dim(i))
1161 case (undefined,
'none')
1162 stretch_type(i) = stretch_none
1163 stretched_dim(i) = .false.
1164 case (
'uni',
'uniform')
1165 stretch_type(i) = stretch_uni
1166 stretched_dim(i) = .true.
1167 case (
'symm',
'symmetric')
1168 stretch_type(i) = stretch_symm
1169 stretched_dim(i) = .true.
1171 stretch_type(i) = stretch_none
1172 stretched_dim(i) = .false.
1173 if (mype == 0) print *,
'Got stretch_type = ', stretch_type(i)
1174 call mpistop(
'Unknown stretch type')
1179 if(typedimsplit ==
'default'.and. dimsplit) typedimsplit=
'xyyx'
1180 if(typedimsplit ==
'default'.and..not.dimsplit) typedimsplit=
'unsplit'
1181 dimsplit = typedimsplit /=
'unsplit'
1184 select case (typesourcesplit)
1186 sourcesplit=sourcesplit_sfs
1188 sourcesplit=sourcesplit_sf
1190 sourcesplit=sourcesplit_ssf
1192 sourcesplit=sourcesplit_ssfss
1194 write(unitterm,*)
'No such typesourcesplit=',typesourcesplit
1195 call mpistop(
"Error: Unknown typesourcesplit!")
1198 if(coordinate==-1)
then
1199 coordinate=cartesian
1201 write(*,*)
'Warning: coordinate system is not specified!'
1202 write(*,*)
'call set_coordinate_system in usr_init in mod_usr.t'
1203 write(*,*)
'Now use Cartesian coordinate'
1207 if(coordinate==cartesian)
then
1210 if(any(stretched_dim))
then
1211 coordinate=cartesian_stretched
1212 slab_uniform=.false.
1216 slab_uniform=.false.
1219 if(coordinate==spherical)
then
1221 if(mype==0)print *,
'Warning: spherical symmetry needs dimsplit=F, resetting'
1226 if (ndim==1) dimsplit=.false.
1229 select case(typeprolonglimit)
1244 allocate(type_limiter(nlevelshi))
1245 allocate(type_gradient_limiter(nlevelshi))
1247 do level=1,nlevelshi
1248 type_limiter(level) = limiter_type(limiter(level))
1249 type_gradient_limiter(level) = limiter_type(gradient_limiter(level))
1252 if (any(limiter(1:nlevelshi)==
'ppm')&
1253 .and.(flatsh.and.physics_type==
'rho'))
then
1254 call mpistop(
" PPM with flatsh=.true. can not be used with physics_type='rho'!")
1260 select case(typeboundary_min^d(iw))
1262 typeboundary(iw,2*^d-1)=bc_special
1264 typeboundary(iw,2*^d-1)=bc_cont
1266 typeboundary(iw,2*^d-1)=bc_symm
1268 typeboundary(iw,2*^d-1)=bc_asymm
1270 typeboundary(iw,2*^d-1)=bc_periodic
1272 typeboundary(iw,2*^d-1)=bc_aperiodic
1274 typeboundary(iw,2*^d-1)=bc_noinflow
1276 typeboundary(iw,2*^d-1)=12
1278 typeboundary(iw,2*^d-1)=bc_data
1280 typeboundary(iw,2*^d-1)=bc_icarus
1282 typeboundary(iw,2*^d-1)=bc_character
1284 write (unitterm,*)
"Undefined boundarytype found in read_par_files", &
1285 typeboundary_min^d(iw),
"for variable iw=",iw,
" and side iB=",2*^d-1
1289 select case(typeboundary_max^d(iw))
1291 typeboundary(iw,2*^d)=bc_special
1293 typeboundary(iw,2*^d)=bc_cont
1295 typeboundary(iw,2*^d)=bc_symm
1297 typeboundary(iw,2*^d)=bc_asymm
1299 typeboundary(iw,2*^d)=bc_periodic
1301 typeboundary(iw,2*^d)=bc_aperiodic
1303 typeboundary(iw,2*^d)=bc_noinflow
1305 typeboundary(iw,2*^d)=12
1307 typeboundary(iw,2*^d)=bc_data
1309 typeboundary(iw,2*^d-1)=bc_icarus
1310 case(
"bc_character")
1311 typeboundary(iw,2*^d)=bc_character
1313 write (unitterm,*)
"Undefined boundarytype found in read_par_files", &
1314 typeboundary_max^d(iw),
"for variable iw=",iw,
" and side iB=",2*^d
1320 if (nwfluxbc<nwflux)
then
1321 do iw=nwfluxbc+1,nwflux
1322 typeboundary(iw,:) = typeboundary(1, :)
1327 do iw=nwflux+1, nwflux+nwaux
1328 typeboundary(iw,:) = typeboundary(1, :)
1332 if (any(typeboundary == 0))
then
1333 call mpistop(
"Not all boundary conditions have been defined")
1337 periodb(idim)=(any(typeboundary(:,2*idim-1:2*idim)==bc_periodic))
1338 aperiodb(idim)=(any(typeboundary(:,2*idim-1:2*idim)==bc_aperiodic))
1339 if (periodb(idim).or.aperiodb(idim))
then
1341 if (typeboundary(iw,2*idim-1) .ne. typeboundary(iw,2*idim)) &
1342 call mpistop(
"Wrong counterpart in periodic boundary")
1344 if (typeboundary(iw,2*idim-1) /= bc_periodic .and. &
1345 typeboundary(iw,2*idim-1) /= bc_aperiodic)
then
1346 call mpistop(
"Each dimension should either have all "//&
1347 "or no variables periodic, some can be aperiodic")
1354 if(any(typeboundary(:,2*idim-1)==12))
then
1355 if(any(typeboundary(:,2*idim-1)/=12)) typeboundary(:,2*idim-1)=12
1356 select case(physics_type)
1357 case (
'rho',
'ard',
'rd',
'nonlinear',
'ffhd')
1359 typeboundary(:,2*idim-1)=bc_symm
1360 if(mype==0) print *,
'symmetric minimal pole'
1361 case (
'hd',
'rhd',
'srhd',
'mhd',
'rmhd')
1362 typeboundary(:,2*idim-1)=bc_symm
1364 if(phys_energy)
then
1369 select case(coordinate)
1371 typeboundary(phi_+1,2*idim-1)=bc_asymm
1372 if(physics_type==
'mhd'.or.physics_type==
'rmhd') typeboundary(ndir+windex+phi_,2*idim-1)=bc_asymm
1374 typeboundary(3:ndir+1,2*idim-1)=bc_asymm
1375 if(physics_type==
'mhd'.or.physics_type==
'rmhd') typeboundary(ndir+windex+2:ndir+windex+ndir,2*idim-1)=bc_asymm
1377 call mpistop(
'Pole is in cylindrical, polar, spherical coordinates!')
1380 call mpistop(
'Pole treatment for twofl or mf not implemented yet')
1382 call mpistop(
'unknown physics type for setting minimal pole boundary treatment')
1385 if(any(typeboundary(:,2*idim)==12))
then
1386 if(any(typeboundary(:,2*idim)/=12)) typeboundary(:,2*idim)=12
1387 select case(physics_type)
1388 case (
'rho',
'ard',
'rd',
'nonlinear',
'ffhd')
1390 typeboundary(:,2*idim)=bc_symm
1391 if(mype==0) print *,
'symmetric maximal pole'
1392 case (
'hd',
'rhd',
'srhd',
'mhd',
'rmhd')
1393 typeboundary(:,2*idim)=bc_symm
1395 if(phys_energy)
then
1400 select case(coordinate)
1402 typeboundary(phi_+1,2*idim)=bc_asymm
1403 if(physics_type==
'mhd'.or.physics_type==
'rmhd') typeboundary(ndir+windex+phi_,2*idim)=bc_asymm
1405 typeboundary(3:ndir+1,2*idim)=bc_asymm
1406 if(physics_type==
'mhd'.or.physics_type==
'rmhd') typeboundary(ndir+windex+2:ndir+windex+ndir,2*idim)=bc_asymm
1408 call mpistop(
'Pole is in cylindrical, polar, spherical coordinates!')
1411 call mpistop(
'Pole treatment for twofl or mf not implemented yet')
1413 call mpistop(
'unknown physics type for setting maximal pole boundary treatment')
1419 if(.not.phys_energy)
then
1424 if(any(limiter(1:nlevelshi)==
'mp5'))
then
1425 nghostcells=max(nghostcells,3)
1428 if(any(limiter(1:nlevelshi)==
'weno5'))
then
1429 nghostcells=max(nghostcells,3)
1432 if(any(limiter(1:nlevelshi)==
'weno5nm'))
then
1433 nghostcells=max(nghostcells,3)
1436 if(any(limiter(1:nlevelshi)==
'wenoz5'))
then
1437 nghostcells=max(nghostcells,3)
1440 if(any(limiter(1:nlevelshi)==
'wenoz5nm'))
then
1441 nghostcells=max(nghostcells,3)
1444 if(any(limiter(1:nlevelshi)==
'wenozp5'))
then
1445 nghostcells=max(nghostcells,3)
1448 if(any(limiter(1:nlevelshi)==
'wenozp5nm'))
then
1449 nghostcells=max(nghostcells,3)
1452 if(any(limiter(1:nlevelshi)==
'teno5ad'))
then
1453 nghostcells=max(nghostcells,3)
1456 if(any(limiter(1:nlevelshi)==
'weno5cu6'))
then
1457 nghostcells=max(nghostcells,3)
1460 if(any(limiter(1:nlevelshi)==
'ppm'))
then
1461 if(flatsh .or. flatcd)
then
1462 nghostcells=max(nghostcells,4)
1464 nghostcells=max(nghostcells,3)
1468 if(any(limiter(1:nlevelshi)==
'weno7'))
then
1469 nghostcells=max(nghostcells,4)
1472 if(any(limiter(1:nlevelshi)==
'mpweno7'))
then
1473 nghostcells=max(nghostcells,4)
1477 nghostcells = nghostcells + phys_wider_stencil
1480 if(stagger_grid .and. refine_max_level>1 .and. mod(nghostcells,2)/=0)
then
1481 nghostcells=nghostcells+1
1484 select case (coordinate)
1487 xprob^lim^de=xprob^lim^de*two*dpi;
1492 xprob^lim^d=xprob^lim^d*two*dpi;
1498 {ixghi^d = block_nx^d + 2*nghostcells\}
1499 {ixgshi^d = ixghi^d\}
1501 nx_vec = [{domain_nx^d|, }]
1502 block_nx_vec = [{block_nx^d|, }]
1504 if (any(nx_vec < 4) .or. any(mod(nx_vec, 2) == 1)) &
1505 call mpistop(
'Grid size (domain_nx^D) has to be even and >= 4')
1507 if (any(block_nx_vec < 4) .or. any(mod(block_nx_vec, 2) == 1)) &
1508 call mpistop(
'Block size (block_nx^D) has to be even and >= 4')
1510 {
if(mod(domain_nx^d,block_nx^d)/=0) &
1511 call mpistop(
'Grid (domain_nx^D) and block (block_nx^D) must be consistent') \}
1513 if(refine_max_level>nlevelshi.or.refine_max_level<1)
then
1514 write(unitterm,*)
'Error: refine_max_level',refine_max_level,
'>nlevelshi ',nlevelshi
1515 call mpistop(
"Reset nlevelshi and recompile!")
1518 if (any(stretched_dim))
then
1519 allocate(qstretch(0:nlevelshi,1:ndim),dxfirst(0:nlevelshi,1:ndim),&
1520 dxfirst_1mq(0:nlevelshi,1:ndim),dxmid(0:nlevelshi,1:ndim))
1521 allocate(nstretchedblocks(1:nlevelshi,1:ndim))
1522 qstretch(0:nlevelshi,1:ndim)=0.0d0
1523 dxfirst(0:nlevelshi,1:ndim)=0.0d0
1524 nstretchedblocks(1:nlevelshi,1:ndim)=0
1525 {
if (stretch_type(^d) == stretch_uni)
then
1527 if(qstretch_baselevel(^d)<1.0d0.or.qstretch_baselevel(^d)==bigdouble)
then
1529 write(*,*)
'stretched grid needs finite qstretch_baselevel>1'
1530 write(*,*)
'will try default value for qstretch_baselevel in dimension', ^d
1532 if(xprobmin^d>smalldouble)
then
1533 qstretch_baselevel(^d)=(xprobmax^d/xprobmin^d)**(1.d0/dble(domain_nx^d))
1535 call mpistop(
"can not set qstretch_baselevel automatically")
1538 if(mod(block_nx^d,2)==1) &
1539 call mpistop(
"stretched grid needs even block size block_nxD")
1540 if(mod(domain_nx^d/block_nx^d,2)/=0) &
1541 call mpistop(
"number level 1 blocks in D must be even")
1542 qstretch(1,^d)=qstretch_baselevel(^d)
1543 dxfirst(1,^d)=(xprobmax^d-xprobmin^d) &
1544 *(1.0d0-qstretch(1,^d))/(1.0d0-qstretch(1,^d)**domain_nx^d)
1545 qstretch(0,^d)=qstretch(1,^d)**2
1546 dxfirst(0,^d)=dxfirst(1,^d)*(1.0d0+qstretch(1,^d))
1547 if(refine_max_level>1)
then
1548 do ilev=2,refine_max_level
1549 qstretch(ilev,^d)=dsqrt(qstretch(ilev-1,^d))
1550 dxfirst(ilev,^d)=dxfirst(ilev-1,^d) &
1551 /(1.0d0+dsqrt(qstretch(ilev-1,^d)))
1556 {
if(stretch_type(^d) == stretch_uni)
then
1557 write(*,*)
'Stretched dimension ', ^d
1558 write(*,*)
'Using stretched grid with qs=',qstretch(0:refine_max_level,^d)
1559 write(*,*)
' and first cell sizes=',dxfirst(0:refine_max_level,^d)
1562 {
if(stretch_type(^d) == stretch_symm)
then
1564 write(*,*)
'will apply symmetric stretch in dimension', ^d
1566 if(mod(block_nx^d,2)==1) &
1567 call mpistop(
"stretched grid needs even block size block_nxD")
1569 if(nstretchedblocks_baselevel(^d)==0) &
1570 call mpistop(
"need finite even number of stretched blocks at baselevel")
1571 if(mod(nstretchedblocks_baselevel(^d),2)==1) &
1572 call mpistop(
"need even number of stretched blocks at baselevel")
1573 if(qstretch_baselevel(^d)<1.0d0.or.qstretch_baselevel(^d)==bigdouble) &
1574 call mpistop(
'stretched grid needs finite qstretch_baselevel>1')
1576 ipower=(nstretchedblocks_baselevel(^d)/2)*block_nx^d
1577 if(nstretchedblocks_baselevel(^d)==domain_nx^d/block_nx^d)
then
1578 xstretch^d=0.5d0*(xprobmax^d-xprobmin^d)
1580 xstretch^d=(xprobmax^d-xprobmin^d) &
1581 /(2.0d0+dble(domain_nx^d-nstretchedblocks_baselevel(^d)*block_nx^d) &
1582 *(1.0d0-qstretch_baselevel(^d))/(1.0d0-qstretch_baselevel(^d)**ipower))
1584 if(xstretch^d>(xprobmax^d-xprobmin^d)*0.5d0) &
1585 call mpistop(
" stretched grid part should not exceed full domain")
1586 dxfirst(1,^d)=xstretch^d*(1.0d0-qstretch_baselevel(^d)) &
1587 /(1.0d0-qstretch_baselevel(^d)**ipower)
1588 nstretchedblocks(1,^d)=nstretchedblocks_baselevel(^d)
1589 qstretch(1,^d)=qstretch_baselevel(^d)
1590 qstretch(0,^d)=qstretch(1,^d)**2
1591 dxfirst(0,^d)=dxfirst(1,^d)*(1.0d0+qstretch(1,^d))
1592 dxmid(1,^d)=dxfirst(1,^d)
1593 dxmid(0,^d)=dxfirst(1,^d)*2.0d0
1594 if(refine_max_level>1)
then
1595 do ilev=2,refine_max_level
1596 nstretchedblocks(ilev,^d)=2*nstretchedblocks(ilev-1,^d)
1597 qstretch(ilev,^d)=dsqrt(qstretch(ilev-1,^d))
1598 dxfirst(ilev,^d)=dxfirst(ilev-1,^d) &
1599 /(1.0d0+dsqrt(qstretch(ilev-1,^d)))
1600 dxmid(ilev,^d)=dxmid(ilev-1,^d)/2.0d0
1604 sizeuniformpart^d=dxfirst(1,^d) &
1605 *(domain_nx^d-nstretchedblocks_baselevel(^d)*block_nx^d)
1607 print *,
'uniform part of size=',sizeuniformpart^d
1608 print *,
'setting of domain is then=',2*xstretch^d+sizeuniformpart^d
1609 print *,
'versus=',xprobmax^d-xprobmin^d
1611 if(dabs(xprobmax^d-xprobmin^d-2*xstretch^d-sizeuniformpart^d)>smalldouble)
then
1612 call mpistop(
'mismatch in domain size!')
1615 dxfirst_1mq(0:refine_max_level,1:ndim)=dxfirst(0:refine_max_level,1:ndim) &
1616 /(1.0d0-qstretch(0:refine_max_level,1:ndim))
1619 dx_vec = [{xprobmax^d-xprobmin^d|, }] / nx_vec
1622 write(c_ndim,
'(I1)') ^nd
1623 write(unitterm,
'(A30,' // c_ndim //
'(I0," "))') &
1624 ' Domain size (cells): ', nx_vec
1625 write(unitterm,
'(A30,' // c_ndim //
'(E9.3," "))') &
1626 ' Level one dx: ', dx_vec
1629 if (any(dx_vec < smalldouble)) &
1630 call mpistop(
"Incorrect domain size (too small grid spacing)")
1634 if(sum(w_refine_weight(:))==0) w_refine_weight(1) = 1.d0
1635 if(dabs(sum(w_refine_weight(:))-1.d0)>smalldouble)
then
1636 write(unitterm,*)
"Sum of all elements in w_refine_weight be 1.d0"
1637 call mpistop(
"Reset w_refine_weight so the sum is 1.d0")
1640 select case (typeboundspeed)
1645 case(
'cmaxleftright')
1648 call mpistop(
"set typeboundspeed='Einfeldt' or 'cmaxmean' or 'cmaxleftright'")
1651 if (mype==0)
write(unitterm,
'(A30)', advance=
'no')
'Refine estimation: '
1653 select case (refine_criterion)
1655 if (mype==0)
write(unitterm,
'(A)')
"user defined"
1657 if (mype==0)
write(unitterm,
'(A)')
"relative error"
1659 if (mype==0)
write(unitterm,
'(A)')
"Lohner's original scheme"
1661 if (mype==0)
write(unitterm,
'(A)')
"Lohner's scheme"
1663 call mpistop(
"Unknown error estimator, change refine_criterion")
1666 if (tfixgrid<bigdouble/2.0d0)
then
1667 if(mype==0)print*,
'Warning, at time=',tfixgrid,
'the grid will be fixed'
1669 if (itfixgrid<biginteger/2)
then
1670 if(mype==0)print*,
'Warning, at iteration=',itfixgrid,
'the grid will be fixed'
1672 if (ditregrid>1)
then
1673 if(mype==0)print*,
'Note, Grid is reconstructed once every',ditregrid,
'iterations'
1678 select case(slicedir(islice))
1680 if(slicecoord(islice)<xprobmin^d.or.slicecoord(islice)>xprobmax^d) &
1681 write(uniterr,*)
'Warning in read_par_files: ', &
1682 'Slice ', islice,
' coordinate',slicecoord(islice),
'out of bounds for dimension ',slicedir(islice)
1688 write(unitterm,
'(A30,A,A)')
'restart_from_file: ',
' ', trim(restart_from_file)
1689 write(unitterm,
'(A30,L1)')
'converting: ', convert
1690 write(unitterm,
'(A)')
''
1693 deallocate(flux_scheme)
1845 integer,
intent(in) :: fh
1846 integer(MPI_OFFSET_KIND),
intent(out) :: offset_tree
1847 integer(MPI_OFFSET_KIND),
intent(out) :: offset_block
1849 double precision :: rbuf(ndim)
1850 double precision,
allocatable :: params(:)
1851 integer :: i, version
1852 integer :: ibuf(ndim), iw
1853 integer :: er, n_par, tmp_int
1854 integer,
dimension(MPI_STATUS_SIZE) :: st
1855 logical :: periodic(ndim)
1856 character(len=name_len),
allocatable :: var_names(:), param_names(:)
1857 character(len=name_len) :: phys_name, geom_name
1860 call mpi_file_read(fh, version, 1, mpi_integer, st, er)
1862 call mpistop(
"Incompatible file version (maybe old format?)")
1866 call mpi_file_read(fh, ibuf(1), 1, mpi_integer, st, er)
1867 offset_tree = ibuf(1)
1870 call mpi_file_read(fh, ibuf(1), 1, mpi_integer, st, er)
1871 offset_block = ibuf(1)
1874 call mpi_file_read(fh, ibuf(1), 1, mpi_integer, st, er)
1876 if (nw /= ibuf(1))
then
1877 write(*,*)
"nw=",nw,
" and nw found in restart file=",ibuf(1)
1878 write(*,*)
"Please be aware of changes in w at restart."
1883 call mpi_file_read(fh, ibuf(1), 1, mpi_integer, st, er)
1884 if (ibuf(1) /=
ndir)
then
1885 write(*,*)
"ndir in restart file = ",ibuf(1)
1886 write(*,*)
"ndir = ",
ndir
1887 call mpistop(
"reset ndir to ndir in restart file")
1891 call mpi_file_read(fh, ibuf(1), 1, mpi_integer, st, er)
1892 if (ibuf(1) /= ndim)
then
1893 write(*,*)
"ndim in restart file = ",ibuf(1)
1894 write(*,*)
"ndim = ",ndim
1895 call mpistop(
"reset ndim to ndim in restart file")
1899 call mpi_file_read(fh, ibuf(1), 1, mpi_integer, st, er)
1901 write(*,*)
"number of levels in restart file = ",ibuf(1)
1903 call mpistop(
"refine_max_level < num. levels in restart file")
1907 call mpi_file_read(fh,
nleafs, 1, mpi_integer, st, er)
1910 call mpi_file_read(fh,
nparents, 1, mpi_integer, st, er)
1913 call mpi_file_read(fh,
it, 1, mpi_integer, st, er)
1916 call mpi_file_read(fh,
global_time, 1, mpi_double_precision, st, er)
1919 call mpi_file_read(fh,rbuf(1:ndim),ndim,mpi_double_precision,st,er)
1920 if (maxval(abs(rbuf(1:ndim) - [ xprobmin^
d ])) > 0)
then
1921 write(*,*)
"Error: xprobmin differs from restart data: ", rbuf(1:ndim)
1922 call mpistop(
"change xprobmin^D in par file")
1926 call mpi_file_read(fh,rbuf(1:ndim),ndim,mpi_double_precision,st,er)
1927 if (maxval(abs(rbuf(1:ndim) - [ xprobmax^
d ])) > 0)
then
1928 write(*,*)
"Error: xprobmax differs from restart data: ", rbuf(1:ndim)
1929 call mpistop(
"change xprobmax^D in par file")
1933 call mpi_file_read(fh,ibuf(1:ndim), ndim, mpi_integer,st,er)
1934 if (any(ibuf(1:ndim) /= [
domain_nx^
d ]))
then
1935 write(*,*)
"Error: mesh size differs from restart data: ", ibuf(1:ndim)
1936 call mpistop(
"change domain_nx^D in par file")
1940 call mpi_file_read(fh,ibuf(1:ndim), ndim, mpi_integer,st,er)
1941 if (any(ibuf(1:ndim) /= [
block_nx^
d ]))
then
1942 write(*,*)
"Error: block size differs from restart data:", ibuf(1:ndim)
1943 call mpistop(
"change block_nx^D in par file")
1947 if (version > 4)
then
1948 call mpi_file_read(fh, periodic, ndim, mpi_logical, st, er)
1949 if ({periodic(^
d) .and. .not.
periodb(^
d) .or. .not.periodic(^
d) .and.
periodb(^
d)| .or. }) &
1950 call mpistop(
"change in periodicity in par file")
1952 call mpi_file_read(fh, geom_name, name_len, mpi_character, st, er)
1955 write(*,*)
"type of coordinates in data is: ", geom_name
1956 call mpistop(
"select the correct coordinates in mod_usr.t file")
1959 call mpi_file_read(fh, stagger_mark_dat, 1, mpi_logical, st, er)
1961 write(*,*)
"Warning: stagger grid flag differs from restart data:", stagger_mark_dat
1967 if (version > 3)
then
1971 call mpi_file_read(fh, var_names(iw), name_len, mpi_character, st, er)
1975 call mpi_file_read(fh, phys_name, name_len, mpi_character, st, er)
1981 call mpi_file_read(fh, n_par, 1, mpi_integer, st, er)
1982 allocate(params(n_par))
1983 allocate(param_names(n_par))
1984 call mpi_file_read(fh, params, n_par, mpi_double_precision, st, er)
1985 call mpi_file_read(fh, param_names, name_len * n_par, mpi_character, st, er)
1988 call mpi_file_read(fh, tmp_int, 1, mpi_integer, st, er)
1993 call mpi_file_read(fh, tmp_int, 1, mpi_integer, st, er)
1996 call mpi_file_read(fh, tmp_int, 1, mpi_integer, st, er)