11#include "scaleFElib.h"
19 use scale_prc,
only: prc_abort
68 procedure :: final => meshfieldfilteroperation3d_final
69 procedure :: apply => meshfieldfilteroperation3d_apply_filter
82 private :: extract_tmp3d
95 FilterShape, FilterWidthFac, &
97 sfield_num, hvfield_num, htensorfield_num, &
102 character(*),
intent(in) :: FilterOptrType
103 character(*),
intent(in) :: FilterShape
104 real(RP),
intent(in) :: FilterWidthFac
105 integer,
intent(in) :: Nnode_h1D_reconst
106 integer,
intent(in) :: sfield_num
107 integer,
intent(in) :: hvfield_num
108 integer,
intent(in) :: htensorfield_num
112 filteroptrtype, filtershape, filterwidthfac, &
119 call this%vars_comm%Init( sfield_num, hvfield_num, htensorfield_num, mesh3d, &
120 halosize_h1d=this%hHaloSize, halosize_v=this%vHaloSize )
122 log_info(
'MeshFieldFilterOperation3D_Init',*)
"Unsupported mesh type is specified. Check!"
131 subroutine meshfieldfilteroperation3d_final( this )
136 call this%vars_comm%Final()
138 end subroutine meshfieldfilteroperation3d_final
142 subroutine meshfieldfilteroperation3d_apply_filter( this, q_list, &
146 type(
meshfield3d),
intent(inout),
target :: q_list(this%vars_comm%field_num_tot)
147 class(
meshbase3d),
intent(in),
target :: mesh3D
151 real(RP),
allocatable :: tmp3D(:,:,:,:)
158 do iv=1, this%vars_comm%field_num_tot
159 comm_vars_list(iv)%field3d => q_list(iv)
161 call this%vars_comm%Put(comm_vars_list, 1)
162 call this%vars_comm%Exchange()
163 call this%vars_comm%Get(comm_vars_list, 1)
165 do n=1, mesh3d%LOCAL_MESH_NUM
166 lmesh3d => mesh3d%lcmesh_list(n)
167 elem3d => lmesh3d%refElem3D
168 allocate( tmp3d(-this%hHaloSize+1:elem3d%Nnode_h1D+this%hHaloSize,-this%hHaloSize+1:elem3d%Nnode_h1D+this%hHaloSize,elem3d%Nnode_v,lmesh3d%Ne) )
170 do iv=1, this%vars_comm%field_num_tot
171 call extract_tmp3d( tmp3d, &
172 q_list(iv)%local(n)%val, q_list(iv)%local(n)%val, lmesh3d, elem3d, lmesh3d%VMapP, this%hHaloSize, 0 )
174 select case (this%operator_type)
176 call apply_filter1d_x( q_list(iv)%local(n)%val, &
177 tmp3d, this%FilterMat_h1D, elem3d%Nnode_h1D, elem3d%Nnode_h1D, elem3d%Nnode_v, lmesh3d%Ne, lmesh3d%NeA, elem3d%Nnode_h1D )
179 call apply_reconst1d_x( q_list(iv)%local(n)%val, &
180 tmp3d, this%Minv_Ml_tr, this%Minv_Mc_tr, this%Minv_Mr_tr, this%IntrpMat, elem3d%Nnode_h1D, elem3d%Nnode_h1D, elem3d%Nnode_v, lmesh3d%Ne, this%Nnode_h1D_reconst, lmesh3d )
182 call apply_reconst1d_x_2( q_list(iv)%local(n)%val, &
183 tmp3d, this%Ml_tr, this%Mc_tr, this%Mr_tr, elem3d%Nnode_h1D, elem3d%Nnode_h1D, elem3d%Nnode_v, lmesh3d%Ne, this%Nnode_h1D_reconst, lmesh3d )
190 call this%vars_comm%Put(comm_vars_list, 1)
191 call this%vars_comm%Exchange()
192 call this%vars_comm%Get(comm_vars_list, 1)
194 do n=1, mesh3d%LOCAL_MESH_NUM
195 lmesh3d => mesh3d%lcmesh_list(n)
196 elem3d => lmesh3d%refElem3D
197 allocate( tmp3d(-this%hHaloSize+1:elem3d%Nnode_h1D+this%hHaloSize,-this%hHaloSize+1:elem3d%Nnode_h1D+this%hHaloSize,elem3d%Nnode_v,lmesh3d%Ne) )
199 do iv=1, this%vars_comm%field_num_tot
200 call extract_tmp3d( tmp3d, &
201 q_list(iv)%local(n)%val, q_list(iv)%local(n)%val, lmesh3d, elem3d, lmesh3d%VMapP, this%hHaloSize, 1 )
203 select case (this%operator_type)
205 call apply_filter1d_y( q_list(iv)%local(n)%val, &
206 tmp3d, this%FilterMat_h1D, elem3d%Nnode_h1D, elem3d%Nnode_h1D, elem3d%Nnode_v,lmesh3d%Ne, lmesh3d%NeA, elem3d%Nnode_h1D )
208 call apply_reconst1d_y( q_list(iv)%local(n)%val, &
209 tmp3d, this%Minv_Ml_tr, this%Minv_Mc_tr, this%Minv_Mr_tr, this%IntrpMat, elem3d%Nnode_h1D, elem3d%Nnode_h1D, elem3d%Nnode_v, lmesh3d%Ne, this%Nnode_h1D_reconst, lmesh3d )
211 call apply_reconst1d_y_2( q_list(iv)%local(n)%val, &
212 tmp3d, this%Ml_tr, this%Mc_tr, this%Mr_tr, elem3d%Nnode_h1D, elem3d%Nnode_h1D, elem3d%Nnode_v, lmesh3d%Ne, this%Nnode_h1D_reconst, lmesh3d )
220 end subroutine meshfieldfilteroperation3d_apply_filter
225 subroutine extract_tmp3d( tmp3D, q0, q0_, lmesh3D, elem3D, vmapP, hHaloSize, x_or_y )
229 integer,
intent(in) :: hHaloSize
230 real(RP),
intent(out) :: tmp3D(-hHaloSize+1:elem3D%Nnode_h1D+hHaloSize,-hHaloSize+1:elem3D%Nnode_h1D+hHaloSize,elem3D%Nnode_v,lmesh3D%Ne)
231 real(RP),
intent(in) :: q0(elem3D%Np*lmesh3D%NeA)
232 real(RP),
intent(in) :: q0_(elem3D%Nnode_h1D,elem3D%Nnode_h1D,elem3D%Nnode_v,lmesh3D%NeA)
233 integer,
intent(in) :: vmapP(elem3D%NfpTot,lmesh3D%Ne)
234 integer,
intent(in) :: x_or_y
236 integer :: ke, ke_h, ke_x, ke_y, ke_z, px, py, ph, pz, i, f
237 integer :: fso, fs, fe
238 integer :: iP(elem3D%Nnode_h1D)
239 real(RP) :: halo_h(elem3D%Nnode_h1D,elem3D%Nnode_v,hHaloSize,max(lmesh3D%NeX,lmesh3D%NeY),lmesh3D%NeZ,4)
241 integer :: NehxNeZ_os(4)
244 neh_f(:) = (/ lmesh3d%NeX, lmesh3d%NeY, lmesh3d%NeX, lmesh3d%NeY /)
247 nehxnez_os(f) = nehxnez_os(f-1) + neh_f(f-1) * lmesh3d%NeZ
254 do ke_z=1, lmesh3d%NeZ
256 fso = lmesh3d%Ne * elem3d%Np &
257 + elem3d%Nfp_h*hhalosize * ( nehxnez_os(f) + (ke_h-1) + (ke_z-1)*neh_f(f) )
260 do pz=1, elem3d%Nnode_v
261 fs = fso + 1 + (pz-1)*elem3d%Nnode_h1D + (ph-1)*elem3d%Nfp_h
262 fe = fso + elem3d%Nnode_h1D - 1
263 halo_h(:,pz,ph,ke_h,ke_z,f) = q0(fs:fe)
271 do ke_z=1, lmesh3d%NeZ
272 do ke_y=1, lmesh3d%NeY
273 do ke_x=1, lmesh3d%NeX
274 ke = ke_x + (ke_y-1) * lmesh3d%NeX + (ke_z-1) * lmesh3d%NeX * lmesh3d%NeY
276 do pz=1, elem3d%Nnode_v
277 do py=1, elem3d%Nnode_h1D
278 do px=1, elem3d%Nnode_h1D
279 tmp3d(px,py,pz,ke) = q0_(px,py,pz,ke)
284 if ( x_or_y == 1 )
then
287 do pz=1, elem3d%Nnode_v
288 fs = fso + 1 + (pz-1)*elem3d%Nnode_h1D; fe = fs + elem3d%Nnode_h1D - 1
289 ip(:) = vmapp(fs:fe,ke)
290 if ( ip(1) <= lmesh3d%Ne * elem3d%Np )
then
292 tmp3d(1:elem3d%Nnode_h1D,-ph+1,pz,ke) = q0(ip(:) - (ph-1)*elem3d%Nnode_h1D)
296 tmp3d(1:elem3d%Nnode_h1D,-ph+1,pz,ke) = halo_h(:,pz,ph,ke_x,ke_z,1)
302 fso = 2 * elem3d%Nfp_h
303 do pz=1, elem3d%Nnode_v
304 fs = fso + 1 + (pz-1)*elem3d%Nnode_h1D; fe = fs + elem3d%Nnode_h1D - 1
305 ip(:) = vmapp(fs:fe,ke)
306 if ( ip(1) <= lmesh3d%Ne * elem3d%Np )
then
308 tmp3d(1:elem3d%Nnode_h1D,ph+elem3d%Nnode_h1D,pz,ke) = q0(ip(:) + (ph-1)*elem3d%Nnode_h1D)
312 tmp3d(1:elem3d%Nnode_h1D,ph+elem3d%Nnode_h1D,pz,ke) = halo_h(:,pz,ph,ke_x,ke_z,3)
316 else if ( x_or_y == 0 )
then
319 do pz=1, elem3d%Nnode_v
320 fs = fso + 1 + (pz-1)*elem3d%Nnode_h1D; fe = fs + elem3d%Nnode_h1D - 1
321 ip(:) = vmapp(fs:fe,ke)
322 if ( ip(1) <= lmesh3d%Ne * elem3d%Np )
then
324 tmp3d(ph+elem3d%Nnode_h1D,1:elem3d%Nnode_h1D,pz,ke) = q0(ip(:) + (ph-1))
328 tmp3d(ph+elem3d%Nnode_h1D,1:elem3d%Nnode_h1D,pz,ke) = halo_h(:,pz,ph,ke_y,ke_z,2)
334 fso = 3 * elem3d%Nfp_h
335 do pz=1, elem3d%Nnode_v
336 fs = fso + 1 + (pz-1)*elem3d%Nnode_h1D; fe = fs + elem3d%Nnode_h1D - 1
337 ip(:) = vmapp(fs:fe,ke)
338 if ( ip(1) <= lmesh3d%Ne * elem3d%Np )
then
340 tmp3d(-ph+1,1:elem3d%Nnode_h1D,pz,ke) = q0(ip(:) - (ph-1))
344 tmp3d(-ph+1,1:elem3d%Nnode_h1D,pz,ke) = halo_h(:,pz,ph,ke_y,ke_z,4)
356 end subroutine extract_tmp3d
module FElib / Element / Base
module FElib / Element/ ModalFilter
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 / Cubic 3D domain
module FElib / Mesh / Rectangle 2D domain
module FElib / Data / base
module FElib / Data / Filter operation
subroutine meshfieldfilteroperation3d_init(this, filteroptrtype, filtershape, filterwidthfac, nnode_h1d_reconst, sfield_num, hvfield_num, htensorfield_num, mesh3d)
Initialize an object to represent filter operation for 3D mesh field.
module FElib / Data / Filter operation base
subroutine, public meshfieldfilteroperationbase_apply_filter1d_y(q, q0, filter1d, npx, npy, npz, ne, nea, nnode_h1d)
integer, parameter, public filter_optrtype_reconstruct2
subroutine, public meshfieldfilteroperationbase_apply_filter1d_x(q, q0, filter1d, npx, npy, npz, ne, nea, nnode_h1d)
integer, parameter, public filter_optrtype_reconstruct
subroutine, public meshfieldfilteroperationbase_apply_reconst1d_y_2(q, q0, minv_ml_tr, minv_mc_tr, minv_mr_tr, npx, npy, npz, ne, npy_reconst, lmesh)
subroutine, public meshfieldfilteroperationbase_apply_reconst1d_x_2(q, q0, minv_ml_tr, minv_mc_tr, minv_mr_tr, npx, npy, npz, ne, npx_reconst, lmesh)
subroutine, public meshfieldfilteroperationbase_apply_reconst1d_y(q, q0, minv_ml_tr, minv_mc_tr, minv_mr_tr, intrpmat, npx, npy, npz, ne, npy_reconst, lmesh)
subroutine, public meshfieldfilteroperationbase_init(this, nnode_h1d, filteroptrtype, filtershape, filterwidthfac, nnode_h1d_reconst, nnode_h1d_gl, if_r)
subroutine, public meshfieldfilteroperationbase_apply_reconst1d_x(q, q0, minv_ml_tr, minv_mc_tr, minv_mr_tr, intrpmat, npx, npy, npz, ne, npx_reconst, lmesh)
integer, parameter, public filter_optrtype_convfilter
subroutine, public meshfieldfilteroperationbase_final(this)
module FElib / Data / Communication base
module FElib / Data / Communication 3D cubic domain
Derived type representing a 2D reference element.
Derived type representing a 3D reference 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 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 to manage a cubic 3D computational domain.
Derived type to manage a rectangular 2D computational 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.
Base type to represent filter operation.
Container to save a pointer of MeshField(1D, 2D, 3D) object.
Base derived type to manage data communication with 3D cubic domain.