dmgsbv.f 12 KB

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