FE-Project
Loading...
Searching...
No Matches
scale_element_base Module Reference

module FElib / Element / Base More...

Data Types

type  elementbase
 Derived type representing an arbitrary finite element. More...
type  elementbase1d
 Derived type representing a 1D reference element. More...
type  elementbase2d
 Derived type representing a 2D reference element. More...
interface  elementbase2d_genintgausslegendreintrpmat
type  elementbase3d
 Derived type representing a 3D reference element. More...

Functions/Subroutines

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 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.
subroutine, public elementbase2d_init (elem, lumpedmat_flag)
 Initialize an object to manage a 2D reference element.
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 elementbase3d_final (elem)
 Finalize an object to manage a 3D reference element.

Detailed Description

module FElib / Element / Base

Description
A base module for finite element
Author
Yuta Kawai, Team SCALE

Function/Subroutine Documentation

◆ elementbase_construct_massmat()

subroutine, public scale_element_base::elementbase_construct_massmat ( real(rp), dimension(np,np), intent(in) v,
integer, intent(in) np,
real(rp), dimension(np,np), intent(out) massmat,
real(rp), dimension(np,np), intent(out), optional invmassmat )

Construct mass matrix M^-1 = V V^T M = ( M^-1 )^-1.

Definition at line 221 of file scale_element_base.F90.

224 implicit none
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)
229
230 real(RP) :: tmpMat(Np,Np)
231 real(RP) :: invM(Np,Np)
232 !------------------------------------
233
234 tmpmat(:,:) = transpose(v)
235 invm(:,:) = matmul( v, tmpmat )
236 massmat(:,:) = linalgebra_inv( invm )
237
238 if ( present(invmassmat) ) invmassmat(:,:) = invm(:,:)
239 return
Module common / Linear algebra.
real(rp) function, dimension(size(a, 1), size(a, 2)), public linalgebra_inv(a)
Calculate a inversion of matrix A.

References scale_linalgebra::linalgebra_inv().

Referenced by scale_element_hexahedral::hexhedralelement_init(), scale_element_base::elementbase::islumpedmatrix(), scale_element_line::lineelement_init(), and scale_element_quadrilateral::quadrilateralelement_init().

◆ elementbase_construct_stiffmat()

subroutine, public scale_element_base::elementbase_construct_stiffmat ( real(rp), dimension(np,np), intent(in) massmat,
real(rp), dimension(np,np), intent(in) invmassmat,
real(rp), dimension(np,np), intent(in) dmat,
integer, intent(in) np,
real(rp), dimension(np,np), intent(out) stiffmat )

Construct stiffness matrix StiffMat_i = M^-1 ( M D_xi )^T.

Definition at line 245 of file scale_element_base.F90.

247 implicit none
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)
253
254 real(RP) :: tmpMat1(Np,Np)
255 real(RP) :: tmpMat2(Np,Np)
256 !------------------------------------
257
258 tmpmat1(:,:) = matmul( massmat, dmat )
259 tmpmat2(:,:) = transpose( tmpmat1 )
260 stiffmat(:,:) = matmul( invmassmat, tmpmat2 )
261
262 return

Referenced by scale_element_hexahedral::hexhedralelement_init(), scale_element_base::elementbase::islumpedmatrix(), scale_element_line::lineelement_init(), and scale_element_quadrilateral::quadrilateralelement_init().

◆ elementbase_construct_liftmat()

subroutine, public scale_element_base::elementbase_construct_liftmat ( real(rp), dimension(np,np), intent(in) invm,
real(rp), dimension(np,nfptot), intent(in) emat,
integer, intent(in) np,
integer, intent(in) nfptot,
real(rp), dimension(np,nfptot), intent(out) liftmat )

Construct stiffness matrix StiffMat_i = M^-1 ( M D_xi )^T.

Definition at line 268 of file scale_element_base.F90.

270 implicit none
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)
276 !------------------------------------
277
278 liftmat(:,:) = matmul( invm, emat )
279 return

Referenced by scale_element_hexahedral::hexhedralelement_init(), scale_element_base::elementbase::islumpedmatrix(), scale_element_line::lineelement_init(), and scale_element_quadrilateral::quadrilateralelement_init().

◆ elementbase1d_init()

subroutine, public scale_element_base::elementbase1d_init ( class(elementbase1d), intent(inout) elem,
logical, intent(in) lumpedmat_flag )

Initialize an object to manage a 1D reference element.

Parameters
elemObject of finite element
elemFlag whether mass lumping is considered

Definition at line 289 of file scale_element_base.F90.

290 implicit none
291 class(ElementBase1D), intent(inout) :: elem
292 logical, intent(in) :: lumpedmat_flag
293 !-----------------------------------------------------------------------------
294
295 call elementbase_init( elem, lumpedmat_flag )
296
297 !$acc enter data create( elem )
298 !$acc update device( elem%Np, elem%Nfaces, elem%NfpTot, elem%Nv )
299
300 allocate( elem%x1(elem%Np) )
301 allocate( elem%Fmask(elem%Nfp, elem%Nfaces) )
302
303 allocate( elem%Dx1(elem%Np, elem%Np) )
304 allocate( elem%Sx1(elem%Np, elem%Np) )
305 !$acc enter data create( elem%x1, elem%Dx1, elem%Sx1, elem%Fmask )
306 return

Referenced by scale_element_line::lineelement_init().

◆ elementbase1d_final()

subroutine, public scale_element_base::elementbase1d_final ( class(elementbase1d), intent(inout) elem)

