7 use adtutils,
only: adts, adtleaftype, adtbboxtargettype,
stack, &
61 type(
adttype),
intent(inout) :: ADT
62 integer(kind=intType),
intent(in) :: nCoor
63 integer(kind=intType),
intent(in) :: nInterpol
65 real(kind=realtype),
dimension(:, :),
intent(in) :: coor
66 real(kind=realtype),
dimension(:, :),
intent(in) :: arrdonor
68 integer(kind=intType),
dimension(:, :),
intent(out) :: intInfo
69 real(kind=realtype),
dimension(:, :),
intent(out) :: uvw
73 integer(kind=intType),
dimension(:),
pointer :: BB
74 integer(kind=intType),
dimension(:),
pointer :: frontLeaves
75 integer(kind=intType),
dimension(:),
pointer :: frontLeavesNew
76 integer(kind=intType) :: nAllocBB, nAllocFront
77 integer(kind=intType) :: ierr, nn
85 allocate (bb(nallocbb), frontleaves(nallocfront), &
86 frontleavesnew(nallocfront), stat=ierr)
89 "Memory allocation failure for BB, &
90 &frontLeaves and frontLeavesNew.")
94 coorloop:
do nn = 1, ncoor
97 intinfo(:, nn), uvw(:, nn), arrdonor, ninterpol, bb, &
98 frontleaves, frontleavesnew, failed)
104 deallocate (bb, frontleaves, frontleavesnew, stat=ierr)
107 "Deallocation failure for BB, &
108 &frontLeaves and frontLeavesNew.")
113 intInfo, uvw, arrDonor, nInterpol, BB, &
114 frontLeaves, frontLeavesNew, failed)
160 type(
adttype),
intent(inout) :: ADT
161 integer(kind=intType),
intent(in) :: nInterpol
163 real(kind=realtype),
dimension(3),
intent(in) :: coor
164 real(kind=realtype),
dimension(:, :),
intent(in) :: arrdonor
166 integer(kind=intType),
dimension(3),
intent(out) :: intInfo
167 real(kind=realtype),
dimension(:),
intent(out) :: uvw
168 logical,
intent(out) :: failed
169 integer(kind=intType),
dimension(:),
pointer :: BB
170 integer(kind=intType),
dimension(:),
pointer :: frontLeaves
171 integer(kind=intType),
dimension(:),
pointer :: frontLeavesNew
176 integer(kind=intType),
parameter :: iterMax = 15
177 real(kind=realtype),
parameter :: adteps = 1.e-25_realtype
178 real(kind=realtype),
parameter :: thresconv = 1.e-10_realtype
184 integer(kind=intType) :: ii, kk, ll, mm, nn
185 integer(kind=intType) :: nBB, nFrontLeaves, nFrontLeavesNew
186 integer(kind=intType) :: nAllocBB, nAllocFront
187 integer(kind=intType) :: i, nNodeElement
189 integer(kind=intType),
dimension(8) :: n
191 real(kind=realtype) :: u, v, w, uv, uw, vw, wvu, du, dv, dw
192 real(kind=realtype) :: oneminusu, oneminusv, oneminusw
193 real(kind=realtype) :: oneminusuminusv
194 real(kind=realtype) :: a11, a12, a13, a21, a22, a23
195 real(kind=realtype) :: a31, a32, a33, val
197 real(kind=realtype),
dimension(3) :: x, f
198 real(kind=realtype),
dimension(8) :: weight
199 real(kind=realtype),
dimension(3, 2:8) :: xn
201 real(kind=realtype),
dimension(:, :),
pointer :: xbbox
203 logical :: elementFound
215 nallocfront =
size(frontleaves)
234 treetraversalloop:
do
243 currentfrontloop:
do ii = 1, nfrontleaves
250 childrenloop:
do mm = 1, 2
255 kk = adtree(ll)%children(mm)
257 terminaltest:
if (kk < 0)
then
263 if (coor(1) >= xbbox(1, kk) .and. &
264 coor(1) <= xbbox(4, kk) .and. &
265 coor(2) >= xbbox(2, kk) .and. &
266 coor(2) <= xbbox(5, kk) .and. &
267 coor(3) >= xbbox(3, kk) .and. &
268 coor(3) <= xbbox(6, kk))
then
273 if (nbb == nallocbb) &
285 if (coor(1) >= adtree(kk)%xMin(1) .and. &
286 coor(1) <= adtree(kk)%xMax(4) .and. &
287 coor(2) >= adtree(kk)%xMin(2) .and. &
288 coor(2) <= adtree(kk)%xMax(5) .and. &
289 coor(3) >= adtree(kk)%xMin(3) .and. &
290 coor(3) <= adtree(kk)%xMax(6))
then
295 if (nfrontleavesnew == nallocfront)
then
298 call reallocplus(frontleaves, nallocfront, 250, adt)
301 nfrontleavesnew = nfrontleavesnew + 1
302 frontleavesnew(nfrontleavesnew) = kk
310 end do currentfrontloop
316 if (nfrontleavesnew == 0)
exit treetraversalloop
321 nfrontleaves = nfrontleavesnew
322 do ll = 1, nfrontleaves
323 frontleaves(ll) = frontleavesnew(ll)
326 end do treetraversalloop
331 elementfound = .false.
333 bboxloop:
do mm = 1, nbb
338 select case (adt%elementType(kk))
345 ll = adt%elementID(kk)
346 n(1) = adt%tetraConn(1, ll)
349 n(i) = adt%tetraConn(i, ll)
351 xn(1, i) = adt%coor(1, n(i)) - adt%coor(1, n(1))
352 xn(2, i) = adt%coor(2, n(i)) - adt%coor(2, n(1))
353 xn(3, i) = adt%coor(3, n(i)) - adt%coor(3, n(1))
356 x(1) = coor(1) - adt%coor(1, n(1))
357 x(2) = coor(2) - adt%coor(2, n(1))
358 x(3) = coor(3) - adt%coor(3, n(1))
363 a11 = xn(1, 2); a12 = xn(1, 3); a13 = xn(1, 4)
364 a21 = xn(2, 2); a22 = xn(2, 3); a23 = xn(2, 4)
365 a31 = xn(3, 2); a32 = xn(3, 3); a33 = xn(3, 4)
370 val = a11 * (a22 * a33 - a32 * a23) + a21 * (a13 * a32 - a12 * a33) &
371 + a31 * (a12 * a23 - a13 * a22)
372 val = sign(
one, val) / max(abs(val), adteps)
376 u = val * ((a22 * a33 - a23 * a32) * x(1) &
377 + (a13 * a32 - a12 * a33) * x(2) &
378 + (a12 * a23 - a13 * a22) * x(3))
379 v = val * ((a23 * a31 - a21 * a33) * x(1) &
380 + (a11 * a33 - a13 * a31) * x(2) &
381 + (a13 * a21 - a11 * a23) * x(3))
382 w = val * ((a21 * a32 - a22 * a31) * x(1) &
383 + (a12 * a31 - a11 * a32) * x(2) &
384 + (a11 * a22 - a12 * a21) * x(3))
390 if (u >=
zero .and. v >=
zero .and. &
391 w >=
zero .and. (u + v + w) <=
one)
then
392 elementfound = .true.
400 weight(1) =
one - u - v - w
413 ll = adt%elementID(kk)
414 n(1) = adt%pyraConn(1, ll)
417 n(i) = adt%pyraConn(i, ll)
419 xn(1, i) = adt%coor(1, n(i)) - adt%coor(1, n(1))
420 xn(2, i) = adt%coor(2, n(i)) - adt%coor(2, n(1))
421 xn(3, i) = adt%coor(3, n(i)) - adt%coor(3, n(1))
424 x(1) = coor(1) - adt%coor(1, n(1))
425 x(2) = coor(2) - adt%coor(2, n(1))
426 x(3) = coor(3) - adt%coor(3, n(1))
432 xn(1, 3) = xn(1, 3) - xn(1, 2) - xn(1, 4)
433 xn(2, 3) = xn(2, 3) - xn(2, 2) - xn(2, 4)
434 xn(3, 3) = xn(3, 3) - xn(3, 2) - xn(3, 4)
446 newtonpyra:
do ll = 1, itermax
453 f(1) = oneminusw * (xn(1, 2) * u + xn(1, 4) * v + xn(1, 3) * uv) &
454 + xn(1, 5) * w - x(1)
455 f(2) = oneminusw * (xn(2, 2) * u + xn(2, 4) * v + xn(2, 3) * uv) &
456 + xn(2, 5) * w - x(2)
457 f(3) = oneminusw * (xn(3, 2) * u + xn(3, 4) * v + xn(3, 3) * uv) &
458 + xn(3, 5) * w - x(3)
462 a11 = oneminusw * (xn(1, 2) + xn(1, 3) * v)
463 a12 = oneminusw * (xn(1, 4) + xn(1, 3) * u)
464 a13 = xn(1, 5) - xn(1, 2) * u - xn(1, 4) * v - xn(1, 3) * uv
466 a21 = oneminusw * (xn(2, 2) + xn(2, 3) * v)
467 a22 = oneminusw * (xn(2, 4) + xn(2, 3) * u)
468 a23 = xn(2, 5) - xn(2, 2) * u - xn(2, 4) * v - xn(2, 3) * uv
470 a31 = oneminusw * (xn(3, 2) + xn(3, 3) * v)
471 a32 = oneminusw * (xn(3, 4) + xn(3, 3) * u)
472 a33 = xn(3, 5) - xn(3, 2) * u - xn(3, 4) * v - xn(3, 3) * uv
478 val = a11 * (a22 * a33 - a32 * a23) + a21 * (a13 * a32 - a12 * a33) &
479 + a31 * (a12 * a23 - a13 * a22)
480 val = sign(
one, val) / max(abs(val), adteps)
484 du = val * ((a22 * a33 - a23 * a32) * f(1) &
485 + (a13 * a32 - a12 * a33) * f(2) &
486 + (a12 * a23 - a13 * a22) * f(3))
487 dv = val * ((a23 * a31 - a21 * a33) * f(1) &
488 + (a11 * a33 - a13 * a31) * f(2) &
489 + (a13 * a21 - a11 * a23) * f(3))
490 dw = val * ((a21 * a32 - a22 * a31) * f(1) &
491 + (a12 * a31 - a11 * a32) * f(2) &
492 + (a11 * a22 - a12 * a21) * f(3))
494 u = u - du; v = v - dv; w = w - dw
499 val = sqrt(du * du + dv * dv + dw * dw)
500 if (val <= thresconv)
then
510 if (u >=
zero .and. v >=
zero .and. &
511 w >=
zero .and. (u + w) <=
one .and. &
512 (v + w) <=
one .and. .not. failed)
then
513 elementfound = .true.
524 weight(1) = oneminusu * oneminusv * oneminusw
525 weight(2) = u * oneminusv * oneminusw
526 weight(3) = u * v * oneminusw
527 weight(4) = oneminusu * v * oneminusw
538 ll = adt%elementID(kk)
539 n(1) = adt%prismsConn(1, ll)
542 n(i) = adt%prismsConn(i, ll)
544 xn(1, i) = adt%coor(1, n(i)) - adt%coor(1, n(1))
545 xn(2, i) = adt%coor(2, n(i)) - adt%coor(2, n(1))
546 xn(3, i) = adt%coor(3, n(i)) - adt%coor(3, n(1))
549 x(1) = coor(1) - adt%coor(1, n(1))
550 x(2) = coor(2) - adt%coor(2, n(1))
551 x(3) = coor(3) - adt%coor(3, n(1))
557 xn(1, 5) = xn(1, 5) - xn(1, 2) - xn(1, 4)
558 xn(2, 5) = xn(2, 5) - xn(2, 2) - xn(2, 4)
559 xn(3, 5) = xn(3, 5) - xn(3, 2) - xn(3, 4)
561 xn(1, 6) = xn(1, 6) - xn(1, 3) - xn(1, 4)
562 xn(2, 6) = xn(2, 6) - xn(2, 3) - xn(2, 4)
563 xn(3, 6) = xn(3, 6) - xn(3, 3) - xn(3, 4)
575 newtonprisms:
do ll = 1, itermax
579 uw = u * w; vw = v * w
581 f(1) = xn(1, 2) * u + xn(1, 3) * v + xn(1, 4) * w &
582 + xn(1, 5) * uw + xn(1, 6) * vw - x(1)
583 f(2) = xn(2, 2) * u + xn(2, 3) * v + xn(2, 4) * w &
584 + xn(2, 5) * uw + xn(2, 6) * vw - x(2)
585 f(3) = xn(3, 2) * u + xn(3, 3) * v + xn(3, 4) * w &
586 + xn(3, 5) * uw + xn(3, 6) * vw - x(3)
590 a11 = xn(1, 2) + xn(1, 5) * w
591 a12 = xn(1, 3) + xn(1, 6) * w
592 a13 = xn(1, 4) + xn(1, 5) * u + xn(1, 6) * v
594 a21 = xn(2, 2) + xn(2, 5) * w
595 a22 = xn(2, 3) + xn(2, 6) * w
596 a23 = xn(2, 4) + xn(2, 5) * u + xn(2, 6) * v
598 a31 = xn(3, 2) + xn(3, 5) * w
599 a32 = xn(3, 3) + xn(3, 6) * w
600 a33 = xn(3, 4) + xn(3, 5) * u + xn(3, 6) * v
606 val = a11 * (a22 * a33 - a32 * a23) + a21 * (a13 * a32 - a12 * a33) &
607 + a31 * (a12 * a23 - a13 * a22)
608 val = sign(
one, val) / max(abs(val), adteps)
612 du = val * ((a22 * a33 - a23 * a32) * f(1) &
613 + (a13 * a32 - a12 * a33) * f(2) &
614 + (a12 * a23 - a13 * a22) * f(3))
615 dv = val * ((a23 * a31 - a21 * a33) * f(1) &
616 + (a11 * a33 - a13 * a31) * f(2) &
617 + (a13 * a21 - a11 * a23) * f(3))
618 dw = val * ((a21 * a32 - a22 * a31) * f(1) &
619 + (a12 * a31 - a11 * a32) * f(2) &
620 + (a11 * a22 - a12 * a21) * f(3))
622 u = u - du; v = v - dv; w = w - dw
627 val = sqrt(du * du + dv * dv + dw * dw)
628 if (val <= thresconv)
then
639 if (u >=
zero .and. v >=
zero .and. &
640 w >=
zero .and. w <=
one .and. &
641 (u + v) <=
one .and. .not. failed)
then
642 elementfound = .true.
649 oneminusuminusv =
one - u - v
652 weight(1) = oneminusuminusv * oneminusw
653 weight(2) = u * oneminusw
654 weight(3) = v * oneminusw
655 weight(4) = oneminusuminusv * w
667 ll = adt%elementID(kk)
668 n(1) = adt%hexaConn(1, ll)
671 n(i) = adt%hexaConn(i, ll)
673 xn(1, i) = adt%coor(1, n(i)) - adt%coor(1, n(1))
674 xn(2, i) = adt%coor(2, n(i)) - adt%coor(2, n(1))
675 xn(3, i) = adt%coor(3, n(i)) - adt%coor(3, n(1))
678 x(1) = coor(1) - adt%coor(1, n(1))
679 x(2) = coor(2) - adt%coor(2, n(1))
680 x(3) = coor(3) - adt%coor(3, n(1))
686 xn(1, 7) = xn(1, 7) + xn(1, 2) + xn(1, 4) + xn(1, 5) &
687 - xn(1, 3) - xn(1, 6) - xn(1, 8)
688 xn(2, 7) = xn(2, 7) + xn(2, 2) + xn(2, 4) + xn(2, 5) &
689 - xn(2, 3) - xn(2, 6) - xn(2, 8)
690 xn(3, 7) = xn(3, 7) + xn(3, 2) + xn(3, 4) + xn(3, 5) &
691 - xn(3, 3) - xn(3, 6) - xn(3, 8)
693 xn(1, 3) = xn(1, 3) - xn(1, 2) - xn(1, 4)
694 xn(2, 3) = xn(2, 3) - xn(2, 2) - xn(2, 4)
695 xn(3, 3) = xn(3, 3) - xn(3, 2) - xn(3, 4)
697 xn(1, 6) = xn(1, 6) - xn(1, 2) - xn(1, 5)
698 xn(2, 6) = xn(2, 6) - xn(2, 2) - xn(2, 5)
699 xn(3, 6) = xn(3, 6) - xn(3, 2) - xn(3, 5)
701 xn(1, 8) = xn(1, 8) - xn(1, 4) - xn(1, 5)
702 xn(2, 8) = xn(2, 8) - xn(2, 4) - xn(2, 5)
703 xn(3, 8) = xn(3, 8) - xn(3, 4) - xn(3, 5)
715 newtonhexa:
do ll = 1, itermax
719 uv = u * v; uw = u * w; vw = v * w; wvu = u * v * w
721 f(1) = xn(1, 2) * u + xn(1, 4) * v + xn(1, 5) * w &
722 + xn(1, 3) * uv + xn(1, 6) * uw + xn(1, 8) * vw &
723 + xn(1, 7) * wvu - x(1)
724 f(2) = xn(2, 2) * u + xn(2, 4) * v + xn(2, 5) * w &
725 + xn(2, 3) * uv + xn(2, 6) * uw + xn(2, 8) * vw &
726 + xn(2, 7) * wvu - x(2)
727 f(3) = xn(3, 2) * u + xn(3, 4) * v + xn(3, 5) * w &
728 + xn(3, 3) * uv + xn(3, 6) * uw + xn(3, 8) * vw &
729 + xn(3, 7) * wvu - x(3)
733 a11 = xn(1, 2) + xn(1, 3) * v + xn(1, 6) * w + xn(1, 7) * vw
734 a12 = xn(1, 4) + xn(1, 3) * u + xn(1, 8) * w + xn(1, 7) * uw
735 a13 = xn(1, 5) + xn(1, 6) * u + xn(1, 8) * v + xn(1, 7) * uv
737 a21 = xn(2, 2) + xn(2, 3) * v + xn(2, 6) * w + xn(2, 7) * vw
738 a22 = xn(2, 4) + xn(2, 3) * u + xn(2, 8) * w + xn(2, 7) * uw
739 a23 = xn(2, 5) + xn(2, 6) * u + xn(2, 8) * v + xn(2, 7) * uv
741 a31 = xn(3, 2) + xn(3, 3) * v + xn(3, 6) * w + xn(3, 7) * vw
742 a32 = xn(3, 4) + xn(3, 3) * u + xn(3, 8) * w + xn(3, 7) * uw
743 a33 = xn(3, 5) + xn(3, 6) * u + xn(3, 8) * v + xn(3, 7) * uv
749 val = a11 * (a22 * a33 - a32 * a23) + a21 * (a13 * a32 - a12 * a33) &
750 + a31 * (a12 * a23 - a13 * a22)
751 val = sign(
one, val) / max(abs(val), adteps)
755 du = val * ((a22 * a33 - a23 * a32) * f(1) &
756 + (a13 * a32 - a12 * a33) * f(2) &
757 + (a12 * a23 - a13 * a22) * f(3))
758 dv = val * ((a23 * a31 - a21 * a33) * f(1) &
759 + (a11 * a33 - a13 * a31) * f(2) &
760 + (a13 * a21 - a11 * a23) * f(3))
761 dw = val * ((a21 * a32 - a22 * a31) * f(1) &
762 + (a12 * a31 - a11 * a32) * f(2) &
763 + (a11 * a22 - a12 * a21) * f(3))
765 u = u - du; v = v - dv; w = w - dw
770 val = sqrt(du * du + dv * dv + dw * dw)
771 if (val <= thresconv)
then
782 if (u >=
zero .and. u <=
one .and. &
783 v >=
zero .and. v <=
one .and. &
784 w >=
zero .and. w <=
one .and. .not. failed)
then
785 elementfound = .true.
796 weight(1) = oneminusu * oneminusv * oneminusw
797 weight(2) = u * oneminusv * oneminusw
798 weight(3) = u * v * oneminusw
799 weight(4) = oneminusu * v * oneminusw
800 weight(5) = oneminusu * oneminusv * w
801 weight(6) = u * oneminusv * w
802 weight(7) = u * v * w
803 weight(8) = oneminusu * v * w
812 if (elementfound)
then
816 intinfo(1) = adt%myID
817 intinfo(2) = adt%elementType(kk)
818 intinfo(3) = adt%elementID(kk)
830 uvw(ii) = weight(1) * arrdonor(ll, n(1))
831 do i = 2, nnodeelement
832 uvw(ii) = uvw(ii) + weight(i) * arrdonor(ll, n(i))
895 type(
adttype),
intent(inout) :: ADT
896 integer(kind=intType),
intent(in) :: nCoor
897 integer(kind=intType),
intent(in) :: nInterpol
899 real(kind=realtype),
dimension(:, :),
intent(in) :: coor
900 real(kind=realtype),
dimension(:, :),
intent(in) :: arrdonor
902 integer(kind=intType),
dimension(:, :),
intent(out) :: intInfo
903 real(kind=realtype),
dimension(:, :),
intent(out) :: uvw
907 integer(kind=intType),
parameter :: iterMax = 15
908 real(kind=realtype),
parameter :: adteps = 1.e-25_realtype
909 real(kind=realtype),
parameter :: thresconv = 1.e-10_realtype
914 integer(kind=intType) :: nAllocBB, nAllocFront, nStack
915 integer(kind=intType),
dimension(:),
pointer :: frontLeaves
916 integer(kind=intType),
dimension(:),
pointer :: frontLeavesNew
931 allocate (
stack(nstack), bb(nallocbb), frontleaves(nallocfront), &
932 frontleavesnew(nallocfront), stat=ierr)
935 "Memory allocation failure for stack, BB, &
940 coorloop:
do nn = 1, ncoor
943 intinfo(:, nn), uvw(:, nn), arrdonor, ninterpol, bb, &
944 frontleaves, frontleavesnew)
950 deallocate (
stack, bb, frontleaves, frontleavesnew, stat=ierr)
953 "Deallocation failure for stack, BB, etc.")
958 uvw, arrDonor, nInterpol, BB, frontLeaves, frontLeavesNew)
1008 type(
adttype),
intent(inout) :: ADT
1009 integer(kind=intType),
intent(in) :: nInterpol
1011 real(kind=realtype),
dimension(4),
intent(in) :: coor
1012 real(kind=realtype),
dimension(:, :),
intent(in) :: arrdonor
1014 integer(kind=intType),
dimension(3),
intent(out) :: intInfo
1015 real(kind=realtype),
dimension(5),
intent(out) :: uvw
1016 integer(kind=intType),
dimension(:),
pointer :: frontLeaves
1017 integer(kind=intType),
dimension(:),
pointer :: frontLeavesNew
1022 integer(kind=intType),
parameter :: iterMax = 15
1023 real(kind=realtype),
parameter :: adteps = 1.e-25_realtype
1024 real(kind=realtype),
parameter :: thresconv = 1.e-10_realtype
1030 integer(kind=intType) :: ii, kk, ll, mm, nn, activeLeaf
1031 integer(kind=intType) :: nBB, nFrontLeaves, nFrontLeavesNew
1032 integer(kind=intType) :: nAllocBB, nAllocFront, nNodeElement
1033 integer(kind=intType) :: i, kkk
1035 integer(kind=intType),
dimension(8) :: n, m
1037 real(kind=realtype) :: dx, dy, dz, d1, d2, invlen, val
1038 real(kind=realtype) :: u, v, w, uv, uold, vold, vn, du, dv
1039 real(kind=realtype) :: uu, vv, ww
1041 real(kind=realtype),
dimension(2) :: dd
1042 real(kind=realtype),
dimension(3) :: x1, x21, x41, x3142, xf
1043 real(kind=realtype),
dimension(3) ::
vf, vt, a, b, norm, an, bn
1044 real(kind=realtype),
dimension(3) :: chi
1045 real(kind=realtype),
dimension(8) :: weight
1047 real(kind=realtype),
dimension(:, :),
pointer :: xbbox
1049 logical :: elementFound
1050 type(
adtleaftype),
dimension(:),
pointer :: ADTree
1055 adtree => adt%ADTree
1066 nallocfront =
size(frontleaves)
1080 if (coor(1) < adtree(1)%xMin(1))
then
1081 dx = coor(1) - adtree(1)%xMin(1)
1082 else if (coor(1) > adtree(1)%xMax(4))
then
1083 dx = coor(1) - adtree(1)%xMax(4)
1088 if (coor(2) < adtree(1)%xMin(2))
then
1089 dy = coor(2) - adtree(1)%xMin(2)
1090 else if (coor(2) > adtree(1)%xMax(5))
then
1091 dy = coor(2) - adtree(1)%xMax(5)
1096 if (coor(3) < adtree(1)%xMin(3))
then
1097 dz = coor(3) - adtree(1)%xMin(3)
1098 else if (coor(3) > adtree(1)%xMax(6))
then
1099 dz = coor(3) - adtree(1)%xMax(6)
1108 if ((dx * dx + dy * dy + dz * dz) >= uvw(4))
return
1122 if (activeleaf < 0)
exit treetraversal1
1131 ll = adtree(activeleaf)%children(mm)
1137 d1 = abs(coor(1) - adtree(ll)%xMin(1))
1138 d2 = abs(coor(1) - adtree(ll)%xMax(4))
1141 d1 = abs(coor(2) - adtree(ll)%xMin(2))
1142 d2 = abs(coor(2) - adtree(ll)%xMax(5))
1145 d1 = abs(coor(3) - adtree(ll)%xMin(3))
1146 d2 = abs(coor(3) - adtree(ll)%xMax(6))
1156 d1 = abs(coor(1) - xbbox(1, ll))
1157 d2 = abs(coor(1) - xbbox(4, ll))
1160 d1 = abs(coor(2) - xbbox(2, ll))
1161 d2 = abs(coor(2) - xbbox(5, ll))
1164 d1 = abs(coor(3) - xbbox(3, ll))
1165 d2 = abs(coor(3) - xbbox(6, ll))
1172 dd(mm) = dx * dx + dy * dy + dz * dz
1181 if (dd(1) <= dd(2))
then
1182 activeleaf = adtree(activeleaf)%children(1)
1184 activeleaf = adtree(activeleaf)%children(2)
1187 end do treetraversal1
1192 uvw(4) = min(uvw(4), dd(1), dd(2))
1219 currentfrontloop:
do ii = 1, nfrontleaves
1224 ll = frontleaves(ii)
1226 childrenloop:
do mm = 1, 2
1231 kk = adtree(ll)%children(mm)
1232 terminaltest:
if (kk < 0)
then
1239 if (coor(1) < xbbox(1, kk))
then
1240 dx = coor(1) - xbbox(1, kk)
1241 else if (coor(1) > xbbox(4, kk))
then
1242 dx = coor(1) - xbbox(4, kk)
1247 if (coor(2) < xbbox(2, kk))
then
1248 dy = coor(2) - xbbox(2, kk)
1249 else if (coor(2) > xbbox(5, kk))
then
1250 dy = coor(2) - xbbox(5, kk)
1255 if (coor(3) < xbbox(3, kk))
then
1256 dz = coor(3) - xbbox(3, kk)
1257 else if (coor(3) > xbbox(6, kk))
then
1258 dz = coor(3) - xbbox(6, kk)
1263 d2 = dx * dx + dy * dy + dz * dz
1268 teststorebbox:
if (d2 < uvw(4))
then
1272 if (nbb == nallocbb) &
1280 bb(nbb)%posDist2 = d2
1289 d1 = abs(coor(1) - xbbox(1, kk))
1290 d2 = abs(coor(1) - xbbox(4, kk))
1293 d1 = abs(coor(2) - xbbox(2, kk))
1294 d2 = abs(coor(2) - xbbox(5, kk))
1297 d1 = abs(coor(3) - xbbox(3, kk))
1298 d2 = abs(coor(3) - xbbox(6, kk))
1301 d2 = dx * dx + dy * dy + dz * dz
1302 uvw(4) = min(uvw(4), d2)
1304 end if teststorebbox
1311 if (coor(1) < adtree(kk)%xMin(1))
then
1312 dx = coor(1) - adtree(kk)%xMin(1)
1313 else if (coor(1) > adtree(kk)%xMax(4))
then
1314 dx = coor(1) - adtree(kk)%xMax(4)
1319 if (coor(2) < adtree(kk)%xMin(2))
then
1320 dy = coor(2) - adtree(kk)%xMin(2)
1321 else if (coor(2) > adtree(kk)%xMax(5))
then
1322 dy = coor(2) - adtree(kk)%xMax(5)
1327 if (coor(3) < adtree(kk)%xMin(3))
then
1328 dz = coor(3) - adtree(kk)%xMin(3)
1329 else if (coor(3) > adtree(kk)%xMax(6))
then
1330 dz = coor(3) - adtree(kk)%xMax(6)
1335 d2 = dx * dx + dy * dy + dz * dz
1340 teststoreleave:
if (d2 < uvw(4))
then
1345 if (nfrontleavesnew == nallocfront)
then
1348 call reallocplus(frontleaves, nallocfront, 250, adt)
1351 nfrontleavesnew = nfrontleavesnew + 1
1352 frontleavesnew(nfrontleavesnew) = kk
1357 d1 = abs(coor(1) - adtree(kk)%xMin(1))
1358 d2 = abs(coor(1) - adtree(kk)%xMax(4))
1361 d1 = abs(coor(2) - adtree(kk)%xMin(2))
1362 d2 = abs(coor(2) - adtree(kk)%xMax(5))
1365 d1 = abs(coor(3) - adtree(kk)%xMin(3))
1366 d2 = abs(coor(3) - adtree(kk)%xMax(6))
1369 d2 = dx * dx + dy * dy + dz * dz
1370 uvw(4) = min(uvw(4), d2)
1372 end if teststoreleave
1376 end do currentfrontloop
1382 if (nfrontleavesnew == 0)
exit treetraversal2
1387 nfrontleaves = nfrontleavesnew
1388 do ll = 1, nfrontleaves
1389 frontleaves(ll) = frontleavesnew(ll)
1392 end do treetraversal2
1402 elementfound = .false.
1404 bboxloop:
do mm = 1, nbb
1410 if (uvw(4) <= bb(mm)%posDist2)
exit bboxloop
1415 select case (adt%elementType(kk))
1419 "Minimum distance search for &
1420 &triangles not implemented yet")
1437 ll = adt%elementID(kk)
1438 n(1) = adt%quadsConn(1, ll)
1439 n(2) = adt%quadsConn(2, ll)
1440 n(3) = adt%quadsConn(3, ll)
1441 n(4) = adt%quadsConn(4, ll)
1443 x1(1) = adt%coor(1, n(1))
1444 x1(2) = adt%coor(2, n(1))
1445 x1(3) = adt%coor(3, n(1))
1447 x21(1) = adt%coor(1, n(2)) - x1(1)
1448 x21(2) = adt%coor(2, n(2)) - x1(2)
1449 x21(3) = adt%coor(3, n(2)) - x1(3)
1451 x41(1) = adt%coor(1, n(4)) - x1(1)
1452 x41(2) = adt%coor(2, n(4)) - x1(2)
1453 x41(3) = adt%coor(3, n(4)) - x1(3)
1455 x3142(1) = adt%coor(1, n(3)) - x1(1) - x21(1) - x41(1)
1456 x3142(2) = adt%coor(2, n(3)) - x1(2) - x21(2) - x41(2)
1457 x3142(3) = adt%coor(3, n(3)) - x1(3) - x21(3) - x41(3)
1467 xf(1) = x1(1) + u * x21(1) + v * x41(1) + uv * x3142(1)
1468 xf(2) = x1(2) + u * x21(2) + v * x41(2) + uv * x3142(2)
1469 xf(3) = x1(3) + u * x21(3) + v * x41(3) + uv * x3142(3)
1474 newtonquads:
do ll = 1, itermax
1484 vf(1) = coor(1) - xf(1)
1485 vf(2) = coor(2) - xf(2)
1486 vf(3) = coor(3) - xf(3)
1491 a(1) = x21(1) + v * x3142(1)
1492 a(2) = x21(2) + v * x3142(2)
1493 a(3) = x21(3) + v * x3142(3)
1495 b(1) = x41(1) + u * x3142(1)
1496 b(2) = x41(2) + u * x3142(2)
1497 b(3) = x41(3) + u * x3142(3)
1503 norm(1) = a(2) * b(3) - a(3) * b(2)
1504 norm(2) = a(3) * b(1) - a(1) * b(3)
1505 norm(3) = a(1) * b(2) - a(2) * b(1)
1507 invlen =
one / max(adteps, sqrt(norm(1) * norm(1) &
1508 + norm(2) * norm(2) &
1509 + norm(3) * norm(3)))
1511 norm(1) = norm(1) * invlen
1512 norm(2) = norm(2) * invlen
1513 norm(3) = norm(3) * invlen
1518 vn =
vf(1) * norm(1) +
vf(2) * norm(2) +
vf(3) * norm(3)
1519 vt(1) =
vf(1) - vn * norm(1)
1520 vt(2) =
vf(2) - vn * norm(2)
1521 vt(3) =
vf(3) - vn * norm(3)
1533 an(1) = a(2) * norm(3) - a(3) * norm(2)
1534 an(2) = a(3) * norm(1) - a(1) * norm(3)
1535 an(3) = a(1) * norm(2) - a(2) * norm(1)
1537 bn(1) = b(2) * norm(3) - b(3) * norm(2)
1538 bn(2) = b(3) * norm(1) - b(1) * norm(3)
1539 bn(3) = b(1) * norm(2) - b(2) * norm(1)
1546 vn = a(1) * bn(1) + a(2) * bn(2) + a(3) * bn(3)
1547 vn = sign(max(adteps, abs(vn)), vn)
1548 du = (vt(1) * bn(1) + vt(2) * bn(2) + vt(3) * bn(3)) / vn
1550 vn = b(1) * an(1) + b(2) * an(2) + b(3) * an(3)
1551 vn = sign(max(adteps, abs(vn)), vn)
1552 dv = (vt(1) * an(1) + vt(2) * an(2) + vt(3) * an(3)) / vn
1557 u = u + du; u = min(
one, max(
zero, u))
1558 v = v + dv; v = min(
one, max(
zero, v))
1568 xf(1) = x1(1) + u * x21(1) + v * x41(1) + uv * x3142(1)
1569 xf(2) = x1(2) + u * x21(2) + v * x41(2) + uv * x3142(2)
1570 xf(3) = x1(3) + u * x21(3) + v * x41(3) + uv * x3142(3)
1575 val = sqrt(du * du + dv * dv)
1576 if (val <= thresconv)
exit newtonquads
1583 dx = coor(1) - xf(1)
1584 dy = coor(2) - xf(2)
1585 dz = coor(3) - xf(3)
1587 val = dx * dx + dy * dy + dz * dz
1593 if (val < uvw(4))
then
1596 elementfound = .true.
1598 kkk = kk; uu = u; vv = v; ww = w
1599 m(1) = n(1); m(2) = n(2); m(3) = n(3); m(4) = n(4)
1601 weight(1) = (
one - u) * (
one - v)
1602 weight(2) = u * (
one - v)
1604 weight(4) = (
one - u) * v
1611 "Minimum distance search for &
1612 &tetrahedra not implemented yet")
1618 "Minimum distance search for &
1619 &pyramids not implemented yet")
1625 "Minimum distance search for &
1626 &prisms not implemented yet")
1635 ll = adt%elementID(kk)
1636 n(1) = adt%hexaConn(1, ll)
1637 n(2) = adt%hexaConn(2, ll)
1638 n(3) = adt%hexaConn(3, ll)
1639 n(4) = adt%hexaConn(4, ll)
1640 n(5) = adt%hexaConn(5, ll)
1641 n(6) = adt%hexaConn(6, ll)
1642 n(7) = adt%hexaConn(7, ll)
1643 n(8) = adt%hexaConn(8, ll)
1648 adt%coor(1:3, n(1)), &
1649 adt%coor(1:3, n(2)), &
1650 adt%coor(1:3, n(3)), &
1651 adt%coor(1:3, n(4)), &
1652 adt%coor(1:3, n(5)), &
1653 adt%coor(1:3, n(6)), &
1654 adt%coor(1:3, n(7)), &
1655 adt%coor(1:3, n(8)), &
1662 if (val < uvw(4))
then
1665 elementfound = .true.
1668 uu = chi(1); vv = chi(2); ww = chi(3)
1670 m(1) = n(1); m(2) = n(2); m(3) = n(3); m(4) = n(4)
1671 m(5) = n(5); m(6) = n(6); m(7) = n(7); m(8) = n(8)
1673 weight(1) = (
one - uu) * (
one - vv) * (
one - ww)
1674 weight(2) = uu * (
one - vv) * (
one - ww)
1675 weight(3) = uu * vv * (
one - ww)
1676 weight(4) = (
one - uu) * vv * (
one - ww)
1677 weight(5) = (
one - uu) * (
one - vv) * ww
1678 weight(6) = uu * (
one - vv) * ww
1679 weight(7) = uu * vv * ww
1680 weight(8) = (
one - uu) * vv * ww
1691 if (elementfound)
then
1697 intinfo(1) = adt%myID
1698 intinfo(2) = adt%elementType(kkk)
1699 intinfo(3) = adt%elementID(kkk)
1711 do ll = 1, ninterpol
1713 uvw(ii) = weight(1) * arrdonor(ll, m(1))
1714 do i = 2, nnodeelement
1715 uvw(ii) = uvw(ii) + weight(i) * arrdonor(ll, m(i))
1724 intInfo, BB, frontLeaves, frontLeavesNew)
1743 type(
adttype),
intent(inout) :: ADT
1745 real(kind=realtype),
dimension(3),
intent(in) :: coor
1746 integer(kind=intType),
intent(out) :: intInfo
1748 integer(kind=intType),
dimension(:),
pointer :: BB
1749 integer(kind=intType),
dimension(:),
pointer :: frontLeaves
1750 integer(kind=intType),
dimension(:),
pointer :: frontLeavesNew
1756 integer(kind=intType) :: ii, kk, ll, mm, nn
1757 integer(kind=intType) :: nBB, nFrontLeaves, nFrontLeavesNew
1758 integer(kind=intType) :: nAllocBB, nAllocFront
1759 integer(kind=intType) :: i, nNodeElement
1760 real(kind=realtype),
dimension(:, :),
pointer :: xbbox
1761 logical :: elementFound
1762 type(
adtleaftype),
dimension(:),
pointer :: ADTree
1767 adtree => adt%ADTree
1772 nallocfront =
size(frontleaves)
1789 treetraversalloop:
do
1798 currentfrontloop:
do ii = 1, nfrontleaves
1803 ll = frontleaves(ii)
1805 childrenloop:
do mm = 1, 2
1810 kk = adtree(ll)%children(mm)
1811 terminaltest:
if (kk < 0)
then
1817 if (coor(1) <= xbbox(4, kk) .and. &
1818 coor(2) >= xbbox(2, kk) .and. &
1819 coor(2) <= xbbox(5, kk) .and. &
1820 coor(3) >= xbbox(3, kk) .and. &
1821 coor(3) <= xbbox(6, kk))
then
1826 exit treetraversalloop
1833 if (coor(1) <= adtree(kk)%xMax(4) .and. &
1834 coor(2) >= adtree(kk)%xMin(2) .and. &
1835 coor(2) <= adtree(kk)%xMax(5) .and. &
1836 coor(3) >= adtree(kk)%xMin(3) .and. &
1837 coor(3) <= adtree(kk)%xMax(6))
then
1842 if (nfrontleavesnew == nallocfront)
then
1845 call reallocplus(frontleaves, nallocfront, 250, adt)
1848 nfrontleavesnew = nfrontleavesnew + 1
1849 frontleavesnew(nfrontleavesnew) = kk
1856 end do currentfrontloop
1862 if (nfrontleavesnew == 0)
then
1863 exit treetraversalloop
1868 nfrontleaves = nfrontleavesnew
1869 do ll = 1, nfrontleaves
1870 frontleaves(ll) = frontleavesnew(ll)
1873 end do treetraversalloop
1900 subroutine mind2hexa(xP, x1, x2, x3, x4, x5, x6, x7, x8, d2, chi, iErr)
1942 real(kind=
realtype),
dimension(3),
intent(in) :: xp
1943 real(kind=
realtype),
dimension(3),
intent(in) :: x1, x2, x3, x4
1944 real(kind=
realtype),
dimension(3),
intent(in) :: x5, x6, x7, x8
1946 integer(kind=intType),
intent(out) :: iErr
1948 real(kind=
realtype),
intent(out) :: d2
1949 real(kind=
realtype),
dimension(3),
intent(out) :: chi
1953 integer(kind=intType),
parameter :: maxIt = 30
1954 integer(kind=intType) :: i, itCount = 0
1955 integer(kind=intType),
dimension(3) :: actSet, chiGradConv
1957 real(kind=
realtype) :: inactgradnorm, normdeltachi, x0, y0, z0
1958 real(kind=
realtype),
parameter :: gradtol = 1.0e-14_realtype
1959 real(kind=
realtype),
parameter :: deltachitol = 1.0e-14_realtype
1960 real(kind=
realtype),
dimension(3) :: deltachi, actualdeltachi
1961 real(kind=
realtype),
dimension(3) :: lwrbnd, uppbnd
1962 real(kind=
realtype),
dimension(3) :: grad, oldchi
1963 real(kind=
realtype),
dimension(3, 3) :: hess
1965 logical :: convDeltaChi, convGradD2
1974 chi(1) = 0.5_realtype
1975 chi(2) = 0.5_realtype
1976 chi(3) = 0.5_realtype
1987 lwrbnd(:) = 0.0_realtype
1988 uppbnd(:) = 1.0_realtype
1994 actualdeltachi(:) = 1.0_realtype
2001 iterloop:
do while (itcount <= maxit)
2005 itcount = itcount + 1
2011 call gradd2hexa(xp, x1, x2, x3, x4, x5, x6, x7, x8, chi, x0, y0, z0, grad, ierr)
2017 convdeltachi = .false.
2018 convgradd2 = .false.
2022 normdeltachi = sqrt(actualdeltachi(1)**2 + actualdeltachi(2)**2 + actualdeltachi(3)**2)
2024 if (normdeltachi < deltachitol) convdeltachi = .true.
2038 inactgradnorm = 0.0_realtype
2046 if (actset(i) == 0) inactgradnorm = inactgradnorm + grad(i)**2
2052 if (actset(i) == -1)
then
2053 if (grad(i) > 0.0_realtype)
then
2063 if (actset(i) == 1)
then
2064 if (grad(i) < 0.0_realtype)
then
2076 if (inactgradnorm < gradtol)
then
2078 if (actset(i) == 0) chigradconv(i) = 1
2082 if (sum(chigradconv(1:3)) == 3) convgradd2 = .true.
2086 if (convdeltachi .and. convgradd2)
exit iterloop
2092 call hessd2hexa(xp, x1, x2, x3, x4, x5, x6, x7, x8, chi, hess, ierr)
2113 if (actset(i) == 0)
then
2115 chi(i) = chi(i) + deltachi(i)
2121 if (chi(i) > uppbnd(i))
then
2124 else if (chi(i) < lwrbnd(i))
then
2131 actualdeltachi(:) = chi(:) - oldchi(:)
2141 d2 = (xp(1) - x0)**2 + (xp(2) - y0)**2 + (xp(3) - z0)**2
2172 real(kind=
realtype),
dimension(3),
intent(in) :: grad
2173 real(kind=
realtype),
dimension(3),
intent(out) :: step
2174 real(kind=
realtype),
dimension(3, 3),
intent(in) :: hess
2176 integer(kind=intType),
intent(out) :: iErr
2190 determinant = hess(1, 1) * (hess(2, 2) * hess(3, 3) - hess(2, 3) * hess(3, 2)) &
2191 + hess(1, 2) * (hess(2, 3) * hess(3, 1) - hess(2, 1) * hess(3, 3)) &
2192 + hess(1, 3) * (hess(2, 1) * hess(3, 2) - hess(2, 2) * hess(3, 1))
2196 step(1) = grad(1) * (hess(2, 2) * hess(3, 3) - hess(2, 3) * hess(3, 2)) &
2197 + hess(1, 2) * (hess(2, 3) * grad(3) - grad(2) * hess(3, 3)) &
2198 + hess(1, 3) * (grad(2) * hess(3, 2) - hess(2, 2) * grad(3))
2199 step(1) = -step(1) / determinant
2203 step(2) = hess(1, 1) * (grad(2) * hess(3, 3) - hess(2, 3) * grad(3)) &
2204 + grad(1) * (hess(2, 3) * hess(3, 1) - hess(2, 1) * hess(3, 3)) &
2205 + hess(1, 3) * (hess(2, 1) * grad(3) - grad(2) * hess(3, 1))
2206 step(2) = -step(2) / determinant
2210 step(3) = hess(1, 1) * (hess(2, 2) * grad(3) - grad(2) * hess(3, 2)) &
2211 + hess(1, 2) * (grad(2) * hess(3, 1) - hess(2, 1) * grad(3)) &
2212 + grad(1) * (hess(2, 1) * hess(3, 2) - hess(2, 2) * hess(3, 1))
2213 step(3) = -step(3) / determinant
2223 subroutine hessd2hexa(xP, x1, x2, x3, x4, x5, x6, x7, x8, chi, hess, iErr)
2235 real(kind=
realtype),
dimension(3),
intent(in) :: xp, chi
2236 real(kind=
realtype),
dimension(3),
intent(in) :: x1, x2, x3, x4
2237 real(kind=
realtype),
dimension(3),
intent(in) :: x5, x6, x7, x8
2238 real(kind=
realtype),
dimension(3, 3),
intent(out) :: hess
2240 integer(kind=intType),
intent(out) :: iErr
2245 integer(kind=intType) :: i
2247 real(kind=
realtype) :: ksi, eta, zeta, x0, y0, z0
2248 real(kind=
realtype),
dimension(8, 3) :: alpha
2249 real(kind=
realtype) :: dxdksi, dxdeta, dxdzeta
2250 real(kind=
realtype) :: dydksi, dydeta, dydzeta
2251 real(kind=
realtype) :: dzdksi, dzdeta, dzdzeta
2252 real(kind=
realtype) :: d2xdksideta, d2xdksidzeta, d2xdetadzeta
2253 real(kind=
realtype) :: d2ydksideta, d2ydksidzeta, d2ydetadzeta
2254 real(kind=
realtype) :: d2zdksideta, d2zdksidzeta, d2zdetadzeta
2270 alpha(2, i) = x2(i) - x1(i)
2271 alpha(3, i) = x4(i) - x1(i)
2272 alpha(4, i) = x5(i) - x1(i)
2273 alpha(5, i) = x3(i) - x2(i) + x1(i) - x4(i)
2274 alpha(6, i) = x6(i) - x5(i) + x1(i) - x2(i)
2275 alpha(7, i) = x8(i) - x5(i) + x1(i) - x4(i)
2276 alpha(8, i) = x7(i) - x8(i) + x5(i) - x6(i) + x4(i) - x3(i) + x2(i) - x1(i)
2282 dxdksi = alpha(2, 1) + alpha(5, 1) * eta + alpha(6, 1) * zeta + alpha(8, 1) * eta * zeta
2283 dydksi = alpha(2, 2) + alpha(5, 2) * eta + alpha(6, 2) * zeta + alpha(8, 2) * eta * zeta
2284 dzdksi = alpha(2, 3) + alpha(5, 3) * eta + alpha(6, 3) * zeta + alpha(8, 3) * eta * zeta
2286 dxdeta = alpha(3, 1) + alpha(5, 1) * ksi + alpha(7, 1) * zeta + alpha(8, 1) * ksi * zeta
2287 dydeta = alpha(3, 2) + alpha(5, 2) * ksi + alpha(7, 2) * zeta + alpha(8, 2) * ksi * zeta
2288 dzdeta = alpha(3, 3) + alpha(5, 3) * ksi + alpha(7, 3) * zeta + alpha(8, 3) * ksi * zeta
2290 dxdzeta = alpha(4, 1) + alpha(6, 1) * ksi + alpha(7, 1) * eta + alpha(8, 1) * ksi * eta
2291 dydzeta = alpha(4, 2) + alpha(6, 2) * ksi + alpha(7, 2) * eta + alpha(8, 2) * ksi * eta
2292 dzdzeta = alpha(4, 3) + alpha(6, 3) * ksi + alpha(7, 3) * eta + alpha(8, 3) * ksi * eta
2299 d2xdksideta = alpha(5, 1) + alpha(8, 1) * zeta
2300 d2ydksideta = alpha(5, 2) + alpha(8, 2) * zeta
2301 d2zdksideta = alpha(5, 3) + alpha(8, 3) * zeta
2303 d2xdksidzeta = alpha(6, 1) + alpha(8, 1) * eta
2304 d2ydksidzeta = alpha(6, 2) + alpha(8, 2) * eta
2305 d2zdksidzeta = alpha(6, 3) + alpha(8, 3) * eta
2307 d2xdetadzeta = alpha(7, 1) + alpha(8, 1) * ksi
2308 d2ydetadzeta = alpha(7, 2) + alpha(8, 2) * ksi
2309 d2zdetadzeta = alpha(7, 3) + alpha(8, 3) * ksi
2313 x0 = alpha(1, 1) + alpha(2, 1) * ksi + alpha(3, 1) * eta + alpha(4, 1) * zeta &
2314 + alpha(5, 1) * ksi * eta + alpha(6, 1) * ksi * zeta + alpha(7, 1) * eta * zeta &
2315 + alpha(8, 1) * ksi * eta * zeta
2316 y0 = alpha(1, 2) + alpha(2, 2) * ksi + alpha(3, 2) * eta + alpha(4, 2) * zeta &
2317 + alpha(5, 2) * ksi * eta + alpha(6, 2) * ksi * zeta + alpha(7, 2) * eta * zeta &
2318 + alpha(8, 2) * ksi * eta * zeta
2319 z0 = alpha(1, 3) + alpha(2, 3) * ksi + alpha(3, 3) * eta + alpha(4, 3) * zeta &
2320 + alpha(5, 3) * ksi * eta + alpha(6, 3) * ksi * zeta + alpha(7, 3) * eta * zeta &
2321 + alpha(8, 3) * ksi * eta * zeta
2325 hess(1, 1) = 2.0_realtype * ((dxdksi * dxdksi) + (dydksi * dydksi) + (dzdksi * dzdksi))
2326 hess(2, 2) = 2.0_realtype * ((dxdeta * dxdeta) + (dydeta * dydeta) + (dzdeta * dzdeta))
2327 hess(3, 3) = 2.0_realtype * ((dxdzeta * dxdzeta) + (dydzeta * dydzeta) + (dzdzeta * dzdzeta))
2329 hess(1, 2) = 2.0_realtype * ((dxdksi * dxdeta) + (dydksi * dydeta) + (dzdksi * dzdeta) &
2330 - ((xp(1) - x0) * d2xdksideta) - &
2331 ((xp(2) - y0) * d2ydksideta) - ((xp(3) - z0) * d2zdksideta))
2332 hess(1, 3) = 2.0_realtype * ((dxdksi * dxdzeta) + (dydksi * dydzeta) + (dzdksi * dzdzeta) &
2333 - ((xp(1) - x0) * d2xdksidzeta) - &
2334 ((xp(2) - y0) * d2ydksidzeta) - ((xp(3) - z0) * d2zdksidzeta))
2335 hess(2, 3) = 2.0_realtype * ((dxdeta * dxdzeta) + (dydeta * dydzeta) + (dzdeta * dzdzeta) &
2336 - ((xp(1) - x0) * d2xdetadzeta) - &
2337 ((xp(2) - y0) * d2ydetadzeta) - ((xp(3) - z0) * d2zdetadzeta))
2339 hess(2, 1) = hess(1, 2)
2340 hess(3, 1) = hess(1, 3)
2341 hess(3, 2) = hess(2, 3)
2351 subroutine gradd2hexa(xP, x1, x2, x3, x4, x5, x6, x7, x8, chi, x0, y0, z0, grad, iErr)
2363 real(kind=
realtype),
intent(out) :: x0, y0, z0
2364 real(kind=
realtype),
dimension(3),
intent(in) :: xp, chi
2365 real(kind=
realtype),
dimension(3),
intent(in) :: x1, x2, x3, x4
2366 real(kind=
realtype),
dimension(3),
intent(in) :: x5, x6, x7, x8
2367 real(kind=
realtype),
dimension(3),
intent(out) :: grad
2369 integer(kind=intType),
intent(out) :: iErr
2374 integer(kind=intType) :: i
2376 real(kind=
realtype) :: ksi, eta, zeta
2377 real(kind=
realtype),
dimension(8, 3) :: alpha
2378 real(kind=
realtype) :: dxdksi, dxdeta, dxdzeta
2379 real(kind=
realtype) :: dydksi, dydeta, dydzeta
2380 real(kind=
realtype) :: dzdksi, dzdeta, dzdzeta
2396 alpha(2, i) = x2(i) - x1(i)
2397 alpha(3, i) = x4(i) - x1(i)
2398 alpha(4, i) = x5(i) - x1(i)
2399 alpha(5, i) = x3(i) - x2(i) + x1(i) - x4(i)
2400 alpha(6, i) = x6(i) - x5(i) + x1(i) - x2(i)
2401 alpha(7, i) = x8(i) - x5(i) + x1(i) - x4(i)
2402 alpha(8, i) = x7(i) - x8(i) + x5(i) - x6(i) + x4(i) - x3(i) + x2(i) - x1(i)
2408 dxdksi = alpha(2, 1) + alpha(5, 1) * eta + alpha(6, 1) * zeta + alpha(8, 1) * eta * zeta
2409 dydksi = alpha(2, 2) + alpha(5, 2) * eta + alpha(6, 2) * zeta + alpha(8, 2) * eta * zeta
2410 dzdksi = alpha(2, 3) + alpha(5, 3) * eta + alpha(6, 3) * zeta + alpha(8, 3) * eta * zeta
2412 dxdeta = alpha(3, 1) + alpha(5, 1) * ksi + alpha(7, 1) * zeta + alpha(8, 1) * ksi * zeta
2413 dydeta = alpha(3, 2) + alpha(5, 2) * ksi + alpha(7, 2) * zeta + alpha(8, 2) * ksi * zeta
2414 dzdeta = alpha(3, 3) + alpha(5, 3) * ksi + alpha(7, 3) * zeta + alpha(8, 3) * ksi * zeta
2416 dxdzeta = alpha(4, 1) + alpha(6, 1) * ksi + alpha(7, 1) * eta + alpha(8, 1) * ksi * eta
2417 dydzeta = alpha(4, 2) + alpha(6, 2) * ksi + alpha(7, 2) * eta + alpha(8, 2) * ksi * eta
2418 dzdzeta = alpha(4, 3) + alpha(6, 3) * ksi + alpha(7, 3) * eta + alpha(8, 3) * ksi * eta
2422 x0 = alpha(1, 1) + alpha(2, 1) * ksi + alpha(3, 1) * eta + alpha(4, 1) * zeta &
2423 + alpha(5, 1) * ksi * eta + alpha(6, 1) * ksi * zeta + alpha(7, 1) * eta * zeta &
2424 + alpha(8, 1) * ksi * eta * zeta
2425 y0 = alpha(1, 2) + alpha(2, 2) * ksi + alpha(3, 2) * eta + alpha(4, 2) * zeta &
2426 + alpha(5, 2) * ksi * eta + alpha(6, 2) * ksi * zeta + alpha(7, 2) * eta * zeta &
2427 + alpha(8, 2) * ksi * eta * zeta
2428 z0 = alpha(1, 3) + alpha(2, 3) * ksi + alpha(3, 3) * eta + alpha(4, 3) * zeta &
2429 + alpha(5, 3) * ksi * eta + alpha(6, 3) * ksi * zeta + alpha(7, 3) * eta * zeta &
2430 + alpha(8, 3) * ksi * eta * zeta
2434 grad(1) = -2.0_realtype * (xp(1) - x0) * dxdksi &
2435 - 2.0_realtype * (xp(2) - y0) * dydksi &
2436 - 2.0_realtype * (xp(3) - z0) * dzdksi
2437 grad(2) = -2.0_realtype * (xp(1) - x0) * dxdeta &
2438 - 2.0_realtype * (xp(2) - y0) * dydeta &
2439 - 2.0_realtype * (xp(3) - z0) * dzdeta
2440 grad(3) = -2.0_realtype * (xp(1) - x0) * dxdzeta &
2441 - 2.0_realtype * (xp(2) - y0) * dydzeta &
2442 - 2.0_realtype * (xp(3) - z0) * dzdzeta
subroutine gradd2hexa(xP, x1, x2, x3, x4, x5, x6, x7, x8, chi, x0, y0, z0, grad, iErr)
subroutine hessd2hexa(xP, x1, x2, x3, x4, x5, x6, x7, x8, chi, hess, iErr)
subroutine containmenttreesearch(ADT, coor, intInfo, uvw, arrDonor, nCoor, nInterpol)
subroutine intersectiontreesearchsinglepoint(ADT, coor, intInfo, BB, frontLeaves, frontLeavesNew)
subroutine mindistancetreesearch(ADT, coor, intInfo, uvw, arrDonor, nCoor, nInterpol)
subroutine containmenttreesearchsinglepoint(ADT, coor, intInfo, uvw, arrDonor, nInterpol, BB, frontLeaves, frontLeavesNew, failed)
subroutine newtonstep(hess, grad, step, iErr)
subroutine mindistancetreesearchsinglepoint(ADT, coor, intInfo, uvw, arrDonor, nInterpol, BB, frontLeaves, frontLeavesNew)
subroutine mind2hexa(xP, x1, x2, x3, x4, x5, x6, x7, x8, d2, chi, iErr)
subroutine qsortbboxtargets(arr, nn, ADT)
subroutine reallocbboxtargettypeplus(arr, nSize, nInc, ADT)
subroutine reallocplus(arr, nSize, nInc, ADT)
integer(kind=inttype) nstack
integer(kind=inttype), dimension(:), pointer stack
subroutine adtterminate(ADT, routineName, errorMessage)
real(kind=realtype), parameter zero
integer(kind=adtelementtype), parameter adttetrahedron
integer(kind=adtelementtype), parameter adtprism
integer(kind=adtelementtype), parameter adthexahedron
real(kind=realtype), parameter one
integer(kind=adtelementtype), parameter adttriangle
real(kind=realtype), parameter half
integer(kind=adtelementtype), parameter adtquadrilateral
real(kind=realtype), parameter fourth
integer(kind=adtelementtype), parameter adtpyramid
integer, parameter realtype