97 integer,
intent(in) :: ne
98 integer,
intent(in) :: nfaces
99 integer,
intent(out) :: etoe(ne, nfaces)
100 integer,
intent(out) :: etof(ne, nfaces)
101 integer,
intent(in) :: etov(ne,2)
103 integer :: nodes(ne*nfaces,1)
104 integer :: face_ids(ne*nfaces)
105 integer :: spnodetonode(ne*nfaces,4)
112 integer :: spnodetonoderowtmp(4)
113 integer :: nnodes_row
114 integer :: matchl(2,4), matchr(2,4)
116 real(rp) :: etoe_1d(ne*nfaces)
117 real(rp) :: etof_1d(ne*nfaces)
120 nnodes = maxval( etov )
121 nnodes_row =
size(nodes,1)
125 nodes(n ,:) = etov(n,(/ 1 /))
126 nodes(n+ne ,:) = etov(n,(/ 2 /))
134 etof(n,:) = (/ 1, 2 /)
137 face_ids(:) = nodes(:,1) + 1
142 spnodetonode(n,:) = (/ face_ids(n), n, etoe(k,f), etof(k,f) /)
148 do n1=1, nnodes_row-1
149 do n2=n1+1, nnodes_row
150 if (spnodetonode(n1,1) > spnodetonode(n2,1))
then
151 spnodetonoderowtmp(:) = spnodetonode(n1,:)
152 spnodetonode(n1,:) = spnodetonode(n2,:)
153 spnodetonode(n2,:) = spnodetonoderowtmp
166 if ( spnodetonode(n,1) - spnodetonode(n+1,1) == 0 )
then
167 matchl(:,:) = spnodetonode((/ n, n+1 /), :)
168 matchr(:,:) = spnodetonode((/ n+1, n /), :)
170 etoe_1d(matchl(:,2)) = matchr(:,3)
171 etof_1d(matchl(:,2)) = matchr(:,4)
178 if ( etoe_1d(n) /= -1 )
then
179 etoe(k,f) = etoe_1d(n)
180 etof(k,f) = etof_1d(n)
201 pos_en, pos_ev, etoe, etof, etov, fmask, ne, np, nfp, nfaces, nv )
206 integer,
intent(in) :: ne
207 integer,
intent(in) :: np
208 integer,
intent(in) :: nfp
209 integer,
intent(in) :: nfaces
210 integer,
intent(in) :: nv
212 integer,
intent(out) :: vmapm(nfp,nfaces,ne)
213 integer,
intent(out) :: vmapp(nfp,nfaces,ne)
214 integer,
intent(out) :: mapm(nfp,nfaces,ne)
215 integer,
intent(out) :: mapp(nfp,nfaces,ne)
217 real(rp),
intent(in) :: pos_en(np,ne,1)
218 real(rp),
intent(in) :: pos_ev(nv,1)
219 integer,
intent(in) :: etoe(ne, nfaces)
220 integer,
intent(in) :: etof(ne, nfaces)
221 integer,
intent(in) :: etov(ne,2)
222 integer,
intent(in) :: fmask(nfp,2)
231 integer :: nodeids(np,ne)
233 real(rp) :: x1(nfp,nfp), x2(nfp,nfp)
234 real(rp) :: dist(nfp,nfp)
249 n = p + (f-1)*nfp + (k-1)*nfp*nfaces
252 vmapm(p,f,k) = nodeids(fmask(p,f),k)
260 k2 = etoe(k1,f1); f2 = etof(k1,f1)
262 v1 = etov(k1,f1); v2 = etov(k1,1+mod(f1,nfaces))
263 refd2 = (pos_ev(v1,1) - pos_ev(v2,1))**2
265 x1(:,:) = spread( x(vmapm(:,f1,k1)), 2, nfp )
266 x2(:,:) = spread( x(vmapm(:,f2,k2)), 1, nfp )
268 dist(:,:) = (x1 - x2)**2
271 if (dist(idm,idp)/refd2 < 1.0e-14_rp)
then
272 vmapp(idm,f1,k1) = vmapm(idp,f2,k2)
273 mapp(idm,f1,k1) = idp + (f2-1)*nfp + (k2-1)*nfp*nfaces
318 pos_en, xmin, xmax, fmask, ne, np, nfp, nfaces, nv )
322 integer,
intent(in) :: ne
323 integer,
intent(in) :: np
324 integer,
intent(in) :: nfp
325 integer,
intent(in) :: nfaces
326 integer,
intent(in) :: nv
328 integer,
intent(inout),
allocatable :: vmapb(:)
329 integer,
intent(inout),
allocatable :: mapb(:)
330 integer,
intent(inout) :: vmapp(nfp,nfaces,ne)
332 real(rp),
intent(in) :: pos_en(np,ne,1)
333 real(rp),
intent(in) :: xmin, xmax
334 integer,
intent(in) :: fmask(nfp,2)
342 real(rp),
parameter :: node_tol = 1.0e-12_rp
344 integer :: elemids(nfp*ne,2)
345 integer :: faceids(nfp*ne,2)
346 integer :: counterb(2)
347 integer :: mapb_counter
352 rdomx = 1.0_rp/(xmax - xmin)
356 x = sum(pos_en(fmask(:,f),k,1)/dble(nfp))
358 call eval_domain_boundary(1, x, xmin, k, f, rdomx)
359 call eval_domain_boundary(2, x, xmax, k, f, rdomx)
364 allocate( mapb(sum(counterb*nfp)) )
365 allocate( vmapb(
size(mapb)) )
376 k = elemids(i,b); f = faceids(i,b)
378 vmapp(j,f,k) = np*ne + mapb_counter
379 vmapb(mapb_counter) = fmask(j,f) + (k-1)*np
380 mapb_counter = mapb_counter + 1
398 subroutine eval_domain_boundary(domb_id, r, rbc, k_, f_, normalized_fac)
400 integer,
intent(in) :: domb_id
401 real(rp),
intent(in) :: r
402 real(rp),
intent(in) :: rbc
403 integer,
intent(in) :: k_, f_
404 real(rp),
intent(in) :: normalized_fac
407 if ( abs(r - rbc)*normalized_fac < node_tol )
then
408 counterb(domb_id) = counterb(domb_id) + 1
409 elemids(counterb(domb_id),domb_id) = k_
410 faceids(counterb(domb_id),domb_id) = f_
414 end subroutine eval_domain_boundary
462 xperiod, x, fx, fmask, ne, np, nfp, nfaces, nv )
466 integer,
intent(in) :: ne
467 integer,
intent(in) :: np
468 integer,
intent(in) :: nfp
469 integer,
intent(in) :: nfaces
470 integer,
intent(in) :: nv
471 integer,
intent(inout) :: etoe(ne, nfaces)
472 integer,
intent(inout) :: etof(ne, nfaces)
473 integer,
intent(inout) :: vmapp(nfp,nfaces,ne)
474 real(rp),
intent(in) :: xperiod
475 real(rp),
intent(in) :: x(np,ne)
476 real(rp),
intent(in) :: fx(nfp*ne)
477 integer,
intent(in) :: fmask(nfp,4)
487 integer :: vidl(nfp), vidr(nfp)
488 integer :: fidl(nfp), fidr(nfp)
491 real(rp) :: x1(nfp,nfp), x2(nfp,nfp)
492 real(rp) :: dist(nfp,nfp)
494 real(rp),
parameter :: node_tol = 1.0e-12_rp
500 cx1 = sum(x(fmask(:,f1),k1)/dble(nfp))
502 k2 = etoe(k1,f1); f2 = etof(k1,f1)
507 if (etoe(k2,f2) == k2)
then
508 cx2 = sum(x(fmask(:,f2),k2)/dble(nfp))
510 dx_pbc = sqrt( (abs(cx1-cx2)-xperiod)**2 )
512 if (dx_pbc < node_tol)
then
514 etoe(k1,f1) = k2; etoe(k2,f2) = k1
515 etof(k1,f1) = f2; etof(k2,f2) = f1
521 vidl(p) = fmask(p,f1) + (k1-1)*np
522 vidr(p) = fmask(p,f2) + (k2-1)*np
523 fidl(p) = p + (f1-1)*nfp + (k1-1)*nfp*nfaces
524 fidr(p) = p + (f2-1)*nfp + (k2-1)*nfp*nfaces
527 x1(:,:) = spread( fx(fidl(:)), 2, nfp )
528 x2(:,:) = spread( fx(fidr(:)), 1, nfp )
530 dist(:,:) = (abs(x1-x2) -xperiod)**2
534 if (dist(idm,idp) < node_tol)
then
535 vmapp(idm,f1,k1) = vidr(idp)
536 vmapp(idp,f2,k2) = vidl(idm)
566 panelID_table, pi_table, & ! (out)
567 tileid_map, tilefaceid_map, tilepanelid_map, &
570 use scale_prc,
only: prc_ismaster
573 integer,
intent(in) :: ntile
574 integer,
intent(out) :: panelid_table(ntile)
575 integer,
intent(out) :: pi_table(ntile)
576 integer,
intent(out) :: tileid_map(2,ntile)
577 integer,
intent(out) :: tilefaceid_map(2,ntile)
578 integer,
intent(out) :: tilepanelid_map(2,ntile)
580 integer :: ntileperpanel
582 integer,
allocatable :: nodesid_1d(:)
583 integer,
allocatable :: etov(:,:)
584 integer,
allocatable :: etoe(:,:)
585 integer,
allocatable :: etof(:,:)
588 integer :: tileid, tileid_r
594 ntileperpanel = ntile
597 allocate( nodesid_1d(nv) )
598 allocate( etov(ntile,2), etoe(ntile,2), etof(ntile,2) )
603 counter = counter + 1
604 nodesid_1d(i) = counter
613 panelid_table(tileid) = 1
615 etov(tileid,:) = (/ nodesid_1d(i), nodesid_1d(i+1) /)
620 tileid_map(:,:) = transpose(etoe)
621 tilefaceid_map(:,:) = transpose(etof)
625 tileid_r = tileid_map(f,tileid)
626 tilepanelid_map(f,tileid) = panelid_table(tileid_r)
subroutine, public meshutil1d_buildinteriormap(vmapm, vmapp, mapm, mapp, pos_en, pos_ev, etoe, etof, etov, fmask, ne, np, nfp, nfaces, nv)
subroutine, public meshutil1d_genperiodicboundarymap(etoe, etof, vmapp, xperiod, x, fx, fmask, ne, np, nfp, nfaces, nv)
subroutine, public meshutil1d_genpatchboundarymap(vmapb, mapb, vmapp, pos_en, xmin, xmax, fmask, ne, np, nfp, nfaces, nv)