FE-Project
Loading...
Searching...
No Matches
scale_meshfield_filter_operation_3d.F90
Go to the documentation of this file.
1!-------------------------------------------------------------------------------
2!> module FElib / Data / Filter operation
3!!
4!! @par Description
5!! This module provides classes to apply filter operations to MeshField data
6!!
7!! @author Yuta Kawai, Team SCALE
8!!
9!<
10!-------------------------------------------------------------------------------
11#include "scaleFElib.h"
13 !-----------------------------------------------------------------------------
14 !
15 !++ used modules
16 !
17 use scale_precision
18 use scale_io
19 use scale_prc, only: prc_abort
20
28
29 use scale_meshfield_base, only: &
32 use scale_mesh_rectdom2d, only: &
34 use scale_mesh_cubedom3d, only: &
38 use scale_meshfieldcomm_base, only: &
40
52
53 !-----------------------------------------------------------------------------
54 implicit none
55 private
56
57 !-----------------------------------------------------------------------------
58 !
59 !++ Public type & procedure
60 !
61
62 !> Derived type to represent filter operation for 3D mesh field
64 type(meshfieldcommcubedom3d) :: vars_comm
65 integer :: vhalosize
66 contains
68 procedure :: final => meshfieldfilteroperation3d_final
69 procedure :: apply => meshfieldfilteroperation3d_apply_filter
71
72
73 !-----------------------------------------------------------------------------
74 !
75 !++ Public parameters & variables
76 !
77
78 !-----------------------------------------------------------------------------
79 !
80 !++ Private type & procedure
81 !
82 private :: extract_tmp3d
83
84 !-----------------------------------------------------------------------------
85 !
86 !++ Private parameters & variables
87 !
88
89contains
90
91 !> Initialize an object to represent filter operation for 3D mesh field
92!OCL SERIAL
94 FilterOptrType, &
95 FilterShape, FilterWidthFac, &
96 Nnode_h1D_reconst, &
97 sfield_num, hvfield_num, htensorfield_num, &
98 mesh3D )
99 implicit none
100 class(meshfieldfilteroperation3d), intent(inout) :: this
101 class(meshbase3d), intent(in) :: mesh3D
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
109 !------------------------------------------
110
111 call meshfieldfilteroperationbase_init( this, mesh3d%refElem3D%Nnode_h1D, &
112 filteroptrtype, filtershape, filterwidthfac, &
113 nnode_h1d_reconst )
114
115 this%vHaloSize = 1
116
117 select type(mesh3d)
118 class is (meshcubedom3d)
119 call this%vars_comm%Init( sfield_num, hvfield_num, htensorfield_num, mesh3d, &
120 halosize_h1d=this%hHaloSize, halosize_v=this%vHaloSize )
121 class default
122 log_info('MeshFieldFilterOperation3D_Init',*) "Unsupported mesh type is specified. Check!"
123 call prc_abort
124 end select
125
126 return
128
129 !> Finalize an object to represent filter operation for 3D mesh field
130!OCL SERIAL
131 subroutine meshfieldfilteroperation3d_final( this )
132 implicit none
133 class(meshfieldfilteroperation3d), intent(inout) :: this
134 !------------------------------------------
136 call this%vars_comm%Final()
137 return
138 end subroutine meshfieldfilteroperation3d_final
139
140 !> Apply filter operation to 3D mesh field data
141!OCL serial
142 subroutine meshfieldfilteroperation3d_apply_filter( this, q_list, &
143 mesh3D )
144 implicit none
145 class(meshfieldfilteroperation3d), intent(inout) :: this
146 type(meshfield3d), intent(inout), target :: q_list(this%vars_comm%field_num_tot)
147 class(meshbase3d), intent(in), target :: mesh3D
148
149 class(localmesh3d), pointer :: lmesh3D
150 class(elementbase3d), pointer :: elem3D
151 real(RP), allocatable :: tmp3D(:,:,:,:)
152
153 integer :: iv
154 integer :: n
155 type(meshfieldcontainer) :: comm_vars_list(this%vars_comm%field_num_tot)
156 !-----------------------------------------------------
157
158 do iv=1, this%vars_comm%field_num_tot
159 comm_vars_list(iv)%field3d => q_list(iv)
160 end do
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)
164
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) )
169
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 )
173
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 )
184 end select
185
186 end do
187 deallocate( tmp3d )
188 end do
189
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)
193
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) )
198
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 )
202
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 )
213 end select
214
215 end do
216 deallocate( tmp3d )
217 end do
218
219 return
220 end subroutine meshfieldfilteroperation3d_apply_filter
221
222!- Private -----------------------
223
224!OCL SERIAL
225 subroutine extract_tmp3d( tmp3D, q0, q0_, lmesh3D, elem3D, vmapP, hHaloSize, x_or_y )
226 implicit none
227 class(localmesh3d), intent(in) :: lmesh3D
228 class(elementbase3d), intent(in) :: elem3D
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 !< x: 0, y: 1
235
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)
240 integer :: Neh_f(4)
241 integer :: NehxNeZ_os(4)
242 !------------------------------
243
244 neh_f(:) = (/ lmesh3d%NeX, lmesh3d%NeY, lmesh3d%NeX, lmesh3d%NeY /)
245 nehxnez_os(1) = 0
246 do f=2, 4
247 nehxnez_os(f) = nehxnez_os(f-1) + neh_f(f-1) * lmesh3d%NeZ
248 end do
249
250 !$omp parallel private(ke, ke_x, ke_y, ke_h, ke_z, i, px, py, ph, pz, fso, fs, fe, iP, f)
251
252 !$omp do collapse(2)
253 do f=1, 4
254 do ke_z=1, lmesh3d%NeZ
255 do ke_h=1, neh_f(f)
256 fso = lmesh3d%Ne * elem3d%Np &
257 + elem3d%Nfp_h*hhalosize * ( nehxnez_os(f) + (ke_h-1) + (ke_z-1)*neh_f(f) )
258
259 do ph=1, hhalosize
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)
264 end do
265 end do
266 end do
267 end do
268 end do
269
270 !$omp do collapse(3)
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
275
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)
280 end do
281 end do
282 end do
283
284 if ( x_or_y == 1 ) then ! y-direction
285 ! Face 1
286 fso = 0
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
291 do ph=1, hhalosize
292 tmp3d(1:elem3d%Nnode_h1D,-ph+1,pz,ke) = q0(ip(:) - (ph-1)*elem3d%Nnode_h1D)
293 end do
294 else
295 do ph=1, hhalosize
296 tmp3d(1:elem3d%Nnode_h1D,-ph+1,pz,ke) = halo_h(:,pz,ph,ke_x,ke_z,1)
297 end do
298 end if
299 enddo
300
301 ! Face 3
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
307 do ph=1, hhalosize
308 tmp3d(1:elem3d%Nnode_h1D,ph+elem3d%Nnode_h1D,pz,ke) = q0(ip(:) + (ph-1)*elem3d%Nnode_h1D)
309 end do
310 else
311 do ph=1, hhalosize
312 tmp3d(1:elem3d%Nnode_h1D,ph+elem3d%Nnode_h1D,pz,ke) = halo_h(:,pz,ph,ke_x,ke_z,3)
313 end do
314 end if
315 enddo
316 else if ( x_or_y == 0 ) then ! x-direction
317 ! Face 2
318 fso = elem3d%Nfp_h
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
323 do ph=1, hhalosize
324 tmp3d(ph+elem3d%Nnode_h1D,1:elem3d%Nnode_h1D,pz,ke) = q0(ip(:) + (ph-1))
325 end do
326 else
327 do ph=1, hhalosize
328 tmp3d(ph+elem3d%Nnode_h1D,1:elem3d%Nnode_h1D,pz,ke) = halo_h(:,pz,ph,ke_y,ke_z,2)
329 end do
330 end if
331 enddo
332
333 ! Face 4
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
339 do ph=1, hhalosize
340 tmp3d(-ph+1,1:elem3d%Nnode_h1D,pz,ke) = q0(ip(:) - (ph-1))
341 end do
342 else
343 do ph=1, hhalosize
344 tmp3d(-ph+1,1:elem3d%Nnode_h1D,pz,ke) = halo_h(:,pz,ph,ke_y,ke_z,4)
345 end do
346 end if
347 enddo
348 end if
349
350 end do
351 end do
352 end do
353
354 !$omp end parallel
355 return
356 end subroutine extract_tmp3d
357
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 / Mesh / Base 2D
module FElib / Mesh / Base 3D
module FElib / Mesh / Cubic 3D domain
module FElib / Mesh / Rectangle 2D domain
module FElib / Data / base
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)
subroutine, public meshfieldfilteroperationbase_apply_filter1d_x(q, q0, filter1d, npx, npy, npz, ne, nea, nnode_h1d)
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)
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.
Container to save a pointer of MeshField(1D, 2D, 3D) object.
Base derived type to manage data communication with 3D cubic domain.