11#include "scaleFElib.h"
43 real(rp),
allocatable :: intrpmat_vpordm1(:,:)
48 procedure,
public :: init => element_operation_general_init
49 procedure,
public :: final => element_operation_general_final
50 procedure,
public :: dx => element_operation_general_dx
51 procedure,
public :: dy => element_operation_general_dy
52 procedure,
public :: dz => element_operation_general_dz
53 procedure,
public :: lift => element_operation_general_lift
54 procedure,
public :: dxdydzlift => element_operation_general_dxdydzlift
55 procedure,
public :: div => element_operation_general_div
56 procedure,
public :: div_var5 => element_operation_general_div_var5
57 procedure,
public :: div_var5_2 => element_operation_general_div_var5_2
58 procedure,
public :: lift_var5 => element_operation_general_lift_var5
59 procedure,
public :: vfilterpm1 => element_operation_general_vfilterpm1
61 procedure,
public :: setup_modalfilter => element_operation_general_setup_modalfilter
62 procedure,
public :: setup_modalfilter_tracer => element_operation_general_setup_modalfilter_tracer
63 procedure,
public :: modalfilter_tracer => element_operation_general_modalfilter_tracer
64 procedure,
public :: modalfilter_var5 => element_operation_general_modalfilter_var5
68 module procedure element_operation_general_generate_vpordm1
77 subroutine element_operation_general_init( this, elem3D, &
80 class(ElementOperationGeneral),
intent(inout) :: this
81 class(ElementBase3D),
intent(in),
target :: elem3D
82 type(SparseMat),
intent(in),
target :: Dx
83 type(SparseMat),
intent(in),
target :: Dy
84 type(SparseMat),
intent(in),
target :: Dz
85 type(SparseMat),
intent(in),
target :: Lift
95 allocate( this%IntrpMat_VPOrdM1(elem3d%Np,elem3d%Np) )
96 call element_operation_general_generate_vpordm1( this%IntrpMat_VPOrdM1, &
100 end subroutine element_operation_general_init
105 subroutine element_operation_general_generate_vpordm1( IntrpMat_VPOrdM1, &
109 real(RP),
intent(out) :: IntrpMat_VPOrdM1(elem3D%Np,elem3D%Np)
111 integer :: p1, p2, p_
112 real(RP) :: invV_VPOrdM1(elem3D%Np,elem3D%Np)
115 invv_vpordm1(:,:) = elem3d%invV(:,:)
116 do p2=1, elem3d%Nnode_h1D
117 do p1=1, elem3d%Nnode_h1D
118 p_ = p1 + (p2-1)*elem3d%Nnode_h1D + (elem3d%Nnode_v-1)*elem3d%Nnode_h1D**2
119 invv_vpordm1(p_,:) = 0.0_rp
122 intrpmat_vpordm1(:,:) = matmul(elem3d%V, invv_vpordm1)
125 end subroutine element_operation_general_generate_vpordm1
130 subroutine element_operation_general_setup_modalfilter( this, &
131 MF_ETAC_h, MF_ALPHA_h, MF_ORDER_h, &
132 MF_ETAC_v, MF_ALPHA_v, MF_ORDER_v )
136 real(RP),
intent(in) :: MF_ETAC_h
137 real(RP),
intent(in) :: MF_ALPHA_h
138 integer,
intent(in) :: MF_ORDER_h
139 real(RP),
intent(in) :: MF_ETAC_v
140 real(RP),
intent(in) :: MF_ALPHA_v
141 integer,
intent(in) :: MF_ORDER_v
144 call setup_modalfilter( this%MFilter, &
145 mf_etac_h, mf_alpha_h, mf_order_h, &
146 mf_etac_v, mf_alpha_v, mf_order_v, &
147 this%elem3D%PolyOrder_h, this%elem3D%PolyOrder_v )
150 end subroutine element_operation_general_setup_modalfilter
155 subroutine element_operation_general_setup_modalfilter_tracer( this, &
156 MF_ETAC_h, MF_ALPHA_h, MF_ORDER_h, &
157 MF_ETAC_v, MF_ALPHA_v, MF_ORDER_v )
160 real(RP),
intent(in) :: MF_ETAC_h
161 real(RP),
intent(in) :: MF_ALPHA_h
162 integer,
intent(in) :: MF_ORDER_h
163 real(RP),
intent(in) :: MF_ETAC_v
164 real(RP),
intent(in) :: MF_ALPHA_v
165 integer,
intent(in) :: MF_ORDER_v
168 call setup_modalfilter( this%MFilter_tracer, &
169 mf_etac_h, mf_alpha_h, mf_order_h, &
170 mf_etac_v, mf_alpha_v, mf_order_v, &
171 this%elem3D%PolyOrder_h, this%elem3D%PolyOrder_v )
174 end subroutine element_operation_general_setup_modalfilter_tracer
180 subroutine element_operation_general_final( this )
185 nullify( this%elem3D )
186 nullify( this%Dx_sm, this%Dy_sm, this%Dz_sm, this%Lift_sm )
188 deallocate( this%IntrpMat_VPOrdM1 )
191 end subroutine element_operation_general_final
196 subroutine element_operation_general_dx( this, vec_in, vec_out )
199 real(RP),
intent(in) :: vec_in(this%elem3D%Np)
200 real(RP),
intent(out) :: vec_out(this%elem3D%Np)
204 end subroutine element_operation_general_dx
209 subroutine element_operation_general_dy( this, vec_in, vec_out )
212 real(RP),
intent(in) :: vec_in(this%elem3D%Np)
213 real(RP),
intent(out) :: vec_out(this%elem3D%Np)
217 end subroutine element_operation_general_dy
222 subroutine element_operation_general_dz( this, vec_in, vec_out )
225 real(RP),
intent(in) :: vec_in(this%elem3D%Np)
226 real(RP),
intent(out) :: vec_out(this%elem3D%Np)
230 end subroutine element_operation_general_dz
235 subroutine element_operation_general_lift( this, vec_in, vec_out )
238 real(RP),
intent(in) :: vec_in(this%elem3D%NfpTot)
239 real(RP),
intent(out) :: vec_out(this%elem3D%Np)
243 end subroutine element_operation_general_lift
248 subroutine element_operation_general_dxdydzlift( this, vec_in, vec_in_lift, vec_out_dx, vec_out_dy, vec_out_dz, vec_out_lift )
251 real(RP),
intent(in) :: vec_in(this%elem3D%Np)
252 real(RP),
intent(in) :: vec_in_lift(this%elem3D%NfpTot)
253 real(RP),
intent(out) :: vec_out_dx(this%elem3D%Np)
254 real(RP),
intent(out) :: vec_out_dy(this%elem3D%Np)
255 real(RP),
intent(out) :: vec_out_dz(this%elem3D%Np)
256 real(RP),
intent(out) :: vec_out_lift(this%elem3D%Np)
264 end subroutine element_operation_general_dxdydzlift
269 subroutine element_operation_general_div( this, vec_in, vec_in_lift, &
273 real(RP),
intent(in) :: vec_in(this%elem3D%Np,3)
274 real(RP),
intent(in) :: vec_in_lift(this%elem3D%NfpTot)
275 real(RP),
intent(out) :: vec_out(this%elem3D%Np,4)
283 end subroutine element_operation_general_div
289 subroutine element_operation_general_div_var5( this, vec_in, vec_in_lift, &
293 real(RP),
intent(in) :: vec_in(this%elem3D%Np,3,5)
294 real(RP),
intent(in) :: vec_in_lift(this%elem3D%NfpTot,5)
295 real(RP),
intent(out) :: vec_out_d(this%elem3D%Np,4,5)
309 end subroutine element_operation_general_div_var5
314 subroutine element_operation_general_div_var5_2( this, vec_in, &
318 real(RP),
intent(in) :: vec_in(this%elem3D%Np,3,5)
319 real(RP),
intent(out) :: vec_out_d(this%elem3D%Np,3,5)
330 end subroutine element_operation_general_div_var5_2
334 subroutine element_operation_general_lift_var5( this, vec_in, vec_out )
337 real(RP),
intent(in) :: vec_in(this%elem3D%NfpTot,5)
338 real(RP),
intent(out) :: vec_out(this%elem3D%Np,5)
346 end subroutine element_operation_general_lift_var5
349 subroutine element_operation_general_vfilterpm1( this, vec_in, vec_out )
352 real(RP),
intent(in) :: vec_in(this%elem3D%Np)
353 real(RP),
intent(out) :: vec_out(this%elem3D%Np)
356 call matmul_( this%IntrpMat_VPOrdM1, vec_in, this%elem3D%Np, &
359 end subroutine element_operation_general_vfilterpm1
362 subroutine matmul_( IntrpMat_VPOrdM1, vec_in_, Np, vec_out_ )
364 integer,
intent(in) :: Np
365 real(RP),
intent(in) :: IntrpMat_VPOrdM1(Np,Np)
366 real(RP),
intent(in) :: vec_in_(Np)
367 real(RP),
intent(out) :: vec_out_(Np)
369 vec_out_(:) = matmul( intrpmat_vpordm1(:,:), vec_in_(:) )
371 end subroutine matmul_
374 subroutine element_operation_general_modalfilter_tracer( this, vec_in, vec_work, vec_out )
377 real(RP),
intent(in) :: vec_in(this%elem3D%Np)
378 real(RP),
intent(out) :: vec_work(this%elem3D%Np)
379 real(RP),
intent(out) :: vec_out(this%elem3D%Np)
381 integer :: ii, kk, Np
390 mik = this%MFilter_tracer%FilterMat(ii,kk)
391 vec_out(ii) = vec_out(ii) + mik * vec_in(kk)
396 end subroutine element_operation_general_modalfilter_tracer
399 subroutine element_operation_general_modalfilter_var5( this, vec_in, vec_work, vec_out )
402 real(RP),
intent(in) :: vec_in(this%elem3D%Np,5)
403 real(RP),
intent(out) :: vec_work(this%elem3D%Np)
404 real(RP),
intent(out) :: vec_out(this%elem3D%Np,5)
406 integer :: ii, kk, Np
411 vec_out(:,:) = 0.0_rp
415 mik = this%MFilter%FilterMat(ii,kk)
417 vec_out(ii,1) = vec_out(ii,1) + mik * vec_in(kk,1)
418 vec_out(ii,2) = vec_out(ii,2) + mik * vec_in(kk,2)
419 vec_out(ii,3) = vec_out(ii,3) + mik * vec_in(kk,3)
420 vec_out(ii,4) = vec_out(ii,4) + mik * vec_in(kk,4)
421 vec_out(ii,5) = vec_out(ii,5) + mik * vec_in(kk,5)
426 end subroutine element_operation_general_modalfilter_var5
431 subroutine setup_modalfilter( MFilter, &
432 MF_ETAC_h, MF_ALPHA_h, MF_ORDER_h, &
433 MF_ETAC_v, MF_ALPHA_v, MF_ORDER_v, &
434 PolyOrder_h, PolyOrder_v )
440 real(RP),
intent(in) :: MF_ETAC_h
441 real(RP),
intent(in) :: MF_ALPHA_h
442 integer,
intent(in) :: MF_ORDER_h
443 real(RP),
intent(in) :: MF_ETAC_v
444 real(RP),
intent(in) :: MF_ALPHA_v
445 integer,
intent(in) :: MF_ORDER_v
446 integer,
intent(in) :: PolyOrder_h
447 integer,
intent(in) :: PolyOrder_v
452 call elem3d%Init( polyorder_h, polyorder_v, .false. )
456 mf_etac_h, mf_alpha_h, mf_order_h, &
457 mf_etac_v, mf_alpha_v, mf_order_v )
461 end subroutine setup_modalfilter
module FElib / Element / Base
subroutine, public elementbase3d_init(elem, lumpedmat_flag)
Initialize an object to manage a 3D reference element.
subroutine, public elementbase3d_final(elem)
Finalize an object to manage a 3D reference element.
module FElib / Element / hexahedron
module FElib / Element/ ModalFilter
module FElib / Element / Operation / Base
module FElib / Element / Operation with arbitary elements
Module common / sparsemat.
Derived type representing a 3D reference element.
Derived type representing a hexahedral element.
Derived type representing a modal filter.
Derived type to manage a sparse matrix.