Télécharger dnapps.eso

Retour à la liste

Numérotation des lignes :

dnapps
  1. C DNAPPS SOURCE FANDEUR 22/05/02 21:15:10 11359
  2. c-----------------------------------------------------------------------
  3. c\BeginDoc
  4. c
  5. c\Name: dnapps
  6. c
  7. c\Description:
  8. c Given the Arnoldi factorization
  9. c
  10. c A*V_{k} - V_{k}*H_{k} = r_{k+p}*e_{k+p}^T,
  11. c
  12. c apply NP implicit shifts resulting in
  13. c
  14. c A*(V_{k}*Q) - (V_{k}*Q)*(Q^T* H_{k}*Q) = r_{k+p}*e_{k+p}^T * Q
  15. c
  16. c where Q is an orthogonal matrix which is the product of rotations
  17. c and reflections resulting from the NP bulge chage sweeps.
  18. c The updated Arnoldi factorization becomes:
  19. c
  20. c A*VNEW_{k} - VNEW_{k}*HNEW_{k} = rnew_{k}*e_{k}^T.
  21. c
  22. c\Usage:
  23. c call dnapps
  24. c ( N, KEV, NP, SHIFTR, SHIFTI, V, LDV, H, LDH, RESID, Q, LDQ,
  25. c WORKL, WORKD )
  26. c
  27. c\Arguments
  28. c N Integer. (INPUT)
  29. c Problem size, i.e. size of matrix A.
  30. c
  31. c KEV Integer. (INPUT/OUTPUT)
  32. c KEV+NP is the size of the input matrix H.
  33. c KEV is the size of the updated matrix HNEW. KEV is only
  34. c updated on ouput when fewer than NP shifts are applied in
  35. c order to keep the conjugate pair together.
  36. c
  37. c NP Integer. (INPUT)
  38. c Number of implicit shifts to be applied.
  39. c
  40. c SHIFTR, Double precision array of length NP. (INPUT)
  41. c SHIFTI Real and imaginary part of the shifts to be applied.
  42. c Upon, entry to dnapps, the shifts must be sorted so that the
  43. c conjugate pairs are in consecutive locations.
  44. c
  45. c V REAL*8 N by (KEV+NP) array. (INPUT/OUTPUT)
  46. c On INPUT, V contains the current KEV+NP Arnoldi vectors.
  47. c On OUTPUT, V contains the updated KEV Arnoldi vectors
  48. c in the first KEV columns of V.
  49. c
  50. c LDV Integer. (INPUT)
  51. c Leading dimension of V exactly as declared in the calling
  52. c program.
  53. c
  54. c H REAL*8 (KEV+NP) by (KEV+NP) array. (INPUT/OUTPUT)
  55. c On INPUT, H contains the current KEV+NP by KEV+NP upper
  56. c Hessenber matrix of the Arnoldi factorization.
  57. c On OUTPUT, H contains the updated KEV by KEV upper Hessenberg
  58. c matrix in the KEV leading submatrix.
  59. c
  60. c LDH Integer. (INPUT)
  61. c Leading dimension of H exactly as declared in the calling
  62. c program.
  63. c
  64. c RESID Double precision array of length N. (INPUT/OUTPUT)
  65. c On INPUT, RESID contains the the residual vector r_{k+p}.
  66. c On OUTPUT, RESID is the update residual vector rnew_{k}
  67. c in the first KEV locations.
  68. c
  69. c Q REAL*8 KEV+NP by KEV+NP work array. (WORKSPACE)
  70. c Work array used to accumulate the rotations and reflections
  71. c during the bulge chase sweep.
  72. c
  73. c LDQ Integer. (INPUT)
  74. c Leading dimension of Q exactly as declared in the calling
  75. c program.
  76. c
  77. c WORKL Double precision work array of length (KEV+NP). (WORKSPACE)
  78. c Private (replicated) array on each PE or array allocated on
  79. c the front end.
  80. c
  81. c WORKD Double precision work array of length 2*N. (WORKSPACE)
  82. c Distributed array used in the application of the accumulated
  83. c orthogonal matrix Q.
  84. c
  85. c\EndDoc
  86. c
  87. c-----------------------------------------------------------------------
  88. c
  89. c\BeginLib
  90. c
  91. c\Local variables:
  92. c xxxxxx real
  93. c
  94. c\References:
  95. c 1. D.C. Sorensen, "Implicit Application of Polynomial Filters in
  96. c a k-Step Arnoldi Method", SIAM J. Matr. Anal. Apps., 13 (1992),
  97. c pp 357-385.
  98. c
  99. c\Routines called:
  100. c ivout ARPACK utility routine that prints integers.
  101. c arscnd ARPACK utility routine for timing. -> deleted by BP in 2020
  102. c dmout ARPACK utility routine that prints matrices.
  103. c dvout ARPACK utility routine that prints vectors.
  104. c dlabad LAPACK routine that computes machine constants.
  105. c dlacpy LAPACK matrix copy routine.
  106. c dlamch LAPACK routine that determines machine constants.
  107. c dlanhs LAPACK routine that computes various norms of a matrix.
  108. c dlapy2 LAPACK routine to compute sqrt(x**2+y**2) carefully.
  109. c dlarf LAPACK routine that applies Householder reflection to
  110. c a matrix.
  111. c dlarfg LAPACK Householder reflection construction routine.
  112. c dlartg LAPACK Givens rotation construction routine.
  113. c dlaset LAPACK matrix initialization routine.
  114. c dgemv Level 2 BLAS routine for matrix vector multiplication.
  115. c daxpy Level 1 BLAS that computes a vector triad.
  116. c dcopy Level 1 BLAS that copies one vector to another .
  117. c dscal Level 1 BLAS that scales a vector.
  118. c
  119. c\Author
  120. c Danny Sorensen Phuong Vu
  121. c Richard Lehoucq CRPC / Rice University
  122. c Dept. of Computational & Houston, Texas
  123. c Applied Mathematics
  124. c Rice University
  125. c Houston, Texas
  126. c
  127. c\Revision history:
  128. c xx/xx/92: Version ' 2.4'
  129. c
  130. c\SCCS Information: @(#)
  131. c FILE: napps.F SID: 2.4 DATE OF SID: 3/28/97 RELEASE: 2
  132. c
  133. c\Remarks
  134. c 1. In this version, each shift is applied to all the sublocks of
  135. c the Hessenberg matrix H and not just to the submatrix that it
  136. c comes from. Deflation as in LAPACK routine dlahqr (QR algorithm
  137. c for upper Hessenberg matrices ) is used.
  138. c The subdiagonals of H are enforced to be non-negative.
  139. c
  140. c\EndLib
  141. c
  142. c-----------------------------------------------------------------------
  143. c
  144. subroutine dnapps
  145. & ( n, kev, np, shiftr, shifti, v, ldv, h, ldh, resid, q, ldq,
  146. & workl, workd )
  147. c
  148. c %----------------------------------------------------%
  149. c | Include files for debugging and timing information |
  150. c -INC TARTRAK
  151. c %----------------------------------------------------%
  152. c
  153. c
  154. c %------------------%
  155. c | Scalar Arguments |
  156. c %------------------%
  157. c
  158. integer kev, ldh, ldq, ldv, n, np
  159. c
  160. c %-----------------%
  161. c | Array Arguments |
  162. c %-----------------%
  163. c
  164. REAL*8
  165. & h(ldh,kev+np), resid(n), shifti(np), shiftr(np),
  166. & v(ldv,kev+np), q(ldq,kev+np), workd(2*n), workl(kev+np)
  167. c
  168. c %------------%
  169. c | Parameters |
  170. c %------------%
  171. c
  172. REAL*8
  173. & one, zero
  174. parameter (one = 1.0D+0, zero = 0.0D+0)
  175. c
  176. c %------------------------%
  177. c | Local Scalars & Arrays |
  178. c %------------------------%
  179. c
  180. integer i, iend, ir, istart, j, jj, kplusp, msglvl, nr
  181. logical cconj, first
  182. REAL*8
  183. & c, f, g, h11, h12, h21, h22, h32, ovfl, r, s, sigmai,
  184. & sigmar, smlnum, ulp, unfl, u(3), t, tau, tst1
  185. save first, ovfl, smlnum, ulp, unfl
  186. parameter (msglvl=0)
  187. c
  188. c %----------------------%
  189. c | External Subroutines |
  190. c %----------------------%
  191. c
  192. external daxpy, dcopy, dscal,
  193. c
  194. c %--------------------%
  195. c | External Functions |
  196. c %--------------------%
  197. c
  198. REAL*8
  199. external dlamch, dlanhs, dlapy2
  200. c
  201. c %----------------------%
  202. **c | Intrinsics Functions |
  203. **c %----------------------%
  204. **c
  205. ** intrinsic abs, max, min
  206. **c
  207. **c %----------------%
  208. **c | Data statments |
  209. **c %----------------%
  210. **c
  211. data first / .true. /
  212. **c
  213. **c %-----------------------%
  214. **c | Executable Statements |
  215. c %-----------------------%
  216. c
  217. if (first) then
  218. c
  219. c %-----------------------------------------------%
  220. c | Set machine-dependent constants for the |
  221. c | stopping criterion. If norm(H) <= sqrt(OVFL), |
  222. c | overflow should not occur. |
  223. c | REFERENCE: LAPACK subroutine dlahqr |
  224. c %-----------------------------------------------%
  225. c
  226. unfl = dlamch( 'safe minimum' )
  227. ovfl = one / unfl
  228. call dlabad( unfl, ovfl )
  229. ulp = dlamch( 'precision' )
  230. smlnum = unfl*( n / ulp )
  231. first = .false.
  232. end if
  233. c
  234. c %-------------------------------%
  235. c | Initialize timing statistics |
  236. c | & message level for debugging |
  237. c %-------------------------------%
  238. c
  239. * call arscnd (t0)
  240. c msglvl = mnapps
  241. kplusp = kev + np
  242. c
  243. c %--------------------------------------------%
  244. c | Initialize Q to the identity to accumulate |
  245. c | the rotations and reflections |
  246. c %--------------------------------------------%
  247. c
  248. call dlaset ('All', kplusp, kplusp, zero, one, q, ldq)
  249. c
  250. c %----------------------------------------------%
  251. c | Quick return if there are no shifts to apply |
  252. c %----------------------------------------------%
  253. c
  254. if (np .eq. 0) go to 9000
  255. c
  256. c %----------------------------------------------%
  257. c | Chase the bulge with the application of each |
  258. c | implicit shift. Each shift is applied to the |
  259. c | whole matrix including each block. |
  260. c %----------------------------------------------%
  261. c
  262. cconj = .false.
  263. do 110 jj = 1, np
  264. sigmar = shiftr(jj)
  265. sigmai = shifti(jj)
  266. c
  267. c if (msglvl .gt. 2 ) then
  268. c call ivout ( 1, jj, ndigit,
  269. c & '_napps: shift number.')
  270. c call dvout ( 1, sigmar, ndigit,
  271. c & '_napps: The real part of the shift ')
  272. c call dvout ( 1, sigmai, ndigit,
  273. c & '_napps: The imaginary part of the shift ')
  274. c end if
  275. c
  276. c %-------------------------------------------------%
  277. c | The following set of conditionals is necessary |
  278. c | in order that complex conjugate pairs of shifts |
  279. c | are applied together or not at all. |
  280. c %-------------------------------------------------%
  281. c
  282. if ( cconj ) then
  283. c
  284. c %-----------------------------------------%
  285. c | cconj = .true. means the previous shift |
  286. c | had non-zero imaginary part. |
  287. c %-----------------------------------------%
  288. c
  289. cconj = .false.
  290. go to 110
  291. else if ( jj .lt. np .and. abs( sigmai ) .gt. zero ) then
  292. c
  293. c %------------------------------------%
  294. c | Start of a complex conjugate pair. |
  295. c %------------------------------------%
  296. c
  297. cconj = .true.
  298. else if ( jj .eq. np .and. abs( sigmai ) .gt. zero ) then
  299. c
  300. c %----------------------------------------------%
  301. c | The last shift has a nonzero imaginary part. |
  302. c | Don't apply it; thus the order of the |
  303. c | compressed H is order KEV+1 since only np-1 |
  304. c | were applied. |
  305. c %----------------------------------------------%
  306. c
  307. kev = kev + 1
  308. go to 110
  309. end if
  310. istart = 1
  311. 20 continue
  312. c
  313. c %--------------------------------------------------%
  314. c | if sigmai = 0 then |
  315. c | Apply the jj-th shift ... |
  316. c | else |
  317. c | Apply the jj-th and (jj+1)-th together ... |
  318. c | (Note that jj < np at this point in the code) |
  319. c | end |
  320. c | to the current block of H. The next do loop |
  321. c | determines the current block ; |
  322. c %--------------------------------------------------%
  323. c
  324. do 30 i = istart, kplusp-1
  325. c
  326. c %----------------------------------------%
  327. c | Check for splitting and deflation. Use |
  328. c | a standard test as in the QR algorithm |
  329. c | REFERENCE: LAPACK subroutine dlahqr |
  330. c %----------------------------------------%
  331. c
  332. tst1 = abs( h( i, i ) ) + abs( h( i+1, i+1 ) )
  333. if( tst1.eq.zero )
  334. & tst1 = dlanhs( '1', kplusp-jj+1, h, ldh, workl )
  335. if( abs( h( i+1,i ) ).le.max( ulp*tst1, smlnum ) ) then
  336. if (msglvl .gt. 0) then
  337. call ivout ( 1, i, ndigit,
  338. & '_napps: matrix splitting at row/column no.')
  339. call ivout ( 1, jj, ndigit,
  340. & '_napps: matrix splitting with shift number.')
  341. call dvout ( 1, h(i+1,i), ndigit,
  342. & '_napps: off diagonal element.')
  343. end if
  344. iend = i
  345. h(i+1,i) = zero
  346. go to 40
  347. end if
  348. 30 continue
  349. iend = kplusp
  350. 40 continue
  351. c
  352. c if (msglvl .gt. 2) then
  353. c call ivout ( 1, istart, ndigit,
  354. c & '_napps: Start of current block ')
  355. c call ivout ( 1, iend, ndigit,
  356. c & '_napps: End of current block ')
  357. c end if
  358. c
  359. c %------------------------------------------------%
  360. c | No reason to apply a shift to block of order 1 |
  361. c %------------------------------------------------%
  362. c
  363. if ( istart .eq. iend ) go to 100
  364. c
  365. c %------------------------------------------------------%
  366. c | If istart + 1 = iend then no reason to apply a |
  367. c | complex conjugate pair of shifts on a 2 by 2 matrix. |
  368. c %------------------------------------------------------%
  369. c
  370. if ( istart + 1 .eq. iend .and. abs( sigmai ) .gt. zero )
  371. & go to 100
  372. c
  373. h11 = h(istart,istart)
  374. h21 = h(istart+1,istart)
  375. if ( abs( sigmai ) .le. zero ) then
  376. c
  377. c %---------------------------------------------%
  378. c | Real-valued shift ==> apply single shift QR |
  379. c %---------------------------------------------%
  380. c
  381. f = h11 - sigmar
  382. g = h21
  383. c
  384. do 80 i = istart, iend-1
  385. c
  386. c %-----------------------------------------------------%
  387. c | Contruct the plane rotation G to zero out the bulge |
  388. c %-----------------------------------------------------%
  389. c
  390. call dlartg (f, g, c, s, r)
  391. if (i .gt. istart) then
  392. c
  393. c %-------------------------------------------%
  394. c | The following ensures that h(1:iend-1,1), |
  395. c | the first iend-2 off diagonal of elements |
  396. c | H, remain non negative. |
  397. c %-------------------------------------------%
  398. c
  399. if (r .lt. zero) then
  400. r = -r
  401. c = -c
  402. s = -s
  403. end if
  404. h(i,i-1) = r
  405. h(i+1,i-1) = zero
  406. end if
  407. c
  408. c %---------------------------------------------%
  409. c | Apply rotation to the left of H; H <- G'*H |
  410. c %---------------------------------------------%
  411. c
  412. do 50 j = i, kplusp
  413. t = c*h(i,j) + s*h(i+1,j)
  414. h(i+1,j) = -s*h(i,j) + c*h(i+1,j)
  415. h(i,j) = t
  416. 50 continue
  417. c
  418. c %---------------------------------------------%
  419. c | Apply rotation to the right of H; H <- H*G |
  420. c %---------------------------------------------%
  421. c
  422. do 60 j = 1, min(i+2,iend)
  423. t = c*h(j,i) + s*h(j,i+1)
  424. h(j,i+1) = -s*h(j,i) + c*h(j,i+1)
  425. h(j,i) = t
  426. 60 continue
  427. c
  428. c %----------------------------------------------------%
  429. c | Accumulate the rotation in the matrix Q; Q <- Q*G |
  430. c %----------------------------------------------------%
  431. c
  432. do 70 j = 1, min( i+jj, kplusp )
  433. t = c*q(j,i) + s*q(j,i+1)
  434. q(j,i+1) = - s*q(j,i) + c*q(j,i+1)
  435. q(j,i) = t
  436. 70 continue
  437. c
  438. c %---------------------------%
  439. c | Prepare for next rotation |
  440. c %---------------------------%
  441. c
  442. if (i .lt. iend-1) then
  443. f = h(i+1,i)
  444. g = h(i+2,i)
  445. end if
  446. 80 continue
  447. c
  448. c %-----------------------------------%
  449. c | Finished applying the real shift. |
  450. c %-----------------------------------%
  451. c
  452. else
  453. c
  454. c %----------------------------------------------------%
  455. c | Complex conjugate shifts ==> apply double shift QR |
  456. c %----------------------------------------------------%
  457. c
  458. h12 = h(istart,istart+1)
  459. h22 = h(istart+1,istart+1)
  460. h32 = h(istart+2,istart+1)
  461. c
  462. c %---------------------------------------------------------%
  463. c | Compute 1st column of (H - shift*I)*(H - conj(shift)*I) |
  464. c %---------------------------------------------------------%
  465. c
  466. s = 2.0*sigmar
  467. t = dlapy2 ( sigmar, sigmai )
  468. u(1) = ( h11 * (h11 - s) + t * t ) / h21 + h12
  469. u(2) = h11 + h22 - s
  470. u(3) = h32
  471. c
  472. do 90 i = istart, iend-1
  473. c
  474. nr = min ( 3, iend-i+1 )
  475. c
  476. c %-----------------------------------------------------%
  477. c | Construct Householder reflector G to zero out u(1). |
  478. c | G is of the form I - tau*( 1 u )' * ( 1 u' ). |
  479. c %-----------------------------------------------------%
  480. c
  481. call dlarfg ( nr, u(1), u(2), 1, tau )
  482. c
  483. if (i .gt. istart) then
  484. h(i,i-1) = u(1)
  485. h(i+1,i-1) = zero
  486. if (i .lt. iend-1) h(i+2,i-1) = zero
  487. end if
  488. u(1) = one
  489. c
  490. c %--------------------------------------%
  491. c | Apply the reflector to the left of H |
  492. c %--------------------------------------%
  493. c
  494. call dlarf ('Left', nr, kplusp-i+1, u, 1, tau,
  495. & h(i,i), ldh, workl)
  496. c
  497. c %---------------------------------------%
  498. c | Apply the reflector to the right of H |
  499. c %---------------------------------------%
  500. c
  501. ir = min ( i+3, iend )
  502. call dlarf ('Right', ir, nr, u, 1, tau,
  503. & h(1,i), ldh, workl)
  504. c
  505. c %-----------------------------------------------------%
  506. c | Accumulate the reflector in the matrix Q; Q <- Q*G |
  507. c %-----------------------------------------------------%
  508. c
  509. call dlarf ('Right', kplusp, nr, u, 1, tau,
  510. & q(1,i), ldq, workl)
  511. c
  512. c %----------------------------%
  513. c | Prepare for next reflector |
  514. c %----------------------------%
  515. c
  516. if (i .lt. iend-1) then
  517. u(1) = h(i+1,i)
  518. u(2) = h(i+2,i)
  519. if (i .lt. iend-2) u(3) = h(i+3,i)
  520. end if
  521. c
  522. 90 continue
  523. c
  524. c %--------------------------------------------%
  525. c | Finished applying a complex pair of shifts |
  526. c | to the current block |
  527. c %--------------------------------------------%
  528. c
  529. end if
  530. c
  531. 100 continue
  532. c
  533. c %---------------------------------------------------------%
  534. c | Apply the same shift to the next block if there is any. |
  535. c %---------------------------------------------------------%
  536. c
  537. istart = iend + 1
  538. if (iend .lt. kplusp) go to 20
  539. c
  540. c %---------------------------------------------%
  541. c | Loop back to the top to get the next shift. |
  542. c %---------------------------------------------%
  543. c
  544. 110 continue
  545. c
  546. c %--------------------------------------------------%
  547. c | Perform a similarity transformation that makes |
  548. c | sure that H will have non negative sub diagonals |
  549. c %--------------------------------------------------%
  550. c
  551. do 120 j=1,kev
  552. if ( h(j+1,j) .lt. zero ) then
  553. call dscal( kplusp-j+1, -one, h(j+1,j), ldh )
  554. call dscal( min(j+2, kplusp), -one, h(1,j+1), 1 )
  555. call dscal( min(j+np+1,kplusp), -one, q(1,j+1), 1 )
  556. end if
  557. 120 continue
  558. c
  559. do 130 i = 1, kev
  560. c
  561. c %--------------------------------------------%
  562. c | Final check for splitting and deflation. |
  563. c | Use a standard test as in the QR algorithm |
  564. c | REFERENCE: LAPACK subroutine dlahqr |
  565. c %--------------------------------------------%
  566. c
  567. tst1 = abs( h( i, i ) ) + abs( h( i+1, i+1 ) )
  568. if( tst1.eq.zero )
  569. & tst1 = dlanhs( '1', kev, h, ldh, workl )
  570. if( h( i+1,i ) .le. max( ulp*tst1, smlnum ) )
  571. & h(i+1,i) = zero
  572. 130 continue
  573. c
  574. c %-------------------------------------------------%
  575. c | Compute the (kev+1)-st column of (V*Q) and |
  576. c | temporarily store the result in WORKD(N+1:2*N). |
  577. c | This is needed in the residual update since we |
  578. c | cannot GUARANTEE that the corresponding entry |
  579. c | of H would be zero as in exact arithmetic. |
  580. c %-------------------------------------------------%
  581. c
  582. if (h(kev+1,kev) .gt. zero)
  583. & call dgemv ('N', n, kplusp, one, v, ldv, q(1,kev+1), 1, zero,
  584. & workd(n+1), 1)
  585. c
  586. c %----------------------------------------------------------%
  587. c | Compute column 1 to kev of (V*Q) in backward order |
  588. c | taking advantage of the upper Hessenberg structure of Q. |
  589. c %----------------------------------------------------------%
  590. c
  591. do 140 i = 1, kev
  592. call dgemv ('N', n, kplusp-i+1, one, v, ldv,
  593. & q(1,kev-i+1), 1, zero, workd, 1)
  594. call dcopy (n, workd, 1, v(1,kplusp-i+1), 1)
  595. 140 continue
  596. c
  597. c %-------------------------------------------------%
  598. c | Move v(:,kplusp-kev+1:kplusp) into v(:,1:kev). |
  599. c %-------------------------------------------------%
  600. c
  601. call dlacpy ('A', n, kev, v(1,kplusp-kev+1), ldv, v, ldv)
  602. c
  603. c %--------------------------------------------------------------%
  604. c | Copy the (kev+1)-st column of (V*Q) in the appropriate place |
  605. c %--------------------------------------------------------------%
  606. c
  607. if (h(kev+1,kev) .gt. zero)
  608. & call dcopy (n, workd(n+1), 1, v(1,kev+1), 1)
  609. c
  610. c %-------------------------------------%
  611. c | Update the residual vector: |
  612. c | r <- sigmak*r + betak*v(:,kev+1) |
  613. c | where |
  614. c | sigmak = (e_{kplusp}'*Q)*e_{kev} |
  615. c | betak = e_{kev+1}'*H*e_{kev} |
  616. c %-------------------------------------%
  617. c
  618. call dscal (n, q(kplusp,kev), resid, 1)
  619. if (h(kev+1,kev) .gt. zero)
  620. & call daxpy (n, h(kev+1,kev), v(1,kev+1), 1, resid, 1)
  621. c
  622. c if (msglvl .gt. 1) then
  623. c call dvout ( 1, q(kplusp,kev), ndigit,
  624. c & '_napps: sigmak = (e_{kev+p}^T*Q)*e_{kev}')
  625. c call dvout ( 1, h(kev+1,kev), ndigit,
  626. c & '_napps: betak = e_{kev+1}^T*H*e_{kev}')
  627. c call ivout ( 1, kev, ndigit,
  628. c & '_napps: Order of the final Hessenberg matrix ')
  629. c if (msglvl .gt. 2) then
  630. c call dmout (logfil, kev, kev, h, ldh, ndigit,
  631. c & '_napps: updated Hessenberg matrix H for next iteration')
  632. c end if
  633. c c
  634. c end if
  635. c
  636. 9000 continue
  637. * call arscnd (t1)
  638. c tnapps = tnapps + (t1 - t0)
  639. c
  640. return
  641. c
  642. c %---------------%
  643. c | End of dnapps |
  644. c %---------------%
  645. c
  646. end
  647.  
  648.  
  649.  
  650.  
  651.  

© Cast3M 2003 - Tous droits réservés.
Mentions légales