124 integer,
intent(in) :: ne
125 integer,
intent(in) :: nfaces
126 integer,
intent(out) :: etoe(ne, nfaces)
127 integer,
intent(out) :: etof(ne, nfaces)
128 integer,
intent(in) :: etov(ne,8)
130 integer :: nodes(ne*nfaces,4)
131 integer(kind=8) :: face_ids(ne*nfaces)
136 integer :: nnodes_row
137 integer :: matchl(2,3), matchr(2,3)
139 real(rp) :: etoe_1d(ne*nfaces)
140 real(rp) :: etof_1d(ne*nfaces)
142 integer :: spnodetonode(3,ne*nfaces)
143 integer :: spnodetonoderowtmp(3,ne*nfaces)
144 integer :: sort_indx(ne*nfaces)
145 integer(kind=8) :: sorted_faceid(ne*nfaces)
151 nnodes = maxval( etov )
152 nnodes_row =
size(nodes,1)
156 nodes(ke ,:) = etov(ke,(/ 1, 2, 6, 5 /))
157 nodes(ke+ne ,:) = etov(ke,(/ 2, 4, 8, 6 /))
158 nodes(ke+2*ne,:) = etov(ke,(/ 4, 3, 7, 8 /))
159 nodes(ke+3*ne,:) = etov(ke,(/ 3, 1, 5, 7 /))
160 nodes(ke+4*ne,:) = etov(ke,(/ 1, 3, 4, 2 /))
161 nodes(ke+5*ne,:) = etov(ke,(/ 5, 6, 8, 7 /))
167 call bubblesort( vtmp )
176 etof(ke,:) = (/ 1, 2, 3, 4, 5, 6 /)
179 face_ids(:) = nodes(:,1) * nnodes**3 + nodes(:,2) * nnodes**2 &
180 + nodes(:,3) * nnodes + nodes(:,4) + 1
185 spnodetonode(:,n) = (/ n, etoe(ke,f), etof(ke,f) /)
186 sorted_faceid(n) = face_ids(n)
194 spnodetonoderowtmp(:,:) = spnodetonode(:,:)
197 spnodetonode(:,n) = spnodetonoderowtmp(:,sort_indx(n))
204 if ( sorted_faceid(n) - sorted_faceid(n+1) == 0 )
then
205 matchl(:,:) = transpose( spnodetonode(:,(/ n, n+1 /)) )
206 matchr(:,:) = transpose( spnodetonode(:,(/ n+1, n /)) )
208 etoe_1d(matchl(:,1)) = matchr(:,2)
209 etof_1d(matchl(:,1)) = matchr(:,3)
216 if ( etoe_1d(n) /= -1 )
then
217 etoe(ke,f) = etoe_1d(n)
218 etof(ke,f) = etof_1d(n)
262 pos_en, pos_ev, EtoE, EtoF, EtoV, Fmask_h, Fmask_v, &
263 Ne, Nv, Np, Nfp_h, Nfp_v, NfpTot, Nfaces_h, Nfaces_v, Nfaces)
267 integer,
intent(in) :: ne
268 integer,
intent(in) :: nv
269 integer,
intent(in) :: np
270 integer,
intent(in) :: nfp_h
271 integer,
intent(in) :: nfp_v
272 integer,
intent(in) :: nfptot
273 integer,
intent(in) :: nfaces_h
274 integer,
intent(in) :: nfaces_v
275 integer,
intent(in) :: nfaces
277 integer,
intent(out) :: vmapm(nfptot,ne)
278 integer,
intent(out) :: vmapp(nfptot,ne)
279 integer,
intent(out) :: mapm(nfptot,ne)
280 integer,
intent(out) :: mapp(nfptot,ne)
282 real(rp),
intent(in) :: pos_en(np,ne,3)
283 real(rp),
intent(in) :: pos_ev(nv,3)
284 integer,
intent(in) :: etoe(ne,nfaces)
285 integer,
intent(in) :: etof(ne,nfaces)
286 integer,
intent(in) :: etov(ne,nv)
287 integer,
intent(in) :: fmask_h(nfp_h,nfaces_h)
288 integer,
intent(in) :: fmask_v(nfp_v,nfaces_v)
290 integer :: ke, ke1, ke2
297 integer :: nodeids(np,ne)
298 real(rp) :: r_h(nfp_h,nfp_h,3,2)
299 real(rp) :: r_v(nfp_v,nfp_v,3,2)
300 real(rp) :: dist_h(nfp_h,nfp_h)
301 real(rp) :: dist_v(nfp_v,nfp_v)
302 real(rp) :: x(np*ne), y(np*ne), z(np*ne)
304 integer :: vmapm_h(nfp_h,nfaces_h,ne)
305 integer :: vmapp_h(nfp_h,nfaces_h,ne)
306 integer :: vmapm_v(nfp_v,nfaces_v,ne)
307 integer :: vmapp_v(nfp_v,nfaces_v,ne)
308 integer :: mapm_h(nfp_h,nfaces_h,ne)
309 integer :: mapp_h(nfp_h,nfaces_h,ne)
310 integer :: mapm_v(nfp_v,nfaces_v,ne)
311 integer :: mapp_v(nfp_v,nfaces_v,ne)
313 integer :: mindist_indx(1)
323 x(n) = pos_en(p,ke,1)
324 y(n) = pos_en(p,ke,2)
325 z(n) = pos_en(p,ke,3)
334 n = p + (f-1)*nfp_h + (ke-1)*nfptot
337 vmapm_h(p,f,ke) = nodeids(fmask_h(p,f),ke)
342 n = p + nfaces_h*nfp_h + (f-1)*nfp_v + (ke-1)*nfptot
345 vmapm_v(p,f,ke) = nodeids(fmask_v(p,f),ke)
364 ke2 = etoe(ke1,f1); f2 = etof(ke1,f1)
366 v1 = etov(ke1,f1); v2 = etov(ke1,1+mod(f1,nfaces_h))
368 r_h(:,:,1,1) = spread( x(vmapm_h(:,f1,ke1)), 2, nfp_h )
369 r_h(:,:,1,2) = spread( x(vmapm_h(:,f2,ke2)), 1, nfp_h )
370 r_h(:,:,2,1) = spread( y(vmapm_h(:,f1,ke1)), 2, nfp_h )
371 r_h(:,:,2,2) = spread( y(vmapm_h(:,f2,ke2)), 1, nfp_h )
372 r_h(:,:,3,1) = spread( z(vmapm_h(:,f1,ke1)), 2, nfp_h )
373 r_h(:,:,3,2) = spread( z(vmapm_h(:,f2,ke2)), 1, nfp_h )
375 dist_h(:,:) = (r_h(:,:,1,1) - r_h(:,:,1,2))**2 &
376 + (r_h(:,:,2,1) - r_h(:,:,2,2))**2 &
377 + (r_h(:,:,3,1) - r_h(:,:,3,2))**2
379 mindist_indx(:) = minloc(dist_h(idm,:))
380 idp = mindist_indx(1)
381 vmapp_h(idm,f1,ke1) = vmapm_h(idp,f2,ke2)
382 mapp_h(idm,f1,ke1) = idp + (f2-1)*nfp_h + (ke2-1)*nfptot
391 ke2 = etoe(ke1,nfaces_h+f1); f2 = etof(ke1,nfaces_h+f1) - nfaces_h
393 v1 = etov(ke1,1); v2 = etov(ke1,nfaces_h+1)
395 r_v(:,:,1,1) = spread( x(vmapm_v(:,f1,ke1)), 2, nfp_v )
396 r_v(:,:,1,2) = spread( x(vmapm_v(:,f2,ke2)), 1, nfp_v )
397 r_v(:,:,2,1) = spread( y(vmapm_v(:,f1,ke1)), 2, nfp_v )
398 r_v(:,:,2,2) = spread( y(vmapm_v(:,f2,ke2)), 1, nfp_v )
399 r_v(:,:,3,1) = spread( z(vmapm_v(:,f1,ke1)), 2, nfp_v )
400 r_v(:,:,3,2) = spread( z(vmapm_v(:,f2,ke2)), 1, nfp_v )
402 dist_v(:,:) = (r_v(:,:,1,1) - r_v(:,:,1,2))**2 &
403 + (r_v(:,:,2,1) - r_v(:,:,2,2))**2 &
404 + (r_v(:,:,3,1) - r_v(:,:,3,2))**2
406 mindist_indx(:) = minloc(dist_v(idm,:))
407 idp = mindist_indx(1)
408 vmapp_v(idm,f1,ke1) = vmapm_v(idp,f2,ke2)
409 mapp_v(idm,f1,ke1) = idp + nfaces_h*nfp_h + (f2-1)*nfp_v + (ke2-1)*nfptot
421 vmapm(i,ke) = vmapm_h(n,f,ke)
422 mapm(i,ke) = mapm_h(n,f,ke)
423 vmapp(i,ke) = vmapp_h(n,f,ke)
424 mapp(i,ke) = mapp_h(n,f,ke)
429 i = n + nfaces_h*nfp_h + (f-1)*nfp_v
430 vmapm(i,ke) = vmapm_v(n,f,ke)
431 mapm(i,ke) = mapm_v(n,f,ke)
432 vmapp(i,ke) = vmapp_v(n,f,ke)
433 mapp(i,ke) = mapp_v(n,f,ke)
476 pos_en, xmin, xmax, ymin, ymax, zmin, zmax, &
477 Fmask_h, Fmask_v, Ne, Nv, Np, Nfp_h, Nfp_v, NfpTot, Nfaces_h, Nfaces_v, Nfaces )
481 integer,
intent(in) :: ne
482 integer,
intent(in) :: nv
483 integer,
intent(in) :: np
484 integer,
intent(in) :: nfp_h
485 integer,
intent(in) :: nfp_v
486 integer,
intent(in) :: nfptot
487 integer,
intent(in) :: nfaces_h
488 integer,
intent(in) :: nfaces_v
489 integer,
intent(in) :: nfaces
491 integer,
intent(inout),
allocatable :: vmapb(:)
492 integer,
intent(inout),
allocatable :: mapb(:)
493 integer,
intent(inout) :: vmapp(nfptot,ne)
495 real(rp),
intent(in) :: pos_en(np,ne,3)
496 real(rp),
intent(in) :: xmin, xmax
497 real(rp),
intent(in) :: ymin, ymax
498 real(rp),
intent(in) :: zmin, zmax
499 integer,
intent(in) :: fmask_h(nfp_h,nfaces_h)
500 integer,
intent(in) :: fmask_v(nfp_v,nfaces_v)
508 real(rp),
parameter :: node_tol = 1.0e-12_rp
510 integer :: elemids_h(nfp_h*ne,nfaces_h)
511 real(rp) :: ordinfo_h(nfp_h*ne,nfaces_h)
512 integer :: faceids_h(nfp_h*ne,nfaces_h)
513 integer :: counterb_h(nfaces_h)
515 integer :: elemids_v(nfp_v*ne,nfaces_v)
516 real(rp) :: ordinfo_v(nfp_v*ne,nfaces_v)
517 integer :: faceids_v(nfp_v*ne,nfaces_v)
518 integer :: counterb_v(nfaces_v)
520 integer :: mapb_counter
521 real(rp) :: rdomx, rdomy, rdomz
527 rdomx = 1.0_rp/(xmax - xmin)
528 rdomy = 1.0_rp/(ymax - ymin)
529 rdomz = 1.0_rp/abs(zmax - zmin)
533 x = sum(pos_en(fmask_h(:,f),ke,1)) / dble(nfp_h)
534 y = sum(pos_en(fmask_h(:,f),ke,2)) / dble(nfp_h)
536 call eval_domain_boundary( &
537 elemids_h, ordinfo_h, faceids_h, counterb_h, &
538 1, y, ymin, x, ke, f, rdomy )
539 call eval_domain_boundary( &
540 elemids_h, ordinfo_h, faceids_h, counterb_h, &
541 2, x, xmax, y, ke, f, rdomx )
542 call eval_domain_boundary( &
543 elemids_h, ordinfo_h, faceids_h, counterb_h, &
544 3, y, ymax, x, ke, f, rdomy )
545 call eval_domain_boundary( &
546 elemids_h, ordinfo_h, faceids_h, counterb_h, &
547 4, x, xmin, y, ke, f, rdomx )
550 x = sum(pos_en(fmask_v(:,f),ke,1)) / dble(nfp_v)
551 z = sum(pos_en(fmask_v(:,f),ke,3)) / dble(nfp_v)
553 call eval_domain_boundary( &
554 elemids_v, ordinfo_v, faceids_v, counterb_v, &
555 1, z, zmin, x, ke, f, rdomz )
556 call eval_domain_boundary( &
557 elemids_v, ordinfo_v, faceids_v, counterb_v, &
558 2, z, zmax, x, ke, f, rdomz )
563 allocate( mapb(sum(counterb_h(:)*nfp_h)+sum(counterb_v(:)*nfp_v)) )
564 allocate( vmapb(
size(mapb)) )
574 do i=1, counterb_h(b)
575 ke = elemids_h(i,b); f = faceids_h(i,b)
578 vmapp(n,ke) = np*ne + mapb_counter
579 vmapb(mapb_counter) = fmask_h(j,f) + (ke-1)*np
580 mapb_counter = mapb_counter + 1
586 do i=1, counterb_v(b)
587 ke = elemids_v(i,b); f = faceids_v(i,b)
589 n = j + nfp_h*nfaces_h + nfp_v*(f-1)
590 vmapp(n,ke) = np*ne + mapb_counter
591 vmapb(mapb_counter) = fmask_v(j,f) + (ke-1)*np
592 mapb_counter = mapb_counter + 1
612 subroutine eval_domain_boundary( &
613 elemIDs, ordInfo, faceIDs, counterB, &
614 domb_id, r, rbc, ord_info, k_, f_, normalized_fac )
617 integer,
intent(inout) :: elemids(:,:)
618 real(rp),
intent(inout) :: ordinfo(:,:)
619 integer,
intent(inout) :: counterb(:)
620 integer,
intent(inout) :: faceids(:,:)
621 integer,
intent(in) :: domb_id
622 real(rp),
intent(in) :: r
623 real(rp),
intent(in) :: rbc
624 real(rp),
intent(in) :: ord_info
625 integer,
intent(in) :: k_, f_
626 real(rp),
intent(in) :: normalized_fac
629 if ( abs(r - rbc)*normalized_fac < node_tol )
then
630 counterb(domb_id) = counterb(domb_id) + 1
631 ordinfo(counterb(domb_id),domb_id) = ord_info
632 elemids(counterb(domb_id),domb_id) = k_
633 faceids(counterb(domb_id),domb_id) = f_
637 end subroutine eval_domain_boundary
642 panelID_table, pi_table, pj_table, pk_table, &
643 tileID_map, tileFaceID_map, tilePanelID_map, &
644 Ntile, NtileFace, NtileVertex, &
645 isPeriodicX, isPeriodicY, isPeriodicZ, &
651 integer,
intent(in) :: ntile
652 integer,
intent(in) :: ntileface
653 integer,
intent(in) :: ntilevertex
654 integer,
intent(out) :: panelid_table(ntile)
655 integer,
intent(out) :: pi_table(ntile)
656 integer,
intent(out) :: pj_table(ntile)
657 integer,
intent(out) :: pk_table(ntile)
658 integer,
intent(out) :: tileid_map(ntileface,ntile)
659 integer,
intent(out) :: tilefaceid_map(ntileface,ntile)
660 integer,
intent(out) :: tilepanelid_map(ntileface,ntile)
661 logical,
intent(in) :: isperiodicx
662 logical,
intent(in) :: isperiodicy
663 logical,
intent(in) :: isperiodicz
664 integer,
intent(in) :: ne_x
665 integer,
intent(in) :: ne_y
666 integer,
intent(in) :: ne_z
668 integer :: ntileperpanel
669 integer :: nv_x, nv_y, nv_z
670 integer,
allocatable :: nodesid_3d(:,:,:)
671 integer,
allocatable :: etov(:,:)
672 integer,
allocatable :: etoe(:,:)
673 integer,
allocatable :: etof(:,:)
674 integer :: i, j, k, f
675 integer :: tileid, tileid_r
680 ntileperpanel = ntile/1
686 allocate( nodesid_3d(nv_x,nv_y,nv_z) )
687 allocate( etov(ntile,ntilevertex), etoe(ntile,ntileface), etof(ntile,ntileface) )
693 counter = counter + 1
694 nodesid_3d(i,j,k) = counter
707 panelid_table(tileid) = 1
708 pi_table(tileid) = i; pj_table(tileid) = j; pk_table(tileid) = k
709 etov(tileid,:) = (/ nodesid_3d(i,j ,k ), nodesid_3d(i+1,j ,k ), &
710 nodesid_3d(i,j+1,k ), nodesid_3d(i+1,j+1,k ), &
711 nodesid_3d(i,j ,k+1), nodesid_3d(i+1,j ,k+1), &
712 nodesid_3d(i,j+1,k+1), nodesid_3d(i+1,j+1,k+1) /)
718 etov, ntile, ntileface )
719 tileid_map(:,:) = transpose(etoe)
720 tilefaceid_map(:,:) = transpose(etof)
724 tileid_r = tileid_map(f,tileid)
725 tilepanelid_map(f,tileid) = panelid_table(tileid_r)
729 if (isperiodicx)
then
731 if (pi_table(tileid) == 1 .and. tilefaceid_map(4,tileid) == 4)
then
732 tileid_map(4,tileid) = ne_x + (pj_table(tileid) - 1)*ne_x + (pk_table(tileid) - 1)*ne_x*ne_y
733 tilefaceid_map(4,tileid) = 2
735 if (pi_table(tileid) == ne_x .and. tilefaceid_map(2,tileid) == 2)
then
736 tileid_map(2,tileid) = 1 + (pj_table(tileid) - 1)*ne_x + (pk_table(tileid) - 1)*ne_x*ne_y
737 tilefaceid_map(2,tileid) = 4
742 if (isperiodicy)
then
744 if (pj_table(tileid) == 1 .and. tilefaceid_map(1,tileid) == 1)
then
745 tileid_map(1,tileid) = pi_table(tileid) + (ne_y - 1)*ne_x + (pk_table(tileid) - 1)*ne_x*ne_y
746 tilefaceid_map(1,tileid) = 3
748 if (pj_table(tileid) == ne_y .and. tilefaceid_map(3,tileid) == 3)
then
749 tileid_map(3,tileid) = pi_table(tileid) + (pk_table(tileid) - 1)*ne_x*ne_y
750 tilefaceid_map(3,tileid) = 1
755 if (isperiodicz)
then
757 if (pk_table(tileid) == 1 .and. tilefaceid_map(5,tileid) == 5)
then
758 tileid_map(5,tileid) = pi_table(tileid) + (pj_table(tileid) - 1)*ne_x + (ne_z - 1)*ne_x*ne_y
759 tilefaceid_map(5,tileid) = 6
761 if (pk_table(tileid) == ne_z .and. tilefaceid_map(6,tileid) == 6)
then
762 tileid_map(6,tileid) = pi_table(tileid) + (pj_table(tileid) - 1)*ne_x
763 tilefaceid_map(6,tileid) = 5