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

📄 lapack.f

📁 分子动力学程序dynamo
💻 F
📖 第 1 页 / 共 5 页
字号:
*        Form  P * A*         IF( LSAME( PIVOT, 'V' ) ) THEN            IF( LSAME( DIRECT, 'F' ) ) THEN               DO 20 J = 1, M - 1                  CTEMP = C( J )                  STEMP = S( J )                  IF( ( CTEMP.NE.ONE ) .OR. ( STEMP.NE.ZERO ) ) THEN                     DO 10 I = 1, N                        TEMP = A( J+1, I )                        A( J+1, I ) = CTEMP*TEMP - STEMP*A( J, I )                        A( J, I ) = STEMP*TEMP + CTEMP*A( J, I )   10                CONTINUE                  END IF   20          CONTINUE            ELSE IF( LSAME( DIRECT, 'B' ) ) THEN               DO 40 J = M - 1, 1, -1                  CTEMP = C( J )                  STEMP = S( J )                  IF( ( CTEMP.NE.ONE ) .OR. ( STEMP.NE.ZERO ) ) THEN                     DO 30 I = 1, N                        TEMP = A( J+1, I )                        A( J+1, I ) = CTEMP*TEMP - STEMP*A( J, I )                        A( J, I ) = STEMP*TEMP + CTEMP*A( J, I )   30                CONTINUE                  END IF   40          CONTINUE            END IF         ELSE IF( LSAME( PIVOT, 'T' ) ) THEN            IF( LSAME( DIRECT, 'F' ) ) THEN               DO 60 J = 2, M                  CTEMP = C( J-1 )                  STEMP = S( J-1 )                  IF( ( CTEMP.NE.ONE ) .OR. ( STEMP.NE.ZERO ) ) THEN                     DO 50 I = 1, N                        TEMP = A( J, I )                        A( J, I ) = CTEMP*TEMP - STEMP*A( 1, I )                        A( 1, I ) = STEMP*TEMP + CTEMP*A( 1, I )   50                CONTINUE                  END IF   60          CONTINUE            ELSE IF( LSAME( DIRECT, 'B' ) ) THEN               DO 80 J = M, 2, -1                  CTEMP = C( J-1 )                  STEMP = S( J-1 )                  IF( ( CTEMP.NE.ONE ) .OR. ( STEMP.NE.ZERO ) ) THEN                     DO 70 I = 1, N                        TEMP = A( J, I )                        A( J, I ) = CTEMP*TEMP - STEMP*A( 1, I )                        A( 1, I ) = STEMP*TEMP + CTEMP*A( 1, I )   70                CONTINUE                  END IF   80          CONTINUE            END IF         ELSE IF( LSAME( PIVOT, 'B' ) ) THEN            IF( LSAME( DIRECT, 'F' ) ) THEN               DO 100 J = 1, M - 1                  CTEMP = C( J )                  STEMP = S( J )                  IF( ( CTEMP.NE.ONE ) .OR. ( STEMP.NE.ZERO ) ) THEN                     DO 90 I = 1, N                        TEMP = A( J, I )                        A( J, I ) = STEMP*A( M, I ) + CTEMP*TEMP                        A( M, I ) = CTEMP*A( M, I ) - STEMP*TEMP   90                CONTINUE                  END IF  100          CONTINUE            ELSE IF( LSAME( DIRECT, 'B' ) ) THEN               DO 120 J = M - 1, 1, -1                  CTEMP = C( J )                  STEMP = S( J )                  IF( ( CTEMP.NE.ONE ) .OR. ( STEMP.NE.ZERO ) ) THEN                     DO 110 I = 1, N                        TEMP = A( J, I )                        A( J, I ) = STEMP*A( M, I ) + CTEMP*TEMP                        A( M, I ) = CTEMP*A( M, I ) - STEMP*TEMP  110                CONTINUE                  END IF  120          CONTINUE            END IF         END IF      ELSE IF( LSAME( SIDE, 'R' ) ) THEN**        Form A * P'*         IF( LSAME( PIVOT, 'V' ) ) THEN            IF( LSAME( DIRECT, 'F' ) ) THEN               DO 140 J = 1, N - 1                  CTEMP = C( J )                  STEMP = S( J )                  IF( ( CTEMP.NE.ONE ) .OR. ( STEMP.NE.ZERO ) ) THEN                     DO 130 I = 1, M                        TEMP = A( I, J+1 )                        A( I, J+1 ) = CTEMP*TEMP - STEMP*A( I, J )                        A( I, J ) = STEMP*TEMP + CTEMP*A( I, J )  130                CONTINUE                  END IF  140          CONTINUE            ELSE IF( LSAME( DIRECT, 'B' ) ) THEN               DO 160 J = N - 1, 1, -1                  CTEMP = C( J )                  STEMP = S( J )                  IF( ( CTEMP.NE.ONE ) .OR. ( STEMP.NE.ZERO ) ) THEN                     DO 150 I = 1, M                        TEMP = A( I, J+1 )                        A( I, J+1 ) = CTEMP*TEMP - STEMP*A( I, J )                        A( I, J ) = STEMP*TEMP + CTEMP*A( I, J )  150                CONTINUE                  END IF  160          CONTINUE            END IF         ELSE IF( LSAME( PIVOT, 'T' ) ) THEN            IF( LSAME( DIRECT, 'F' ) ) THEN               DO 180 J = 2, N                  CTEMP = C( J-1 )                  STEMP = S( J-1 )                  IF( ( CTEMP.NE.ONE ) .OR. ( STEMP.NE.ZERO ) ) THEN                     DO 170 I = 1, M                        TEMP = A( I, J )                        A( I, J ) = CTEMP*TEMP - STEMP*A( I, 1 )                        A( I, 1 ) = STEMP*TEMP + CTEMP*A( I, 1 )  170                CONTINUE                  END IF  180          CONTINUE            ELSE IF( LSAME( DIRECT, 'B' ) ) THEN               DO 200 J = N, 2, -1                  CTEMP = C( J-1 )                  STEMP = S( J-1 )                  IF( ( CTEMP.NE.ONE ) .OR. ( STEMP.NE.ZERO ) ) THEN                     DO 190 I = 1, M                        TEMP = A( I, J )                        A( I, J ) = CTEMP*TEMP - STEMP*A( I, 1 )                        A( I, 1 ) = STEMP*TEMP + CTEMP*A( I, 1 )  190                CONTINUE                  END IF  200          CONTINUE            END IF         ELSE IF( LSAME( PIVOT, 'B' ) ) THEN            IF( LSAME( DIRECT, 'F' ) ) THEN               DO 220 J = 1, N - 1                  CTEMP = C( J )                  STEMP = S( J )                  IF( ( CTEMP.NE.ONE ) .OR. ( STEMP.NE.ZERO ) ) THEN                     DO 210 I = 1, M                        TEMP = A( I, J )                        A( I, J ) = STEMP*A( I, N ) + CTEMP*TEMP                        A( I, N ) = CTEMP*A( I, N ) - STEMP*TEMP  210                CONTINUE                  END IF  220          CONTINUE            ELSE IF( LSAME( DIRECT, 'B' ) ) THEN               DO 240 J = N - 1, 1, -1                  CTEMP = C( J )                  STEMP = S( J )                  IF( ( CTEMP.NE.ONE ) .OR. ( STEMP.NE.ZERO ) ) THEN                     DO 230 I = 1, M                        TEMP = A( I, J )                        A( I, J ) = STEMP*A( I, N ) + CTEMP*TEMP                        A( I, N ) = CTEMP*A( I, N ) - STEMP*TEMP  230                CONTINUE                  END IF  240          CONTINUE            END IF         END IF      END IF*      RETURN**     End of DLASR*      END      SUBROUTINE DLASRT( ID, N, D, INFO )**  -- LAPACK routine (version 2.0) --*     Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd.,*     Courant Institute, Argonne National Lab, and Rice University*     September 30, 1994**     .. Scalar Arguments ..      CHARACTER          ID      INTEGER            INFO, N*     ..*     .. Array Arguments ..      DOUBLE PRECISION   D( * )*     ..**  Purpose*  =======**  Sort the numbers in D in increasing order (if ID = 'I') or*  in decreasing order (if ID = 'D' ).**  Use Quick Sort, reverting to Insertion sort on arrays of*  size <= 20. Dimension of STACK limits N to about 2**32.**  Arguments*  =========**  ID      (input) CHARACTER*1*          = 'I': sort D in increasing order;*          = 'D': sort D in decreasing order.**  N       (input) INTEGER*          The length of the array D.**  D       (input/output) DOUBLE PRECISION array, dimension (N)*          On entry, the array to be sorted.*          On exit, D has been sorted into increasing order*          (D(1) <= ... <= D(N) ) or into decreasing order*          (D(1) >= ... >= D(N) ), depending on ID.**  INFO    (output) INTEGER*          = 0:  successful exit*          < 0:  if INFO = -i, the i-th argument had an illegal value**  =====================================================================**     .. Parameters ..      INTEGER            SELECT      PARAMETER          ( SELECT = 20 )*     ..*     .. Local Scalars ..      INTEGER            DIR, ENDD, I, J, START, STKPNT      DOUBLE PRECISION   D1, D2, D3, DMNMX, TMP*     ..*     .. Local Arrays ..      INTEGER            STACK( 2, 32 )*     ..*     .. External Functions ..      LOGICAL            LSAME      EXTERNAL           LSAME*     ..*     .. External Subroutines ..      EXTERNAL           XERBLA*     ..*     .. Executable Statements ..**     Test the input paramters.*      INFO = 0      DIR = -1      IF( LSAME( ID, 'D' ) ) THEN         DIR = 0      ELSE IF( LSAME( ID, 'I' ) ) THEN         DIR = 1      END IF      IF( DIR.EQ.-1 ) THEN         INFO = -1      ELSE IF( N.LT.0 ) THEN         INFO = -2      END IF      IF( INFO.NE.0 ) THEN         CALL XERBLA( 'DLASRT', -INFO )         RETURN      END IF**     Quick return if possible*      IF( N.LE.1 )     $   RETURN*      STKPNT = 1      STACK( 1, 1 ) = 1      STACK( 2, 1 ) = N   10 CONTINUE      START = STACK( 1, STKPNT )      ENDD = STACK( 2, STKPNT )      STKPNT = STKPNT - 1      IF( ENDD-START.LE.SELECT .AND. ENDD-START.GT.0 ) THEN**        Do Insertion sort on D( START:ENDD )*         IF( DIR.EQ.0 ) THEN**           Sort into decreasing order*            DO 30 I = START + 1, ENDD               DO 20 J = I, START + 1, -1                  IF( D( J ).GT.D( J-1 ) ) THEN                     DMNMX = D( J )                     D( J ) = D( J-1 )                     D( J-1 ) = DMNMX                  ELSE                     GO TO 30                  END IF   20          CONTINUE   30       CONTINUE*         ELSE**           Sort into increasing order*            DO 50 I = START + 1, ENDD               DO 40 J = I, START + 1, -1                  IF( D( J ).LT.D( J-1 ) ) THEN                     DMNMX = D( J )                     D( J ) = D( J-1 )                     D( J-1 ) = DMNMX                  ELSE                     GO TO 50                  END IF   40          CONTINUE   50       CONTINUE*         END IF*      ELSE IF( ENDD-START.GT.SELECT ) THEN**        Partition D( START:ENDD ) and stack parts, largest one first**        Choose partition entry as median of 3*         D1 = D( START )         D2 = D( ENDD )         I = ( START+ENDD ) / 2         D3 = D( I )         IF( D1.LT.D2 ) THEN            IF( D3.LT.D1 ) THEN               DMNMX = D1            ELSE IF( D3.LT.D2 ) THEN               DMNMX = D3            ELSE               DMNMX = D2            END IF         ELSE            IF( D3.LT.D2 ) THEN               DMNMX = D2            ELSE IF( D3.LT.D1 ) THEN               DMNMX = D3            ELSE               DMNMX = D1            END IF         END IF*         IF( DIR.EQ.0 ) THEN**           Sort into decreasing order*            I = START - 1            J = ENDD + 1   60       CONTINUE   70       CONTINUE            J = J - 1            IF( D( J ).LT.DMNMX )     $         GO TO 70   80       CONTINUE            I = I + 1            IF( D( I ).GT.DMNMX )     $         GO TO 80            IF( I.LT.J ) THEN               TMP = D( I )               D( I ) = D( J )               D( J ) = TMP               GO TO 60            END IF            IF( J-START.GT.ENDD-J-1 ) THEN               STKPNT = STKPNT + 1               STACK( 1, STKPNT ) = START               STACK( 2, STKPNT ) = J               STKPNT = STKPNT + 1               STACK( 1, STKPNT ) = J + 1               STACK( 2, STKPNT ) = ENDD            ELSE               STKPNT = STKPNT + 1               STACK( 1, STKPNT ) = J + 1               STACK( 2, STKPNT ) = ENDD               STKPNT = STKPNT + 1               STACK( 1, STKPNT ) = START               STACK( 2, STKPNT ) = J            END IF         ELSE**           Sort into increasing order*            I = START - 1            J = ENDD + 1   90       CONTINUE  100       CONTINUE            J = J - 1            IF( D( J ).GT.DMNMX )     $         GO TO 100  110       CONTINUE            I = I + 1            IF( D( I ).LT.DMNMX )     $         GO TO 110            IF( I.LT.J ) THEN               TMP = D( I )               D( I ) = D( J )               D( J ) = TMP               GO TO 90            END IF            IF( J-START.GT.ENDD-J-1 ) THEN               STKPNT = STKPNT + 1               STACK( 1, STKPNT ) = START               STACK( 2, STKPNT ) = J               STKPNT = STKPNT + 1               STACK( 1, STKPNT ) = J + 1               STACK( 2, STKPNT ) = ENDD            ELSE               STKPNT = STKPNT + 1               STACK( 1, STKPNT ) = J + 1               STACK( 2, STKPNT ) = ENDD               STKPNT = STKPNT + 1               STACK( 1, STKPNT ) = START               STACK( 2, STKPNT ) = J            END IF         END IF      END IF      IF( STKPNT.GT.0 )     $   GO TO 10      RETURN**     End of DLASRT*      END      SUBROUTINE DLASSQ( N, X, INCX, SCALE, SUMSQ )**  -- 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 ..      INTEGER            INCX, N      DOUBLE PRECISION   SCALE, SUMSQ*     ..*     .. Array Arguments ..      DOUBLE PRECISION   X( * )*     ..**  Purpose*  =======**  DLASSQ  returns the values  scl  and  smsq  such that**     ( scl**2 )*smsq = x( 1 )**2 +...+ x( n )**2 + ( scale**2 )*sumsq,**  where  x( i ) = X( 1 + ( i - 1 )*INCX ). The value of  sumsq  is*  assumed to be non-negative and  scl  returns the value**     scl = max( scale, abs( x( i ) ) ).**  scale and sumsq must be supplied in SCALE and SUMSQ and*  scl and smsq are overwritten on SCALE and SUMSQ respectively.**  The routine makes only one pass through the vector x.**  Arguments*  =========**  N       (input) INTEGER*      

⌨️ 快捷键说明

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