55 real(rp),
public :: xmin_gl
56 real(rp),
public :: xmax_gl
57 real(rp),
public :: ymin_gl
58 real(rp),
public :: ymax_gl
59 real(rp),
public :: zmin_gl
60 real(rp),
public :: zmax_gl
62 real(rp),
allocatable :: fz(:)
64 integer,
allocatable :: rcdomijk2lcmeshid(:,:,:)
66 logical :: isperiodicx
67 logical :: isperiodicy
68 logical :: isperiodicz
74 procedure :: final => meshcubedom3d_final
75 procedure :: generate => meshcubedom3d_generate
76 procedure :: getmesh2d => meshcubedom3d_getmesh2d
77 procedure :: set_geometric_with_vcoord => meshcubedom3d_set_geometric_with_vcoord
102 dom_xmin, dom_xmax, dom_ymin, dom_ymax, dom_zmin, dom_zmax, &
103 isPeriodicX, isPeriodicY, isPeriodicZ, &
104 refElem, NLocalMeshPerPrc, NprcX, NprcY, &
111 integer,
intent(in) :: NeGX
112 integer,
intent(in) :: NeGY
113 integer,
intent(in) :: NeGZ
114 real(RP),
intent(in) :: dom_xmin
115 real(RP),
intent(in) :: dom_xmax
116 real(RP),
intent(in) :: dom_ymin
117 real(RP),
intent(in) :: dom_ymax
118 real(RP),
intent(in) :: dom_zmin
119 real(RP),
intent(in) :: dom_zmax
120 logical,
intent(in) :: isPeriodicX
121 logical,
intent(in) :: isPeriodicY
122 logical,
intent(in) :: isPeriodicZ
124 integer,
intent(in) :: NLocalMeshPerPrc
125 integer,
intent(in) :: NprcX
126 integer,
intent(in) :: NprcY
127 integer,
intent(in),
optional :: nproc
128 integer,
intent(in),
optional :: myrank
129 real(RP),
intent(in),
optional :: FZ(NeGZ+1)
139 this%xmin_gl = dom_xmin
140 this%xmax_gl = dom_xmax
141 this%ymin_gl = dom_ymin
142 this%ymax_gl = dom_ymax
143 this%zmin_gl = dom_zmin
144 this%zmax_gl = dom_zmax
145 this%dom_vol = (this%xmax_gl - this%xmin_gl) * (this%ymax_gl - this%ymin_gl) * (this%zmax_gl - this%zmin_gl)
147 this%isPeriodicX = isperiodicx
148 this%isPeriodicY = isperiodicy
149 this%isPeriodicZ = isperiodicz
156 allocate( this%FZ(this%NeGZ+1) )
157 if (
present(fz) )
then
160 this%FZ(1 ) = dom_zmin
161 this%FZ(this%NeGZ+1) = dom_zmax
162 dz = (dom_zmax - dom_zmin) / dble(this%NeGZ)
164 this%FZ(k) = this%FZ(k-1) + dz
174 call this%refElem2D%Init( this%refElem3D%PolyOrder_h, refelem%IsLumpedMatrix() )
176 call this%mesh2D%Init( this%NeGX, this%NeGY, dom_xmin, dom_xmax, dom_ymin, dom_ymax, &
177 isperiodicx, isperiodicy, this%refElem2D, nlocalmeshperprc, &
178 nprcx, nprcy, nproc, myrank )
185 subroutine meshcubedom3d_final( this )
190 if (this%isGenerated)
then
191 if (
allocated(this%rcdomIJK2LCMeshID) )
then
193 deallocate( this%rcdomIJK2LCMeshID )
196 if (
allocated( this%FZ ) )
deallocate( this%FZ )
199 call this%mesh2D%Final()
200 call this%refElem2D%Final()
205 end subroutine meshcubedom3d_final
208 subroutine meshcubedom3d_getmesh2d( this, ptr_mesh2D )
211 class(
meshbase2d),
pointer,
intent(out) :: ptr_mesh2D
214 ptr_mesh2d => this%mesh2D
216 end subroutine meshcubedom3d_getmesh2d
220 subroutine meshcubedom3d_generate( this )
228 integer :: tileID_table(this%LOCAL_MESH_NUM, this%PRC_NUM)
229 integer :: panelID_table(this%LOCAL_MESH_NUM*this%PRC_NUM)
230 integer :: pi_table(this%LOCAL_MESH_NUM*this%PRC_NUM)
231 integer :: pj_table(this%LOCAL_MESH_NUM*this%PRC_NUM)
232 integer :: pk_table(this%LOCAL_MESH_NUM*this%PRC_NUM)
234 integer :: TILE_NUM_PER_PANEL
238 tile_num_per_panel = this%LOCAL_MESH_NUM_global / 1
243 call messhcubedom3d_assigndomid( this, &
244 tileid_table, panelid_table, &
245 pi_table, pj_table, pk_table )
249 do n=1, this%LOCAL_MESH_NUM
250 mesh => this%lcmesh_list(n)
251 tileid = tileid_table(n, mesh%PRC_myrank+1)
253 call meshcubedom3d_setuplocaldom( mesh, &
254 tileid, panelid_table(tileid), &
255 pi_table(tileid), pj_table(tileid), pk_table(tileid), this%NprcX, this%NprcY, this%NprcZ, &
256 this%xmin_gl, this%xmax_gl, this%ymin_gl, this%ymax_gl, this%zmin_gl, this%zmax_gl, &
257 this%NeGX/this%NprcX, this%NeGY/this%NprcY, this%NeGZ/this%NprcZ, this%FZ(:) )
260 tileid, panelid_table(tileid), &
261 pi_table(tileid), pj_table(tileid), this%NprcX, this%NprcY, &
262 this%xmin_gl, this%xmax_gl, this%ymin_gl, this%ymax_gl, &
263 this%NeGX/this%NprcX, this%NeGY/this%NprcY )
265 call mesh%SetLocalMesh2D( this%mesh2D%lcmesh_list(n) )
280 call this%mesh2D%AssignDomID( &
281 tileid_table, panelid_table, &
284 this%isGenerated = .true.
285 this%mesh2D%isGenerated = .true.
288 end subroutine meshcubedom3d_generate
292 subroutine meshcubedom3d_set_geometric_with_vcoord(this, lcdomID, GsqrtV_lc, zlev_lc, G13_lc, G23_lc)
295 integer,
intent(in) :: lcdomID
296 real(RP),
intent(in) :: GsqrtV_lc(this%refElem3D%Np,this%lcmesh_list(lcdomID)%NeA)
297 real(RP),
intent(in) :: zlev_lc(this%refElem3D%Np,this%lcmesh_list(lcdomID)%NeA)
298 real(RP),
intent(in) :: G13_lc(this%refElem3D%Np,this%lcmesh_list(lcdomID)%NeA)
299 real(RP),
intent(in) :: G23_lc(this%refElem3D%Np,this%lcmesh_list(lcdomID)%NeA)
306 lcmesh => this%lcmesh_list(lcdomid)
307 np = lcmesh%refElem%Np
313 do ke=lcmesh%NeS, lcmesh%NeE
316 lcmesh%zlev(p,ke) = zlev_lc(p,ke)
321 do ke=lcmesh%NeS, lcmesh%NeA
324 lcmesh%Gsqrt(p,ke) = gsqrtv_lc(p,ke)
325 lcmesh%GI3(p,ke,1) = g13_lc(p,ke)
326 lcmesh%GI3(p,ke,2) = g23_lc(p,ke)
334 end subroutine meshcubedom3d_set_geometric_with_vcoord
339 subroutine meshcubedom3d_setuplocaldom( lcmesh, &
341 i, j, k, NprcX, NprcY, NprcZ, &
342 dom_xmin, dom_xmax, dom_ymin, dom_ymax, dom_zmin, dom_zmax, &
357 integer,
intent(in) :: tileID
358 integer,
intent(in) :: panelID
359 integer,
intent(in) :: i, j, k
360 integer,
intent(in) :: NprcX, NprcY, NprcZ
361 real(RP),
intent(in) :: dom_xmin, dom_xmax
362 real(RP),
intent(in) :: dom_ymin, dom_ymax
363 real(RP),
intent(in) :: dom_Zmin, dom_zmax
364 integer,
intent(in) :: NeX, NeY, NeZ
365 real(RP),
intent(in) :: FZ(NeZ*NprcZ+1)
368 real(RP) :: delx, dely
369 real(RP) :: FZ_lc(NeZ+1)
371 integer :: ii, jj, kk
375 elem => lcmesh%refElem3D
377 lcmesh%tileID = tileid
378 lcmesh%panelID = panelid
382 lcmesh%Ne = nex * ney * nez
383 lcmesh%Nv = (nex + 1)*(ney + 1)*(nez + 1)
385 lcmesh%NeE = lcmesh%Ne
386 lcmesh%NeA = lcmesh%Ne + 2*(nex + ney)*nez + 2*nex*ney
394 lcmesh%Ne2D = nex * ney
395 lcmesh%Ne2DA = nex * ney + 2*(nex + ney)
399 delx = (dom_xmax - dom_xmin)/dble(nprcx)
400 dely = (dom_ymax - dom_ymin)/dble(nprcy)
401 fz_lc(:) = fz((k-1)*nez+1:k*nez+1)
402 lcmesh%xmin = dom_xmin + (i-1)*delx
403 lcmesh%xmax = dom_xmin + i *delx
404 lcmesh%ymin = dom_ymin + (j-1)*dely
405 lcmesh%ymax = dom_ymin + j *dely
406 lcmesh%zmin = fz_lc(1)
407 lcmesh%zmax = fz_lc(nez+1)
411 allocate( lcmesh%pos_ev(lcmesh%Nv,3) )
412 allocate( lcmesh%EToV(lcmesh%Ne,elem%Nv) )
413 allocate( lcmesh%EToE(lcmesh%Ne,elem%Nfaces) )
414 allocate( lcmesh%EToF(lcmesh%Ne,elem%Nfaces) )
415 allocate( lcmesh%BCType(lcmesh%refElem%Nfaces,lcmesh%Ne) )
416 allocate( lcmesh%VMapM(elem%NfpTot, lcmesh%Ne) )
417 allocate( lcmesh%VMapP(elem%NfpTot, lcmesh%Ne) )
418 allocate( lcmesh%MapM(elem%NfpTot, lcmesh%Ne) )
419 allocate( lcmesh%MapP(elem%NfpTot, lcmesh%Ne) )
423 allocate( lcmesh%EMap3Dto2D(lcmesh%Ne) )
432 lcmesh%NeX, lcmesh%xmin, lcmesh%xmax, &
433 lcmesh%NeY, lcmesh%ymin, lcmesh%ymax, &
434 lcmesh%NeZ, lcmesh%zmin, lcmesh%zmax, fz=fz_lc )
442 lcmesh%EToV, lcmesh%Ne, elem%Nfaces )
447 lcmesh%pos_en, lcmesh%pos_ev, lcmesh%EToE, lcmesh%EtoF, lcmesh%EtoV, &
448 elem%Fmask_h, elem%Fmask_v, lcmesh%Ne, lcmesh%Nv, elem%Np, elem%Nfp_h, elem%Nfp_v, elem%NfpTot, &
449 elem%Nfaces_h, elem%Nfaces_v, elem%Nfaces )
452 lcmesh%pos_en, lcmesh%xmin, lcmesh%xmax, lcmesh%ymin, lcmesh%ymax, lcmesh%zmin, lcmesh%zmax, &
453 elem%Fmask_h, elem%Fmask_v, lcmesh%Ne, lcmesh%Nv, elem%Np, elem%Nfp_h, elem%Nfp_v, elem%NfpTot, &
454 elem%Nfaces_h, elem%Nfaces_v, elem%Nfaces )
463 ke = ii + (jj-1) * lcmesh%NeX + (kk-1) * lcmesh%NeX * lcmesh%NeY
464 lcmesh%EMap3Dto2D(ke) = ii + (jj-1) * lcmesh%NeX
471 end subroutine meshcubedom3d_setuplocaldom
474 subroutine messhcubedom3d_assigndomid( this, &
475 tileID_table, panelID_table, &
476 pi_table, pj_table, pk_table )
483 integer,
intent(out) :: tileID_table(this%LOCAL_MESH_NUM, this%PRC_NUM)
484 integer,
intent(out) :: panelID_table(this%LOCAL_MESH_NUM*this%PRC_NUM)
485 integer,
intent(out) :: pi_table(this%LOCAL_MESH_NUM*this%PRC_NUM)
486 integer,
intent(out) :: pj_table(this%LOCAL_MESH_NUM*this%PRC_NUM)
487 integer,
intent(out) :: pk_table(this%LOCAL_MESH_NUM*this%PRC_NUM)
492 integer :: is_lc, js_lc, ks_lc
493 integer :: ilc_count, jlc_count, klc_count
494 integer :: ilc, jlc, klc
500 panelid_table, pi_table, pj_table, pk_table, &
501 this%tileID_globalMap, this%tileFaceID_globalMap, this%tilePanelID_globalMap, &
502 this%LOCAL_MESH_NUM_global, 6, 8, &
503 this%isPeriodicX, this%isPeriodicY, this%isPeriodicZ, &
504 this%NprcX, this%NprcY, this%NprcZ )
510 do n=1, this%LOCAL_MESH_NUM
511 tileid = n + (p-1)*this%LOCAL_MESH_NUM
512 lcmesh => this%lcmesh_list(n)
514 tileid_table(n,p) = tileid
515 this%tileID_global2localMap(tileid) = n
516 this%PRCRank_globalMap(tileid) = p - 1
519 if ( this%PRCRank_globalMap(tileid) == lcmesh%PRC_myrank )
then
521 is_lc = pi_table(tileid); ilc_count = 1
522 js_lc = pj_table(tileid); jlc_count = 1
523 ks_lc = pk_table(tileid); klc_count = 1
525 if(is_lc < pi_table(tileid)) ilc_count = ilc_count + 1
526 if(js_lc < pj_table(tileid)) jlc_count = jlc_count + 1
527 if(ks_lc < pk_table(tileid)) klc_count = klc_count + 1
533 allocate( this%rcdomIJK2LCMeshID(ilc_count,jlc_count,klc_count) )
537 this%rcdomIJK2LCMeshID(ilc,jlc,klc) = ilc + (jlc - 1)*ilc_count + (klc - 1)*ilc_count*jlc_count
544 end subroutine messhcubedom3d_assigndomid
547 subroutine meshcubedom3d_coord_conv( x, y, z, xX, xY, xZ, yX, yY, yZ, zX, zY, zZ, &
553 real(rp),
intent(out) :: x(elem%np), y(elem%np), z(elem%np)
554 real(rp),
intent(out) :: xx(elem%np), xy(elem%np), xz(elem%np)
555 real(rp),
intent(out) :: yx(elem%np), yy(elem%np), yz(elem%np)
556 real(rp),
intent(out) :: zx(elem%np), zy(elem%np), zz(elem%np)
557 real(rp),
intent(in) :: vx(elem%nv), vy(elem%nv), vz(elem%nv)
561 x(:) = vx(1) + 0.5_rp*(elem%x1(:) + 1.0_rp)*(vx(2) - vx(1))
562 y(:) = vy(1) + 0.5_rp*(elem%x2(:) + 1.0_rp)*(vy(3) - vy(1))
563 z(:) = vz(1) + 0.5_rp*(elem%x3(:) + 1.0_rp)*(vz(5) - vz(1))
565 xx(:) = 0.5_rp*(vx(2) - vx(1))
569 yy(:) = 0.5_rp*(vy(3) - vy(1))
573 zz(:) = 0.5_rp*(vz(5) - vz(1))
579 subroutine meshcubedom3d_calc_normal( normal_fn, &
580 Escale_f, fid_h, fid_v, elem )
585 real(rp),
intent(out) :: normal_fn(elem%nfptot,3)
586 integer,
intent(in) :: fid_h(elem%nfp_h,elem%nfaces_h)
587 integer,
intent(in) :: fid_v(elem%nfp_v,elem%nfaces_v)
588 real(rp),
intent(in) :: escale_f(elem%nfptot,3,3)
594 normal_fn(fid_h(:,1),d) = - escale_f(fid_h(:,1),2,d)
595 normal_fn(fid_h(:,2),d) = + escale_f(fid_h(:,2),1,d)
596 normal_fn(fid_h(:,3),d) = + escale_f(fid_h(:,3),2,d)
597 normal_fn(fid_h(:,4),d) = - escale_f(fid_h(:,4),1,d)
599 normal_fn(fid_v(:,1),d) = - escale_f(fid_v(:,1),3,d)
600 normal_fn(fid_v(:,2),d) = + escale_f(fid_v(:,2),3,d)
604 end subroutine meshcubedom3d_calc_normal
module FElib / Element / Base
module FElib / Element / hexahedron
module FElib / Element / Quadrilateral
module FElib / Mesh / Local 3D
module FElib / Mesh / Local, Base
integer, parameter, public bctype_interior
module FElib / Mesh / Base 2D
subroutine, public meshbase2d_final(this)
Finalize an object to manage a 2D computational mesh.
subroutine, public meshbase2d_init(this, refelem, nlocalmeshperprc, nprocs, myrank)
Initialize an object to manage a 2D computational mesh.
subroutine, public meshbase2d_setgeometricinfo(lcmesh, coord_conv, calc_normal)
module FElib / Mesh / Base 3D
subroutine, public meshbase3d_init(this, refelem, nlocalmeshperprc, nsidetile, nproc, myrank)
subroutine, public meshbase3d_final(this)
subroutine, public meshbase3d_setgeometricinfo(lcmesh, coord_conv, calc_normal)
module FElib / Mesh / Cubic 3D domain
subroutine meshcubedom3d_init(this, negx, negy, negz, dom_xmin, dom_xmax, dom_ymin, dom_ymax, dom_zmin, dom_zmax, isperiodicx, isperiodicy, isperiodicz, refelem, nlocalmeshperprc, nprcx, nprcy, nproc, myrank, fz)
Initialize an object to manage a cubic 3D domain.
subroutine, public meshcubedom3d_coord_conv(x, y, z, xx, xy, xz, yx, yy, yz, zx, zy, zz, vx, vy, vz, elem)
module FElib / Mesh / Rectangle 2D domain
subroutine, public meshrectdom2d_setuplocaldom(lcmesh, tileid, panelid, i, j, nprcx, nprcy, dom_xmin, dom_xmax, dom_ymin, dom_ymax, nex, ney)
module FElib / Mesh / utility for 3D mesh
subroutine, public meshutil3d_buildglobalmap(panelid_table, pi_table, pj_table, pk_table, tileid_map, tilefaceid_map, tilepanelid_map, ntile, ntileface, ntilevertex, isperiodicx, isperiodicy, isperiodicz, ne_x, ne_y, ne_z)
subroutine, public meshutil3d_buildinteriormap(vmapm, vmapp, mapm, mapp, pos_en, pos_ev, etoe, etof, etov, fmask_h, fmask_v, ne, nv, np, nfp_h, nfp_v, nfptot, nfaces_h, nfaces_v, nfaces)
subroutine, public meshutil3d_genconnectivity(etoe, etof, etov, ne, nfaces)
subroutine, public meshutil3d_gencubedomain(pos_v, etov, ke_x, xmin, xmax, ke_y, ymin, ymax, ke_z, zmin, zmax, fz)
Calculate position of vertices and generate array to map element to vertices for 3D cubic mesh.
subroutine, public meshutil3d_genpatchboundarymap(vmapb, mapb, vmapp, pos_en, xmin, xmax, ymin, ymax, zmin, zmax, fmask_h, fmask_v, ne, nv, np, nfp_h, nfp_v, nfptot, nfaces_h, nfaces_v, nfaces)
Derived type representing a 3D reference element.
Derived type representing a hexahedral element.
Derived type representing a quadrilateral element.
Derived type to manage a local 3D computational domain.
Derived type to manage a computational mesh (base type for 2D domain)
Derived type to manage a computational mesh (base type for 3D domain)
Derived type to manage a cubic 3D computational domain.
Derived type to manage a rectangular 2D computational domain.