36 REAL,
PARAMETER :: gn = 1.0
37 INTEGER,
PARAMETER :: units = geometrical
39 REAL,
PARAMETER :: csiso = &
43 REAL,
PARAMETER ::
omega = 1.0
44 REAL,
PARAMETER :: sigma0 = 1.0
45 REAL,
PARAMETER :: tsim = 10./
omega
46 REAL,
PARAMETER :: gamma = 2.0
47 REAL,
PARAMETER :: q = 1.5
49 INTEGER,
PARAMETER :: mgeo = cartesian
50 INTEGER,
PARAMETER :: res_xy = 128
51 INTEGER,
PARAMETER :: res_z = 1
52 REAL,
PARAMETER :: box_size = 320*gn*sigma0/(
omega*
omega)
53 REAL,
PARAMETER :: box_height = 0.0
55 INTEGER,
PARAMETER :: onum = 10
57 CHARACTER(LEN=256),
PARAMETER :: odir =
"./"
58 CHARACTER(LEN=256),
PARAMETER :: ofname =
"sbox"
60 CLASS(
fosite),
ALLOCATABLE :: sim
61 CLASS(marray_compound),
POINTER :: pvar=>null(),pvar_init=>null()
72 CALL initdata(sim%Mesh, sim%Physics, sim%Timedisc%pvar, sim%Timedisc%cvar)
75 CALL sim%Physics%new_statevector(pvar_init,primitive)
76 CALL rotatedata(sim%Mesh,sim%Timedisc%pvar,pvar_init,
"xy")
82 CALL sim%Physics%new_statevector(pvar,primitive)
83 CALL rotatedata(sim%Mesh,sim%Timedisc%pvar,pvar,
"xy")
88 CALL setattr(sim%config,
"/datafile/filename", (trim(odir) // trim(ofname) //
"_rotate"))
89 CALL setattr(sim%config,
"mesh/shearingbox", 2)
91 sim%Timedisc%pvar%data1d(:) = pvar_init%data1d(:)
92 SELECT TYPE(phys => sim%Physics)
93 CLASS IS(physics_eulerisotherm)
94 CALL phys%Convert2Conservative(sim%Timedisc%pvar,sim%Timedisc%cvar)
96 CALL phys%Error(
"shear",
"only (non-)isothermal HD supported")
101 sigma = sqrt(sum((sim%Timedisc%pvar%data4d(:,:,:,:)-pvar%data4d(:,:,:,:))**2)/ &
102 SIZE(pvar%data4d(:,:,:,:)))
103 DEALLOCATE(pvar,pvar_init)
110 tap_check_small(sigma,1e-13,
"Shear x-y symmetry test")
112 tap_check(ok,
"stoptime reached")
123 TYPE(dict_typ),
POINTER :: config
125 TYPE(dict_typ),
POINTER :: mesh, physics, datafile, &
126 sources, timedisc, fluxes, shear
129 REAL :: XMIN,XMAX,YMIN,YMAX,ZMIN,ZMAX
135 zmin = -0.5*box_height
136 zmax = +0.5*box_height
140 "meshtype" / midpoint, &
143 "decomposition" / (/1,-1,1/), &
154 "output/rotation" / 0, &
155 "output/volume" / 0, &
161 IF (csiso.GT.tiny(csiso))
THEN
162 physics => dict(
"problem" / euler_isotherm, &
166 physics => dict(
"problem" / euler, &
175 "variables" / primitive, &
176 "limiter" / vanleer &
181 "method" / modified_euler, &
185 "dtlimit" / 1.0e-40, &
187 "output/external_sources" / 1, &
188 "maxiter" / 100000000)
192 "fileformat" / vtk, &
193 "filename" / (trim(odir) // trim(ofname)), &
199 "physics" / physics, &
201 "timedisc" / timedisc, &
202 "datafile" / datafile)
210 CLASS(mesh_base),
INTENT(IN) :: Mesh
211 CLASS(physics_base),
INTENT(IN) :: Physics
212 CLASS(marray_compound),
POINTER,
INTENT(INOUT) :: pvar,cvar
216 SELECT TYPE(p => pvar)
217 CLASS IS(statevector_eulerisotherm)
218 WHERE ((abs(mesh%bcenter(:,:,:,1)).LT.0.15*box_size.AND. &
219 abs(mesh%bcenter(:,:,:,2)).LT.0.15*box_size))
220 p%density%data3d(:,:,:) = sigma0
222 p%density%data3d(:,:,:) = sigma0*1e-2
224 SELECT CASE(mesh%shear_dir)
226 p%velocity%data2d(:,2) = 0.0
227 p%velocity%data4d(:,:,:,1) = mesh%Q*mesh%bcenter(:,:,:,2)*mesh%Omega
229 p%velocity%data2d(:,1) = 0.0
230 p%velocity%data4d(:,:,:,2) = -mesh%Q*mesh%bcenter(:,:,:,1)*mesh%Omega
232 CALL physics%Error(
"shear::InitData",
"shearing disabled or unsupported direction")
235 CALL physics%Error(
"shear::InitData",
"only (non-)isothermal HD supported")
238 SELECT TYPE(p => pvar)
239 CLASS IS(statevector_euler)
240 p%pressure%data1d(:) = 1e-1
243 CALL physics%Convert2Conservative(pvar,cvar)
244 CALL mesh%Info(
" DATA-----> initial condition: " // &
252 CLASS(mesh_base),
INTENT(IN) :: Mesh
253 CLASS(marray_compound),
INTENT(INOUT) :: pvar_in,pvar_out
254 CHARACTER(LEN=2),
INTENT(IN) :: dir
260 SELECT TYPE(pin => pvar_in)
261 CLASS IS(statevector_eulerisotherm)
262 SELECT TYPE(pout => pvar_out)
263 CLASS IS(statevector_eulerisotherm)
265 FORALL(i=mesh%IGMIN:mesh%IGMAX,j=mesh%JGMIN:mesh%JGMAX,k=mesh%KGMIN:mesh%KGMAX)
266 pout%density%data3d(i,j,k) = pin%density%data3d(mesh%IGMAX-mesh%IGMIN-j-2,i,k)
267 pout%velocity%data4d(i,j,k,1) = pin%velocity%data4d(mesh%IGMAX-mesh%IGMIN-j-2,i,k,2)
268 pout%velocity%data4d(i,j,k,2) = -pin%velocity%data4d(mesh%IGMAX-mesh%IGMIN-j-2,i,k,1)
272 SELECT TYPE(pin => pvar_in)
273 CLASS IS(statevector_euler)
274 SELECT TYPE(pout => pvar_out)
275 CLASS IS(statevector_euler)
277 FORALL(i=mesh%IGMIN:mesh%IGMAX,j=mesh%JGMIN:mesh%JGMAX,k=mesh%KGMIN:mesh%KGMAX)
278 pout%pressure%data3d(i,j,k) = pin%pressure%data3d(mesh%IGMAX-mesh%IGMIN-j-2,i,k)
283 CALL mesh%Error(
"shear::RotateData",
"only 'xy'-plane is currently supported for rotating data")
subroutine initdata(Mesh, Physics, Fluxes, Timedisc)
subroutine makeconfig(Sim, config)
subroutine rotatedata(Mesh, pvar_in, pvar_out, dir)
pure real function, dimension(size(ephir%data2d, dim=1)) omega(ephir, velocity)