blas_agmg_win.f
上传用户:qi_qi_qi_
上传日期:2021-11-15
资源大小:35k
文件大小:13k
源码类别:

网格计算

开发平台:

Windows_Unix

  1.       SUBROUTINE DTPSV(UPLO,TRANS,DIAG,N,AP,X,INCX)
  2. *     .. Scalar Arguments ..
  3.       INTEGER INCX,N
  4.       CHARACTER DIAG,TRANS,UPLO
  5. *     ..
  6. *     .. Array Arguments ..
  7.       DOUBLE PRECISION AP(*),X(*)
  8. *     ..
  9. *
  10. *  Purpose
  11. *  =======
  12. *
  13. *  DTPSV  solves one of the systems of equations
  14. *
  15. *     A*x = b,   or   A'*x = b,
  16. *
  17. *  where b and x are n element vectors and A is an n by n unit, or
  18. *  non-unit, upper or lower triangular matrix, supplied in packed form.
  19. *
  20. *  No test for singularity or near-singularity is included in this
  21. *  routine. Such tests must be performed before calling this routine.
  22. *
  23. *  Arguments
  24. *  ==========
  25. *
  26. *  UPLO   - CHARACTER*1.
  27. *           On entry, UPLO specifies whether the matrix is an upper or
  28. *           lower triangular matrix as follows:
  29. *
  30. *              UPLO = 'U' or 'u'   A is an upper triangular matrix.
  31. *
  32. *              UPLO = 'L' or 'l'   A is a lower triangular matrix.
  33. *
  34. *           Unchanged on exit.
  35. *
  36. *  TRANS  - CHARACTER*1.
  37. *           On entry, TRANS specifies the equations to be solved as
  38. *           follows:
  39. *
  40. *              TRANS = 'N' or 'n'   A*x = b.
  41. *
  42. *              TRANS = 'T' or 't'   A'*x = b.
  43. *
  44. *              TRANS = 'C' or 'c'   A'*x = b.
  45. *
  46. *           Unchanged on exit.
  47. *
  48. *  DIAG   - CHARACTER*1.
  49. *           On entry, DIAG specifies whether or not A is unit
  50. *           triangular as follows:
  51. *
  52. *              DIAG = 'U' or 'u'   A is assumed to be unit triangular.
  53. *
  54. *              DIAG = 'N' or 'n'   A is not assumed to be unit
  55. *                                  triangular.
  56. *
  57. *           Unchanged on exit.
  58. *
  59. *  N      - INTEGER.
  60. *           On entry, N specifies the order of the matrix A.
  61. *           N must be at least zero.
  62. *           Unchanged on exit.
  63. *
  64. *  AP     - DOUBLE PRECISION array of DIMENSION at least
  65. *           ( ( n*( n + 1 ) )/2 ).
  66. *           Before entry with  UPLO = 'U' or 'u', the array AP must
  67. *           contain the upper triangular matrix packed sequentially,
  68. *           column by column, so that AP( 1 ) contains a( 1, 1 ),
  69. *           AP( 2 ) and AP( 3 ) contain a( 1, 2 ) and a( 2, 2 )
  70. *           respectively, and so on.
  71. *           Before entry with UPLO = 'L' or 'l', the array AP must
  72. *           contain the lower triangular matrix packed sequentially,
  73. *           column by column, so that AP( 1 ) contains a( 1, 1 ),
  74. *           AP( 2 ) and AP( 3 ) contain a( 2, 1 ) and a( 3, 1 )
  75. *           respectively, and so on.
  76. *           Note that when  DIAG = 'U' or 'u', the diagonal elements of
  77. *           A are not referenced, but are assumed to be unity.
  78. *           Unchanged on exit.
  79. *
  80. *  X      - DOUBLE PRECISION array of dimension at least
  81. *           ( 1 + ( n - 1 )*abs( INCX ) ).
  82. *           Before entry, the incremented array X must contain the n
  83. *           element right-hand side vector b. On exit, X is overwritten
  84. *           with the solution vector x.
  85. *
  86. *  INCX   - INTEGER.
  87. *           On entry, INCX specifies the increment for the elements of
  88. *           X. INCX must not be zero.
  89. *           Unchanged on exit.
  90. *
  91. *
  92. *  Level 2 Blas routine.
  93. *
  94. *  -- Written on 22-October-1986.
  95. *     Jack Dongarra, Argonne National Lab.
  96. *     Jeremy Du Croz, Nag Central Office.
  97. *     Sven Hammarling, Nag Central Office.
  98. *     Richard Hanson, Sandia National Labs.
  99. *
  100. *
  101. *     .. Parameters ..
  102.       DOUBLE PRECISION ZERO
  103.       PARAMETER (ZERO=0.0D+0)
  104. *     ..
  105. *     .. Local Scalars ..
  106.       DOUBLE PRECISION TEMP
  107.       INTEGER I,INFO,IX,J,JX,K,KK,KX
  108.       LOGICAL NOUNIT
  109. *     ..
  110. *     .. External Functions ..
  111.       LOGICAL LSAME
  112.       EXTERNAL LSAME
  113. *     ..
  114. *     .. External Subroutines ..
  115.       EXTERNAL XERBLA
  116. *     ..
  117. *
  118. *     Test the input parameters.
  119. *
  120.       INFO = 0
  121.       IF (.NOT.LSAME(UPLO,'U') .AND. .NOT.LSAME(UPLO,'L')) THEN
  122.           INFO = 1
  123.       ELSE IF (.NOT.LSAME(TRANS,'N') .AND. .NOT.LSAME(TRANS,'T') .AND.
  124.      +         .NOT.LSAME(TRANS,'C')) THEN
  125.           INFO = 2
  126.       ELSE IF (.NOT.LSAME(DIAG,'U') .AND. .NOT.LSAME(DIAG,'N')) THEN
  127.           INFO = 3
  128.       ELSE IF (N.LT.0) THEN
  129.           INFO = 4
  130.       ELSE IF (INCX.EQ.0) THEN
  131.           INFO = 7
  132.       END IF
  133.       IF (INFO.NE.0) THEN
  134.           CALL XERBLA('DTPSV ',INFO)
  135.           RETURN
  136.       END IF
  137. *
  138. *     Quick return if possible.
  139. *
  140.       IF (N.EQ.0) RETURN
  141. *
  142.       NOUNIT = LSAME(DIAG,'N')
  143. *
  144. *     Set up the start point in X if the increment is not unity. This
  145. *     will be  ( N - 1 )*INCX  too small for descending loops.
  146. *
  147.       IF (INCX.LE.0) THEN
  148.           KX = 1 - (N-1)*INCX
  149.       ELSE IF (INCX.NE.1) THEN
  150.           KX = 1
  151.       END IF
  152. *
  153. *     Start the operations. In this version the elements of AP are
  154. *     accessed sequentially with one pass through AP.
  155. *
  156.       IF (LSAME(TRANS,'N')) THEN
  157. *
  158. *        Form  x := inv( A )*x.
  159. *
  160.           IF (LSAME(UPLO,'U')) THEN
  161.               KK = (N* (N+1))/2
  162.               IF (INCX.EQ.1) THEN
  163.                   DO 20 J = N,1,-1
  164.                       IF (X(J).NE.ZERO) THEN
  165.                           IF (NOUNIT) X(J) = X(J)/AP(KK)
  166.                           TEMP = X(J)
  167.                           K = KK - 1
  168.                           DO 10 I = J - 1,1,-1
  169.                               X(I) = X(I) - TEMP*AP(K)
  170.                               K = K - 1
  171.    10                     CONTINUE
  172.                       END IF
  173.                       KK = KK - J
  174.    20             CONTINUE
  175.               ELSE
  176.                   JX = KX + (N-1)*INCX
  177.                   DO 40 J = N,1,-1
  178.                       IF (X(JX).NE.ZERO) THEN
  179.                           IF (NOUNIT) X(JX) = X(JX)/AP(KK)
  180.                           TEMP = X(JX)
  181.                           IX = JX
  182.                           DO 30 K = KK - 1,KK - J + 1,-1
  183.                               IX = IX - INCX
  184.                               X(IX) = X(IX) - TEMP*AP(K)
  185.    30                     CONTINUE
  186.                       END IF
  187.                       JX = JX - INCX
  188.                       KK = KK - J
  189.    40             CONTINUE
  190.               END IF
  191.           ELSE
  192.               KK = 1
  193.               IF (INCX.EQ.1) THEN
  194.                   DO 60 J = 1,N
  195.                       IF (X(J).NE.ZERO) THEN
  196.                           IF (NOUNIT) X(J) = X(J)/AP(KK)
  197.                           TEMP = X(J)
  198.                           K = KK + 1
  199.                           DO 50 I = J + 1,N
  200.                               X(I) = X(I) - TEMP*AP(K)
  201.                               K = K + 1
  202.    50                     CONTINUE
  203.                       END IF
  204.                       KK = KK + (N-J+1)
  205.    60             CONTINUE
  206.               ELSE
  207.                   JX = KX
  208.                   DO 80 J = 1,N
  209.                       IF (X(JX).NE.ZERO) THEN
  210.                           IF (NOUNIT) X(JX) = X(JX)/AP(KK)
  211.                           TEMP = X(JX)
  212.                           IX = JX
  213.                           DO 70 K = KK + 1,KK + N - J
  214.                               IX = IX + INCX
  215.                               X(IX) = X(IX) - TEMP*AP(K)
  216.    70                     CONTINUE
  217.                       END IF
  218.                       JX = JX + INCX
  219.                       KK = KK + (N-J+1)
  220.    80             CONTINUE
  221.               END IF
  222.           END IF
  223.       ELSE
  224. *
  225. *        Form  x := inv( A' )*x.
  226. *
  227.           IF (LSAME(UPLO,'U')) THEN
  228.               KK = 1
  229.               IF (INCX.EQ.1) THEN
  230.                   DO 100 J = 1,N
  231.                       TEMP = X(J)
  232.                       K = KK
  233.                       DO 90 I = 1,J - 1
  234.                           TEMP = TEMP - AP(K)*X(I)
  235.                           K = K + 1
  236.    90                 CONTINUE
  237.                       IF (NOUNIT) TEMP = TEMP/AP(KK+J-1)
  238.                       X(J) = TEMP
  239.                       KK = KK + J
  240.   100             CONTINUE
  241.               ELSE
  242.                   JX = KX
  243.                   DO 120 J = 1,N
  244.                       TEMP = X(JX)
  245.                       IX = KX
  246.                       DO 110 K = KK,KK + J - 2
  247.                           TEMP = TEMP - AP(K)*X(IX)
  248.                           IX = IX + INCX
  249.   110                 CONTINUE
  250.                       IF (NOUNIT) TEMP = TEMP/AP(KK+J-1)
  251.                       X(JX) = TEMP
  252.                       JX = JX + INCX
  253.                       KK = KK + J
  254.   120             CONTINUE
  255.               END IF
  256.           ELSE
  257.               KK = (N* (N+1))/2
  258.               IF (INCX.EQ.1) THEN
  259.                   DO 140 J = N,1,-1
  260.                       TEMP = X(J)
  261.                       K = KK
  262.                       DO 130 I = N,J + 1,-1
  263.                           TEMP = TEMP - AP(K)*X(I)
  264.                           K = K - 1
  265.   130                 CONTINUE
  266.                       IF (NOUNIT) TEMP = TEMP/AP(KK-N+J)
  267.                       X(J) = TEMP
  268.                       KK = KK - (N-J+1)
  269.   140             CONTINUE
  270.               ELSE
  271.                   KX = KX + (N-1)*INCX
  272.                   JX = KX
  273.                   DO 160 J = N,1,-1
  274.                       TEMP = X(JX)
  275.                       IX = KX
  276.                       DO 150 K = KK,KK - (N- (J+1)),-1
  277.                           TEMP = TEMP - AP(K)*X(IX)
  278.                           IX = IX - INCX
  279.   150                 CONTINUE
  280.                       IF (NOUNIT) TEMP = TEMP/AP(KK-N+J)
  281.                       X(JX) = TEMP
  282.                       JX = JX - INCX
  283.                       KK = KK - (N-J+1)
  284.   160             CONTINUE
  285.               END IF
  286.           END IF
  287.       END IF
  288. *
  289.       RETURN
  290. *
  291. *     End of DTPSV .
  292. *
  293.       END
  294.       LOGICAL          FUNCTION LSAME( CA, CB )
  295. *
  296. *  -- LAPACK auxiliary routine (version 3.1) --
  297. *     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
  298. *     November 2006
  299. *
  300. *     .. Scalar Arguments ..
  301.       CHARACTER          CA, CB
  302. *     ..
  303. *
  304. *  Purpose
  305. *  =======
  306. *
  307. *  LSAME returns .TRUE. if CA is the same letter as CB regardless of
  308. *  case.
  309. *
  310. *  Arguments
  311. *  =========
  312. *
  313. *  CA      (input) CHARACTER*1
  314. *  CB      (input) CHARACTER*1
  315. *          CA and CB specify the single characters to be compared.
  316. *
  317. * =====================================================================
  318. *
  319. *     .. Intrinsic Functions ..
  320.       INTRINSIC          ICHAR
  321. *     ..
  322. *     .. Local Scalars ..
  323.       INTEGER            INTA, INTB, ZCODE
  324. *     ..
  325. *     .. Executable Statements ..
  326. *
  327. *     Test if the characters are equal
  328. *
  329.       LSAME = CA.EQ.CB
  330.       IF( LSAME )
  331.      $   RETURN
  332. *
  333. *     Now test for equivalence if both characters are alphabetic.
  334. *
  335.       ZCODE = ICHAR( 'Z' )
  336. *
  337. *     Use 'Z' rather than 'A' so that ASCII can be detected on Prime
  338. *     machines, on which ICHAR returns a value with bit 8 set.
  339. *     ICHAR('A') on Prime machines returns 193 which is the same as
  340. *     ICHAR('A') on an EBCDIC machine.
  341. *
  342.       INTA = ICHAR( CA )
  343.       INTB = ICHAR( CB )
  344. *
  345.       IF( ZCODE.EQ.90 .OR. ZCODE.EQ.122 ) THEN
  346. *
  347. *        ASCII is assumed - ZCODE is the ASCII code of either lower or
  348. *        upper case 'Z'.
  349. *
  350.          IF( INTA.GE.97 .AND. INTA.LE.122 ) INTA = INTA - 32
  351.          IF( INTB.GE.97 .AND. INTB.LE.122 ) INTB = INTB - 32
  352. *
  353.       ELSE IF( ZCODE.EQ.233 .OR. ZCODE.EQ.169 ) THEN
  354. *
  355. *        EBCDIC is assumed - ZCODE is the EBCDIC code of either lower or
  356. *        upper case 'Z'.
  357. *
  358.          IF( INTA.GE.129 .AND. INTA.LE.137 .OR.
  359.      $       INTA.GE.145 .AND. INTA.LE.153 .OR.
  360.      $       INTA.GE.162 .AND. INTA.LE.169 ) INTA = INTA + 64
  361.          IF( INTB.GE.129 .AND. INTB.LE.137 .OR.
  362.      $       INTB.GE.145 .AND. INTB.LE.153 .OR.
  363.      $       INTB.GE.162 .AND. INTB.LE.169 ) INTB = INTB + 64
  364. *
  365.       ELSE IF( ZCODE.EQ.218 .OR. ZCODE.EQ.250 ) THEN
  366. *
  367. *        ASCII is assumed, on Prime machines - ZCODE is the ASCII code
  368. *        plus 128 of either lower or upper case 'Z'.
  369. *
  370.          IF( INTA.GE.225 .AND. INTA.LE.250 ) INTA = INTA - 32
  371.          IF( INTB.GE.225 .AND. INTB.LE.250 ) INTB = INTB - 32
  372.       END IF
  373.       LSAME = INTA.EQ.INTB
  374. *
  375. *     RETURN
  376. *
  377. *     End of LSAME
  378. *
  379.       END
  380.       SUBROUTINE XERBLA( SRNAME, INFO )
  381. *
  382. *  -- LAPACK auxiliary routine (version 3.1) --
  383. *     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
  384. *     November 2006
  385. *
  386. *     .. Scalar Arguments ..
  387.       CHARACTER*6        SRNAME
  388.       INTEGER            INFO
  389. *     ..
  390. *
  391. *  Purpose
  392. *  =======
  393. *
  394. *  XERBLA  is an error handler for the LAPACK routines.
  395. *  It is called by an LAPACK routine if an input parameter has an
  396. *  invalid value.  A message is printed and execution stops.
  397. *
  398. *  Installers may consider modifying the STOP statement in order to
  399. *  call system-specific exception-handling facilities.
  400. *
  401. *  Arguments
  402. *  =========
  403. *
  404. *  SRNAME  (input) CHARACTER*6
  405. *          The name of the routine which called XERBLA.
  406. *
  407. *  INFO    (input) INTEGER
  408. *          The position of the invalid parameter in the parameter list
  409. *          of the calling routine.
  410. *
  411. * =====================================================================
  412. *
  413. *     .. Executable Statements ..
  414. *
  415.       WRITE( *, FMT = 9999 )SRNAME, INFO
  416. *
  417.       STOP
  418. *
  419.  9999 FORMAT( ' ** On entry to ', A6, ' parameter number ', I2, ' had ',
  420.      $      'an illegal value' )
  421. *
  422. *     End of XERBLA
  423. *
  424.       END