11#include "scaleFElib.h"
45 real(rp),
allocatable :: intrpmat_vpordm1(:,:)
50 procedure,
public :: init => element_operation_general_init
51 procedure,
public :: final => element_operation_general_final
52 procedure,
public :: dx => element_operation_general_dx
53 procedure,
public :: dy => element_operation_general_dy
54 procedure,
public :: dz => element_operation_general_dz
55 procedure,
public :: lift => element_operation_general_lift
56 procedure,
public :: dxdydzlift => element_operation_general_dxdydzlift
57 procedure,
public :: div => element_operation_general_div
58 procedure,
public :: div_var5 => element_operation_general_div_var5
59 procedure,
public :: div_var5_2 => element_operation_general_div_var5_2
60 procedure,
public :: lift_var5 => element_operation_general_lift_var5
61 procedure,
public :: vfilterpm1 => element_operation_general_vfilterpm1
63 procedure,
public :: setup_modalfilter => element_operation_general_setup_modalfilter
64 procedure,
public :: setup_modalfilter_tracer => element_operation_general_setup_modalfilter_tracer
65 procedure,
public :: modalfilter_tracer => element_operation_general_modalfilter_tracer
66 procedure,
public :: modalfilter_var5 => element_operation_general_modalfilter_var5
70 module procedure element_operation_general_generate_vpordm1
79 subroutine element_operation_general_init( this, elem3D, &
83 class(ElementOperationGeneral),
intent(inout) :: this
84 class(ElementBase3D),
intent(in),
target :: elem3D
85 type(SparseMat),
intent(in),
target :: Dx
86 type(SparseMat),
intent(in),
target :: Dy
87 type(SparseMat),
intent(in),
target :: Dz
88 type(SparseMat),
intent(in),
target :: Lift
100 allocate( this%IntrpMat_VPOrdM1(elem3d%Np,elem3d%Np) )
101 call element_operation_general_generate_vpordm1( this%IntrpMat_VPOrdM1, &
105 end subroutine element_operation_general_init
110 subroutine element_operation_general_generate_vpordm1( IntrpMat_VPOrdM1, &
114 real(RP),
intent(out) :: IntrpMat_VPOrdM1(elem3D%Np,elem3D%Np)
116 call elem3d%Generate_ModalTruncationMat( elem3d%PolyOrder_h, elem3d%PolyOrder_v-1, &
119 end subroutine element_operation_general_generate_vpordm1
124 subroutine element_operation_general_setup_modalfilter( this, &
125 MF_ETAC_h, MF_ALPHA_h, MF_ORDER_h, &
126 MF_ETAC_v, MF_ALPHA_v, MF_ORDER_v )
130 real(RP),
intent(in) :: MF_ETAC_h
131 real(RP),
intent(in) :: MF_ALPHA_h
132 integer,
intent(in) :: MF_ORDER_h
133 real(RP),
intent(in) :: MF_ETAC_v
134 real(RP),
intent(in) :: MF_ALPHA_v
135 integer,
intent(in) :: MF_ORDER_v
138 call setup_modalfilter( this%MFilter, &
139 mf_etac_h, mf_alpha_h, mf_order_h, &
140 mf_etac_v, mf_alpha_v, mf_order_v, &
141 this%elem3D%PolyOrder_h, this%elem3D%PolyOrder_v )
144 end subroutine element_operation_general_setup_modalfilter
149 subroutine element_operation_general_setup_modalfilter_tracer( this, &
150 MF_ETAC_h, MF_ALPHA_h, MF_ORDER_h, &
151 MF_ETAC_v, MF_ALPHA_v, MF_ORDER_v )
154 real(RP),
intent(in) :: MF_ETAC_h
155 real(RP),
intent(in) :: MF_ALPHA_h
156 integer,
intent(in) :: MF_ORDER_h
157 real(RP),
intent(in) :: MF_ETAC_v
158 real(RP),
intent(in) :: MF_ALPHA_v
159 integer,
intent(in) :: MF_ORDER_v
162 call setup_modalfilter( this%MFilter_tracer, &
163 mf_etac_h, mf_alpha_h, mf_order_h, &
164 mf_etac_v, mf_alpha_v, mf_order_v, &
165 this%elem3D%PolyOrder_h, this%elem3D%PolyOrder_v )
168 end subroutine element_operation_general_setup_modalfilter_tracer
174 subroutine element_operation_general_final( this )
179 nullify( this%elem3D )
180 nullify( this%Dx_sm, this%Dy_sm, this%Dz_sm, this%Lift_sm )
182 deallocate( this%IntrpMat_VPOrdM1 )
185 end subroutine element_operation_general_final
190 subroutine element_operation_general_dx( this, vec_in, vec_out )
193 real(RP),
intent(in) :: vec_in(this%elem3D%Np)
194 real(RP),
intent(out) :: vec_out(this%elem3D%Np)
198 end subroutine element_operation_general_dx
203 subroutine element_operation_general_dy( this, vec_in, vec_out )
206 real(RP),
intent(in) :: vec_in(this%elem3D%Np)
207 real(RP),
intent(out) :: vec_out(this%elem3D%Np)
211 end subroutine element_operation_general_dy
216 subroutine element_operation_general_dz( this, vec_in, vec_out )
219 real(RP),
intent(in) :: vec_in(this%elem3D%Np)
220 real(RP),
intent(out) :: vec_out(this%elem3D%Np)
224 end subroutine element_operation_general_dz
229 subroutine element_operation_general_lift( this, vec_in, vec_out )
232 real(RP),
intent(in) :: vec_in(this%elem3D%NfpTot)
233 real(RP),
intent(out) :: vec_out(this%elem3D%Np)
237 end subroutine element_operation_general_lift
242 subroutine element_operation_general_dxdydzlift( this, vec_in, vec_in_lift, vec_out_dx, vec_out_dy, vec_out_dz, vec_out_lift )
245 real(RP),
intent(in) :: vec_in(this%elem3D%Np)
246 real(RP),
intent(in) :: vec_in_lift(this%elem3D%NfpTot)
247 real(RP),
intent(out) :: vec_out_dx(this%elem3D%Np)
248 real(RP),
intent(out) :: vec_out_dy(this%elem3D%Np)
249 real(RP),
intent(out) :: vec_out_dz(this%elem3D%Np)
250 real(RP),
intent(out) :: vec_out_lift(this%elem3D%Np)
258 end subroutine element_operation_general_dxdydzlift
263 subroutine element_operation_general_div( this, vec_in, vec_in_lift, &
267 real(RP),
intent(in) :: vec_in(this%elem3D%Np,3)
268 real(RP),
intent(in) :: vec_in_lift(this%elem3D%NfpTot)
269 real(RP),
intent(out) :: vec_out(this%elem3D%Np,4)
277 end subroutine element_operation_general_div
283 subroutine element_operation_general_div_var5( this, vec_in, vec_in_lift, &
287 real(RP),
intent(in) :: vec_in(this%elem3D%Np,3,5)
288 real(RP),
intent(in) :: vec_in_lift(this%elem3D%NfpTot,5)
289 real(RP),
intent(out) :: vec_out_d(this%elem3D%Np,4,5)
303 end subroutine element_operation_general_div_var5
308 subroutine element_operation_general_div_var5_2( this, vec_in, &
312 real(RP),
intent(in) :: vec_in(this%elem3D%Np,3,5)
313 real(RP),
intent(out) :: vec_out_d(this%elem3D%Np,3,5)
324 end subroutine element_operation_general_div_var5_2
328 subroutine element_operation_general_lift_var5( this, vec_in, vec_out )
331 real(RP),
intent(in) :: vec_in(this%elem3D%NfpTot,5)
332 real(RP),
intent(out) :: vec_out(this%elem3D%Np,5)
340 end subroutine element_operation_general_lift_var5
343 subroutine element_operation_general_vfilterpm1( this, vec_in, vec_out )
346 real(RP),
intent(in) :: vec_in(this%elem3D%Np)
347 real(RP),
intent(out) :: vec_out(this%elem3D%Np)
350 call matmul_( this%IntrpMat_VPOrdM1, vec_in, this%elem3D%Np, &
353 end subroutine element_operation_general_vfilterpm1
356 subroutine matmul_( IntrpMat_VPOrdM1, vec_in_, Np, vec_out_ )
358 integer,
intent(in) :: Np
359 real(RP),
intent(in) :: IntrpMat_VPOrdM1(Np,Np)
360 real(RP),
intent(in) :: vec_in_(Np)
361 real(RP),
intent(out) :: vec_out_(Np)
363 vec_out_(:) = matmul( intrpmat_vpordm1(:,:), vec_in_(:) )
365 end subroutine matmul_
368 subroutine element_operation_general_modalfilter_tracer( this, vec_in, vec_work, vec_out )
371 real(RP),
intent(in) :: vec_in(this%elem3D%Np)
372 real(RP),
intent(out) :: vec_work(this%elem3D%Np)
373 real(RP),
intent(out) :: vec_out(this%elem3D%Np)
375 integer :: ii, kk, Np
384 mik = this%MFilter_tracer%FilterMat(ii,kk)
385 vec_out(ii) = vec_out(ii) + mik * vec_in(kk)
390 end subroutine element_operation_general_modalfilter_tracer
393 subroutine element_operation_general_modalfilter_var5( this, vec_in, vec_work, vec_out )
396 real(RP),
intent(in) :: vec_in(this%elem3D%Np,5)
397 real(RP),
intent(out) :: vec_work(this%elem3D%Np)
398 real(RP),
intent(out) :: vec_out(this%elem3D%Np,5)
400 integer :: ii, kk, Np
405 vec_out(:,:) = 0.0_rp
409 mik = this%MFilter%FilterMat(ii,kk)
411 vec_out(ii,1) = vec_out(ii,1) + mik * vec_in(kk,1)
412 vec_out(ii,2) = vec_out(ii,2) + mik * vec_in(kk,2)
413 vec_out(ii,3) = vec_out(ii,3) + mik * vec_in(kk,3)
414 vec_out(ii,4) = vec_out(ii,4) + mik * vec_in(kk,4)
415 vec_out(ii,5) = vec_out(ii,5) + mik * vec_in(kk,5)
420 end subroutine element_operation_general_modalfilter_var5
425 subroutine setup_modalfilter( MFilter, &
426 MF_ETAC_h, MF_ALPHA_h, MF_ORDER_h, &
427 MF_ETAC_v, MF_ALPHA_v, MF_ORDER_v, &
428 PolyOrder_h, PolyOrder_v )
434 real(RP),
intent(in) :: MF_ETAC_h
435 real(RP),
intent(in) :: MF_ALPHA_h
436 integer,
intent(in) :: MF_ORDER_h
437 real(RP),
intent(in) :: MF_ETAC_v
438 real(RP),
intent(in) :: MF_ALPHA_v
439 integer,
intent(in) :: MF_ORDER_v
440 integer,
intent(in) :: PolyOrder_h
441 integer,
intent(in) :: PolyOrder_v
446 call elem3d%Init( polyorder_h, polyorder_v, .false. )
450 mf_etac_h, mf_alpha_h, mf_order_h, &
451 mf_etac_v, mf_alpha_v, mf_order_v )
455 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
integer, public element_operator_type_general
Type ID of general operator.
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.
Base type for elementwise operations.
Derived type for elementwise operations with arbitary elements.
Derived type to manage a sparse matrix.