119 qmax, rx, ry, rz, xc, yc, zc, &
120 x, y, z, lcmesh3D, elem, &
121 IntrpPolyOrder_h, IntrpPolyOrder_v, &
122 z_func_type, z_func_params, cosbell_exponent )
128 real(rp),
intent(out) :: q(elem%np,lcmesh3d%nea)
129 real(rp),
intent(in) :: qmax
130 real(rp),
intent(in) :: rx, ry, rz
131 real(rp),
intent(in) :: xc, yc, zc
132 real(rp),
intent(in) :: x(elem%np,lcmesh3d%ne)
133 real(rp),
intent(in) :: y(elem%np,lcmesh3d%ne)
134 real(rp),
intent(in) :: z(elem%np,lcmesh3d%ne)
135 integer,
intent(in) :: intrppolyorder_h
136 integer,
intent(in) :: intrppolyorder_v
137 character(len=*),
optional,
intent(in) :: z_func_type
138 real(rp),
optional,
intent(in) :: z_func_params(:)
139 integer,
intent(in),
optional :: cosbell_exponent
144 real(rp),
allocatable :: x_intrp(:,:), y_intrp(:,:), z_intrp(:,:)
145 real(rp),
allocatable :: r_intrp(:)
146 real(rp),
allocatable :: z_func(:,:)
147 real(rp) :: vx(elem%nv), vy(elem%nv), vz(elem%nv)
149 real(rp),
allocatable :: intrpmat(:,:)
150 real(rp),
allocatable :: q_intrp(:)
155 if (
present(cosbell_exponent) )
then
156 exponent = cosbell_exponent
161 call elem_intrp%Init( intrppolyorder_h, intrppolyorder_v, .false. )
163 allocate( intrpmat(elem%Np,elem_intrp%Np) )
166 allocate( x_intrp(elem_intrp%Np,lcmesh3d%Ne), y_intrp(elem_intrp%Np,lcmesh3d%Ne), z_intrp(elem_intrp%Np,lcmesh3d%Ne) )
167 allocate( z_func(elem_intrp%Np,lcmesh3d%Ne))
168 allocate( r_intrp(elem_intrp%Np) )
169 allocate( q_intrp(elem_intrp%Np) )
176 do ke=lcmesh3d%NeS, lcmesh3d%NeE
178 vx(:) = lcmesh3d%pos_ev(lcmesh3d%EToV(ke,:),1)
179 vy(:) = lcmesh3d%pos_ev(lcmesh3d%EToV(ke,:),2)
180 vz(:) = lcmesh3d%pos_ev(lcmesh3d%EToV(ke,:),3)
181 x_intrp(:,ke) = vx(1) + 0.5_rp * ( elem_intrp%x1(:) + 1.0_rp ) * ( vx(2) - vx(1) )
182 y_intrp(:,ke) = vy(1) + 0.5_rp * ( elem_intrp%x2(:) + 1.0_rp ) * ( vy(4) - vy(1) )
183 z_intrp(:,ke) = vz(1) + 0.5_rp * ( elem_intrp%x3(:) + 1.0_rp ) * ( vz(5) - vz(1) )
185 z_func(:,ke) = 1.0_rp
190 if (
present(z_func_type) )
then
191 select case(z_func_type)
194 do ke=lcmesh3d%NeS, lcmesh3d%NeE
195 z_func(:,ke) = sin( z_func_params(1) * pi * z_intrp(:,ke) / z_func_params(2) )
202 do ke=lcmesh3d%NeS, lcmesh3d%NeE
204 ( (x_intrp(:,ke) - xc) / rx )**2 &
205 + ( (y_intrp(:,ke) - yc) / ry )**2 &
206 + ( (z_intrp(:,ke) - zc) / rz )**2 )
208 where( r_intrp(:) <= 1.0_rp )
209 q_intrp(:) = qmax * ( 0.5_rp * (1.0_rp + cos( pi * r_intrp(:) ) ) )**exponent
213 q(:,ke) = matmul(intrpmat, q_intrp(:) * z_func(:,ke))
218 call elem_intrp%Final()
232 qmax, rh, lonc, latc, rplanet, &
233 x, y, z, lcmesh3D, elem, &
234 IntrpPolyOrder_h, IntrpPolyOrder_v, &
235 z_func_type, z_func_params, cosbell_exponent )
243 real(rp),
intent(out) :: q(elem%np,lcmesh3d%nea)
244 real(rp),
intent(in) :: qmax
245 real(rp),
intent(in) :: rh
246 real(rp),
intent(in) :: lonc, latc
247 real(rp),
intent(in) :: rplanet
248 real(rp),
intent(in) :: x(elem%np,lcmesh3d%ne)
249 real(rp),
intent(in) :: y(elem%np,lcmesh3d%ne)
250 real(rp),
intent(in) :: z(elem%np,lcmesh3d%ne)
251 integer,
intent(in) :: intrppolyorder_h
252 integer,
intent(in) :: intrppolyorder_v
253 character(len=*),
optional,
intent(in) :: z_func_type
254 real(rp),
optional,
intent(in) :: z_func_params(:)
255 integer,
intent(in),
optional :: cosbell_exponent
260 real(rp),
allocatable :: x_intrp(:,:), y_intrp(:,:), z_intrp(:,:)
261 real(rp),
allocatable :: gam_intrp(:,:)
262 real(rp),
allocatable :: lon_intrp(:,:), lat_intrp(:,:)
263 real(rp),
allocatable :: z_func(:,:)
264 real(rp),
allocatable :: r_intrp(:)
265 real(rp) :: vx(elem%nv), vy(elem%nv), vz(elem%nv)
267 real(rp),
allocatable :: intrpmat(:,:)
268 real(rp),
allocatable :: q_intrp(:)
274 if (
present(cosbell_exponent) )
then
275 exponent = cosbell_exponent
280 call elem_intrp%Init( intrppolyorder_h, intrppolyorder_v, .false. )
282 allocate( intrpmat(elem%Np,elem_intrp%Np) )
285 allocate( x_intrp(elem_intrp%Np,lcmesh3d%Ne), y_intrp(elem_intrp%Np,lcmesh3d%Ne), z_intrp(elem_intrp%Np,lcmesh3d%Ne) )
286 allocate( gam_intrp(elem_intrp%Np,lcmesh3d%Ne) )
287 allocate( lon_intrp(elem_intrp%Np,lcmesh3d%Ne), lat_intrp(elem_intrp%Np,lcmesh3d%Ne) )
288 allocate( z_func(elem_intrp%Np,lcmesh3d%Ne) )
289 allocate( r_intrp(elem_intrp%Np) )
290 allocate( q_intrp(elem_intrp%Np) )
294 do ke=lcmesh3d%NeS, lcmesh3d%NeE
295 vx(:) = lcmesh3d%pos_ev(lcmesh3d%EToV(ke,:),1)
296 vy(:) = lcmesh3d%pos_ev(lcmesh3d%EToV(ke,:),2)
297 vz(:) = lcmesh3d%pos_ev(lcmesh3d%EToV(ke,:),3)
298 x_intrp(:,ke) = vx(1) + 0.5_rp * ( elem_intrp%x1(:) + 1.0_rp ) * ( vx(2) - vx(1) )
299 y_intrp(:,ke) = vy(1) + 0.5_rp * ( elem_intrp%x2(:) + 1.0_rp ) * ( vy(4) - vy(1) )
300 z_intrp(:,ke) = vz(1) + 0.5_rp * ( elem_intrp%x3(:) + 1.0_rp ) * ( vz(5) - vz(1) )
301 gam_intrp(:,ke) = 1.0_rp
303 z_func(:,ke) = 1.0_rp
307 elem_intrp%Np * lcmesh3d%Ne, &
308 lon_intrp(:,:), lat_intrp(:,:) )
311 if (
present(z_func_type) )
then
312 select case(z_func_type)
315 do ke=lcmesh3d%NeS, lcmesh3d%NeE
316 z_func(:,ke) = sin( z_func_params(1) * pi * z_intrp(:,ke) / z_func_params(2) )
322 do ke=lcmesh3d%NeS, lcmesh3d%NeE
325 r_intrp(:) = rplanet / rh * acos( sin(latc) * sin(lat_intrp(:,ke)) + cos(latc) * cos(lat_intrp(:,ke)) * cos(lon_intrp(:,ke) - lonc) )
326 where( r_intrp(:) <= 1.0_rp )
327 q_intrp(:) = qmax * ( 0.5_rp * (1.0_rp + cos( pi * r_intrp(:) ) ) )**exponent
333 q(:,ke) = matmul(intrpmat, q_intrp(:) * z_func(:,ke))
336 call elem_intrp%Final()
346 func, IntrpPolyOrder_h, IntrpPolyOrder_v, &
352 real(rp),
intent(out) :: q(elem%np,lcmesh3d%nea)
353 integer,
intent(in) :: intrppolyorder_h
354 integer,
intent(in) :: intrppolyorder_v
357 subroutine func( q_intrp, &
358 x, y, z, elem_intrp )
362 real(rp),
intent(out) :: q_intrp(elem_intrp%np)
363 real(rp),
intent(in) :: x(elem_intrp%np)
364 real(rp),
intent(in) :: y(elem_intrp%np)
365 real(rp),
intent(in) :: z(elem_intrp%np)
370 real(rp),
allocatable :: x_intrp(:,:), y_intrp(:,:), z_intrp(:,:)
371 real(rp) :: vx(elem%nv), vy(elem%nv), vz(elem%nv)
373 real(rp),
allocatable :: intrpmat(:,:)
374 real(rp),
allocatable :: q_intrp(:)
379 call elem_intrp%Init( intrppolyorder_h, intrppolyorder_v, .false. )
381 allocate( intrpmat(elem%Np,elem_intrp%Np) )
384 allocate( x_intrp(elem_intrp%Np,lcmesh3d%Ne), y_intrp(elem_intrp%Np,lcmesh3d%Ne), z_intrp(elem_intrp%Np,lcmesh3d%Ne) )
385 allocate( q_intrp(elem_intrp%Np) )
388 do ke=lcmesh3d%NeS, lcmesh3d%NeE
389 vx(:) = lcmesh3d%pos_ev(lcmesh3d%EToV(ke,:),1)
390 vy(:) = lcmesh3d%pos_ev(lcmesh3d%EToV(ke,:),2)
391 vz(:) = lcmesh3d%pos_ev(lcmesh3d%EToV(ke,:),3)
392 x_intrp(:,ke) = vx(1) + 0.5_rp * ( elem_intrp%x1(:) + 1.0_rp ) * ( vx(2) - vx(1) )
393 y_intrp(:,ke) = vy(1) + 0.5_rp * ( elem_intrp%x2(:) + 1.0_rp ) * ( vy(4) - vy(1) )
394 z_intrp(:,ke) = vz(1) + 0.5_rp * ( elem_intrp%x3(:) + 1.0_rp ) * ( vz(5) - vz(1) )
398 do ke=lcmesh3d%NeS, lcmesh3d%NeE
400 call func( q_intrp, &
401 x_intrp(:,ke), y_intrp(:,ke), z_intrp(:,ke), &
405 q(:,ke) = matmul( intrpmat, q_intrp )
408 call elem_intrp%Final()
417 func, IntrpPolyOrder_h, IntrpPolyOrder_v, &
418 lcmesh3D, elem, rplanet )
426 real(rp),
intent(out) :: q(elem%np,lcmesh3d%nea)
427 integer,
intent(in) :: intrppolyorder_h
428 integer,
intent(in) :: intrppolyorder_v
429 real(rp),
intent(in) :: rplanet
432 subroutine func( q_intrp, &
433 lon, lat, z, elem_intrp, rplanet_ )
437 real(rp),
intent(out) :: q_intrp(elem_intrp%np)
438 real(rp),
intent(in) :: lon(elem_intrp%np)
439 real(rp),
intent(in) :: lat(elem_intrp%np)
440 real(rp),
intent(in) :: z(elem_intrp%np)
441 real(rp),
intent(in) :: rplanet_
446 real(rp),
allocatable :: x_intrp(:,:), y_intrp(:,:), z_intrp(:,:)
447 real(rp),
allocatable :: gam_intrp(:,:)
448 real(rp),
allocatable :: lon_intrp(:,:), lat_intrp(:,:)
449 real(rp) :: vx(elem%nv), vy(elem%nv), vz(elem%nv)
451 real(rp),
allocatable :: intrpmat(:,:)
452 real(rp),
allocatable :: q_intrp(:)
457 call elem_intrp%Init( intrppolyorder_h, intrppolyorder_v, .false. )
459 allocate( intrpmat(elem%Np,elem_intrp%Np) )
462 allocate( x_intrp(elem_intrp%Np,lcmesh3d%Ne), y_intrp(elem_intrp%Np,lcmesh3d%Ne), z_intrp(elem_intrp%Np,lcmesh3d%Ne) )
463 allocate( gam_intrp(elem_intrp%Np,lcmesh3d%Ne) )
464 allocate( lon_intrp(elem_intrp%Np,lcmesh3d%Ne), lat_intrp(elem_intrp%Np,lcmesh3d%Ne) )
465 allocate( q_intrp(elem_intrp%Np) )
468 do ke=lcmesh3d%NeS, lcmesh3d%NeE
469 vx(:) = lcmesh3d%pos_ev(lcmesh3d%EToV(ke,:),1)
470 vy(:) = lcmesh3d%pos_ev(lcmesh3d%EToV(ke,:),2)
471 vz(:) = lcmesh3d%pos_ev(lcmesh3d%EToV(ke,:),3)
472 x_intrp(:,ke) = vx(1) + 0.5_rp * ( elem_intrp%x1(:) + 1.0_rp ) * ( vx(2) - vx(1) )
473 y_intrp(:,ke) = vy(1) + 0.5_rp * ( elem_intrp%x2(:) + 1.0_rp ) * ( vy(4) - vy(1) )
474 z_intrp(:,ke) = vz(1) + 0.5_rp * ( elem_intrp%x3(:) + 1.0_rp ) * ( vz(5) - vz(1) )
476 gam_intrp(:,ke) = 1.0_rp
480 elem_intrp%Np * lcmesh3d%Ne, &
481 lon_intrp(:,:), lat_intrp(:,:) )
484 do ke=lcmesh3d%NeS, lcmesh3d%NeE
486 call func( q_intrp, &
487 lon_intrp(:,ke), lat_intrp(:,ke), z_intrp(:,ke), &
488 elem_intrp, rplanet )
491 q(:,ke) = matmul( intrpmat, q_intrp )
494 call elem_intrp%Final()
subroutine, public mkinitutil_calc_cosinebell(q, qmax, rx, ry, rz, xc, yc, zc, x, y, z, lcmesh3d, elem, intrppolyorder_h, intrppolyorder_v, z_func_type, z_func_params, cosbell_exponent)
Calculate the distribution function of a cosine bell in regional domain.
subroutine, public mkinitutil_calc_cosinebell_global(q, qmax, rh, lonc, latc, rplanet, x, y, z, lcmesh3d, elem, intrppolyorder_h, intrppolyorder_v, z_func_type, z_func_params, cosbell_exponent)
Calculate the distribution function of a cosine bell in global domain.