1 # 1 "/Users/miesch/JEDI/code/working_copy/internal/mpas-bundle/saber/src/saber/external/tools_stripack.fypp"
2 # 1 "/Users/miesch/JEDI/code/working_copy/internal/mpas-bundle/saber/src/saber/external/../instrumentation.fypp" 1
3 # 1 "/Users/miesch/JEDI/code/working_copy/internal/mpas-bundle/saber/src/saber/external/../subr_list.fypp" 1
12 # 926 "/Users/miesch/JEDI/code/working_copy/internal/mpas-bundle/saber/src/saber/external/../subr_list.fypp"
13 # 2 "/Users/miesch/JEDI/code/working_copy/internal/mpas-bundle/saber/src/saber/external/../instrumentation.fypp" 2
22 # 112 "/Users/miesch/JEDI/code/working_copy/internal/mpas-bundle/saber/src/saber/external/../instrumentation.fypp"
23 # 2 "/Users/miesch/JEDI/code/working_copy/internal/mpas-bundle/saber/src/saber/external/tools_stripack.fypp" 2
105 integer,
intent(in) :: nst
106 integer,
intent(in) :: k
107 real(kind_real),
intent(in) :: x(k)
108 real(kind_real),
intent(in) :: y(k)
109 real(kind_real),
intent(in) :: z(k)
110 integer,
intent(inout) :: list(*)
111 integer,
intent(inout) :: lptr(*)
112 integer,
intent(inout) :: lend(k)
113 integer,
intent(inout) :: lnew
116 integer :: i1,i2,i3,in1,io1,io2,ist,kk,km1,l,lp,lpf,lpo1,lpo1s
117 real(kind_real) :: b1,b2,b3,p(3)
128 if (kk<4)
call mpl%abort(
'stripack_addnod',
'K<4')
137 call trfind(ist,p,km1,x,y,z,list,lptr,lend,b1,b2,b3,i1,i2,i3)
140 if (i1==0)
call mpl%abort(
'stripack_addnod',
'colinear points')
143 if (
eq(p(1),x(l)).and.
eq(p(2),y(l)).and.
eq(p(3),z(l)))
call mpl%abort(
'stripack_addnod',
'colinear or duplicate nodes')
145 if (
eq(p(1),x(l)).and.
eq(p(2),y(l)).and.
eq(p(3),z(l)))
call mpl%abort(
'stripack_addnod',
'colinear or duplicate nodes')
147 if (
eq(p(1),x(l)).and.
eq(p(2),y(l)).and.
eq(p(3),z(l)))
call mpl%abort(
'stripack_addnod',
'colinear or duplicate nodes')
148 call intadd(kk,i1,i2,i3,list,lptr,lend,lnew)
151 call bdyadd(kk,i1,i2,list,lptr,lend,lnew)
153 call covsph(kk,i1,list,lptr,lend,lnew)
162 io1 = abs(list(lpo1))
166 call lstptr(lend(io1),io2,list,lptr,lp)
167 if (0<=list(lp))
then
173 call swptst(in1,kk,io1,io2,x,y,z,output)
174 if (.not.output)
then
175 if ((lpo1==lpf).or.(list(lpo1)<0))
exit
178 io1 = abs(list(lpo1))
181 call swap(in1,kk,io1,io2,list,lptr,lend,lpo1)
192 if ((lpo1==lpf).or.(list(lpo1)<0))
exit
195 io1 = abs(list(lpo1))
212 real(kind_real),
intent(in) :: v1(3)
213 real(kind_real),
intent(in) :: v2(3)
214 real(kind_real),
intent(in) :: v3(3)
215 real(kind_real),
intent(out) :: area
218 real(kind_real) :: a1,a2,a3,ca1,ca2,ca3,s12,s23,s31
219 real(kind_real) :: dv1(3),dv2(3),dv3(3),u12(3),u23(3),u31(3)
233 u12(1) = dv1(2)*dv2(3)-dv1(3)*dv2(2)
234 u12(2) = dv1(3)*dv2(1)-dv1(1)*dv2(3)
235 u12(3) = dv1(1)*dv2(2)-dv1(2)*dv2(1)
236 u23(1) = dv2(2)*dv3(3)-dv2(3)*dv3(2)
237 u23(2) = dv2(3)*dv3(1)-dv2(1)*dv3(3)
238 u23(3) = dv2(1)*dv3(2)-dv2(2)*dv3(1)
239 u31(1) = dv3(2)*dv1(3)-dv3(3)*dv1(2)
240 u31(2) = dv3(3)*dv1(1)-dv3(1)*dv1(3)
241 u31(3) = dv3(1)*dv1(2)-dv3(2)*dv1(1)
244 s12 = dot_product(u12,u12)
245 s23 = dot_product(u23,u23)
246 s31 = dot_product(u31,u31)
249 if ((.not.(abs(s12)>
zero)).or.(.not.(abs(s23)>
zero)).or.(.not.(abs(s31)>
zero)))
then
260 ca1 = -dot_product(u12,u31)
261 ca2 = -dot_product(u23,u12)
262 ca3 = -dot_product(u31,u23)
293 integer,
intent(in) :: kk
294 integer,
intent(in) :: i1
295 integer,
intent(in) :: i2
296 integer,
intent(inout) :: list(*)
297 integer,
intent(inout) :: lptr(*)
298 integer,
intent(inout) :: lend(*)
299 integer,
intent(inout) :: lnew
302 integer :: k,lp,lsav,n1,n2,next,nsav
330 call insert(k,lp,list,lptr,lnew)
369 integer,
intent(in) :: n
370 integer,
intent(in) :: list(6*(n-2))
371 integer,
intent(in) :: lptr(6*(n-2))
372 integer,
intent(in) :: lend(n)
373 integer,
intent(out) :: nodes(n)
374 integer,
intent(out) :: nb
377 integer :: i,k,lp,n0,na,nn,nst,nt
444 integer,
intent(in) :: kk
445 integer,
intent(in) :: n0
446 integer,
intent(inout) :: list(*)
447 integer,
intent(inout) :: lptr(*)
448 integer,
intent(inout) :: lend(*)
449 integer,
intent(inout) :: lnew
452 integer :: k,lp,lsav,next,nst
468 call insert(k,lp,list,lptr,lnew)
501 real(kind_real),
intent(in) :: x1
502 real(kind_real),
intent(in) :: y1
503 real(kind_real),
intent(in) :: z1
504 real(kind_real),
intent(in) :: x2
505 real(kind_real),
intent(in) :: y2
506 real(kind_real),
intent(in) :: z2
507 real(kind_real),
intent(in) :: x0
508 real(kind_real),
intent(in) :: y0
509 real(kind_real),
intent(in) :: z0
510 real(kind_real),
intent(out) :: output
513 real(kind_real) :: t1,t2,t3
522 t1 = x0*(y1*z2-y2*z1)
523 t2 = y0*(x1*z2-x2*z1)
524 t3 = z0*(x1*y2-x2*y1)
546 integer,
intent(in) :: k
547 integer,
intent(in) :: lp
548 integer,
intent(inout) :: list(*)
549 integer,
intent(inout) :: lptr(*)
550 integer,
intent(inout) :: lnew
581 integer,
intent(in) :: kk
582 integer,
intent(in) :: i1
583 integer,
intent(in) :: i2
584 integer,
intent(in) :: i3
585 integer,
intent(inout) :: list(*)
586 integer,
intent(inout) :: lptr(*)
587 integer,
intent(inout) :: lend(*)
588 integer,
intent(inout) :: lnew
591 integer :: k,lp,n1,n2,n3
606 call lstptr(lend(n1),n2,list,lptr,lp)
607 call insert(k,lp,list,lptr,lnew)
608 call lstptr(lend(n2),n3,list,lptr,lp)
609 call insert(k,lp,list,lptr,lnew)
610 call lstptr(lend(n3),n1,list,lptr,lp)
611 call insert(k,lp,list,lptr,lnew)
618 lptr(lnew+1) = lnew+2
637 integer,
intent(in) :: n
638 integer,
intent(inout) :: ix
639 integer,
intent(inout) :: iy
640 integer,
intent(inout) :: iz
641 integer,
intent(out) :: output
644 real(kind_real) :: u,x
653 ix = mod(171*ix,30269)
654 iy = mod(172*iy,30307)
655 iz = mod(170*iz,30323)
658 x = (real(ix,kind_real)/30269.0_kind_real) &
659 & + (real(iy,kind_real)/30307.0_kind_real) &
660 & + (real(iz,kind_real)/30323.0_kind_real)
666 output = int(real(n,kind_real)*u)+1
682 real(kind_real),
intent(in) :: x1
683 real(kind_real),
intent(in) :: y1
684 real(kind_real),
intent(in) :: z1
685 real(kind_real),
intent(in) :: x2
686 real(kind_real),
intent(in) :: y2
687 real(kind_real),
intent(in) :: z2
688 real(kind_real),
intent(in) :: x0
689 real(kind_real),
intent(in) :: y0
690 real(kind_real),
intent(in) :: z0
691 logical,
intent(out) :: output
694 real(kind_real) :: zz
703 call det(x1,y1,z1,x2,y2,z2,x0,y0,z0,zz)
720 integer,
intent(in) :: lpl
721 integer,
intent(in) :: nb
722 integer,
intent(in) :: list(*)
723 integer,
intent(in) :: lptr(*)
724 integer,
intent(out) :: output
760 integer,
intent(in) :: in1
761 integer,
intent(in) :: in2
762 integer,
intent(in) :: io1
763 integer,
intent(in) :: io2
764 integer,
intent(inout) :: list(*)
765 integer,
intent(inout) :: lptr(*)
766 integer,
intent(inout) :: lend(*)
767 integer,
intent(out) :: lp21
770 integer :: lp,lph,lpsav
779 call lstptr(lend(in1),in2,list,lptr,lp)
780 if (abs(list(lp))==in2)
then
787 call lstptr(lend(io1),in2,list,lptr,lp)
792 if (lend(io1)==lph) lend(io1) = lp
795 call lstptr(lend(in1),io1,list,lptr,lp)
802 call lstptr(lend(io2),in1,list,lptr,lp)
807 if (lend(io2)==lph) lend(io2) = lp
810 call lstptr(lend(in2),io2,list,lptr,lp)
830 integer,
intent(in) :: n1
831 integer,
intent(in) :: n2
832 integer,
intent(in) :: n3
833 integer,
intent(in) :: n4
834 real(kind_real),
intent(in) :: x(*)
835 real(kind_real),
intent(in) :: y(*)
836 real(kind_real),
intent(in) :: z(*)
837 logical,
intent(out) :: output
840 real(kind_real) :: dx1,dx2,dx3,dy1,dy2,dy3,dz1,dz2,dz3,x4,y4,z4,zz
863 call det(dx2,dy2,dz2,dx1,dy1,dz1,dx3,dy3,dz3,zz)
875 subroutine stripack_trfind(nst,p,n,x,y,z,list,lptr,lend,b1,b2,b3,i1,i2,i3)
879 integer,
intent(in) :: nst
880 real(kind_real) :: p(3)
881 integer,
intent(in) :: n
882 real(kind_real),
intent(in) :: x(n)
883 real(kind_real),
intent(in) :: y(n)
884 real(kind_real),
intent(in) :: z(n)
885 integer,
intent(in) :: list(*)
886 integer,
intent(in) :: lptr(*)
887 integer,
intent(in) :: lend(*)
888 real(kind_real),
intent(out) :: b1
889 real(kind_real),
intent(out) :: b2
890 real(kind_real),
intent(out) :: b3
891 integer,
intent(out) :: i1
892 integer,
intent(out) :: i2
893 integer,
intent(out) :: i3
896 integer :: lp,n0,n1,n1s,n2,n2s,n3,n4,next,nf,nl
897 integer,
save :: ix = 1,iy = 2,iz = 3
898 real(kind_real) :: output,eps,ptn1,ptn2,q(3),s12,tol,xp,yp,zp
911 if ((n0<1).or.(n<n0))
call jrand(n,ix,iy,iz,n0)
929 call det(x(n0),y(n0),z(n0),x(n1),y(n1),z(n1),xp,yp,zp,output)
933 if (n1 == nl)
go to 6
941 call det(x(n0),y(n0),z(n0),x(nf),y(nf),z(nf),xp,yp,zp,output)
949 call det(x(nl),y(nl),z(nl),x(n0),y(n0),z(n0),xp,yp,zp,output)
961 call det(x(n0),y(n0),z(n0),x(n2),y(n2),z(n2),xp,yp,zp,output)
965 call det(x(n0),y(n0),z(n0),x(nf),y(nf),z(nf),xp,yp,zp,output)
969 if (
inf(abs(x(n0)*xp+y(n0)*yp+z(n0)*zp),
one-
four*eps))
then
972 call det(x(n1),y(n1),z(n1),x(n0),y(n0),z(n0),xp,yp,zp,output)
1002 call det(x(n1),y(n1),z(n1),x(n2),y(n2),z(n2),xp,yp,zp,b3)
1005 call lstptr(lend(n2),n1,list,lptr,lp)
1006 if (list(lp)<0)
go to 9
1011 call det(x(n0),y(n0),z(n0),x(n4),y(n4),z(n4),xp,yp,zp,output)
1016 if ((n2/=n2s).and.(n2/=n0))
go to 8
1021 if ((n1/=n1s).and.(n1/=n0))
go to 8
1025 call jrand(n,ix,iy,iz,n0)
1030 if (
supeq(b3,eps))
then
1032 call det(x(n2),y(n2),z(n2),x(n3),y(n3),z(n3),xp,yp,zp,b1)
1033 call det(x(n3),y(n3),z(n3),x(n1),y(n1),z(n1),xp,yp,zp,b2)
1036 if (
inf(b1,-tol).or.
inf(b2,-tol))
then
1037 call jrand(n,ix,iy,iz,n0)
1043 s12 = x(n1)*x(n2)+y(n1)*y(n2)+z(n1)*z(n2)
1044 ptn1 = xp*x(n1)+yp*y(n1)+zp*z(n1)
1045 ptn2 = xp*x(n2)+yp*y(n2)+zp*z(n2)
1050 if (
inf(b1,-tol).or.
inf(b2,-tol))
then
1051 call jrand(n,ix,iy,iz,n0)
1076 call det(x(n2),y(n2),z(n2),x(next),y(next),z(next),xp,yp,zp,output)
1079 s12 = x(n1)*x(n2)+y(n1)*y(n2)+z(n1)*z(n2)
1080 q(1) = x(n1)-s12*x(n2)
1081 q(2) = y(n1)-s12*y(n2)
1082 q(3) = z(n1)-s12*z(n2)
1083 if (
sup(xp*q(1)+yp*q(2)+zp*q(3),
zero).or.
sup(x(next)*q(1)+y(next)*q(2)+z(next)*q(3),
zero))
go to 11
1092 if (n2/=n1s)
go to 10
1113 call det(x(next),y(next),z(next),x(n1),y(n1),z(n1),xp,yp,zp,output)
1116 s12 = x(n1)*x(n2)+y(n1)*y(n2)+z(n1)*z(n2)
1117 q(1) = x(n2)-s12*x(n1)
1118 q(2) = y(n2)-s12*y(n1)
1119 q(3) = z(n2)-s12*z(n1)
1120 if (
sup(xp*q(1)+yp*q(2)+zp*q(3),
zero).or.
sup(x(next)*q(1)+y(next)*q(2)+z(next)*q(3),
zero))
go to 13
1129 if (n1/=n1s)
go to 12
1157 subroutine stripack_trmesh(mpl,n,x,y,z,list,lptr,lend,lnew,near,next,dist)
1161 type(
mpl_type),
intent(inout) :: mpl
1162 integer,
intent(in) :: n
1163 real(kind_real),
intent(in) :: x(n)
1164 real(kind_real),
intent(in) :: y(n)
1165 real(kind_real),
intent(in) :: z(n)
1166 integer,
intent(out) :: list(6*(n-2))
1167 integer,
intent(out) :: lptr(6*(n-2))
1168 integer,
intent(out) :: lend(n)
1169 integer,
intent(out) :: lnew
1170 integer,
intent(inout) :: near(n)
1171 integer,
intent(inout) :: next(n)
1172 real(kind_real),
intent(inout) :: dist(n)
1175 integer :: i,i0,j,k,lp,lpl,nexti,nn
1176 real(kind_real) :: d,d1,d2,d3
1177 logical :: output_1,output_2
1187 if (nn<3)
call mpl%abort(
'stripack_trmesh',
'N < 3')
1193 call left(x(1),y(1),z(1),x(2),y(2),z(2),x(3),y(3),z(3),output_1)
1194 call left(x(2),y(2),z(2),x(1),y(1),z(1),x(3),y(3),z(3),output_2)
1196 if (.not.output_1)
then
1215 else if (.not.output_2)
then
1236 call mpl%abort(
'stripack_trmesh',
'The first three nodes are colinear')
1253 d1 = -(x(k)*x(1)+y(k)*y(1)+z(k)*z(1))
1254 d2 = -(x(k)*x(2)+y(k)*y(2)+z(k)*z(2))
1255 d3 = -(x(k)*x(3)+y(k)*y(3)+z(k)*z(3))
1256 if (
inf(d1,d2).and.
inf(d1,d3))
then
1261 else if (
inf(d2,d1).and.
inf(d2,d3))
then
1276 call addnod(mpl,near(k),k,x,y,z,list,lptr,lend,lnew)
1281 if (near(i)==k)
then
1308 d =-(x(i)*x(k)+y(i)*y(k)+z(i)*z(k))
1309 if (
inf(d,dist(i)))
then
1313 if (i==near(j))
then
1327 if (lp/=lpl)
go to 3
Generic ranks, dimensions and types.