mgsbv.f 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  1. *DECK MGSBV
  2. SUBROUTINE MGSBV (M, N, A, IA, NIV, IFLAG, S, P, IP, INHOMO, V, W,
  3. + WCND)
  4. C***BEGIN PROLOGUE MGSBV
  5. C***SUBSIDIARY
  6. C***PURPOSE Subsidiary to BVSUP
  7. C***LIBRARY SLATEC
  8. C***TYPE SINGLE PRECISION (MGSBV-S, DMGSBV-D)
  9. C***AUTHOR Watts, H. A., (SNLA)
  10. C***DESCRIPTION
  11. C
  12. C **********************************************************************
  13. C Orthogonalize a set of N real vectors and determine their rank
  14. C
  15. C **********************************************************************
  16. C INPUT
  17. C **********************************************************************
  18. C M = Dimension of vectors
  19. C N = No. of vectors
  20. C A = Array whose first N cols contain the vectors
  21. C IA = First dimension of array A (col length)
  22. C NIV = Number of independent vectors needed
  23. C INHOMO = 1 Corresponds to having a non-zero particular solution
  24. C V = Particular solution vector (not included in the pivoting)
  25. C INDPVT = 1 Means pivoting will not be used
  26. C
  27. C **********************************************************************
  28. C OUTPUT
  29. C **********************************************************************
  30. C NIV = No. of linear independent vectors in input set
  31. C A = Matrix whose first NIV cols. contain NIV orthogonal vectors
  32. C which span the vector space determined by the input vectors
  33. C IFLAG
  34. C = 0 success
  35. C = 1 incorrect input
  36. C = 2 rank of new vectors less than N
  37. C P = Decomposition matrix. P is upper triangular and
  38. C (old vectors) = (new vectors) * P.
  39. C The old vectors will be reordered due to pivoting
  40. C The dimension of p must be .GE. N*(N+1)/2.
  41. C ( N*(2*N+1) when N .NE. NFCC )
  42. C IP = Pivoting vector. The dimension of IP must be .GE. N.
  43. C ( 2*N when N .NE. NFCC )
  44. C S = Square of norms of incoming vectors
  45. C V = Vector which is orthogonal to the vectors of A
  46. C W = Orthogonalization information for the vector V
  47. C WCND = Worst case (smallest) norm decrement value of the
  48. C vectors being orthogonalized (represents a test
  49. C for linear dependence of the vectors)
  50. C **********************************************************************
  51. C
  52. C***SEE ALSO BVSUP
  53. C***ROUTINES CALLED PRVEC, SDOT
  54. C***COMMON BLOCKS ML18JR, ML5MCO
  55. C***REVISION HISTORY (YYMMDD)
  56. C 750601 DATE WRITTEN
  57. C 890531 Changed all specific intrinsics to generic. (WRB)
  58. C 890831 Modified array declarations. (WRB)
  59. C 890921 Realigned order of variables in certain COMMON blocks.
  60. C (WRB)
  61. C 891214 Prologue converted to Version 4.0 format. (BAB)
  62. C 900328 Added TYPE section. (WRB)
  63. C 910722 Updated AUTHOR section. (ALS)
  64. C***END PROLOGUE MGSBV
  65. C
  66. DIMENSION A(IA,*),V(*),W(*),P(*),IP(*),S(*)
  67. C
  68. C
  69. COMMON /ML18JR/ AE,RE,TOL,NXPTS,NIC,NOPG,MXNON,NDISK,NTAPE,NEQ,
  70. 1 INDPVT,INTEG,NPS,NTP,NEQIVP,NUMORT,NFCC,
  71. 2 ICOCO
  72. C
  73. COMMON /ML5MCO/ URO,SRU,EPS,SQOVFL,TWOU,FOURU,LPAR
  74. C
  75. C***FIRST EXECUTABLE STATEMENT MGSBV
  76. IF(M .GT. 0 .AND. N .GT. 0 .AND. IA .GE. M) GO TO 10
  77. IFLAG=1
  78. RETURN
  79. C
  80. 10 JP=0
  81. IFLAG=0
  82. NP1=N+1
  83. Y=0.0
  84. M2=M/2
  85. C
  86. C CALCULATE SQUARE OF NORMS OF INCOMING VECTORS AND SEARCH FOR
  87. C VECTOR WITH LARGEST MAGNITUDE
  88. C
  89. J=0
  90. DO 30 I=1,N
  91. VL=SDOT(M,A(1,I),1,A(1,I),1)
  92. S(I)=VL
  93. IF (N .EQ. NFCC) GO TO 25
  94. J=2*I-1
  95. P(J)=VL
  96. IP(J)=J
  97. 25 J=J+1
  98. P(J)=VL
  99. IP(J)=J
  100. IF(VL .LE. Y) GO TO 30
  101. Y=VL
  102. IX=I
  103. 30 CONTINUE
  104. IF (INDPVT .NE. 1) GO TO 33
  105. IX=1
  106. Y=P(1)
  107. 33 LIX=IX
  108. IF (N .NE. NFCC) LIX=2*IX-1
  109. P(LIX)=P(1)
  110. S(NP1)=0.
  111. IF (INHOMO .EQ. 1) S(NP1)=SDOT(M,V,1,V,1)
  112. WCND=1.
  113. NIVN=NIV
  114. NIV=0
  115. C
  116. IF(Y .EQ. 0.0) GO TO 170
  117. C **********************************************************************
  118. DO 140 NR=1,N
  119. IF (NIVN .EQ. NIV) GO TO 150
  120. NIV=NR
  121. IF(IX .EQ. NR) GO TO 80
  122. C
  123. C PIVOTING OF COLUMNS OF P MATRIX
  124. C
  125. NN=N
  126. LIX=IX
  127. LR=NR
  128. IF (N .EQ. NFCC) GO TO 40
  129. NN=NFCC
  130. LIX=2*IX-1
  131. LR=2*NR-1
  132. 40 IF(NR .EQ. 1) GO TO 60
  133. KD=LIX-LR
  134. KJ=LR
  135. NRM1=LR-1
  136. DO 50 J=1,NRM1
  137. PSAVE=P(KJ)
  138. JK=KJ+KD
  139. P(KJ)=P(JK)
  140. P(JK)=PSAVE
  141. 50 KJ=KJ+NN-J
  142. JY=JK+NMNR
  143. JZ=JY-KD
  144. P(JY)=P(JZ)
  145. 60 IZ=IP(LIX)
  146. IP(LIX)=IP(LR)
  147. IP(LR)=IZ
  148. SV=S(IX)
  149. S(IX)=S(NR)
  150. S(NR)=SV
  151. IF (N .EQ. NFCC) GO TO 69
  152. IF (NR .EQ. 1) GO TO 67
  153. KJ=LR+1
  154. DO 65 K=1,NRM1
  155. PSAVE=P(KJ)
  156. JK=KJ+KD
  157. P(KJ)=P(JK)
  158. P(JK)=PSAVE
  159. 65 KJ=KJ+NFCC-K
  160. 67 IZ=IP(LIX+1)
  161. IP(LIX+1)=IP(LR+1)
  162. IP(LR+1)=IZ
  163. C
  164. C PIVOTING OF COLUMNS OF VECTORS
  165. C
  166. 69 DO 70 L=1,M
  167. T=A(L,IX)
  168. A(L,IX)=A(L,NR)
  169. 70 A(L,NR)=T
  170. C
  171. C CALCULATE P(NR,NR) AS NORM SQUARED OF PIVOTAL VECTOR
  172. C
  173. 80 JP=JP+1
  174. P(JP)=Y
  175. RY=1.0/Y
  176. NMNR=N-NR
  177. IF (N .EQ. NFCC) GO TO 85
  178. NMNR=NFCC-(2*NR-1)
  179. JP=JP+1
  180. P(JP)=0.
  181. KP=JP+NMNR
  182. P(KP)=Y
  183. 85 IF(NR .EQ. N .OR. NIVN .EQ. NIV) GO TO 125
  184. C
  185. C CALCULATE ORTHOGONAL PROJECTION VECTORS AND SEARCH FOR LARGEST NORM
  186. C
  187. Y=0.0
  188. IP1=NR+1
  189. IX=IP1
  190. C ****************************************
  191. DO 120 J=IP1,N
  192. DOT=SDOT(M,A(1,NR),1,A(1,J),1)
  193. JP=JP+1
  194. JQ=JP+NMNR
  195. IF (N .NE. NFCC) JQ=JQ+NMNR-1
  196. P(JQ)=P(JP)-DOT*(DOT*RY)
  197. P(JP)=DOT*RY
  198. DO 90 I = 1,M
  199. 90 A(I,J)=A(I,J)-P(JP)*A(I,NR)
  200. IF (N .EQ. NFCC) GO TO 99
  201. KP=JP+NMNR
  202. JP=JP+1
  203. PJP=RY*PRVEC(M,A(1,NR),A(1,J))
  204. P(JP)=PJP
  205. P(KP)=-PJP
  206. KP=KP+1
  207. P(KP)=RY*DOT
  208. DO 95 K=1,M2
  209. L=M2+K
  210. A(K,J)=A(K,J)-PJP*A(L,NR)
  211. 95 A(L,J)=A(L,J)+PJP*A(K,NR)
  212. P(JQ)=P(JQ)-PJP*(PJP/RY)
  213. C
  214. C TEST FOR CANCELLATION IN RECURRENCE RELATION
  215. C
  216. 99 IF(P(JQ) .GT. S(J)*SRU) GO TO 100
  217. P(JQ)=SDOT(M,A(1,J),1,A(1,J),1)
  218. 100 IF(P(JQ) .LE. Y) GO TO 120
  219. Y=P(JQ)
  220. IX=J
  221. 120 CONTINUE
  222. IF (N .NE. NFCC) JP=KP
  223. C ****************************************
  224. IF(INDPVT .EQ. 1) IX=IP1
  225. C
  226. C RECOMPUTE NORM SQUARED OF PIVOTAL VECTOR WITH SCALAR PRODUCT
  227. C
  228. Y=SDOT(M,A(1,IX),1,A(1,IX),1)
  229. IF(Y .LE. EPS*S(IX)) GO TO 170
  230. WCND=MIN(WCND,Y/S(IX))
  231. C
  232. C COMPUTE ORTHOGONAL PROJECTION OF PARTICULAR SOLUTION
  233. C
  234. 125 IF(INHOMO .NE. 1) GO TO 140
  235. LR=NR
  236. IF (N .NE. NFCC) LR=2*NR-1
  237. W(LR)=SDOT(M,A(1,NR),1,V,1)*RY
  238. DO 130 I=1,M
  239. 130 V(I)=V(I)-W(LR)*A(I,NR)
  240. IF (N .EQ. NFCC) GO TO 140
  241. LR=2*NR
  242. W(LR)=RY*PRVEC(M,V,A(1,NR))
  243. DO 135 K=1,M2
  244. L=M2+K
  245. V(K)=V(K)+W(LR)*A(L,NR)
  246. 135 V(L)=V(L)-W(LR)*A(K,NR)
  247. 140 CONTINUE
  248. C **********************************************************************
  249. C
  250. C TEST FOR LINEAR DEPENDENCE OF PARTICULAR SOLUTION
  251. C
  252. 150 IF(INHOMO .NE. 1) RETURN
  253. IF ((N .GT. 1) .AND. (S(NP1) .LT. 1.0)) RETURN
  254. VNORM=SDOT(M,V,1,V,1)
  255. IF (S(NP1) .NE. 0.) WCND=MIN(WCND,VNORM/S(NP1))
  256. IF(VNORM .GE. EPS*S(NP1)) RETURN
  257. 170 IFLAG=2
  258. WCND=EPS
  259. RETURN
  260. END