10#include "scaleFElib.h"
35 logical,
private :: lumpedmatflag
37 real(rp),
allocatable :: v(:,:)
38 real(rp),
allocatable :: invv(:,:)
39 real(rp),
allocatable :: m(:,:)
40 real(rp),
allocatable :: invm(:,:)
41 real(rp),
allocatable :: lift(:,:)
42 real(rp),
allocatable :: intweight_lgl(:)
44 procedure :: islumpedmatrix => elementbase_islumpedmatrix
56 integer,
allocatable :: fmask(:,:)
58 real(rp),
allocatable :: x1(:)
60 real(rp),
allocatable :: dx1(:,:)
62 real(rp),
allocatable :: sx1(:,:)
74 integer,
allocatable :: fmask(:,:)
76 real(rp),
allocatable :: x1(:)
77 real(rp),
allocatable :: x2(:)
79 real(rp),
allocatable :: dx1(:,:)
80 real(rp),
allocatable :: dx2(:,:)
82 real(rp),
allocatable :: sx1(:,:)
83 real(rp),
allocatable :: sx2(:,:)
91 intw_intrp, x_intrp, y_intrp )
result(IntrpMat)
96 integer,
intent(in) :: intrppolyorder
97 real(rp),
intent(out),
optional :: intw_intrp(intrppolyorder**2)
98 real(rp),
intent(out),
optional :: x_intrp(intrppolyorder**2)
99 real(rp),
intent(out),
optional :: y_intrp(intrppolyorder**2)
100 real(rp) :: intrpmat(intrppolyorder**2,this%np)
108 integer :: polyorder_h
112 integer,
allocatable :: fmask_h(:,:)
114 integer :: polyorder_v
118 integer,
allocatable :: fmask_v(:,:)
120 integer,
allocatable :: colmask(:,:)
121 integer,
allocatable :: hslice(:,:)
122 integer,
allocatable :: indexh2dto3d(:)
123 integer,
allocatable :: indexh2dto3d_bnd(:)
124 integer,
allocatable :: indexz1dto3d(:)
126 real(rp),
allocatable :: x1(:)
127 real(rp),
allocatable :: x2(:)
128 real(rp),
allocatable :: x3(:)
130 real(rp),
allocatable :: dx1(:,:)
131 real(rp),
allocatable :: dx2(:,:)
132 real(rp),
allocatable :: dx3(:,:)
134 real(rp),
allocatable :: sx1(:,:)
135 real(rp),
allocatable :: sx2(:,:)
136 real(rp),
allocatable :: sx3(:,:)
147 private :: elementbase_init
148 private :: elementbase_final
155 subroutine elementbase_init( elem, lumpedmat_flag )
159 logical,
intent(in) :: lumpedmat_flag
162 allocate( elem%M(elem%Np, elem%Np) )
163 allocate( elem%invM(elem%Np, elem%Np) )
164 allocate( elem%V(elem%Np, elem%Np) )
165 allocate( elem%invV(elem%Np, elem%Np) )
166 allocate( elem%Lift(elem%Np, elem%NfpTot) )
168 allocate( elem%IntWeight_lgl(elem%Np) )
170 elem%LumpedMatFlag = lumpedmat_flag
173 end subroutine elementbase_init
177 subroutine elementbase_final( elem )
183 if (
allocated(elem%M) )
then
185 deallocate( elem%invM )
187 deallocate( elem%invV )
188 deallocate( elem%Lift )
189 deallocate( elem%IntWeight_lgl )
193 end subroutine elementbase_final
197 function elementbase_islumpedmatrix( elem )
result(lumpedmat_flag)
200 logical :: lumpedmat_flag
203 lumpedmat_flag = elem%LumpedMatFlag
205 end function elementbase_islumpedmatrix
213 MassMat, invMassMat )
216 integer,
intent(in) :: np
217 real(rp),
intent(in) :: v(np,np)
218 real(rp),
intent(out) :: massmat(np,np)
219 real(rp),
intent(out),
optional :: invmassmat(np,np)
221 real(rp) :: tmpmat(np,np)
222 real(rp) :: invm(np,np)
225 tmpmat(:,:) = transpose(v)
226 invm(:,:) = matmul( v, tmpmat )
229 if (
present(invmassmat) ) invmassmat(:,:) = invm(:,:)
239 integer,
intent(in) :: np
240 real(rp),
intent(in) :: massmat(np,np)
241 real(rp),
intent(in) :: invmassmat(np,np)
242 real(rp),
intent(in) :: dmat(np,np)
243 real(rp),
intent(out) :: stiffmat(np,np)
245 real(rp) :: tmpmat1(np,np)
246 real(rp) :: tmpmat2(np,np)
249 tmpmat1(:,:) = matmul( massmat, dmat )
250 tmpmat2(:,:) = transpose( tmpmat1 )
251 stiffmat(:,:) = matmul( invmassmat, tmpmat2 )
262 integer,
intent(in) :: np
263 integer,
intent(in) :: nfptot
264 real(rp),
intent(in) :: invm(np,np)
265 real(rp),
intent(in) :: emat(np,nfptot)
266 real(rp),
intent(out) :: liftmat(np,nfptot)
269 liftmat(:,:) = matmul( invm, emat )
284 logical,
intent(in) :: lumpedmat_flag
287 call elementbase_init( elem, lumpedmat_flag )
289 allocate( elem%x1(elem%Np) )
290 allocate( elem%Fmask(elem%Nfp, elem%Nfaces) )
292 allocate( elem%Dx1(elem%Np, elem%Np) )
293 allocate( elem%Sx1(elem%Np, elem%Np) )
306 if (
allocated( elem%x1 ) )
then
307 deallocate( elem%x1 )
308 deallocate( elem%Dx1 )
309 deallocate( elem%Sx1 )
310 deallocate( elem%Fmask )
313 call elementbase_final( elem )
329 logical,
intent(in) :: lumpedmat_flag
332 call elementbase_init( elem, lumpedmat_flag )
334 allocate( elem%x1(elem%Np), elem%x2(elem%Np) )
335 allocate( elem%Fmask(elem%Nfp, elem%Nfaces) )
337 allocate( elem%Dx1(elem%Np, elem%Np), elem%Dx2(elem%Np, elem%Np) )
338 allocate( elem%Sx1(elem%Np, elem%Np), elem%Sx2(elem%Np, elem%Np) )
351 if (
allocated( elem%x1 ) )
then
352 deallocate( elem%x1, elem%x2 )
353 deallocate( elem%Fmask )
355 deallocate( elem%Dx1, elem%Dx2 )
356 deallocate( elem%Sx1, elem%Sx2 )
359 call elementbase_final( elem )
375 logical,
intent(in) :: lumpedmat_flag
378 call elementbase_init( elem, lumpedmat_flag )
380 allocate( elem%x1(elem%Np), elem%x2(elem%Np), elem%x3(elem%Np) )
381 allocate( elem%Dx1(elem%Np, elem%Np), elem%Dx2(elem%Np, elem%Np), elem%Dx3(elem%Np, elem%Np) )
382 allocate( elem%Sx1(elem%Np, elem%Np), elem%Sx2(elem%Np, elem%Np), elem%Sx3(elem%Np, elem%Np) )
383 allocate( elem%Fmask_h(elem%Nfp_h, elem%Nfaces_h), elem%Fmask_v(elem%Nfp_v, elem%Nfaces_v) )
384 allocate( elem%Colmask(elem%Nnode_v,elem%Nfp_v))
385 allocate( elem%Hslice(elem%Nfp_v,elem%Nnode_v) )
386 allocate( elem%IndexH2Dto3D(elem%Np) )
387 allocate( elem%IndexH2Dto3D_bnd(elem%NfpTot) )
388 allocate( elem%IndexZ1Dto3D(elem%Np) )
401 if (
allocated( elem%x1 ) )
then
402 deallocate( elem%x1, elem%x2, elem%x3 )
403 deallocate( elem%Dx1, elem%Dx2, elem%Dx3 )
404 deallocate( elem%Sx1, elem%Sx2, elem%Sx3 )
405 deallocate( elem%Fmask_h, elem%Fmask_v )
406 deallocate( elem%Colmask, elem%Hslice )
407 deallocate( elem%IndexH2Dto3D, elem%IndexH2Dto3D_bnd )
408 deallocate( elem%IndexZ1Dto3D )
411 call elementbase_final( elem )
module FElib / Element / Base
subroutine, public elementbase2d_final(elem)
Finalize an object to manage a 2D reference element.
subroutine, public elementbase3d_init(elem, lumpedmat_flag)
Initialize an object to manage a 3D reference element.
subroutine, public elementbase2d_init(elem, lumpedmat_flag)
Initialize an object to manage a 2D reference element.
subroutine, public elementbase_construct_massmat(v, np, massmat, invmassmat)
Construct mass matrix M^-1 = V V^T M = ( M^-1 )^-1.
subroutine, public elementbase_construct_stiffmat(massmat, invmassmat, dmat, np, stiffmat)
Construct stiffness matrix StiffMat_i = M^-1 ( M D_xi )^T.
subroutine, public elementbase_construct_liftmat(invm, emat, np, nfptot, liftmat)
Construct stiffness matrix StiffMat_i = M^-1 ( M D_xi )^T.
subroutine, public elementbase3d_final(elem)
Finalize an object to manage a 3D reference element.
subroutine, public elementbase1d_init(elem, lumpedmat_flag)
Initialize an object to manage a 1D reference element.
subroutine, public elementbase1d_final(elem)
Finalize an object to manage a 1D reference element.
Module common / Linear algebra.
real(rp) function, dimension(size(a, 1), size(a, 2)), public linalgebra_inv(a)
Calculate a inversion of matrix A.
Derived type representing a 1D reference element.
Derived type representing a 2D reference element.
Derived type representing a 3D reference element.
Derived type representing an arbitrary finite element.