📄 sopla.f
字号:
REAL FUNCTION SOPLA( SUBNAM, M, N, KL, KU, NB )** -- LAPACK timing routine (version 3.0) --* Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd.,* Courant Institute, Argonne National Lab, and Rice University* September 30, 1994** .. Scalar Arguments .. CHARACTER*6 SUBNAM INTEGER KL, KU, M, N, NB* ..** Purpose* =======** SOPLA computes an approximation of the number of floating point* operations used by the subroutine SUBNAM with the given values* of the parameters M, N, KL, KU, and NB.** This version counts operations for the LAPACK subroutines.** Arguments* =========** SUBNAM (input) CHARACTER*6* The name of the subroutine.** M (input) INTEGER* The number of rows of the coefficient matrix. M >= 0.** N (input) INTEGER* The number of columns of the coefficient matrix.* For solve routine when the matrix is square,* N is the number of right hand sides. N >= 0.** KL (input) INTEGER* The lower band width of the coefficient matrix.* If needed, 0 <= KL <= M-1.* For xGEQRS, KL is the number of right hand sides.** KU (input) INTEGER* The upper band width of the coefficient matrix.* If needed, 0 <= KU <= N-1.** NB (input) INTEGER* The block size. If needed, NB >= 1.** Notes* =====** In the comments below, the association is given between arguments* in the requested subroutine and local arguments. For example,** xGETRS: N, NRHS => M, N** means that arguments N and NRHS in SGETRS are passed to arguments* M and N in this procedure.** =====================================================================** .. Local Scalars .. LOGICAL CORZ, SORD CHARACTER C1 CHARACTER*2 C2 CHARACTER*3 C3 INTEGER I REAL ADDFAC, ADDS, EK, EM, EMN, EN, MULFAC, MULTS, $ WL, WU* ..* .. External Functions .. LOGICAL LSAME, LSAMEN EXTERNAL LSAME, LSAMEN* ..* .. Intrinsic Functions .. INTRINSIC MAX, MIN* ..* .. Executable Statements ..** --------------------------------------------------------* Initialize SOPLA to 0 and do a quick return if possible.* --------------------------------------------------------* SOPLA = 0 MULTS = 0 ADDS = 0 C1 = SUBNAM( 1: 1 ) C2 = SUBNAM( 2: 3 ) C3 = SUBNAM( 4: 6 ) SORD = LSAME( C1, 'S' ) .OR. LSAME( C1, 'D' ) CORZ = LSAME( C1, 'C' ) .OR. LSAME( C1, 'Z' ) IF( M.LE.0 .OR. .NOT.( SORD .OR. CORZ ) ) $ RETURN** ---------------------------------------------------------* If the coefficient matrix is real, count each add as 1* operation and each multiply as 1 operation.* If the coefficient matrix is complex, count each add as 2* operations and each multiply as 6 operations.* ---------------------------------------------------------* IF( LSAME( C1, 'S' ) .OR. LSAME( C1, 'D' ) ) THEN ADDFAC = 1 MULFAC = 1 ELSE ADDFAC = 2 MULFAC = 6 END IF EM = M EN = N EK = KL** ---------------------------------* GE: GEneral rectangular matrices* ---------------------------------* IF( LSAMEN( 2, C2, 'GE' ) ) THEN** xGETRF: M, N => M, N* IF( LSAMEN( 3, C3, 'TRF' ) ) THEN EMN = MIN( M, N ) ADDS = EMN*( EM*EN-( EM+EN )*( EMN+1. ) / 2.+( EMN+1. )* $ ( 2.*EMN+1. ) / 6. ) MULTS = ADDS + EMN*( EM-( EMN+1. ) / 2. )** xGETRS: N, NRHS => M, N* ELSE IF( LSAMEN( 3, C3, 'TRS' ) ) THEN MULTS = EN*EM*EM ADDS = EN*( EM*( EM-1. ) )** xGETRI: N => M* ELSE IF( LSAMEN( 3, C3, 'TRI' ) ) THEN MULTS = EM*( 5. / 6.+EM*( 1. / 2.+EM*( 2. / 3. ) ) ) ADDS = EM*( 5. / 6.+EM*( -3. / 2.+EM*( 2. / 3. ) ) )** xGEQRF or xGEQLF: M, N => M, N* ELSE IF( LSAMEN( 3, C3, 'QRF' ) .OR. $ LSAMEN( 3, C3, 'QR2' ) .OR. $ LSAMEN( 3, C3, 'QLF' ) .OR. LSAMEN( 3, C3, 'QL2' ) ) $ THEN IF( M.GE.N ) THEN MULTS = EN*( ( ( 23. / 6. )+EM+EN / 2. )+EN* $ ( EM-EN / 3. ) ) ADDS = EN*( ( 5. / 6. )+EN*( 1. / 2.+( EM-EN / 3. ) ) ) ELSE MULTS = EM*( ( ( 23. / 6. )+2.*EN-EM / 2. )+EM* $ ( EN-EM / 3. ) ) ADDS = EM*( ( 5. / 6. )+EN-EM / 2.+EM*( EN-EM / 3. ) ) END IF** xGERQF or xGELQF: M, N => M, N* ELSE IF( LSAMEN( 3, C3, 'RQF' ) .OR. $ LSAMEN( 3, C3, 'RQ2' ) .OR. $ LSAMEN( 3, C3, 'LQF' ) .OR. LSAMEN( 3, C3, 'LQ2' ) ) $ THEN IF( M.GE.N ) THEN MULTS = EN*( ( ( 29. / 6. )+EM+EN / 2. )+EN* $ ( EM-EN / 3. ) ) ADDS = EN*( ( 5. / 6. )+EM+EN* $ ( -1. / 2.+( EM-EN / 3. ) ) ) ELSE MULTS = EM*( ( ( 29. / 6. )+2.*EN-EM / 2. )+EM* $ ( EN-EM / 3. ) ) ADDS = EM*( ( 5. / 6. )+EM / 2.+EM*( EN-EM / 3. ) ) END IF** xGEQPF: M, N => M, N* ELSE IF( LSAMEN( 3, C3, 'QPF' ) ) THEN EMN = MIN( M, N ) MULTS = 2*EN*EN + EMN*( 3*EM+5*EN+2*EM*EN-( EMN+1 )* $ ( 4+EN+EM-( 2*EMN+1 ) / 3 ) ) ADDS = EN*EN + EMN*( 2*EM+EN+2*EM*EN-( EMN+1 )* $ ( 2+EN+EM-( 2*EMN+1 ) / 3 ) )** xGEQRS or xGERQS: M, N, NRHS => M, N, KL* ELSE IF( LSAMEN( 3, C3, 'QRS' ) .OR. LSAMEN( 3, C3, 'RQS' ) ) $ THEN MULTS = EK*( EN*( 2.-EK )+EM*( 2.*EN+( EM+1. ) / 2. ) ) ADDS = EK*( EN*( 1.-EK )+EM*( 2.*EN+( EM-1. ) / 2. ) )** xGELQS or xGEQLS: M, N, NRHS => M, N, KL* ELSE IF( LSAMEN( 3, C3, 'LQS' ) .OR. LSAMEN( 3, C3, 'QLS' ) ) $ THEN MULTS = EK*( EM*( 2.-EK )+EN*( 2.*EM+( EN+1. ) / 2. ) ) ADDS = EK*( EM*( 1.-EK )+EN*( 2.*EM+( EN-1. ) / 2. ) )** xGEBRD: M, N => M, N* ELSE IF( LSAMEN( 3, C3, 'BRD' ) ) THEN IF( M.GE.N ) THEN MULTS = EN*( 20. / 3.+EN*( 2.+( 2.*EM-( 2. / 3. )* $ EN ) ) ) ADDS = EN*( 5. / 3.+( EN-EM )+EN* $ ( 2.*EM-( 2. / 3. )*EN ) ) ELSE MULTS = EM*( 20. / 3.+EM*( 2.+( 2.*EN-( 2. / 3. )* $ EM ) ) ) ADDS = EM*( 5. / 3.+( EM-EN )+EM* $ ( 2.*EN-( 2. / 3. )*EM ) ) END IF** xGEHRD: N => M* ELSE IF( LSAMEN( 3, C3, 'HRD' ) ) THEN IF( M.EQ.1 ) THEN MULTS = 0. ADDS = 0. ELSE MULTS = -13. + EM*( -7. / 6.+EM*( 0.5+EM*( 5. / 3. ) ) ) ADDS = -8. + EM*( -2. / 3.+EM*( -1.+EM*( 5. / 3. ) ) ) END IF* END IF** ----------------------------* GB: General Banded matrices* ----------------------------* Note: The operation count is overestimated because* it is assumed that the factor U fills in to the maximum* extent, i.e., that its bandwidth goes from KU to KL + KU.* ELSE IF( LSAMEN( 2, C2, 'GB' ) ) THEN** xGBTRF: M, N, KL, KU => M, N, KL, KU* IF( LSAMEN( 3, C3, 'TRF' ) ) THEN DO 10 I = MIN( M, N ), 1, -1 WL = MAX( 0, MIN( KL, M-I ) ) WU = MAX( 0, MIN( KL+KU, N-I ) ) MULTS = MULTS + WL*( 1.+WU ) ADDS = ADDS + WL*WU 10 CONTINUE** xGBTRS: N, NRHS, KL, KU => M, N, KL, KU* ELSE IF( LSAMEN( 3, C3, 'TRS' ) ) THEN WL = MAX( 0, MIN( KL, M-1 ) ) WU = MAX( 0, MIN( KL+KU, M-1 ) ) MULTS = EN*( EM*( WL+1.+WU )-0.5* $ ( WL*( WL+1. )+WU*( WU+1. ) ) ) ADDS = EN*( EM*( WL+WU )-0.5*( WL*( WL+1. )+WU*( WU+1. ) ) )* END IF** --------------------------------------* PO: POsitive definite matrices* PP: Positive definite Packed matrices* --------------------------------------* ELSE IF( LSAMEN( 2, C2, 'PO' ) .OR. LSAMEN( 2, C2, 'PP' ) ) THEN** xPOTRF: N => M* IF( LSAMEN( 3, C3, 'TRF' ) ) THEN MULTS = EM*( 1. / 3.+EM*( 1. / 2.+EM*( 1. / 6. ) ) ) ADDS = ( 1. / 6. )*EM*( -1.+EM*EM )** xPOTRS: N, NRHS => M, N* ELSE IF( LSAMEN( 3, C3, 'TRS' ) ) THEN MULTS = EN*( EM*( EM+1. ) ) ADDS = EN*( EM*( EM-1. ) )** xPOTRI: N => M* ELSE IF( LSAMEN( 3, C3, 'TRI' ) ) THEN MULTS = EM*( 2. / 3.+EM*( 1.+EM*( 1. / 3. ) ) ) ADDS = EM*( 1. / 6.+EM*( -1. / 2.+EM*( 1. / 3. ) ) )* END IF** ------------------------------------* PB: Positive definite Band matrices* ------------------------------------* ELSE IF( LSAMEN( 2, C2, 'PB' ) ) THEN** xPBTRF: N, K => M, KL* IF( LSAMEN( 3, C3, 'TRF' ) ) THEN MULTS = EK*( -2. / 3.+EK*( -1.+EK*( -1. / 3. ) ) ) + $ EM*( 1.+EK*( 3. / 2.+EK*( 1. / 2. ) ) ) ADDS = EK*( -1. / 6.+EK*( -1. / 2.+EK*( -1. / 3. ) ) ) + $ EM*( EK / 2.*( 1.+EK ) )** xPBTRS: N, NRHS, K => M, N, KL* ELSE IF( LSAMEN( 3, C3, 'TRS' ) ) THEN MULTS = EN*( ( 2*EM-EK )*( EK+1. ) ) ADDS = EN*( EK*( 2*EM-( EK+1. ) ) )* END IF** ----------------------------------* PT: Positive definite Tridiagonal* ----------------------------------* ELSE IF( LSAMEN( 2, C2, 'PT' ) ) THEN** xPTTRF: N => M* IF( LSAMEN( 3, C3, 'TRF' ) ) THEN MULTS = 2*( EM-1 ) ADDS = EM - 1** xPTTRS: N, NRHS => M, N* ELSE IF( LSAMEN( 3, C3, 'TRS' ) ) THEN MULTS = EN*( 3*EM-2 ) ADDS = EN*( 2*( EM-1 ) )** xPTSV: N, NRHS => M, N* ELSE IF( LSAMEN( 3, C3, 'SV ' ) ) THEN MULTS = 2*( EM-1 ) + EN*( 3*EM-2 ) ADDS = EM - 1 + EN*( 2*( EM-1 ) ) END IF** --------------------------------------------------------* SY: SYmmetric indefinite matrices* SP: Symmetric indefinite Packed matrices* HE: HErmitian indefinite matrices (complex only)* HP: Hermitian indefinite Packed matrices (complex only)* --------------------------------------------------------* ELSE IF( LSAMEN( 2, C2, 'SY' ) .OR. LSAMEN( 2, C2, 'SP' ) .OR. $ LSAMEN( 3, SUBNAM, 'CHE' ) .OR. $ LSAMEN( 3, SUBNAM, 'ZHE' ) .OR. $ LSAMEN( 3, SUBNAM, 'CHP' ) .OR. $ LSAMEN( 3, SUBNAM, 'ZHP' ) ) THEN** xSYTRF: N => M* IF( LSAMEN( 3, C3, 'TRF' ) ) THEN MULTS = EM*( 10. / 3.+EM*( 1. / 2.+EM*( 1. / 6. ) ) ) ADDS = EM / 6.*( -1.+EM*EM )** xSYTRS: N, NRHS => M, N* ELSE IF( LSAMEN( 3, C3, 'TRS' ) ) THEN MULTS = EN*EM*EM ADDS = EN*( EM*( EM-1. ) )** xSYTRI: N => M* ELSE IF( LSAMEN( 3, C3, 'TRI' ) ) THEN MULTS = EM*( 2. / 3.+EM*EM*( 1. / 3. ) ) ADDS = EM*( -1. / 3.+EM*EM*( 1. / 3. ) )** xSYTRD, xSYTD2: N => M* ELSE IF( LSAMEN( 3, C3, 'TRD' ) .OR. LSAMEN( 3, C3, 'TD2' ) ) $ THEN IF( M.EQ.1 ) THEN MULTS = 0. ADDS = 0. ELSE MULTS = -15. + EM*( -1. / 6.+EM* $ ( 5. / 2.+EM*( 2. / 3. ) ) ) ADDS = -4. + EM*( -8. / 3.+EM*( 1.+EM*( 2. / 3. ) ) ) END IF END IF** -------------------* Triangular matrices* -------------------* ELSE IF( LSAMEN( 2, C2, 'TR' ) .OR. LSAMEN( 2, C2, 'TP' ) ) THEN** xTRTRS: N, NRHS => M, N* IF( LSAMEN( 3, C3, 'TRS' ) ) THEN MULTS = EN*EM*( EM+1. ) / 2. ADDS = EN*EM*( EM-1. ) / 2.** xTRTRI: N => M* ELSE IF( LSAMEN( 3, C3, 'TRI' ) ) THEN MULTS = EM*( 1. / 3.+EM*( 1. / 2.+EM*( 1. / 6. ) ) ) ADDS = EM*( 1. / 3.+EM*( -1. / 2.+EM*( 1. / 6. ) ) )* END IF* ELSE IF( LSAMEN( 2, C2, 'TB' ) ) THEN** xTBTRS: N, NRHS, K => M, N, KL* IF( LSAMEN( 3, C3, 'TRS' ) ) THEN MULTS = EN*( EM*( EM+1. ) / 2.-( EM-EK-1. )*( EM-EK ) / 2. ) ADDS = EN*( EM*( EM-1. ) / 2.-( EM-EK-1. )*( EM-EK ) / 2. ) END IF** --------------------* Trapezoidal matrices* --------------------* ELSE IF( LSAMEN( 2, C2, 'TZ' ) ) THEN** xTZRQF: M, N => M, N* IF( LSAMEN( 3, C3, 'RQF' ) ) THEN EMN = MIN( M, N ) MULTS = 3*EM*( EN-EM+1 ) + ( 2*EN-2*EM+3 )* $ ( EM*EM-EMN*( EMN+1 ) / 2 ) ADDS = ( EN-EM+1 )*( EM+2*EM*EM-EMN*( EMN+1 ) ) END IF** -------------------* Orthogonal matrices* -------------------* ELSE IF( ( SORD .AND. LSAMEN( 2, C2, 'OR' ) ) .OR. $ ( CORZ .AND. LSAMEN( 2, C2, 'UN' ) ) ) THEN** -MQR, -MLQ, -MQL, or -MRQ: M, N, K, SIDE => M, N, KL, KU* where KU<= 0 indicates SIDE = 'L'* and KU> 0 indicates SIDE = 'R'* IF( LSAMEN( 3, C3, 'MQR' ) .OR. LSAMEN( 3, C3, 'MLQ' ) .OR. $ LSAMEN( 3, C3, 'MQL' ) .OR. LSAMEN( 3, C3, 'MRQ' ) ) THEN IF( KU.LE.0 ) THEN MULTS = EK*EN*( 2.*EM+2.-EK ) ADDS = EK*EN*( 2.*EM+1.-EK ) ELSE MULTS = EK*( EM*( 2.*EN-EK )+( EM+EN+( 1.-EK ) / 2. ) ) ADDS = EK*EM*( 2.*EN+1.-EK ) END IF** -GQR or -GQL: M, N, K => M, N, KL* ELSE IF( LSAMEN( 3, C3, 'GQR' ) .OR. LSAMEN( 3, C3, 'GQL' ) ) $ THEN MULTS = EK*( -5. / 3.+( 2.*EN-EK )+ $ ( 2.*EM*EN+EK*( ( 2. / 3. )*EK-EM-EN ) ) ) ADDS = EK*( 1. / 3.+( EN-EM )+ $ ( 2.*EM*EN+EK*( ( 2. / 3. )*EK-EM-EN ) ) )** -GLQ or -GRQ: M, N, K => M, N, KL* ELSE IF( LSAMEN( 3, C3, 'GLQ' ) .OR. LSAMEN( 3, C3, 'GRQ' ) ) $ THEN MULTS = EK*( -2. / 3.+( EM+EN-EK )+ $ ( 2.*EM*EN+EK*( ( 2. / 3. )*EK-EM-EN ) ) ) ADDS = EK*( 1. / 3.+( EM-EN )+ $ ( 2.*EM*EN+EK*( ( 2. / 3. )*EK-EM-EN ) ) )* END IF* END IF* SOPLA = MULFAC*MULTS + ADDFAC*ADDS* RETURN** End of SOPLA* END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -