FE-Project
Loading...
Searching...
No Matches
scale_atm_dyn_dgm_driver_nonhydro3d.F90
Go to the documentation of this file.
1!-------------------------------------------------------------------------------
2!> module FElib / Fluid dyn solver / Atmosphere / driver (3D nonhydrostatic model)
3!!
4!! @par Description
5!! Driver module for 3D nonhydrostatic dynamical core based on DGM
6!!
7!! @author Yuta Kawai, Team SCALE
8!<
9!-------------------------------------------------------------------------------
10#include "scaleFElib.h"
12 !-----------------------------------------------------------------------------
13 !
14 !++ Used modules
15 !
16 use scale_precision
17 use scale_io
18 use scale_prc
19 use scale_prof
20 use scale_const, only: &
21 grav => const_grav, &
22 rdry => const_rdry, &
23 cpdry => const_cpdry, &
24 cvdry => const_cvdry, &
25 pres00 => const_pre00
26
28 use scale_sparsemat, only: sparsemat
29
34 use scale_element_base, only: &
38 use scale_meshfield_base, only: &
40
41 use scale_element_modalfilter, only: &
43
45 use scale_model_var_manager, only: &
46 modelvarmanager, variableinfo
47
50
52 prgvar_num, &
53 dens_vid => prgvar_ddens_id, therm_vid => prgvar_therm_id,&
54 momx_vid => prgvar_momx_id, momy_vid => prgvar_momy_id, &
55 momz_vid => prgvar_momz_id, &
56 auxvar_num, &
57 preshyd_vid => auxvar_preshydro_id, denshyd_vid => auxvar_denshydro_id, &
58 thermhyd_vid => auxvar_thermhydro_id, &
59 preshyd_ref_vid => auxvar_preshydro_ref_id, &
60 cptot_vid => auxvar_cptot_id, cvtot_vid => auxvar_cvtot_id, rtot_vid => auxvar_rtot_id, &
61 pres_vid => auxvar_pres_id, &
65
66 !- REGIONAL / RHOT / HEVE
80
81 !- REGIONAL / ETOT / HEVE
86
87 !- REGIONAL / RHOT / HEVI
95
96 !- REGIONAL / ETOT / HEVI
102
103 !- REGIONAL / RHOT / HEVE SPLITFORM
108
109 !- REGIONAL / RHOT / HEVI SPLITFORM
115
116 !- GLOBAL / RHOT / HEVE
128
129 !- GLOBAL / ETOT / HEVE
134
135 !- GLOBAL / RHOT / HEVI
143
144 !- GLOBAL / ETOT / HEVI
150
151 !- NONE
152 use scale_atm_dyn_dgm_none, only: &
156
157 !---------
160
161 !-----------------------------------------------------------------------------
162 implicit none
163 private
164 !-----------------------------------------------------------------------------
165 !
166 !++ Public type & procedure
167 !
168
169 abstract interface
170 subroutine atm_dyn_nonhydro3d_cal_tend_ex( &
171 DENS_dt, MOMX_dt, MOMY_dt, MOMZ_dt, RHOT_dt, & ! (out)
172 ddens_, momx_, momy_, momz_, therm_, dpres_, & ! (in)
173 dens_hyd, pres_hyd, pres_hyd_ref, therm_hyd, coriolis, & ! (in)
174 rtot, cvtot, cptot, & ! (in)
175 dphyddx, dphyddy, & ! (in)
176 element3d_operation, dx, dy, dz, sx, sy, sz, lift, & ! (in)
177 lmesh, elem, lmesh2d, elem2d ) ! (in)
178
179 import rp
180 import localmesh3d
181 import elementbase3d
182 import localmesh2d
183 import elementbase2d
185 import sparsemat
186 implicit none
187
188 class(LocalMesh3D), intent(in) :: lmesh
189 class(ElementBase3D), intent(in) :: elem
190 class(LocalMesh2D), intent(in) :: lmesh2D
191 class(ElementBase2D), intent(in) :: elem2D
192 class(ElementOperationBase3D), intent(in) :: element3D_operation
193 type(SparseMat), intent(in) :: Dx, Dy, Dz, Sx, Sy, Sz, Lift
194 real(RP), intent(out) :: DENS_dt(elem%Np,lmesh%NeA)
195 real(RP), intent(out) :: MOMX_dt(elem%Np,lmesh%NeA)
196 real(RP), intent(out) :: MOMY_dt(elem%Np,lmesh%NeA)
197 real(RP), intent(out) :: MOMZ_dt(elem%Np,lmesh%NeA)
198 real(RP), intent(out) :: RHOT_dt(elem%Np,lmesh%NeA)
199 real(RP), intent(in) :: DDENS_(elem%Np,lmesh%NeA)
200 real(RP), intent(in) :: MOMX_(elem%Np,lmesh%NeA)
201 real(RP), intent(in) :: MOMY_(elem%Np,lmesh%NeA)
202 real(RP), intent(in) :: MOMZ_(elem%Np,lmesh%NeA)
203 real(RP), intent(in) :: THERM_(elem%Np,lmesh%NeA)
204 real(RP), intent(in) :: DPRES_(elem%Np,lmesh%NeA)
205 real(RP), intent(in) :: DENS_hyd(elem%Np,lmesh%NeA)
206 real(RP), intent(in) :: PRES_hyd(elem%Np,lmesh%NeA)
207 real(RP), intent(in) :: PRES_hyd_ref(elem%Np,lmesh%NeA)
208 real(RP), intent(in) :: THERM_hyd(elem%Np,lmesh%NeA)
209 real(RP), intent(in) :: CORIOLIS(elem2D%Np,lmesh2D%NeA)
210 real(RP), intent(in) :: Rtot(elem%Np,lmesh%NeA)
211 real(RP), intent(in) :: CVtot(elem%Np,lmesh%NeA)
212 real(RP), intent(in) :: CPtot(elem%Np,lmesh%NeA)
213 real(RP), intent(in) :: DPhydDx(elem%Np,lmesh%NeA)
214 real(RP), intent(in) :: DPhydDy(elem%Np,lmesh%NeA)
215 end subroutine atm_dyn_nonhydro3d_cal_tend_ex
216 end interface
217
218 abstract interface
219 subroutine atm_dyn_nonhydro3d_cal_vi( &
220 DENS_dt, MOMX_dt, MOMY_dt, MOMZ_dt, RHOT_dt, & ! (out)
221 ddens_, momx_, momy_, momz_, therm_, dens_hyd, pres_hyd, & ! (in)
222 ddens0_, momx0_, momy0_, momz0_, therm0_, & ! (in)
223 rtot, cvtot, cptot, & ! (in)
224 element3d_operation, dz, lift, & ! (in)
225 impl_fac, dt, & ! (in)
226 lmesh, elem, lmesh2d, elem2d )
227
228 import rp
229 import localmesh3d
230 import elementbase3d
231 import localmesh2d
232 import elementbase2d
233 import modalfilter
235 import sparsemat
236 implicit none
237
238 class(LocalMesh3D), intent(in) :: lmesh
239 class(ElementBase3D), intent(in) :: elem
240 class(LocalMesh2D), intent(in) :: lmesh2D
241 class(ElementBase2D), intent(in) :: elem2D
242 real(RP), intent(out) :: DENS_dt(elem%Np,lmesh%NeA)
243 real(RP), intent(out) :: MOMX_dt(elem%Np,lmesh%NeA)
244 real(RP), intent(out) :: MOMY_dt(elem%Np,lmesh%NeA)
245 real(RP), intent(out) :: MOMZ_dt(elem%Np,lmesh%NeA)
246 real(RP), intent(out) :: RHOT_dt(elem%Np,lmesh%NeA)
247 real(RP), intent(in) :: DDENS_(elem%Np,lmesh%NeA)
248 real(RP), intent(in) :: MOMX_(elem%Np,lmesh%NeA)
249 real(RP), intent(in) :: MOMY_(elem%Np,lmesh%NeA)
250 real(RP), intent(in) :: MOMZ_(elem%Np,lmesh%NeA)
251 real(RP), intent(in) :: THERM_(elem%Np,lmesh%NeA)
252 real(RP), intent(in) :: DENS_hyd(elem%Np,lmesh%NeA)
253 real(RP), intent(in) :: PRES_hyd(elem%Np,lmesh%NeA)
254 real(RP), intent(in) :: DDENS0_(elem%Np,lmesh%NeA)
255 real(RP), intent(in) :: MOMX0_(elem%Np,lmesh%NeA)
256 real(RP), intent(in) :: MOMY0_(elem%Np,lmesh%NeA)
257 real(RP), intent(in) :: MOMZ0_(elem%Np,lmesh%NeA)
258 real(RP), intent(in) :: THERM0_(elem%Np,lmesh%NeA)
259 real(RP), intent(in) :: Rtot(elem%Np,lmesh%NeA)
260 real(RP), intent(in) :: CVtot(elem%Np,lmesh%NeA)
261 real(RP), intent(in) :: CPtot(elem%Np,lmesh%NeA)
262 class(ElementOperationBase3D), intent(in) :: element3D_operation
263 class(SparseMat), intent(in) :: Dz, Lift
264 real(RP), intent(in) :: impl_fac
265 real(RP), intent(in) :: dt
266 end subroutine atm_dyn_nonhydro3d_cal_vi
267 end interface
268
269 abstract interface
270 subroutine atm_dyn_nonhydro3d_final()
271 end subroutine atm_dyn_nonhydro3d_final
272 end interface
273
274 !> Derived type to provide a driver of dynamical core with the atmospheric nonhydrostatic equations
276 integer :: eqs_typeid !< Type ID of equation system
277 logical :: entot_conserve_scheme_flag !< Flag whether total energy is a prognostic variable
278
279 ! element-wise modal filter
280 logical :: modalfilter_flag !< Flag wheter modal filtering is applied
281 type(modalfilter) :: modal_filter_3d
282 type(modalfilter) :: modal_filter_v1d
283
284 type(modalfilter) :: modal_filterh1d
285 type(modalfilter) :: modal_filterv1d
286
287 ! sponge layer
288 type(atmdynspongelayer) :: sponge_layer
289 logical :: spongelayer_flag !< Flag wheter sponge layer is applied
290
291 ! diagnostic variables
292 type(meshfield3d), allocatable :: aux_dynvars3d(:)
293 type(modelvarmanager) :: auxdynvar3d_manager
294 integer :: auxdynvar3d_commid
295
296 ! boundary condition
297 type(atmdynbnd) :: boundary_cond
298
299 ! HEVI soler
300 logical :: hevi_flag !< Flag wheter HEVI is applied
301 logical :: hevi_use_lapack_flag !< Flag wheter lapack is used in HEVI solver
302
303 ! data communication with MPI
304 logical :: hide_mpi_comm_flag !< Flag wheter hiding MPI communication is performed
305
306 procedure(atm_dyn_nonhydro3d_cal_vi), pointer, nopass :: cal_vi => null()
307 procedure(atm_dyn_nonhydro3d_cal_tend_ex), pointer, nopass :: cal_tend_ex => null()
308 procedure(atm_dyn_nonhydro3d_final), pointer, nopass :: dynsolver_final => null()
309 contains
310 procedure :: init => atmdyndgmdriver_nonhydro3d_init
311 procedure :: final => atmdyndgmdriver_nonhydro3d_final
312 procedure :: update => atmdyndgmdriver_nonhydro3d_update
313 procedure :: is_thermvar_rhot => atmdyndgmdriver_nonhydro3d_is_thermvar_rhot
314 procedure :: calc_pressure => atmdyndgmdriver_nonhydro3d_calc_pressure
315 procedure :: update_therm_hyd => atmdyndgmdriver_nonhydro3d_update_thermhyd
316 procedure :: update_phyd_hgrad => atmdyndgmdriver_nonhydro3d_update_phyd_hgrad
318
319 !-----------------------------------------------------------------------------
320 !
321 !++ Public procedures
322 !
323 !-----------------------------------------------------------------------------
324 !
325 !++ Public parameters & variables
326 !
327 integer, public, parameter :: eqs_typeid_none = 0
328 integer, public, parameter :: eqs_typeid_nonhyd3d_heve = 1
329 integer, public, parameter :: eqs_typeid_nonhyd3d_heve_entot = 2
330 integer, public, parameter :: eqs_typeid_globalnonhyd3d_heve = 3
331 integer, public, parameter :: eqs_typeid_globalnonhyd3d_heve_entot = 4
332 integer, public, parameter :: eqs_typeid_nonhyd3d_splitform_heve = 5
333 integer, public, parameter :: eqs_typeid_nonhyd3d_hevi = 6
334 integer, public, parameter :: eqs_typeid_nonhyd3d_hevi_entot = 7
335 integer, public, parameter :: eqs_typeid_globalnonhyd3d_hevi = 8
336 integer, public, parameter :: eqs_typeid_globalnonhyd3d_hevi_entot = 9
337 integer, public, parameter :: eqs_typeid_nonhyd3d_splitform_hevi = 10
338
339 !-
340 integer, public, parameter :: auxdynvars3d_dpres_id = 1
341 integer, public, parameter :: auxdynvars3d_dphyddx_id = 2
342 integer, public, parameter :: auxdynvars3d_dphyddy_id = 3
343 integer, public, parameter :: auxdynvars3d_num = 3
344
345 type(variableinfo), public :: atmos_dyn_auxdynvars3d_vinfo(auxdynvars3d_num)
347 variableinfo( auxdynvars3d_dpres_id, 'DPRES', '', &
348 '1', 3, 'XYZ', '' ), &
349 variableinfo( auxdynvars3d_dphyddx_id, 'DPhydDx', '', &
350 '1', 3, 'XYZ', '' ), &
351 variableinfo( auxdynvars3d_dphyddy_id, 'DPhydDy', '', &
352 '1', 3, 'XYZ', '' ) /
353
354 !-----------------------------------------------------------------------------
355 !
356 !++ Private procedures & variables
357 !
358 !-------------------
359
360 private :: add_phy_tend
361 private :: add_phy_tend_new
362 private :: setup_modalfilter
363
364contains
365!> Initialize a object to provide a driver of atmospheric dynamical core
366!!
367!! @param eqs_type_name Name of governing equation
368!! @param tint_type_name Name of temporal scheme
369!! @param sponge_layer_flag Flag whether sponge layer is applied
370!! @param modal_filter_flag Flag whether modal filtering is applied
371!! @param hide_mpi_comm_flag Flag whether hiding MPI communication is performed
372!! @param model_mesh3D Object managing 3D model mesh
373!OCL SERIAL
374 subroutine atmdyndgmdriver_nonhydro3d_init( this, &
375 eqs_type_name, tint_type_name, dtsec, &
376 sponge_layer_flag, modal_filter_flag, &
377 hide_mpi_comm_flag, &
378 model_mesh3D )
379
381 implicit none
382
383 class(atmdyndgmdriver_nonhydro3d), intent(inout) :: this
384 character(len=*), intent(in) :: eqs_type_name
385 character(len=*), intent(in) :: tint_type_name
386 real(dp), intent(in) :: dtsec
387 logical, intent(in) :: sponge_layer_flag
388 logical, intent(in) :: modal_filter_flag
389 logical, intent(in) :: hide_mpi_comm_flag
390 class(modelmesh3d), intent(inout), target :: model_mesh3d
391
392 class(meshbase3d), pointer :: mesh3d
393 class(localmesh3d), pointer :: lcmesh
394 integer :: domid
395 class(hexahedralelement), pointer :: refelem3d
396 class(elementbase), pointer :: refelem
397 class(meshcubedspheredom3d), pointer :: gm_mesh3d
398
399 integer :: iv
400 !-----------------------------------------------------------------------------
401
402 mesh3d => model_mesh3d%ptr_mesh
403 select type( mesh3d )
404 class is (meshcubedspheredom3d)
405 gm_mesh3d => mesh3d
406 end select
407
408 call atmdyndgmdriver_base3d_init( this, &
409 prgvar_num, &
410 tint_type_name, dtsec, &
411 mesh3d )
412
413 this%ENTOT_CONSERVE_SCHEME_FLAG = .false.
414 this%hevi_flag = .false.
415 this%hide_mpi_comm_flag = hide_mpi_comm_flag
416
417 select case(eqs_type_name)
418 !-- NONE ------------------
419 case("NONE")
420 this%EQS_TYPEID = eqs_typeid_none
421 call atm_dyn_dgm_none_init( mesh3d )
422 this%cal_tend_ex => atm_dyn_dgm_none_cal_tend
423 this%cal_vi => null()
424 this%dynsolver_final => atm_dyn_dgm_none_final
425 !-- HEVE ------------------
426 case("NONHYDRO3D_HEVE_ASIS", "NONHYDRO3D_RHOT_HEVE_ASIS")
427 this%EQS_TYPEID = eqs_typeid_nonhyd3d_heve
430 this%cal_vi => null()
431 this%dynsolver_final => atm_dyn_dgm_nonhydro3d_rhot_heve_final
432 case("NONHYDRO3D_HEVE", "NONHYDRO3D_RHOT_HEVE")
433 this%EQS_TYPEID = eqs_typeid_nonhyd3d_heve
436 this%cal_vi => null()
437 this%dynsolver_final => atm_dyn_dgm_nonhydro3d_rhot_heve_final
438 case("NONHYDRO3D_HEVE_GPU")
439 this%EQS_TYPEID = eqs_typeid_nonhyd3d_heve
442 this%cal_vi => null()
443 this%dynsolver_final => atm_dyn_dgm_nonhydro3d_rhot_heve_gpu_final
444 case("NONHYDRO3D_HEVE_GPU2")
445 this%EQS_TYPEID = eqs_typeid_nonhyd3d_heve
448 this%cal_vi => null()
449 this%dynsolver_final => atm_dyn_dgm_nonhydro3d_rhot_heve_gpu_final
450 case("NONHYDRO3D_HEVE_CCO")
451 this%EQS_TYPEID = eqs_typeid_nonhyd3d_heve
454 this%cal_vi => null()
455 this%dynsolver_final => atm_dyn_dgm_nonhydro3d_rhot_heve_final
456 case("NONHYDRO3D_ETOT_HEVE")
457 this%EQS_TYPEID = eqs_typeid_nonhyd3d_heve_entot
460 this%cal_vi => null()
461 this%dynsolver_final => atm_dyn_dgm_nonhydro3d_etot_heve_final
462 this%ENTOT_CONSERVE_SCHEME_FLAG = .true.
463 case("GLOBALNONHYDRO3D_HEVE_ASIS", "GLOBALNONHYDRO3D_RHOT_HEVE_ASIS")
464 this%EQS_TYPEID = eqs_typeid_globalnonhyd3d_heve
466 if ( gm_mesh3d%shallow_approx ) then
468 else
470 end if
471 this%cal_vi => null()
473 case("GLOBALNONHYDRO3D_HEVE", "GLOBALNONHYDRO3D_RHOT_HEVE")
474 this%EQS_TYPEID = eqs_typeid_globalnonhyd3d_heve
476 if ( gm_mesh3d%shallow_approx ) then
478 else
480 end if
481 this%cal_vi => null()
483 case("GLOBALNONHYDRO3D_HEVE_GPU", "GLOBALNONHYDRO3D_RHOT_HEVE_GPU")
484 this%EQS_TYPEID = eqs_typeid_globalnonhyd3d_heve
486 if ( gm_mesh3d%shallow_approx ) then
488 else
490 end if
491 this%cal_vi => null()
493 case("GLOBALNONHYDRO3D_ETOT_HEVE")
496 if ( .not. gm_mesh3d%shallow_approx ) then
497 log_error("AtmDynDGMDriver_nonhydro3d_Init",*) 'EQS Type:', eqs_type_name, 'Deep atmosphere is not supported. Check!'
498 call prc_abort
499 end if
501 this%cal_vi => null()
503 this%ENTOT_CONSERVE_SCHEME_FLAG = .true.
504 case("NONHYDRO3D_HEVE_SPLITFORM", "NONHYDRO3D_RHOT_HEVE_SPLITFORM")
505 this%EQS_TYPEID = eqs_typeid_nonhyd3d_splitform_heve
508 this%cal_vi => null()
510 !-- HEVI ------------------
511 case("NONHYDRO3D_HEVI_ASIS", "NONHYDRO3D_RHOT_HEVI_ASIS")
512 this%EQS_TYPEID = eqs_typeid_nonhyd3d_hevi
516 this%dynsolver_final => atm_dyn_dgm_nonhydro3d_rhot_hevi_final
517 this%hevi_flag = .true.
518 case("NONHYDRO3D_HEVI", "NONHYDRO3D_RHOT_HEVI")
519 this%EQS_TYPEID = eqs_typeid_nonhyd3d_hevi
523 this%dynsolver_final => atm_dyn_dgm_nonhydro3d_rhot_hevi_final
524 this%hevi_flag = .true.
525 case("NONHYDRO3D_ETOT_HEVI")
526 this%EQS_TYPEID = eqs_typeid_nonhyd3d_hevi_entot
530 this%dynsolver_final => atm_dyn_dgm_nonhydro3d_etot_hevi_final
531 this%ENTOT_CONSERVE_SCHEME_FLAG = .true.
532 this%hevi_flag = .true.
533 case("GLOBALNONHYDRO3D_HEVI_ASIS", "GLOBALNONHYDRO3D_RHOT_HEVI_ASIS")
534 this%EQS_TYPEID = eqs_typeid_globalnonhyd3d_hevi
536 if ( .not. gm_mesh3d%shallow_approx ) then
537 log_error("AtmDynDGMDriver_nonhydro3d_Init",*) 'EQS Type:', eqs_type_name, 'Deep atmosphere is not supported. Check!'
538 call prc_abort
539 end if
543 this%hevi_flag = .true.
544 case("GLOBALNONHYDRO3D_HEVI", "GLOBALNONHYDRO3D_RHOT_HEVI")
545 this%EQS_TYPEID = eqs_typeid_globalnonhyd3d_hevi
547 if ( .not. gm_mesh3d%shallow_approx ) then
548 log_error("AtmDynDGMDriver_nonhydro3d_Init",*) 'EQS Type:', eqs_type_name, 'Deep atmosphere is not supported. Check!'
549 call prc_abort
550 end if
554 this%hevi_flag = .true.
555 case("GLOBALNONHYDRO3D_ETOT_HEVI")
558 if ( .not. gm_mesh3d%shallow_approx ) then
559 log_error("AtmDynDGMDriver_nonhydro3d_Init",*) 'EQS Type:', eqs_type_name, 'Deep atmosphere is not supported. Check!'
560 call prc_abort
561 end if
565 this%ENTOT_CONSERVE_SCHEME_FLAG = .true.
566 this%hevi_flag = .true.
567 case("NONHYDRO3D_HEVI_SPLITFORM", "NONHYDRO3D_RHOT_HEVI_SPLITFORM")
568 this%EQS_TYPEID = eqs_typeid_nonhyd3d_splitform_hevi
573 this%hevi_flag = .true.
574 case default
575 log_error("AtmDynDGMDriver_nonhydro3d_Init",*) 'Invalid EQS_TYPE in namelist PARAM_ATMOS_DYN. Check!'
576 call prc_abort
577 end select
578
579 !- Initialize variables
580
581 call this%AUXDYNVAR3D_manager%Init()
582 allocate( this%AUX_DYNVARS3D(auxdynvars3d_num) )
583
584 do iv = 1, auxdynvars3d_num
585 call this%AUXDYNVAR3D_manager%Regist( &
586 atmos_dyn_auxdynvars3d_vinfo(iv), mesh3d, &
587 this%AUX_DYNVARS3D(iv), &
588 .false., fill_zero=.true. )
589 end do
590
591 !- Setup halo data communication for DPRES
592 call model_mesh3d%Create_communicator( &
593 1, 0, 0, & ! (in)
594 this%AUXDYNVAR3D_manager, & ! (in)
595 this%AUX_DYNVARS3D, & ! (in)
596 this%AUXDYNVAR3D_commid, & ! (out)
597 field_list_is=1, field_list_ie=1 ) ! (in)
598
599
600 !- initialize an object to manage boundary conditions
601 call this%boundary_cond%Init()
602 call this%boundary_cond%SetBCInfo( mesh3d )
603
604 !- initialize an object to manage sponge layer
605 this%SPONGELAYER_FLAG = sponge_layer_flag
606 if (this%SPONGELAYER_FLAG) then
607 call this%sponge_layer%Init( mesh3d, dtsec )
608 end if
609
610 !- initialize an object to manage modal filter
611 this%MODALFILTER_FLAG = modal_filter_flag
612 if (this%MODALFILTER_FLAG) then
613 refelem => mesh3d%refElem
614 select type(refelem)
615 class is (hexahedralelement)
616 refelem3d => refelem
617 end select
618
619 call setup_modalfilter( this, refelem3d, model_mesh3d%element3D_operation )
620 end if
621
622 return
623 end subroutine atmdyndgmdriver_nonhydro3d_init
624
625 !> Get a flag whether density-weighted potential temperature is used for a prognostic thermodynamic variable
626!OCL SERIAL
627 function atmdyndgmdriver_nonhydro3d_is_thermvar_rhot( this ) result(ret)
628 implicit none
629
630 class(atmdyndgmdriver_nonhydro3d), intent(inout) :: this
631 logical :: ret
632 !-----------------------------------------------------------------------------
633
634 if ( this%ENTOT_CONSERVE_SCHEME_FLAG ) then
635 ret = .false.
636 else
637 ret = .true.
638 end if
639 return
640 end function atmdyndgmdriver_nonhydro3d_is_thermvar_rhot
641
642 !> Update the prognostic variables for the non-hydrostatic 3D atmospheric dynamical core
643!OCL SERIAL
644 subroutine atmdyndgmdriver_nonhydro3d_update( this, &
645 PROG_VARS, AUX_VARS, PHYTENDS, &
646 DENS_TRC, DENS0_TRC, &
647 MFLX_x_tavg, MFLX_y_tavg, MFLX_z_tavg, &
648 ALPH_DENS_M_tavg, ALPH_DENS_P_tavg, &
649 Coriolis, &
650 element_operation, &
651 Dx, Dy, Dz, Sx, Sy, Sz, Lift, mesh3D )
652
653 use scale_tracer, only: &
654 qa, tracer_advc, tracer_name
657
661
663 implicit none
664
665 class(atmdyndgmdriver_nonhydro3d), intent(inout) :: this
666 class(meshbase3d), intent(in), target :: mesh3d
667 class(modelvarmanager), intent(inout) :: prog_vars
668 class(modelvarmanager), intent(inout) :: aux_vars
669 class(modelvarmanager), intent(inout) :: phytends
670 type(meshfield3d), intent(inout) :: dens_trc
671 type(meshfield3d), intent(inout) :: dens0_trc
672 type(meshfield3d), intent(inout) :: mflx_x_tavg
673 type(meshfield3d), intent(inout) :: mflx_y_tavg
674 type(meshfield3d), intent(inout) :: mflx_z_tavg
675 type(meshfield3d), intent(inout) :: alph_dens_m_tavg
676 type(meshfield3d), intent(inout) :: alph_dens_p_tavg
677 class(meshfield2d), intent(in) :: coriolis
678 class(elementoperationbase3d), intent(in) :: element_operation
679 type(sparsemat), intent(in) :: dx, dy, dz
680 type(sparsemat), intent(in) :: sx, sy, sz
681 type(sparsemat), intent(in) :: lift
682
683 integer :: rkstage
684 integer :: tintbuf_ind
685 real(rp) :: dt
686 real(rp) :: implicit_fac
687
688 real(rp) :: tavg_coef_mflxz(this%tint(1)%nstage)
689
690 class(localmesh3d), pointer :: lcmesh3d
691 integer :: n
692 integer :: ke
693
694 class(meshfield3d), pointer :: ddens, momx, momy, momz, therm
695 class(meshfield3d), pointer :: pres_hyd, pres_hyd_ref, dens_hyd, therm_hyd, rtot, cvtot, cptot, pres
696 class(meshfield3d), pointer :: dens_tp, momx_tp, momy_tp, momz_tp, rhot_tp, rhoh_p
697 class(meshfield3d), pointer :: dpres, dphyddx, dphyddy
698
699 type(timeint_rk_var) :: rkvar_list(5,mesh3d%local_mesh_num)
700 integer :: rkvar_ids(5)
701
702 logical :: do_wait
703 !-----------------------------------------------------------------------------
704
705 !-
706 call prof_rapstart( 'ATM_DYN_update_pre', 2)
707 call prog_vars%Get3D( dens_vid , ddens )
708 call prog_vars%Get3D( therm_vid, therm )
709 call prog_vars%Get3D( momz_vid , momz )
710 call prog_vars%Get3D( momx_vid , momx )
711 call prog_vars%Get3D( momy_vid , momy )
712
713 call aux_vars%Get3D( preshyd_vid, pres_hyd )
714 call aux_vars%Get3D( denshyd_vid, dens_hyd )
715 call aux_vars%Get3D( thermhyd_vid, therm_hyd )
716 call aux_vars%Get3D( preshyd_ref_vid, pres_hyd_ref )
717 call aux_vars%Get3D( pres_vid, pres )
718 call aux_vars%Get3D( rtot_vid, rtot )
719 call aux_vars%Get3D( cvtot_vid, cvtot )
720 call aux_vars%Get3D( cptot_vid, cptot )
721
722 call phytends%Get3D( phytend_dens_id, dens_tp )
723 call phytends%Get3D( phytend_momx_id, momx_tp )
724 call phytends%Get3D( phytend_momy_id, momy_tp )
725 call phytends%Get3D( phytend_momz_id, momz_tp )
726 call phytends%Get3D( phytend_rhot_id, rhot_tp )
727 call phytends%Get3D( phytend_rhoh_id, rhoh_p )
728
729 call this%AUXDYNVAR3D_manager%Get3D( auxdynvars3d_dpres_id, dpres )
730 call this%AUXDYNVAR3D_manager%Get3D( auxdynvars3d_dphyddx_id, dphyddx )
731 call this%AUXDYNVAR3D_manager%Get3D( auxdynvars3d_dphyddy_id, dphyddy )
732
733 if (this%hevi_flag) then
734 do n=1, mesh3d%LOCAL_MESH_NUM
735 lcmesh3d => mesh3d%lcmesh_list(n)
736
737 call this%tint(n)%StoreVar0( ddens%local(n)%val, dens_vid, 1, lcmesh3d%refElem%Np, lcmesh3d%NeS, lcmesh3d%NeE )
738 call this%tint(n)%StoreVar0( therm%local(n)%val, therm_vid, 1, lcmesh3d%refElem%Np, lcmesh3d%NeS, lcmesh3d%NeE )
739 call this%tint(n)%StoreVar0( momz%local(n)%val, momz_vid, 1, lcmesh3d%refElem%Np, lcmesh3d%NeS, lcmesh3d%NeE )
740 call this%tint(n)%StoreVar0( momx%local(n)%val, momx_vid, 1, lcmesh3d%refElem%Np, lcmesh3d%NeS, lcmesh3d%NeE )
741 call this%tint(n)%StoreVar0( momy%local(n)%val, momy_vid, 1, lcmesh3d%refElem%Np, lcmesh3d%NeS, lcmesh3d%NeE )
742 end do
743 end if
744
745 do n=1, mesh3d%LOCAL_MESH_NUM
746 rkvar_list(1,n)%var2D => ddens%local(n)%val
747 rkvar_list(2,n)%var2D => therm%local(n)%val
748 rkvar_list(3,n)%var2D => momz%local(n)%val
749 rkvar_list(4,n)%var2D => momx%local(n)%val
750 rkvar_list(5,n)%var2D => momy%local(n)%val
751 rkvar_ids(:) = (/ dens_vid, therm_vid, momz_vid, momx_vid, momy_vid /)
752 end do
753
754 do_wait = (.not. this%hide_mpi_comm_flag)
755 call prof_rapend( 'ATM_DYN_update_pre', 2)
756
757 do rkstage=1, this%tint(1)%nstage
758
759 !- Calculate the tendency with the implicit part
760 if (this%hevi_flag) then
761 do n=1, mesh3d%LOCAL_MESH_NUM
762 lcmesh3d => mesh3d%lcmesh_list(n)
763
764 call prof_rapstart( 'ATM_DYN_cal_vi', 2)
765 implicit_fac = this%tint(n)%Get_implicit_diagfac(rkstage)
766 tintbuf_ind = this%tint(n)%tend_buf_indmap(rkstage)
767 dt = this%tint(n)%Get_deltime()
768 call this%cal_vi( &
769 this%tint(n)%tend_buf2D_im(:,:,dens_vid,tintbuf_ind), & ! (out)
770 this%tint(n)%tend_buf2D_im(:,:,momx_vid ,tintbuf_ind), & ! (out)
771 this%tint(n)%tend_buf2D_im(:,:,momy_vid ,tintbuf_ind), & ! (out)
772 this%tint(n)%tend_buf2D_im(:,:,momz_vid ,tintbuf_ind), & ! (out)
773 this%tint(n)%tend_buf2D_im(:,:,therm_vid,tintbuf_ind), & ! (out)
774 ddens%local(n)%val, momx%local(n)%val, momy%local(n)%val, momz%local(n)%val, & ! (in)
775 therm%local(n)%val, & ! (in)
776 dens_hyd%local(n)%val, pres_hyd%local(n)%val, & ! (in)
777 this%tint(n)%var0_2D(:,:,dens_vid), this%tint(n)%var0_2D(:,:,momx_vid), & ! (in)
778 this%tint(n)%var0_2D(:,:,momy_vid ), this%tint(n)%var0_2D(:,:,momz_vid), & ! (in)
779 this%tint(n)%var0_2D(:,:,therm_vid ), & ! (in)
780 rtot%local(n)%val, cvtot%local(n)%val, cptot%local(n)%val, & ! (in)
781 element_operation, dz, lift, & ! (in)
782 implicit_fac, dt, & ! (in)
783 lcmesh3d, lcmesh3d%refElem3D, lcmesh3d%lcmesh2D, lcmesh3d%lcmesh2D%refElem2D ) ! (in)
784
785 call prof_rapend( 'ATM_DYN_cal_vi', 2)
786
787 call prof_rapstart( 'ATM_DYN_store_impl', 2)
788 call this%tint(n)%StoreImplicit( rkstage, ddens%local(n)%val, dens_vid, 1, lcmesh3d%refElem%Np, lcmesh3d%NeS, lcmesh3d%NeE )
789 call this%tint(n)%StoreImplicit( rkstage, therm%local(n)%val, therm_vid, 1, lcmesh3d%refElem%Np, lcmesh3d%NeS, lcmesh3d%NeE )
790 call this%tint(n)%StoreImplicit( rkstage, momz%local(n)%val, momz_vid, 1, lcmesh3d%refElem%Np, lcmesh3d%NeS, lcmesh3d%NeE )
791 call this%tint(n)%StoreImplicit( rkstage, momx%local(n)%val, momx_vid, 1, lcmesh3d%refElem%Np, lcmesh3d%NeS, lcmesh3d%NeE )
792 call this%tint(n)%StoreImplicit( rkstage, momy%local(n)%val, momy_vid, 1, lcmesh3d%refElem%Np, lcmesh3d%NeS, lcmesh3d%NeE )
793 call prof_rapend( 'ATM_DYN_store_impl', 2)
794 end do
795
796 end if
797
798 !- Exchange halo data
799 call prof_rapstart( 'ATM_DYN_exchange_prgv', 2)
800 call prog_vars%MeshFieldComm_Exchange( do_wait )
801 call prof_rapend( 'ATM_DYN_exchange_prgv', 2)
802
803
804 !- Calculate pressure perturbation
805
806 call prof_rapstart( 'ATM_DYN_cal_pres', 2)
808 pres, dpres, & ! (inout)
809 ddens, momx, momy, momz, therm, & ! (in)
810 pres_hyd, dens_hyd, therm_hyd, rtot, cvtot, cptot, & ! (in)
811 mesh3d, this%ENTOT_CONSERVE_SCHEME_FLAG ) ! (in)
812 call prof_rapend( 'ATM_DYN_cal_pres', 2)
813
814 !- Exchange halo data
815 if ( ( .not. this%hide_mpi_comm_flag ) .or. this%ENTOT_CONSERVE_SCHEME_FLAG ) then
816 call prof_rapstart( 'ATM_DYN_exchange_prgv', 2)
817 call this%AUXDYNVAR3D_manager%MeshFieldComm_Exchange( do_wait )
818 call prof_rapend( 'ATM_DYN_exchange_prgv', 2)
819 end if
820
821 if ( .not. this%hide_mpi_comm_flag ) then
822 do n=1, mesh3d%LOCAL_MESH_NUM
823 lcmesh3d => mesh3d%lcmesh_list(n)
824
825 !- Apply boundary conditions
826 call prof_rapstart( 'ATM_DYN_applyBC_prgv', 2)
827 call this%boundary_cond%ApplyBC_PROGVARS_lc( n, & ! (in)
828 ddens%local(n)%val, momx%local(n)%val, momy%local(n)%val, momz%local(n)%val, therm%local(n)%val, & ! (inout)
829 dens_hyd%local(n)%val, pres_hyd%local(n)%val, & ! (in)
830 lcmesh3d%Gsqrt, lcmesh3d%GsqrtH, lcmesh3d%GIJ(:,:,1,1), lcmesh3d%GIJ(:,:,1,2), lcmesh3d%GIJ(:,:,2,2), & ! (in)
831 lcmesh3d%GI3(:,:,1), lcmesh3d%GI3(:,:,2), & ! (in)
832 lcmesh3d%normal_fn(:,:,1), lcmesh3d%normal_fn(:,:,2), lcmesh3d%normal_fn(:,:,3), & ! (in)
833 lcmesh3d%vmapM, lcmesh3d%vmapP, lcmesh3d%vmapB, & ! (in)
834 lcmesh3d, lcmesh3d%refElem3D, lcmesh3d%lcmesh2D, lcmesh3d%lcmesh2D%refElem2D ) ! (in)
835 call prof_rapend( 'ATM_DYN_applyBC_prgv', 2)
836 end do
837 end if
838
839 !- Calculate the tendency with the explicit part
840 do n=1, mesh3d%LOCAL_MESH_NUM
841 lcmesh3d => mesh3d%lcmesh_list(n)
842
843 call prof_rapstart( 'ATM_DYN_update_caltend_ex', 2)
844 tintbuf_ind = this%tint(n)%tend_buf_indmap(rkstage)
845 call this%cal_tend_ex( &
846 this%tint(n)%tend_buf2D_ex(:,:,dens_vid,tintbuf_ind), & ! (out)
847 this%tint(n)%tend_buf2D_ex(:,:,momx_vid ,tintbuf_ind), & ! (out)
848 this%tint(n)%tend_buf2D_ex(:,:,momy_vid ,tintbuf_ind), & ! (out)
849 this%tint(n)%tend_buf2D_ex(:,:,momz_vid ,tintbuf_ind), & ! (out)
850 this%tint(n)%tend_buf2D_ex(:,:,therm_vid,tintbuf_ind), & ! (out)
851 ddens%local(n)%val, momx%local(n)%val, momy%local(n)%val, momz%local(n)%val, & ! (in)
852 therm%local(n)%val, dpres%local(n)%val, & ! (in)
853 dens_hyd%local(n)%val, pres_hyd%local(n)%val, pres_hyd_ref%local(n)%val, & ! (in)
854 therm_hyd%local(n)%val, & ! (in)
855 coriolis%local(n)%val, rtot%local(n)%val, cvtot%local(n)%val, cptot%local(n)%val, & ! (in)
856 dphyddx%local(n)%val, dphyddy%local(n)%val, & ! (in)
857 element_operation, dx, dy, dz, sx, sy, sz, lift, & ! (in)
858 lcmesh3d, lcmesh3d%refElem3D, lcmesh3d%lcmesh2D, lcmesh3d%lcmesh2D%refElem2D ) ! (in)
859 call prof_rapend( 'ATM_DYN_update_caltend_ex', 2)
860
861 !- Sponge layer
862 if (this%SPONGELAYER_FLAG) then
863 call prof_rapstart('ATM_DYN_caltend_sponge', 2)
864 call this%sponge_layer%AddTend( &
865 this%tint(n)%tend_buf2D_ex(:,:,momx_vid ,tintbuf_ind), & ! (inout)
866 this%tint(n)%tend_buf2D_ex(:,:,momy_vid ,tintbuf_ind), & ! (inout)
867 this%tint(n)%tend_buf2D_ex(:,:,momz_vid ,tintbuf_ind), & ! (inout)
868 momx%local(n)%val, momy%local(n)%val, momz%local(n)%val, & ! (in)
869 lcmesh3d, lcmesh3d%refElem3D ) ! (in)
870 call prof_rapend('ATM_DYN_caltend_sponge', 2)
871 end if
872 end do
873
874 call prof_rapstart( 'ATM_DYN_update_add_tp', 2)
875 do n=1, mesh3d%LOCAL_MESH_NUM
876 lcmesh3d => mesh3d%lcmesh_list(n)
877
878 tintbuf_ind = this%tint(n)%tend_buf_indmap(rkstage)
879 call add_phy_tend( &
880 this, this%tint(n)%tend_buf2D_ex(:,:,:,tintbuf_ind), & ! (inout)
881 dens_tp%local(n)%val, momx_tp%local(n)%val, momy_tp%local(n)%val, & ! (in)
882 momz_tp%local(n)%val, rhot_tp%local(n)%val, rhoh_p %local(n)%val, & ! (in)
883 pres%local(n)%val, rtot%local(n)%val, cptot%local(n)%val, & ! (in)
884 n, lcmesh3d, lcmesh3d%refElem3D ) ! (in)
885 end do
886 call prof_rapend( 'ATM_DYN_update_add_tp', 2)
887
888
889 if ( this%hide_mpi_comm_flag ) then
890
891 call prof_rapstart( 'ATM_DYN_exchange_prgv_wait', 2)
892 call prog_vars%MeshFieldComm_Get()
893 if ( this%ENTOT_CONSERVE_SCHEME_FLAG ) &
894 call this%AUXDYNVAR3D_manager%MeshFieldComm_Get()
895 call prof_rapend( 'ATM_DYN_exchange_prgv_wait', 2)
896
897 do n=1, mesh3d%LOCAL_MESH_NUM
898 lcmesh3d => mesh3d%lcmesh_list(n)
899 tintbuf_ind = this%tint(n)%tend_buf_indmap(rkstage)
900
901 !- Apply boundary conditions
902 call prof_rapstart( 'ATM_DYN_applyBC_prgv', 2)
903 call this%boundary_cond%ApplyBC_PROGVARS_lc( n, & ! (in)
904 ddens%local(n)%val, momx%local(n)%val, momy%local(n)%val, momz%local(n)%val, therm%local(n)%val, & ! (inout)
905 dens_hyd%local(n)%val, pres_hyd%local(n)%val, & ! (in)
906 lcmesh3d%Gsqrt, lcmesh3d%GsqrtH, lcmesh3d%GIJ(:,:,1,1), lcmesh3d%GIJ(:,:,1,2), lcmesh3d%GIJ(:,:,2,2), & ! (in)
907 lcmesh3d%GI3(:,:,1), lcmesh3d%GI3(:,:,2), & ! (in)
908 lcmesh3d%normal_fn(:,:,1), lcmesh3d%normal_fn(:,:,2), lcmesh3d%normal_fn(:,:,3), & ! (in)
909 lcmesh3d%vmapM, lcmesh3d%vmapP, lcmesh3d%vmapB, & ! (in)
910 lcmesh3d, lcmesh3d%refElem3D, lcmesh3d%lcmesh2D, lcmesh3d%lcmesh2D%refElem2D ) ! (in)
911 call prof_rapend( 'ATM_DYN_applyBC_prgv', 2)
912
913 call prof_rapstart( 'ATM_DYN_ebnd_flux', 2)
915 this%tint(n)%tend_buf2D_ex(:,:,:,tintbuf_ind), & ! (inout)
916 ddens%local(n)%val, momx%local(n)%val, momy%local(n)%val, momz%local(n)%val, & ! (in)
917 therm%local(n)%val, dpres%local(n)%val, & ! (in)
918 dens_hyd%local(n)%val, pres_hyd%local(n)%val, therm_hyd%local(n)%val, & ! (in)
919 rtot%local(n)%val, cvtot%local(n)%val, cptot%local(n)%val, &
920 lcmesh3d%Gsqrt, lcmesh3d%GI3(:,:,1), lcmesh3d%GI3(:,:,2), lcmesh3d%normal_fn(:,:,1),lcmesh3d%normal_fn(:,:,2),lcmesh3d%normal_fn(:,:,3), &
921 lcmesh3d%VMapM, lcmesh3d%VMapP, lcmesh3d, lcmesh3d%refElem3D, lcmesh3d%lcmesh2D, lcmesh3d%lcmesh2D%refElem2D, &
922 element_operation )
923 call prof_rapend( 'ATM_DYN_ebnd_flux', 2)
924 end do
925 end if
926
927 do n=1, mesh3d%LOCAL_MESH_NUM
928 lcmesh3d => mesh3d%lcmesh_list(n)
929
930 if ( qa > 0 .and. this%EQS_TYPEID /= eqs_typeid_none ) then
931 call prof_rapstart( 'ATM_DYN_tavg_mflx', 2)
932 if (this%tint(1)%imex_flag) then
933 tavg_coef_mflxz(:) = this%tint(n)%coef_b_im(:)
934 else
935 tavg_coef_mflxz(:) = this%tint(n)%coef_b_ex(:)
936 end if
938 mflx_x_tavg%local(n)%val, mflx_y_tavg%local(n)%val, mflx_z_tavg%local(n)%val, & ! (inout)
939 alph_dens_m_tavg%local(n)%face_val, alph_dens_p_tavg%local(n)%face_val, & ! (inout)
940 ddens%local(n)%val, momx%local(n)%val, momy%local(n)%val, momz%local(n)%val, & ! (in)
941 dpres%local(n)%val, dens_hyd%local(n)%val, pres_hyd%local(n)%val, & ! (in)
942 rtot%local(n)%val, cvtot%local(n)%val, cptot%local(n)%val, & ! (in)
943 lcmesh3d, lcmesh3d%refElem3D, & ! (in)
944 rkstage, this%tint(n)%coef_b_ex(rkstage), tavg_coef_mflxz(rkstage), & ! (in)
945 this%hevi_flag ) ! (in)
946 call prof_rapend( 'ATM_DYN_tavg_mflx', 2)
947 end if
948
949 call prof_rapstart( 'ATM_DYN_update_advance', 2)
950 call this%tint(n)%Advance_varlist( rkstage, rkvar_list(:,n), rkvar_ids, 1, lcmesh3d%refElem%Np, lcmesh3d%NeS, lcmesh3d%NeE )
951 call prof_rapend( 'ATM_DYN_update_advance', 2)
952 end do
953
954 end do ! end for RK loop
955
956 call prof_rapstart( 'ATM_DYN_update_post', 2)
957 if ( qa > 0 ) then
958 do n=1, mesh3d%LOCAL_MESH_NUM
959 lcmesh3d => mesh3d%lcmesh_list(n)
960
961 !$omp parallel do
962 do ke=lcmesh3d%NeS, lcmesh3d%NeE
963 dens0_trc%local(n)%val(:,ke) = this%tint(n)%var0_2D(:,ke,dens_vid)
964 dens_trc %local(n)%val(:,ke) = ddens%local(n)%val(:,ke)
965 end do
966 end do
967 end if
968 call prof_rapend( 'ATM_DYN_update_post', 2)
969
970 if ( this%MODALFILTER_FLAG ) then
971 do n=1, mesh3d%LOCAL_MESH_NUM
972 lcmesh3d => mesh3d%lcmesh_list(n)
973
974 call prof_rapstart( 'ATM_DYN_update_modalfilter', 2)
976 ddens%local(n)%val, momx%local(n)%val, momy%local(n)%val, momz%local(n)%val, therm%local(n)%val, & ! (inout)
977 lcmesh3d, lcmesh3d%refElem3D, element_operation, & ! (in)
978 do_weight_gsqrt = .true. ) ! (in)
979 call prof_rapend( 'ATM_DYN_update_modalfilter', 2)
980 end do
981 end if
982
983 call prof_rapstart( 'ATM_DYN_update_post', 2)
985 pres, dpres, & ! (inout)
986 ddens, momx, momy, momz, therm, & ! (in)
987 pres_hyd, dens_hyd, therm_hyd, & ! (in)
988 rtot, cvtot, cptot, & ! (in)
989 mesh3d, this%ENTOT_CONSERVE_SCHEME_FLAG ) ! (in)
990 call prof_rapend( 'ATM_DYN_update_post', 2)
991
992 return
993 end subroutine atmdyndgmdriver_nonhydro3d_update
994
995!> Finalize a object to provide a driver of atmospheric dynamical core
996!OCL SERIAL
997 subroutine atmdyndgmdriver_nonhydro3d_final( this )
998 implicit none
999
1000 class(atmdyndgmdriver_nonhydro3d), intent(inout) :: this
1001 !-----------------------------------------------------------------------------
1002
1003 call this%dynsolver_final()
1004 call this%boundary_cond%Final()
1005
1006 if ( this%SPONGELAYER_FLAG ) call this%sponge_layer%Final()
1007
1008 if ( this%MODALFILTER_FLAG ) then
1009 call this%modal_filter_3d%Final()
1010 if ( this%hevi_flag ) call this%modal_filter_v1D%Final()
1011 end if
1012
1013 call this%AUXDYNVAR3D_manager%Final()
1014 call atmdyndgmdriver_base3d_final( this )
1015
1016 return
1017 end subroutine atmdyndgmdriver_nonhydro3d_final
1018
1019 !> Calculate the pressure using the prognostic variables with the non-hydrostatic 3D atmospheric dynamical core
1020!OCL SERIAL
1021 subroutine atmdyndgmdriver_nonhydro3d_calc_pressure( this, &
1022 PRES, PROG_VARS, AUX_VARS )
1023
1024 implicit none
1025
1026 class(atmdyndgmdriver_nonhydro3d), intent(in) :: this
1027 class(meshfield3d), intent(inout) :: pres
1028 class(modelvarmanager), intent(inout) :: prog_vars
1029 class(modelvarmanager), intent(inout) :: aux_vars
1030
1031 class(meshbase3d), pointer :: mesh3d
1032 class(meshfield3d), pointer :: ddens, momx, momy, momz, therm
1033 class(meshfield3d), pointer :: pres_hyd, dens_hyd, therm_hyd, rtot, cvtot, cptot
1034
1035 type(meshfield3d) :: dpres
1036 !-----------------------------------------------------------------------------
1037
1038 call prog_vars%Get3D(dens_vid , ddens)
1039 call prog_vars%Get3D(therm_vid, therm)
1040 call prog_vars%Get3D(momz_vid , momz )
1041 call prog_vars%Get3D(momx_vid , momx )
1042 call prog_vars%Get3D(momy_vid , momy )
1043
1044 call aux_vars%Get3D( preshyd_vid, pres_hyd )
1045 call aux_vars%Get3D( denshyd_vid, dens_hyd )
1046 call aux_vars%Get3D( thermhyd_vid, therm_hyd )
1047 call aux_vars%Get3D( rtot_vid, rtot )
1048 call aux_vars%Get3D( cvtot_vid, cvtot )
1049 call aux_vars%Get3D( cptot_vid, cptot )
1050
1051 mesh3d => ddens%mesh
1052 call dpres%Init( "DPRES", "Pa", mesh3d )
1053
1055 pres, dpres, & ! (inout)
1056 ddens, momx, momy, momz, therm, & ! (in)
1057 pres_hyd, dens_hyd, therm_hyd, rtot, cvtot, cptot, & ! (in)
1058 mesh3d, this%ENTOT_CONSERVE_SCHEME_FLAG ) ! (in)
1059
1060 call dpres%Final()
1061
1062 return
1063 end subroutine atmdyndgmdriver_nonhydro3d_calc_pressure
1064
1065 !> Update the hydrostatic part of thermodynamic prognostic variable (THERM_hyd)
1066!OCL SERIAL
1067 subroutine atmdyndgmdriver_nonhydro3d_update_thermhyd( this, &
1068 AUX_VARS )
1071 implicit none
1072 class(atmdyndgmdriver_nonhydro3d), intent(in) :: this
1073 class(modelvarmanager), intent(inout) :: aux_vars
1074
1075 class(meshfield3d), pointer :: pres_hyd, dens_hyd, therm_hyd
1076 class(meshbase3d), pointer :: mesh3d
1077 !---------------------------
1078
1079 call aux_vars%Get3D( preshyd_vid, pres_hyd )
1080 call aux_vars%Get3D( denshyd_vid, dens_hyd )
1081 call aux_vars%Get3D( thermhyd_vid, therm_hyd )
1082
1083 mesh3d => dens_hyd%mesh
1084
1086 therm_hyd, & ! (inout)
1087 pres_hyd, dens_hyd, & ! (in)
1088 mesh3d, this%ENTOT_CONSERVE_SCHEME_FLAG ) ! (in)
1089
1090 return
1091 end subroutine atmdyndgmdriver_nonhydro3d_update_thermhyd
1092
1093 !> Calculate the horizontal gradient of the hydrostatic pressure
1094!OCL SERIAL
1095 subroutine atmdyndgmdriver_nonhydro3d_update_phyd_hgrad( this, &
1096 PRES_hyd, PRES_hyd_ref, & ! (in)
1097 mesh3d, element_operation ) ! (in)
1100 implicit none
1101 class(atmdyndgmdriver_nonhydro3d), intent(inout) :: this
1102 class(meshfield3d), intent(in) :: pres_hyd
1103 class(meshfield3d), intent(in) :: pres_hyd_ref
1104 class(meshbase3d), intent(in), target :: mesh3d
1105 class(elementoperationbase3d), intent(in) :: element_operation
1106
1107 integer :: n
1108 class(localmesh3d), pointer :: lcmesh3d
1109 !---------------------------
1110
1111 do n=1, mesh3d%LOCAL_MESH_NUM
1112 lcmesh3d => mesh3d%lcmesh_list(n)
1113 !$acc update host( PRES_hyd%local(n)%val, PRES_hyd_ref%local(n)%val )
1114
1116 this%AUX_DYNVARS3D(auxdynvars3d_dphyddx_id)%local(n)%val, & ! (out)
1117 this%AUX_DYNVARS3D(auxdynvars3d_dphyddy_id)%local(n)%val, & ! (out)
1118 pres_hyd%local(n)%val, pres_hyd_ref%local(n)%val, & ! (in)
1119 element_operation, lcmesh3d, lcmesh3d%refElem3D ) ! (in)
1120
1121 !$acc update device( this%AUX_DYNVARS3D(AUXDYNVARS3D_DPhydDx_ID)%local(n)%val, &
1122 !$acc this%AUX_DYNVARS3D(AUXDYNVARS3D_DPhydDy_ID)%local(n)%val )
1123 end do
1124
1125 return
1126 end subroutine atmdyndgmdriver_nonhydro3d_update_phyd_hgrad
1127
1128!----- private --------------------------------------
1129
1130!OCL SERIAL
1131 subroutine add_phy_tend( this, & ! (in)
1132 dyn_tends, & ! (inout)
1133 dens_tp, momx_tp, momy_tp, momz_tp, rhot_tp, rhoh_p, & !(in)
1134 pres, rtot, cptot, & ! (in)
1135 domid, lcmesh, elem3d ) ! (in)
1136
1137 implicit none
1138
1139 class(atmdyndgmdriver_nonhydro3d), intent(inout) :: this
1140 class(localmesh3d), intent(in) :: lcmesh
1141 class(elementbase3d), intent(in) :: elem3d
1142 real(rp), intent(inout) :: dyn_tends(elem3d%np,lcmesh%nea,prgvar_num)
1143 real(rp), intent(in) :: dens_tp(elem3d%np,lcmesh%nea)
1144 real(rp), intent(in) :: momx_tp(elem3d%np,lcmesh%nea)
1145 real(rp), intent(in) :: momy_tp(elem3d%np,lcmesh%nea)
1146 real(rp), intent(in) :: momz_tp(elem3d%np,lcmesh%nea)
1147 real(rp), intent(in) :: rhot_tp(elem3d%np,lcmesh%nea)
1148 real(rp), intent(in) :: rhoh_p (elem3d%np,lcmesh%nea)
1149 real(rp), intent(in) :: pres(elem3d%np,lcmesh%nea)
1150 real(rp), intent(in) :: rtot(elem3d%np,lcmesh%nea)
1151 real(rp), intent(in) :: cptot(elem3d%np,lcmesh%nea)
1152 integer, intent(in) :: domid
1153
1154 integer :: ke, p
1155 real(rp) :: exner(elem3d%np)
1156 real(rp) :: exner_
1157 real(rp) :: rp0
1158 !---------------------------------------------------------------------------------
1159
1160 rp0 = 1.0_rp / pres00
1161
1162 !$omp parallel private( EXNER, ke )
1163 !$acc parallel loop gang present( dyn_tends, DENS_tp, MOMX_tp, MOMY_tp, MOMZ_tp, lcmesh,elem3D)
1164 !$omp do
1165 do ke=lcmesh%NeS, lcmesh%NeE
1166 !$acc loop vector
1167 do p=1, elem3d%Np
1168 dyn_tends(p,ke,dens_vid) = dyn_tends(p,ke,dens_vid) + dens_tp(p,ke)
1169 dyn_tends(p,ke,momz_vid) = dyn_tends(p,ke,momz_vid) + momz_tp(p,ke)
1170 dyn_tends(p,ke,momx_vid) = dyn_tends(p,ke,momx_vid) + momx_tp(p,ke)
1171 dyn_tends(p,ke,momy_vid) = dyn_tends(p,ke,momy_vid) + momy_tp(p,ke)
1172 end do
1173 end do
1174 !$omp end do
1175
1176 if ( this%ENTOT_CONSERVE_SCHEME_FLAG ) then
1177 !$omp do
1178 do ke=lcmesh%NeS, lcmesh%NeE
1179 exner(:) = ( pres(:,ke) * rp0 )**( rtot(:,ke) / cptot(:,ke) )
1180
1181 dyn_tends(:,ke,therm_vid) = dyn_tends(:,ke,therm_vid) &
1182 + rhoh_p(:,ke) &
1183 + ( cptot(:,ke) * exner(:) ) * rhot_tp(:,ke)
1184 end do
1185 !$omp end do
1186 else
1187 !$omp do
1188 !$acc parallel loop gang present( dyn_tends, RHOT_tp, RHOH_p, PRES, Rtot, CPtot, lcmesh,elem3D)
1189 do ke=lcmesh%NeS, lcmesh%NeE
1190#ifdef _OPENACC
1191 !$acc loop vector
1192 do p=1, elem3d%Np
1193 exner_ = ( pres(p,ke) * rp0 )**( rtot(p,ke) / cptot(p,ke) )
1194
1195 dyn_tends(p,ke,therm_vid) = dyn_tends(p,ke,therm_vid) &
1196 + rhot_tp(p,ke) &
1197 + rhoh_p(p,ke) / ( cptot(p,ke) * exner_ )
1198 end do
1199#else
1200 exner(:) = ( pres(:,ke) * rp0 )**( rtot(:,ke) / cptot(:,ke) )
1201
1202 dyn_tends(:,ke,therm_vid) = dyn_tends(:,ke,therm_vid) &
1203 + rhot_tp(:,ke) &
1204 + rhoh_p(:,ke) / ( cptot(:,ke) * exner(:) )
1205#endif
1206 end do
1207 !$omp end do
1208 end if
1209 !$omp end parallel
1210 return
1211 end subroutine add_phy_tend
1212
1213!OCL SERIAL
1214 subroutine add_phy_tend_new( this, & ! (in)
1215 dyn_tends, & ! (inout)
1216 dens_tp, momx_tp, momy_tp, momz_tp, rhot_tp, rhoh_p, & !(in)
1217 pres, rtot, cptot, & ! (in)
1218 domid, lcmesh, elem3d ) ! (in)
1219
1220 implicit none
1221
1222 class(atmdyndgmdriver_nonhydro3d), intent(inout) :: this
1223 class(localmesh3d), intent(in) :: lcmesh
1224 class(elementbase3d), intent(in) :: elem3d
1225 real(rp), intent(inout) :: dyn_tends(elem3d%np,lcmesh%nea,prgvar_num)
1226 real(rp), intent(in) :: dens_tp(elem3d%np,lcmesh%nea)
1227 real(rp), intent(in) :: momx_tp(elem3d%np,lcmesh%nea)
1228 real(rp), intent(in) :: momy_tp(elem3d%np,lcmesh%nea)
1229 real(rp), intent(in) :: momz_tp(elem3d%np,lcmesh%nea)
1230 real(rp), intent(in) :: rhot_tp(elem3d%np,lcmesh%nea)
1231 real(rp), intent(in) :: rhoh_p (elem3d%np,lcmesh%nea)
1232 real(rp), intent(in) :: pres(elem3d%np,lcmesh%nea)
1233 real(rp), intent(in) :: rtot(elem3d%np,lcmesh%nea)
1234 real(rp), intent(in) :: cptot(elem3d%np,lcmesh%nea)
1235 integer, intent(in) :: domid
1236
1237 integer :: ke
1238 real(rp) :: exner(elem3d%np)
1239 real(rp) :: rp0
1240 !---------------------------------------------------------------------------------
1241
1242 rp0 = 1.0_rp / pres00
1243
1244 !$omp parallel private( EXNER, ke )
1245
1246 !$omp do
1247 do ke=lcmesh%NeS, lcmesh%NeE
1248 dyn_tends(:,ke,dens_vid) = dyn_tends(:,ke,dens_vid) + dens_tp(:,ke)
1249 dyn_tends(:,ke,momz_vid) = dyn_tends(:,ke,momz_vid) + momz_tp(:,ke)
1250 dyn_tends(:,ke,momx_vid) = dyn_tends(:,ke,momx_vid) + momx_tp(:,ke)
1251 dyn_tends(:,ke,momy_vid) = dyn_tends(:,ke,momy_vid) + momy_tp(:,ke)
1252 end do
1253 !$omp end do
1254
1255 if ( this%ENTOT_CONSERVE_SCHEME_FLAG ) then
1256 !$omp do
1257 do ke=lcmesh%NeS, lcmesh%NeE
1258 exner(:) = ( pres(:,ke) * rp0 )**( rtot(:,ke) / cptot(:,ke) )
1259
1260 dyn_tends(:,ke,therm_vid) = dyn_tends(:,ke,therm_vid) &
1261 + rhoh_p(:,ke) &
1262 + ( cptot(:,ke) * exner(:) ) * rhot_tp(:,ke)
1263 end do
1264 !$omp end do
1265 else
1266 !$omp do
1267 do ke=lcmesh%NeS, lcmesh%NeE
1268 exner(:) = ( pres(:,ke) * rp0 )**( rtot(:,ke) / cptot(:,ke) )
1269
1270 dyn_tends(:,ke,therm_vid) = dyn_tends(:,ke,therm_vid) &
1271 + rhot_tp(:,ke) &
1272 + rhoh_p(:,ke) / ( cptot(:,ke) * exner(:) )
1273 end do
1274 !$omp end do
1275 end if
1276 !$omp end parallel
1277 return
1278 end subroutine add_phy_tend_new
1279
1280 !-- Setup modal filter
1281!OCL SERIAL
1282 subroutine setup_modalfilter( this, refElem3D, element_operation )
1284 implicit none
1285
1286 class(atmdyndgmdriver_nonhydro3d), target, intent(inout) :: this
1287 class(hexahedralelement), target, intent(in) :: refelem3d
1288 class(elementoperationbase3d), intent(inout) :: element_operation
1289
1290 real(rp) :: mf_etac_h = 2.0_rp/3.0_rp
1291 real(rp) :: mf_alpha_h = 36.0_rp
1292 integer :: mf_order_h = 16
1293 real(rp) :: mf_etac_v = 2.0_rp/3.0_rp
1294 real(rp) :: mf_alpha_v = 36.0_rp
1295 integer :: mf_order_v = 16
1296
1297 namelist /param_atmos_dyn_modalfilter/ &
1298 mf_etac_h, mf_alpha_h, mf_order_h, &
1299 mf_etac_v, mf_alpha_v, mf_order_v
1300
1301 integer :: ierr
1302
1303 type(lineelement) :: elemv1d
1304 !---------------------------------------------------------------
1305
1306 rewind(io_fid_conf)
1307 read(io_fid_conf,nml=param_atmos_dyn_modalfilter,iostat=ierr)
1308 if( ierr < 0 ) then !--- missing
1309 log_info("ATMOS_DYN_setup_modalfilter",*) 'Not found namelist. Default used.'
1310 elseif( ierr > 0 ) then !--- fatal error
1311 log_error("ATMOS_DYN_setup_modalfilter",*) 'Invalid names in namelist PARAM_ATMOS_DYN_MODALFILTER. Check!'
1312 call prc_abort
1313 endif
1314
1315 log_nml(param_atmos_dyn_modalfilter)
1316
1317 call this%modal_filter_3d%Init( &
1318 refelem3d, & ! (in)
1319 mf_etac_h, mf_alpha_h, mf_order_h, & ! (in)
1320 mf_etac_v, mf_alpha_v, mf_order_v ) ! (in)
1321
1322 call element_operation%Setup_ModalFilter( &
1323 mf_etac_h, mf_alpha_h, mf_order_h, & ! (in)
1324 mf_etac_v, mf_alpha_v, mf_order_v ) ! (in)
1325
1326 return
1327 end subroutine setup_modalfilter
1328
module FElib / Fluid dyn solver / Atmosphere / Boundary
module FElib / Fluid dyn solver / Atmosphere / driver (base)
subroutine, public atmdyndgmdriver_base3d_final(this)
subroutine, public atmdyndgmdriver_base3d_init(this, prgvar_num, tint_type, dtsec, mesh)
module FElib / Fluid dyn solver / Atmosphere / driver (3D nonhydrostatic model)
type(variableinfo), dimension(auxdynvars3d_num), public atmos_dyn_auxdynvars3d_vinfo
module FElib / Fluid dyn solver / Atmosphere / Global nonhydrostatic model / HEVE
subroutine, public atm_dyn_dgm_globalnonhydro3d_etot_heve_cal_tend(dens_dt, momx_dt, momy_dt, momz_dt, entot_dt, ddens_, momx_, momy_, momz_, etot_, dpres_, dens_hyd, pres_hyd, pres_hyd_ref, therm_hyd, coriolis, rtot, cvtot, cptot, dphyddx, dphyddy, element3d_operation, dx, dy, dz, sx, sy, sz, lift, lmesh, elem, lmesh2d, elem2d)
module FElib / Fluid dyn solver / Atmosphere / Global nonhydrostatic model / HEVI
subroutine, public atm_dyn_dgm_globalnonhydro3d_etot_hevi_cal_tend(dens_dt, momx_dt, momy_dt, momz_dt, entot_dt, ddens_, momx_, momy_, momz_, etot_, dpres_, dens_hyd, pres_hyd, pres_hyd_ref, therm_hyd, coriolis, rtot, cvtot, cptot, dphyddx, dphyddy, element3d_operation, dx, dy, dz, sx, sy, sz, lift, lmesh, elem, lmesh2d, elem2d)
subroutine, public atm_dyn_dgm_globalnonhydro3d_etot_hevi_cal_vi(dens_dt, momx_dt, momy_dt, momz_dt, etot_dt, ddens_, momx_, momy_, momz_, etot_, dens_hyd, pres_hyd, ddens0_, momx0_, momy0_, momz0_, etot0_, rtot, cvtot, cptot, element3d_operation, dz, lift, impl_fac, dt, lmesh, elem, lmesh2d, elem2d)
module FElib / Fluid dyn solver / Atmosphere / Global nonhydrostatic model / HEVE
subroutine, public atm_dyn_dgm_globalnonhydro3d_rhot_heve_gpu_cal_tend_deep_atm(dens_dt, momx_dt, momy_dt, momz_dt, rhot_dt, ddens_, momx_, momy_, momz_, drhot_, dpres_, dens_hyd, pres_hyd, pres_hyd_ref, therm_hyd, coriolis, rtot, cvtot, cptot, dphyddx, dphyddy, element3d_operation, dx, dy, dz, sx, sy, sz, lift, lmesh, elem, lmesh2d, elem2d)
subroutine, public atm_dyn_dgm_globalnonhydro3d_rhot_heve_gpu_cal_tend_shallow_atm(dens_dt, momx_dt, momy_dt, momz_dt, rhot_dt, ddens_, momx_, momy_, momz_, drhot_, dpres_, dens_hyd, pres_hyd, pres_hyd_ref, therm_hyd, coriolis, rtot, cvtot, cptot, dphyddx, dphyddy, element3d_operation, dx, dy, dz, sx, sy, sz, lift, lmesh, elem, lmesh2d, elem2d)
module FElib / Fluid dyn solver / Atmosphere / Global nonhydrostatic model / HEVE
subroutine, public atm_dyn_dgm_globalnh3d_rhot_heve_cal_tend_shallow_atm_asis(dens_dt, momx_dt, momy_dt, momz_dt, rhot_dt, ddens_, momx_, momy_, momz_, drhot_, dpres_, dens_hyd, pres_hyd, pres_hyd_ref, therm_hyd, coriolis, rtot, cvtot, cptot, dphyddx, dphyddy, element3d_operation, dx, dy, dz, sx, sy, sz, lift, lmesh, elem, lmesh2d, elem2d)
subroutine, public atm_dyn_dgm_globalnonhydro3d_rhot_heve_cal_tend_deep_atm(dens_dt, momx_dt, momy_dt, momz_dt, rhot_dt, ddens_, momx_, momy_, momz_, drhot_, dpres_, dens_hyd, pres_hyd, pres_hyd_ref, therm_hyd, coriolis, rtot, cvtot, cptot, dphyddx, dphyddy, element3d_operation, dx, dy, dz, sx, sy, sz, lift, lmesh, elem, lmesh2d, elem2d)
subroutine, public atm_dyn_dgm_globalnonhydro3d_rhot_heve_cal_tend_shallow_atm(dens_dt, momx_dt, momy_dt, momz_dt, rhot_dt, ddens_, momx_, momy_, momz_, drhot_, dpres_, dens_hyd, pres_hyd, pres_hyd_ref, therm_hyd, coriolis, rtot, cvtot, cptot, dphyddx, dphyddy, element3d_operation, dx, dy, dz, sx, sy, sz, lift, lmesh, elem, lmesh2d, elem2d)
module FElib / Fluid dyn solver / Atmosphere / Global nonhydrostatic model / HEVI
subroutine, public atm_dyn_dgm_globalnonhydro3d_rhot_hevi_cal_vi_asis(dens_dt, momx_dt, momy_dt, momz_dt, rhot_dt, ddens_, momx_, momy_, momz_, drhot_, dens_hyd, pres_hyd, ddens0_, momx0_, momy0_, momz0_, drhot0_, rtot, cvtot, cptot, element3d_operation, dz, lift, impl_fac, dt, lmesh, elem, lmesh2d, elem2d)
subroutine, public atm_dyn_dgm_globalnonhydro3d_rhot_hevi_cal_tend(dens_dt, momx_dt, momy_dt, momz_dt, rhot_dt, ddens_, momx_, momy_, momz_, drhot_, dpres_, dens_hyd, pres_hyd, pres_hyd_ref, therm_hyd, coriolis, rtot, cvtot, cptot, dphyddx, dphyddy, element3d_operation, dx, dy, dz, sx, sy, sz, lift, lmesh, elem, lmesh2d, elem2d)
subroutine, public atm_dyn_dgm_globalnonhydro3d_rhot_hevi_cal_vi(dens_dt, momx_dt, momy_dt, momz_dt, rhot_dt, ddens_, momx_, momy_, momz_, drhot_, dens_hyd, pres_hyd, ddens0_, momx0_, momy0_, momz0_, drhot0_, rtot, cvtot, cptot, element3d_operation, dz, lift, impl_fac, dt, lmesh, elem, lmesh2d, elem2d)
subroutine, public atm_dyn_dgm_globalnonhydro3d_rhot_hevi_cal_tend_asis(dens_dt, momx_dt, momy_dt, momz_dt, rhot_dt, ddens_, momx_, momy_, momz_, drhot_, dpres_, dens_hyd, pres_hyd, pres_hyd_ref, therm_hyd, coriolis, rtot, cvtot, cptot, dphyddx, dphyddy, element3d_operation, dx, dy, dz, sx, sy, sz, lift, lmesh, elem, lmesh2d, elem2d)
module FElib / Fluid dyn solver / Atmosphere / Common / Modal filter
subroutine, public atm_dyn_dgm_modalfilter_apply(ddens_, momx_, momy_, momz_, drhot_, lmesh, elem, elem_operation, do_weight_gsqrt)
module FElib / Fluid dyn solver / Atmosphere / Regional nonhydrostatic model / Skip dynamical process
subroutine, public atm_dyn_dgm_none_init(mesh)
subroutine, public atm_dyn_dgm_none_cal_tend(dens_dt, momx_dt, momy_dt, momz_dt, rhot_dt, ddens_, momx_, momy_, momz_, drhot_, dpres_, dens_hyd, pres_hyd, pres_hyd_ref, therm_hyd, coriolis, rtot, cvtot, cptot, dphyddx, dphyddy, element3d_operation, dx, dy, dz, sx, sy, sz, lift, lmesh, elem, lmesh2d, elem2d)
subroutine, public atm_dyn_dgm_none_final()
module FElib / Fluid dyn solver / Atmosphere / Nonhydrostatic model / Common
subroutine, public atm_dyn_dgm_nonhydro3d_common_calc_phyd_hgrad_lc(dphyddx, dphyddy, pres_hyd, pres_hyd_ref, element3d_operation, lmesh, elem)
Calculate horizontal graidient of hydrostatic pressure In this calculation, we assume that PRES_hyd_r...
subroutine, public atm_dyn_dgm_nonhydro3d_common_calc_pressure(pres, dpres, ddens, momx, momy, momz, therm, pres_hyd, dens_hyd, therm_hyd, rtot, cvtot, cptot, mesh3d, entot_conserve_scheme_flag)
subroutine, public atm_dyn_dgm_nonhydro3d_common_calc_therm_phyd(therm_hyd, pres_hyd, dens_hyd, mesh3d, entot_conserve_scheme_flag)
module FElib / Fluid dyn solver / Atmosphere / Regional nonhydrostatic model / HEVE
subroutine, public atm_dyn_dgm_nonhydro3d_etot_heve_cal_tend(dens_dt, momx_dt, momy_dt, momz_dt, etot_dt, ddens_, momx_, momy_, momz_, etot_, dpres_, dens_hyd, pres_hyd, pres_hyd_ref, therm_hyd, coriolis, rtot, cvtot, cptot, dphyddx, dphyddy, element3d_operation, dx, dy, dz, sx, sy, sz, lift, lmesh, elem, lmesh2d, elem2d)
module FElib / Fluid dyn solver / Atmosphere / Regional nonhydrostatic model / HEVI
subroutine, public atm_dyn_dgm_nonhydro3d_etot_hevi_cal_tend(dens_dt, momx_dt, momy_dt, momz_dt, etot_dt, ddens_, momx_, momy_, momz_, etot_, dpres_, dens_hyd, pres_hyd, pres_hyd_ref, therm_hyd, coriolis, rtot, cvtot, cptot, dphyddx, dphyddy, element3d_operation, dx, dy, dz, sx, sy, sz, lift, lmesh, elem, lmesh2d, elem2d)
subroutine, public atm_dyn_dgm_nonhydro3d_etot_hevi_cal_vi(dens_dt, momx_dt, momy_dt, momz_dt, etot_dt, ddens_, momx_, momy_, momz_, etot_, dens_hyd, pres_hyd, ddens0_, momx0_, momy0_, momz0_, etot0_, rtot, cvtot, cptot, element3d_operation, dz, lift, impl_fac, dt, lmesh, elem, lmesh2d, elem2d)
module FElib / Fluid dyn solver / Atmosphere / Regional nonhydrostatic model / HEVE
subroutine, public atm_dyn_dgm_nonhydro3d_rhot_heve_gpu_init(mesh)
Initialize the module for HEVE scheme on GPU.
subroutine, public atm_dyn_dgm_nonhydro3d_rhot_heve_cal_tend_gpu2(dens_dt, momx_dt, momy_dt, momz_dt, rhot_dt, ddens_, momx_, momy_, momz_, drhot_, dpres_, dens_hyd, pres_hyd, pres_hyd_ref, therm_hyd, coriolis, rtot, cvtot, cptot, dphyddx, dphyddy, element3d_operation, dx, dy, dz, sx, sy, sz, lift, lmesh, elem, lmesh2d, elem2d)
subroutine, public atm_dyn_dgm_nonhydro3d_rhot_heve_gpu_final()
Finalize the module for HEVE scheme on GPU.
subroutine, public atm_dyn_dgm_nonhydro3d_rhot_heve_cal_tend_gpu(dens_dt, momx_dt, momy_dt, momz_dt, rhot_dt, ddens_, momx_, momy_, momz_, drhot_, dpres_, dens_hyd, pres_hyd, pres_hyd_ref, therm_hyd, coriolis, rtot, cvtot, cptot, dphyddx, dphyddy, element3d_operation, dx, dy, dz, sx, sy, sz, lift, lmesh, elem, lmesh2d, elem2d)
module FElib / Fluid dyn solver / Atmosphere / Nonhydrostatic model / HEVE / Numflux
subroutine, public atm_dyn_dgm_nonhydro3d_rhot_heve_add_bnd_contrib_generalvc(prgvar_dt, ddens_, momx_, momy_, momz_, drhot_, dpres, dens_hyd, pres_hyd, therm_hyd, rtot, cvtot, cptot, gsqrt, g13, g23, nx, ny, nz, vmapm, vmapp, lmesh, elem, lmesh2d, elem2d, elem3d_optr)
subroutine, public atm_dyn_dgm_nonhydro3d_rhot_heve_splitform_cal_tend(dens_dt, momx_dt, momy_dt, momz_dt, rhot_dt, ddens_, momx_, momy_, momz_, drhot_, dpres_, dens_hyd, pres_hyd, pres_hyd_ref, therm_hyd, coriolis, rtot, cvtot, cptot, dphyddx, dphyddy, element3d_operation, dx, dy, dz, sx, sy, sz, lift, lmesh, elem, lmesh2d, elem2d)
module FElib / Fluid dyn solver / Atmosphere / Regional nonhydrostatic model / HEVE
subroutine, public atm_dyn_dgm_nonhydro3d_rhot_heve_cal_tend_cco(dens_dt, momx_dt, momy_dt, momz_dt, rhot_dt, ddens_, momx_, momy_, momz_, drhot_, dpres_, dens_hyd, pres_hyd, pres_hyd_ref, therm_hyd, coriolis, rtot, cvtot, cptot, dphyddx, dphyddy, element3d_operation, dx, dy, dz, sx, sy, sz, lift, lmesh, elem, lmesh2d, elem2d)
subroutine, public atm_dyn_dgm_nonhydro3d_rhot_heve_cal_tend(dens_dt, momx_dt, momy_dt, momz_dt, rhot_dt, ddens_, momx_, momy_, momz_, drhot_, dpres_, dens_hyd, pres_hyd, pres_hyd_ref, therm_hyd, coriolis, rtot, cvtot, cptot, dphyddx, dphyddy, element3d_operation, dx, dy, dz, sx, sy, sz, lift, lmesh, elem, lmesh2d, elem2d)
subroutine, public atm_dyn_dgm_nonhydro3d_rhot_heve_cal_tend_asis(dens_dt, momx_dt, momy_dt, momz_dt, rhot_dt, ddens_, momx_, momy_, momz_, drhot_, dpres_, dens_hyd, pres_hyd, pres_hyd_ref, therm_hyd, coriolis, rtot, cvtot, cptot, dphyddx, dphyddy, element3d_operation, dx, dy, dz, sx, sy, sz, lift, lmesh, elem, lmesh2d, elem2d)
subroutine, public atm_dyn_dgm_nonhydro3d_rhot_hevi_splitform_cal_vi(dens_dt, momx_dt, momy_dt, momz_dt, rhot_dt, ddens_, momx_, momy_, momz_, drhot_, dens_hyd, pres_hyd, ddens0_, momx0_, momy0_, momz0_, drhot0_, rtot, cvtot, cptot, element3d_operation, dz, lift, impl_fac, dt, lmesh, elem, lmesh2d, elem2d)
subroutine, public atm_dyn_dgm_nonhydro3d_rhot_hevi_splitform_cal_tend(dens_dt, momx_dt, momy_dt, momz_dt, rhot_dt, ddens_, momx_, momy_, momz_, drhot_, dpres_, dens_hyd, pres_hyd, pres_hyd_ref, therm_hyd, coriolis, rtot, cvtot, cptot, dphyddx, dphyddy, element3d_operation, dx, dy, dz, sx, sy, sz, lift, lmesh, elem, lmesh2d, elem2d)
module FElib / Fluid dyn solver / Atmosphere / Regional nonhydrostatic model / HEVI
subroutine, public atm_dyn_dgm_nonhydro3d_rhot_hevi_cal_tend(dens_dt, momx_dt, momy_dt, momz_dt, rhot_dt, ddens_, momx_, momy_, momz_, drhot_, dpres_, dens_hyd, pres_hyd, pres_hyd_ref, therm_hyd, coriolis, rtot, cvtot, cptot, dphyddx, dphyddy, element3d_operation, dx, dy, dz, sx, sy, sz, lift, lmesh, elem, lmesh2d, elem2d)
subroutine, public atm_dyn_dgm_nonhydro3d_rhot_hevi_cal_tend_asis(dens_dt, momx_dt, momy_dt, momz_dt, rhot_dt, ddens_, momx_, momy_, momz_, drhot_, dpres_, dens_hyd, pres_hyd, pres_hyd_ref, therm_hyd, coriolis, rtot, cvtot, cptot, dphyddx, dphyddy, element3d_operation, dx, dy, dz, sx, sy, sz, lift, lmesh, elem, lmesh2d, elem2d)
subroutine, public atm_dyn_dgm_nonhydro3d_rhot_hevi_cal_vi(dens_dt, momx_dt, momy_dt, momz_dt, rhot_dt, ddens_, momx_, momy_, momz_, drhot_, dens_hyd, pres_hyd, ddens0_, momx0_, momy0_, momz0_, drhot0_, rtot, cvtot, cptot, element3d_operation, dz, lift, impl_fac, dt, lmesh, elem, lmesh2d, elem2d)
subroutine, public atm_dyn_dgm_nonhydro3d_rhot_hevi_cal_vi_asis(dens_dt, momx_dt, momy_dt, momz_dt, rhot_dt, ddens_, momx_, momy_, momz_, drhot_, dens_hyd, pres_hyd, ddens0_, momx0_, momy0_, momz0_, drhot0_, rtot, cvtot, cptot, element3d_operation, dz, lift, impl_fac, dt, lmesh, elem, lmesh2d, elem2d)
module FElib / Fluid dyn solver / Atmosphere / Common
module FElib / Fluid dyn solver / Atmosphere / Tracer advection
subroutine, public atm_dyn_dgm_trcadvect3d_save_massflux(mflx_x_tavg, mflx_y_tavg, mflx_z_tavg, alph_dens_m, alph_dens_p, ddens, momx, momy, momz, dpres, dens_hyd, pres_hyd, rtot, cvtot, cptot, lmesh, elem, rkstage, tavg_weight_h, tavg_weight_v, is_hevi)
module FElib / Element / Base
module FElib / Element / hexahedron
module FElib / Element / line
module FElib / Element/ ModalFilter
module FElib / Element / Operation / Base
module FElib / Mesh / Local 2D
module FElib / Mesh / Local 3D
module FElib / Mesh / Local, Base
module FElib / Mesh / Base 3D
module FElib / Mesh / Cubed-sphere 3D domain
module FElib / Data / base
FElib / model framework / mesh manager.
FElib / model framework / variable manager.
Module common / sparsemat.
Module common / Runge-Kutta scheme.
A derived type useful for apply boundary conditions.
Derived type to provide a driver of dynamical core with the atmospheric nonhydrostatic equations.
Derived type representing a 2D reference element.
Derived type representing a 3D reference element.
Derived type representing an arbitrary finite element.
Derived type representing a hexahedral element.
Derived type representing a line element.
Derived type representing a modal filter.
Derived type representing a local mesh for 2D domain.
Derived type to manage a local 3D computational domain.
Derived type to manage a local computational domain (base type)
Derived type to manage a computational mesh (base type for 3D domain)
Derived type to manage a cubed-sphere 3D computational domain.
Derived type representing a field with 2D mesh.
Derived type representing a field with 3D mesh.
Derived type representing a field (base type)
Derived type to manage a sparse matrix.
Derived type to store pointer to variable data when using varlist in RK advance procedures.
Derived type to provide RK scheme.