1 SUBROUTINE smpint( ND, NF, MINCLS, MAXCLS, FUNSUB,
2 & EPSABS, EPSREL, KEY, SBRGNS, WRKLEN, VRTWRK,
3 & RESTAR, VALUE, ERROR, FUNCLS, INFORM )
140 INTEGER ND, NF, MINCLS, MAXCLS, SBRGNS
141 INTEGER KEY, WRKLEN, RESTAR, FUNCLS, INFORM
142 DOUBLE PRECISION EPSABS, EPSREL
143 DOUBLE PRECISION VALUE(NF), ERROR(NF), VRTWRK(WRKLEN)
150 INTEGER MAXSUB, RULCLS, I1, I2, I3, I4, I5, I6
157 CALL smpchc( nd, nf, mincls, maxcls, epsabs, epsrel, sbrgns,
158 & key, wrklen, restar, rulcls, maxsub, inform )
159 IF ( inform .EQ. 0 )
THEN
163 i1 = 1 + maxsub*nd*(nd+1)
169 CALL smpsad( nd, nf, funsub, mincls, maxcls, epsabs, epsrel,
170 & restar, key, rulcls, maxsub, sbrgns, vrtwrk,
171 & vrtwrk(i1), vrtwrk(i2), vrtwrk(i3), vrtwrk(i4),
172 & vrtwrk(i5), vrtwrk(i6),
VALUE, error, funcls, inform )
180 SUBROUTINE smpchc( ND, NF, MINCLS, MAXCLS, EPSABS, EPSREL, SBRGNS,
181 & KEY, WRKLEN, RESTAR, RULCLS, MAXSUB, INFORM )
259 INTEGER ND, NF, MINCLS, MAXCLS, KEY, MAXSUB
260 INTEGER WRKLEN, INFORM, RESTAR, RULCLS, SBRGNS
261 DOUBLE PRECISION EPSABS, EPSREL
265 INTEGER WRKDIF, DIFCLS
273 IF ( key .LT. 0 .OR. key .GT. 4 ) inform = 2
277 IF ( nd .LT. 2 ) inform = 3
281 IF ( nf .LT. 1 ) inform = 4
285 IF ( epsabs .LT. 0 .AND. epsrel .LT. 0 ) inform = 5
289 wrkdif = (nd+1)*(nd+2) + 7*nf
290 maxsub = ( wrklen - wrkdif )/( (nd+1)*nd + 2*nf + 3 )
291 IF ( maxsub .LE. sbrgns ) inform = 6
295 IF ( restar .NE. 0 .AND. restar .NE. 1 ) inform = 7
299 IF ( sbrgns .LE. 0 ) inform = 8
303 IF ( inform .EQ. 0 )
THEN
304 difcls = 1 + 2*nd*( nd + 1 )
305 IF (key .EQ. 0) rulcls = (nd+4)*(nd+3)*(nd+2)/6 + (nd+2)*(nd+1)
306 IF (key .EQ. 1) rulcls = 2*nd + 3
307 IF (key .EQ. 2) rulcls = (nd+3)*(nd+2)/2 + 2*(nd+1)
308 IF (key .EQ. 3) rulcls = (nd+4)*(nd+3)*(nd+2)/6 + (nd+2)*(nd+1)
309 IF (key .EQ. 4) rulcls = (nd+5)*(nd+4)*(nd+3)*(nd+2)/24
310 & + 5*(nd+2)*(nd+1)/2
311 IF ( restar.EQ.0 .AND. maxcls.LT.max(sbrgns*rulcls,mincls) .OR.
312 & restar.EQ.1 .AND. maxcls.LT.max(4*rulcls+difcls,mincls) )
320 SUBROUTINE smpsad( ND, NF, FUNSUB, MINCLS, MAXCLS, EPSABS, EPSREL,
321 & RESTAR, KEY, RULCLS, MAXSUB, SBRGNS, VERTCS, VALUES, ERRORS,
322 & VOLUMS, GREATS, PONTRS, WORK, VALUE, ERROR, FUNCLS, INFORM )
428 INTEGER ND, NF, RULCLS, MINCLS, MAXCLS, MAXSUB, KEY, RESTAR
429 INTEGER FUNCLS, SBRGNS, INFORM
430 DOUBLE PRECISION EPSABS, EPSREL,
VALUE(NF), ERROR(NF)
431 DOUBLE PRECISION VALUES(NF,*), ERRORS(NF,*), VERTCS(ND,0:ND,*)
432 DOUBLE PRECISION VOLUMS(*), GREATS(*), PONTRS(*), WORK(*)
439 INTEGER I, INDEX, J, TOP, MXNWSB, NEWSBS, DFCOST, RGNCLS
440 PARAMETER ( MXNWSB = 4 )
441 double precision smpvol, tune
442 parameter( tune = 1 )
450 dfcost = 1 + 2*nd*( nd + 1 )
454 IF ( restar .EQ. 0 )
THEN
466 volums(index) = smpvol( nd, vertcs(1,0,index), work )
470 CALL smprul( tune, nd, vertcs(1,0,index), volums(index),
471 & nf, funsub, key, values(1,index), errors(1,index),
472 & greats(index), work, work(2*nd+2) )
478 value(j) = value(j) + values(j,index)
479 error(j) = error(j) + errors(j,index)
481 CALL smpstr( index, index, pontrs, greats )
482 funcls = funcls + rulcls
485 inform = max( 0, min( mincls - funcls, 1 ) )
487 IF( error(j) .GT. max(epsabs,epsrel*abs(value(j))) ) inform = 1
492 DO WHILE ( inform .GT. 0 .AND. sbrgns + mxnwsb - 1 .LE. maxsub
493 & .AND. funcls + dfcost + mxnwsb*rulcls .LE. maxcls )
502 value(j) = value(j) - values(j,top)
503 error(j) = error(j) - errors(j,top)
508 CALL smpdfs( nd, nf, funsub, top, sbrgns, vertcs,
509 & volums, work, work(nd+1), work(2*nd+1),
510 & work(3*nd+1), work(3*nd+1+5*nf), newsbs )
517 CALL smprul( tune, nd, vertcs(1,0,index), volums(index), nf,
518 & funsub, key, values(1,index), errors(1,index),
519 & greats(index), work, work(2*nd+2) )
520 CALL smpstr( index, sbrgns+i-1, pontrs, greats )
522 value(j) = value(j) + values(j,index)
523 error(j) = error(j) + errors(j,index)
527 funcls = funcls + dfcost + newsbs*rulcls
528 sbrgns = sbrgns + newsbs - 1
532 inform = max( 0, min( mincls - funcls, 1 ) )
534 IF( error(j) .GT. max(epsabs,epsrel*abs(value(j))) )
545 value(i) = value(i) + values(i,j)
546 error(i) = error(i) + errors(i,j)
554 DOUBLE PRECISION FUNCTION smpvol( ND, VERTEX, WORK )
588 DOUBLE PRECISION VERTEX(ND,0:ND), WORK(ND,*)
592 INTEGER I, J, K, PIVPOS
593 DOUBLE PRECISION MULT, VOL, WTEMP
612 IF ( abs(work(k,j)) .GT. abs(work(k,pivpos)) ) pivpos = j
616 work(i,k) = work(i,pivpos)
617 work(i,pivpos) = wtemp
619 vol = vol*work(k,k)/k
621 mult = work(k,j)/work(k,k)
623 work(i,j) = work(i,j) - mult*work(i,k)
633 SUBROUTINE smprul( TUNE, ND, VERTEX, VOLUME, NF, INTGND,
634 & INKEY, BASVAL, RGNERR, GREAT, GT, RULE )
694 INTEGER NF, ND, INKEY
695 DOUBLE PRECISION VERTEX(ND,0:ND), BASVAL(NF), RGNERR(NF)
696 DOUBLE PRECISION VOLUME, TUNE, GREAT
708 INTEGER KEY, NUMNUL, RLS, WTS, MXW, MXRLS, MXG
709 PARAMETER( MXW = 21, mxrls = 7, mxg = 4 )
710 DOUBLE PRECISION W( MXW, MXRLS ), G( 0:MXG, MXW ), WTSUM
711 DOUBLE PRECISION GT( 0:2*ND ), RULE( NF, MXRLS )
712 DOUBLE PRECISION NORMCF, NORMNL, NORMCP, ALPHA(MXRLS)
713 DOUBLE PRECISION RATIO, ERRCOF, RATMIN, SMALL, SMPROD
714 parameter( ratmin = 1d-1, small = 1d-12 )
715 INTEGER I, J, K, OLDKEY, OLDN, PTS(MXW)
716 SAVE oldkey, oldn, key, pts, w, g, rls, wts
717 DATA oldkey, oldn/ -1, 0 /
721 IF ( oldkey .NE. inkey .OR. oldn .NE. nd )
THEN
724 IF ( inkey .GT. 0 .AND. inkey .LT. 5 )
THEN
732 CALL smprms( nd, key, mxw, w, mxg, g, wts, rls, pts )
736 normcf = smprod( wts, pts, w(1,1), w(1,1) )
739 alpha(j) = -smprod( wts, pts, w(1,j), w(1,k) )
744 wtsum = wtsum + w(i,j)*alpha(j)
746 w(i,k) = w(i,k) + wtsum/normcf
748 normnl = smprod( wts, pts, w(1,k), w(1,k) )
750 w(i,k) = w(i,k)*sqrt( normcf/normnl )
754 IF ( tune .GE. 0 )
THEN
764 IF ( pts(k) .GT. 0 )
THEN
765 DO i = 0, min(nd,mxg-1)
768 IF ( nd .GE. mxg )
CALL smpcpy( mxg, nd, gt, g(mxg,k) )
769 CALL smpsms( nd,
vertex, nf, intgnd, gt, basval,
773 rule(i,j) = rule(i,j) + w(k,j)*basval(i)
781 errcof = ( 8*tune + ( 1 - tune ) )
784 basval(i) = rule(i,1)
785 normcf = abs( basval(i) )
789 normnl = max( abs( rule(i,k) ), abs( rule(i,k-1) ) )
790 IF ( normnl .GT. small*normcf .AND. k .LT. rls )
791 & ratio = max( normnl/normcp, ratio )
792 rgnerr(i) = max( normnl, rgnerr(i) )
795 IF( ratio .GE. 1 )
THEN
796 rgnerr(i) = tune*rgnerr(i) + ( 1 - tune )*normcp
797 ELSE IF ( key .GT. 1 )
THEN
798 rgnerr(i) = ratio*normcp
800 rgnerr(i) = volume*max( errcof*rgnerr(i), small*normcf )
801 basval(i) = volume*basval(i)
802 great = max( great, rgnerr(i) )
810 DOUBLE PRECISION FUNCTION smprod( N, W, X, Y )
812 DOUBLE PRECISION X(*), Y(*), SUM
815 sum = sum + w(i)*x(i)*y(i)
820 SUBROUTINE smprms( ND, KEY, MXW, W, MXG, G, WTS, RLS, PTS )
878 INTEGER ND, KEY, WTS, MXW, RLS, MXG
880 DOUBLE PRECISION W(MXW,*), G(0:MXG,*)
884 DOUBLE PRECISION ONE, FFTEEN
885 parameter( one = 1, ffteen = 15 )
886 DOUBLE PRECISION DR, DR2, DR4, DR6, DR8
887 DOUBLE PRECISION R1, S1, R2, S2, U1, V1, U2, V2, L1, L2, D1, D2
888 DOUBLE PRECISION A1, A2, A3, P0, P1, P2, P3, U5, U6, U7, SG
889 DOUBLE PRECISION R, A, P, Q, TH, TP
890 INTEGER IW, GMS, I, J
897 IF ( key .EQ. 1 )
THEN
901 ELSE IF ( key .EQ. 2 )
THEN
905 ELSE IF ( key .EQ. 3 .OR. key .EQ. 0 )
THEN
909 ELSE IF ( key .EQ. 4 )
THEN
911 IF ( nd .EQ. 2 )
THEN
932 dr2 = ( dr + 1 )*( dr + 2 )
933 dr4 = dr2*( dr + 3 )*( dr + 4 )
934 dr6 = dr4*( dr + 5 )*( dr + 6 )
935 dr8 = dr6*( dr + 7 )*( dr + 8 )
936 CALL smpcpy( 0, mxg, g(0,1), 1/( dr + 1 ) )
938 r1 = ( dr + 4 - sqrt(ffteen) )/( dr*dr + 8*dr + 1 )
942 CALL smpcpy( 1, mxg, g(0,gms+1), r1 )
948 IF ( key .LT. 4 )
THEN
954 w(gms+1,iw) = 1/( dr + 1 )
960 g(0,2) = 3/( dr + 3 )
961 CALL smpcpy( 1, mxg, g(0,2), 1/( dr + 3 ) )
963 w(2,iw) = ( dr + 3 )**3/( 4*dr2*( dr + 3 ) )
964 IF ( key .GT. 1 )
THEN
969 IF ( nd .EQ. 2 )
THEN
973 l2 = .62054648267200632589046034361711d0
974 l1 = -sqrt( one/2 - l2**2 )
978 CALL smpcpy( 1, mxg, g(0,gms+1), r1 )
984 CALL smpcpy( 1, mxg, g(0,gms+2), r2 )
991 r2 = ( dr + 4 + sqrt(ffteen) )/( dr*dr + 8*dr + 1 )
995 CALL smpcpy( 1, mxg, g(0,gms+2), r2 )
997 w(gms+2,iw) = ( 2/(dr+3) - l1 )/( dr2*(l2-l1)*l2**2 )
998 w(gms+1,iw) = ( 2/(dr+3) - l2 )/( dr2*(l1-l2)*l1**2 )
1004 g(0,3) = 5/( dr + 5 )
1005 CALL smpcpy( 1, mxg, g(0,3), 1/( dr + 5 ) )
1007 g(0,4) = 3/( dr + 5 )
1008 g(1,4) = 3/( dr + 5 )
1009 CALL smpcpy( 2, mxg, g(0,4), 1/( dr + 5 ) )
1010 pts(4) = ( ( dr + 1 )*dr )/2
1011 w(2,iw) = -( dr + 3 )**5/( 16*dr4 )
1012 w(3,iw) = ( dr + 5 )**5/( 16*dr4*( dr + 5 ) )
1013 w(4,iw) = ( dr + 5 )**5/( 16*dr4*( dr + 5 ) )
1015 IF ( key .GT. 2 )
THEN
1023 u1 = ( dr + 7 + 2*sqrt(ffteen) )/( dr*dr + 14*dr - 11 )
1024 v1 = ( 1 - ( dr - 1 )*u1 )/2
1028 CALL smpcpy( 2, mxg, g(0,gms+3), u1 )
1029 pts(gms+3) = ( ( dr + 1 )*dr )/2
1030 u2 = ( dr + 7 - 2*sqrt(ffteen) )/( dr*dr + 14*dr - 11 )
1031 v2 = ( 1 - ( dr - 1 )*u2 )/2
1035 CALL smpcpy( 2, mxg, g(0,gms+4), u2 )
1036 pts(gms+4) = ( ( dr + 1 )*dr )/2
1037 IF ( nd .EQ. 2 )
THEN
1038 w(gms+3,iw) = ( 155 - sqrt(ffteen) )/1200
1039 w(gms+4,iw) = ( 155 + sqrt(ffteen) )/1200
1040 w(1, iw) = 1 - 3*( w(gms+3,iw) + w(gms+4,iw) )
1041 ELSE IF ( nd .EQ. 3 )
THEN
1042 w(gms+1,iw) = ( 2665 + 14*sqrt(ffteen) )/37800
1043 w(gms+2,iw) = ( 2665 - 14*sqrt(ffteen) )/37800
1044 w(gms+3,iw) = 2*ffteen/567
1047 w(gms+1,iw) = ( 2*(27-dr)/(dr+5)-l2*(13-dr) )
1048 & /( l1**4*(l1-l2)*dr4 )
1049 w(gms+2,iw) = ( 2*(27-dr)/(dr+5)-l1*(13-dr) )
1050 & /( l2**4*(l2-l1)*dr4 )
1051 w(gms+3,iw)=( 2/( dr + 5 ) - d2 )/( dr4*( d1 - d2 )*d1**4 )
1052 w(gms+4,iw)=( 2/( dr + 5 ) - d1 )/( dr4*( d2 - d1 )*d2**4 )
1058 g(0,5) = 7/( dr + 7 )
1059 CALL smpcpy( 1, mxg, g(0,5), 1/( dr + 7 ) )
1061 g(0,6) = 5/( dr + 7 )
1062 g(1,6) = 3/( dr + 7 )
1063 CALL smpcpy( 2, mxg, g(0,6), 1/( dr + 7 ) )
1064 pts(6) = ( dr + 1 )*dr
1065 g(0,7) = 3/( dr + 7 )
1066 g(1,7) = 3/( dr + 7 )
1067 g(2,7) = 3/( dr + 7 )
1068 CALL smpcpy( 3, mxg, g(0,7), 1/( dr + 7 ) )
1069 pts(7) = ( ( dr + 1 )*dr*( dr - 1 ) )/6
1070 w(2,iw) = ( dr + 3 )**7/( 2*64*dr4*( dr + 5 ) )
1071 w(3,iw) = -( dr + 5 )**7/( 64*dr6 )
1072 w(4,iw) = -( dr + 5 )**7/( 64*dr6 )
1073 w(5,iw) = ( dr + 7 )**7/( 64*dr6*( dr + 7 ) )
1074 w(6,iw) = ( dr + 7 )**7/( 64*dr6*( dr + 7 ) )
1075 w(7,iw) = ( dr + 7 )**7/( 64*dr6*( dr + 7 ) )
1077 IF ( key .EQ. 4 )
THEN
1084 sg = 1/( 23328*dr6 )
1085 u5 = -6**3*sg*( 52212 - dr*( 6353 + dr*( 1934 - dr*27 ) ) )
1086 u6 = 6**4*sg*( 7884 - dr*( 1541 - dr*9 ) )
1087 u7 = -6**5*sg*( 8292 - dr*( 1139 - dr*3 ) )/( dr + 7 )
1088 p0 = -144*( 142528 + dr*( 23073 - dr*115 ) )
1089 p1 = -12*( 6690556 + dr*( 2641189 + dr*( 245378 - dr*1495 ) ) )
1090 p2 = -16*(6503401 + dr*(4020794+dr*(787281+dr*(47323-dr*385))))
1091 p3 = -( 6386660 + dr*(4411997+dr*(951821+dr*(61659-dr*665))) )
1095 q = a*( 2*a*a - p1/p3 ) + p0/p3
1097 th = acos( -q/( 2*r ) )/3
1100 a1 = -a + r*cos( th )
1101 a2 = -a + r*cos( th + tp + tp )
1102 a3 = -a + r*cos( th + tp )
1103 g(0,gms+5) = ( 1 - dr*a1 )/( dr + 1 )
1104 CALL smpcpy( 1, mxg, g(0,gms+5), ( 1 + a1 )/( dr + 1 ) )
1106 g(0,gms+6) = ( 1 - dr*a2 )/( dr + 1 )
1107 CALL smpcpy( 1, mxg, g(0,gms+6), ( 1 + a2 )/( dr + 1 ) )
1109 g(0,gms+7) = ( 1 - dr*a3 )/( dr + 1 )
1110 CALL smpcpy( 1, mxg, g(0,gms+7), ( 1 + a3 )/( dr + 1 ) )
1112 w(gms+5,iw) = ( u7-(a2+a3)*u6+a2*a3*u5 )
1113 & /( a1**2-(a2+a3)*a1+a2*a3 )/a1**5
1114 w(gms+6,iw) = ( u7-(a1+a3)*u6+a1*a3*u5 )
1115 & /( a2**2-(a1+a3)*a2+a1*a3 )/a2**5
1116 w(gms+7,iw) = ( u7-(a2+a1)*u6+a2*a1*u5 )
1117 & /( a3**2-(a2+a1)*a3+a2*a1 )/a3**5
1118 g(0,gms+8) = 4/( dr + 7 )
1119 g(1,gms+8) = 4/( dr + 7 )
1120 CALL smpcpy( 2, mxg, g(0,gms+8), 1/( dr + 7 ) )
1121 pts(gms+8) = ( ( dr + 1 )*dr )/2
1122 w(gms+8,iw) = 10*(dr+7)**6/( 729*dr6 )
1123 g(0,gms+9) = 11/( dr + 7 )/2
1124 g(1,gms+9) = 5/( dr + 7 )/2
1125 CALL smpcpy( 2, mxg, g(0,gms+9), 1/( dr + 7 ) )
1126 pts(gms+9) = ( ( dr + 1 )*dr )
1127 w(gms+9,iw) = 64*(dr+7)**6/( 6561*dr6 )
1128 w( 4,iw) = w(4,iw+1)
1129 w( 7,iw) = w(7,iw+1)
1134 g(0,8) = 9/( dr + 9 )
1135 CALL smpcpy( 1, mxg, g(0, 8), 1/( dr + 9 ) )
1137 g(0,9) = 7/( dr + 9 )
1138 g(1,9) = 3/( dr + 9 )
1139 CALL smpcpy( 2, mxg, g(0, 9), 1/( dr + 9 ) )
1140 pts(9) = ( dr + 1 )*dr
1141 g(0,10) = 5/( dr + 9 )
1142 g(1,10) = 5/( dr + 9 )
1143 CALL smpcpy( 2, mxg, g(0,10), 1/( dr + 9 ) )
1144 pts(10) = ( ( dr + 1 )*dr )/2
1145 g(0,11) = 5/( dr + 9 )
1146 g(1,11) = 3/( dr + 9 )
1147 g(2,11) = 3/( dr + 9 )
1148 CALL smpcpy( 3, mxg, g(0,11), 1/( dr + 9 ) )
1149 pts(11) = ( ( dr + 1 )*dr*( dr - 1 ) )/2
1150 w(2 ,iw) = -( dr + 3 )**9/( 6*256*dr6 )
1151 w(3 ,iw) = ( dr + 5 )**9/( 2*256*dr6*( dr + 7 ) )
1152 w(4 ,iw) = ( dr + 5 )**9/( 2*256*dr6*( dr + 7 ) )
1153 w(5 ,iw) = -( dr + 7 )**9/( 256*dr8 )
1154 w(6 ,iw) = -( dr + 7 )**9/( 256*dr8 )
1155 w(7 ,iw) = -( dr + 7 )**9/( 256*dr8 )
1156 w(8 ,iw) = ( dr + 9 )**9/( 256*dr8*( dr + 9 ) )
1157 w(9 ,iw) = ( dr + 9 )**9/( 256*dr8*( dr + 9 ) )
1158 w(10,iw) = ( dr + 9 )**9/( 256*dr8*( dr + 9 ) )
1159 w(11,iw) = ( dr + 9 )**9/( 256*dr8*( dr + 9 ) )
1160 IF ( nd .GT. 2 )
THEN
1161 g(0,12) = 3/( dr + 9 )
1162 g(1,12) = 3/( dr + 9 )
1163 g(2,12) = 3/( dr + 9 )
1164 g(3,12) = 3/( dr + 9 )
1165 CALL smpcpy( 4, mxg, g(0,12), 1/( dr + 9 ) )
1166 pts(12) = ( ( dr + 1 )*dr*( dr - 1 )*( dr - 2 ) )/24
1176 w(1,j) = w(1,j) - pts(i)*w(i,j)
1185 w(i,j) = w(i,j) - w(i,1)
1193 SUBROUTINE smpcpy( START, END, PARAM, VALUE )
1194 DOUBLE PRECISION VALUE, PARAM(0:*)
1195 INTEGER START, END, I
1201 SUBROUTINE smpsms( N, VERTEX, NF, F, G, SYMSMS, X, FUNVLS )
1247 DOUBLE PRECISION VERTEX(N,0:N),G(0:N), SYMSMS(NF),FUNVLS(NF), X(N)
1251 INTEGER IX, LX, I, J, K, L
1252 DOUBLE PRECISION GL, GI
1264 IF ( g(i) .GT. g(i-1) ) k = 1
1266 IF ( k .GT. 0 )
THEN
1270 IF ( g(j) .GT. g(k) ) k = j
1272 IF ( k .GE. i )
THEN
1285 x(i) = x(i) +
vertex(i,j)*g(j)
1288 CALL f( n, x, nf, funvls )
1290 symsms(j) = symsms(j) + funvls(j)
1297 IF ( g(i-1) .GT. g(i) )
THEN
1304 IF ( gl .LE. gi ) ix = ix - 1
1305 IF ( g(l) .GT. gi ) lx = l
1307 IF ( g(ix) .LE. gi ) ix = lx
1318 SUBROUTINE smpstr( POINTR, SBRGNS, PONTRS, RGNERS )
1352 INTEGER POINTR, SBRGNS
1353 DOUBLE PRECISION PONTRS(*), RGNERS(*)
1361 INTEGER SUBRGN, SUBTMP, PT, PTP
1362 DOUBLE PRECISION RGNERR
1366 RGNERR = rgners(pointr)
1367 IF ( pointr .EQ. pontrs(1) )
THEN
1373 10 subtmp = 2*subrgn
1374 IF ( subtmp .LE. sbrgns )
THEN
1375 IF ( subtmp .NE. sbrgns )
THEN
1380 ptp = pontrs(subtmp+1)
1381 IF ( rgners(pt) .LT. rgners(ptp) ) subtmp = subtmp + 1
1388 IF ( rgnerr .LT. rgners(pt) )
THEN
1402 20 subtmp = subrgn/2
1403 IF ( subtmp .GE. 1 )
THEN
1408 IF ( rgnerr .GT. rgners(pt) )
THEN
1418 pontrs(subrgn) = pointr
1424 SUBROUTINE smpdfs( ND, NF, FUNSUB, TOP, SBRGNS, VERTCS, VOLUMS,
1425 * X, H, CENTER, WORK, FRTHDF, NEWSBS )
1482 INTEGER ND, NF, TOP, SBRGNS, NEWSBS
1483 DOUBLE PRECISION VERTCS(ND,0:ND,*), VOLUMS(*), WORK(NF,*)
1484 DOUBLE PRECISION X(ND), H(ND), CENTER(ND), FRTHDF(0:ND-1,ND)
1485 DOUBLE PRECISION DIFFER, DIFMAX, DIFMID, DIFNXT, EWIDTH, EDGMAX
1486 DOUBLE PRECISION CUTTF, CUTTB, DIFIL, DIFLJ, DFSMAX, VTI, VTJ, VTL
1487 PARAMETER ( CUTTF = 2, cuttb = 8 )
1488 INTEGER I, J, K, L, IE, JE, IS, JS, LS, IT, JT, LT
1489 DOUBLE PRECISION SMPVOL
1501 center(k) = vertcs(k,0,top)
1503 center(k) = center(k) + vertcs(k,l,top)
1505 center(k) = center(k)/( nd + 1 )
1507 CALL funsub(nd, center, nf, work(1,3))
1512 h(k) = 2*( vertcs(k,i,top)-vertcs(k,j,top) )/( 5*(nd+1) )
1513 ewidth = ewidth + abs( h(k) )
1514 x(k) = center(k) - 3*h(k)
1520 IF ( l. ne. 3 )
CALL funsub(nd, x, nf, work(1,l))
1522 IF ( ewidth .GE. edgmax )
THEN
1530 difmid = difmid + abs( work(k,3) )
1531 differ = differ + abs( work(k,1) + work(k,5)+ 6*work(k,3)
1532 & - 4*( work(k,2) + work(k,4) ) )
1534 IF ( difmid + differ/8 .EQ. difmid ) differ = 0
1535 differ = differ*ewidth
1536 frthdf(i,j) = differ
1537 IF ( differ .GE. difmax )
THEN
1544 ELSE IF ( differ .GE. difnxt )
THEN
1554 IF ( difnxt .GT. difmax/cuttf )
THEN
1558 IF ( difmax .EQ. 0 )
THEN
1564 IF ( l .NE. is .AND. l .NE. js )
THEN
1565 it = min( l, is, js )
1566 jt = max( l, is, js )
1567 lt = is + js + l - it - jt
1568 differ = frthdf(it,lt) + frthdf(lt,jt)
1569 IF ( differ .GE. dfsmax )
THEN
1575 difil = frthdf( min(is,ls), max(is,ls) )
1576 diflj = frthdf( min(js,ls), max(js,ls) )
1577 difnxt = difil + diflj - min( difil,diflj )
1578 IF ( difmax/cuttb .LT. difnxt .AND. difil .GT. diflj )
THEN
1588 volums(top) = volums(top)/newsbs
1589 DO l = sbrgns + 1, sbrgns + newsbs - 1
1590 volums(l) = volums(top)
1593 vertcs(k,j,l) = vertcs(k,j,top)
1598 vti = vertcs(k,is,top)
1599 vtj = vertcs(k,js,top)
1600 IF ( newsbs .EQ. 4 )
THEN
1604 vertcs(k,js,top) = ( vti + vtj )/2
1605 vertcs(k,is,sbrgns+1) = vti
1606 vertcs(k,js,sbrgns+1) = ( vti + vtj )/2
1607 vertcs(k,is,sbrgns+2) = ( vti + vtj )/2
1608 vertcs(k,js,sbrgns+2) = vtj
1609 vertcs(k,is,sbrgns+3) = ( vti + vtj )/2
1610 vertcs(k,js,sbrgns+3) = vtj
1611 vti = vertcs(k,it,top)
1612 vtj = vertcs(k,jt,top)
1613 vertcs(k,jt,top) = ( vti + vtj )/2
1614 vertcs(k,it,sbrgns+1) = ( vti + vtj )/2
1615 vertcs(k,jt,sbrgns+1) = vtj
1616 vti = vertcs(k,it,sbrgns+2)
1617 vtj = vertcs(k,jt,sbrgns+2)
1618 vertcs(k,jt,sbrgns+2) = ( vti + vtj )/2
1619 vertcs(k,it,sbrgns+3) = ( vti + vtj )/2
1620 vertcs(k,jt,sbrgns+3) = vtj
1625 vertcs(k,js,top) = ( 2*vti + vtj )/3
1626 vertcs(k,is,sbrgns+1) = ( 2*vti + vtj )/3
1627 IF ( difmax/cuttf .LT. difnxt )
THEN
1628 vertcs(k,js,sbrgns+1) = vtj
1629 vertcs(k,is,sbrgns+2) = ( 2*vti + vtj )/3
1630 vertcs(k,js,sbrgns+2) = vtj
1631 vtj = vertcs(k,js,sbrgns+1)
1632 vtl = vertcs(k,ls,sbrgns+1)
1633 vertcs(k,ls,sbrgns+1) = ( vtj + vtl )/2
1634 vertcs(k,js,sbrgns+2) = ( vtj + vtl )/2
1635 vertcs(k,ls,sbrgns+2) = vtl
1637 vertcs(k,js,sbrgns+1) = ( vti + 2*vtj )/3
1638 vertcs(k,is,sbrgns+2) = ( vti + 2*vtj )/3
1639 vertcs(k,js,sbrgns+2) = vtj