131
134
135 implicit none
136
137 class(LocalMesh3D), intent(in) :: lmesh
138 class(ElementBase3D), intent(in) :: elem
139 class(LocalMesh2D), intent(in) :: lmesh2D
140 class(ElementBase2D), intent(in) :: elem2D
141 class(ElementOperationBase3D), intent(in) :: element3D_operation
142 type(SparseMat), intent(in) :: Dx, Dy, Dz, Sx, Sy, Sz, Lift
143 real(RP), intent(out) :: DENS_dt(elem%Np,lmesh%NeA)
144 real(RP), intent(out) :: MOMX_dt(elem%Np,lmesh%NeA)
145 real(RP), intent(out) :: MOMY_dt(elem%Np,lmesh%NeA)
146 real(RP), intent(out) :: MOMZ_dt(elem%Np,lmesh%NeA)
147 real(RP), intent(out) :: RHOT_dt(elem%Np,lmesh%NeA)
148 real(RP), intent(in) :: DDENS_(elem%Np,lmesh%NeA)
149 real(RP), intent(in) :: MOMX_(elem%Np,lmesh%NeA)
150 real(RP), intent(in) :: MOMY_(elem%Np,lmesh%NeA)
151 real(RP), intent(in) :: MOMZ_(elem%Np,lmesh%NeA)
152 real(RP), intent(in) :: DRHOT_(elem%Np,lmesh%NeA)
153 real(RP), intent(in) :: DPRES_(elem%Np,lmesh%NeA)
154 real(RP), intent(in) :: DENS_hyd(elem%Np,lmesh%NeA)
155 real(RP), intent(in) :: PRES_hyd(elem%Np,lmesh%NeA)
156 real(RP), intent(in) :: PRES_hyd_ref(elem%Np,lmesh%NeA)
157 real(RP), intent(in) :: THERM_hyd(elem%Np,lmesh%NeA)
158 real(RP), intent(in) :: CORIOLIS(elem2D%Np,lmesh2D%NeA)
159 real(RP), intent(in) :: Rtot(elem%Np,lmesh%NeA)
160 real(RP), intent(in) :: CVtot(elem%Np,lmesh%NeA)
161 real(RP), intent(in) :: CPtot(elem%Np,lmesh%NeA)
162 real(RP), intent(in) :: DPhydDx(elem%Np,lmesh%NeA)
163 real(RP), intent(in) :: DPhydDy(elem%Np,lmesh%NeA)
164
165 real(RP) :: Fx(elem%Np), Fy(elem%Np), Fz(elem%Np), LiftDelFlx(elem%Np)
166 real(RP) :: Fx_sp(elem%Np), Fy_sp(elem%Np), Fz_sp(elem%Np)
167 real(RP) :: DPRES_hyd(elem%Np), GradPhyd_x(elem%Np), GradPhyd_y(elem%Np)
168 real(RP) :: del_flux(elem%NfpTot,lmesh%Ne,PRGVAR_NUM)
169 real(RP) :: del_flux_hyd(elem%NfpTot,lmesh%Ne,2)
170 real(RP) :: GsqrtDens_(elem%Np), rdens_(elem%Np), RHOT_(elem%Np)
171 real(RP) :: u_(elem%Np), v_(elem%Np), w_(elem%Np), wt_(elem%Np), pot_(elem%Np)
172 real(RP) :: drho(elem%Np), Cori(elem%Np)
173 real(RP) :: GsqrtV(elem%Np), RGsqrtV(elem%Np)
174
175 integer :: ke, ke2d
176
177 real(RP) :: gamm, rgamm
178 real(RP) :: rP0
179 real(RP) :: RovP0, P0ovR
180
181
182 call prof_rapstart( 'cal_dyn_tend_bndflux', 3)
183 call get_ebnd_flux( &
184 del_flux, del_flux_hyd, &
185 ddens_, momx_, momy_, momz_, drhot_, dpres_, dens_hyd, pres_hyd, &
186 rtot, cvtot, cptot, &
187 lmesh%Gsqrt, lmesh%GI3(:,:,1), lmesh%GI3(:,:,2), &
188 lmesh%normal_fn(:,:,1), lmesh%normal_fn(:,:,2), lmesh%normal_fn(:,:,3), &
189 lmesh%vmapM, lmesh%vmapP, &
190 lmesh, elem, lmesh2d, elem2d )
191 call prof_rapend( 'cal_dyn_tend_bndflux', 3)
192
193
194 call prof_rapstart( 'cal_dyn_tend_interior', 3)
195 gamm = cpdry / cvdry
196 rgamm = cvdry / cpdry
197 rp0 = 1.0_rp / pres00
198 rovp0 = rdry * rp0
199 p0ovr = pres00 / rdry
200
201
202
203
204
205
206 do ke = lmesh%NeS, lmesh%NeE
207
208 ke2d = lmesh%EMap3Dto2D(ke)
209 cori(:) = coriolis(elem%IndexH2Dto3D(:),ke2d)
210
211 gsqrtv(:) = lmesh%Gsqrt(:,ke) / lmesh%GsqrtH(elem%IndexH2Dto3D,ke2d)
212 rgsqrtv(:) = 1.0_rp / gsqrtv(:)
213
214
215 rhot_(:) = p0ovr * (pres_hyd(:,ke) * rp0)**rgamm + drhot_(:,ke)
216
217
218
219 gsqrtdens_(:) = lmesh%Gsqrt(:,ke) * ( ddens_(:,ke) + dens_hyd(:,ke) )
220 rdens_(:) = 1.0_rp / gsqrtdens_(:)
221 u_(:) = momx_(:,ke) * rdens_(:)
222 v_(:) = momy_(:,ke) * rdens_(:)
223 w_(:) = momz_(:,ke) * rdens_(:)
224 wt_(:) = w_(:) * rgsqrtv(:) + lmesh%GI3(:,ke,1) * u_(:) + lmesh%GI3(:,ke,2) * v_(:)
225 pot_(:) = rhot_(:) * rdens_(:)
226
227 ke2d = lmesh%EMap3Dto2D(ke)
228 cori(:) = coriolis(elem%IndexH2Dto3D(:),ke2d)
229
230 drho(:) = matmul(intrpmat_vpordm1, ddens_(:,ke))
231
232
233
234 dpres_hyd(:) = pres_hyd(:,ke) - pres_hyd_ref(:,ke)
235
236 call sparsemat_matmul(dx, gsqrtv(:) * dpres_hyd(:), fx)
237 call sparsemat_matmul(dz, gsqrtv(:) * lmesh%GI3(:,ke,1) * dpres_hyd(:), fz)
238 call sparsemat_matmul(lift, lmesh%Fscale(:,ke) * del_flux_hyd(:,ke,1), liftdelflx)
239 gradphyd_x(:) = lmesh%Escale(:,ke,1,1) * fx(:) &
240 + lmesh%Escale(:,ke,3,3) * fz(:) &
241 + liftdelflx(:)
242
243 call sparsemat_matmul(dy, gsqrtv(:) * dpres_hyd(:), fy)
244 call sparsemat_matmul(dz, gsqrtv(:) * lmesh%GI3(:,ke,2) * dpres_hyd(:), fz)
245 call sparsemat_matmul(lift, lmesh%Fscale(:,ke) * del_flux_hyd(:,ke,2), liftdelflx)
246 gradphyd_y(:) = lmesh%Escale(:,ke,2,2) * fy(:) &
247 + lmesh%Escale(:,ke,3,3) * fz(:) &
248 + liftdelflx(:)
249
250
251 call dx_ab( dxt1d_, gsqrtdens_(:), u_, elem%Nnode_h1D, elem%Nnode_v, fx_sp )
252 call dy_ab( dyt1d_, gsqrtdens_(:), v_, elem%Nnode_h1D, elem%Nnode_v, fy_sp )
253 call dz_ab( dzt1d_, gsqrtdens_(:), wt_(:), elem%Nnode_h1D, elem%Nnode_v, fz_sp )
254 call sparsemat_matmul(lift, lmesh%Fscale(:,ke) * del_flux(:,ke,dens_vid), liftdelflx)
255
256 dens_dt(:,ke) = - ( &
257 lmesh%Escale(:,ke,1,1) * fx_sp(:) &
258 + lmesh%Escale(:,ke,2,2) * fy_sp(:) &
259 + lmesh%Escale(:,ke,3,3) * fz_sp(:) &
260 + liftdelflx(:) )
261
262
263 call dx_abc( dxt1d_, gsqrtdens_, u_, u_, elem%Nnode_h1D, elem%Nnode_v, fx_sp )
264 call dy_abc( dyt1d_, gsqrtdens_, u_, v_, elem%Nnode_h1D, elem%Nnode_v, fy_sp )
265 call dz_abc( dzt1d_, gsqrtdens_, u_, wt_, elem%Nnode_h1D, elem%Nnode_v, fz_sp )
266 call sparsemat_matmul(dx, lmesh%Gsqrt(:,ke) * dpres_(:,ke) , fx)
267 call sparsemat_matmul(lift, lmesh%Fscale(:,ke) * del_flux(:,ke,momx_vid), liftdelflx)
268
269 momx_dt(:,ke) = &
270 - ( lmesh%Escale(:,ke,1,1) * ( fx_sp(:) + fx(:) ) &
271 + lmesh%Escale(:,ke,2,2) * fy_sp(:) &
272 + lmesh%Escale(:,ke,3,3) * fz_sp(:) &
273 + liftdelflx(:) ) / lmesh%Gsqrt(:,ke) &
274 - gradphyd_x(:) * rgsqrtv(:) &
275 + cori(:) * momy_(:,ke)
276
277
278 call dx_abc( dxt1d_, gsqrtdens_, v_, u_, elem%Nnode_h1D, elem%Nnode_v, fx_sp )
279 call dy_abc( dyt1d_, gsqrtdens_, v_, v_, elem%Nnode_h1D, elem%Nnode_v, fy_sp )
280 call dz_abc( dzt1d_, gsqrtdens_, v_, wt_, elem%Nnode_h1D, elem%Nnode_v, fz_sp )
281 call sparsemat_matmul(dy, lmesh%Gsqrt(:,ke) * dpres_(:,ke) , fy)
282 call sparsemat_matmul(lift, lmesh%Fscale(:,ke) * del_flux(:,ke,momy_vid), liftdelflx)
283
284 momy_dt(:,ke) = &
285 - ( lmesh%Escale(:,ke,1,1) * fx_sp(:) &
286 + lmesh%Escale(:,ke,2,2) * ( fy_sp(:) + fy(:) ) &
287 + lmesh%Escale(:,ke,3,3) * fz_sp(:) &
288 + liftdelflx(:) ) / lmesh%Gsqrt(:,ke) &
289 - gradphyd_y(:) * rgsqrtv(:) &
290 - cori(:) * momx_(:,ke)
291
292
293 call dx_abc( dxt1d_, gsqrtdens_, w_, u_, elem%Nnode_h1D, elem%Nnode_v, fx_sp )
294 call dy_abc( dyt1d_, gsqrtdens_, w_, v_, elem%Nnode_h1D, elem%Nnode_v, fy_sp )
295 call dz_abc( dzt1d_, gsqrtdens_, w_, wt_, elem%Nnode_h1D, elem%Nnode_v, fz_sp )
296 call sparsemat_matmul(dz, lmesh%Gsqrt(:,ke) * rgsqrtv(:) * dpres_(:,ke) , fz)
297 call sparsemat_matmul(lift, lmesh%Fscale(:,ke) * del_flux(:,ke,momz_vid), liftdelflx)
298
299 momz_dt(:,ke) = - ( &
300 lmesh%Escale(:,ke,1,1) * fx_sp(:) &
301 + lmesh%Escale(:,ke,2,2) * fy_sp(:) &
302 + lmesh%Escale(:,ke,3,3) * ( fz_sp(:) + fz(:) ) &
303 + liftdelflx(:) ) &
304 - grav * drho(:)
305
306
307 call dx_abc( dxt1d_, gsqrtdens_, pot_, u_, elem%Nnode_h1D, elem%Nnode_v, fx_sp )
308 call dy_abc( dyt1d_, gsqrtdens_, pot_, v_, elem%Nnode_h1D, elem%Nnode_v, fy_sp )
309 call dz_abc( dzt1d_, gsqrtdens_, pot_, wt_(:), elem%Nnode_h1D, elem%Nnode_v, fz_sp )
310 call sparsemat_matmul(lift, lmesh%Fscale(:,ke) * del_flux(:,ke,rhot_vid), liftdelflx)
311
312 rhot_dt(:,ke) = - ( &
313 lmesh%Escale(:,ke,1,1) * fx_sp(:) &
314 + lmesh%Escale(:,ke,2,2) * fy_sp(:) &
315 + lmesh%Escale(:,ke,3,3) * fz_sp(:) &
316 + liftdelflx(:) )
317 end do
318 call prof_rapend( 'cal_dyn_tend_interior', 3)
319
320 return
module FElib / Fluid dyn solver / Atmosphere / Nonhydrostatic model / HEVE / Numflux
subroutine, public atm_dyn_dgm_nonhydro3d_rhot_heve_numflux_get_generalvc_asis(del_flux, del_flux_hyd, ddens_, momx_, momy_, momz_, drhot_, dpres_, dens_hyd, pres_hyd, rtot, cvtot, cptot, gsqrt, g13, g23, nx, ny, nz, vmapm, vmapp, lmesh, elem, lmesh2d, elem2d)