10#include "scaleFElib.h"
20 use scale_prc,
only: prc_abort
51 class(MeshBase3D),
pointer :: ptr => null()
57 procedure :: init => meshhierarchylocalmgdata3d_init
58 procedure :: final => meshhierarchylocalmgdata3d_final
63 type(meshptr3d),
pointer :: fine_mesh => null()
64 type(meshptr3d),
pointer :: coarse_mesh => null()
67 real(rp),
allocatable :: pmat1d_f2c(:,:)
68 real(rp),
allocatable :: pmat1d_c2f(:,:)
70 procedure :: init => meshhierarchylevel3d_init
71 procedure :: final => meshhierarchylevel3d_final
79 type(meshptr3d),
allocatable :: p_mesh_list(:)
80 type(meshptr3d),
allocatable :: h_mesh_list(:)
85 procedure :: final => meshhierarchy3d_final
107 porder_list, p_LEVEL_NUM, &
108 NeGX_list, NeGY_list, NeGZ_list, h_LEVEL_NUM )
111 class(
meshbase3d),
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)
117 integer,
intent(in) :: NeGZ_list(h_LEVEL_NUM)
127 class(meshptr3d),
pointer :: fine_mesh_ptr
128 class(meshptr3d),
pointer :: coarse_mesh_ptr
136 if ( parent_mesh%refElem3D%PolyOrder_h /= parent_mesh%refElem3D%PolyOrder_v )
then
137 log_info(
'MeshHierarchy3D_Init',*)
'Currently, PolyOrder_h should equal PolyOrder_v. Check!'
140 if ( porder_list(p_level_num) /= 1 .and. h_level_num > 0 )
then
141 log_info(
'MeshHierarchy3D_Init',*)
'Currently, only p=1 is supported for the coarsest p-mesh level. Check!'
144 if ( h_level_num > 0 )
then
146 do h_lev=2, h_level_num
147 if ( negz_list(h_lev) /= negz )
then
148 log_info(
'MeshHierarchy3D_Init',*)
'Currently, the number of elements should be same in the vertical direction. Check!'
156 allocate( this%elem3D_list(p_level_num) )
157 do poly_lev=1, p_level_num
158 call this%elem3D_list(poly_lev)%Init( porder_list(poly_lev), porder_list(poly_lev), .false. )
161 allocate( this%p_mesh_list(this%NUM_pMG_LEVEL) )
165 select type(parent_mesh)
167 call construct_cubedom3d_mesh( this, this%p_mesh_list(poly_lev)%ptr, &
168 parent_mesh%NeGX, parent_mesh%NeGY, parent_mesh%NeGZ, parent_mesh%FZ, &
169 parent_mesh, this%elem3D_list(poly_lev) )
173 allocate( this%p_level(this%NUM_pMG_LEVEL) )
176 call this%p_level(poly_lev)%Init( poly_lev, this%p_mesh_list(poly_lev)%ptr, &
182 if ( this%NUM_hMG_LEVEL > 0 )
then
183 allocate( this%h_mesh_list(this%NUM_hMG_LEVEL) )
187 select type(parent_mesh)
189 call construct_cubedom3d_mesh( this, this%h_mesh_list(h_lev)%ptr, &
190 negx_list(h_lev), negy_list(h_lev), negz_list(h_lev), parent_mesh%FZ, &
191 parent_mesh, this%elem3D_list(p_level_num) )
195 allocate( this%h_level(this%NUM_hMG_LEVEL) )
198 call this%h_level(h_lev)%Init( h_lev, this%h_mesh_list(h_lev)%ptr, &
208 subroutine meshhierarchy3d_final(this)
220 call this%p_level(poly_lev)%Final()
222 deallocate( this%p_level )
225 mesh3d_ptr => this%p_mesh_list(poly_lev)%ptr
226 select type(mesh3d_ptr)
228 call mesh3d_ptr%Final()
231 deallocate( this%p_mesh_list )
234 if ( this%NUM_hMG_LEVEL > 0 )
then
236 call this%h_level(h_lev)%Final()
238 deallocate( this%h_level )
241 mesh3d_ptr => this%h_mesh_list(h_lev)%ptr
242 select type(mesh3d_ptr)
244 call mesh3d_ptr%Final()
247 deallocate( this%h_mesh_list )
253 end subroutine meshhierarchy3d_final
259 subroutine meshhierarchylevel3d_init( this, &
260 level_id, mesh3D, mesh_list, LEVEL_NUM, &
266 integer,
intent(in) :: level_id
268 integer,
intent(in) :: LEVEL_NUM
269 class(meshptr3d),
intent(in),
target :: mesh_list(LEVEL_NUM)
270 integer,
intent(in) :: hierarchy_type
275 this%hierarchy_type = hierarchy_type
276 this%level_id = level_id
280 if ( level_id > 1 )
then
281 this%fine_mesh => mesh_list(level_id-1)
283 this%fine_mesh => null()
286 if ( level_id < level_num )
then
287 this%coarse_mesh => mesh_list(level_id+1)
289 this%coarse_mesh => null()
294 .and. level_id < level_num )
then
296 allocate( this%pMat1D_c2f(mesh3d%refElem3D%Nnode_h1D,this%coarse_mesh%ptr%refElem3D%Nnode_h1D) )
298 this%coarse_mesh%ptr%refElem3D%Nnode_h1D, mesh3d%refElem3D%Nnode_h1D )
300 allocate( this%pMat1D_f2c(this%coarse_mesh%ptr%refElem3D%Nnode_h1D,mesh3d%refElem3D%Nnode_h1D) )
302 mesh3d%refElem3D%Nnode_h1D, this%coarse_mesh%ptr%refElem3D%Nnode_h1D )
307 .and. level_id < level_num )
then
309 allocate( this%mg_local( mesh3d%LOCAL_MESH_NUM ) )
311 do ldom_id=1, mesh3d%LOCAL_MESH_NUM
312 call this%mg_local(ldom_id)%Init( mesh_list(level_id)%ptr%lcmesh_list(ldom_id), &
313 this%coarse_mesh%ptr%lcmesh_list, mesh_list(level_id)%ptr%refElem3D )
318 end subroutine meshhierarchylevel3d_init
322 subroutine meshhierarchylevel3d_final( this )
329 if (
allocated(this%mg_local) )
then
330 do ldom_id=1,
size(this%mg_local)
331 call this%mg_local(ldom_id)%Final()
333 deallocate( this%mg_local )
336 end subroutine meshhierarchylevel3d_final
340 subroutine meshhierarchylocalmgdata3d_init( this, &
341 lcmesh3D, coarse_lcmesh_list, elem3D )
346 class(
localmesh3d),
intent(in),
target :: coarse_lcmesh_list(:)
352 integer :: i_c, j_c, k_c
355 integer :: ke2i(lcmesh3D%Ne)
356 integer :: ke2j(lcmesh3D%Ne)
357 integer :: ke2k(lcmesh3D%Ne)
360 integer :: lcTileID_c
363 real(RP) :: vx_c(elem3D%Nv)
364 real(RP) :: vy_c(elem3D%Nv)
365 real(RP) :: vz_c(elem3D%Nv)
366 integer :: i_EtoV(elem3D%Nv)
369 real(RP) :: r_c, s_c, t_c
378 this%CoarseLocalMesh_tileIDlist(1) = lcmesh3d%tileID
379 this%CoarseLocalMesh_lcdomIDlist(1) = 1
385 ke = i + (j-1)*lcmesh3d%NeX + (k-1)*lcmesh3d%NeX*lcmesh3d%NeY
386 ke2i(ke) = i; ke2j(ke) = j; ke2k(ke) = k
394 allocate( this%If2c_emap(4,lcmesh3d%Ne/4) )
396 do ke=lcmesh3d%NeS, lcmesh3d%NeE
397 lctileid_c = this%CoarseLocalMesh_tileIDlist(1)
398 lcdomid_c = this%CoarseLocalMesh_lcdomIDlist(1)
400 lcmesh_c => coarse_lcmesh_list(lcdomid_c)
402 i_c = (ke2i(ke)+1)/2; j_c = (ke2j(ke)+1)/2; k_c = ke2k(ke)
403 ke_c = i_c + (j_c-1)*lcmesh_c%NeX + (k_c-1)*lcmesh_c%NeX*lcmesh_c%NeY
404 this%Ic2f_emap(ke) = ke_c
406 i = ke2i(ke) - 2*(i_c-1)
407 j = ke2j(ke) - 2*(j_c-1)
409 this%If2c_emap(i+(j-1)*2,ke_c) = ke
411 i_etov(:) = lcmesh_c%EToV(ke_c,:)
412 vx_c(:) = lcmesh_c%pos_ev(i_etov(:),1)
413 vy_c(:) = lcmesh_c%pos_ev(i_etov(:),2)
414 vz_c(:) = lcmesh_c%pos_ev(i_etov(:),3)
416 r_c = -1.0_rp + 2.0_rp * ( lcmesh3d%pos_en(p,ke,1) - vx_c(1) ) / ( vx_c(2) - vx_c(1) )
417 s_c = -1.0_rp + 2.0_rp * ( lcmesh3d%pos_en(p,ke,2) - vy_c(1) ) / ( vy_c(4) - vy_c(1) )
418 t_c = -1.0_rp + 2.0_rp * ( lcmesh3d%pos_en(p,ke,3) - vz_c(1) ) / ( vz_c(5) - vz_c(1) )
420 this%Ic2f(p,:,ke) = 0.125_rp * &
421 (/ ( 1.0_rp - r_c ) * ( 1.0_rp - s_c ) * ( 1.0_rp - t_c ), ( 1.0_rp + r_c ) * ( 1.0_rp - s_c ) * ( 1.0_rp - t_c ), &
422 ( 1.0_rp - r_c ) * ( 1.0_rp + s_c ) * ( 1.0_rp - t_c ), ( 1.0_rp + r_c ) * ( 1.0_rp + s_c ) * ( 1.0_rp - t_c ), &
423 ( 1.0_rp - r_c ) * ( 1.0_rp - s_c ) * ( 1.0_rp + t_c ), ( 1.0_rp + r_c ) * ( 1.0_rp - s_c ) * ( 1.0_rp + t_c ), &
424 ( 1.0_rp - r_c ) * ( 1.0_rp + s_c ) * ( 1.0_rp + t_c ), ( 1.0_rp + r_c ) * ( 1.0_rp + s_c ) * ( 1.0_rp + t_c ) /)
428 end subroutine meshhierarchylocalmgdata3d_init
432 subroutine meshhierarchylocalmgdata3d_final( this )
439 end subroutine meshhierarchylocalmgdata3d_final
443 subroutine construct_cubedom3d_mesh( this, child_mesh_base_ptr, &
444 NeGX, NeGY, NeGZ, FZ, &
445 parent_mesh, elem3D )
448 class(
meshbase3d),
intent(out),
pointer :: child_mesh_base_ptr
449 integer,
intent(in) :: NeGX
450 integer,
intent(in) :: NeGY
451 integer,
intent(in) :: NeGZ
452 real(RP),
intent(in) :: FZ(NeGZ+1)
459 allocate( child_mesh_ptr )
460 call child_mesh_ptr%Init( negx, negy, negz, &
461 parent_mesh%xmin_gl, parent_mesh%xmax_gl, parent_mesh%ymin_gl, parent_mesh%ymax_gl, &
462 parent_mesh%zmin_gl, parent_mesh%zmax_gl, &
463 parent_mesh%isPeriodicX, parent_mesh%isPeriodicY, parent_mesh%isPeriodicZ, &
464 elem3d, 1, parent_mesh%NprcX, parent_mesh%NprcY, &
467 call child_mesh_ptr%Generate()
469 child_mesh_base_ptr => child_mesh_ptr
471 end subroutine construct_cubedom3d_mesh
module FElib / Element / Base
module FElib / Element / hexahedron
module FElib / Mesh / Local 3D
module FElib / Mesh / Base 3D
module FElib / Mesh / Cubic 3D domain
module FElib / Mesh / 3D domain
subroutine meshhierarchy3d_init(this, parent_mesh, porder_list, p_level_num, negx_list, negy_list, negz_list, h_level_num)
Initialize an object for mesh hierarchy in 3D 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.
Derived type representing a 3D reference element.
Derived type representing a hexahedral element.
Derived type to manage a local 3D computational domain.
Derived type to manage a computational mesh (base type for 3D domain)
Derived type to manage a cubic 3D computational domain.
Derived type for mesh hierarchy in 3D domain.
Derived type to represent mesh hierarchy level in 3D domain.
Derived type to manage 3D local mesh data for multigrid.
Base type for mesh hierarchy.
Base type to manage local mesh data for multigrid.