⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lapack.f

📁 分子动力学程序dynamo
💻 F
📖 第 1 页 / 共 5 页
字号:
*     ..*     .. External Functions ..      LOGICAL            LSAME      DOUBLE PRECISION   DLAMCH      EXTERNAL           LSAME, DLAMCH*     ..*     .. Intrinsic Functions ..      INTRINSIC          ABS, MAX, MIN*     ..*     .. External Subroutines ..      EXTERNAL           XERBLA*     ..*     .. Executable Statements ..**     Test the input arguments*      INFO = 0*      IF( LSAME( TYPE, 'G' ) ) THEN         ITYPE = 0      ELSE IF( LSAME( TYPE, 'L' ) ) THEN         ITYPE = 1      ELSE IF( LSAME( TYPE, 'U' ) ) THEN         ITYPE = 2      ELSE IF( LSAME( TYPE, 'H' ) ) THEN         ITYPE = 3      ELSE IF( LSAME( TYPE, 'B' ) ) THEN         ITYPE = 4      ELSE IF( LSAME( TYPE, 'Q' ) ) THEN         ITYPE = 5      ELSE IF( LSAME( TYPE, 'Z' ) ) THEN         ITYPE = 6      ELSE         ITYPE = -1      END IF*      IF( ITYPE.EQ.-1 ) THEN         INFO = -1      ELSE IF( CFROM.EQ.ZERO ) THEN         INFO = -4      ELSE IF( M.LT.0 ) THEN         INFO = -6      ELSE IF( N.LT.0 .OR. ( ITYPE.EQ.4 .AND. N.NE.M ) .OR.     $         ( ITYPE.EQ.5 .AND. N.NE.M ) ) THEN         INFO = -7      ELSE IF( ITYPE.LE.3 .AND. LDA.LT.MAX( 1, M ) ) THEN         INFO = -9      ELSE IF( ITYPE.GE.4 ) THEN         IF( KL.LT.0 .OR. KL.GT.MAX( M-1, 0 ) ) THEN            INFO = -2         ELSE IF( KU.LT.0 .OR. KU.GT.MAX( N-1, 0 ) .OR.     $            ( ( ITYPE.EQ.4 .OR. ITYPE.EQ.5 ) .AND. KL.NE.KU ) )     $             THEN            INFO = -3         ELSE IF( ( ITYPE.EQ.4 .AND. LDA.LT.KL+1 ) .OR.     $            ( ITYPE.EQ.5 .AND. LDA.LT.KU+1 ) .OR.     $            ( ITYPE.EQ.6 .AND. LDA.LT.2*KL+KU+1 ) ) THEN            INFO = -9         END IF      END IF*      IF( INFO.NE.0 ) THEN         CALL XERBLA( 'DLASCL', -INFO )         RETURN      END IF**     Quick return if possible*      IF( N.EQ.0 .OR. M.EQ.0 )     $   RETURN**     Get machine parameters*      SMLNUM = DLAMCH( 'S' )      BIGNUM = ONE / SMLNUM*      CFROMC = CFROM      CTOC = CTO*   10 CONTINUE      CFROM1 = CFROMC*SMLNUM      CTO1 = CTOC / BIGNUM      IF( ABS( CFROM1 ).GT.ABS( CTOC ) .AND. CTOC.NE.ZERO ) THEN         MUL = SMLNUM         DONE = .FALSE.         CFROMC = CFROM1      ELSE IF( ABS( CTO1 ).GT.ABS( CFROMC ) ) THEN         MUL = BIGNUM         DONE = .FALSE.         CTOC = CTO1      ELSE         MUL = CTOC / CFROMC         DONE = .TRUE.      END IF*      IF( ITYPE.EQ.0 ) THEN**        Full matrix*         DO 30 J = 1, N            DO 20 I = 1, M               A( I, J ) = A( I, J )*MUL   20       CONTINUE   30    CONTINUE*      ELSE IF( ITYPE.EQ.1 ) THEN**        Lower triangular matrix*         DO 50 J = 1, N            DO 40 I = J, M               A( I, J ) = A( I, J )*MUL   40       CONTINUE   50    CONTINUE*      ELSE IF( ITYPE.EQ.2 ) THEN**        Upper triangular matrix*         DO 70 J = 1, N            DO 60 I = 1, MIN( J, M )               A( I, J ) = A( I, J )*MUL   60       CONTINUE   70    CONTINUE*      ELSE IF( ITYPE.EQ.3 ) THEN**        Upper Hessenberg matrix*         DO 90 J = 1, N            DO 80 I = 1, MIN( J+1, M )               A( I, J ) = A( I, J )*MUL   80       CONTINUE   90    CONTINUE*      ELSE IF( ITYPE.EQ.4 ) THEN**        Lower half of a symmetric band matrix*         K3 = KL + 1         K4 = N + 1         DO 110 J = 1, N            DO 100 I = 1, MIN( K3, K4-J )               A( I, J ) = A( I, J )*MUL  100       CONTINUE  110    CONTINUE*      ELSE IF( ITYPE.EQ.5 ) THEN**        Upper half of a symmetric band matrix*         K1 = KU + 2         K3 = KU + 1         DO 130 J = 1, N            DO 120 I = MAX( K1-J, 1 ), K3               A( I, J ) = A( I, J )*MUL  120       CONTINUE  130    CONTINUE*      ELSE IF( ITYPE.EQ.6 ) THEN**        Band matrix*         K1 = KL + KU + 2         K2 = KL + 1         K3 = 2*KL + KU + 1         K4 = KL + KU + 1 + M         DO 150 J = 1, N            DO 140 I = MAX( K1-J, K2 ), MIN( K3, K4-J )               A( I, J ) = A( I, J )*MUL  140       CONTINUE  150    CONTINUE*      END IF*      IF( .NOT.DONE )     $   GO TO 10*      RETURN**     End of DLASCL*      END      SUBROUTINE DLASET( UPLO, M, N, ALPHA, BETA, A, LDA )**  -- LAPACK auxiliary routine (version 2.0) --*     Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd.,*     Courant Institute, Argonne National Lab, and Rice University*     October 31, 1992**     .. Scalar Arguments ..      CHARACTER          UPLO      INTEGER            LDA, M, N      DOUBLE PRECISION   ALPHA, BETA*     ..*     .. Array Arguments ..      DOUBLE PRECISION   A( LDA, * )*     ..**  Purpose*  =======**  DLASET initializes an m-by-n matrix A to BETA on the diagonal and*  ALPHA on the offdiagonals.**  Arguments*  =========**  UPLO    (input) CHARACTER*1*          Specifies the part of the matrix A to be set.*          = 'U':      Upper triangular part is set; the strictly lower*                      triangular part of A is not changed.*          = 'L':      Lower triangular part is set; the strictly upper*                      triangular part of A is not changed.*          Otherwise:  All of the matrix A is set.**  M       (input) INTEGER*          The number of rows of the matrix A.  M >= 0.**  N       (input) INTEGER*          The number of columns of the matrix A.  N >= 0.**  ALPHA   (input) DOUBLE PRECISION*          The constant to which the offdiagonal elements are to be set.**  BETA    (input) DOUBLE PRECISION*          The constant to which the diagonal elements are to be set.**  A       (input/output) DOUBLE PRECISION array, dimension (LDA,N)*          On exit, the leading m-by-n submatrix of A is set as follows:**          if UPLO = 'U', A(i,j) = ALPHA, 1<=i<=j-1, 1<=j<=n,*          if UPLO = 'L', A(i,j) = ALPHA, j+1<=i<=m, 1<=j<=n,*          otherwise,     A(i,j) = ALPHA, 1<=i<=m, 1<=j<=n, i.ne.j,**          and, for all UPLO, A(i,i) = BETA, 1<=i<=min(m,n).**  LDA     (input) INTEGER*          The leading dimension of the array A.  LDA >= max(1,M).** =====================================================================**     .. Local Scalars ..      INTEGER            I, J*     ..*     .. External Functions ..      LOGICAL            LSAME      EXTERNAL           LSAME*     ..*     .. Intrinsic Functions ..      INTRINSIC          MIN*     ..*     .. Executable Statements ..*      IF( LSAME( UPLO, 'U' ) ) THEN**        Set the strictly upper triangular or trapezoidal part of the*        array to ALPHA.*         DO 20 J = 2, N            DO 10 I = 1, MIN( J-1, M )               A( I, J ) = ALPHA   10       CONTINUE   20    CONTINUE*      ELSE IF( LSAME( UPLO, 'L' ) ) THEN**        Set the strictly lower triangular or trapezoidal part of the*        array to ALPHA.*         DO 40 J = 1, MIN( M, N )            DO 30 I = J + 1, M               A( I, J ) = ALPHA   30       CONTINUE   40    CONTINUE*      ELSE**        Set the leading m-by-n submatrix to ALPHA.*         DO 60 J = 1, N            DO 50 I = 1, M               A( I, J ) = ALPHA   50       CONTINUE   60    CONTINUE      END IF**     Set the first min(M,N) diagonal elements to BETA.*      DO 70 I = 1, MIN( M, N )         A( I, I ) = BETA   70 CONTINUE*      RETURN**     End of DLASET*      END      SUBROUTINE DLASR( SIDE, PIVOT, DIRECT, M, N, C, S, A, LDA )**  -- LAPACK auxiliary routine (version 2.0) --*     Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd.,*     Courant Institute, Argonne National Lab, and Rice University*     October 31, 1992**     .. Scalar Arguments ..      CHARACTER          DIRECT, PIVOT, SIDE      INTEGER            LDA, M, N*     ..*     .. Array Arguments ..      DOUBLE PRECISION   A( LDA, * ), C( * ), S( * )*     ..**  Purpose*  =======**  DLASR   performs the transformation**     A := P*A,   when SIDE = 'L' or 'l'  (  Left-hand side )**     A := A*P',  when SIDE = 'R' or 'r'  ( Right-hand side )**  where A is an m by n real matrix and P is an orthogonal matrix,*  consisting of a sequence of plane rotations determined by the*  parameters PIVOT and DIRECT as follows ( z = m when SIDE = 'L' or 'l'*  and z = n when SIDE = 'R' or 'r' ):**  When  DIRECT = 'F' or 'f'  ( Forward sequence ) then**     P = P( z - 1 )*...*P( 2 )*P( 1 ),**  and when DIRECT = 'B' or 'b'  ( Backward sequence ) then**     P = P( 1 )*P( 2 )*...*P( z - 1 ),**  where  P( k ) is a plane rotation matrix for the following planes:**     when  PIVOT = 'V' or 'v'  ( Variable pivot ),*        the plane ( k, k + 1 )**     when  PIVOT = 'T' or 't'  ( Top pivot ),*        the plane ( 1, k + 1 )**     when  PIVOT = 'B' or 'b'  ( Bottom pivot ),*        the plane ( k, z )**  c( k ) and s( k )  must contain the  cosine and sine that define the*  matrix  P( k ).  The two by two plane rotation part of the matrix*  P( k ), R( k ), is assumed to be of the form**     R( k ) = (  c( k )  s( k ) ).*              ( -s( k )  c( k ) )**  This version vectorises across rows of the array A when SIDE = 'L'.**  Arguments*  =========**  SIDE    (input) CHARACTER*1*          Specifies whether the plane rotation matrix P is applied to*          A on the left or the right.*          = 'L':  Left, compute A := P*A*          = 'R':  Right, compute A:= A*P'**  DIRECT  (input) CHARACTER*1*          Specifies whether P is a forward or backward sequence of*          plane rotations.*          = 'F':  Forward, P = P( z - 1 )*...*P( 2 )*P( 1 )*          = 'B':  Backward, P = P( 1 )*P( 2 )*...*P( z - 1 )**  PIVOT   (input) CHARACTER*1*          Specifies the plane for which P(k) is a plane rotation*          matrix.*          = 'V':  Variable pivot, the plane (k,k+1)*          = 'T':  Top pivot, the plane (1,k+1)*          = 'B':  Bottom pivot, the plane (k,z)**  M       (input) INTEGER*          The number of rows of the matrix A.  If m <= 1, an immediate*          return is effected.**  N       (input) INTEGER*          The number of columns of the matrix A.  If n <= 1, an*          immediate return is effected.**  C, S    (input) DOUBLE PRECISION arrays, dimension*                  (M-1) if SIDE = 'L'*                  (N-1) if SIDE = 'R'*          c(k) and s(k) contain the cosine and sine that define the*          matrix P(k).  The two by two plane rotation part of the*          matrix P(k), R(k), is assumed to be of the form*          R( k ) = (  c( k )  s( k ) ).*                   ( -s( k )  c( k ) )**  A       (input/output) DOUBLE PRECISION array, dimension (LDA,N)*          The m by n matrix A.  On exit, A is overwritten by P*A if*          SIDE = 'R' or by A*P' if SIDE = 'L'.**  LDA     (input) INTEGER*          The leading dimension of the array A.  LDA >= max(1,M).**  =====================================================================**     .. Parameters ..      DOUBLE PRECISION   ONE, ZERO      PARAMETER          ( ONE = 1.0D+0, ZERO = 0.0D+0 )*     ..*     .. Local Scalars ..      INTEGER            I, INFO, J      DOUBLE PRECISION   CTEMP, STEMP, TEMP*     ..*     .. External Functions ..      LOGICAL            LSAME      EXTERNAL           LSAME*     ..*     .. External Subroutines ..      EXTERNAL           XERBLA*     ..*     .. Intrinsic Functions ..      INTRINSIC          MAX*     ..*     .. Executable Statements ..**     Test the input parameters*      INFO = 0      IF( .NOT.( LSAME( SIDE, 'L' ) .OR. LSAME( SIDE, 'R' ) ) ) THEN         INFO = 1      ELSE IF( .NOT.( LSAME( PIVOT, 'V' ) .OR. LSAME( PIVOT,     $         'T' ) .OR. LSAME( PIVOT, 'B' ) ) ) THEN         INFO = 2      ELSE IF( .NOT.( LSAME( DIRECT, 'F' ) .OR. LSAME( DIRECT, 'B' ) ) )     $          THEN         INFO = 3      ELSE IF( M.LT.0 ) THEN         INFO = 4      ELSE IF( N.LT.0 ) THEN         INFO = 5      ELSE IF( LDA.LT.MAX( 1, M ) ) THEN         INFO = 9      END IF      IF( INFO.NE.0 ) THEN         CALL XERBLA( 'DLASR ', INFO )         RETURN      END IF**     Quick return if possible*      IF( ( M.EQ.0 ) .OR. ( N.EQ.0 ) )     $   RETURN      IF( LSAME( SIDE, 'L' ) ) THEN*

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -