57 REAL,
PARAMETER :: gn = 6.6742d-8
58 REAL,
PARAMETER :: rg = 8.31447d+7
59 REAL,
PARAMETER :: msun = 1.989d+33
60 REAL,
PARAMETER :: au = 1.49597870691e+13
61 REAL,
PARAMETER :: year = 3.15576e+7
62 REAL,
PARAMETER :: mscale = msun
64 REAL,
PARAMETER :: tsim = 6.0
65 REAL,
PARAMETER :: mu = 2.35d+0
66 REAL,
PARAMETER :: valpha = 0.05
68 REAL,
PARAMETER :: mbh = 1.0*mscale
69 REAL,
PARAMETER :: mdisk = 0.1*mscale
70 REAL,
PARAMETER :: t_init = 120.0
71 REAL,
PARAMETER :: t_min = 10.0
73 REAL,
PARAMETER :: beta_c = 10.0
74 REAL,
PARAMETER :: gamma = 1.6
76 INTEGER,
PARAMETER :: mgeo = logcylindrical
77 REAL,
PARAMETER :: gpar = au
78 REAL,
PARAMETER :: rmin = 1.0*gpar
79 REAL,
PARAMETER :: rmax = 25.0*gpar
80 INTEGER,
PARAMETER :: xres = 256
81 INTEGER,
PARAMETER :: yres = xres*3
82 INTEGER,
PARAMETER :: zres = 1
85 REAL,
PARAMETER :: noise = 0.3
87 INTEGER,
PARAMETER :: onum = 100
88 CHARACTER(LEN=256),
PARAMETER &
90 CHARACTER(LEN=256) :: ofname =
'sgdisk'
92 CLASS(
fosite),
ALLOCATABLE :: sim
93 REAL :: csiso,
omega,orp
99CALL asl_library_initialize()
105CALL initdata(sim%Mesh, sim%Physics, sim%Timedisc, sim%Fluxes, sim%Sources, &
106 sim%Timedisc%pvar, sim%Timedisc%cvar)
111 CALL asl_library_finalize()
121 CLASS(
fosite),
INTENT(INOUT) :: Sim
122 TYPE(dict_typ),
POINTER :: config
123 TYPE(dict_typ),
POINTER :: mesh, physics, fluxes, boundary, grav,&
124 sources, timedisc, datafile, cooling, &
125 rotframe, pmass, self, damping
128 csiso = sqrt(rg/mu*t_init)
130 orp = 2.*pi/(sqrt(gn*mbh/rmax**3.))
136 "meshtype" / midpoint, &
141 "xmin" / log(rmin/gpar), &
142 "xmax" / log(rmax/gpar), &
149 "decomposition" / (/ -1, 1, 1/), &
152 "output/position_vector" / 1, &
168 "southern" / periodic, &
169 "northern" / periodic, &
170 "bottomer" / reflecting, &
171 "topper" / reflecting)
178 "variables" / primitive, &
179 "limiter" / vanleer, &
185 "stype" / rotating_frame)
190 "gtype" / pointmass, &
192 "output/position" / 1)
196 "stype" / disk_cooling, &
197 "output/Qcool" / 1, &
198 "rhomin" / 1.0e-30, &
204 "gtype" / spectral, &
205 "output/potential" / 1, &
213 "output/potential" / 1, &
215 "output/height" / 1, &
220 "cooling" / cooling, &
225 CALL setattr(sources,
"damping",damping)
229 "method" / modified_euler, &
231 "dtlimit" / 1.0e-50, &
232 "tol_rel" / 1.0e-3, &
234 "tol_abs" / (/ 1.0e-16, 1.0, 1.0e-16, 1.0 /), &
235 "output/energy" / 1, &
237 "stoptime" / (orp*tsim), &
240 "checkdata" / ior(check_nothing,check_tmin), &
241 "maxiter" / 100000000)
245 "fileformat" / xdmf, &
246 "filename" / (trim(odir) // trim(ofname)), &
250 "physics" / physics, &
253 "boundary" / boundary, &
254 "sources" / sources, &
255 "timedisc" / timedisc, &
256 "datafile" / datafile)
261 SUBROUTINE initdata(Mesh,Physics,Timedisc,Fluxes,Sources,pvar,cvar)
267 CLASS(mesh_base),
INTENT(IN) :: Mesh
268 CLASS(physics_base),
INTENT(INOUT) :: Physics
269 CLASS(timedisc_base),
INTENT(INOUT) :: Timedisc
270 CLASS(fluxes_base),
INTENT(INOUT) :: Fluxes
271 CLASS(sources_list),
ALLOCATABLE,
INTENT(INOUT) :: Sources
272 CLASS(marray_compound),
INTENT(INOUT):: pvar,cvar
281 REAL,
DIMENSION(:,:,:),
POINTER :: r, Sigma
282 REAL,
DIMENSION(:,:,:,:),
POINTER :: r_vec
283 CHARACTER(LEN=32) :: mdisk_str
284 REAL,
DIMENSION(Mesh%IGMIN:Mesh%IGMAX,Mesh%JGMIN:Mesh%JGMAX,Mesh%KGMIN:Mesh%KGMAX) &
292 r => mesh%RemapBounds(mesh%radius%bcenter(:,:,:))
293 r_vec => mesh%RemapBounds(mesh%posvec%bcenter(:,:,:,:))
295 sigma => mesh%RemapBounds(pvar%data4d(:,:,:,physics%DENSITY))
300 CALL random_number(rands)
302 CALL asl_random_create(rng, asl_randommethod_mt19937_64)
303 CALL asl_random_distribute_uniform(rng)
304 n = (mesh%IGMAX-mesh%IGMIN+1)*(mesh%JGMAX-mesh%JGMIN+1)*(mesh%KGMAX-mesh%KGMIN+1)
305 CALL asl_random_generate_d(rng, n, rands)
307 rands = rands * noise * 2.0 + (1.0 - noise)
308 sigma = rands*(rmin/r(:,:,:))
311 CALL asl_random_destroy(rng)
315 mass = sum(mesh%volume%data3d(mesh%IMIN:mesh%IMAX,mesh%JMIN:mesh%JMAX,mesh%KMIN:mesh%KMAX) * &
316 sigma(mesh%IMIN:mesh%IMAX,mesh%JMIN:mesh%JMAX,mesh%KMIN:mesh%KMAX))
318 CALL mpi_allreduce(mpi_in_place,mass,1,default_mpi_real,mpi_sum, &
319 mesh%comm_cart,ierror)
322 sigma(:,:,:) = sigma(:,:,:) * mdisk / mass
325 SELECT TYPE(phys => physics)
327 pvar%data4d(:,:,:,physics%PRESSURE) = &
328 csiso*csiso*pvar%data4d(:,:,:,physics%DENSITY)/gamma
330 SELECT TYPE(pvarious => pvar)
332 CALL phys%UpdateSoundSpeed(pvarious)
337 pvar%data2d(:,physics%XVELOCITY:physics%YVELOCITY) = 0.0
340 IF (
ALLOCATED(sources)) &
341 sp => sources%GetSourcesPointer(gravity)
342 IF (
ASSOCIATED(sp))
THEN
345 CALL sp%UpdateGravity(mesh,physics,fluxes,pvar,0.0,0.0)
350 pvar%data4d(:,:,:,physics%XVELOCITY:physics%XVELOCITY+physics%VDIM-1) = &
351 timedisc%GetCentrifugalVelocity(mesh,physics,fluxes,sources,(/0.,0.,1./),sp%accel%data4d)
353 CALL physics%Error(
"sgdisk::InitData",
"this should not happen -> gravity pointer is not of class sources_gravity")
356 CALL physics%Error(
"sgdisk::InitData",
"gravity source term not initialized")
359 IF (mesh%fargo%GetType().EQ.2) &
360 timedisc%w(:,:) = sqrt(physics%constants%GN*mbh/r(:,mesh%JMIN,:))-mesh%OMEGA*r(:,mesh%JMIN,:)
363 pvar%data4d(:,:,:,physics%YVELOCITY) = pvar%data4d(:,:,:,physics%YVELOCITY) &
364 - mesh%OMEGA*r(:,:,:)
367 CALL physics%Convert2Conservative(pvar,cvar)
370 SELECT TYPE(bwest => timedisc%Boundary%boundary(west)%p)
371 CLASS IS (boundary_custom)
372 CALL bwest%SetCustomBoundaries(mesh,physics, &
373 (/custom_nograd,custom_outflow,custom_kepler,custom_nograd/))
377 SELECT TYPE(beast => timedisc%Boundary%boundary(east)%p)
378 CLASS IS (boundary_custom)
379 CALL beast%SetCustomBoundaries(mesh,physics, &
380 (/custom_nograd,custom_outflow,custom_kepler,custom_nograd/))
383 CALL physics%Convert2Conservative(pvar,cvar)
385 WRITE (mdisk_str,
'(ES10.2)') mdisk
386 CALL mesh%Info(
" DATA-----> initial condition: Mestel's disk")
387 CALL mesh%Info(
" disk mass: " // trim(mdisk_str))
395 CLASS(timedisc_base),
INTENT(IN) :: Timedisc
396 INTEGER :: i, n, clock
397 INTEGER,
DIMENSION(:),
ALLOCATABLE :: seed
401 CALL random_seed(
size = n)
403 CALL system_clock(count=clock)
404 seed = clock + 37 * (/ (i - 1, i = 1, n) /)
406 seed = seed + timedisc%GetRank()
408 CALL random_seed(put = seed)
subroutine initdata(Mesh, Physics, Fluxes, Timedisc)
subroutine makeconfig(Sim, config)
subroutine initrandseed(Physics)
physics module for 1D,2D and 3D non-isothermal Euler equations
generic source terms module providing functionaly common to all source terms
generic gravity terms module providing functionaly common to all gravity terms
pure real function, dimension(size(ephir%data2d, dim=1)) omega(ephir, velocity)