39 REAL,
PARAMETER :: tsim = 30.0
40 REAL,
PARAMETER :: gamma = 1.4
41 REAL,
PARAMETER :: csiso = &
45 INTEGER,
PARAMETER :: fargo= 0
49 REAL,
PARAMETER :: rhoinf = 1.
50 REAL,
PARAMETER :: pinf = 1.
51 REAL,
PARAMETER :: vstr = 5.0
52 REAL,
PARAMETER :: uinf = 0.0
53 REAL,
PARAMETER :: vinf = 0.0
54 REAL,
PARAMETER :: winf = 0.0
55 REAL,
PARAMETER :: x0 = 0.0
56 REAL,
PARAMETER :: y0 = 0.0
57 REAL,
PARAMETER :: z0 = 0.0
58 REAL,
PARAMETER :: r0 = 1.0
59 REAL,
PARAMETER ::
omega = 0.1
62 INTEGER,
PARAMETER :: mgeo = cylindrical
63 INTEGER,
PARAMETER :: xres = 40
64 INTEGER,
PARAMETER :: yres = 40
65 INTEGER,
PARAMETER :: zres = 1
66 REAL,
PARAMETER :: rmin = 1.0e-2
67 REAL,
PARAMETER :: rmax = 5.0
68 REAL,
PARAMETER :: zmin = -1.0
69 REAL,
PARAMETER :: zmax = 1.0
70 REAL,
PARAMETER :: gpar = 1.0
73 LOGICAL,
PARAMETER :: with_iar = .false.
76 INTEGER,
PARAMETER :: onum = 10
77 CHARACTER(LEN=256),
PARAMETER &
79 CHARACTER(LEN=256),
PARAMETER &
80 :: ofname =
'vortex3d'
82 CLASS(
fosite),
ALLOCATABLE :: sim
83 CLASS(marray_compound),
POINTER :: pvar_init => null()
84 REAL,
DIMENSION(:),
ALLOCATABLE :: sum_numer, sum_denom, sigma
93 IF (sim%GetRank().EQ.0)
THEN
102 CALL initdata(sim%Mesh, sim%Physics, sim%Timedisc)
103 CALL sim%Physics%new_statevector(pvar_init,primitive)
104 pvar_init%data1d(:) = sim%Timedisc%pvar%data1d(:)
106 ok = .NOT.sim%aborted
108 ALLOCATE(sum_numer(sim%Physics%VNUM),sum_denom(sim%Physics%VNUM),sigma(sim%Physics%VNUM))
112 DO n=1,sim%Physics%VNUM
113 sum_numer(n) = sum(abs(sim%Timedisc%pvar%data2d(:,n)-pvar_init%data2d(:,n)),mask=sim%Mesh%without_ghost_zones%mask1d)
114 sum_denom(n) = sum(abs(pvar_init%data2d(:,n)),mask=sim%Mesh%without_ghost_zones%mask1d)
119 IF (sim%GetRank().GT.0)
THEN
120 CALL mpi_reduce(sum_numer,sum_numer,sim%Physics%VNUM,default_mpi_real,mpi_sum,0,mpi_comm_world,sim%ierror)
121 CALL mpi_reduce(sum_denom,sum_denom,sim%Physics%VNUM,default_mpi_real,mpi_sum,0,mpi_comm_world,sim%ierror)
123 CALL mpi_reduce(mpi_in_place,sum_numer,sim%Physics%VNUM,default_mpi_real,mpi_sum,0,mpi_comm_world,sim%ierror)
124 CALL mpi_reduce(mpi_in_place,sum_denom,sim%Physics%VNUM,default_mpi_real,mpi_sum,0,mpi_comm_world,sim%ierror)
127 WHERE (abs(sum_denom(:)).LE.2*tiny(sum_denom))
130 sigma(:) = sum_numer(:) / sum_denom(:)
133 den = sim%Physics%DENSITY
134 vel = sim%Physics%YVELOCITY
137 IF (sim%GetRank().EQ.0)
THEN
140tap_check_small(sigma(den),0.01,
"density deviation < 1%")
141tap_check_small(sigma(vel),0.1,
"azimuthal velocity deviation < 10%")
142tap_check(ok,
"stoptime reached")
150 DEALLOCATE(sim,pvar_init,sum_numer,sum_denom,sigma)
159 TYPE(dict_typ),
POINTER :: config
163 TYPE(dict_typ),
POINTER :: mesh, physics, boundary, datafile, &
164 timedisc, fluxes, sources, rotframe
165 REAL :: x1,x2,y1,y2,z1,z2
184 bc(east) = reflecting
187 bc(bottom) = periodic
190 CALL sim%Error(
"vortex3d::MakeConfig",
"geometry currently not supported")
195 "meshtype" / midpoint, &
198 "fargo/method" / fargo, &
199 "decomposition" / (/ -1, 1, -1/), &
213 "western" / bc(west), &
214 "eastern" / bc(east), &
215 "southern" / bc(south), &
216 "northern" / bc(north), &
217 "bottomer" / bc(bottom), &
221 IF (csiso.GT.tiny(csiso))
THEN
222 physics => dict(
"problem" / euler_isotherm, &
235 physics => dict(
"problem" / euler, &
245 "variables" / primitive, &
246 "limiter" / vanleer, &
253 rotframe => dict(
"stype" / rotating_frame, &
256 sources => dict(
"rotframe" / rotframe)
261 "method" / modified_euler, &
265 "dtlimit" / 1.0e-4, &
266 "maxiter" / 1000000, &
271 "fileformat" / vtk, &
272 "filename" / (trim(odir) // trim(ofname)), &
275 config => dict(
"mesh" / mesh, &
276 "physics" / physics, &
277 "boundary" / boundary, &
279 "timedisc" / timedisc, &
280 "datafile" / datafile )
283 IF (
ASSOCIATED(sources)) &
284 CALL setattr(config,
"sources", sources)
292 CLASS(physics_base),
INTENT(IN) :: Physics
293 CLASS(mesh_base),
INTENT(IN) :: Mesh
294 CLASS(timedisc_base),
INTENT(INOUT):: Timedisc
298 REAL,
DIMENSION(Mesh%IGMIN:Mesh%IGMAX,Mesh%JGMIN:Mesh%JGMAX,Mesh%KGMIN:Mesh%KGMAX) &
299 :: radius,dist_axis,domega
300 REAL,
DIMENSION(Mesh%IGMIN:Mesh%IGMAX,Mesh%JGMIN:Mesh%JGMAX,Mesh%KGMIN:Mesh%KGMAX,3) &
304 IF (abs(x0).LE.tiny(x0).AND.abs(y0).LE.tiny(y0).AND.abs(z0).LE.tiny(z0))
THEN
306 radius(:,:,:) = mesh%radius%bcenter(:,:,:)
307 posvec(:,:,:,:) = mesh%posvec%bcenter(:,:,:,:)
314 posvec(:,:,:,3) = 0.0
315 CALL mesh%geometry%Convert2Curvilinear(mesh%bcenter,posvec,posvec)
319 posvec(:,:,:,:) = mesh%posvec%bcenter(:,:,:,:) - posvec(:,:,:,:)
321 radius(:,:,:) = sqrt(posvec(:,:,:,1)**2+posvec(:,:,:,2)**2+posvec(:,:,:,3)**2)
324 dist_axis(:,:,:) = sqrt(posvec(:,:,:,1)**2+posvec(:,:,:,2)**2)
331 ephi(:,:,:,1) = -posvec(:,:,:,2)/radius(:,:,:)
332 ephi(:,:,:,2) = posvec(:,:,:,1)/radius(:,:,:)
337 domega(:,:,:) = 0.5*vstr/pi*exp(0.5*(1.-(dist_axis(:,:,:)/r0)**2))
338 SELECT TYPE(pvar => timedisc%pvar)
339 TYPE IS(statevector_eulerisotherm)
341 pvar%density%data3d(:,:,:) = rhoinf * exp(-0.5*(r0*domega(:,:,:)/csiso)**2)
344 pvar%velocity%data4d(:,:,:,n) = (domega(:,:,:)-mesh%OMEGA)*dist_axis(:,:,:)*ephi(:,:,:,n)
346 SELECT CASE(mesh%fargo%GetType())
348 SELECT CASE(mesh%fargo%GetDirection())
350 timedisc%w(:,:) = pvar%velocity%data4d(mesh%IMIN,:,:,1)
352 timedisc%w(:,:) = pvar%velocity%data4d(:,mesh%JMIN,:,2)
354 timedisc%w(:,:) = pvar%velocity%data4d(:,mesh%KMIN,:,3)
357 TYPE IS(statevector_euler)
358 csinf = sqrt(gamma*pinf/rhoinf)
362 pvar%density%data3d(:,:,:) = rhoinf * (1.0 - &
363 0.5*(gamma-1.0)*(r0*domega/csinf)**2 )**(1./(gamma-1.))
365 pvar%pressure%data1d(:) = pinf * (pvar%density%data1d(:)/rhoinf)**gamma
368 pvar%velocity%data4d(:,:,:,n) = (domega(:,:,:)-mesh%OMEGA)*dist_axis(:,:,:)*ephi(:,:,:,n)
370 SELECT CASE(mesh%fargo%GetType())
372 SELECT CASE(mesh%fargo%GetDirection())
374 timedisc%w(:,:) = pvar%velocity%data4d(mesh%IMIN,:,:,1)
376 timedisc%w(:,:) = pvar%velocity%data4d(:,mesh%JMIN,:,2)
378 timedisc%w(:,:) = pvar%velocity%data4d(:,:,mesh%KMIN,3)
383 CALL physics%Convert2Conservative(timedisc%pvar,timedisc%cvar)
398 CALL mesh%Info(
" DATA-----> initial condition: 3D vortex")
subroutine initdata(Mesh, Physics, Fluxes, Timedisc)
subroutine makeconfig(Sim, config)
elemental real function, public gamma(x)
Compute the Gamma function for arguments != 0,-1,-2,..
elemental real function, public asinh(x)
inverse hyperbolic sine function
pure real function, dimension(size(ephir%data2d, dim=1)) omega(ephir, velocity)