11#include "scaleFElib.h"
50 DDENS_, MOMX_, MOMY_, MOMZ_, DRHOT_, & ! (inout)
51 lmesh, elem, elem_operation, &
58 real(rp),
intent(inout) :: ddens_(elem%np,lmesh%nea)
59 real(rp),
intent(inout) :: momx_(elem%np,lmesh%nea)
60 real(rp),
intent(inout) :: momy_(elem%np,lmesh%nea)
61 real(rp),
intent(inout) :: momz_(elem%np,lmesh%nea)
62 real(rp),
intent(inout) :: drhot_(elem%np,lmesh%nea)
64 logical,
intent(in),
optional :: do_weight_gsqrt
67 real(rp) :: tmp(elem%np,5)
68 real(rp) :: work(elem%np)
69 real(rp) :: tmp_out(elem%np,5)
72 logical :: do_weight_gsqrt_
73 real(rp) :: rgsqrt(elem%np)
76 if (
present( do_weight_gsqrt ) )
then
77 do_weight_gsqrt_ = do_weight_gsqrt
79 do_weight_gsqrt_ = .false.
82 if ( do_weight_gsqrt_ )
then
84 do ke=lmesh%NeS, lmesh%NeE
86 tmp(kk,1) = lmesh%Gsqrt(kk,ke) * ddens_(kk,ke)
87 tmp(kk,2) = lmesh%Gsqrt(kk,ke) * momx_(kk,ke)
88 tmp(kk,3) = lmesh%Gsqrt(kk,ke) * momy_(kk,ke)
89 tmp(kk,4) = lmesh%Gsqrt(kk,ke) * momz_(kk,ke)
90 tmp(kk,5) = lmesh%Gsqrt(kk,ke) * drhot_(kk,ke)
93 call elem_operation%ModalFilter_var5( tmp, work, &
96 rgsqrt(:) = 1.0_rp / lmesh%Gsqrt(:,ke)
97 ddens_(:,ke) = tmp_out(:,1) * rgsqrt(:)
98 momx_(:,ke) = tmp_out(:,2) * rgsqrt(:)
99 momy_(:,ke) = tmp_out(:,3) * rgsqrt(:)
100 momz_(:,ke) = tmp_out(:,4) * rgsqrt(:)
101 drhot_(:,ke) = tmp_out(:,5) * rgsqrt(:)
107 do ke=lmesh%NeS, lmesh%NeE
110 tmp(kk,1) = ddens_(kk,ke)
111 tmp(kk,2) = momx_(kk,ke)
112 tmp(kk,3) = momy_(kk,ke)
113 tmp(kk,4) = momz_(kk,ke)
114 tmp(kk,5) = drhot_(kk,ke)
117 call elem_operation%ModalFilter_var5( tmp, work, &
120 ddens_(:,ke) = tmp(:,1)
121 momx_(:,ke) = tmp(:,2)
122 momy_(:,ke) = tmp(:,3)
123 momz_(:,ke) = tmp(:,4)
124 drhot_(:,ke) = tmp(:,5)
133 DDENS_, MOMX_, MOMY_, MOMZ_, DRHOT_, & ! (inout)
134 lmesh, elem, elem_operation, &
142 real(rp),
intent(inout) :: ddens_(elem%np,lmesh%nea)
143 real(rp),
intent(inout) :: momx_(elem%np,lmesh%nea)
144 real(rp),
intent(inout) :: momy_(elem%np,lmesh%nea)
145 real(rp),
intent(inout) :: momz_(elem%np,lmesh%nea)
146 real(rp),
intent(inout) :: drhot_(elem%np,lmesh%nea)
148 logical,
intent(in),
optional :: do_weight_gsqrt
151 real(rp) :: tmp(elem%np,lmesh%ne,5)
152 real(rp) :: work(elem%np,lmesh%ne)
153 real(rp) :: tmp_out(elem%np,lmesh%ne,5)
157 logical :: do_weight_gsqrt_
162 if (
present( do_weight_gsqrt ) )
then
163 do_weight_gsqrt_ = do_weight_gsqrt
165 do_weight_gsqrt_ = .false.
169 call elem_operation_gpu_driver%Init( elem_operation )
172 if ( do_weight_gsqrt_ )
then
174 do ke=lmesh%NeS, lmesh%NeE
176 gsqrt_ = lmesh%Gsqrt(kk,ke)
177 tmp(kk,ke,1) = gsqrt_ * ddens_(kk,ke)
178 tmp(kk,ke,2) = gsqrt_ * momx_(kk,ke)
179 tmp(kk,ke,3) = gsqrt_ * momy_(kk,ke)
180 tmp(kk,ke,4) = gsqrt_ * momz_(kk,ke)
181 tmp(kk,ke,5) = gsqrt_ * drhot_(kk,ke)
186 do ke=lmesh%NeS, lmesh%NeE
188 tmp(kk,ke,1) = ddens_(kk,ke)
189 tmp(kk,ke,2) = momx_(kk,ke)
190 tmp(kk,ke,3) = momy_(kk,ke)
191 tmp(kk,ke,4) = momz_(kk,ke)
192 tmp(kk,ke,5) = drhot_(kk,ke)
200 if ( do_weight_gsqrt_ )
then
202 do ke=lmesh%NeS, lmesh%NeE
204 rgsqrt = 1.0_rp / lmesh%Gsqrt(kk,ke)
205 ddens_(kk,ke) = tmp_out(kk,ke,1) * rgsqrt
206 momx_(kk,ke) = tmp_out(kk,ke,2) * rgsqrt
207 momy_(kk,ke) = tmp_out(kk,ke,3) * rgsqrt
208 momz_(kk,ke) = tmp_out(kk,ke,4) * rgsqrt
209 drhot_(kk,ke) = tmp_out(kk,ke,5) * rgsqrt
214 do ke=lmesh%NeS, lmesh%NeE
216 ddens_(kk,ke) = tmp_out(kk,ke,1)
217 momx_(kk,ke) = tmp_out(kk,ke,2)
218 momy_(kk,ke) = tmp_out(kk,ke,3)
219 momz_(kk,ke) = tmp_out(kk,ke,4)
220 drhot_(kk,ke) = tmp_out(kk,ke,5)
227 call elem_operation_gpu_driver%Final()
237 dens_hyd_, ddens0_, ddens_, &
238 lmesh, elem, elem_operation )
244 real(rp),
intent(inout) :: qtrc_(elem%np,lmesh%nea)
245 real(rp),
intent(in) :: dens_hyd_(elem%np,lmesh%nea)
246 real(rp),
intent(in) :: ddens0_(elem%np,lmesh%nea)
247 real(rp),
intent(in) :: ddens_ (elem%np,lmesh%nea)
251 real(rp) :: tmp(elem%np)
252 real(rp) :: work(elem%np)
253 real(rp) :: tmp_out(elem%np)
254 real(rp) :: weight(elem%np)
257 real(rp) :: gsqrtrhoq_ref(elem%np)
262 do ke=lmesh%NeS, lmesh%NeE
269 qtrc_avg = 0.125_rp * sum(elem%IntWeight_lgl(:) * qtrc_(:,ke))
270 gsqrtrhoq_ref(:) = lmesh%Gsqrt(:,ke) * qtrc_avg * ( &
271 dens_hyd_(:,ke) + ddens_(:,ke) - ddens0_(:,ke) )
274 weight(kk) = lmesh%Gsqrt(kk,ke) &
275 * ( dens_hyd_(kk,ke) + ddens0_(kk,ke) )
277 tmp(kk) = weight(kk) * qtrc_(kk,ke) &
285 call elem_operation%ModalFilter_tracer( tmp, work, &
288 qtrc_(:,ke) = ( gsqrtrhoq_ref(:) + tmp_out(:) ) / weight(:)
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 / Element / Base
module FElib / Element / Operation / Base
module FElib / Element / Driver for operation with 3D tensor product elements using GPU
subroutine, public elementoperationgpu_modalfilter_var5(this, vec_in, vec_work, ne, vec_out)
Apply a modal filter for five variables.
module FElib / Mesh / Local, Base
Derived type representing an arbitrary finite element.
Base type for elementwise operations.
Driver for element operation with 3D tensor product elements using GPU.
Derived type to manage a local computational domain (base type)