56 qmax, rx, ry, rz, xc, yc, zc, &
57 x, y, z, lcmesh3D, elem, &
58 IntrpPolyOrder_h, IntrpPolyOrder_v, &
59 z_func_type, z_func_params, cosbell_exponent )
65 real(rp),
intent(out) :: q(elem%np,lcmesh3d%nea)
66 real(rp),
intent(in) :: qmax
67 real(rp),
intent(in) :: rx, ry, rz
68 real(rp),
intent(in) :: xc, yc, zc
69 real(rp),
intent(in) :: x(elem%np,lcmesh3d%ne)
70 real(rp),
intent(in) :: y(elem%np,lcmesh3d%ne)
71 real(rp),
intent(in) :: z(elem%np,lcmesh3d%ne)
72 integer,
intent(in) :: intrppolyorder_h
73 integer,
intent(in) :: intrppolyorder_v
74 character(len=*),
optional,
intent(in) :: z_func_type
75 real(rp),
optional,
intent(in) :: z_func_params(:)
76 integer,
intent(in),
optional :: cosbell_exponent
82 real(rp),
allocatable :: x_intrp(:,:), y_intrp(:,:), z_intrp(:,:)
83 real(rp),
allocatable :: r_intrp(:)
84 real(rp),
allocatable :: z_func(:,:)
85 real(rp) :: vx(elem%nv), vy(elem%nv), vz(elem%nv)
87 real(rp),
allocatable :: l2projmat(:,:)
88 real(rp),
allocatable :: q_intrp(:)
94 if (
present(cosbell_exponent) )
then
95 exponent = cosbell_exponent
100 call elem_intrp%Init( intrppolyorder_h, intrppolyorder_v, .false. )
102 allocate( l2projmat(elem%Np,elem_intrp%Np) )
103 call elem%Generate_L2ProjMat( elem_intrp, &
106 allocate( x_intrp(elem_intrp%Np,lcmesh3d%Ne), y_intrp(elem_intrp%Np,lcmesh3d%Ne), z_intrp(elem_intrp%Np,lcmesh3d%Ne) )
107 allocate( z_func(elem_intrp%Np,lcmesh3d%Ne))
108 allocate( r_intrp(elem_intrp%Np) )
109 allocate( q_intrp(elem_intrp%Np) )
116 do ke=lcmesh3d%NeS, lcmesh3d%NeE
118 vx(:) = lcmesh3d%pos_ev(lcmesh3d%EToV(ke,:),1)
119 vy(:) = lcmesh3d%pos_ev(lcmesh3d%EToV(ke,:),2)
120 vz(:) = lcmesh3d%pos_ev(lcmesh3d%EToV(ke,:),3)
121 x_intrp(:,ke) = vx(1) + 0.5_rp * ( elem_intrp%x1(:) + 1.0_rp ) * ( vx(2) - vx(1) )
122 y_intrp(:,ke) = vy(1) + 0.5_rp * ( elem_intrp%x2(:) + 1.0_rp ) * ( vy(4) - vy(1) )
123 z_intrp(:,ke) = vz(1) + 0.5_rp * ( elem_intrp%x3(:) + 1.0_rp ) * ( vz(5) - vz(1) )
125 z_func(:,ke) = 1.0_rp
130 if (
present(z_func_type) )
then
131 select case(z_func_type)
135 do ke=lcmesh3d%NeS, lcmesh3d%NeE
136 z_func(:,ke) = sin( z_func_params(1) * pi * z_intrp(:,ke) / z_func_params(2) )
144 do ke=lcmesh3d%NeS, lcmesh3d%NeE
146 ( (x_intrp(:,ke) - xc) / rx )**2 &
147 + ( (y_intrp(:,ke) - yc) / ry )**2 &
148 + ( (z_intrp(:,ke) - zc) / rz )**2 )
150 where( r_intrp(:) <= 1.0_rp )
151 q_intrp(:) = qmax * ( 0.5_rp * (1.0_rp + cos( pi * r_intrp(:) ) ) )**exponent
161 do j=1, elem_intrp%Np
162 s = s + l2projmat(i,j) * q_intrp(j) * z_func(j,ke)
172 call elem_intrp%Final()
185 qmax, rh, lonc, latc, rplanet, &
186 x, y, z, lcmesh3D, elem, &
187 IntrpPolyOrder_h, IntrpPolyOrder_v, &
188 z_func_type, z_func_params, cosbell_exponent )
196 real(rp),
intent(out) :: q(elem%np,lcmesh3d%nea)
197 real(rp),
intent(in) :: qmax
198 real(rp),
intent(in) :: rh
199 real(rp),
intent(in) :: lonc, latc
200 real(rp),
intent(in) :: rplanet
201 real(rp),
intent(in) :: x(elem%np,lcmesh3d%ne)
202 real(rp),
intent(in) :: y(elem%np,lcmesh3d%ne)
203 real(rp),
intent(in) :: z(elem%np,lcmesh3d%ne)
204 integer,
intent(in) :: intrppolyorder_h
205 integer,
intent(in) :: intrppolyorder_v
206 character(len=*),
optional,
intent(in) :: z_func_type
207 real(rp),
optional,
intent(in) :: z_func_params(:)
208 integer,
intent(in),
optional :: cosbell_exponent
214 real(rp),
allocatable :: x_intrp(:,:), y_intrp(:,:), z_intrp(:,:)
215 real(rp),
allocatable :: gam_intrp(:,:)
216 real(rp),
allocatable :: lon_intrp(:,:), lat_intrp(:,:)
217 real(rp),
allocatable :: z_func(:,:)
218 real(rp),
allocatable :: r_intrp(:)
219 real(rp) :: vx(elem%nv), vy(elem%nv), vz(elem%nv)
221 real(rp),
allocatable :: l2projmat(:,:)
222 real(rp),
allocatable :: q_intrp(:)
228 if (
present(cosbell_exponent) )
then
229 exponent = cosbell_exponent
234 call elem_intrp%Init( intrppolyorder_h, intrppolyorder_v, .false. )
236 allocate( l2projmat(elem%Np,elem_intrp%Np) )
237 call elem%Generate_L2ProjMat( elem_intrp, &
240 allocate( x_intrp(elem_intrp%Np,lcmesh3d%Ne), y_intrp(elem_intrp%Np,lcmesh3d%Ne), z_intrp(elem_intrp%Np,lcmesh3d%Ne) )
241 allocate( gam_intrp(elem_intrp%Np,lcmesh3d%Ne) )
242 allocate( lon_intrp(elem_intrp%Np,lcmesh3d%Ne), lat_intrp(elem_intrp%Np,lcmesh3d%Ne) )
243 allocate( z_func(elem_intrp%Np,lcmesh3d%Ne) )
244 allocate( r_intrp(elem_intrp%Np) )
245 allocate( q_intrp(elem_intrp%Np) )
253 do ke=lcmesh3d%NeS, lcmesh3d%NeE
254 vx(:) = lcmesh3d%pos_ev(lcmesh3d%EToV(ke,:),1)
255 vy(:) = lcmesh3d%pos_ev(lcmesh3d%EToV(ke,:),2)
256 vz(:) = lcmesh3d%pos_ev(lcmesh3d%EToV(ke,:),3)
257 x_intrp(:,ke) = vx(1) + 0.5_rp * ( elem_intrp%x1(:) + 1.0_rp ) * ( vx(2) - vx(1) )
258 y_intrp(:,ke) = vy(1) + 0.5_rp * ( elem_intrp%x2(:) + 1.0_rp ) * ( vy(4) - vy(1) )
259 z_intrp(:,ke) = vz(1) + 0.5_rp * ( elem_intrp%x3(:) + 1.0_rp ) * ( vz(5) - vz(1) )
260 gam_intrp(:,ke) = 1.0_rp
262 z_func(:,ke) = 1.0_rp
267 elem_intrp%Np * lcmesh3d%Ne, &
268 lon_intrp, lat_intrp )
271 if (
present(z_func_type) )
then
272 select case(z_func_type)
276 do ke=lcmesh3d%NeS, lcmesh3d%NeE
277 z_func(:,ke) = sin( z_func_params(1) * pi * z_intrp(:,ke) / z_func_params(2) )
284 do ke=lcmesh3d%NeS, lcmesh3d%NeE
287 r_intrp(:) = rplanet / rh * acos( sin(latc) * sin(lat_intrp(:,ke)) + cos(latc) * cos(lat_intrp(:,ke)) * cos(lon_intrp(:,ke) - lonc) )
288 where( r_intrp(:) <= 1.0_rp )
289 q_intrp(:) = qmax * ( 0.5_rp * (1.0_rp + cos( pi * r_intrp(:) ) ) )**exponent
299 do j=1, elem_intrp%Np
300 s = s + l2projmat(i,j) * q_intrp(j) * z_func(j,ke)
310 call elem_intrp%Final()
319 func, IntrpPolyOrder_h, IntrpPolyOrder_v, &
325 real(rp),
intent(out) :: q(elem%np,lcmesh3d%nea)
326 integer,
intent(in) :: intrppolyorder_h
327 integer,
intent(in) :: intrppolyorder_v
330 subroutine func( q_intrp, &
331 x, y, z, lcmesh3D, elem_intrp )
337 real(rp),
intent(out) :: q_intrp(elem_intrp%np,lcmesh3d%ne)
338 real(rp),
intent(in) :: x(elem_intrp%np,lcmesh3d%ne)
339 real(rp),
intent(in) :: y(elem_intrp%np,lcmesh3d%ne)
340 real(rp),
intent(in) :: z(elem_intrp%np,lcmesh3d%ne)
345 real(rp),
allocatable :: x_intrp(:,:), y_intrp(:,:), z_intrp(:,:)
346 real(rp) :: vx(elem%nv), vy(elem%nv), vz(elem%nv)
348 real(rp),
allocatable :: l2projmat(:,:)
349 real(rp),
allocatable :: q_intrp(:,:)
356 call elem_intrp%Init( intrppolyorder_h, intrppolyorder_v, .false. )
358 allocate( l2projmat(elem%Np,elem_intrp%Np) )
359 call elem%Generate_L2ProjMat( elem_intrp, &
362 allocate( x_intrp(elem_intrp%Np,lcmesh3d%Ne), y_intrp(elem_intrp%Np,lcmesh3d%Ne), z_intrp(elem_intrp%Np,lcmesh3d%Ne) )
363 allocate( q_intrp(elem_intrp%Np,lcmesh3d%Ne) )
369 do ke=lcmesh3d%NeS, lcmesh3d%NeE
370 vx(:) = lcmesh3d%pos_ev(lcmesh3d%EToV(ke,:),1)
371 vy(:) = lcmesh3d%pos_ev(lcmesh3d%EToV(ke,:),2)
372 vz(:) = lcmesh3d%pos_ev(lcmesh3d%EToV(ke,:),3)
374 do p=1, elem_intrp%Np
375 x_intrp(p,ke) = vx(1) + 0.5_rp * ( elem_intrp%x1(p) + 1.0_rp ) * ( vx(2) - vx(1) )
376 y_intrp(p,ke) = vy(1) + 0.5_rp * ( elem_intrp%x2(p) + 1.0_rp ) * ( vy(4) - vy(1) )
377 z_intrp(p,ke) = vz(1) + 0.5_rp * ( elem_intrp%x3(p) + 1.0_rp ) * ( vz(5) - vz(1) )
381 call func( q_intrp, &
382 x_intrp, y_intrp, z_intrp, &
383 lcmesh3d, elem_intrp )
387 do ke=lcmesh3d%NeS, lcmesh3d%NeE
393 do j=1, elem_intrp%Np
394 s = s + l2projmat(i,j) * q_intrp(j,ke)
402 call elem_intrp%Final()
410 func, IntrpPolyOrder_h, IntrpPolyOrder_v, &
411 lcmesh3D, elem, rplanet )
419 real(rp),
intent(out) :: q(elem%np,lcmesh3d%nea)
420 integer,
intent(in) :: intrppolyorder_h
421 integer,
intent(in) :: intrppolyorder_v
422 real(rp),
intent(in) :: rplanet
425 subroutine func( q_intrp, &
426 lon, lat, z, lcmesh3D, elem_intrp, rplanet )
432 real(rp),
intent(out) :: q_intrp(elem_intrp%np,lcmesh3d%ne)
433 real(rp),
intent(in) :: lon(elem_intrp%np,lcmesh3d%ne)
434 real(rp),
intent(in) :: lat(elem_intrp%np,lcmesh3d%ne)
435 real(rp),
intent(in) :: z(elem_intrp%np,lcmesh3d%ne)
436 real(rp),
intent(in) :: rplanet
441 real(rp),
allocatable :: x_intrp(:,:), y_intrp(:,:), z_intrp(:,:)
442 real(rp),
allocatable :: gam_intrp(:,:)
443 real(rp),
allocatable :: lon_intrp(:,:), lat_intrp(:,:)
444 real(rp) :: vx(elem%nv), vy(elem%nv), vz(elem%nv)
446 real(rp),
allocatable :: l2projmat(:,:)
447 real(rp),
allocatable :: q_intrp(:,:)
455 call elem_intrp%Init( intrppolyorder_h, intrppolyorder_v, .false. )
457 allocate( l2projmat(elem%Np,elem_intrp%Np) )
458 call elem%Generate_L2ProjMat( elem_intrp, &
461 allocate( x_intrp(elem_intrp%Np,lcmesh3d%Ne), y_intrp(elem_intrp%Np,lcmesh3d%Ne), z_intrp(elem_intrp%Np,lcmesh3d%Ne) )
462 allocate( gam_intrp(elem_intrp%Np,lcmesh3d%Ne) )
463 allocate( lon_intrp(elem_intrp%Np,lcmesh3d%Ne), lat_intrp(elem_intrp%Np,lcmesh3d%Ne) )
464 allocate( q_intrp(elem_intrp%Np,lcmesh3d%Ne) )
470 do ke=lcmesh3d%NeS, lcmesh3d%NeE
471 vx(:) = lcmesh3d%pos_ev(lcmesh3d%EToV(ke,:),1)
472 vy(:) = lcmesh3d%pos_ev(lcmesh3d%EToV(ke,:),2)
473 vz(:) = lcmesh3d%pos_ev(lcmesh3d%EToV(ke,:),3)
474 x_intrp(:,ke) = vx(1) + 0.5_rp * ( elem_intrp%x1(:) + 1.0_rp ) * ( vx(2) - vx(1) )
475 y_intrp(:,ke) = vy(1) + 0.5_rp * ( elem_intrp%x2(:) + 1.0_rp ) * ( vy(4) - vy(1) )
476 z_intrp(:,ke) = vz(1) + 0.5_rp * ( elem_intrp%x3(:) + 1.0_rp ) * ( vz(5) - vz(1) )
478 gam_intrp(:,ke) = 1.0_rp
482 elem_intrp%Np * lcmesh3d%Ne, &
483 lon_intrp(:,:), lat_intrp(:,:) )
485 call func( q_intrp, &
486 lon_intrp, lat_intrp, z_intrp, &
487 lcmesh3d, elem_intrp, rplanet )
491 do ke=lcmesh3d%NeS, lcmesh3d%NeE
497 do j=1, elem_intrp%Np
498 s = s + l2projmat(i,j) * q_intrp(j,ke)
506 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.