11#include "scaleFElib.h"
20 use scale_tracer,
only: qa
64 procedure(physpreprocmodalbase_final),
public,
deferred :: final
68 PRG_VARS, QTRC_VARS, AUX_VARS, &
69 PRG_VARS0, QTRC_VARS0, AUX_VARS0 )
76 type(
meshfield3d),
intent(inout) :: PRG_VARS(PRGVAR_NUM)
77 type(
meshfield3d),
intent(inout) :: AUX_VARS(AUXVAR_NUM)
79 type(
meshfield3d),
intent(in) :: PRG_VARS0(PRGVAR_NUM)
80 type(
meshfield3d),
intent(in) :: AUX_VARS0(AUXVAR_NUM)
84 subroutine physpreprocmodalbase_final( this )
87 end subroutine physpreprocmodalbase_final
94 procedure :: final => physpreprocnone_final
95 procedure :: operate => physpreprocnone_operate
103 procedure :: init => physpreprocmodalfilter_init
104 procedure :: final => physpreprocmodalfilter_final
105 procedure :: operate => physpreprocmodalfilter_operate
114 procedure :: init => physpreprocglobalfilter_init
115 procedure :: final => physpreprocglobalfilter_final
116 procedure :: operate => physpreprocglobalfilter_operate
135 class(
meshbase3d),
intent(in),
target :: mesh3D
137 this%mesh3D => mesh3d
143 subroutine physpreprocnone_final( this )
148 end subroutine physpreprocnone_final
153 subroutine physpreprocnone_operate( this, &
154 PRG_VARS, QTRC_VARS, AUX_VARS, &
155 PRG_VARS0, QTRC_VARS0, AUX_VARS0 )
156 use scale_tracer,
only: qa
159 type(
meshfield3d),
intent(inout) :: PRG_VARS(PRGVAR_NUM)
160 type(
meshfield3d),
intent(inout) :: AUX_VARS(AUXVAR_NUM)
161 type(
meshfield3d),
intent(inout) :: QTRC_VARS(0:QA)
162 type(
meshfield3d),
intent(in) :: PRG_VARS0(PRGVAR_NUM)
163 type(
meshfield3d),
intent(in) :: AUX_VARS0(AUXVAR_NUM)
170 do n=1, this%mesh3D%LOCAL_MESH_NUM
176 this%mesh3D%lcmesh_list(n), this%mesh3D%refElem3D )
185 do n=1, this%mesh3D%LOCAL_MESH_NUM
186 call copy_data_qtrc( qtrc_vars(iq)%local(n)%val, &
188 this%mesh3D%lcmesh_list(n), this%mesh3D%refElem3D )
192 end subroutine physpreprocnone_operate
197 subroutine physpreprocmodalfilter_init( this, &
198 MF_ALPHA_h, MF_ORDER_h, MF_ALPHA_v, MF_ORDER_v, &
202 real(RP),
intent(in) :: MF_ALPHA_h
203 integer,
intent(in) :: MF_ORDER_h
204 real(RP),
intent(in) :: MF_ALPHA_v
205 integer,
intent(in) :: MF_ORDER_v
206 class(
meshbase3d),
intent(in),
target :: mesh3D
209 this%mesh3D => mesh3d
214 call this%elem_optr%Setup_ModalFilter( 0.0_rp, mf_alpha_h, mf_order_h, 0.0_rp, mf_alpha_v, mf_order_v )
215 call this%elem_optr%Setup_ModalFilter_tracer( 0.0_rp, mf_alpha_h, mf_order_h, 0.0_rp, mf_alpha_v, mf_order_v )
217 end subroutine physpreprocmodalfilter_init
221 subroutine physpreprocmodalfilter_final( this )
227 call this%mfilter%Final()
229 call this%elem_optr%Final()
230 deallocate( this%elem_optr )
232 end subroutine physpreprocmodalfilter_final
236 subroutine physpreprocmodalfilter_operate( this, &
237 PRG_VARS, QTRC_VARS, AUX_VARS, &
238 PRG_VARS0, QTRC_VARS0, AUX_VARS0 )
240 use scale_tracer,
only: qa
243 type(
meshfield3d),
intent(inout) :: PRG_VARS(PRGVAR_NUM)
244 type(
meshfield3d),
intent(inout) :: AUX_VARS(AUXVAR_NUM)
245 type(
meshfield3d),
intent(inout) :: QTRC_VARS(0:QA)
246 type(
meshfield3d),
intent(in) :: PRG_VARS0(PRGVAR_NUM)
247 type(
meshfield3d),
intent(in) :: AUX_VARS0(AUXVAR_NUM)
254 do n=1, this%mesh3D%LOCAL_MESH_NUM
255 call apply_modal_filter_core( &
260 this%elem_optr, this%mesh3D%lcmesh_list(n), this%mesh3D%refElem3D )
269 do n=1, this%mesh3D%LOCAL_MESH_NUM
270 call apply_modal_filter_qtrc_core( qtrc_vars(iq)%local(n)%val, &
272 this%elem_optr, this%mesh3D%lcmesh_list(n), this%mesh3D%refElem3D )
276 end subroutine physpreprocmodalfilter_operate
281 subroutine physpreprocglobalfilter_init( this, &
282 GLFilterOptrType, GLFilterShape, GLFilterWidthFac, &
287 character(len=*),
intent(in) :: GLFilterOptrType
288 character(len=*),
intent(in) :: GLFilterShape
289 real(RP),
intent(in) :: GLFilterWidthFac
290 integer,
intent(in) :: Nnode_h1D_reconst
291 class(
meshbase3d),
intent(in),
target :: mesh3D
294 character(len=H_SHORT) :: varname
297 this%mesh3D => mesh3d
299 call this%gFilter_prgvar%Init( glfilteroptrtype, glfiltershape, glfilterwidthfac, nnode_h1d_reconst, &
301 call this%gFilter_trcvar%Init( glfilteroptrtype, glfiltershape, glfilterwidthfac, nnode_h1d_reconst, &
302 max(1,qa), 0, 0, mesh3d )
304 allocate( this%RHOQ(0:qa) )
306 write(varname,
'(a,I2.2)')
'RHOQ', iq
307 call this%RHOQ(iq)%Init( trim(varname),
"kg/m3", mesh3d )
310 end subroutine physpreprocglobalfilter_init
314 subroutine physpreprocglobalfilter_final( this )
321 call this%gFilter_prgvar%Final()
322 call this%gFilter_trcvar%Final()
325 call this%RHOQ(iq)%Final()
327 deallocate( this%RHOQ )
329 end subroutine physpreprocglobalfilter_final
333 subroutine physpreprocglobalfilter_operate( this, &
334 PRG_VARS, QTRC_VARS, AUX_VARS, &
335 PRG_VARS0, QTRC_VARS0, AUX_VARS0 )
337 use scale_tracer,
only: qa
340 type(
meshfield3d),
intent(inout) :: PRG_VARS(PRGVAR_NUM)
341 type(
meshfield3d),
intent(inout) :: AUX_VARS(AUXVAR_NUM)
342 type(
meshfield3d),
intent(inout) :: QTRC_VARS(0:QA)
343 type(
meshfield3d),
intent(in) :: PRG_VARS0(PRGVAR_NUM)
344 type(
meshfield3d),
intent(in) :: AUX_VARS0(AUXVAR_NUM)
351 do n=1, this%mesh3D%LOCAL_MESH_NUM
357 this%mesh3D%lcmesh_list(n), this%mesh3D%refElem3D )
360 call this%gFilter_prgvar%Apply( prg_vars, this%mesh3D )
368 do n=1, this%mesh3D%LOCAL_MESH_NUM
369 call calc_data_rhoq( this%RHOQ(iq)%local(n)%val, &
371 this%mesh3D%lcmesh_list(n), this%mesh3D%refElem3D )
375 call this%gFilter_trcvar%Apply( this%RHOQ(iqs:qa), this%mesh3D )
378 do n=1, this%mesh3D%LOCAL_MESH_NUM
379 call calc_data_rhoq2qtrc( qtrc_vars(iq)%local(n)%val, &
381 this%mesh3D%lcmesh_list(n), this%mesh3D%refElem3D )
386 end subroutine physpreprocglobalfilter_operate
390 subroutine copy_data( &
391 DDENS, MOMX, MOMY, MOMZ, THERM, DENS_hyd, PRES_hyd, &
392 DDENS0, MOMX0, MOMY0, MOMZ0, THERM0, DENS_hyd0, PRES_hyd0, &
397 real(RP),
intent(out) :: DDENS(elem%Np,lmesh%NeA)
398 real(RP),
intent(out) :: MOMX(elem%Np,lmesh%NeA)
399 real(RP),
intent(out) :: MOMY(elem%Np,lmesh%NeA)
400 real(RP),
intent(out) :: MOMZ(elem%Np,lmesh%NeA)
401 real(RP),
intent(out) :: THERM(elem%Np,lmesh%NeA)
402 real(RP),
intent(out) :: DENS_hyd(elem%Np,lmesh%NeA)
403 real(RP),
intent(out) :: PRES_hyd(elem%Np,lmesh%NeA)
404 real(RP),
intent(in) :: DDENS0(elem%Np,lmesh%NeA)
405 real(RP),
intent(in) :: MOMX0(elem%Np,lmesh%NeA)
406 real(RP),
intent(in) :: MOMY0(elem%Np,lmesh%NeA)
407 real(RP),
intent(in) :: MOMZ0(elem%Np,lmesh%NeA)
408 real(RP),
intent(in) :: THERM0(elem%Np,lmesh%NeA)
409 real(RP),
intent(in) :: DENS_hyd0(elem%Np,lmesh%NeA)
410 real(RP),
intent(in) :: PRES_hyd0(elem%Np,lmesh%NeA)
416 do ke=lmesh%NeS, lmesh%NeE
417 ddens(:,ke) = ddens0(:,ke)
418 momx(:,ke) = momx0(:,ke)
419 momy(:,ke) = momy0(:,ke)
420 momz(:,ke) = momz0(:,ke)
421 therm(:,ke) = therm0(:,ke)
423 dens_hyd(:,ke) = dens_hyd0(:,ke)
424 pres_hyd(:,ke) = pres_hyd0(:,ke)
427 end subroutine copy_data
429 subroutine copy_data_qtrc( QTRC, &
430 QTRC0, DENS_hyd, DDENS, &
435 real(RP),
intent(inout) :: QTRC(elem%Np,lmesh%NeA)
436 real(RP),
intent(in) :: QTRC0(elem%Np,lmesh%NeA)
437 real(RP),
intent(in) :: DENS_hyd(elem%Np,lmesh%NeA)
438 real(RP),
intent(in) :: DDENS(elem%Np,lmesh%NeA)
444 do ke=lmesh%NeS, lmesh%NeE
445 qtrc(:,ke) = qtrc0(:,ke)
448 end subroutine copy_data_qtrc
451 subroutine calc_data_rhoq( RHOQ, &
452 QTRC0, DENS_hyd, DDENS0, &
457 real(RP),
intent(inout) :: RHOQ(elem%Np,lmesh%NeA)
458 real(RP),
intent(in) :: QTRC0(elem%Np,lmesh%NeA)
459 real(RP),
intent(in) :: DENS_hyd(elem%Np,lmesh%NeA)
460 real(RP),
intent(in) :: DDENS0(elem%Np,lmesh%NeA)
466 do ke=lmesh%NeS, lmesh%NeE
467 rhoq(:,ke) = qtrc0(:,ke) * ( ddens0(:,ke) + dens_hyd(:,ke) )
470 end subroutine calc_data_rhoq
473 subroutine calc_data_rhoq2qtrc( QTRC, &
474 RHOQ0, DENS_hyd, DDENS0, &
479 real(RP),
intent(inout) :: QTRC(elem%Np,lmesh%NeA)
480 real(RP),
intent(in) :: RHOQ0(elem%Np,lmesh%NeA)
481 real(RP),
intent(in) :: DENS_hyd(elem%Np,lmesh%NeA)
482 real(RP),
intent(in) :: DDENS0(elem%Np,lmesh%NeA)
488 do ke=lmesh%NeS, lmesh%NeE
489 qtrc(:,ke) = rhoq0(:,ke) / ( ddens0(:,ke) + dens_hyd(:,ke) )
492 end subroutine calc_data_rhoq2qtrc
496 subroutine apply_modal_filter_core( &
497 DDENS, MOMX, MOMY, MOMZ, THERM, DENS_hyd, PRES_hyd, &
498 DDENS0, MOMX0, MOMY0, MOMZ0, THERM0, DENS_hyd0, PRES_hyd0, &
499 elem_optr, lmesh, elem )
505 real(RP),
intent(out) :: DDENS(elem%Np,lmesh%NeA)
506 real(RP),
intent(out) :: MOMX(elem%Np,lmesh%NeA)
507 real(RP),
intent(out) :: MOMY(elem%Np,lmesh%NeA)
508 real(RP),
intent(out) :: MOMZ(elem%Np,lmesh%NeA)
509 real(RP),
intent(out) :: THERM(elem%Np,lmesh%NeA)
510 real(RP),
intent(out) :: DENS_hyd(elem%Np,lmesh%NeA)
511 real(RP),
intent(out) :: PRES_hyd(elem%Np,lmesh%NeA)
512 real(RP),
intent(in) :: DDENS0(elem%Np,lmesh%NeA)
513 real(RP),
intent(in) :: MOMX0(elem%Np,lmesh%NeA)
514 real(RP),
intent(in) :: MOMY0(elem%Np,lmesh%NeA)
515 real(RP),
intent(in) :: MOMZ0(elem%Np,lmesh%NeA)
516 real(RP),
intent(in) :: THERM0(elem%Np,lmesh%NeA)
517 real(RP),
intent(in) :: DENS_hyd0(elem%Np,lmesh%NeA)
518 real(RP),
intent(in) :: PRES_hyd0(elem%Np,lmesh%NeA)
525 do ke=lmesh%NeS, lmesh%NeE
526 ddens(:,ke) = ddens0(:,ke)
527 momx(:,ke) = momx0(:,ke)
528 momy(:,ke) = momy0(:,ke)
529 momz(:,ke) = momz0(:,ke)
530 therm(:,ke) = therm0(:,ke)
532 dens_hyd(:,ke) = dens_hyd0(:,ke)
533 pres_hyd(:,ke) = pres_hyd0(:,ke)
536 lmesh, elem, elem_optr, .true. )
538 end subroutine apply_modal_filter_core
541 subroutine apply_modal_filter_qtrc_core( QTRC, &
542 QTRC0, DENS_hyd, DDENS, &
543 elem_optr, lmesh, elem )
549 real(RP),
intent(inout) :: QTRC(elem%Np,lmesh%NeA)
550 real(RP),
intent(in) :: QTRC0(elem%Np,lmesh%NeA)
551 real(RP),
intent(in) :: DENS_hyd(elem%Np,lmesh%NeA)
552 real(RP),
intent(in) :: DDENS(elem%Np,lmesh%NeA)
559 do ke=lmesh%NeS, lmesh%NeE
560 qtrc(:,ke) = qtrc0(:,ke)
563 dens_hyd, ddens, ddens, lmesh, elem, elem_optr )
565 end subroutine apply_modal_filter_qtrc_core
module Atmosphere / Physics / Preprocessing
subroutine physpreprocnone_init(this, mesh3d)
Initialize an object to represent no preprocessing operation before evaluating physics tendencies.
module FElib / Fluid dyn solver / Atmosphere / Common / Modal filter
subroutine, public atm_dyn_dgm_tracer_modalfilter_apply(qtrc_, dens_hyd_, ddens0_, ddens_, lmesh, elem, elem_operation)
Apply a modal filtering to tracer variables.
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 / Nonhydrostatic model / Common
integer, parameter, public phytend_momz_id
integer, parameter, public prgvar_momy_id
integer, parameter, public auxvar_cptot_id
integer, parameter, public prgvar_therm_id
integer, parameter, public auxvar_qdry_id
integer, parameter, public auxvar_cvtot_id
integer, parameter, public prgvar_ddens_id
integer, parameter, public prgvar_momz_id
integer, parameter, public phytend_rhot_id
integer, parameter, public phytend_momx_id
integer, parameter, public phytend_num
integer, parameter, public phytend_momy_id
integer, parameter, public prgvar_momx_id
integer, parameter, public auxvar_num
integer, parameter, public auxvar_pt_id
integer, parameter, public prgvar_num
integer, parameter, public phytend_rhoh_id
integer, parameter, public auxvar_preshydro_id
integer, parameter, public auxvar_thermhydro_id
integer, parameter, public auxvar_denshydro_id
integer, parameter, public phytend_dens_id
integer, parameter, public auxvar_rtot_id
integer, parameter, public auxvar_preshydro_ref_id
integer, parameter, public auxvar_pres_id
module FElib / Element / Base
module FElib / Element / hexahedron
module FElib / Element/ ModalFilter
module FElib / Element / Operation with 3D tensor product elements for GPU
subroutine, public elementoperationtensorprod3d_create(elem3d, obj)
Factory subroutine to create an object of ElementOperationTensorProd3D.
module FElib / Mesh / Local 2D
module FElib / Mesh / Local 3D
module FElib / Data / base
module FElib / Mesh / Base 2D
module FElib / Mesh / Base 3D
module FElib / Data / base
module FElib / Data / Filter operation
Base type for preprocessing operations for variables before evaluating physics tendencies.
Derived type to represent quasi-global filtering operation for variables before evaluating physics te...
Derived type to represent modal filtering operation for variables before evaluating physics tendencie...
Derived type to represent no preprocessing operation for variables before evaluating physics tendenci...
Derived type representing a 2D reference element.
Derived type representing a 3D reference element.
Derived type representing a hexahedral element.
Derived type representing a modal filter.
Derived type for elementwise operations with 3D tensor product elements.
Derived type representing a local mesh for 2D domain.
Derived type to manage a local 3D computational domain.
Derived type representing a field with local mesh (base type)
Derived type to manage a computational mesh (base type for 2D domain)
Derived type to manage a computational mesh (base type for 3D domain)
Derived type representing a field with 2D mesh.
Derived type representing a field with 3D mesh.
Derived type to represent filter operation for 3D mesh field.