FE-Project
Loading...
Searching...
No Matches
scale_atm_dyn_dgm_driver_trcadv3d.F90
Go to the documentation of this file.
1!-------------------------------------------------------------------------------
2!> module FElib / Fluid dyn solver / Atmosphere / DGM driver (tracer advection)
3!!
4!! @par Description
5!! Driver module for tracer advection 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 use scale_tracer, only: qa
27
29 use scale_sparsemat, only: sparsemat
30
35 use scale_element_base, only: &
39
40 use scale_meshfield_base, only: &
42 use scale_localmeshfield_base, only: &
44
45 use scale_element_modalfilter, only: &
47
48 use scale_model_var_manager, only: &
49 modelvarmanager, variableinfo
51
54
56 prgvar_num, &
57 dens_vid => prgvar_ddens_id, therm_vid => prgvar_therm_id,&
58 momx_vid => prgvar_momx_id, momy_vid => prgvar_momy_id, &
59 momz_vid => prgvar_momz_id, &
60 auxvar_num, &
61 preshyd_vid => auxvar_preshydro_id, denshyd_vid => auxvar_denshydro_id, &
62 cptot_vid => auxvar_cptot_id, cvtot_vid => auxvar_cvtot_id, rtot_vid => auxvar_rtot_id, &
63 pres_vid => auxvar_pres_id, &
64 phytend_num1 => phytend_num
65
67
76
79
80 !-----------------------------------------------------------------------------
81 implicit none
82 private
83 !-----------------------------------------------------------------------------
84 !
85 !++ Public type & procedure
86 !
87
89 integer :: eqs_typeid
90 logical :: only_traceradv_flag
91 type(sparsemat) :: faceintmat
92
93 ! Limiter
94 logical :: disable_limiter
95 type(meshfield3d) :: alphadensm, alphadensp ! coeffcient with stabilizion terms in numerical flux (element boundary data)
96
97 !
98 type(meshfield3d), allocatable :: trcvars3d(:)
99 type(modelvarmanager) :: trcvar3d_manager
100 integer :: trcvar3d_commid
101
102 type(meshfield3d), allocatable :: aux_trcvars3d(:)
103 type(modelvarmanager) :: auxtrcvar3d_manager
104 integer :: auxtrcvar3d_commid
105
106 type(meshfield3d), allocatable :: auxtrc_flux_vars3d(:)
107 type(modelvarmanager) :: auxtrc_flux_var3d_manager
108 integer :: auxtrc_flux_var3d_commid
109
110 ! element-wise modal filter
111 logical :: modalfilter_flag
112 type(modalfilter) :: modal_filter_3d
113
114 ! boundary_condition
115 type(atmdynbnd), pointer :: boundary_cond
116
117 contains
118 procedure :: init => atmdyndgmdriver_trcadv3d_init
119 procedure :: final => atmdyndgmdriver_trcadv3d_final
120 procedure :: update => atmdyndgmdriver_trcadv3d_update
122
123 !-----------------------------------------------------------------------------
124 !
125 !++ Public procedures
126 !
127 !-----------------------------------------------------------------------------
128 !
129 !++ Public parameters & variables
130 !
131 integer, public, parameter :: eqs_typeid_trcadv3d_heve = 1
132
133 !-
134 integer, public, parameter :: auxtrcvars3d_num = 1
135 integer, public, parameter :: auxtrcvars3d_fctcoef_id = 1
136
137 type(variableinfo), public :: atmos_dyn_auxtrcvars3d_vinfo(auxtrcvars3d_num)
139 variableinfo( auxtrcvars3d_fctcoef_id, 'TRCADV_FCTCOEF', '', &
140 '1', 3, 'XYZ', '' ) /
141
142 !-
143 integer, public, parameter :: trcvars3d_num = 3
144 integer, public, parameter :: trcvars3d_trcadv_id = 1
145 integer, public, parameter :: trcvars3d_dens_id = 2
146 integer, public, parameter :: trcvars3d_dens0_id = 3
147
148 type(variableinfo), public :: atmos_dyn_trcvars3d_vinfo(trcvars3d_num)
150 variableinfo( trcvars3d_trcadv_id, 'TRCADV', '', '1', 3, 'XYZ', '' ), &
151 variableinfo( trcvars3d_dens_id , 'DENS', '', 'kg/m3', 3, 'XYZ', '' ), &
152 variableinfo( trcvars3d_dens0_id , 'DENS0', '', 'kg/m3', 3, 'XYZ', '' ) /
153
154 !-
155 integer, public, parameter :: mass_flux_num = 3
156 integer, public, parameter :: massflx_z_id = 1
157 integer, public, parameter :: massflx_x_id = 2
158 integer, public, parameter :: massflx_y_id = 3
159
160 type(variableinfo), public :: atmos_dyn_mass_flux_vinfo(mass_flux_num)
162 variableinfo( massflx_z_id, 'MASSFLX_Z', 'flux in z-direction', &
163 'kg/s/m2', 3, 'XYZ', '' ), &
164 variableinfo( massflx_x_id, 'MASSFLX_X', 'flux in x-direction', &
165 'kg/s/m2', 3, 'XYZ', '' ), &
166 variableinfo( massflx_y_id, 'MASSFLX_Y', 'flux in y-direction', &
167 'kg/s/m2', 3, 'XYZ', '' ) /
168
169 !-----------------------------------------------------------------------------
170 !
171 !++ Private procedures & variables
172 !
173 !-------------------
174
175 private :: setup_modalfilter
176
177contains
178!OCL SERIAL
179 subroutine atmdyndgmdriver_trcadv3d_init( this, &
180 eqs_type_name, tint_type_name, dtsec, &
181 modal_filter_flag, disable_limiter, &
182 model_mesh3D, boundary_cond, ONLY_TRACERADV_FLAG )
183
185 implicit none
186
187 class(atmdyndgmdriver_trcadv3d), intent(inout) :: this
188 character(len=*), intent(in) :: eqs_type_name
189 character(len=*), intent(in) :: tint_type_name
190 real(dp), intent(in) :: dtsec
191 logical, intent(in) :: modal_filter_flag
192 logical, intent(in) :: disable_limiter
193 class(modelmesh3d), intent(inout), target :: model_mesh3d
194 class(atmdynbnd), intent(in), target :: boundary_cond
195 logical, intent(in) :: only_traceradv_flag
196
197 class(meshbase3d), pointer :: mesh3d
198 class(hexahedralelement), pointer :: refelem3d
199 class(elementbase), pointer :: refelem
200
201 integer :: iv
202 integer :: ldomid
203 !-----------------------------------------------------------------------------
204
205 mesh3d => model_mesh3d%ptr_mesh
206
207 call atmdyndgmdriver_base3d_init( this, &
208 1, &
209 tint_type_name, dtsec, &
210 mesh3d )
211
212 select case(eqs_type_name)
213 !-- HEVE ------------------
214 case("TRCADV3D_HEVE")
215 case default
216 log_error("AtmDynDGMDriver_trcadv3d_Init",*) 'Invalid EQS_TYPE in namelist PARAM_ATMOS_DYN. Check!'
217 call prc_abort
218 end select
219
220 this%ONLY_TRACERADV_FLAG = only_traceradv_flag
221 this%disable_limiter = disable_limiter
222
223 !- Initialize a module for tracer equations
224 call atm_dyn_dgm_trcadvect3d_heve_init( mesh3d, this%FaceIntMat )
225
226
227 !- Initialize 3D auxiliary variables for tracer advection
228
229 call this%TRCVAR3D_manager%Init()
230 allocate( this%TRCVARS3D(trcvars3d_num) )
231
232 do iv = 1, trcvars3d_num
233 call this%TRCVAR3D_manager%Regist( &
234 atmos_dyn_trcvars3d_vinfo(iv), mesh3d, & ! (in)
235 this%TRCVARS3D(iv), & ! (inout)
236 .false., fill_zero=.true. ) ! (in)
237 end do
238
240 call model_mesh3d%Create_communicator( &
241 1, 0, 0, & ! (in)
242 this%TRCVAR3D_manager, & ! (in)
243 this%TRCVARS3D(iv:iv), & ! (in)
244 this%TRCVAR3D_commid ) ! (out)
245
246 !- Initialize variables to store time-averaged 3D mass flux
247
248 call this%AUXTRC_FLUX_VAR3D_manager%Init()
249 allocate( this%AUXTRC_FLUX_VARS3D(mass_flux_num) )
250
251 do iv = 1, mass_flux_num
252 call this%AUXTRC_FLUX_VAR3D_manager%Regist( &
253 atmos_dyn_mass_flux_vinfo(iv), mesh3d, & ! (in)
254 this%AUXTRC_FLUX_VARS3D(iv), & ! (inout)
255 .false., fill_zero=.true. ) ! (in)
256 end do
257
258 call model_mesh3d%Create_communicator( &
259 1, 1, 0, & ! (in)
260 this%AUXTRC_FLUX_VAR3D_manager, & ! (in)
261 this%AUXTRC_FLUX_VARS3D(:), & ! (in)
262 this%AUXTRC_FLUX_VAR3D_commid ) ! (out)
263
264 !- Initialize 3D auxiliary variables for preserving nonnegativity in tracer advection
265
266 call this%AUXTRCVAR3D_manager%Init()
267 allocate( this%AUX_TRCVARS3D(auxtrcvars3d_num) )
268
269 do iv = 1, auxtrcvars3d_num
270 call this%AUXTRCVAR3D_manager%Regist( &
271 atmos_dyn_auxtrcvars3d_vinfo(iv), mesh3d, & ! (in)
272 this%AUX_TRCVARS3D(iv), & ! (inout)
273 .false., fill_zero=.true. ) ! (in)
274 end do
275
276 call model_mesh3d%Create_communicator( &
277 1, 0, 0, & ! (in)
278 this%AUXTRCVAR3D_manager, & ! (in)
279 this%AUX_TRCVARS3D(:), & ! (in)
280 this%AUXTRCVAR3D_commid ) ! (out)
281
282 !-
283
284 call this%alphaDensM%Init( "alphaDensM", "kg/m3.m/s", mesh3d, local_meshfield_type_nodes_faceval )
285 call this%alphaDensP%Init( "alphaDensP", "kg/m3.m/s", mesh3d, local_meshfield_type_nodes_faceval )
286 !$omp parallel do
287 do ldomid=1, mesh3d%LOCAL_MESH_NUM
288 this%alphaDensM%local(ldomid)%face_val(:,:) = 0.0_rp
289 this%alphaDensP%local(ldomid)%face_val(:,:) = 0.0_rp
290 end do
291
292 !- initialize an object to manage boundary conditions
293 this%boundary_cond => boundary_cond
294
295
296 !- initialize an object to manage modal filter
297 this%MODALFILTER_FLAG = modal_filter_flag
298 if (this%MODALFILTER_FLAG) then
299 refelem => mesh3d%refElem
300 select type(refelem)
301 class is (hexahedralelement)
302 refelem3d => refelem
303 end select
304
305 call setup_modalfilter( this, refelem3d, model_mesh3d%element3D_operation )
306 end if
307
308 return
309 end subroutine atmdyndgmdriver_trcadv3d_init
310
311!OCL SERIAL
312 subroutine atmdyndgmdriver_trcadv3d_update( this, &
313 TRC_VARS, PROG_VARS, AUX_VARS, PHYTENDS, &
314 element_operation, &
315 Dx, Dy, Dz, Sx, Sy, Sz, Lift, mesh3D, &
316 dyn_driver )
317
318 use scale_tracer, only: &
319 tracer_advc, tracer_name
322 implicit none
323
324 class(atmdyndgmdriver_trcadv3d), intent(inout) :: this
325 class(meshbase3d), intent(in), target :: mesh3d
326 class(modelvarmanager), intent(inout) :: trc_vars
327 class(modelvarmanager), intent(inout) :: prog_vars
328 class(modelvarmanager), intent(inout) :: aux_vars
329 class(modelvarmanager), intent(inout) :: phytends
330 class(elementoperationbase3d), intent(in) :: element_operation
331 type(sparsemat), intent(in) :: dx, dy, dz
332 type(sparsemat), intent(in) :: sx, sy, sz
333 type(sparsemat), intent(in) :: lift
334 class(atmdyndgmdriver_nonhydro3d), intent(inout) :: dyn_driver
335
336 integer :: rkstage
337 integer :: tintbuf_ind
338 real(rp) :: dt
339 real(rp) :: dttmp_trc
340
341 class(localmesh3d), pointer :: lcmesh3d
342 integer :: n
343 integer :: ke
344
345 class(meshfield3d), pointer :: ddens, momx, momy, momz, therm
346 class(meshfield3d), pointer :: dens_hyd, pres_hyd, rtot, cvtot, cptot, pres
347 class(meshfield3d), pointer :: qtrc, rhoq_tp
348
349 class(meshfield3d), pointer :: qtrc_tmp, ddens_trc, ddens0_trc
350 class(meshfield3d), pointer :: mflx_x_tavg, mflx_y_tavg, mflx_z_tavg
351
352 integer :: iq
353 !-----------------------------------------------------------------------------
354
355 !-- prepairation
356
357 call prof_rapstart( 'ATM_DYN_trc_update_pre', 2)
358 call prog_vars%Get3D(dens_vid , ddens)
359 call prog_vars%Get3D(therm_vid, therm)
360
361 call aux_vars%Get3D( preshyd_vid, pres_hyd )
362 call aux_vars%Get3D( denshyd_vid, dens_hyd )
363 call aux_vars%Get3D( pres_vid, pres )
364 call aux_vars%Get3D( rtot_vid, rtot )
365 call aux_vars%Get3D( cvtot_vid, cvtot )
366 call aux_vars%Get3D( cptot_vid, cptot )
367
368 call this%TRCVAR3D_manager%Get3D( trcvars3d_trcadv_id, qtrc_tmp )
369 call this%TRCVAR3D_manager%Get3D( trcvars3d_dens_id, ddens_trc )
370 call this%TRCVAR3D_manager%Get3D( trcvars3d_dens0_id, ddens0_trc )
371
372 call this%AUXTRC_FLUX_VAR3D_manager%Get3D( massflx_z_id, mflx_z_tavg )
373 call this%AUXTRC_FLUX_VAR3D_manager%Get3D( massflx_x_id, mflx_x_tavg )
374 call this%AUXTRC_FLUX_VAR3D_manager%Get3D( massflx_y_id, mflx_y_tavg )
375
376 if ( this%ONLY_TRACERADV_FLAG ) then
377 call prog_vars%Get3D(momz_vid , momz)
378 call prog_vars%Get3D(momx_vid , momx)
379 call prog_vars%Get3D(momy_vid , momy)
380
381 do n=1, mesh3d%LOCAL_MESH_NUM
382 lcmesh3d => mesh3d%lcmesh_list(n)
383
384 !$omp parallel do
385 do ke=lcmesh3d%NeS, lcmesh3d%NeE
386 ddens0_trc %local(n)%val(:,ke) = ddens%local(n)%val(:,ke)
387 ddens_trc %local(n)%val(:,ke) = ddens%local(n)%val(:,ke)
388 mflx_z_tavg%local(n)%val(:,ke) = momz%local(n)%val(:,ke)
389 mflx_x_tavg%local(n)%val(:,ke) = momx%local(n)%val(:,ke)
390 mflx_y_tavg%local(n)%val(:,ke) = momy%local(n)%val(:,ke)
391 end do
393 this%alphaDensM%local(n)%face_val, this%alphaDensP%local(n)%face_val, & ! (inout)
394 ddens%local(n)%val, momx%local(n)%val, momy%local(n)%val, momz%local(n)%val, & ! (in)
395 dens_hyd%local(n)%val, & ! (in)
396 lcmesh3d%Gsqrt, & ! (in)
397 lcmesh3d%normal_fn(:,:,1), lcmesh3d%normal_fn(:,:,2), lcmesh3d%normal_fn(:,:,3), & ! (in)
398 lcmesh3d%VMapM, lcmesh3d%VMapP, lcmesh3d, lcmesh3d%refElem3D ) ! (in)
399 end do
400 end if
401
402 !* Exchange halo data of mass flux
403
404 call prof_rapstart( 'ATM_DYN_exchange_mflx', 3)
405 call this%AUXTRC_FLUX_VAR3D_manager%MeshFieldComm_Exchange()
406 call prof_rapend( 'ATM_DYN_exchange_mflx', 3)
407
408 call prof_rapstart( 'ATM_DYN_applyBC_mflux', 3)
409 do n=1, mesh3d%LOCAL_MESH_NUM
410 lcmesh3d => mesh3d%lcmesh_list(n)
411
412 call this%boundary_cond%ApplyBC_PROGVARS_lc( n, & ! (in)
413 ddens_trc%local(n)%val(:,:), mflx_x_tavg%local(n)%val, mflx_y_tavg%local(n)%val, mflx_z_tavg%local(n)%val, therm%local(n)%val, & ! (inout)
414 dens_hyd%local(n)%val, pres_hyd%local(n)%val, & ! (in)
415 lcmesh3d%Gsqrt(:,:), lcmesh3d%GsqrtH(:,:), lcmesh3d%GIJ(:,:,1,1), lcmesh3d%GIJ(:,:,1,2), lcmesh3d%GIJ(:,:,2,2), & ! (in)
416 lcmesh3d%GI3(:,:,1), lcmesh3d%GI3(:,:,2), & ! (in)
417 lcmesh3d%normal_fn(:,:,1), lcmesh3d%normal_fn(:,:,2), lcmesh3d%normal_fn(:,:,3), & ! (in)
418 lcmesh3d%vmapM, lcmesh3d%vmapP, lcmesh3d%vmapB, lcmesh3d, lcmesh3d%refElem3D, lcmesh3d%lcmesh2D, lcmesh3d%lcmesh2D%refElem2D ) ! (in)
419 end do
420 call prof_rapend( 'ATM_DYN_applyBC_mflux', 3)
421
422 call prof_rapend( 'ATM_DYN_trc_update_pre', 2)
423
424 !-- Tracer advection ------------------------------------------------
425
426 call prof_rapstart( 'ATM_DYN_trc_update', 2)
427
428 do iq = 1, qa
429
430 call trc_vars%Get3D( iq, qtrc )
431 call phytends%Get3D( phytend_num1 + iq, rhoq_tp )
432
433 do n=1, mesh3d%LOCAL_MESH_NUM
434 lcmesh3d => mesh3d%lcmesh_list(n)
435
436 !$omp parallel do
437 do ke=lcmesh3d%NeS, lcmesh3d%NeE
438 qtrc_tmp%local(n)%val(:,ke) = qtrc%local(n)%val(:,ke)
439 end do
440 end do
441
442 do rkstage=1, this%tint(1)%nstage
443 if ( tracer_advc(iq) ) then
444 call prof_rapstart( 'ATM_DYN_exchange_trc', 3)
445 call this%TRCVAR3D_manager%MeshFieldComm_Exchange()
446 call prof_rapend( 'ATM_DYN_exchange_trc', 3)
447
448
449 do n=1, mesh3d%LOCAL_MESH_NUM
450 lcmesh3d => mesh3d%lcmesh_list(n)
451
452 dt = this%tint(n)%Get_deltime()
453 dttmp_trc = dt * this%tint(n)%coef_gam_ex(rkstage+1,rkstage) &
454 / this%tint(n)%coef_sig_ex(rkstage+1,rkstage)
455
457 this%AUX_TRCVARS3D(auxtrcvars3d_fctcoef_id)%local(n)%val, & ! (out)
458 qtrc_tmp%local(n)%val, & ! (in)
459 mflx_x_tavg%local(n)%val, mflx_y_tavg%local(n)%val, mflx_z_tavg%local(n)%val, & ! (in)
460 rhoq_tp%local(n)%val, & ! (in)
461 this%alphaDensM%local(n)%face_val, this%alphaDensP%local(n)%face_val, & ! (in)
462 dens_hyd%local(n)%val, ddens_trc%local(n)%val, ddens0_trc%local(n)%val, & ! (in)
463 this%tint(n)%coef_c_ex(rkstage), dttmp_trc, & ! (in)
464 this%FaceIntMat, & ! (in)
465 lcmesh3d, lcmesh3d%refElem3D, lcmesh3d%lcmesh2D, lcmesh3d%lcmesh2D%refElem2D, & ! (in)
466 this%disable_limiter ) ! (in)
467 end do
468
469 call prof_rapstart( 'ATM_DYN_exchange_trc', 3)
470 call this%AUXTRCVAR3D_manager%MeshFieldComm_Exchange()
471 call prof_rapend( 'ATM_DYN_exchange_trc', 3)
472 end if
473
474 do n=1, mesh3d%LOCAL_MESH_NUM
475 lcmesh3d => mesh3d%lcmesh_list(n)
476
477 tintbuf_ind = this%tint(n)%tend_buf_indmap(rkstage)
478
479 call prof_rapstart( 'ATM_DYN_update_caltend_ex_trc', 3)
480 if ( tracer_advc(iq) ) then
482 this%tint(n)%tend_buf2D_ex(:,:,1,tintbuf_ind), & ! (out)
483 qtrc_tmp%local(n)%val, & ! (in)
484 mflx_x_tavg%local(n)%val, mflx_y_tavg%local(n)%val, mflx_z_tavg%local(n)%val, & ! (in)
485 this%alphaDensM%local(n)%face_val, this%alphaDensP%local(n)%face_val, & ! (in)
486 this%AUX_TRCVARS3D(auxtrcvars3d_fctcoef_id)%local(n)%val, & ! (out)
487 rhoq_tp%local(n)%val, & ! (in)
488 element_operation, this%FaceIntMat, & ! (in)
489 lcmesh3d, lcmesh3d%refElem3D, lcmesh3d%lcmesh2D, lcmesh3d%lcmesh2D%refElem2D ) ! (in)
490 else
491 !$omp parallel do
492 do ke=lcmesh3d%NeS, lcmesh3d%NeE
493 this%tint(n)%tend_buf2D_ex(:,ke,1,tintbuf_ind) = rhoq_tp%local(n)%val(:,ke)
494 end do
495 end if
496 call prof_rapend( 'ATM_DYN_update_caltend_ex_trc', 3)
497
498 call prof_rapstart( 'ATM_DYN_update_advance_trc', 3)
499 call this%tint(n)%Advance_trcvar( &
500 rkstage, qtrc_tmp%local(n)%val, 1, &
501 1, lcmesh3d%refElem%Np, lcmesh3d%NeS, lcmesh3d%NeE, &
502 ddens_trc%local(n)%val, ddens0_trc%local(n)%val, dens_hyd%local(n)%val )
503 call prof_rapend( 'ATM_DYN_update_advance_trc', 3)
504
505 if ( rkstage == this%tint(1)%nstage .and. this%MODALFILTER_FLAG ) then
506 call prof_rapstart( 'ATM_DYN_update_qtrc_modalfilter', 3)
508 qtrc_tmp%local(n)%val, & ! (inout)
509 dens_hyd%local(n)%val, ddens_trc%local(n)%val, ddens%local(n)%val, & ! (in)
510 lcmesh3d, lcmesh3d%refElem3D, element_operation ) ! (in)
511 call prof_rapend( 'ATM_DYN_update_qtrc_modalfilter', 3)
512 end if
513
514 if ( tracer_advc(iq) &
515 .and. rkstage == this%tint(1)%nstage &
516 .and. this%ONLY_TRACERADV_FLAG &
517 .and. ( .not. this%disable_limiter ) ) then
518
519 call prof_rapstart( 'ATM_DYN_update_trc_TMAR', 3)
521 qtrc_tmp%local(n)%val, & ! (inout)
522 dens_hyd%local(n)%val, ddens_trc%local(n)%val, & ! (in)
523 lcmesh3d, lcmesh3d%refElem3D, lcmesh3d%lcmesh2D, lcmesh3d%lcmesh2D%refElem2D ) ! (in)
524 call prof_rapend( 'ATM_DYN_update_trc_TMAR', 3)
525 end if
526
527 end do
528 end do ! end for RK loop
529
530 do n=1, mesh3d%LOCAL_MESH_NUM
531 lcmesh3d => mesh3d%lcmesh_list(n)
532 !$omp parallel do
533 do ke=lcmesh3d%NeS, lcmesh3d%NeE
534 qtrc%local(n)%val(:,ke) = ( dens_hyd%local(n)%val(:,ke) + ddens_trc%local(n)%val(:,ke) ) &
535 / ( dens_hyd%local(n)%val(:,ke) + ddens%local(n)%val(:,ke) ) &
536 * qtrc_tmp%local(n)%val(:,ke)
537 end do
538 end do
539
540 end do ! end do for iq
541
542 ! Update pressure
543 call update_pressure_specific_heat( pres, rtot, cvtot, cptot, & ! (inout)
544 trc_vars, prog_vars, aux_vars, dyn_driver, mesh3d ) ! (in)
545
546 ! Negative fixer
547 if ( .not. this%disable_limiter &
548 .and. ( .not. this%ONLY_TRACERADV_FLAG ) ) then
549
550 call prof_rapstart( 'ATM_DYN_trc_negative_fixer', 2)
551 call fix_negative_val( &
552 trc_vars, ddens, therm, pres, cvtot, cptot, rtot, & ! (inout)
553 dens_hyd, pres_hyd, dt, mesh3d, dyn_driver%Is_THERMVAR_RHOT() ) ! (in)
554 call prof_rapend( 'ATM_DYN_trc_negative_fixer', 2)
555 end if
556
557 call prof_rapend( 'ATM_DYN_trc_update', 2)
558
559 return
560 end subroutine atmdyndgmdriver_trcadv3d_update
561
562!OCL SERIAL
563 subroutine atmdyndgmdriver_trcadv3d_final( this )
564 implicit none
565
566 class(atmdyndgmdriver_trcadv3d), intent(inout) :: this
567 !-----------------------------------------------------------------------------
568
570
571 nullify( this%boundary_cond )
572
573 call this%TRCVAR3D_manager%Final()
574 deallocate( this%TRCVARS3D )
575
576 call this%AUXTRCVAR3D_manager%Final()
577 deallocate( this%AUX_TRCVARS3D )
578
579 call this%AUXTRC_FLUX_VAR3D_manager%Final()
580 deallocate( this%AUXTRC_FLUX_VARS3D )
581
582 call this%alphaDensM%Final()
583 call this%alphaDensP%Final()
584
585 if ( this%MODALFILTER_FLAG ) then
586 call this%modal_filter_3d%Final()
587 end if
588
589 call this%FaceIntMat%Final()
590 call atmdyndgmdriver_base3d_final( this )
591
592 return
593 end subroutine atmdyndgmdriver_trcadv3d_final
594
595!-- private
596!OCL SERIAL
597 subroutine fix_negative_val( &
598 TRC_VARS, DDENS, THERM, PRES, CVtot, CPtot, Rtot, & ! (inout)
599 dens_hyd, pres_hyd, dt, mesh3d, is_thermvar_rhot ) ! (in)
600 use scale_atmos_hydrometeor, only: &
601 qla, qia
602 use scale_atm_phy_mp_dgm_common, only: &
604 implicit none
605 class(modelvarmanager), intent(inout) :: trc_vars
606 class(meshfield3d), intent(inout) :: ddens
607 class(meshfield3d), intent(inout) :: therm
608 class(meshfield3d), intent(inout) :: pres
609 class(meshfield3d), intent(inout) :: cvtot
610 class(meshfield3d), intent(inout) :: cptot
611 class(meshfield3d), intent(inout) :: rtot
612 class(meshfield3d), intent(inout) :: dens_hyd
613 class(meshfield3d), intent(inout) :: pres_hyd
614 real(rp), intent(in) :: dt
615 class(meshbase3d), intent(in), target :: mesh3d
616 logical, intent(in) :: is_thermvar_rhot
617
618 class(localmesh3d), pointer :: lcmesh3d
619 integer :: n
620
621 integer :: iq
622
623 integer :: trcid_list(qa)
624 type(localmeshfieldbaselist) :: lc_qtrc(qa)
625 !---------------------------------------------------------------
626
627 do iq=1, qa
628 trcid_list(iq) = iq
629 end do
630
631 do n=1, mesh3d%LOCAL_MESH_NUM
632 call trc_vars%GetLocalMeshFieldList( trcid_list, n, lc_qtrc )
633 lcmesh3d => mesh3d%lcmesh_list(n)
634
635 if ( is_thermvar_rhot ) then
637 lc_qtrc, ddens%local(n)%val, pres%local(n)%val, & ! (inout)
638 cvtot%local(n)%val, cptot%local(n)%val, rtot%local(n)%val, & ! (inout)
639 dens_hyd%local(n)%val, pres_hyd%local(n)%val, & ! (in)
640 dt, lcmesh3d, lcmesh3d%refElem3D, qa, qla, qia, & ! (in)
641 drhot=therm%local(n)%val ) ! (inout)
642 else
644 lc_qtrc, ddens%local(n)%val, pres%local(n)%val, & ! (inout)
645 cvtot%local(n)%val, cptot%local(n)%val, rtot%local(n)%val, & ! (inout)
646 dens_hyd%local(n)%val, pres_hyd%local(n)%val, & ! (in)
647 dt, lcmesh3d, lcmesh3d%refElem3D, qa, qla, qia ) ! (in)
648 end if
649 end do
650
651 return
652 end subroutine fix_negative_val
653
654 subroutine update_pressure_specific_heat( &
655 PRES, Rtot, CVtot, CPtot, &
656 TRC_VARS, PROG_VARS, AUX_VARS, dyn_driver, mesh3D )
657
658 use scale_tracer, only: &
659 tracer_mass, tracer_r, tracer_cv, tracer_cp
660 use scale_atmos_thermodyn, only: &
661 atmos_thermodyn_specific_heat
664 implicit none
665
666 class(meshfield3d), intent(inout) :: pres
667 class(meshfield3d), intent(inout) :: rtot
668 class(meshfield3d), intent(inout) :: cvtot
669 class(meshfield3d), intent(inout) :: cptot
670 class(modelvarmanager), intent(inout) :: trc_vars
671 class(modelvarmanager), intent(inout) :: prog_vars
672 class(modelvarmanager), intent(inout) :: aux_vars
673 class(atmdyndgmdriver_nonhydro3d), intent(inout) :: dyn_driver
674 class(meshbase3d), intent(in), target :: mesh3d
675
676 integer :: n
677 integer :: ke
678 integer :: iq
679
680 class(localmesh3d), pointer :: lcmesh3d
681 class(elementbase3d), pointer :: elem3d
682
683 real(rp), allocatable :: q_tmp(:,:)
684 real(rp), allocatable :: qdry(:)
685
686 integer :: trcid_list(qa)
687 type(localmeshfieldbaselist) :: lc_qtrc(qa)
688 !---------------------------------------------------------------
689
690 do iq=1, qa
691 trcid_list(iq) = iq
692 end do
693
694 do n=1, mesh3d%LOCAL_MESH_NUM
695 call trc_vars%GetLocalMeshFieldList( trcid_list, n, lc_qtrc )
696
697 lcmesh3d => mesh3d%lcmesh_list(n)
698 elem3d => lcmesh3d%refElem3D
699 allocate( q_tmp(elem3d%Np,qa), qdry(elem3d%Np) )
700
701 !$omp parallel do private(ke, iq, q_tmp, qdry)
702 do ke = lcmesh3d%NeS, lcmesh3d%NeE
703 do iq = 1, qa
704 q_tmp(:,iq) = lc_qtrc(iq)%ptr%val(:,ke)
705 end do
706 call atmos_thermodyn_specific_heat( &
707 elem3d%Np, 1, elem3d%Np, qa, & ! (in)
708 q_tmp(:,:), tracer_mass(:), tracer_r(:), tracer_cv(:), tracer_cp(:), & ! (in)
709 qdry, rtot%local(n)%val(:,ke), cvtot%local(n)%val(:,ke), cptot%local(n)%val(:,ke) ) ! (out)
710 end do
711 deallocate(q_tmp, qdry)
712 end do
713
714 call dyn_driver%calc_pressure( pres, prog_vars, aux_vars )
715
716 return
717 end subroutine update_pressure_specific_heat
718
719 !-- Setup modal filter
720!OCL SERIAL
721 subroutine setup_modalfilter( this, refElem3D, element_operation )
723 implicit none
724
725 class(atmdyndgmdriver_trcadv3d), target, intent(inout) :: this
726 class(hexahedralelement), target, intent(in) :: refelem3d
727 class(elementoperationbase3d), intent(inout) :: element_operation
728
729 real(rp) :: mf_etac_h = 2.0_rp/3.0_rp
730 real(rp) :: mf_alpha_h = 36.0_rp
731 integer :: mf_order_h = 16
732 real(rp) :: mf_etac_v = 2.0_rp/3.0_rp
733 real(rp) :: mf_alpha_v = 36.0_rp
734 integer :: mf_order_v = 16
735
736 namelist /param_atmos_dyn_tracer_modalfilter/ &
737 mf_etac_h, mf_alpha_h, mf_order_h, &
738 mf_etac_v, mf_alpha_v, mf_order_v
739
740 integer :: ierr
741
742 type(lineelement) :: elemv1d
743 !---------------------------------------------------------------
744
745 rewind(io_fid_conf)
746 read(io_fid_conf,nml=param_atmos_dyn_tracer_modalfilter,iostat=ierr)
747 if( ierr < 0 ) then !--- missing
748 log_info("ATMOS_DYN_TRCADV3D_setup_modalfilter",*) 'Not found namelist. Default used.'
749 elseif( ierr > 0 ) then !--- fatal error
750 log_error("ATMOS_DYN_TRCADV3D_setup_modalfilter",*) 'Invalid names in namelist PARAM_ATMOS_DYN_TRACER_MODALFILTER. Check!'
751 call prc_abort
752 endif
753
754 log_nml(param_atmos_dyn_tracer_modalfilter)
755
756 call this%modal_filter_3d%Init( &
757 refelem3d, & ! (in)
758 mf_etac_h, mf_alpha_h, mf_order_h, & ! (in)
759 mf_etac_v, mf_alpha_v, mf_order_v ) ! (in)
760
761 call element_operation%Setup_ModalFilter_tracer( &
762 mf_etac_h, mf_alpha_h, mf_order_h, & ! (in)
763 mf_etac_v, mf_alpha_v, mf_order_v ) ! (in)
764
765 return
766 end subroutine setup_modalfilter
767
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)
module FElib / Fluid dyn solver / Atmosphere / DGM driver (tracer advection)
type(variableinfo), dimension(trcvars3d_num), public atmos_dyn_trcvars3d_vinfo
type(variableinfo), dimension(mass_flux_num), public atmos_dyn_mass_flux_vinfo
type(variableinfo), dimension(auxtrcvars3d_num), public atmos_dyn_auxtrcvars3d_vinfo
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.
module FElib / Fluid dyn solver / Atmosphere / Nonhydrostatic model / Common
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)
module FElib / Fluid dyn solver / Atmosphere / Tracer advection
subroutine, public atm_dyn_dgm_trcadvect3d_tmar(qtrc_, dens_hyd, ddens_, lmesh, elem, lmesh2d, elem2d)
Second Step of limiter in which nonlinear truncation and mass aware rescaling (TMAR)
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)
subroutine, public atm_dyn_dgm_trcadvect3d_heve_calc_fct_coef(fct_coef, qtrc_, momx_, momy_, momz_, rhoq_tp_, alphdens_m, alphdens_p, dens_hyd, ddens_, ddens0_, rk_c_ssm1, dt, faceintmat, lmesh, elem, lmesh2d, elem2d, disable_limiter)
subroutine, public atm_dyn_dgm_trcadvect3d_heve_cal_tend(qtrc_dt, qtrc_, momx_, momy_, momz_, alphdens_m, alphdens_p, fct_coef, rhoq_tp, element3d_operation, faceintmat, lmesh, elem, lmesh2d, elem2d)
subroutine, public atm_dyn_dgm_trcadvect3d_heve_cal_alphdens_advtest(alph_dens_m, alph_dens_p, ddens_, momx_, momy_, momz_, dens_hyd, gsqrt, nx, ny, nz, vmapm, vmapp, lmesh, elem)
subroutine, public atm_dyn_dgm_trcadvect3d_heve_init(mesh, faceintmat)
module FElib / Atmosphere / Physics cloud microphysics / common
subroutine, public atm_phy_mp_dgm_common_negative_fixer(qtrc, ddens, pres, cvtot, cptot, rtot, dens_hyd, pres_hyd, dt, lmesh, elem, qa, qla, qia, drhot)
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
integer, parameter, public local_meshfield_type_nodes_faceval
ID of data type with a field on face nodes in local mesh.
module FElib / Mesh / Base 3D
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 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 provide RK scheme.