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, &
312 allocate(typeboundary_min^d(nwfluxbc))
313 allocate(typeboundary_max^d(nwfluxbc))
376 typeprolonglimit =
'default'
414 tsave(isave,ifile) = bigdouble
415 itsave(isave,ifile) = biginteger
424 tsave_log = bigdouble
425 tsave_dat = bigdouble
426 tsave_slice = bigdouble
427 tsave_collapsed = bigdouble
428 tsave_custom = bigdouble
430 dtsave_log = bigdouble
431 dtsave_dat = bigdouble
432 dtsave_slice = bigdouble
433 dtsave_collapsed = bigdouble
434 dtsave_custom = bigdouble
436 ditsave_log = biginteger
437 ditsave_dat = biginteger
438 ditsave_slice = biginteger
439 ditsave_collapsed = biginteger
440 ditsave_custom = biginteger
442 tsavestart_log = bigdouble
443 tsavestart_dat = bigdouble
444 tsavestart_slice = bigdouble
445 tsavestart_collapsed = bigdouble
446 tsavestart_custom = bigdouble
467 typecourant =
'maxsum'
476 typeboundspeed =
'Einfeldt'
478 time_stepper =
'twostep'
479 time_integrator =
'default'
511 flux_scheme(level) =
'tvdlf'
513 limiter(level) =
'minmod'
514 gradient_limiter(level) =
'minmod'
519 typesourcesplit =
'sfs'
546 if(i==j.or.j==k.or.k==i)
then
548 else if(i+1==j.or.i-2==j)
then
565 inquire(file=trim(
par_files(i)), exist=file_exists)
567 if (.not. file_exists)
then
568 write(err_msg, *)
"The parameter file " // trim(
par_files(i)) // &
578 read(
unitpar, filelist,
end=101)
581 read(unitpar, savelist,
end=102)
584 read(unitpar, stoplist,
end=103)
587 read(unitpar, methodlist,
end=104)
590 read(unitpar, boundlist,
end=105)
593 read(unitpar, meshlist,
end=106)
596 read(unitpar, paramlist,
end=107)
599 read(unitpar, emissionlist,
end=108)
604 if (base_filename /= basename_prev) &
605 basename_full = trim(basename_full) // trim(base_filename)
606 basename_prev = base_filename
609 base_filename = basename_full
613 dummy_file = trim(base_filename)//
"DUMMY"
614 open(newunit=my_unit, file=trim(dummy_file), iostat=iostate)
615 if (iostate /= 0)
then
616 call mpistop(
"Can't write to output directory (" // &
617 trim(base_filename) //
")")
619 close(my_unit, status=
'delete')
623 if(source_split_usr) any_source_split=.true.
626 if(restart_from_file_arg /= undefined) &
627 restart_from_file=restart_from_file_arg
631 if(restart_from_file == undefined)
then
634 do index_latest_data = 9999, 0, -1
640 if(.not.file_exists) index_latest_data=-1
646 call mpi_bcast(index_latest_data, 1, mpi_integer, 0, icomm, ierrmpi)
648 if (resume_previous_run)
then
649 if (index_latest_data == -1)
then
650 if(mype==0)
write(*,*)
"No snapshots found to resume from, start a new run..."
653 write(restart_from_file,
"(a,i4.4,a)") trim(base_filename),index_latest_data,
".dat"
657 if (restart_from_file == undefined)
then
662 call mpistop(
"Please restart from a snapshot when firstprocess=T")
664 call mpistop(
'Change convert to .false. for a new run!')
667 if (small_pressure < 0.d0)
call mpistop(
"small_pressure should be positive.")
668 if (small_density < 0.d0)
call mpistop(
"small_density should be positive.")
670 if (small_temperature>0.d0) small_pressure=small_density*small_temperature
672 if(convert) autoconvert=.false.
674 where (tsave_log < bigdouble) tsave(:, 1) = tsave_log
675 where (tsave_dat < bigdouble) tsave(:, 2) = tsave_dat
676 where (tsave_slice < bigdouble) tsave(:, 3) = tsave_slice
677 where (tsave_collapsed < bigdouble) tsave(:, 4) = tsave_collapsed
678 where (tsave_custom < bigdouble) tsave(:, 5) = tsave_custom
680 if (dtsave_log < bigdouble) dtsave(1) = dtsave_log
681 if (dtsave_dat < bigdouble) dtsave(2) = dtsave_dat
682 if (dtsave_slice < bigdouble) dtsave(3) = dtsave_slice
683 if (dtsave_collapsed < bigdouble) dtsave(4) = dtsave_collapsed
684 if (dtsave_custom < bigdouble) dtsave(5) = dtsave_custom
686 if (tsavestart_log < bigdouble) tsavestart(1) = tsavestart_log
687 if (tsavestart_dat < bigdouble) tsavestart(2) = tsavestart_dat
688 if (tsavestart_slice < bigdouble) tsavestart(3) = tsavestart_slice
689 if (tsavestart_collapsed < bigdouble) tsavestart(4) = tsavestart_collapsed
690 if (tsavestart_custom < bigdouble) tsavestart(5) = tsavestart_custom
692 if (ditsave_log < bigdouble) ditsave(1) = ditsave_log
693 if (ditsave_dat < bigdouble) ditsave(2) = ditsave_dat
694 if (ditsave_slice < bigdouble) ditsave(3) = ditsave_slice
695 if (ditsave_collapsed < bigdouble) ditsave(4) = ditsave_collapsed
696 if (ditsave_custom < bigdouble) ditsave(5) = ditsave_custom
698 if (wall_time_max < bigdouble) wall_time_max=wall_time_max*3600.d0
701 write(unitterm, *)
''
702 write(unitterm, *)
'Output type | tsavestart | dtsave | ditsave | itsave(1) | tsave(1)'
703 write(fmt_string, *)
'(A12," | ",E9.3E2," | ",E9.3E2," | ",I6," | "'//&
708 if (mype == 0)
write(unitterm, fmt_string) trim(output_names(ifile)), &
709 tsavestart(ifile), dtsave(ifile), ditsave(ifile), itsave(1, ifile), tsave(1, ifile)
712 if (mype == 0)
write(unitterm, *)
''
715 if(slicedir(islice) > ndim) &
716 write(uniterr,*)
'Warning in read_par_files: ', &
717 'Slice ', islice,
' direction',slicedir(islice),
'larger than ndim=',ndim
718 if(slicedir(islice) < 1) &
719 write(uniterr,*)
'Warning in read_par_files: ', &
720 'Slice ', islice,
' direction',slicedir(islice),
'too small, should be [',1,ndim,
']'
723 if(it_max==biginteger .and. time_max==bigdouble.and.mype==0)
write(uniterr,*) &
724 'Warning in read_par_files: it_max or time_max not given!'
726 select case (typecourant)
728 type_courant=type_maxsum
730 type_courant=type_summax
731 if (local_timestep)
then
732 call mpistop(
"Type courant summax incompatible with local_timestep")
735 type_courant=type_minimum
736 if (local_timestep)
then
737 call mpistop(
"Type courant minimum incompatible with local_timestep")
740 write(unitterm,*)
'Unknown typecourant=',typecourant
741 call mpistop(
"Error from read_par_files: no such typecourant!")
746 select case (flux_scheme(level))
748 flux_method(level)=fs_hll
750 flux_method(level)=fs_hllc
752 flux_method(level)=fs_hlld
754 flux_method(level)=fs_hllcd
756 flux_method(level)=fs_tvdlf
758 flux_method(level)=fs_tvdmu
760 flux_method(level)=fs_tvd
762 flux_method(level)=fs_cd
764 flux_method(level)=fs_cd4
766 flux_method(level)=fs_fd
768 flux_method(level)=fs_source
770 flux_method(level)=fs_nul
772 call mpistop(
"unkown or bad flux scheme")
774 if(flux_scheme(level)==
'tvd'.and.time_stepper/=
'onestep') &
775 call mpistop(
" tvd is onestep method, reset time_stepper='onestep'")
776 if(flux_scheme(level)==
'tvd')
then
777 if(mype==0.and.(.not.dimsplit))
write(unitterm,*) &
778 'Warning: setting dimsplit=T for tvd, as used for level=',level
781 if(flux_scheme(level)==
'hlld'.and.physics_type/=
'mhd' .and. physics_type/=
'twofl') &
782 call mpistop(
"Cannot use hlld flux if not using MHD or 2FL only charges physics!")
784 if(flux_scheme(level)==
'hllc'.and.physics_type==
'mf') &
785 call mpistop(
"Cannot use hllc flux if using magnetofriction physics!")
787 if(flux_scheme(level)==
'tvd'.and.physics_type==
'mf') &
788 call mpistop(
"Cannot use tvd flux if using magnetofriction physics!")
790 if(flux_scheme(level)==
'tvdmu'.and.physics_type==
'mf') &
791 call mpistop(
"Cannot use tvdmu flux if using magnetofriction physics!")
793 if (typepred1(level)==0)
then
794 select case (flux_scheme(level))
796 typepred1(level)=fs_cd
798 typepred1(level)=fs_cd4
800 typepred1(level)=fs_fd
801 case (
'tvdlf',
'tvdmu')
802 typepred1(level)=fs_hancock
804 typepred1(level)=fs_hll
806 typepred1(level)=fs_hllc
808 typepred1(level)=fs_hllcd
810 typepred1(level)=fs_hlld
811 case (
'nul',
'source',
'tvd')
812 typepred1(level)=fs_nul
814 call mpistop(
"No default predictor for this full step")
820 if(any(flux_scheme==
'fd')) need_global_cmax=.true.
823 select case (typecurl)
829 type_curl=stokesbased
831 write(unitterm,*)
"typecurl=",typecurl
832 call mpistop(
"unkown type of curl operator in read_par_files")
836 select case (time_stepper)
840 if (time_integrator==
'default')
then
841 time_integrator=
"Forward_Euler"
843 select case (time_integrator)
844 case (
"Forward_Euler")
845 t_integrator=forward_euler
847 t_integrator=imex_euler
851 write(unitterm,*)
"time_integrator=",time_integrator,
"time_stepper=",time_stepper
852 call mpistop(
"unkown onestep time_integrator in read_par_files")
854 use_imex_scheme=(t_integrator==imex_euler.or.t_integrator==imex_sp)
858 if (time_integrator==
'default')
then
859 time_integrator=
"Predictor_Corrector"
861 select case (time_integrator)
862 case (
"Predictor_Corrector")
863 t_integrator=predictor_corrector
868 case (
"IMEX_Midpoint")
869 t_integrator=imex_midpoint
870 case (
"IMEX_Trapezoidal")
871 t_integrator=imex_trapezoidal
873 t_integrator=imex_222
875 write(unitterm,*)
"time_integrator=",time_integrator,
"time_stepper=",time_stepper
876 call mpistop(
"unkown twostep time_integrator in read_par_files")
878 use_imex_scheme=(t_integrator==imex_midpoint.or.t_integrator==imex_trapezoidal&
879 .or.t_integrator==imex_222)
880 if (t_integrator==rk2_alf)
then
881 if(rk2_alfa<smalldouble.or.rk2_alfa>one)
call mpistop(
"set rk2_alfa within [0,1]")
883 rk_b2=1.0d0/(2.0d0*rk2_alfa)
889 if (time_integrator==
'default')
then
890 time_integrator=
'ssprk3'
892 select case (time_integrator)
898 t_integrator=imex_ars3
900 t_integrator=imex_232
902 t_integrator=imex_cb3a
904 write(unitterm,*)
"time_integrator=",time_integrator,
"time_stepper=",time_stepper
905 call mpistop(
"unkown threestep time_integrator in read_par_files")
907 if(t_integrator==rk3_bt)
then
908 select case(rk3_switch)
938 call mpistop(
"Unknown rk3_switch")
941 rk3_b3=1.0d0-rk3_b1-rk3_b2
943 rk3_c3=rk3_a31+rk3_a32
945 if(t_integrator==ssprk3)
then
946 select case(ssprk_order)
949 rk_beta22=1.0d0/4.0d0
950 rk_beta33=2.0d0/3.0d0
951 rk_alfa21=3.0d0/4.0d0
952 rk_alfa31=1.0d0/3.0d0
956 rk_beta11=1.0d0/2.0d0
957 rk_beta22=1.0d0/2.0d0
958 rk_beta33=1.0d0/3.0d0
960 rk_alfa31=1.0d0/3.0d0
964 call mpistop(
"Unknown ssprk3_order")
966 rk_alfa22=1.0d0-rk_alfa21
967 rk_alfa33=1.0d0-rk_alfa31
969 if(t_integrator==imex_ars3)
then
970 ars_gamma=(3.0d0+dsqrt(3.0d0))/6.0d0
972 if(t_integrator==imex_232)
then
973 select case(imex_switch)
975 im_delta=1.0d0-1.0d0/dsqrt(2.0d0)
976 im_nu=(3.0d0+2.0d0*dsqrt(2.0d0))/6.0d0
977 imex_a21=2.0d0*im_delta
980 imex_b1=1.0d0/(2.0d0*dsqrt(2.0d0))
981 imex_b2=1.0d0/(2.0d0*dsqrt(2.0d0))
986 imex_a21=0.711664700366941d0
987 imex_a31=0.077338168947683d0
988 imex_a32=0.917273367886007d0
989 imex_b1=0.398930808264688d0
990 imex_b2=0.345755244189623d0
991 imex_ha21=0.353842865099275d0
992 imex_ha22=0.353842865099275d0
994 call mpistop(
"Unknown imex_siwtch")
997 imex_c3=imex_a31+imex_a32
998 imex_b3=1.0d0-imex_b1-imex_b2
1000 if(t_integrator==imex_cb3a)
then
1001 imex_c2 = 0.8925502329346865
1004 imex_c3 = imex_c2 / (6.0d0*imex_c2**2 - 3.0d0*imex_c2 + 1.0d0)
1006 imex_b2 = (3.0d0*imex_c2 - 1.0d0) / (6.0d0*imex_c2**2)
1007 imex_b3 = (6.0d0*imex_c2**2 - 3.0d0*imex_c2 + 1.0d0) / (6.0d0*imex_c2**2)
1008 imex_a33 = (1.0d0/6.0d0 - imex_b2*imex_c2**2 - imex_b3*imex_c2*imex_c3) / (imex_b3*(imex_c3-imex_c2))
1009 imex_a32 = imex_c3 - imex_a33
1023 use_imex_scheme=(t_integrator==imex_ars3.or.t_integrator==imex_232.or.t_integrator==imex_cb3a)
1027 if (time_integrator==
'default')
then
1028 time_integrator=
"ssprk4"
1030 select case (time_integrator)
1036 write(unitterm,*)
"time_integrator=",time_integrator,
"time_stepper=",time_stepper
1037 call mpistop(
"unkown fourstep time_integrator in read_par_files")
1039 if(t_integrator==ssprk4)
then
1040 select case(ssprk_order)
1042 rk_beta11=1.0d0/2.0d0
1043 rk_beta22=1.0d0/2.0d0
1044 rk_beta33=1.0d0/6.0d0
1045 rk_beta44=1.0d0/2.0d0
1047 rk_alfa31=2.0d0/3.0d0
1053 rk_beta11=1.0d0/3.0d0
1054 rk_beta22=1.0d0/3.0d0
1055 rk_beta33=1.0d0/3.0d0
1056 rk_beta44=1.0d0/4.0d0
1059 rk_alfa41=1.0d0/4.0d0
1064 call mpistop(
"Unknown ssprk_order")
1066 rk_alfa22=1.0d0-rk_alfa21
1067 rk_alfa33=1.0d0-rk_alfa31
1068 rk_alfa44=1.0d0-rk_alfa41
1073 if (time_integrator==
'default')
then
1074 time_integrator=
"ssprk5"
1076 select case (time_integrator)
1080 write(unitterm,*)
"time_integrator=",time_integrator,
"time_stepper=",time_stepper
1081 call mpistop(
"unkown fivestep time_integrator in read_par_files")
1083 if(t_integrator==ssprk5)
then
1084 select case(ssprk_order)
1087 rk_beta11=0.391752226571890d0
1088 rk_beta22=0.368410593050371d0
1089 rk_beta33=0.251891774271694d0
1090 rk_beta44=0.544974750228521d0
1091 rk_beta54=0.063692468666290d0
1092 rk_beta55=0.226007483236906d0
1093 rk_alfa21=0.444370493651235d0
1094 rk_alfa31=0.620101851488403d0
1095 rk_alfa41=0.178079954393132d0
1096 rk_alfa53=0.517231671970585d0
1097 rk_alfa54=0.096059710526147d0
1099 rk_alfa22=0.555629506348765d0
1100 rk_alfa33=0.379898148511597d0
1101 rk_alfa44=0.821920045606868d0
1102 rk_alfa55=0.386708617503269d0
1103 rk_alfa22=1.0d0-rk_alfa21
1104 rk_alfa33=1.0d0-rk_alfa31
1105 rk_alfa44=1.0d0-rk_alfa41
1106 rk_alfa55=1.0d0-rk_alfa53-rk_alfa54
1108 rk_c3=rk_alfa22*rk_c2+rk_beta22
1109 rk_c4=rk_alfa33*rk_c3+rk_beta33
1110 rk_c5=rk_alfa44*rk_c4+rk_beta44
1112 rk_beta11=0.39175222700392d0
1113 rk_beta22=0.36841059262959d0
1114 rk_beta33=0.25189177424738d0
1115 rk_beta44=0.54497475021237d0
1118 rk_alfa21=0.44437049406734d0
1119 rk_alfa31=0.62010185138540d0
1120 rk_alfa41=0.17807995410773d0
1121 rk_alfa53=0.51723167208978d0
1124 rk_alfa22=1.0d0-rk_alfa21
1125 rk_alfa33=1.0d0-rk_alfa31
1126 rk_alfa44=1.0d0-rk_alfa41
1128 rka51=0.00683325884039d0
1129 rka54=0.12759831133288d0
1130 rkb54=0.08460416338212d0
1131 rk_beta54=rkb54-rk_beta44*rka51/rk_alfa41
1132 rk_alfa54=rka54-rk_alfa44*rka51/rk_alfa41
1134 rk_alfa55=1.0d0-rk_alfa53-rk_alfa54
1136 rk_c3=rk_alfa22*rk_c2+rk_beta22
1137 rk_c4=rk_alfa33*rk_c3+rk_beta33
1138 rk_c5=rk_alfa44*rk_c4+rk_beta44
1139 rk_beta55=1.0d0-rk_beta54-rk_alfa53*rk_c3-rk_alfa54*rk_c4-rk_alfa55*rk_c5
1141 call mpistop(
"Unknown ssprk_order")
1150 use_imex_scheme=.false.
1152 call mpistop(
"Unknown time_stepper in read_par_files")
1156 select case (stretch_dim(i))
1157 case (undefined,
'none')
1158 stretch_type(i) = stretch_none
1159 stretched_dim(i) = .false.
1160 case (
'uni',
'uniform')
1161 stretch_type(i) = stretch_uni
1162 stretched_dim(i) = .true.
1163 case (
'symm',
'symmetric')
1164 stretch_type(i) = stretch_symm
1165 stretched_dim(i) = .true.
1167 stretch_type(i) = stretch_none
1168 stretched_dim(i) = .false.
1169 if (mype == 0) print *,
'Got stretch_type = ', stretch_type(i)
1170 call mpistop(
'Unknown stretch type')
1175 if(typedimsplit ==
'default'.and. dimsplit) typedimsplit=
'xyyx'
1176 if(typedimsplit ==
'default'.and..not.dimsplit) typedimsplit=
'unsplit'
1177 dimsplit = typedimsplit /=
'unsplit'
1180 select case (typesourcesplit)
1182 sourcesplit=sourcesplit_sfs
1184 sourcesplit=sourcesplit_sf
1186 sourcesplit=sourcesplit_ssf
1188 sourcesplit=sourcesplit_ssfss
1190 write(unitterm,*)
'No such typesourcesplit=',typesourcesplit
1191 call mpistop(
"Error: Unknown typesourcesplit!")
1194 if(coordinate==-1)
then
1195 coordinate=cartesian
1197 write(*,*)
'Warning: coordinate system is not specified!'
1198 write(*,*)
'call set_coordinate_system in usr_init in mod_usr.t'
1199 write(*,*)
'Now use Cartesian coordinate'
1203 if(coordinate==cartesian)
then
1206 if(any(stretched_dim))
then
1207 coordinate=cartesian_stretched
1208 slab_uniform=.false.
1212 slab_uniform=.false.
1215 if(coordinate==spherical)
then
1217 if(mype==0)print *,
'Warning: spherical symmetry needs dimsplit=F, resetting'
1222 if (ndim==1) dimsplit=.false.
1225 select case(typeprolonglimit)
1240 allocate(type_limiter(nlevelshi))
1241 allocate(type_gradient_limiter(nlevelshi))
1243 do level=1,nlevelshi
1244 type_limiter(level) = limiter_type(limiter(level))
1245 type_gradient_limiter(level) = limiter_type(gradient_limiter(level))
1248 if (any(limiter(1:nlevelshi)==
'ppm')&
1249 .and.(flatsh.and.physics_type==
'rho'))
then
1250 call mpistop(
" PPM with flatsh=.true. can not be used with physics_type='rho'!")
1256 select case(typeboundary_min^d(iw))
1258 typeboundary(iw,2*^d-1)=bc_special
1260 typeboundary(iw,2*^d-1)=bc_cont
1262 typeboundary(iw,2*^d-1)=bc_symm
1264 typeboundary(iw,2*^d-1)=bc_asymm
1266 typeboundary(iw,2*^d-1)=bc_periodic
1268 typeboundary(iw,2*^d-1)=bc_aperiodic
1270 typeboundary(iw,2*^d-1)=bc_noinflow
1272 typeboundary(iw,2*^d-1)=12
1274 typeboundary(iw,2*^d-1)=bc_data
1276 typeboundary(iw,2*^d-1)=bc_icarus
1278 typeboundary(iw,2*^d-1)=bc_character
1280 write (unitterm,*)
"Undefined boundarytype found in read_par_files", &
1281 typeboundary_min^d(iw),
"for variable iw=",iw,
" and side iB=",2*^d-1
1285 select case(typeboundary_max^d(iw))
1287 typeboundary(iw,2*^d)=bc_special
1289 typeboundary(iw,2*^d)=bc_cont
1291 typeboundary(iw,2*^d)=bc_symm
1293 typeboundary(iw,2*^d)=bc_asymm
1295 typeboundary(iw,2*^d)=bc_periodic
1297 typeboundary(iw,2*^d)=bc_aperiodic
1299 typeboundary(iw,2*^d)=bc_noinflow
1301 typeboundary(iw,2*^d)=12
1303 typeboundary(iw,2*^d)=bc_data
1305 typeboundary(iw,2*^d-1)=bc_icarus
1306 case(
"bc_character")
1307 typeboundary(iw,2*^d)=bc_character
1309 write (unitterm,*)
"Undefined boundarytype found in read_par_files", &
1310 typeboundary_max^d(iw),
"for variable iw=",iw,
" and side iB=",2*^d
1316 if (nwfluxbc<nwflux)
then
1317 do iw=nwfluxbc+1,nwflux
1318 typeboundary(iw,:) = typeboundary(1, :)
1323 do iw=nwflux+1, nwflux+nwaux
1324 typeboundary(iw,:) = typeboundary(1, :)
1328 if (any(typeboundary == 0))
then
1329 call mpistop(
"Not all boundary conditions have been defined")
1333 periodb(idim)=(any(typeboundary(:,2*idim-1:2*idim)==bc_periodic))
1334 aperiodb(idim)=(any(typeboundary(:,2*idim-1:2*idim)==bc_aperiodic))
1335 if (periodb(idim).or.aperiodb(idim))
then
1337 if (typeboundary(iw,2*idim-1) .ne. typeboundary(iw,2*idim)) &
1338 call mpistop(
"Wrong counterpart in periodic boundary")
1340 if (typeboundary(iw,2*idim-1) /= bc_periodic .and. &
1341 typeboundary(iw,2*idim-1) /= bc_aperiodic)
then
1342 call mpistop(
"Each dimension should either have all "//&
1343 "or no variables periodic, some can be aperiodic")
1350 if(any(typeboundary(:,2*idim-1)==12))
then
1351 if(any(typeboundary(:,2*idim-1)/=12)) typeboundary(:,2*idim-1)=12
1352 select case(physics_type)
1353 case (
'rho',
'ard',
'rd',
'nonlinear',
'ffhd')
1355 typeboundary(:,2*idim-1)=bc_symm
1356 if(mype==0) print *,
'symmetric minimal pole'
1357 case (
'hd',
'rhd',
'srhd',
'mhd',
'rmhd')
1358 typeboundary(:,2*idim-1)=bc_symm
1360 if(phys_energy)
then
1365 select case(coordinate)
1367 typeboundary(phi_+1,2*idim-1)=bc_asymm
1368 if(physics_type==
'mhd'.or.physics_type==
'rmhd') typeboundary(ndir+windex+phi_,2*idim-1)=bc_asymm
1370 typeboundary(3:ndir+1,2*idim-1)=bc_asymm
1371 if(physics_type==
'mhd'.or.physics_type==
'rmhd') typeboundary(ndir+windex+2:ndir+windex+ndir,2*idim-1)=bc_asymm
1373 call mpistop(
'Pole is in cylindrical, polar, spherical coordinates!')
1376 call mpistop(
'Pole treatment for twofl or mf not implemented yet')
1378 call mpistop(
'unknown physics type for setting minimal pole boundary treatment')
1381 if(any(typeboundary(:,2*idim)==12))
then
1382 if(any(typeboundary(:,2*idim)/=12)) typeboundary(:,2*idim)=12
1383 select case(physics_type)
1384 case (
'rho',
'ard',
'rd',
'nonlinear',
'ffhd')
1386 typeboundary(:,2*idim)=bc_symm
1387 if(mype==0) print *,
'symmetric maximal pole'
1388 case (
'hd',
'rhd',
'srhd',
'mhd',
'rmhd')
1389 typeboundary(:,2*idim)=bc_symm
1391 if(phys_energy)
then
1396 select case(coordinate)
1398 typeboundary(phi_+1,2*idim)=bc_asymm
1399 if(physics_type==
'mhd'.or.physics_type==
'rmhd') typeboundary(ndir+windex+phi_,2*idim)=bc_asymm
1401 typeboundary(3:ndir+1,2*idim)=bc_asymm
1402 if(physics_type==
'mhd'.or.physics_type==
'rmhd') typeboundary(ndir+windex+2:ndir+windex+ndir,2*idim)=bc_asymm
1404 call mpistop(
'Pole is in cylindrical, polar, spherical coordinates!')
1407 call mpistop(
'Pole treatment for twofl or mf not implemented yet')
1409 call mpistop(
'unknown physics type for setting maximal pole boundary treatment')
1415 if(.not.phys_energy)
then
1420 if(any(limiter(1:nlevelshi)==
'mp5'))
then
1421 nghostcells=max(nghostcells,3)
1424 if(any(limiter(1:nlevelshi)==
'weno5'))
then
1425 nghostcells=max(nghostcells,3)
1428 if(any(limiter(1:nlevelshi)==
'weno5nm'))
then
1429 nghostcells=max(nghostcells,3)
1432 if(any(limiter(1:nlevelshi)==
'wenoz5'))
then
1433 nghostcells=max(nghostcells,3)
1436 if(any(limiter(1:nlevelshi)==
'wenoz5nm'))
then
1437 nghostcells=max(nghostcells,3)
1440 if(any(limiter(1:nlevelshi)==
'wenozp5'))
then
1441 nghostcells=max(nghostcells,3)
1444 if(any(limiter(1:nlevelshi)==
'wenozp5nm'))
then
1445 nghostcells=max(nghostcells,3)
1448 if(any(limiter(1:nlevelshi)==
'teno5ad'))
then
1449 nghostcells=max(nghostcells,3)
1452 if(any(limiter(1:nlevelshi)==
'weno5cu6'))
then
1453 nghostcells=max(nghostcells,3)
1456 if(any(limiter(1:nlevelshi)==
'ppm'))
then
1457 if(flatsh .or. flatcd)
then
1458 nghostcells=max(nghostcells,4)
1460 nghostcells=max(nghostcells,3)
1464 if(any(limiter(1:nlevelshi)==
'weno7'))
then
1465 nghostcells=max(nghostcells,4)
1468 if(any(limiter(1:nlevelshi)==
'mpweno7'))
then
1469 nghostcells=max(nghostcells,4)
1473 nghostcells = nghostcells + phys_wider_stencil
1476 if(stagger_grid .and. refine_max_level>1 .and. mod(nghostcells,2)/=0)
then
1477 nghostcells=nghostcells+1
1480 select case (coordinate)
1483 xprob^lim^de=xprob^lim^de*two*dpi;
1488 xprob^lim^d=xprob^lim^d*two*dpi;
1494 {ixghi^d = block_nx^d + 2*nghostcells\}
1495 {ixgshi^d = ixghi^d\}
1497 nx_vec = [{domain_nx^d|, }]
1498 block_nx_vec = [{block_nx^d|, }]
1500 if (any(nx_vec < 4) .or. any(mod(nx_vec, 2) == 1)) &
1501 call mpistop(
'Grid size (domain_nx^D) has to be even and >= 4')
1503 if (any(block_nx_vec < 4) .or. any(mod(block_nx_vec, 2) == 1)) &
1504 call mpistop(
'Block size (block_nx^D) has to be even and >= 4')
1506 {
if(mod(domain_nx^d,block_nx^d)/=0) &
1507 call mpistop(
'Grid (domain_nx^D) and block (block_nx^D) must be consistent') \}
1509 if(refine_max_level>nlevelshi.or.refine_max_level<1)
then
1510 write(unitterm,*)
'Error: refine_max_level',refine_max_level,
'>nlevelshi ',nlevelshi
1511 call mpistop(
"Reset nlevelshi and recompile!")
1514 if (any(stretched_dim))
then
1515 allocate(qstretch(0:nlevelshi,1:ndim),dxfirst(0:nlevelshi,1:ndim),&
1516 dxfirst_1mq(0:nlevelshi,1:ndim),dxmid(0:nlevelshi,1:ndim))
1517 allocate(nstretchedblocks(1:nlevelshi,1:ndim))
1518 qstretch(0:nlevelshi,1:ndim)=0.0d0
1519 dxfirst(0:nlevelshi,1:ndim)=0.0d0
1520 nstretchedblocks(1:nlevelshi,1:ndim)=0
1521 {
if (stretch_type(^d) == stretch_uni)
then
1523 if(qstretch_baselevel(^d)<1.0d0.or.qstretch_baselevel(^d)==bigdouble)
then
1525 write(*,*)
'stretched grid needs finite qstretch_baselevel>1'
1526 write(*,*)
'will try default value for qstretch_baselevel in dimension', ^d
1528 if(xprobmin^d>smalldouble)
then
1529 qstretch_baselevel(^d)=(xprobmax^d/xprobmin^d)**(1.d0/dble(domain_nx^d))
1531 call mpistop(
"can not set qstretch_baselevel automatically")
1534 if(mod(block_nx^d,2)==1) &
1535 call mpistop(
"stretched grid needs even block size block_nxD")
1536 if(mod(domain_nx^d/block_nx^d,2)/=0) &
1537 call mpistop(
"number level 1 blocks in D must be even")
1538 qstretch(1,^d)=qstretch_baselevel(^d)
1539 dxfirst(1,^d)=(xprobmax^d-xprobmin^d) &
1540 *(1.0d0-qstretch(1,^d))/(1.0d0-qstretch(1,^d)**domain_nx^d)
1541 qstretch(0,^d)=qstretch(1,^d)**2
1542 dxfirst(0,^d)=dxfirst(1,^d)*(1.0d0+qstretch(1,^d))
1543 if(refine_max_level>1)
then
1544 do ilev=2,refine_max_level
1545 qstretch(ilev,^d)=dsqrt(qstretch(ilev-1,^d))
1546 dxfirst(ilev,^d)=dxfirst(ilev-1,^d) &
1547 /(1.0d0+dsqrt(qstretch(ilev-1,^d)))
1552 {
if(stretch_type(^d) == stretch_uni)
then
1553 write(*,*)
'Stretched dimension ', ^d
1554 write(*,*)
'Using stretched grid with qs=',qstretch(0:refine_max_level,^d)
1555 write(*,*)
' and first cell sizes=',dxfirst(0:refine_max_level,^d)
1558 {
if(stretch_type(^d) == stretch_symm)
then
1560 write(*,*)
'will apply symmetric stretch in dimension', ^d
1562 if(mod(block_nx^d,2)==1) &
1563 call mpistop(
"stretched grid needs even block size block_nxD")
1565 if(nstretchedblocks_baselevel(^d)==0) &
1566 call mpistop(
"need finite even number of stretched blocks at baselevel")
1567 if(mod(nstretchedblocks_baselevel(^d),2)==1) &
1568 call mpistop(
"need even number of stretched blocks at baselevel")
1569 if(qstretch_baselevel(^d)<1.0d0.or.qstretch_baselevel(^d)==bigdouble) &
1570 call mpistop(
'stretched grid needs finite qstretch_baselevel>1')
1572 ipower=(nstretchedblocks_baselevel(^d)/2)*block_nx^d
1573 if(nstretchedblocks_baselevel(^d)==domain_nx^d/block_nx^d)
then
1574 xstretch^d=0.5d0*(xprobmax^d-xprobmin^d)
1576 xstretch^d=(xprobmax^d-xprobmin^d) &
1577 /(2.0d0+dble(domain_nx^d-nstretchedblocks_baselevel(^d)*block_nx^d) &
1578 *(1.0d0-qstretch_baselevel(^d))/(1.0d0-qstretch_baselevel(^d)**ipower))
1580 if(xstretch^d>(xprobmax^d-xprobmin^d)*0.5d0) &
1581 call mpistop(
" stretched grid part should not exceed full domain")
1582 dxfirst(1,^d)=xstretch^d*(1.0d0-qstretch_baselevel(^d)) &
1583 /(1.0d0-qstretch_baselevel(^d)**ipower)
1584 nstretchedblocks(1,^d)=nstretchedblocks_baselevel(^d)
1585 qstretch(1,^d)=qstretch_baselevel(^d)
1586 qstretch(0,^d)=qstretch(1,^d)**2
1587 dxfirst(0,^d)=dxfirst(1,^d)*(1.0d0+qstretch(1,^d))
1588 dxmid(1,^d)=dxfirst(1,^d)
1589 dxmid(0,^d)=dxfirst(1,^d)*2.0d0
1590 if(refine_max_level>1)
then
1591 do ilev=2,refine_max_level
1592 nstretchedblocks(ilev,^d)=2*nstretchedblocks(ilev-1,^d)
1593 qstretch(ilev,^d)=dsqrt(qstretch(ilev-1,^d))
1594 dxfirst(ilev,^d)=dxfirst(ilev-1,^d) &
1595 /(1.0d0+dsqrt(qstretch(ilev-1,^d)))
1596 dxmid(ilev,^d)=dxmid(ilev-1,^d)/2.0d0
1600 sizeuniformpart^d=dxfirst(1,^d) &
1601 *(domain_nx^d-nstretchedblocks_baselevel(^d)*block_nx^d)
1603 print *,
'uniform part of size=',sizeuniformpart^d
1604 print *,
'setting of domain is then=',2*xstretch^d+sizeuniformpart^d
1605 print *,
'versus=',xprobmax^d-xprobmin^d
1607 if(dabs(xprobmax^d-xprobmin^d-2*xstretch^d-sizeuniformpart^d)>smalldouble)
then
1608 call mpistop(
'mismatch in domain size!')
1611 dxfirst_1mq(0:refine_max_level,1:ndim)=dxfirst(0:refine_max_level,1:ndim) &
1612 /(1.0d0-qstretch(0:refine_max_level,1:ndim))
1615 dx_vec = [{xprobmax^d-xprobmin^d|, }] / nx_vec
1618 write(c_ndim,
'(I1)') ^nd
1619 write(unitterm,
'(A30,' // c_ndim //
'(I0," "))') &
1620 ' Domain size (cells): ', nx_vec
1621 write(unitterm,
'(A30,' // c_ndim //
'(E9.3," "))') &
1622 ' Level one dx: ', dx_vec
1625 if (any(dx_vec < smalldouble)) &
1626 call mpistop(
"Incorrect domain size (too small grid spacing)")
1630 if(sum(w_refine_weight(:))==0) w_refine_weight(1) = 1.d0
1631 if(dabs(sum(w_refine_weight(:))-1.d0)>smalldouble)
then
1632 write(unitterm,*)
"Sum of all elements in w_refine_weight be 1.d0"
1633 call mpistop(
"Reset w_refine_weight so the sum is 1.d0")
1636 select case (typeboundspeed)
1641 case(
'cmaxleftright')
1644 call mpistop(
"set typeboundspeed='Einfeldt' or 'cmaxmean' or 'cmaxleftright'")
1647 if (mype==0)
write(unitterm,
'(A30)', advance=
'no')
'Refine estimation: '
1649 select case (refine_criterion)
1651 if (mype==0)
write(unitterm,
'(A)')
"user defined"
1653 if (mype==0)
write(unitterm,
'(A)')
"relative error"
1655 if (mype==0)
write(unitterm,
'(A)')
"Lohner's original scheme"
1657 if (mype==0)
write(unitterm,
'(A)')
"Lohner's scheme"
1659 call mpistop(
"Unknown error estimator, change refine_criterion")
1662 if (tfixgrid<bigdouble/2.0d0)
then
1663 if(mype==0)print*,
'Warning, at time=',tfixgrid,
'the grid will be fixed'
1665 if (itfixgrid<biginteger/2)
then
1666 if(mype==0)print*,
'Warning, at iteration=',itfixgrid,
'the grid will be fixed'
1668 if (ditregrid>1)
then
1669 if(mype==0)print*,
'Note, Grid is reconstructed once every',ditregrid,
'iterations'
1674 select case(slicedir(islice))
1676 if(slicecoord(islice)<xprobmin^d.or.slicecoord(islice)>xprobmax^d) &
1677 write(uniterr,*)
'Warning in read_par_files: ', &
1678 'Slice ', islice,
' coordinate',slicecoord(islice),
'out of bounds for dimension ',slicedir(islice)
1684 write(unitterm,
'(A30,A,A)')
'restart_from_file: ',
' ', trim(restart_from_file)
1685 write(unitterm,
'(A30,L1)')
'converting: ', convert
1686 write(unitterm,
'(A)')
''
1689 deallocate(flux_scheme)
1841 integer,
intent(in) :: fh
1842 integer(MPI_OFFSET_KIND),
intent(out) :: offset_tree
1843 integer(MPI_OFFSET_KIND),
intent(out) :: offset_block
1845 double precision :: rbuf(ndim)
1846 double precision,
allocatable :: params(:)
1847 integer :: i, version
1848 integer :: ibuf(ndim), iw
1849 integer :: er, n_par, tmp_int
1850 integer,
dimension(MPI_STATUS_SIZE) :: st
1851 logical :: periodic(ndim)
1852 character(len=name_len),
allocatable :: var_names(:), param_names(:)
1853 character(len=name_len) :: phys_name, geom_name
1856 call mpi_file_read(fh, version, 1, mpi_integer, st, er)
1858 call mpistop(
"Incompatible file version (maybe old format?)")
1862 call mpi_file_read(fh, ibuf(1), 1, mpi_integer, st, er)
1863 offset_tree = ibuf(1)
1866 call mpi_file_read(fh, ibuf(1), 1, mpi_integer, st, er)
1867 offset_block = ibuf(1)
1870 call mpi_file_read(fh, ibuf(1), 1, mpi_integer, st, er)
1872 if (nw /= ibuf(1))
then
1873 write(*,*)
"nw=",nw,
" and nw found in restart file=",ibuf(1)
1874 write(*,*)
"Please be aware of changes in w at restart."
1879 call mpi_file_read(fh, ibuf(1), 1, mpi_integer, st, er)
1880 if (ibuf(1) /=
ndir)
then
1881 write(*,*)
"ndir in restart file = ",ibuf(1)
1882 write(*,*)
"ndir = ",
ndir
1883 call mpistop(
"reset ndir to ndir in restart file")
1887 call mpi_file_read(fh, ibuf(1), 1, mpi_integer, st, er)
1888 if (ibuf(1) /= ndim)
then
1889 write(*,*)
"ndim in restart file = ",ibuf(1)
1890 write(*,*)
"ndim = ",ndim
1891 call mpistop(
"reset ndim to ndim in restart file")
1895 call mpi_file_read(fh, ibuf(1), 1, mpi_integer, st, er)
1897 write(*,*)
"number of levels in restart file = ",ibuf(1)
1899 call mpistop(
"refine_max_level < num. levels in restart file")
1903 call mpi_file_read(fh,
nleafs, 1, mpi_integer, st, er)
1906 call mpi_file_read(fh,
nparents, 1, mpi_integer, st, er)
1909 call mpi_file_read(fh,
it, 1, mpi_integer, st, er)
1912 call mpi_file_read(fh,
global_time, 1, mpi_double_precision, st, er)
1915 call mpi_file_read(fh,rbuf(1:ndim),ndim,mpi_double_precision,st,er)
1916 if (maxval(abs(rbuf(1:ndim) - [ xprobmin^
d ])) > 0)
then
1917 write(*,*)
"Error: xprobmin differs from restart data: ", rbuf(1:ndim)
1918 call mpistop(
"change xprobmin^D in par file")
1922 call mpi_file_read(fh,rbuf(1:ndim),ndim,mpi_double_precision,st,er)
1923 if (maxval(abs(rbuf(1:ndim) - [ xprobmax^
d ])) > 0)
then
1924 write(*,*)
"Error: xprobmax differs from restart data: ", rbuf(1:ndim)
1925 call mpistop(
"change xprobmax^D in par file")
1929 call mpi_file_read(fh,ibuf(1:ndim), ndim, mpi_integer,st,er)
1930 if (any(ibuf(1:ndim) /= [
domain_nx^
d ]))
then
1931 write(*,*)
"Error: mesh size differs from restart data: ", ibuf(1:ndim)
1932 call mpistop(
"change domain_nx^D in par file")
1936 call mpi_file_read(fh,ibuf(1:ndim), ndim, mpi_integer,st,er)
1937 if (any(ibuf(1:ndim) /= [
block_nx^
d ]))
then
1938 write(*,*)
"Error: block size differs from restart data:", ibuf(1:ndim)
1939 call mpistop(
"change block_nx^D in par file")
1943 if (version > 4)
then
1944 call mpi_file_read(fh, periodic, ndim, mpi_logical, st, er)
1945 if ({periodic(^
d) .and. .not.
periodb(^
d) .or. .not.periodic(^
d) .and.
periodb(^
d)| .or. }) &
1946 call mpistop(
"change in periodicity in par file")
1948 call mpi_file_read(fh, geom_name, name_len, mpi_character, st, er)
1951 write(*,*)
"type of coordinates in data is: ", geom_name
1952 call mpistop(
"select the correct coordinates in mod_usr.t file")
1955 call mpi_file_read(fh, stagger_mark_dat, 1, mpi_logical, st, er)
1957 write(*,*)
"Warning: stagger grid flag differs from restart data:", stagger_mark_dat
1963 if (version > 3)
then
1967 call mpi_file_read(fh, var_names(iw), name_len, mpi_character, st, er)
1971 call mpi_file_read(fh, phys_name, name_len, mpi_character, st, er)
1977 call mpi_file_read(fh, n_par, 1, mpi_integer, st, er)
1978 allocate(params(n_par))
1979 allocate(param_names(n_par))
1980 call mpi_file_read(fh, params, n_par, mpi_double_precision, st, er)
1981 call mpi_file_read(fh, param_names, name_len * n_par, mpi_character, st, er)
1984 call mpi_file_read(fh, tmp_int, 1, mpi_integer, st, er)
1989 call mpi_file_read(fh, tmp_int, 1, mpi_integer, st, er)
1992 call mpi_file_read(fh, tmp_int, 1, mpi_integer, st, er)