Finalize an object to manage a 1D reference element.

Definition at line 311 of file scale_element_base.F90.

312 implicit none
313 class(ElementBase1D), intent(inout) :: elem
314 !-----------------------------------------------------------------------------
315
316 if ( allocated( elem%x1 ) ) then
317 !$acc exit data delete( elem%x1, elem%Dx1, elem%Sx1, elem%Fmask )
318 !$acc exit data delete( elem )
319 deallocate( elem%x1 )
320 deallocate( elem%Dx1 )
321 deallocate( elem%Sx1 )
322 deallocate( elem%Fmask )
323 end if
324
325 call elementbase_final( elem )
326
327 return

Referenced by scale_element_line::lineelement_init().

◆ elementbase2d_init()

subroutine, public scale_element_base::elementbase2d_init ( class(elementbase2d), intent(inout) elem,
logical, intent(in) lumpedmat_flag )

Initialize an object to manage a 2D reference element.

Parameters
elemObject of finite element
elemFlag whether mass lumping is considered

Definition at line 337 of file scale_element_base.F90.

338 implicit none
339 class(ElementBase2D), intent(inout) :: elem
340 logical, intent(in) :: lumpedmat_flag
341 !-----------------------------------------------------------------------------
342
343 call elementbase_init( elem, lumpedmat_flag )
344
345 !$acc enter data create( elem )
346 !$acc update device( elem%Np, elem%Nfaces, elem%NfpTot, elem%Nv )
347
348 allocate( elem%x1(elem%Np), elem%x2(elem%Np) )
349 allocate( elem%Fmask(elem%Nfp, elem%Nfaces) )
350
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) )
353 !$acc enter data create( elem%x1, elem%x2, elem%Dx1, elem%Dx2, elem%Sx1, elem%Sx2, elem%Fmask )
354
355 return

Referenced by scale_element_base::elementbase2d::generate_modaltruncationmat(), and scale_element_quadrilateral::quadrilateralelement_init().

◆ elementbase2d_final()

subroutine, public scale_element_base::elementbase2d_final ( class(elementbase2d), intent(inout) elem)

Finalize an object to manage a 2D reference element.

Definition at line 360 of file scale_element_base.F90.

361 implicit none
362 class(ElementBase2D), intent(inout) :: elem
363 !-----------------------------------------------------------------------------
364
365 if ( allocated( elem%x1 ) ) then
366 !$acc exit data delete( elem%x1, elem%x2, elem%Dx1, elem%Dx2, elem%Sx1, elem%Sx2, elem%Fmask )
367 !$acc exit data delete( elem )
368 deallocate( elem%x1, elem%x2 )
369 deallocate( elem%Fmask )
370
371 deallocate( elem%Dx1, elem%Dx2 )
372 deallocate( elem%Sx1, elem%Sx2 )
373 end if
374
375 call elementbase_final( elem )
376
377 return

Referenced by scale_element_base::elementbase2d::generate_modaltruncationmat(), and scale_element_quadrilateral::quadrilateralelement_init().

◆ elementbase3d_init()

subroutine, public scale_element_base::elementbase3d_init ( class(elementbase3d), intent(inout) elem,
logical, intent(in) lumpedmat_flag )

Initialize an object to manage a 3D reference element.

Parameters
elemObject of finite element
elemFlag whether mass lumping is considered

Definition at line 445 of file scale_element_base.F90.

446 implicit none
447 class(ElementBase3D), intent(inout) :: elem
448 logical, intent(in) :: lumpedmat_flag
449 !-----------------------------------------------------------------------------
450
451 call elementbase_init( elem, lumpedmat_flag )
452
453 !$acc enter data create( elem )
454 !$acc update device( elem%Np, elem%Nfaces, elem%NfpTot, elem%Nv )
455
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) )
465 !$acc enter data create( elem%x1, elem%x2, elem%x3, &
466 !$acc elem%Dx1, elem%Dx2, elem%Dx3, elem%Sx1, elem%Sx2, elem%Sx3, &
467 !$acc elem%Fmask_h, elem%Fmask_v, elem%Colmask, elem%Hslice, &
468 !$acc elem%IndexH2Dto3D, elem%IndexH2Dto3D_bnd, elem%IndexZ1Dto3D )
469 return

Referenced by scale_element_base::elementbase3d::generate_modaltruncationmat(), and scale_element_hexahedral::hexhedralelement_init().

◆ elementbase3d_final()

subroutine, public scale_element_base::elementbase3d_final ( class(elementbase3d), intent(inout) elem)

Finalize an object to manage a 3D reference element.

Definition at line 474 of file scale_element_base.F90.

475 implicit none
476 class(ElementBase3D), intent(inout) :: elem
477 !-----------------------------------------------------------------------------
478
479 if ( allocated( elem%x1 ) ) then
480 !$acc exit data delete( elem%x1, elem%x2, elem%x3, &
481 !$acc elem%Dx1, elem%Dx2, elem%Dx3, elem%Sx1, elem%Sx2, elem%Sx3, &
482 !$acc elem%Fmask_h, elem%Fmask_v, elem%Colmask, elem%Hslice, &
483 !$acc elem%IndexH2Dto3D, elem%IndexH2Dto3D_bnd, elem%IndexZ1Dto3D )
484 !$acc exit data delete( elem )
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 )
492 end if
493
494 call elementbase_final( elem )
495
496 return

Referenced by scale_element_base::elementbase3d::generate_modaltruncationmat(), and scale_element_hexahedral::hexhedralelement_init().