10#include "scaleFElib.h"
20 use scale_prc,
only: prc_abort
51 class(MeshBase2D),
pointer :: ptr => null()
57 procedure :: init => meshhierarchylocalmgdata2d_init
58 procedure :: final => meshhierarchylocalmgdata2d_final
63 type(meshptr2d),
pointer :: fine_mesh => null()
64 type(meshptr2d),
pointer :: coarse_mesh => null()
67 real(rp),
allocatable :: pmat1d_f2c(:,:)
68 real(rp),
allocatable :: pmat1d_c2f(:,:)
70 procedure :: init => meshhierarchylevel2d_init
71 procedure :: final => meshhierarchylevel2d_final
79 type(meshptr2d),
allocatable :: p_mesh_list(:)
80 type(meshptr2d),
allocatable :: h_mesh_list(:)
85 procedure :: final => meshhierarchy2d_final
107 porder_list, p_LEVEL_NUM, &
108 NeGX_list, NeGY_list, h_LEVEL_NUM )
111 class(
meshbase2d),
intent(in),
target :: parent_mesh
112 integer,
intent(in) :: p_LEVEL_NUM
113 integer,
intent(in) :: porder_list(p_LEVEL_NUM)
114 integer,
intent(in) :: h_LEVEL_NUM
115 integer,
intent(in) :: NeGX_list(h_LEVEL_NUM)
116 integer,
intent(in) :: NeGY_list(h_LEVEL_NUM)
126 class(meshptr2d),
pointer :: fine_mesh_ptr
127 class(meshptr2d),
pointer :: coarse_mesh_ptr
134 if ( porder_list(p_level_num) /= 1 .and. h_level_num > 0 )
then
135 log_info(
'MeshHierarchy2D_Init',*)
'Currently, only p=1 is supported for the coarsest p-mesh level when h_LEVEL_NUM > 0. Check!'
141 allocate( this%elem2D_list(p_level_num) )
142 do poly_lev=1, p_level_num
143 call this%elem2D_list(poly_lev)%Init( porder_list(poly_lev), .false. )
146 allocate( this%p_mesh_list(this%NUM_pMG_LEVEL) )
150 select type(parent_mesh)
152 call construct_rectdom2d_mesh( this, this%p_mesh_list(poly_lev)%ptr, &
153 parent_mesh%NeGX, parent_mesh%NeGY, &
154 parent_mesh, this%elem2D_list(poly_lev) )
158 allocate( this%p_level(this%NUM_pMG_LEVEL) )
161 call this%p_level(poly_lev)%Init( poly_lev, this%p_mesh_list(poly_lev)%ptr, &
167 allocate( this%h_mesh_list(this%NUM_hMG_LEVEL) )
171 select type(parent_mesh)
173 call construct_rectdom2d_mesh( this, this%h_mesh_list(h_lev)%ptr, &
174 negx_list(h_lev), negy_list(h_lev), &
175 parent_mesh, this%elem2D_list(p_level_num) )
179 allocate( this%h_level(this%NUM_hMG_LEVEL) )
182 call this%h_level(h_lev)%Init( h_lev, this%h_mesh_list(h_lev)%ptr, &
191 subroutine meshhierarchy2d_final(this)
203 call this%p_level(poly_lev)%Final()
205 deallocate( this%p_level )
208 mesh2d_ptr => this%p_mesh_list(poly_lev)%ptr
209 select type(mesh2d_ptr)
211 call mesh2d_ptr%Final()
214 deallocate( this%p_mesh_list )
218 call this%h_level(h_lev)%Final()
220 deallocate( this%h_level )
223 mesh2d_ptr => this%h_mesh_list(h_lev)%ptr
224 select type(mesh2d_ptr)
226 call mesh2d_ptr%Final()
229 deallocate( this%h_mesh_list )
234 end subroutine meshhierarchy2d_final
240 subroutine meshhierarchylevel2d_init( this, &
241 level_id, mesh2D, mesh_list, LEVEL_NUM, &
247 integer,
intent(in) :: level_id
249 integer,
intent(in) :: LEVEL_NUM
250 class(meshptr2d),
intent(in),
target :: mesh_list(LEVEL_NUM)
251 integer,
intent(in) :: hierarchy_type
256 this%hierarchy_type = hierarchy_type
257 this%level_id = level_id
261 if ( level_id > 1 )
then
262 this%fine_mesh => mesh_list(level_id-1)
264 this%fine_mesh => null()
267 if ( level_id < level_num )
then
268 this%coarse_mesh => mesh_list(level_id+1)
270 this%coarse_mesh => null()
275 .and. level_id < level_num )
then
277 allocate( this%pMat1D_c2f(mesh2d%refElem2D%Nfp,this%coarse_mesh%ptr%refElem2D%Nfp) )
279 this%coarse_mesh%ptr%refElem2D%Nfp, mesh2d%refElem2D%Nfp )
281 allocate( this%pMat1D_f2c(this%coarse_mesh%ptr%refElem2D%Nfp,mesh2d%refElem2D%Nfp) )
283 mesh2d%refElem2D%Nfp, this%coarse_mesh%ptr%refElem2D%Nfp )
288 .and. level_id < level_num )
then
290 allocate( this%mg_local( mesh2d%LOCAL_MESH_NUM ) )
292 do ldom_id=1, mesh2d%LOCAL_MESH_NUM
293 call this%mg_local(ldom_id)%Init( mesh_list(level_id)%ptr%lcmesh_list(ldom_id), &
294 this%coarse_mesh%ptr%lcmesh_list, mesh_list(level_id)%ptr%refElem2D )
299 end subroutine meshhierarchylevel2d_init
303 subroutine meshhierarchylevel2d_final( this )
311 if (
allocated(this%pMat1D_c2f) )
deallocate(this%pMat1D_c2f)
312 if (
allocated(this%pMat1D_f2c) )
deallocate(this%pMat1D_f2c)
315 if (
allocated(this%mg_local) )
then
316 do ldom_id=1,
size(this%mg_local)
317 call this%mg_local(ldom_id)%Final()
319 deallocate( this%mg_local )
323 end subroutine meshhierarchylevel2d_final
327 subroutine meshhierarchylocalmgdata2d_init( this, &
328 lcmesh2D, coarse_lcmesh_list, elem2D )
333 class(
localmesh2d),
intent(in),
target :: coarse_lcmesh_list(:)
342 integer :: ke2i(lcmesh2D%Ne)
343 integer :: ke2j(lcmesh2D%Ne)
346 integer :: lcTileID_c
349 real(RP) :: vx_c(elem2D%Nv)
350 real(RP) :: vy_c(elem2D%Nv)
351 integer :: i_EtoV(elem2D%Nv)
362 this%CoarseLocalMesh_tileIDlist(1) = lcmesh2d%tileID
363 this%CoarseLocalMesh_lcdomIDlist(1) = 1
368 ke = i + (j-1)*lcmesh2d%NeX
369 ke2i(ke) = i; ke2j(ke) = j
378 allocate( this%If2c_emap(4,lcmesh2d%Ne/4) )
380 do ke=lcmesh2d%NeS, lcmesh2d%NeE
381 lctileid_c = this%CoarseLocalMesh_tileIDlist(1)
382 lcdomid_c = this%CoarseLocalMesh_lcdomIDlist(1)
384 lcmesh_c => coarse_lcmesh_list(lcdomid_c)
386 i_c = (ke2i(ke)+1)/2; j_c = (ke2j(ke)+1)/2
387 ke_c = i_c + (j_c-1)*lcmesh2d%NeX/2
388 this%Ic2f_emap(ke) = ke_c
390 i = ke2i(ke) - 2*(i_c-1)
391 j = ke2j(ke) - 2*(j_c-1)
392 this%If2c_emap(i+(j-1)*2,ke_c) = ke
394 i_etov(:) = lcmesh_c%EToV(ke_c,:)
395 vx_c(:) = lcmesh_c%pos_ev(i_etov(:),1)
396 vy_c(:) = lcmesh_c%pos_ev(i_etov(:),2)
399 r_c = -1.0_rp + 2.0_rp * ( lcmesh2d%pos_en(p,ke,1) - vx_c(1) ) / ( vx_c(2) - vx_c(1) )
400 s_c = -1.0_rp + 2.0_rp * ( lcmesh2d%pos_en(p,ke,2) - vy_c(1) ) / ( vy_c(3) - vy_c(1) )
402 this%Ic2f(p,1:4,ke) = 0.25_rp * &
403 (/ ( 1.0_rp - r_c ) * ( 1.0_rp - s_c ), ( 1.0_rp + r_c ) * ( 1.0_rp - s_c ), &
404 ( 1.0_rp - r_c ) * ( 1.0_rp + s_c ), ( 1.0_rp + r_c ) * ( 1.0_rp + s_c ) /)
408 end subroutine meshhierarchylocalmgdata2d_init
412 subroutine meshhierarchylocalmgdata2d_final( this )
419 end subroutine meshhierarchylocalmgdata2d_final
423 subroutine construct_rectdom2d_mesh( this, child_mesh_base_ptr, &
425 parent_mesh, elem2D )
428 class(
meshbase2d),
intent(out),
pointer :: child_mesh_base_ptr
429 integer,
intent(in) :: NeGX
430 integer,
intent(in) :: NeGY
437 allocate( child_mesh_ptr )
438 call child_mesh_ptr%Init( negx, negy, &
439 parent_mesh%xmin_gl, parent_mesh%xmax_gl, parent_mesh%ymin_gl, parent_mesh%ymax_gl, &
440 parent_mesh%isPeriodicX, parent_mesh%isPeriodicY, &
441 elem2d, 1, parent_mesh%NprcX, parent_mesh%NprcY )
443 call child_mesh_ptr%Generate()
445 child_mesh_base_ptr => child_mesh_ptr
447 end subroutine construct_rectdom2d_mesh
module FElib / Element / Base
module FElib / Element / Quadrilateral
module FElib / Mesh / Local 2D
module FElib / Mesh / Base 2D
module FElib / Mesh / 2D domain
subroutine meshhierarchy2d_init(this, parent_mesh, porder_list, p_level_num, negx_list, negy_list, h_level_num)
Initialize an object for mesh hierarchy in 2D domain.
module FElib / Mesh / Hierarchy base
subroutine, public meshhierarchy_construct_pmg_mat1d(mat1d, np_i, np_o)
Construct a 1D p-multigrid matrix used for transfer between different p-levels.
integer, parameter, public mesh_hierarchy_type_pmg
Type ID of mesh hierarchy: p-MG.
integer, parameter, public mesh_hierarchy_hmg_finest_level
Finest level index in h-MG.
subroutine, public meshhierarchybase_init(this, p_level_num, h_level_num)
Initialize a base object for mesh hierarchy.
integer, parameter, public mesh_hierarchy_type_hmg
Type ID of mesh hierarchy: h-MG.
subroutine, public meshhierarchylocalmgdatabase_final(this)
Finalize a base object to manage local multigrid data for mesh hierarchy.
subroutine, public meshhierarchybase_final(this)
Finalize a base object for mesh hierarchy.
integer, parameter, public mesh_hierarchy_pmg_finest_level
Finest level index in p-MG.
subroutine, public meshhierarchylocalmgdatabase_init(this, lcmesh)
Initialize a base object to manage local multigrid data for mesh hierarchy.
module FElib / Mesh / Rectangle 2D domain
Derived type representing a 2D reference element.
Derived type representing a quadrilateral element.
Derived type representing a local mesh for 2D domain.
Derived type to manage a computational mesh (base type for 2D domain)
Derived type for mesh hierarchy in 2D domain.
Derived type to represent mesh hierarchy level in 2D domain.
Derived type to manage 2D local mesh data for multigrid.
Base type for mesh hierarchy.
Base type to manage local mesh data for multigrid.
Derived type to manage a rectangular 2D computational domain.