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(:,:)
85 procedure :: generate_l2projmat => elementbase2d_gen_l2projmat
86 procedure :: generate_interpmat => elementbase2d_gen_interpmat
87 procedure :: generate_modaltruncationmat => elementbase2d_gen_modaltruncationmat
95 intw_intrp, x_intrp, y_intrp )
result(IntrpMat)
100 integer,
intent(in) :: intrppolyorder
101 real(rp),
intent(out),
optional :: intw_intrp(intrppolyorder**2)
102 real(rp),
intent(out),
optional :: x_intrp(intrppolyorder**2)
103 real(rp),
intent(out),
optional :: y_intrp(intrppolyorder**2)
104 real(rp) :: intrpmat(intrppolyorder**2,this%np)
112 integer :: polyorder_h
116 integer,
allocatable :: fmask_h(:,:)
118 integer :: polyorder_v
122 integer,
allocatable :: fmask_v(:,:)
124 integer,
allocatable :: colmask(:,:)
125 integer,
allocatable :: hslice(:,:)
126 integer,
allocatable :: indexh2dto3d(:)
127 integer,
allocatable :: indexh2dto3d_bnd(:)
128 integer,
allocatable :: indexz1dto3d(:)
130 real(rp),
allocatable :: x1(:)
131 real(rp),
allocatable :: x2(:)
132 real(rp),
allocatable :: x3(:)
134 real(rp),
allocatable :: dx1(:,:)
135 real(rp),
allocatable :: dx2(:,:)
136 real(rp),
allocatable :: dx3(:,:)
138 real(rp),
allocatable :: sx1(:,:)
139 real(rp),
allocatable :: sx2(:,:)
140 real(rp),
allocatable :: sx3(:,:)
142 procedure :: generate_l2projmat => elementbase3d_gen_l2projmat
143 procedure :: generate_interpmat => elementbase3d_gen_interpmat
144 procedure :: generate_modaltruncationmat => elementbase3d_gen_modaltruncationmat
155 private :: elementbase_init
156 private :: elementbase_final
158 private :: elementbase2d_gen_nodaltransfermat
159 private :: elementbase3d_gen_nodaltransfermat
166 subroutine elementbase_init( elem, lumpedmat_flag )
169 logical,
intent(in) :: lumpedmat_flag
172 allocate( elem%M(elem%Np, elem%Np) )
173 allocate( elem%invM(elem%Np, elem%Np) )
174 allocate( elem%V(elem%Np, elem%Np) )
175 allocate( elem%invV(elem%Np, elem%Np) )
176 allocate( elem%Lift(elem%Np, elem%NfpTot) )
178 allocate( elem%IntWeight_lgl(elem%Np) )
181 elem%LumpedMatFlag = lumpedmat_flag
183 end subroutine elementbase_init
187 subroutine elementbase_final( elem )
191 if (
allocated(elem%M) )
then
194 deallocate( elem%invM )
196 deallocate( elem%invV )
197 deallocate( elem%Lift )
198 deallocate( elem%IntWeight_lgl )
202 end subroutine elementbase_final
206 function elementbase_islumpedmatrix( elem )
result(lumpedmat_flag)
209 logical :: lumpedmat_flag
212 lumpedmat_flag = elem%LumpedMatFlag
214 end function elementbase_islumpedmatrix
222 MassMat, invMassMat )
225 integer,
intent(in) :: np
226 real(rp),
intent(in) :: v(np,np)
227 real(rp),
intent(out) :: massmat(np,np)
228 real(rp),
intent(out),
optional :: invmassmat(np,np)
230 real(rp) :: tmpmat(np,np)
231 real(rp) :: invm(np,np)
234 tmpmat(:,:) = transpose(v)
235 invm(:,:) = matmul( v, tmpmat )
238 if (
present(invmassmat) ) invmassmat(:,:) = invm(:,:)
248 integer,
intent(in) :: np
249 real(rp),
intent(in) :: massmat(np,np)
250 real(rp),
intent(in) :: invmassmat(np,np)
251 real(rp),
intent(in) :: dmat(np,np)
252 real(rp),
intent(out) :: stiffmat(np,np)
254 real(rp) :: tmpmat1(np,np)
255 real(rp) :: tmpmat2(np,np)
258 tmpmat1(:,:) = matmul( massmat, dmat )
259 tmpmat2(:,:) = transpose( tmpmat1 )
260 stiffmat(:,:) = matmul( invmassmat, tmpmat2 )
271 integer,
intent(in) :: np
272 integer,
intent(in) :: nfptot
273 real(rp),
intent(in) :: invm(np,np)
274 real(rp),
intent(in) :: emat(np,nfptot)
275 real(rp),
intent(out) :: liftmat(np,nfptot)
278 liftmat(:,:) = matmul( invm, emat )
292 logical,
intent(in) :: lumpedmat_flag
295 call elementbase_init( elem, lumpedmat_flag )
300 allocate( elem%x1(elem%Np) )
301 allocate( elem%Fmask(elem%Nfp, elem%Nfaces) )
303 allocate( elem%Dx1(elem%Np, elem%Np) )
304 allocate( elem%Sx1(elem%Np, elem%Np) )
316 if (
allocated( elem%x1 ) )
then
319 deallocate( elem%x1 )
320 deallocate( elem%Dx1 )
321 deallocate( elem%Sx1 )
322 deallocate( elem%Fmask )
325 call elementbase_final( elem )
340 logical,
intent(in) :: lumpedmat_flag
343 call elementbase_init( elem, lumpedmat_flag )
348 allocate( elem%x1(elem%Np), elem%x2(elem%Np) )
349 allocate( elem%Fmask(elem%Nfp, elem%Nfaces) )
351 allocate( elem%Dx1(elem%Np, elem%Np), elem%Dx2(elem%Np, elem%Np) )
352 allocate( elem%Sx1(elem%Np, elem%Np), elem%Sx2(elem%Np, elem%Np) )
365 if (
allocated( elem%x1 ) )
then
368 deallocate( elem%x1, elem%x2 )
369 deallocate( elem%Fmask )
371 deallocate( elem%Dx1, elem%Dx2 )
372 deallocate( elem%Sx1, elem%Sx2 )
375 call elementbase_final( elem )
386 subroutine elementbase2d_gen_l2projmat( elem, &
392 real(rp),
intent(out) :: l2projmat(elem%np,elem_in%np)
395 call elementbase2d_gen_nodaltransfermat( elem, elem_in, &
399 end subroutine elementbase2d_gen_l2projmat
406 subroutine elementbase2d_gen_interpmat( elem, &
412 real(rp),
intent(out) :: interpmat(elem%np,elem_in%np)
415 call elementbase2d_gen_nodaltransfermat( elem, elem_in, &
419 end subroutine elementbase2d_gen_interpmat
423 subroutine elementbase2d_gen_modaltruncationmat( elem, &
428 integer,
intent(in) :: polyorder_tr
429 real(rp),
intent(out) :: truncatemat(elem%np,elem%np)
432 call elementbase2d_gen_nodaltransfermat( elem, elem, &
436 end subroutine elementbase2d_gen_modaltruncationmat
448 logical,
intent(in) :: lumpedmat_flag
451 call elementbase_init( elem, lumpedmat_flag )
456 allocate( elem%x1(elem%Np), elem%x2(elem%Np), elem%x3(elem%Np) )
457 allocate( elem%Dx1(elem%Np, elem%Np), elem%Dx2(elem%Np, elem%Np), elem%Dx3(elem%Np, elem%Np) )
458 allocate( elem%Sx1(elem%Np, elem%Np), elem%Sx2(elem%Np, elem%Np), elem%Sx3(elem%Np, elem%Np) )
459 allocate( elem%Fmask_h(elem%Nfp_h, elem%Nfaces_h), elem%Fmask_v(elem%Nfp_v, elem%Nfaces_v) )
460 allocate( elem%Colmask(elem%Nnode_v,elem%Nfp_v))
461 allocate( elem%Hslice(elem%Nfp_v,elem%Nnode_v) )
462 allocate( elem%IndexH2Dto3D(elem%Np) )
463 allocate( elem%IndexH2Dto3D_bnd(elem%NfpTot) )
464 allocate( elem%IndexZ1Dto3D(elem%Np) )
479 if (
allocated( elem%x1 ) )
then
485 deallocate( elem%x1, elem%x2, elem%x3 )
486 deallocate( elem%Dx1, elem%Dx2, elem%Dx3 )
487 deallocate( elem%Sx1, elem%Sx2, elem%Sx3 )
488 deallocate( elem%Fmask_h, elem%Fmask_v )
489 deallocate( elem%Colmask, elem%Hslice )
490 deallocate( elem%IndexH2Dto3D, elem%IndexH2Dto3D_bnd )
491 deallocate( elem%IndexZ1Dto3D )
494 call elementbase_final( elem )
505 subroutine elementbase3d_gen_l2projmat( elem, &
511 real(rp),
intent(out) :: l2projmat(elem%np,elem_in%np)
514 call elementbase3d_gen_nodaltransfermat( elem, elem_in, &
515 elem%PolyOrder_h, elem%PolyOrder_v, &
518 end subroutine elementbase3d_gen_l2projmat
525 subroutine elementbase3d_gen_interpmat( elem, &
532 real(rp),
intent(out) :: interpmat(elem%np,elem_in%np)
535 call elementbase3d_gen_nodaltransfermat( elem, elem_in, &
536 elem_in%PolyOrder_h, elem_in%PolyOrder_v, &
539 end subroutine elementbase3d_gen_interpmat
543 subroutine elementbase3d_gen_modaltruncationmat( elem, &
544 polyOrder_h_tr, polyOrder_v_tr, &
549 integer,
intent(in) :: polyorder_h_tr
550 integer,
intent(in) :: polyorder_v_tr
551 real(rp),
intent(out) :: truncatemat(elem%np,elem%np)
554 call elementbase3d_gen_nodaltransfermat( elem, elem, &
555 polyorder_h_tr, polyorder_v_tr, &
558 end subroutine elementbase3d_gen_modaltruncationmat
571 subroutine elementbase2d_gen_nodaltransfermat( elem, elem_in, &
577 integer,
intent(in) :: pmax
578 real(rp),
intent(out) :: transfermat(elem%np,elem_in%np)
581 integer :: p_out, p_in
583 real(rp) :: invv_in(elem%np,elem_in%np)
586 invv_in(:,:) = 0.0_rp
589 p_out = p1 + (p2-1)*(elem%PolyOrder + 1)
590 p_in = p1 + (p2-1)*(elem_in%PolyOrder + 1)
591 invv_in(p_out,:) = elem_in%invV(p_in,:)
595 transfermat(:,:) = matmul(elem%V, invv_in)
597 end subroutine elementbase2d_gen_nodaltransfermat
607 subroutine elementbase3d_gen_nodaltransfermat( elem, elem_in, &
613 integer,
intent(in) :: pmax_h
614 integer,
intent(in) :: pmax_v
615 real(rp),
intent(out) :: transfermat(elem%np,elem_in%np)
617 integer :: p1, p2, p3
618 integer :: p_out, p_in
620 real(rp) :: invv_in(elem%np,elem_in%np)
623 invv_in(:,:) = 0.0_rp
627 p_out = p1 + (p2-1)*(elem%PolyOrder_h + 1) + (p3-1)*(elem%PolyOrder_h + 1)**2
628 p_in = p1 + (p2-1)*(elem_in%PolyOrder_h + 1) + (p3-1)*(elem_in%PolyOrder_h + 1)**2
629 invv_in(p_out,:) = elem_in%invV(p_in,:)
634 transfermat(:,:) = matmul(elem%V, invv_in)
636 end subroutine elementbase3d_gen_nodaltransfermat
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.