dbvpor.f 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341
  1. *DECK DBVPOR
  2. SUBROUTINE DBVPOR (Y, NROWY, NCOMP, XPTS, NXPTS, A, NROWA, ALPHA,
  3. + NIC, B, NROWB, BETA, NFC, IFLAG, Z, MXNON, P, NTP, IP, W, NIV,
  4. + YHP, U, V, COEF, S, STOWA, G, WORK, IWORK, NFCC)
  5. C***BEGIN PROLOGUE DBVPOR
  6. C***SUBSIDIARY
  7. C***PURPOSE Subsidiary to DBVSUP
  8. C***LIBRARY SLATEC
  9. C***TYPE DOUBLE PRECISION (BVPOR-S, DBVPOR-D)
  10. C***AUTHOR Watts, H. A., (SNLA)
  11. C***DESCRIPTION
  12. C
  13. C **********************************************************************
  14. C INPUT to DBVPOR (items not defined in DBVSUP comments)
  15. C **********************************************************************
  16. C
  17. C NOPG = 0 -- orthonormalization points not pre-assigned
  18. C = 1 -- orthonormalization points pre-assigned
  19. C
  20. C MXNON = maximum number of orthogonalizations allowed.
  21. C
  22. C NDISK = 0 -- in-core storage
  23. C = 1 -- disk storage. Value of NTAPE in data statement
  24. C is set to 13. If another value is desired,
  25. C the data statement must be changed.
  26. C
  27. C INTEG = type of integrator and associated test to be used
  28. C to determine when to orthonormalize.
  29. C
  30. C 1 -- use GRAM-SCHMIDT test and DDERKF
  31. C 2 -- use GRAM-SCHMIDT test and DDEABM
  32. C
  33. C TOL = tolerance for allowable error in orthogonalization test.
  34. C
  35. C NPS = 0 normalize particular solution to unit length at each
  36. C point of orthonormalization.
  37. C = 1 do not normalize particular solution.
  38. C
  39. C NTP = must be .GE. NFC*(NFC+1)/2.
  40. C
  41. C NFCC = 2*NFC for special treatment of a COMPLEX*16 valued problem
  42. C
  43. C ICOCO = 0 skip final computations (superposition coefficients
  44. C and, hence, boundary problem solution)
  45. C = 1 calculate superposition coefficients and obtain
  46. C solution to the boundary value problem
  47. C
  48. C **********************************************************************
  49. C OUTPUT from DBVPOR
  50. C **********************************************************************
  51. C
  52. C Y(NROWY,NXPTS) = solution at specified output points.
  53. C
  54. C MXNON = number of orthonormalizations performed by DBVPOR.
  55. C
  56. C Z(MXNON+1) = locations of orthonormalizations performed by DBVPOR.
  57. C
  58. C NIV = number of independent vectors returned from DMGSBV. Normally
  59. C this parameter will be meaningful only when DMGSBV returns
  60. C with MFLAG = 2.
  61. C
  62. C **********************************************************************
  63. C
  64. C The following variables are in the argument list because of
  65. C variable dimensioning. In general, they contain no information of
  66. C use to the user. The amount of storage set aside by the user must
  67. C be greater than or equal to that indicated by the dimension
  68. C statements. For the disk storage mode, NON = 0 and KPTS = 1,
  69. C while for the in-core storage mode, NON = MXNON and KPTS = NXPTS.
  70. C
  71. C P(NTP,NON+1)
  72. C IP(NFCC,NON+1)
  73. C YHP(NCOMP,NFC+1) plus an additional column of the length NEQIVP
  74. C U(NCOMP,NFC,KPTS)
  75. C V(NCOMP,KPTS)
  76. C W(NFCC,NON+1)
  77. C COEF(NFCC)
  78. C S(NFC+1)
  79. C STOWA(NCOMP*(NFC+1)+NEQIVP+1)
  80. C G(NCOMP)
  81. C WORK(KKKWS)
  82. C IWORK(LLLIWS)
  83. C
  84. C **********************************************************************
  85. C SUBROUTINES used by DBVPOR
  86. C DLSSUD -- solves an underdetermined system of linear
  87. C equations. This routine is used to get a full
  88. C set of initial conditions for integration.
  89. C Called by DBVPOR.
  90. C
  91. C DVECS -- obtains starting vectors for special treatment
  92. C of COMPLEX*16 valued problems, called by DBVPOR.
  93. C
  94. C DRKFAB -- routine which conducts integration using DDERKF or
  95. C DDEABM.
  96. C
  97. C DSTWAY -- storage for backup capability, called by
  98. C DBVPOR and DREORT.
  99. C
  100. C DSTOR1 -- storage at output points, called by DBVPOR,
  101. C DRKFAB, DREORT and DSTWAY.
  102. C
  103. C DDOT -- single precision vector inner product routine,
  104. C called by DBVPOR, DCOEF, DLSSUD, DMGSBV,
  105. C DBKSOL, DREORT and DPRVEC.
  106. C ** NOTE **
  107. C a considerable improvement in speed can be achieved if a
  108. C machine language version is used for DDOT.
  109. C
  110. C DCOEF -- computes the superposition constants from the
  111. C boundary conditions at XFINAL.
  112. C
  113. C DBKSOL -- solves an upper triangular set of linear equations.
  114. C
  115. C **********************************************************************
  116. C
  117. C***SEE ALSO DBVSUP
  118. C***ROUTINES CALLED DBKSOL, DCOEF, DDOT, DLSSUD, DRKFAB, DSTOR1,
  119. C DSTWAY, DVECS
  120. C***COMMON BLOCKS DML15T, DML18J, DML8SZ
  121. C***REVISION HISTORY (YYMMDD)
  122. C 750601 DATE WRITTEN
  123. C 890531 Changed all specific intrinsics to generic. (WRB)
  124. C 890831 Modified array declarations. (WRB)
  125. C 890921 Realigned order of variables in certain COMMON blocks.
  126. C (WRB)
  127. C 891214 Prologue converted to Version 4.0 format. (BAB)
  128. C 900328 Added TYPE section. (WRB)
  129. C 910722 Updated AUTHOR section. (ALS)
  130. C***END PROLOGUE DBVPOR
  131. C
  132. DOUBLE PRECISION DDOT
  133. INTEGER I, I1, I2, IC, ICOCO, IFLAG, IGOFX, INDPVT, INFO, INHOMO,
  134. 1 INTEG, IRA, ISFLG, ISTKOP, IVP, J,
  135. 2 K, KNSWOT, KOD, KOP, KPTS, KWC, KWD, KWS, KWT, L, LOTJP, M,
  136. 3 MNSWOT, MXNON, MXNOND, N, NCOMP, NCOMP2, NCOMPD, NDISK, NDW,
  137. 4 NEQ, NEQIVP, NFC, NFCC, NFCCD, NFCD, NFCP1, NFCP2, NIC,
  138. 5 NICD, NIV, NN, NON, NOPG, NPS, NROWA, NROWB, NROWY, NSWOT,
  139. 6 NTAPE, NTP, NTPD, NUMORT, NXPTS, NXPTSD,
  140. 7 IP(NFCC,*), IWORK(*)
  141. DOUBLE PRECISION A(NROWA,*), AE, ALPHA(*), B(NROWB,*),
  142. 1 BETA(*), C, COEF(*), G(*), P(NTP,*), PWCND, PX,
  143. 2 RE, S(*), STOWA(*), TND, TOL, U(NCOMP,NFC,*),
  144. 3 V(NCOMP,*), W(NFCC,*), WORK(*), X, XBEG, XEND, XOP,
  145. 4 XOT, XPTS(*), XSAV, Y(NROWY,*), YHP(NCOMP,*),
  146. 5 Z(*)
  147. C
  148. C ******************************************************************
  149. C
  150. COMMON /DML8SZ/ C,XSAV,IGOFX,INHOMO,IVP,NCOMPD,NFCD
  151. COMMON /DML15T/ PX,PWCND,TND,X,XBEG,XEND,XOT,XOP,INFO(15),ISTKOP,
  152. 1 KNSWOT,KOP,LOTJP,MNSWOT,NSWOT
  153. COMMON /DML18J/ AE,RE,TOL,NXPTSD,NICD,NOPG,MXNOND,NDISK,NTAPE,
  154. 1 NEQ,INDPVT,INTEG,NPS,NTPD,NEQIVP,NUMORT,NFCCD,
  155. 2 ICOCO
  156. C
  157. C *****************************************************************
  158. C
  159. C***FIRST EXECUTABLE STATEMENT DBVPOR
  160. NFCP1 = NFC + 1
  161. NUMORT = 0
  162. C = 1.0D0
  163. C
  164. C ******************************************************************
  165. C CALCULATE INITIAL CONDITIONS WHICH SATISFY
  166. C A*YH(XINITIAL)=0 AND A*YP(XINITIAL)=ALPHA.
  167. C WHEN NFC .NE. NFCC DLSSUD DEFINES VALUES YHP IN A MATRIX OF
  168. C SIZE (NFCC+1)*NCOMP AND ,HENCE, OVERFLOWS THE STORAGE
  169. C ALLOCATION INTO THE U ARRAY. HOWEVER, THIS IS OKAY SINCE
  170. C PLENTY OF SPACE IS AVAILABLE IN U AND IT HAS NOT YET BEEN
  171. C USED.
  172. C
  173. NDW = NROWA*NCOMP
  174. KWS = NDW + NIC + 1
  175. KWD = KWS + NIC
  176. KWT = KWD + NIC
  177. KWC = KWT + NIC
  178. IFLAG = 0
  179. CALL DLSSUD(A,YHP(1,NFCC+1),ALPHA,NIC,NCOMP,NROWA,YHP,NCOMP,IFLAG,
  180. 1 1,IRA,0,WORK(1),WORK(NDW+1),IWORK,WORK(KWS),WORK(KWD),
  181. 2 WORK(KWT),ISFLG,WORK(KWC))
  182. IF (IFLAG .EQ. 1) GO TO 10
  183. IFLAG = -4
  184. GO TO 200
  185. 10 CONTINUE
  186. IF (NFC .NE. NFCC)
  187. 1 CALL DVECS(NCOMP,NFC,YHP,WORK,IWORK,INHOMO,IFLAG)
  188. IF (IFLAG .EQ. 1) GO TO 20
  189. IFLAG = -5
  190. GO TO 190
  191. 20 CONTINUE
  192. C
  193. C ************************************************************
  194. C DETERMINE THE NUMBER OF DIFFERENTIAL EQUATIONS TO BE
  195. C INTEGRATED, INITIALIZE VARIABLES FOR AUXILIARY INITIAL
  196. C VALUE PROBLEM AND STORE INITIAL CONDITIONS.
  197. C
  198. NEQ = NCOMP*NFC
  199. IF (INHOMO .EQ. 1) NEQ = NEQ + NCOMP
  200. IVP = 0
  201. IF (NEQIVP .EQ. 0) GO TO 40
  202. IVP = NEQ
  203. NEQ = NEQ + NEQIVP
  204. NFCP2 = NFCP1
  205. IF (INHOMO .EQ. 1) NFCP2 = NFCP1 + 1
  206. DO 30 K = 1, NEQIVP
  207. YHP(K,NFCP2) = ALPHA(NIC+K)
  208. 30 CONTINUE
  209. 40 CONTINUE
  210. CALL DSTOR1(U,YHP,V,YHP(1,NFCP1),0,NDISK,NTAPE)
  211. C
  212. C ************************************************************
  213. C SET UP DATA FOR THE ORTHONORMALIZATION TESTING PROCEDURE
  214. C AND SAVE INITIAL CONDITIONS IN CASE A RESTART IS
  215. C NECESSARY.
  216. C
  217. NSWOT = 1
  218. KNSWOT = 0
  219. LOTJP = 1
  220. TND = LOG10(10.0D0*TOL)
  221. PWCND = LOG10(SQRT(TOL))
  222. X = XBEG
  223. PX = X
  224. XOT = XEND
  225. XOP = X
  226. KOP = 1
  227. CALL DSTWAY(U,V,YHP,0,STOWA)
  228. C
  229. C ************************************************************
  230. C ******** FORWARD INTEGRATION OF ALL INITIAL VALUE EQUATIONS
  231. C **********
  232. C ************************************************************
  233. C
  234. CALL DRKFAB(NCOMP,XPTS,NXPTS,NFC,IFLAG,Z,MXNON,P,NTP,IP,YHP,
  235. 1 NIV,U,V,W,S,STOWA,G,WORK,IWORK,NFCC)
  236. IF (IFLAG .NE. 0 .OR. ICOCO .EQ. 0) GO TO 180
  237. C
  238. C *********************************************************
  239. C **************** BACKWARD SWEEP TO OBTAIN SOLUTION
  240. C *******************
  241. C *********************************************************
  242. C
  243. C CALCULATE SUPERPOSITION COEFFICIENTS AT XFINAL.
  244. C
  245. C FOR THE DISK STORAGE VERSION, IT IS NOT NECESSARY TO
  246. C READ U AND V AT THE LAST OUTPUT POINT, SINCE THE
  247. C LOCAL COPY OF EACH STILL EXISTS.
  248. C
  249. KOD = 1
  250. IF (NDISK .EQ. 0) KOD = NXPTS
  251. I1 = 1 + NFCC*NFCC
  252. I2 = I1 + NFCC
  253. CALL DCOEF(U(1,1,KOD),V(1,KOD),NCOMP,NROWB,NFC,NIC,B,
  254. 1 BETA,COEF,INHOMO,RE,AE,WORK,WORK(I1),
  255. 2 WORK(I2),IWORK,IFLAG,NFCC)
  256. C
  257. C *********************************************************
  258. C CALCULATE SOLUTION AT OUTPUT POINTS BY RECURRING
  259. C BACKWARDS. AS WE RECUR BACKWARDS FROM XFINAL TO
  260. C XINITIAL WE MUST CALCULATE NEW SUPERPOSITION
  261. C COEFFICIENTS EACH TIME WE CROSS A POINT OF
  262. C ORTHONORMALIZATION.
  263. C
  264. K = NUMORT
  265. NCOMP2 = NCOMP/2
  266. IC = 1
  267. IF (NFC .NE. NFCC) IC = 2
  268. DO 170 J = 1, NXPTS
  269. KPTS = NXPTS - J + 1
  270. KOD = KPTS
  271. IF (NDISK .EQ. 1) KOD = 1
  272. 50 CONTINUE
  273. C ...EXIT
  274. IF (K .EQ. 0) GO TO 120
  275. C ...EXIT
  276. IF (XEND .GT. XBEG .AND. XPTS(KPTS) .GE. Z(K))
  277. 1 GO TO 120
  278. C ...EXIT
  279. IF (XEND .LT. XBEG .AND. XPTS(KPTS) .LE. Z(K))
  280. 1 GO TO 120
  281. NON = K
  282. IF (NDISK .EQ. 0) GO TO 60
  283. NON = 1
  284. BACKSPACE NTAPE
  285. READ (NTAPE)
  286. 1 (IP(I,1), I = 1, NFCC),(P(I,1), I = 1, NTP)
  287. BACKSPACE NTAPE
  288. 60 CONTINUE
  289. IF (INHOMO .NE. 1) GO TO 90
  290. IF (NDISK .EQ. 0) GO TO 70
  291. BACKSPACE NTAPE
  292. READ (NTAPE) (W(I,1), I = 1, NFCC)
  293. BACKSPACE NTAPE
  294. 70 CONTINUE
  295. DO 80 N = 1, NFCC
  296. COEF(N) = COEF(N) - W(N,NON)
  297. 80 CONTINUE
  298. 90 CONTINUE
  299. CALL DBKSOL(NFCC,P(1,NON),COEF)
  300. DO 100 M = 1, NFCC
  301. WORK(M) = COEF(M)
  302. 100 CONTINUE
  303. DO 110 M = 1, NFCC
  304. L = IP(M,NON)
  305. COEF(L) = WORK(M)
  306. 110 CONTINUE
  307. K = K - 1
  308. GO TO 50
  309. 120 CONTINUE
  310. IF (NDISK .EQ. 0) GO TO 130
  311. BACKSPACE NTAPE
  312. READ (NTAPE)
  313. 1 (V(I,1), I = 1, NCOMP),
  314. 2 ((U(I,M,1), I = 1, NCOMP), M = 1, NFC)
  315. BACKSPACE NTAPE
  316. 130 CONTINUE
  317. DO 140 N = 1, NCOMP
  318. Y(N,KPTS) = V(N,KOD)
  319. 1 + DDOT(NFC,U(N,1,KOD),NCOMP,COEF,IC)
  320. 140 CONTINUE
  321. IF (NFC .EQ. NFCC) GO TO 160
  322. DO 150 N = 1, NCOMP2
  323. NN = NCOMP2 + N
  324. Y(N,KPTS) = Y(N,KPTS)
  325. 1 - DDOT(NFC,U(NN,1,KOD),NCOMP,
  326. 2 COEF(2),2)
  327. Y(NN,KPTS) = Y(NN,KPTS)
  328. 1 + DDOT(NFC,U(N,1,KOD),NCOMP,
  329. 2 COEF(2),2)
  330. 150 CONTINUE
  331. 160 CONTINUE
  332. 170 CONTINUE
  333. 180 CONTINUE
  334. 190 CONTINUE
  335. 200 CONTINUE
  336. C
  337. C ******************************************************************
  338. C
  339. MXNON = NUMORT
  340. RETURN
  341. END