16 integer(kind=intType) :: il, jl, kl
17 integer(kind=intType) :: rSize, iSize
20 integer(kind=intType) :: ie, je, ke, nBBox, nLeaves
27 ie = il + 1; je = jl + 1; ke = kl + 1
33 isize = isize + 8 * il * jl * kl
35 isize = isize + (ie + 2) * (je + 2) * (ke + 2)
37 isize = isize + il * jl * kl
39 isize = isize + ie * je * ke
46 isize = isize + nleaves * 2
49 rsize = rsize + ie * je * ke
51 rsize = rsize + 3 * ie * je * ke
53 rsize = rsize + nbbox * 6
55 rsize = rsize + nleaves * 12
73 integer(kind=intType) :: rSize, iSize, i, j, k, nHexa, nADT
74 integer(kind=intType) :: ie, je, ke, il, jl, kl
78 if (
allocated(oblock%rBuffer))
then
85 allocate (oblock%rBuffer(rsize), oblock%iBuffer(isize))
90 oblock%iBuffer(1) = oblock%il
91 oblock%iBuffer(2) = oblock%jl
92 oblock%iBuffer(3) = oblock%kl
93 oblock%iBuffer(4) = oblock%proc
94 oblock%iBuffer(5) = oblock%block
95 oblock%iBuffer(6) = oblock%cluster
107 nhexa = oblock%il * oblock%jl * oblock%kl
113 oblock%iBuffer(isize) = oblock%hexaConn(i, j)
121 oblock%iBuffer(isize) = oblock%globalCell(i, j, k)
130 oblock%iBuffer(isize) = oblock%nearWall(i, j, k)
139 oblock%iBuffer(isize) = oblock%invalidDonor(i, j, k)
144 do i = 1, oblock%ADT%nLeaves
146 oblock%iBuffer(isize) = oblock%ADT%ADTree(i)%children(1)
148 oblock%iBuffer(isize) = oblock%ADT%ADTree(i)%children(2)
154 do i = 1, ie * je * ke
156 oblock%rBuffer(rsize) = oblock%qualDonor(1, i)
159 do j = 1, ie * je * ke
162 oblock%rBuffer(rsize) = oblock%xADT(i, j)
166 do i = 1, oblock%ADT%nBboxes
167 oblock%rBuffer(rsize + 1:rsize + 6) = oblock%ADT%xBBox(:, i)
171 do i = 1, oblock%ADT%nLeaves
172 oblock%rBuffer(rsize + 1:rsize + 6) = oblock%ADT%ADTree(i)%xMin(:)
175 oblock%rBuffer(rsize + 1:rsize + 6) = oblock%ADT%ADTree(i)%xMax(:)
180 oblock%rBuffer(rsize) = oblock%minVol
199 integer(kind=intType) :: rSize, iSize, i, j, k, nHexa, nADT
200 integer(kind=intType) :: ie, je, ke, il, jl, kl
205 oblock%il = oblock%iBuffer(1)
206 oblock%jl = oblock%iBuffer(2)
207 oblock%kl = oblock%iBuffer(3)
208 oblock%proc = oblock%iBuffer(4)
209 oblock%block = oblock%iBuffer(5)
210 oblock%cluster = oblock%iBuffer(6)
220 nhexa = oblock%il * oblock%jl * oblock%kl
224 allocate (oblock%hexaConn(8, nhexa))
225 allocate (oblock%globalCell(0:ie + 1, 0:je + 1, 0:ke + 1))
226 allocate (oblock%nearWall(1:il, 1:jl, 1:kl))
227 allocate (oblock%invalidDonor(1:ie, 1:je, 1:ke))
228 allocate (oblock%qualDonor(1, ie * je * ke))
229 allocate (oblock%xADT(3, nadt))
237 oblock%ADT%nNodes = nadt
238 oblock%ADT%nTetra = 0
240 oblock%ADT%nPrisms = 0
242 oblock%ADT%nQuads = 0
243 oblock%ADT%coor => oblock%xADT
244 oblock%ADT%hexaConn => oblock%hexaConn
245 nullify (oblock%ADT%tetraConn, oblock%ADT%pyraConn, oblock%ADT%prismsConn)
246 oblock%ADT%nBBoxes = nhexa
247 allocate (oblock%ADT%xBBOX(6, nhexa))
248 allocate (oblock%ADT%elementType(nhexa))
249 allocate (oblock%ADT%elementID(nhexa))
250 oblock%ADT%comm = mpi_comm_self
251 oblock%ADT%nProcs = 1
258 oblock%ADT%elementID(i) = i
261 oblock%ADT%nLeaves = oblock%ADT%nBBoxes - 1
262 if (oblock%ADT%nBBoxes <= 1) oblock%ADT%nLeaves = oblock%ADT%nLeaves + 1
263 allocate (oblock%ADT%ADTree(oblock%ADT%nLeaves))
271 oblock%hexaConn(j, i) = oblock%iBuffer(isize)
279 oblock%globalCell(i, j, k) = oblock%iBuffer(isize)
288 oblock%nearWall(i, j, k) = oblock%iBuffer(isize)
297 oblock%invalidDonor(i, j, k) = oblock%iBuffer(isize)
302 do i = 1, oblock%ADT%nLeaves
304 oblock%ADT%ADTree(i)%children(1) = oblock%iBuffer(isize)
306 oblock%ADT%ADTree(i)%children(2) = oblock%iBuffer(isize)
312 do i = 1, ie * je * ke
314 oblock%qualDonor(1, i) = oblock%rBuffer(rsize)
317 do j = 1, ie * je * ke
320 oblock%xADT(i, j) = oblock%rBuffer(rsize)
324 do i = 1, oblock%ADT%nBboxes
325 oblock%ADT%xBBox(:, i) = oblock%rBuffer(rsize + 1:rsize + 6)
329 do i = 1, oblock%ADT%nLeaves
330 oblock%ADT%ADTree(i)%xMin(:) = oblock%rBuffer(rsize + 1:rsize + 6)
333 oblock%ADT%ADTree(i)%xMax(:) = oblock%rBuffer(rsize + 1:rsize + 6)
338 oblock%minVol = oblock%rBuffer(rsize)
341 oblock%allocated = .true.
342 deallocate (oblock%iBuffer, oblock%rBuffer)
356 integer(kind=intType),
intent(in) :: il, jl, kl
357 integer(kind=intType),
intent(out) :: rSize, iSize
360 integer(kind=intType) :: mm
363 mm = (il - 1) * (jl - 1) * (kl - 1)
385 integer(kind=intType) :: rSize, iSize, mm, i, ii
389 if (
allocated(ofringe%rBuffer))
then
397 allocate (ofringe%rBuffer(rsize), ofringe%iBuffer(isize))
399 mm = (ofringe%nx) * (ofringe%ny) * (ofringe%nz)
401 ofringe%iBuffer(1) = ofringe%il
402 ofringe%iBuffer(2) = ofringe%jl
403 ofringe%iBuffer(3) = ofringe%kl
404 ofringe%iBuffer(4) = ofringe%cluster
405 ofringe%iBuffer(5) = ofringe%block
412 ofringe%iBuffer(ii) = ofringe%wallInd(i)
415 ofringe%iBuffer(ii) = ofringe%isWall(i)
418 ofringe%iBuffer(ii) = ofringe%fringeIntBuffer(5, i)
425 ofringe%rBuffer(ii + 1) = ofringe%x(1, i)
426 ofringe%rBuffer(ii + 2) = ofringe%x(2, i)
427 ofringe%rBuffer(ii + 3) = ofringe%x(3, i)
428 ofringe%rBuffer(ii + 4) = ofringe%xSeed(1, i)
429 ofringe%rBuffer(ii + 5) = ofringe%xSeed(2, i)
430 ofringe%rBuffer(ii + 6) = ofringe%xSeed(3, i)
449 integer(kind=intType) :: rSize, iSize, idom, i, ii, mm
452 ofringe%il = ofringe%iBuffer(1)
453 ofringe%jl = ofringe%iBuffer(2)
454 ofringe%kl = ofringe%iBuffer(3)
455 ofringe%nx = ofringe%il - 1
456 ofringe%ny = ofringe%jl - 1
457 ofringe%nz = ofringe%kl - 1
458 ofringe%cluster = ofringe%iBuffer(4)
459 ofringe%block = ofringe%ibuffer(5)
461 mm = (ofringe%nx) * (ofringe%ny) * (ofringe%nz)
465 ofringe%xSeed(3, mm), &
466 ofringe%wallInd(mm), &
471 allocate (ofringe%fringeIntBuffer(5, mm), ofringe%fringeRealBuffer(4, mm))
479 ofringe%wallInd(i) = ofringe%iBuffer(ii)
482 ofringe%isWall(i) = ofringe%iBuffer(ii)
485 ofringe%fringeIntBuffer(5, i) = ofringe%iBuffer(ii)
487 ofringe%fringeIntBuffer(4, i) = ofringe%block
493 ofringe%x(1, i) = ofringe%rBuffer(ii + 1)
494 ofringe%x(2, i) = ofringe%rBuffer(ii + 2)
495 ofringe%x(3, i) = ofringe%rBuffer(ii + 3)
497 ofringe%xSeed(1, i) = ofringe%rBuffer(ii + 4)
498 ofringe%xSeed(2, i) = ofringe%rBuffer(ii + 5)
499 ofringe%xSeed(3, i) = ofringe%rBuffer(ii + 6)
505 ofringe%allocated = .true.
506 deallocate (ofringe%rBuffer, ofringe%iBuffer)
520 integer(kind=intType),
intent(in),
dimension(:) :: famList
524 integer(kind=intType),
intent(out) :: nNodes, nCells
527 integer(kind=intType) :: mm, iBeg, iEnd, jBeg, jEnd
542 nnodes = nnodes + (iend - ibeg + 1) * (jend - jbeg + 1)
543 ncells = ncells + (iend - ibeg) * (jend - jbeg)
560 integer(kind=intType),
intent(in),
dimension(:) :: famList
561 integer(kind=intType),
intent(in) :: il, jl, kl
562 logical,
intent(in) :: dualMesh
563 integer(kind=intType),
intent(out) :: rSize, iSize
566 integer(kind=intType) :: mm, nNodes, nCells, nBBox, nLeaves
573 call getwallsize(famlist, nnodes, ncells, dualmesh)
581 isize = isize + ncells * 4
583 isize = isize + ncells
585 isize = isize + ncells
591 isize = isize + nleaves * 2
594 rsize = rsize + 3 * nnodes
596 rsize = rsize + nnodes
598 rsize = rsize + nbbox * 6
600 rsize = rsize + nleaves * 12
615 integer(kind=intType),
intent(in),
dimension(:) :: famList
617 logical,
intent(in) :: dualMesh
619 integer(kind=intType) :: rSize, iSize, mm, i, j, nNodes, nCells
624 allocate (osurf%rBuffer(rsize), osurf%iBuffer(isize))
626 osurf%iBuffer(1) = osurf%il
627 osurf%iBuffer(2) = osurf%jl
628 osurf%iBuffer(3) = osurf%kl
629 osurf%iBuffer(4) = osurf%nNodes
630 osurf%iBuffer(5) = osurf%nCells
631 osurf%iBuffer(6) = osurf%maxCells
632 osurf%iBuffer(7) = osurf%cluster
634 if (osurf%nNodes > 0)
then
636 do j = 1, osurf%nCells
639 osurf%iBuffer(isize) = osurf%conn(i, j)
643 do i = 1, osurf%maxCells
645 osurf%iBuffer(isize) = osurf%iBlank(i)
648 do i = 1, osurf%nCells
650 osurf%iBuffer(isize) = osurf%cellPtr(i)
653 do i = 1, osurf%ADT%nLeaves
655 osurf%iBuffer(isize) = osurf%ADT%ADTree(i)%children(1)
657 osurf%iBuffer(isize) = osurf%ADT%ADTree(i)%children(2)
663 do i = 1, osurf%nNodes
666 osurf%rBuffer(rsize) = osurf%x(j, i)
670 do i = 1, osurf%nNodes
672 osurf%rBuffer(rsize) = osurf%delta(i)
675 do i = 1, osurf%ADT%nBboxes
676 osurf%rBuffer(rsize + 1:rsize + 6) = osurf%ADT%xBBox(:, i)
680 do i = 1, osurf%ADT%nLeaves
681 osurf%rBuffer(rsize + 1:rsize + 6) = osurf%ADT%ADTree(i)%xMin(:)
684 osurf%rBuffer(rsize + 1:rsize + 6) = osurf%ADT%ADTree(i)%xMax(:)
701 integer(kind=intType) :: rSize, iSize, idom, i, j, k, n, iNode
704 osurf%il = osurf%iBuffer(1)
705 osurf%jl = osurf%iBuffer(2)
706 osurf%kl = osurf%iBuffer(3)
708 osurf%nNodes = osurf%iBuffer(4)
709 osurf%nCells = osurf%iBuffer(5)
710 osurf%maxCells = osurf%iBuffer(6)
711 osurf%cluster = osurf%iBuffer(7)
717 allocate (osurf%x(3, osurf%nNodes))
718 allocate (osurf%delta(osurf%nNodes))
719 allocate (osurf%conn(4, osurf%nCells))
720 allocate (osurf%iBlank(osurf%maxCells))
721 allocate (osurf%cellPtr(osurf%nCells))
722 allocate (osurf%nte(4, osurf%nNodes))
728 osurf%ADT%nNodes = osurf%nNodes
731 osurf%ADT%nPrisms = 0
733 osurf%ADT%nQuads = osurf%nCells
734 osurf%ADT%coor => osurf%x
735 osurf%ADT%quadsConn => osurf%conn
736 nullify (osurf%ADT%triaConn)
737 osurf%ADT%nBBoxes = osurf%nCells
738 allocate (osurf%ADT%xBBOX(6, osurf%nCells))
739 allocate (osurf%ADT%elementType(osurf%nCells))
740 allocate (osurf%ADT%elementID(osurf%nCells))
741 osurf%ADT%comm = mpi_comm_self
748 do i = 1, osurf%nCells
749 osurf%ADT%elementID(i) = i
752 osurf%ADT%nLeaves = osurf%ADT%nBBoxes - 1
753 if (osurf%ADT%nBBoxes <= 1) osurf%ADT%nLeaves = osurf%ADT%nLeaves + 1
755 allocate (osurf%ADT%ADTree(osurf%ADT%nLeaves))
758 if (osurf%nNodes > 0)
then
759 do j = 1, osurf%nCells
762 osurf%conn(i, j) = osurf%iBuffer(isize)
766 do i = 1, osurf%maxCells
768 osurf%iBlank(i) = osurf%iBuffer(isize)
771 do i = 1, osurf%nCells
773 osurf%cellPtr(i) = osurf%iBuffer(isize)
776 do i = 1, osurf%ADT%nLeaves
778 osurf%ADT%ADTree(i)%children(1) = osurf%iBuffer(isize)
780 osurf%ADT%ADTree(i)%children(2) = osurf%iBuffer(isize)
786 do i = 1, osurf%nNodes
789 osurf%x(j, i) = osurf%rBuffer(rsize)
793 do i = 1, osurf%nNodes
795 osurf%delta(i) = osurf%rBuffer(rsize)
798 do i = 1, osurf%ADT%nBboxes
799 osurf%ADT%xBBox(:, i) = osurf%rBuffer(rsize + 1:rsize + 6)
803 do i = 1, osurf%ADT%nLeaves
804 osurf%ADT%ADTree(i)%xMin(:) = osurf%rBuffer(rsize + 1:rsize + 6)
807 osurf%ADT%ADTree(i)%xMax(:) = osurf%rBuffer(rsize + 1:rsize + 6)
813 if (osurf%nNodes > 0)
then
819 do i = 1, osurf%nCells
823 if (osurf%nte(k, n) == 0)
then
832 osurf%allocated = .true.
833 deallocate (osurf%rBuffer, osurf%iBuffer)
integer(kind=inttype) nbocos
integer(kind=inttype), dimension(:), pointer bctype
integer, parameter adtvolumeadt
integer(kind=adtelementtype), parameter adthexahedron
integer(kind=adtelementtype), parameter adtquadrilateral
integer, parameter adtsurfaceadt
type(kdtree2) function, pointer, public kdtree2_create(input_data, dim, sort, rearrange)
subroutine unpackosurf(oSurf)
subroutine getoblockbuffersizes(il, jl, kl, iSize, rSize)
subroutine getosurfbuffersizes(famList, il, jl, kl, iSize, rSize, dualMesh)
subroutine getwallsize(famList, nNodes, nCells, dualMesh)
subroutine packoblock(oBlock)
subroutine packofringe(oFringe)
subroutine getofringebuffersizes(il, jl, kl, iSize, rSize)
subroutine unpackoblock(oBlock)
subroutine unpackofringe(oFringe)
subroutine packosurf(famList, oSurf, dualMesh)
logical function faminlist(famID, famList)