37 Ke_x, xmin, xmax, Ke_y, ymin, ymax )
41 integer,
intent(in) :: ke_x
42 real(rp),
intent(in) :: xmin, xmax
43 integer,
intent(in) :: ke_y
44 real(rp),
intent(in) :: ymin, ymax
46 real(rp),
intent(out) :: pos_v((ke_x+1)*(ke_y+1),2)
47 integer,
intent(out) :: etov(ke_x*ke_y,4)
60 pos_v(n,1) = (xmax - xmin)*dble(i - 1)/dble(nvx - 1) + xmin
61 pos_v(n,2) = (ymax - ymin)*dble(j - 1)/dble(nvy - 1) + ymin
68 etov(n,1:4) = (j-1)*nvx + &
70 & i + nvx, i+1 + nvx /)
102 integer,
intent(in) :: ne
103 integer,
intent(in) :: nfaces
104 integer,
intent(out) :: etoe(ne, nfaces)
105 integer,
intent(out) :: etof(ne, nfaces)
106 integer,
intent(in) :: etov(ne,4)
108 integer :: nodes(ne*nfaces,2)
109 integer(kind=8) :: face_ids(ne*nfaces)
116 integer :: nnodes_row
117 integer :: matchl(2,3), matchr(2,3)
119 real(rp) :: etoe_1d(ne*nfaces)
120 real(rp) :: etof_1d(ne*nfaces)
122 integer :: spnodetonode(3,ne*nfaces)
123 integer :: spnodetonoderowtmp(3,ne*nfaces)
124 integer :: sort_indx(ne*nfaces)
125 integer(kind=8) :: sorted_faceid(ne*nfaces)
128 nnodes = maxval( etov )
129 nnodes_row =
size(nodes,1)
133 nodes(ke ,:) = etov(ke,(/ 1, 2 /))
134 nodes(ke+ne ,:) = etov(ke,(/ 2, 4 /))
135 nodes(ke+2*ne,:) = etov(ke,(/ 4, 3 /))
136 nodes(ke+3*ne,:) = etov(ke,(/ 3, 1 /))
141 if (nodes(n,1) > nodes(n,2) )
then
143 nodes(n,1) = nodes(n,2)
153 etof(ke,:) = (/ 1, 2, 3, 4 /)
156 face_ids(:) = nodes(:,1)*nnodes + nodes(:,2) + 1
161 spnodetonode(:,n) = (/ n, etoe(ke,f), etof(ke,f) /)
162 sorted_faceid(n) = face_ids(n)
170 spnodetonoderowtmp(:,:) = spnodetonode(:,:)
172 spnodetonode(:,n) = spnodetonoderowtmp(:,sort_indx(n))
179 if ( sorted_faceid(n) - sorted_faceid(n+1) == 0 )
then
180 matchl(:,:) = transpose( spnodetonode(:,(/ n, n+1 /)) )
181 matchr(:,:) = transpose( spnodetonode(:,(/ n+1, n /)) )
183 etoe_1d(matchl(:,1)) = matchr(:,2)
184 etof_1d(matchl(:,1)) = matchr(:,3)
191 if ( etoe_1d(n) /= -1 )
then
192 etoe(ke,f) = etoe_1d(n)
193 etof(ke,f) = etof_1d(n)
214 pos_en, pos_ev, EtoE, EtoF, EtoV, Fmask, Ne, Np, Nfp, Nfaces, Nv)
218 integer,
intent(in) :: ne
219 integer,
intent(in) :: np
220 integer,
intent(in) :: nfp
221 integer,
intent(in) :: nfaces
222 integer,
intent(in) :: nv
224 integer,
intent(out) :: vmapm(nfp,nfaces,ne)
225 integer,
intent(out) :: vmapp(nfp,nfaces,ne)
226 integer,
intent(out) :: mapm(nfp,nfaces,ne)
227 integer,
intent(out) :: mapp(nfp,nfaces,ne)
229 real(rp),
intent(in) :: pos_en(np,ne,2)
230 real(rp),
intent(in) :: pos_ev(nv,2)
231 integer,
intent(in) :: etoe(ne, nfaces)
232 integer,
intent(in) :: etof(ne, nfaces)
233 integer,
intent(in) :: etov(ne, 4)
234 integer,
intent(in) :: fmask(nfp,4)
237 integer :: ke, ke1, ke2
243 integer :: nodeids(np,ne)
244 real(rp) :: x1(nfp,nfp), x2(nfp,nfp)
245 real(rp) :: y1(nfp,nfp), y2(nfp,nfp)
246 real(rp) :: dist(nfp,nfp)
247 real(rp) :: x(np*ne), y(np*ne)
249 integer :: mindist_indx(1)
258 x(n) = pos_en(p,ke,1)
259 y(n) = pos_en(p,ke,2)
267 n = p + (f-1)*nfp + (ke-1)*nfp*nfaces
270 vmapm(p,f,ke) = nodeids(fmask(p,f),ke)
287 ke2 = etoe(ke1,f1); f2 = etof(ke1,f1)
289 v1 = etov(ke1,f1); v2 = etov(ke1,1+mod(f1,nfaces))
291 x1(:,:) = spread( x(vmapm(:,f1,ke1)), 2, nfp )
292 x2(:,:) = spread( x(vmapm(:,f2,ke2)), 1, nfp )
293 y1(:,:) = spread( y(vmapm(:,f1,ke1)), 2, nfp )
294 y2(:,:) = spread( y(vmapm(:,f2,ke2)), 1, nfp )
296 dist(:,:) = (x1(:,:) - x2(:,:))**2 &
297 + (y1(:,:) - y2(:,:))**2
299 mindist_indx(:) = minloc(dist(idm,:))
300 idp = mindist_indx(1)
301 vmapp(idm,f1,ke1) = vmapm(idp,f2,ke2)
302 mapp(idm,f1,ke1) = idp + (f2-1)*nfp + (ke2-1)*nfp*nfaces
346 pos_en, xmin, xmax, ymin, ymax, Fmask, Ne, Np, Nfp, Nfaces, Nv)
350 integer,
intent(in) :: ne
351 integer,
intent(in) :: np
352 integer,
intent(in) :: nfp
353 integer,
intent(in) :: nfaces
354 integer,
intent(in) :: nv
356 integer,
intent(inout),
allocatable :: vmapb(:)
357 integer,
intent(inout),
allocatable :: mapb(:)
358 integer,
intent(inout) :: vmapp(nfp,nfaces,ne)
360 real(rp),
intent(in) :: pos_en(np,ne,2)
361 real(rp),
intent(in) :: xmin, xmax
362 real(rp),
intent(in) :: ymin, ymax
363 integer,
intent(in) :: fmask(nfp,4)
372 real(rp),
parameter :: node_tol = 1.0e-12_rp
374 real(rp) :: ordinfo(nfp*ne,4)
375 integer :: elemids(nfp*ne,4)
376 integer :: faceids(nfp*ne,4)
377 integer :: counterb(4)
378 integer :: mapb_counter
379 real(rp) :: rdomx, rdomy
384 rdomx = 1.0_rp/(xmax - xmin)
385 rdomy = 1.0_rp/(ymax - ymin)
389 x = sum(pos_en(fmask(:,f),ke,1)/dble(nfp))
390 y = sum(pos_en(fmask(:,f),ke,2)/dble(nfp))
392 call eval_domain_boundary(1, y, ymin, x, ke, f, rdomy)
393 call eval_domain_boundary(2, x, xmax, y, ke, f, rdomx)
394 call eval_domain_boundary(3, y, ymax, x, ke, f, rdomy)
395 call eval_domain_boundary(4, x, xmin, y, ke, f, rdomx)
399 allocate( mapb(sum(counterb*nfp)) )
400 allocate( vmapb(
size(mapb)) )
411 ke = elemids(i,b); f = faceids(i,b)
413 vmapp(j,f,ke) = np*ne + mapb_counter
414 vmapb(mapb_counter) = fmask(j,f) + (ke-1)*np
415 mapb_counter = mapb_counter + 1
433 subroutine eval_domain_boundary(domb_id, r, rbc, ord_info, ke_, f_, normalized_fac)
434 integer,
intent(in) :: domb_id
435 real(rp),
intent(in) :: r
436 real(rp),
intent(in) :: rbc
437 real(rp),
intent(in) :: ord_info
438 integer,
intent(in) :: ke_, f_
439 real(rp),
intent(in) :: normalized_fac
442 if ( abs(r - rbc)*normalized_fac < node_tol )
then
443 counterb(domb_id) = counterb(domb_id) + 1
444 ordinfo(counterb(domb_id),domb_id) = ord_info
445 elemids(counterb(domb_id),domb_id) = ke_
446 faceids(counterb(domb_id),domb_id) = f_
450 end subroutine eval_domain_boundary
459 use scale_prc,
only: prc_abort
461 integer,
intent(in) :: halosize
462 integer,
intent(in) :: nex
463 integer,
intent(in) :: ney
464 integer,
intent(in) :: nfp
465 integer,
intent(inout) :: vmapb2( 2*(nex + ney)*nfp*halosize )
466 integer,
intent(in) :: vmapb( 2*(nex + ney)*nfp )
469 integer :: iso, isso, i, ii
470 integer :: ke, p, ph, pv
473 if ( halosize > nfp )
then
474 log_info(
"MeshUtil2D_genPatchBoundaryMap_wide",*)
"HaloSize should be <= Nfp. Check!"
484 i = iso + p + (ke-1)*nfp
485 ii = isso + p + (ph-1)*nfp + (ke-1)*nfp*halosize
486 vmapb2(ii) = vmapb(i) + (ph-1)*nfp
493 iso = iso + nex * nfp
494 isso = isso + nex * nfp*halosize
498 i = iso + p + (ke-1)*nfp
499 ii = isso + p + (ph-1)*nfp + (ke-1)*nfp*halosize
500 vmapb2(ii) = vmapb(i) - (ph-1)
507 iso = iso + ney * nfp
508 isso = isso + ney * nfp*halosize
512 i = iso + p + (ke-1)*nfp
513 ii = isso + p + (ph-1)*nfp + (ke-1)*nfp*halosize
514 vmapb2(ii) = vmapb(i) - (ph-1)*nfp
521 iso = iso + nex * nfp
522 isso = isso + nex * nfp*halosize
526 i = iso + p + (ke-1)*nfp
527 ii = isso + p + (ph-1)*nfp + (ke-1)*nfp*halosize
528 vmapb2(ii) = vmapb(i) + (ph-1)
537 panelID_table, pi_table, pj_table, &
538 tileID_map, tileFaceID_map, tilePanelID_map, &
539 Ntile, isPeriodicX, isPeriodicY, &
544 integer,
intent(in) :: ntile
545 integer,
intent(out) :: panelid_table(ntile)
546 integer,
intent(out) :: pi_table(ntile)
547 integer,
intent(out) :: pj_table(ntile)
548 integer,
intent(out) :: tileid_map(4,ntile)
549 integer,
intent(out) :: tilefaceid_map(4,ntile)
550 integer,
intent(out) :: tilepanelid_map(4,ntile)
551 logical,
intent(in) :: isperiodicx
552 logical,
intent(in) :: isperiodicy
553 integer,
intent(in) :: ne_x
554 integer,
intent(in) :: ne_y
556 integer :: ntileperpanel
558 integer,
allocatable :: nodesid_2d(:,:)
559 integer,
allocatable :: etov(:,:)
560 integer,
allocatable :: etoe(:,:)
561 integer,
allocatable :: etof(:,:)
564 integer :: tileid, tileid_r
569 ntileperpanel = ntile/1
572 allocate( nodesid_2d(nvx, nvy) )
573 allocate( etov(ntile,4), etoe(ntile,4), etof(ntile,4) )
578 counter = counter + 1
579 nodesid_2d(i,j) = counter
589 panelid_table(tileid) = 1
590 pi_table(tileid) = i; pj_table(tileid) = j
591 etov(tileid,:) = (/ nodesid_2d(i,j ), nodesid_2d(i+1,j ), &
592 & nodesid_2d(i,j+1), nodesid_2d(i+1,j+1)/)
598 tileid_map(:,:) = transpose(etoe)
599 tilefaceid_map(:,:) = transpose(etof)
603 tileid_r = tileid_map(f,tileid)
604 tilepanelid_map(f,tileid) = panelid_table(tileid_r)
608 if (isperiodicx)
then
610 if (pi_table(tileid) == 1 .and. tilefaceid_map(4,tileid) == 4)
then
611 tileid_map(4,tileid) = ne_x + (pj_table(tileid) - 1)*ne_x
612 tilefaceid_map(4,tileid) = 2
614 if (pi_table(tileid) == ne_x .and. tilefaceid_map(2,tileid) == 2)
then
615 tileid_map(2,tileid) = 1 + (pj_table(tileid) - 1)*ne_x
616 tilefaceid_map(2,tileid) = 4
621 if (isperiodicy)
then
623 if (pj_table(tileid) == 1 .and. tilefaceid_map(1,tileid) == 1)
then
624 tileid_map(1,tileid) = pi_table(tileid) + (ne_y - 1)*ne_x
625 tilefaceid_map(1,tileid) = 3
627 if (pj_table(tileid) == ne_y .and. tilefaceid_map(3,tileid) == 3)
then
628 tileid_map(3,tileid) = pi_table(tileid)
629 tilefaceid_map(3,tileid) = 1
subroutine, public meshutil2d_buildinteriormap(vmapm, vmapp, mapm, mapp, pos_en, pos_ev, etoe, etof, etov, fmask, ne, np, nfp, nfaces, nv)
subroutine, public meshutil2d_buildglobalmap(panelid_table, pi_table, pj_table, tileid_map, tilefaceid_map, tilepanelid_map, ntile, isperiodicx, isperiodicy, ne_x, ne_y)
subroutine, public meshutil2d_genpatchboundarymap(vmapb, mapb, vmapp, pos_en, xmin, xmax, ymin, ymax, fmask, ne, np, nfp, nfaces, nv)