11#include "scaleFElib.h"
21 use scale_const,
only: &
22 undef8 => const_undef8
52 atmosvars_getlocalmeshprgvar, &
53 atmosvars_getlocalmeshprgvars, &
54 atmosvars_getlocalmeshqtrcvar, &
55 atmosvars_getlocalmeshqtrcphytend
77 logical :: calc_numdiff_flag
82 procedure,
public :: calc_tendency => atmosdyn_calc_tendency
83 procedure,
public :: update => atmosdyn_update
84 procedure,
public :: finalize => atmosdyn_finalize
95 private :: setup_coriolis_parameter
117 class(
atmosdyn),
intent(inout) :: this
118 class(modelmeshbase),
target,
intent(in) :: model_mesh
121 character(len=H_MID) :: EQS_TYPE =
"NONHYDRO3D_HEVE"
122 character(len=H_SHORT) :: TINTEG_TYPE =
'ERK_SSP_3s3o'
123 character(len=H_SHORT) :: TINTEG_TYPE_TRACER =
'ERK_SSP_3s3o'
124 real(DP) :: TIME_DT = undef8
125 character(len=H_SHORT) :: TIME_DT_UNIT =
'SEC'
127 logical :: MODALFILTER_FLAG = .false.
128 logical :: NUMDIFF_FLAG = .false.
129 logical :: SPONGELAYER_FLAG = .false.
130 logical :: ONLY_TRACERADV_FLAG = .false.
131 logical :: TRACERADV_DISABLE_LIMITER = .false.
132 logical :: TRACERADV_MODALFILTER_FLAG = .false.
133 logical :: HIDE_MPI_COMM_FLAG = .false.
135 namelist / param_atmos_dyn / &
138 tinteg_type_tracer, &
144 only_traceradv_flag, &
145 traceradv_disable_limiter, &
146 traceradv_modalfilter_flag, &
150 class(
meshbase),
pointer :: ptr_mesh
161 if (.not. this%IsActivated())
return
162 log_info(
'AtmosDyn_setup',*)
166 read(io_fid_conf,nml=param_atmos_dyn,iostat=ierr)
168 log_info(
"ATMOS_DYN_setup",*)
'Not found namelist. Default used.'
169 elseif( ierr > 0 )
then
170 log_error(
"ATMOS_DYN_setup",*)
'Not appropriate names in namelist PARAM_ATMOS_DYN. Check!'
173 log_nml(param_atmos_dyn)
177 call model_mesh%GetModelMesh( ptr_mesh )
178 select type(model_mesh)
180 atm_mesh => model_mesh
182 mesh3d => atm_mesh%ptr_mesh
186 call tm_parent_comp%Regist_process(
'ATMOS_DYN', time_dt, time_dt_unit, &
189 dtsec = tm_parent_comp%process_list(this%tm_process_id)%dtsec
192 call this%dyn_vars%Init( model_mesh )
194 call setup_coriolis_parameter( this%dyn_vars, atm_mesh )
197 call this%dyncore_driver%Init( eqs_type, &
198 tinteg_type, dtsec, &
199 spongelayer_flag, modalfilter_flag, &
200 hide_mpi_comm_flag, &
204 call this%trcadv_driver%Init(
"TRCADV3D_HEVE", &
205 tinteg_type_tracer, dtsec, &
206 traceradv_modalfilter_flag, traceradv_disable_limiter, &
207 atm_mesh, this%dyncore_driver%boundary_cond, only_traceradv_flag )
210 this%CALC_NUMDIFF_FLAG = numdiff_flag
211 if (this%CALC_NUMDIFF_FLAG)
call this%numdiff%Init( atm_mesh, dtsec )
229 subroutine atmosdyn_calc_tendency( this, model_mesh, prgvars_list, trcvars_list, auxvars_list, forcing_list, is_update )
232 class(
atmosdyn),
intent(inout) :: this
233 class(modelmeshbase),
intent(in) :: model_mesh
238 logical,
intent(in) :: is_update
240 if (.not. this%IsActivated())
return
244 end subroutine atmosdyn_calc_tendency
257 subroutine atmosdyn_update( this, model_mesh, prgvars_list, trcvars_list, auxvars_list, forcing_list, is_update )
258 use scale_tracer,
only: &
260 use scale_const,
only: &
261 grav => const_grav, &
262 rdry => const_rdry, &
263 cpdry => const_cpdry, &
264 cvdry => const_cvdry, &
265 pres00 => const_pre00
281 class(
atmosdyn),
intent(inout) :: this
282 class(modelmeshbase),
intent(in) :: model_mesh
287 logical,
intent(in) :: is_update
294 call prof_rapstart(
'ATM_DYN_update', 1)
296 call model_mesh%GetModelMesh( mesh )
302 if ( .not. this%trcadv_driver%ONLY_TRACERADV_FLAG )
then
304 call prof_rapstart(
'ATM_DYN_core', 2)
306 call this%dyncore_driver%Update( &
307 prgvars_list, auxvars_list, forcing_list, &
308 this%trcadv_driver%TRCVARS3D(trcddens_id), &
309 this%trcadv_driver%TRCVARS3D(trcddens0_id), &
310 this%trcadv_driver%AUXTRC_FLUX_VARS3D(massflx_x_tavg), &
311 this%trcadv_driver%AUXTRC_FLUX_VARS3D(massflx_y_tavg), &
312 this%trcadv_driver%AUXTRC_FLUX_VARS3D(massflx_z_tavg), &
313 this%trcadv_driver%alphaDensM, this%trcadv_driver%alphaDensP, &
315 model_mesh%element3D_operation, &
316 model_mesh%DOptrMat(1), model_mesh%DOptrMat(2), model_mesh%DOptrMat(3), &
317 model_mesh%SOptrMat(1), model_mesh%SOptrMat(2), model_mesh%SOptrMat(3), &
318 model_mesh%LiftOptrMat, mesh3d )
320 call prof_rapend(
'ATM_DYN_core', 2)
322 call prgvars_list%Get3D( 3, tmpvar )
328 call prof_rapstart(
'ATM_DYN_qtracer', 2)
330 call this%trcadv_driver%Update( &
331 trcvars_list, prgvars_list, auxvars_list, forcing_list, &
332 model_mesh%element3D_operation, &
333 model_mesh%DOptrMat(1), model_mesh%DOptrMat(2), model_mesh%DOptrMat(3), &
334 model_mesh%SOptrMat(1), model_mesh%SOptrMat(2), model_mesh%SOptrMat(3), &
335 model_mesh%LiftOptrMat, mesh3d, &
336 this%dyncore_driver )
338 call prof_rapend(
'ATM_DYN_qtracer', 2)
343 if ( this%CALC_NUMDIFF_FLAG )
then
344 call prof_rapstart(
'ATM_DYN_numfilter', 2)
345 call this%numdiff%Apply( prgvars_list, &
346 auxvars_list, this%dyncore_driver%boundary_cond, &
347 model_mesh%DOptrMat(1), model_mesh%DOptrMat(2), model_mesh%DOptrMat(3), &
348 model_mesh%LiftOptrMat, mesh3d )
349 call prof_rapend(
'ATM_DYN_numfilter', 2)
353 call prof_rapend(
'ATM_DYN_update', 1)
356 end subroutine atmosdyn_update
361 subroutine atmosdyn_finalize( this )
363 class(
atmosdyn),
intent(inout) :: this
367 if (.not. this%IsActivated())
return
368 log_info(
'AtmosDyn_finalize',*)
370 call this%dyncore_driver%Final()
371 call this%trcadv_driver%Final()
373 if (this%CALC_NUMDIFF_FLAG)
call this%numdiff%Final()
375 call this%dyn_vars%Final()
378 end subroutine atmosdyn_finalize
384 subroutine setup_coriolis_parameter( this, atm_mesh )
390 class(atmosdynvars),
target,
intent(inout) :: this
391 class(atmosmesh),
target,
intent(in) :: atm_mesh
398 character(len=H_SHORT) :: CORIOLIS_type
399 real(RP) :: CORIOLIS_f0 = 0.0_rp
400 real(RP) :: CORIOLIS_beta = 0.0_rp
401 real(RP) :: CORIOLIS_y0
403 namelist /param_atmos_dyn_coriolis/ &
405 coriolis_f0, coriolis_beta, coriolis_y0
412 mesh3d => atm_mesh%ptr_mesh
414 coriolis_type =
'NONE'
418 coriolis_y0 = 0.5_rp*(mesh3d%ymax_gl + mesh3d%ymin_gl)
422 read(io_fid_conf,nml=param_atmos_dyn_coriolis,iostat=ierr)
424 log_info(
"ATMOS_DYN_setup_coriolis",*)
'Not found namelist. Default used.'
425 else if( ierr > 0 )
then
426 log_error(
"ATMOS_DYN_setup_coriolis",*)
'Not appropriate names in namelist PARAM_ATMOS_DYN_CORIOLIS. Check!'
429 log_nml(param_atmos_dyn_coriolis)
431 do n = 1, mesh3d%LOCAL_MESH_NUM
432 call atmosdynauxvars_getlocalmeshfields( n, mesh3d, this%AUXVARS2D_manager, &
434 lcmesh2d => lcmesh3d%lcmesh2D
437 coriolis%val(:,lcmesh2d%NeS:lcmesh2d%NeE), &
438 coriolis_type, lcmesh2d%refElem2D%Np * lcmesh2d%Ne, &
439 lcmesh2d%pos_en(:,:,2), coriolis_f0, coriolis_beta, coriolis_y0, &
446 end subroutine setup_coriolis_parameter
module Atmosphere / Dynamics
integer, parameter, public atmos_dyn_auxvars2d_coriolis_id
subroutine, public atmosdynauxvars_getlocalmeshfields(domid, mesh, auxvars_list, coriolis, lcmesh3d)
module Atmosphere / Dynamics
subroutine atmosdyn_setup(this, model_mesh, tm_parent_comp)
Setup an object to manage a component of atmospheric dynamics.
module Atmosphere / Variables
module FElib / Fluid dyn solver / Atmosphere / driver (3D nonhydrostatic model)
module FElib / Fluid dyn solver / Atmosphere / DGM driver (tracer advection)
integer, parameter, public massflx_x_id
integer, parameter, public trcvars3d_dens0_id
integer, parameter, public trcvars3d_dens_id
integer, parameter, public massflx_z_id
integer, parameter, public massflx_y_id
module FElib / Fluid dyn solver / Atmosphere / Nonhydrostatic model / Common
integer, parameter, public prgvar_ddens_id
integer, parameter, public prgvar_num
module Atmosphere / Dynamics common
Module common / Coriolis parameter.
subroutine, public get_coriolis_parameter(coriolis, colioris_type, np, y, f0, beta, y0, lat)
Get Coriolis parameter.
module FElib / Element / Base
module FElib / Mesh / Local 2D
module FElib / Mesh / Local 3D
module FElib / Mesh / Local, Base
module FElib / Data / base
module FElib / Mesh / Base 2D
module FElib / Mesh / Base 3D
module FElib / Mesh / Base
module FElib / Mesh / Cubic 3D domain
module FElib / Data / base
FElib / model framework / physics process.
FElib / model framework / mesh manager.
FElib / model framework / variable manager.
Module common / sparsemat.
Module common / Runge-Kutta scheme.
Derived type to manage a component of atmospheric dynamics.
Derived type to manage variables with atmospheric dynamics component.
Derived type to manage a computational mesh (base class)
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 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 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)
Base type to manage a computational mesh.
Derived type to manage a cubic 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 provide RK scheme.