44 REAL,
PARAMETER :: tsim = 10.0
45 REAL,
PARAMETER :: gamma = 1.4
46 REAL,
PARAMETER :: re = 1.0e+4
47 REAL,
PARAMETER ::
omega = 0.1
49 REAL,
PARAMETER :: rho0 = 1.0
50 REAL,
PARAMETER :: v0 = 0.0
51 REAL,
PARAMETER :: p0 = 2.5
52 REAL,
PARAMETER :: rho1 = 2.0
53 REAL,
PARAMETER :: v1 = 1.0
54 REAL,
PARAMETER :: p1 = p0
56 INTEGER,
PARAMETER :: mgeo = spherical_planet
57 INTEGER,
PARAMETER :: xres = 20
58 INTEGER,
PARAMETER :: yres = 40
59 REAL,
PARAMETER :: gpar = 1.0
61 INTEGER,
PARAMETER :: onum = 10
62 CHARACTER(LEN=256),
PARAMETER &
64 CHARACTER(LEN=256),
PARAMETER &
65 :: ofname =
'KHI2D_sphere'
67 CLASS(
fosite),
ALLOCATABLE :: sim
76 CALL initdata(sim%Mesh, sim%Physics, sim%Timedisc)
83 tap_check(ok,
"stoptime reached")
91 CLASS(
fosite),
INTENT(INOUT) :: Sim
92 TYPE(dict_typ),
POINTER :: config
95 TYPE(dict_typ),
POINTER :: mesh, physics, boundary, datafile, &
96 timedisc, fluxes, vis, rotframe
101 "meshtype" / midpoint, &
103 "fargo/method" / 0, &
104 "decomposition" / (/ -1, 1, 1/), &
129 "variables" / conservative, &
131 "limiter" / monocent, &
140 "western" / reflecting, &
141 "eastern" / reflecting, &
142 "southern" / periodic, &
143 "northern" / periodic, &
144 "bottomer" / reflecting, &
145 "topper" / reflecting &
148 NULLIFY(vis,rotframe)
151 dynvis = abs(rho0 * 2*pi * (v0-v1) / re)
152 IF (re.LT.huge(re))
THEN
154 "stype" / viscosity, &
155 "vismodel" / molecular, &
156 "dynconst" / dynvis, &
157 "bulkconst" / (-2./3.*dynvis), &
158 "output/dynvis" / 0, &
159 "output/stress" / 0, &
160 "output/kinvis" / 0, &
161 "output/bulkvis" / 0 &
166 rotframe => dict(
"stype" / rotating_frame, &
167 "disable_centaccel" / 1)
168 CALL setattr(mesh,
"omega",
omega)
173 "method" / modified_euler, &
178 "tol_rel" / 0.0095, &
179 "dtlimit" / 1.0e-15, &
180 "maxiter" / 100000000, &
181 "output/pressure" / 1, &
182 "output/density" / 1, &
183 "output/xvelocity" / 1, &
184 "output/yvelocity" / 1 &
190 "fileformat" / xdmf, &
191 "filename" / (trim(odir) // trim(ofname)), &
197 "physics" / physics, &
198 "boundary" / boundary, &
200 "timedisc" / timedisc, &
201 "datafile" / datafile &
203 IF (
ASSOCIATED(vis)) &
204 CALL setattr(config,
"sources/vis", vis)
205 IF (
ASSOCIATED(rotframe)) &
206 CALL setattr(config,
"sources/rotframe", rotframe)
214 CLASS(physics_base) :: Physics
215 CLASS(mesh_base) :: Mesh
216 CLASS(timedisc_base) :: Timedisc
221 INTEGER,
DIMENSION(:),
ALLOCATABLE :: seed
222 REAL,
DIMENSION(Mesh%IGMIN:Mesh%IGMAX,Mesh%JGMIN:Mesh%JGMAX,Mesh%KGMIN:Mesh%KGMAX,2) :: dv
224 INTENT(IN) :: mesh,physics
225 INTENT(INOUT) :: timedisc
229 CALL system_clock(count=clock)
230 CALL random_seed(
SIZE = n)
231 seed = clock + (timedisc%getrank()+1) * (/(k-1, k=1,n)/)
232 CALL random_seed(put=seed)
233 CALL random_number(dv)
236 SELECT TYPE(pvar => timedisc%pvar)
237 TYPE IS(statevector_euler)
239 WHERE ((mesh%bcenter(:,:,:,1).LT.(mesh%ymin+0.33*pi)).OR. &
240 (mesh%bcenter(:,:,:,1).GT.(sim%Mesh%ymin+0.66*pi)))
241 pvar%density%data3d(:,:,:) = rho0
242 pvar%velocity%data4d(:,:,:,2) = v0
243 pvar%velocity%data4d(:,:,:,1) = 0.0
244 pvar%pressure%data3d(:,:,:) = p0
246 pvar%density%data3d(:,:,:) = rho1
247 pvar%velocity%data4d(:,:,:,2) = v1
248 pvar%velocity%data4d(:,:,:,1) = 0.0
249 pvar%pressure%data3d(:,:,:) = p1
251 sp => sim%Sources%GetSourcesPointer(rotating_frame)
252 IF (
ASSOCIATED(sp))
THEN
255 CALL sp%Convert2RotatingFrame(mesh,physics,pvar)
259 SELECT CASE(mesh%fargo%GetType())
262 timedisc%w(:,:) = pvar%velocity%data4d(:,mesh%JMIN,:,2)
266 pvar%velocity%data4d(:,:,:,1) = pvar%velocity%data4d(:,:,:,1) &
267 + (dv(:,:,:,1)-0.5)*0.2
268 pvar%velocity%data4d(:,:,:,2) = pvar%velocity%data4d(:,:,:,2) &
269 + (dv(:,:,:,2)-0.5)*0.2
271 CALL physics%Error(
"KHI2D_sphere::InitData",
"only non-isothermal HD supported")
275 CALL physics%Convert2Conservative(timedisc%pvar,timedisc%cvar)
276 CALL mesh%Info(
" DATA-----> initial condition: " // &
277 "spherical shear flow")
program khi
Kelvin-Helmholtz instability.
subroutine initdata(Mesh, Physics, Fluxes, Timedisc)
subroutine makeconfig(Sim, config)
generic source terms module providing functionaly common to all source terms
source terms module for inertial forces caused by a rotating grid
pure real function, dimension(size(ephir%data2d, dim=1)) omega(ephir, velocity)