10#include "scaleFElib.h"
43 real(rp),
allocatable :: filtermat(:,:)
46 procedure :: init_quadrilateral => modalfilter_init_quadrilateral
47 procedure :: init_hexahedral => modalfilter_init_hexahedral
48 generic :: init => init_line, init_quadrilateral, init_hexahedral
49 procedure :: final => modalfilter_final
58 private :: get_exp_filter
69 real(RP),
intent(in) :: etac
70 real(RP),
intent(in) :: alpha
71 integer,
intent(in) :: ord
72 logical,
intent(in),
optional :: tend_flag
74 real(RP) :: filter1D(elem%Np)
80 if (
present(tend_flag) ) tend_flag_ = tend_flag
82 call get_exp_filter( filter1d, &
83 etac, alpha, ord, elem%Np, elem%PolyOrder, &
86 allocate( this%FilterMat(elem%Np,elem%Np) )
87 this%FilterMat(:,:) = 0.0_rp
89 this%FilterMat(p,p) = filter1d(p)
91 this%FilterMat(:,:) = matmul(this%FilterMat, elem%invV)
92 this%FilterMat(:,:) = matmul(elem%V, this%FilterMat)
98 subroutine modalfilter_init_quadrilateral( this, & ! (inout)
106 real(RP),
intent(in) :: etac
107 real(RP),
intent(in) :: alpha
108 integer,
intent(in) :: ord
109 logical,
intent(in),
optional :: tend_flag
111 real(RP) :: filter1D(elem%Nfp)
114 logical :: tend_flag_
118 if (
present(tend_flag) ) tend_flag_ = tend_flag
120 call get_exp_filter( filter1d, &
121 etac, alpha, ord, elem%Nfp, elem%PolyOrder, &
124 allocate( this%FilterMat(elem%Np,elem%Np) )
125 this%FilterMat(:,:) = 0.0_rp
128 l = p1 + (p2-1)*elem%Nfp
129 this%FilterMat(l,l) = filter1d(p1) * filter1d(p2)
132 this%FilterMat(:,:) = matmul(this%FilterMat, elem%invV)
133 this%FilterMat(:,:) = matmul(elem%V, this%FilterMat)
136 end subroutine modalfilter_init_quadrilateral
138 subroutine modalfilter_init_hexahedral( this, & ! (inout)
140 etac_h, alpha_h, ord_h, &
141 etac_v, alpha_v, ord_v, &
147 real(RP),
intent(in) :: etac_h
148 real(RP),
intent(in) :: alpha_h
149 integer,
intent(in) :: ord_h
150 real(RP),
intent(in) :: etac_v
151 real(RP),
intent(in) :: alpha_v
152 integer,
intent(in) :: ord_v
153 logical,
intent(in),
optional :: tend_flag
155 real(RP) :: filter1D_h(elem%Nnode_h1D)
156 real(RP) :: filter1D_v(elem%Nnode_v)
157 integer :: p1, p2, p3
159 logical :: tend_flag_
163 if (
present(tend_flag) ) tend_flag_ = tend_flag
165 call get_exp_filter( filter1d_h, &
166 etac_h, alpha_h, ord_h, elem%Nnode_h1D, elem%PolyOrder_h, &
169 call get_exp_filter( filter1d_v, &
170 etac_v, alpha_v, ord_v, elem%Nnode_v, elem%PolyOrder_v, &
173 allocate( this%FilterMat(elem%Np,elem%Np) )
174 this%FilterMat(:,:) = 0.0_rp
175 do p3=1, elem%Nnode_v
176 do p2=1, elem%Nnode_h1D
177 do p1=1, elem%Nnode_h1D
178 l = p1 + (p2-1)*elem%Nnode_h1D + (p3-1)*elem%Nnode_h1D**2
179 this%FilterMat(l,l) = filter1d_h(p1) * filter1d_h(p2) * filter1d_v(p3)
183 this%FilterMat(:,:) = matmul(this%FilterMat, elem%invV)
184 this%FilterMat(:,:) = matmul(elem%V, this%FilterMat)
187 end subroutine modalfilter_init_hexahedral
189 subroutine modalfilter_final( this )
195 if(
allocated(this%FilterMat) )
then
197 deallocate( this%FilterMat )
200 end subroutine modalfilter_final
204 subroutine get_exp_filter( filter, &
205 etac, alpha, ord, Np, polyOrder, &
209 integer,
intent(in) :: Np
210 real(RP),
intent(out) :: filter(Np)
211 real(RP),
intent(in) :: etac
212 real(RP),
intent(in) :: alpha
213 integer ,
intent(in) :: ord
214 integer ,
intent(in) :: polyOrder
215 logical,
intent(in) :: tend_flag
221 if ( tend_flag )
then
228 eta = dble(p-1)/dble(polyorder)
229 if ( eta > etac .and. p /= 1)
then
230 filter(p) = - alpha * ( ((eta - etac)/(1.0_rp - etac))**ord )
231 if ( .not. tend_flag ) filter(p) = exp( filter(p) )
236 end subroutine get_exp_filter
module FElib / Element / Base
module FElib / Element / hexahedron
module FElib / Element / line
module FElib / Element/ ModalFilter
subroutine modalfilter_init_line(this, elem, etac, alpha, ord, tend_flag)
module FElib / Element / Quadrilateral
Derived type representing a 1D reference element.
Derived type representing a 2D reference element.
Derived type representing a 3D reference element.
Derived type representing a hexahedral element.
Derived type representing a line element.
Derived type representing a modal filter.
Derived type representing a quadrilateral element.