1 # 1 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/external/tools_stripack.fypp"
2 # 1 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/external/../instrumentation.fypp" 1
3 # 1 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/external/../subr_list.fypp" 1
12 # 726 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/external/../subr_list.fypp"
13 # 2 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/external/../instrumentation.fypp" 2
22 # 112 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/external/../instrumentation.fypp"
23 # 2 "/Users/miesch/JEDI/code/working_copy/public/fv3-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
441 integer,
intent(in) :: kk
442 integer,
intent(in) :: n0
443 integer,
intent(inout) :: list(*)
444 integer,
intent(inout) :: lptr(*)
445 integer,
intent(inout) :: lend(*)
446 integer,
intent(inout) :: lnew
449 integer :: k,lp,lsav,next,nst
465 call insert(k,lp,list,lptr,lnew)
498 real(kind_real),
intent(in) :: x1
499 real(kind_real),
intent(in) :: y1
500 real(kind_real),
intent(in) :: z1
501 real(kind_real),
intent(in) :: x2
502 real(kind_real),
intent(in) :: y2
503 real(kind_real),
intent(in) :: z2
504 real(kind_real),
intent(in) :: x0
505 real(kind_real),
intent(in) :: y0
506 real(kind_real),
intent(in) :: z0
507 real(kind_real),
intent(out) :: output
510 real(kind_real) :: t1,t2,t3
519 t1 = x0*(y1*z2-y2*z1)
520 t2 = y0*(x1*z2-x2*z1)
521 t3 = z0*(x1*y2-x2*y1)
543 integer,
intent(in) :: k
544 integer,
intent(in) :: lp
545 integer,
intent(inout) :: list(*)
546 integer,
intent(inout) :: lptr(*)
547 integer,
intent(inout) :: lnew
578 integer,
intent(in) :: kk
579 integer,
intent(in) :: i1
580 integer,
intent(in) :: i2
581 integer,
intent(in) :: i3
582 integer,
intent(inout) :: list(*)
583 integer,
intent(inout) :: lptr(*)
584 integer,
intent(inout) :: lend(*)
585 integer,
intent(inout) :: lnew
588 integer :: k,lp,n1,n2,n3
603 call lstptr(lend(n1),n2,list,lptr,lp)
604 call insert(k,lp,list,lptr,lnew)
605 call lstptr(lend(n2),n3,list,lptr,lp)
606 call insert(k,lp,list,lptr,lnew)
607 call lstptr(lend(n3),n1,list,lptr,lp)
608 call insert(k,lp,list,lptr,lnew)
615 lptr(lnew+1) = lnew+2
634 integer,
intent(in) :: n
635 integer,
intent(inout) :: ix
636 integer,
intent(inout) :: iy
637 integer,
intent(inout) :: iz
638 integer,
intent(out) :: output
641 real(kind_real) :: u,x
650 ix = mod(171*ix,30269)
651 iy = mod(172*iy,30307)
652 iz = mod(170*iz,30323)
655 x = (real(ix,kind_real)/30269.0_kind_real) &
656 & + (real(iy,kind_real)/30307.0_kind_real) &
657 & + (real(iz,kind_real)/30323.0_kind_real)
663 output = int(real(n,kind_real)*u)+1
679 real(kind_real),
intent(in) :: x1
680 real(kind_real),
intent(in) :: y1
681 real(kind_real),
intent(in) :: z1
682 real(kind_real),
intent(in) :: x2
683 real(kind_real),
intent(in) :: y2
684 real(kind_real),
intent(in) :: z2
685 real(kind_real),
intent(in) :: x0
686 real(kind_real),
intent(in) :: y0
687 real(kind_real),
intent(in) :: z0
688 logical,
intent(out) :: output
691 real(kind_real) :: zz
700 call det(x1,y1,z1,x2,y2,z2,x0,y0,z0,zz)
717 integer,
intent(in) :: lpl
718 integer,
intent(in) :: nb
719 integer,
intent(in) :: list(*)
720 integer,
intent(in) :: lptr(*)
721 integer,
intent(out) :: output
757 integer,
intent(in) :: in1
758 integer,
intent(in) :: in2
759 integer,
intent(in) :: io1
760 integer,
intent(in) :: io2
761 integer,
intent(inout) :: list(*)
762 integer,
intent(inout) :: lptr(*)
763 integer,
intent(inout) :: lend(*)
764 integer,
intent(out) :: lp21
767 integer :: lp,lph,lpsav
776 call lstptr(lend(in1),in2,list,lptr,lp)
777 if (abs(list(lp))==in2)
then
784 call lstptr(lend(io1),in2,list,lptr,lp)
789 if (lend(io1)==lph) lend(io1) = lp
792 call lstptr(lend(in1),io1,list,lptr,lp)
799 call lstptr(lend(io2),in1,list,lptr,lp)
804 if (lend(io2)==lph) lend(io2) = lp
807 call lstptr(lend(in2),io2,list,lptr,lp)
827 integer,
intent(in) :: n1
828 integer,
intent(in) :: n2
829 integer,
intent(in) :: n3
830 integer,
intent(in) :: n4
831 real(kind_real),
intent(in) :: x(*)
832 real(kind_real),
intent(in) :: y(*)
833 real(kind_real),
intent(in) :: z(*)
834 logical,
intent(out) :: output
837 real(kind_real) :: dx1,dx2,dx3,dy1,dy2,dy3,dz1,dz2,dz3,x4,y4,z4,zz
860 call det(dx2,dy2,dz2,dx1,dy1,dz1,dx3,dy3,dz3,zz)
872 subroutine stripack_trfind(nst,p,n,x,y,z,list,lptr,lend,b1,b2,b3,i1,i2,i3)
876 integer,
intent(in) :: nst
877 real(kind_real) :: p(3)
878 integer,
intent(in) :: n
879 real(kind_real),
intent(in) :: x(n)
880 real(kind_real),
intent(in) :: y(n)
881 real(kind_real),
intent(in) :: z(n)
882 integer,
intent(in) :: list(*)
883 integer,
intent(in) :: lptr(*)
884 integer,
intent(in) :: lend(*)
885 real(kind_real),
intent(out) :: b1
886 real(kind_real),
intent(out) :: b2
887 real(kind_real),
intent(out) :: b3
888 integer,
intent(out) :: i1
889 integer,
intent(out) :: i2
890 integer,
intent(out) :: i3
893 integer :: lp,n0,n1,n1s,n2,n2s,n3,n4,next,nf,nl
894 integer,
save :: ix = 1,iy = 2,iz = 3
895 real(kind_real) :: output,eps,ptn1,ptn2,q(3),s12,tol,xp,yp,zp
908 if ((n0<1).or.(n<n0))
call jrand(n,ix,iy,iz,n0)
926 call det(x(n0),y(n0),z(n0),x(n1),y(n1),z(n1),xp,yp,zp,output)
930 if (n1 == nl)
go to 6
938 call det(x(n0),y(n0),z(n0),x(nf),y(nf),z(nf),xp,yp,zp,output)
946 call det(x(nl),y(nl),z(nl),x(n0),y(n0),z(n0),xp,yp,zp,output)
958 call det(x(n0),y(n0),z(n0),x(n2),y(n2),z(n2),xp,yp,zp,output)
962 call det(x(n0),y(n0),z(n0),x(nf),y(nf),z(nf),xp,yp,zp,output)
966 if (
inf(abs(x(n0)*xp+y(n0)*yp+z(n0)*zp),
one-
four*eps))
then
969 call det(x(n1),y(n1),z(n1),x(n0),y(n0),z(n0),xp,yp,zp,output)
999 call det(x(n1),y(n1),z(n1),x(n2),y(n2),z(n2),xp,yp,zp,b3)
1002 call lstptr(lend(n2),n1,list,lptr,lp)
1003 if (list(lp)<0)
go to 9
1008 call det(x(n0),y(n0),z(n0),x(n4),y(n4),z(n4),xp,yp,zp,output)
1013 if ((n2/=n2s).and.(n2/=n0))
go to 8
1018 if ((n1/=n1s).and.(n1/=n0))
go to 8
1022 call jrand(n,ix,iy,iz,n0)
1027 if (
supeq(b3,eps))
then
1029 call det(x(n2),y(n2),z(n2),x(n3),y(n3),z(n3),xp,yp,zp,b1)
1030 call det(x(n3),y(n3),z(n3),x(n1),y(n1),z(n1),xp,yp,zp,b2)
1033 if (
inf(b1,-tol).or.
inf(b2,-tol))
then
1034 call jrand(n,ix,iy,iz,n0)
1040 s12 = x(n1)*x(n2)+y(n1)*y(n2)+z(n1)*z(n2)
1041 ptn1 = xp*x(n1)+yp*y(n1)+zp*z(n1)
1042 ptn2 = xp*x(n2)+yp*y(n2)+zp*z(n2)
1047 if (
inf(b1,-tol).or.
inf(b2,-tol))
then
1048 call jrand(n,ix,iy,iz,n0)
1073 call det(x(n2),y(n2),z(n2),x(next),y(next),z(next),xp,yp,zp,output)
1076 s12 = x(n1)*x(n2)+y(n1)*y(n2)+z(n1)*z(n2)
1077 q(1) = x(n1)-s12*x(n2)
1078 q(2) = y(n1)-s12*y(n2)
1079 q(3) = z(n1)-s12*z(n2)
1080 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
1089 if (n2/=n1s)
go to 10
1110 call det(x(next),y(next),z(next),x(n1),y(n1),z(n1),xp,yp,zp,output)
1113 s12 = x(n1)*x(n2)+y(n1)*y(n2)+z(n1)*z(n2)
1114 q(1) = x(n2)-s12*x(n1)
1115 q(2) = y(n2)-s12*y(n1)
1116 q(3) = z(n2)-s12*z(n1)
1117 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
1126 if (n1/=n1s)
go to 12
1154 subroutine stripack_trmesh(mpl,n,x,y,z,list,lptr,lend,lnew,near,next,dist)
1158 type(
mpl_type),
intent(inout) :: mpl
1159 integer,
intent(in) :: n
1160 real(kind_real),
intent(in) :: x(n)
1161 real(kind_real),
intent(in) :: y(n)
1162 real(kind_real),
intent(in) :: z(n)
1163 integer,
intent(out) :: list(6*(n-2))
1164 integer,
intent(out) :: lptr(6*(n-2))
1165 integer,
intent(out) :: lend(n)
1166 integer,
intent(out) :: lnew
1167 integer,
intent(inout) :: near(n)
1168 integer,
intent(inout) :: next(n)
1169 real(kind_real),
intent(inout) :: dist(n)
1172 integer :: i,i0,j,k,lp,lpl,nexti,nn
1173 real(kind_real) :: d,d1,d2,d3
1174 logical :: output_1,output_2
1184 if (nn<3)
call mpl%abort(
'stripack_trmesh',
'N < 3')
1190 call left(x(1),y(1),z(1),x(2),y(2),z(2),x(3),y(3),z(3),output_1)
1191 call left(x(2),y(2),z(2),x(1),y(1),z(1),x(3),y(3),z(3),output_2)
1193 if (.not.output_1)
then
1212 else if (.not.output_2)
then
1233 call mpl%abort(
'stripack_trmesh',
'The first three nodes are colinear')
1250 d1 = -(x(k)*x(1)+y(k)*y(1)+z(k)*z(1))
1251 d2 = -(x(k)*x(2)+y(k)*y(2)+z(k)*z(2))
1252 d3 = -(x(k)*x(3)+y(k)*y(3)+z(k)*z(3))
1253 if (
inf(d1,d2).and.
inf(d1,d3))
then
1258 else if (
inf(d2,d1).and.
inf(d2,d3))
then
1273 call addnod(mpl,near(k),k,x,y,z,list,lptr,lend,lnew)
1278 if (near(i)==k)
then
1305 d =-(x(i)*x(k)+y(i)*y(k)+z(i)*z(k))
1306 if (
inf(d,dist(i)))
then
1310 if (i==near(j))
then
1324 if (lp/=lpl)
go to 3
Generic ranks, dimensions and types.