diff --git a/include/galahad_blas.h b/include/galahad_blas.h index 411900ad14..23701b7fd0 100644 --- a/include/galahad_blas.h +++ b/include/galahad_blas.h @@ -1,13 +1,14 @@ #ifdef GALAHAD_64BIT_INTEGER #define GALAHAD_BLAS_interface GALAHAD_BLAS_interface_64 #ifdef GALAHAD_NO_UNDERSCORE_64BIT_INTEGER -#define LSAME LSAME64 -#define XERBLA XERBLA64 #define DASUM DASUM64 #define DCABS1 DCABS164 #define DDOT DDOT64 #define DNRM2 DNRM264 #define DZNRM2 DZNRM264 +#define IDAMAX IDAMAX64 +#define ISAMAX ISAMAX64 +#define LSAME LSAME64 #define SASUM SASUM64 #define SDOT SDOT64 #define SNRM2 SNRM264 @@ -55,6 +56,7 @@ #define STRMV STRMV64 #define STRSM STRSM64 #define STRSV STRSV64 +#define XERBLA XERBLA64 #define ZCOPY ZCOPY64 #define ZDSCAL ZDSCAL64 #define ZGEMM ZGEMM64 @@ -68,13 +70,14 @@ #define ZTRMV ZTRMV64 #define ZTRSM ZTRSM64 #elif GALAHAD_DOUBLE_UNDERSCORE_64BIT_INTEGER -#define LSAME LSAME__64 -#define XERBLA XERBLA__64 #define DASUM DASUM__64 #define DCABS1 DCABS1__64 #define DDOT DDOT__64 #define DNRM2 DNRM2__64 #define DZNRM2 DZNRM2__64 +#define IDAMAX IDAMAX__64 +#define ISAMAX ISAMAX__64 +#define LSAME LSAME__64 #define SASUM SASUM__64 #define SDOT SDOT__64 #define SNRM2 SNRM2__64 @@ -122,6 +125,7 @@ #define STRMV STRMV__64 #define STRSM STRSM__64 #define STRSV STRSV__64 +#define XERBLA XERBLA__64 #define ZCOPY ZCOPY__64 #define ZDSCAL ZDSCAL__64 #define ZGEMM ZGEMM__64 @@ -135,13 +139,14 @@ #define ZTRMV ZTRMV__64 #define ZTRSM ZTRSM__64 #elif GALAHAD_NO_SYMBOL_64BIT_INTEGER -#define LSAME LSAME -#define XERBLA XERBLA #define DASUM DASUM #define DCABS1 DCABS1 #define DDOT DDOT #define DNRM2 DNRM2 #define DZNRM2 DZNRM2 +#define IDAMAX IDAMAX +#define ISAMAX ISAMAX +#define LSAME LSAME #define SASUM SASUM #define SDOT SDOT #define SNRM2 SNRM2 @@ -189,6 +194,7 @@ #define STRMV STRMV #define STRSM STRSM #define STRSV STRSV +#define XERBLA XERBLA #define ZCOPY ZCOPY #define ZDSCAL ZDSCAL #define ZGEMM ZGEMM @@ -202,13 +208,14 @@ #define ZTRMV ZTRMV #define ZTRSM ZTRSM #else -#define LSAME LSAME_64 -#define XERBLA XERBLA_64 #define DASUM DASUM_64 #define DCABS1 DCABS1_64 #define DDOT DDOT_64 #define DNRM2 DNRM2_64 #define DZNRM2 DZNRM2_64 +#define IDAMAX IDAMAX_64 +#define ISAMAX ISAMAX_64 +#define LSAME LSAME_64 #define SASUM SASUM_64 #define SDOT SDOT_64 #define SNRM2 SNRM2_64 @@ -256,6 +263,7 @@ #define STRMV STRMV_64 #define STRSM STRSM_64 #define STRSV STRSV_64 +#define XERBLA XERBLA_64 #define ZCOPY ZCOPY_64 #define ZDSCAL ZDSCAL_64 #define ZGEMM ZGEMM_64 diff --git a/include/galahad_lapack.h b/include/galahad_lapack.h index 61b7ac9cba..0f8a630f57 100644 --- a/include/galahad_lapack.h +++ b/include/galahad_lapack.h @@ -1,7 +1,6 @@ #ifdef GALAHAD_64BIT_INTEGER #define GALAHAD_LAPACK_interface GALAHAD_LAPACK_interface_64 #ifdef GALAHAD_NO_UNDERSCORE_64BIT_INTEGER -#define ILAENV ILAENV64 #define DISNAN DISNAN64 #define DLADIV DLADIV64 #define DLAISN DLAISN64 @@ -12,6 +11,14 @@ #define DLANSY DLANSY64 #define DLAPY2 DLAPY264 #define DLAPY3 DLAPY364 +#define ILADLC ILADLC64 +#define ILADLR ILADLR64 +#define ILAENV ILAENV64 +#define ILASLC ILASLC64 +#define ILASLR ILASLR64 +#define ILAZLC ILAZLC64 +#define ILAZLR ILAZLR64 +#define IPARMQ IPARMQ64 #define SISNAN SISNAN64 #define SLAISN SLAISN64 #define SLAMCH SLAMCH64 @@ -268,7 +275,6 @@ #define ZLARFG ZLARFG64 #define ZLARFT ZLARFT64 #elif GALAHAD_DOUBLE_UNDERSCORE_64BIT_INTEGER -#define ILAENV ILAENV__64 #define DISNAN DISNAN__64 #define DLADIV DLADIV__64 #define DLAISN DLAISN__64 @@ -279,6 +285,14 @@ #define DLANSY DLANSY__64 #define DLAPY2 DLAPY2__64 #define DLAPY3 DLAPY3__64 +#define ILADLC ILADLC__64 +#define ILADLR ILADLR__64 +#define ILAENV ILAENV__64 +#define ILASLC ILASLC__64 +#define ILASLR ILASLR__64 +#define ILAZLC ILAZLC__64 +#define ILAZLR ILAZLR__64 +#define IPARMQ IPARMQ__64 #define SISNAN SISNAN__64 #define SLAISN SLAISN__64 #define SLAMCH SLAMCH__64 @@ -535,7 +549,6 @@ #define ZLARFG ZLARFG__64 #define ZLARFT ZLARFT__64 #elif GALAHAD_NO_SYMBOL_64BIT_INTEGER -#define ILAENV ILAENV #define DISNAN DISNAN #define DLADIV DLADIV #define DLAISN DLAISN @@ -546,6 +559,14 @@ #define DLANSY DLANSY #define DLAPY2 DLAPY2 #define DLAPY3 DLAPY3 +#define ILADLC ILADLC +#define ILADLR ILADLR +#define ILAENV ILAENV +#define ILASLC ILASLC +#define ILASLR ILASLR +#define ILAZLC ILAZLC +#define ILAZLR ILAZLR +#define IPARMQ IPARMQ #define SISNAN SISNAN #define SLAISN SLAISN #define SLAMCH SLAMCH @@ -802,7 +823,6 @@ #define ZLARFG ZLARFG #define ZLARFT ZLARFT #else -#define ILAENV ILAENV_64 #define DISNAN DISNAN_64 #define DLADIV DLADIV_64 #define DLAISN DLAISN_64 @@ -813,6 +833,14 @@ #define DLANSY DLANSY_64 #define DLAPY2 DLAPY2_64 #define DLAPY3 DLAPY3_64 +#define ILADLC ILADLC_64 +#define ILADLR ILADLR_64 +#define ILAENV ILAENV_64 +#define ILASLC ILASLC_64 +#define ILASLR ILASLR_64 +#define ILAZLC ILAZLC_64 +#define ILAZLR ILAZLR_64 +#define IPARMQ IPARMQ_64 #define SISNAN SISNAN_64 #define SLAISN SLAISN_64 #define SLAMCH SLAMCH_64 diff --git a/src/apps/sas/sase.F90 b/src/apps/sas/sase.F90 index 99f57f1ab7..a173bea347 100644 --- a/src/apps/sas/sase.F90 +++ b/src/apps/sas/sase.F90 @@ -388,7 +388,8 @@ PROGRAM GALAHAD_SAS_EXAMPLE ! fix l, r, theta and phi, and solve for xi and b f = 0.0_rp_ - a_11 = 0.0_rp_ ; a_12 = 0.0_rp_ ; a_22 = 0.0_rp_ ; r_1 = 0.0_rp_ ; r_2 = 0.0_rp_ + a_11 = 0.0_rp_ ; a_12 = 0.0_rp_ ; a_22 = 0.0_rp_ + r_1 = 0.0_rp_ ; r_2 = 0.0_rp_ DO i = 1, obs alpha = 0.0_rp_ DO ip = 1, np @@ -475,7 +476,8 @@ PROGRAM GALAHAD_SAS_EXAMPLE ! before finding l, fix l, r, theta and phi, and solve for xi and b f = 0.0_rp_ - a_11 = 0.0_rp_ ; a_12 = 0.0_rp_ ; a_22 = 0.0_rp_ ; r_1 = 0.0_rp_ ; r_2 = 0.0_rp_ + a_11 = 0.0_rp_ ; a_12 = 0.0_rp_ ; a_22 = 0.0_rp_ + r_1 = 0.0_rp_ ; r_2 = 0.0_rp_ ne = 0 DO i = 1, obs alpha = DOT_PRODUCT( L, p_l%A%val( ne + 1 : ne + nl ) ) @@ -558,7 +560,8 @@ PROGRAM GALAHAD_SAS_EXAMPLE ! before finding r, fix l, r, theta and phi, and solve for xi and b f = 0.0_rp_ - a_11 = 0.0_rp_ ; a_12 = 0.0_rp_ ; a_22 = 0.0_rp_ ; r_1 = 0.0_rp_ ; r_2 = 0.0_rp_ + a_11 = 0.0_rp_ ; a_12 = 0.0_rp_ ; a_22 = 0.0_rp_ + r_1 = 0.0_rp_ ; r_2 = 0.0_rp_ ne = 0 DO i = 1, obs alpha = DOT_PRODUCT( R, p_r%A%val( ne + 1 : ne + nr ) ) diff --git a/src/arc/arcs4.f90 b/src/arc/arcs4.f90 index 34b4f91440..314d61c819 100644 --- a/src/arc/arcs4.f90 +++ b/src/arc/arcs4.f90 @@ -54,8 +54,8 @@ PROGRAM GALAHAD_ARC4_EXAMPLE ! GALAHAD 3.3 - 25/07/2021 AT 09:15 GMT CALL ARC_information( data, inform, status ) IF ( inform%status == 0 ) THEN ! Successful return WRITE( 6, "( ' ARC: ', I0, ' iterations -', & - & ' optimal objective value =', & - & ES12.4, ', ||g|| =', ES11.4, /, ' Optimal solution = ', ( 5ES12.4 ) )" ) & + & ' optimal objective value =', ES12.4, ', ||g|| =', ES11.4, /, & + ' Optimal solution = ', ( 5ES12.4 ) )" ) & inform%iter, inform%obj, inform%norm_g, X ELSE ! Error returns WRITE( 6, "( ' ARC_solve exit status = ', I6 ) " ) inform%status diff --git a/src/bgo/bgoti.F90 b/src/bgo/bgoti.F90 index 8ac80fb627..86d8462713 100644 --- a/src/bgo/bgoti.F90 +++ b/src/bgo/bgoti.F90 @@ -404,7 +404,7 @@ SUBROUTINE HESSPROD( status, X, userdata, U, V, got_h ) ! Hessian-vector prod REAL, PARAMETER :: freq = 10.0_rp_ REAL, PARAMETER :: mag = 1000.0_rp_ U( 1 ) = U( 1 ) & - + ( 2.0_rp_ - mag * freq * freq * COS( freq * X( 1 ) ) ) * V( 1 ) & + + ( 2.0_rp_ - mag * freq * freq * COS( freq * X( 1 ) ) ) * V( 1 ) & + 2.0_rp_ * V( 3 ) U( 2 ) = U( 2 ) + 2.0_rp_ * ( V( 2 ) + V( 3 ) ) U( 3 ) = U( 3 ) + 2.0_rp_ * ( V( 1 ) + V( 2 ) + 2.0_rp_ * V( 3 ) ) @@ -454,7 +454,7 @@ SUBROUTINE SHESSPROD( status, X, userdata, nnz_v, INDEX_nz_v, V, & j = INDEX_nz_v( i ) SELECT CASE( j ) CASE( 1 ) - P( 1 ) = P( 1 ) + 2.0_rp_ * V( 1 ) & + P( 1 ) = P( 1 ) + 2.0_rp_ * V( 1 ) & - mag * freq * freq * COS( freq * X( 1 ) ) * V( 1 ) USED( 1 ) = .TRUE. P( 3 ) = P( 3 ) + 2.0_rp_ * V( 1 ) diff --git a/src/blls/blls.F90 b/src/blls/blls.F90 index a50012abd3..cb383a5040 100644 --- a/src/blls/blls.F90 +++ b/src/blls/blls.F90 @@ -1172,7 +1172,8 @@ SUBROUTINE eval_ASPROD( status, userdata, V, P, NZ_in, nz_in_start, & INTEGER ( KIND = ip_ ), OPTIONAL, INTENT( IN ) :: nz_in_start, nz_in_end INTEGER ( KIND = ip_ ), OPTIONAL, INTENT( INOUT ) :: nz_out_end INTEGER ( KIND = ip_ ), DIMENSION( : ), OPTIONAL, INTENT( IN ) :: NZ_in - INTEGER ( KIND = ip_ ), DIMENSION( : ), OPTIONAL, INTENT( INOUT ) :: NZ_out + INTEGER ( KIND = ip_ ), DIMENSION( : ), OPTIONAL, & + INTENT( INOUT ) :: NZ_out END SUBROUTINE eval_ASPROD END INTERFACE diff --git a/src/blls/bllst.F90 b/src/blls/bllst.F90 index d260c4d461..cc135d90e4 100644 --- a/src/blls/bllst.F90 +++ b/src/blls/bllst.F90 @@ -285,14 +285,14 @@ PROGRAM GALAHAD_BLLS_TEST_PROGRAM CALL SMT_put( p%Ao%type, 'DENSE_BY_COLUMNS', s ) ALLOCATE( p%Ao%val( o * n ) ) p%Ao%m = o ; p%Ao%n = n - p%Ao%val( : o * n ) = (/ 1.0_rp_, 1.0_rp_, 0.0_rp_, 0.0_rp_, & + p%Ao%val( : o * n ) = (/ 1.0_rp_, 1.0_rp_, 0.0_rp_, 0.0_rp_, & 0.0_rp_, 1.0_rp_, 0.0_rp_, 0.0_rp_, & 0.0_rp_, 0.0_rp_, 1.0_rp_, 1.0_rp_ /) CASE ( 5 ) ! A dense by rows CALL SMT_put( p%Ao%type, 'DENSE_BY_ROWS', s ) ALLOCATE( p%Ao%val( o * n ) ) p%Ao%m = o ; p%Ao%n = n - p%Ao%val( : o * n ) = (/ 1.0_rp_, 0.0_rp_, 0.0_rp_, & + p%Ao%val( : o * n ) = (/ 1.0_rp_, 0.0_rp_, 0.0_rp_, & 1.0_rp_, 1.0_rp_, 0.0_rp_, & 0.0_rp_, 0.0_rp_, 1.0_rp_, & 0.0_rp_, 0.0_rp_, 1.0_rp_ /) diff --git a/src/bllsb/bllsbt.F90 b/src/bllsb/bllsbt.F90 index 13de82ea15..5f8468ed04 100644 --- a/src/bllsb/bllsbt.F90 +++ b/src/bllsb/bllsbt.F90 @@ -122,7 +122,7 @@ PROGRAM GALAHAD_BLLSB_EXAMPLE & F6.1, ' status = ', I6 )" ) status, info%iter, & info%obj, info%status ELSE - WRITE( 6, "(I2, ': BLLSB_solve exit status = ', I6 )") status, info%status + WRITE( 6, "(I2, ': BLLSB_solve exit status = ', I6)") status, info%status END IF DEALLOCATE( p%Ao%val, p%Ao%col ) CALL BLLSB_terminate( data, control, info ) @@ -213,7 +213,7 @@ PROGRAM GALAHAD_BLLSB_EXAMPLE & F6.1, ' status = ', I6 )" ) st, i, info%iter, & info%obj, info%status ELSE - WRITE( 6, "( A1, I1,': BLLSB_solve exit status = ', I6 ) " ) & + WRITE( 6, "( A1, I1,': BLLSB_solve exit status = ', I6 ) " ) & st, i, info%status END IF ! STOP diff --git a/src/bqp/inbqp.F90 b/src/bqp/inbqp.F90 index 33a05ba2d0..826acc28db 100644 --- a/src/bqp/inbqp.F90 +++ b/src/bqp/inbqp.F90 @@ -297,7 +297,7 @@ PROGRAM RUNBQP_DATA_precision DEALLOCATE( IW ) ALLOCATE( prob%H%row( 0 ), STAT = alloc_stat ) IF ( alloc_stat /= 0 ) THEN - WRITE( out, "( ' whoa there - allocate error ', i6 )" ) alloc_stat ; STOP + WRITE( out, "( ' stop - allocate error ', i6 )" ) alloc_stat ; STOP END IF prob%new_problem_structure = .TRUE. diff --git a/src/ccqp/ccqp.F90 b/src/ccqp/ccqp.F90 index 4696777f6f..ffd91ae874 100644 --- a/src/ccqp/ccqp.F90 +++ b/src/ccqp/ccqp.F90 @@ -2001,7 +2001,7 @@ SUBROUTINE CCQP_solve( prob, data, control, inform ) inform%nfacts = 1 IF ( ( control%cpu_time_limit >= zero .AND. & - REAL( time_now - time_start, rp_ ) > control%cpu_time_limit ) .OR. & + REAL( time_now - time_start, rp_ ) > control%cpu_time_limit ) .OR.& ( control%clock_time_limit >= zero .AND. & clock_now - clock_start > control%clock_time_limit ) ) THEN inform%status = GALAHAD_error_cpu_limit diff --git a/src/cdqp/incdqp.F90 b/src/cdqp/incdqp.F90 index b8c7d775a3..65ff5db4be 100644 --- a/src/cdqp/incdqp.F90 +++ b/src/cdqp/incdqp.F90 @@ -367,7 +367,7 @@ PROGRAM RUNCDQP_DATA_precision DEALLOCATE( IW ) ALLOCATE( prob%A%row( 0 ), prob%H%row( 0 ), STAT = alloc_stat ) IF ( alloc_stat /= 0 ) THEN - WRITE( out, "( ' whoa there - allocate error ', i6 )" ) alloc_stat ; STOP + WRITE( out, "( ' stop - allocate error ', i6 )" ) alloc_stat ; STOP END IF prob%new_problem_structure = .TRUE. diff --git a/src/check/check.F90 b/src/check/check.F90 index 3617e426d2..f392c3fac6 100644 --- a/src/check/check.F90 +++ b/src/check/check.F90 @@ -2036,8 +2036,9 @@ END SUBROUTINE eval_Hv 1008 FORMAT(2X,'J(', I5, ',', I5, ')', 3X, A3, 3X, ES16.9, 2(3X,ES16.9) ) 1009 FORMAT(2X,'H(', I5, ',', I5, ')', 3X, A3, 3X, ES16.9, 2(3X,ES16.9) ) 1010 FORMAT(/, & - 2X,' Component Ok Difference Value Error' ,/,& - 2X,'-------------- --- ---------------- ---------------- ----------------' ) + 2X,' Component Ok Difference Value ', & + ' Error', /, 2X, '-------------- --- ----------------', & + ' ---------------- ----------------' ) 1011 FORMAT(2X,'G( : )', 11X, A3, 2X, ES16.9, 2(3X,ES16.9)) 1014 FORMAT(2X,'J(', I5, ', : )', 5X, A3, 2X, ES16.9, 2(3X,ES16.9)) 1015 FORMAT(2X,'H(', I5, ', : )', 5X, A3, 2X, ES16.9, 2(3X,ES16.9)) @@ -2051,11 +2052,14 @@ END SUBROUTINE eval_Hv T13, '| CONTROL PARAMETERS |',/ & T13, '-------------------------------------------------------' ) 1018 FORMAT(/, & - 12X, 'checkG = ', L2, 3x, 'f_available = ', I2, 3x, 'deall_error_fatal = ', L2, /, & - 12X, 'checkJ = ', L2, 3x, 'c_available = ', I2, 3x, 'print_level = ', I2, /, & - 12X, 'checkH = ', L2, 3x, 'g_available = ', I2, 3x, 'verify_level = ', I2, /, & - 12X, 'error = ', I2, 3x, 'J_available = ', I2, 3x, 'out = ', I2, /, & - T27, 'H_available = ', I2 ) + 12X, 'checkG = ', L2, 3x, 'f_available = ', I2, 3x, & + 'deall_error_fatal = ', L2, /, & + 12X, 'checkJ = ', L2, 3x, 'c_available = ', I2, 3x, & + 'print_level = ', I2, /, & + 12X, 'checkH = ', L2, 3x, 'g_available = ', I2, 3x, & + 'verify_level = ', I2, /, & + 12X, 'error = ', I2, 3x, 'J_available = ', I2, 3x, & + 'out = ', I2, /, T27, 'H_available = ', I2 ) 1019 FORMAT(/, & T16, '----------------------------------------------',/, & T16, '| MATRIX DATA |',/ & diff --git a/src/check/checks.f90 b/src/check/checks.f90 index 12216a87d8..a61b878978 100644 --- a/src/check/checks.f90 +++ b/src/check/checks.f90 @@ -28,10 +28,12 @@ PROGRAM GALAHAD_check_example allocate( nlp%H%row(Hne), nlp%H%col(Hne), nlp%H%val(Hne) ) nlp%J%row = (/ 1, 1, 1, 2 /) ; nlp%J%col = (/ 1, 2, 3, 2 /) nlp%H%row = (/ 2, 3, 3 /) ; nlp%H%col = (/ 2, 2, 3 /) - nlp%X = (/ four, three, two /) ; nlp%X_l = -five ; nlp%X_u = five ; nlp%Y = (/ two, three /) + nlp%X = (/ four, three, two /) ; nlp%X_l = -five ; nlp%X_u = five + nlp%Y = (/ two, three /) call CHECK_initialize( control ) ; control%print_level = 3 inform%status = 1 - call CHECK_verify( nlp, data, control, inform, userdata, funF, funC, funG, funJ, funH ) + call CHECK_verify( nlp, data, control, inform, userdata, & + funF, funC, funG, funJ, funH ) call CHECK_terminate( data, control, inform ) END PROGRAM GALAHAD_check_example diff --git a/src/check/checkt.F90 b/src/check/checkt.F90 index 42a36af481..34f0c2a286 100644 --- a/src/check/checkt.F90 +++ b/src/check/checkt.F90 @@ -87,7 +87,8 @@ END SUBROUTINE funH2 nlp%J%row = (/ 1, 1, 1, 2 /) ; nlp%J%col = (/ 1, 2, 3, 2 /) nlp%H%row = (/ 2, 3, 3 /) ; nlp%H%col = (/ 2, 2, 3 /) - nlp%X = (/ four, three, two /) ; nlp%X_l = -five ; nlp%X_u = five ; nlp%Y = (/ two, three /) + nlp%X = (/ four, three, two /) ; nlp%X_l = -five ; nlp%X_u = five + nlp%Y = (/ two, three /) !--------------------------------------| ! Test everything for expensive check. | @@ -106,12 +107,14 @@ END SUBROUTINE funH2 call CHECK_initialize( control ) inform%status = 1 - call CHECK_verify( nlp, data, control, inform, userdata, funF, funC, funG, funJ, funH ) + call CHECK_verify( nlp, data, control, inform, userdata, & + funF, funC, funG, funJ, funH ) stat = inform%status call CHECK_terminate( data, control, inform ) - if ( inform%status /= 0 .or. stat /= 0 .or. .not. inform%derivative_ok ) then + if ( inform%status /= 0 .or. stat /= 0 .or. .not. & + inform%derivative_ok ) then nwrong = nwrong + 1 vwrong(nwrong) = test end if @@ -127,12 +130,14 @@ END SUBROUTINE funH2 IF ( stat == 0 ) call CHECK_read_specfile( control, 34 ) inform%status = 1 - call CHECK_verify( nlp, data, control, inform, userdata, funF, funC, funG, funJ, funH ) + call CHECK_verify( nlp, data, control, inform, userdata, & + funF, funC, funG, funJ, funH ) stat = inform%status call CHECK_terminate( data, control, inform ) - if ( inform%status /= 0 .or. stat /= 0 .or. .not. inform%derivative_ok ) then + if ( inform%status /= 0 .or. stat /= 0 .or. .not. & + inform%derivative_ok ) then nwrong = nwrong + 1 vwrong(nwrong) = test end if @@ -205,10 +210,12 @@ END SUBROUTINE funH2 call mop_Ax( one, nlp%J, data%RC%V, one, data%RC%U ) elseif ( inform%status == 7 ) then call funJ2(stat, data%RC%X, userdata, nlp%J%val) - call mop_Ax( one, nlp%J, data%RC%V, one, data%RC%U, transpose=.true. ) + call mop_Ax( one, nlp%J, data%RC%V, one, data%RC%U, & + transpose=.true. ) elseif ( inform%status == 9 ) then call funH2(stat, data%RC%X, data%RC%Y, userdata, nlp%H%val) - call mop_Ax( one, nlp%H, data%RC%V, one, data%RC%U, symmetric=.true. ) + call mop_Ax( one, nlp%H, data%RC%V, one, data%RC%U, & + symmetric=.true. ) else nwrong = nwrong + 1 vwrong(nwrong) = test @@ -228,7 +235,8 @@ END SUBROUTINE funH2 control%print_level = -1 inform%status = 1 - call CHECK_verify( nlp, data, control, inform, userdata, funF, funC, funG, funJ, funH ) + call CHECK_verify( nlp, data, control, inform, userdata, & + funF, funC, funG, funJ, funH ) if ( inform%status /= 0 .or. .not. inform%derivative_ok ) then nwrong = nwrong + 1 vwrong(nwrong) = test @@ -236,7 +244,8 @@ END SUBROUTINE funH2 control%print_level = 0 inform%status = 1 - call CHECK_verify( nlp, data, control, inform, userdata, funF, funC, funG, funJ, funH ) + call CHECK_verify( nlp, data, control, inform, userdata, & + funF, funC, funG, funJ, funH ) if ( inform%status /= 0 .or. .not. inform%derivative_ok ) then nwrong = nwrong + 1 vwrong(nwrong) = test @@ -244,7 +253,8 @@ END SUBROUTINE funH2 control%print_level = 1 inform%status = 1 - call CHECK_verify( nlp, data, control, inform, userdata, funF, funC, funG, funJ, funH ) + call CHECK_verify( nlp, data, control, inform, userdata, & + funF, funC, funG, funJ, funH ) if ( inform%status /= 0 .or. .not. inform%derivative_ok ) then nwrong = nwrong + 1 vwrong(nwrong) = test @@ -252,7 +262,8 @@ END SUBROUTINE funH2 control%print_level = 2 inform%status = 1 - call CHECK_verify( nlp, data, control, inform, userdata, funF, funC, funG, funJ, funH ) + call CHECK_verify( nlp, data, control, inform, userdata, & + funF, funC, funG, funJ, funH ) if ( inform%status /= 0 .or. .not. inform%derivative_ok ) then nwrong = nwrong + 1 vwrong(nwrong) = test @@ -260,7 +271,8 @@ END SUBROUTINE funH2 control%print_level = 3 inform%status = 1 - call CHECK_verify( nlp, data, control, inform, userdata, funF, funC, funG, funJ, funH ) + call CHECK_verify( nlp, data, control, inform, userdata, & + funF, funC, funG, funJ, funH ) if ( inform%status /= 0 .or. .not. inform%derivative_ok ) then nwrong = nwrong + 1 vwrong(nwrong) = test @@ -268,7 +280,8 @@ END SUBROUTINE funH2 control%print_level = 4 inform%status = 1 - call CHECK_verify( nlp, data, control, inform, userdata, funF, funC, funG, funJ, funH ) + call CHECK_verify( nlp, data, control, inform, userdata, & + funF, funC, funG, funJ, funH ) if ( inform%status /= 0 .or. .not. inform%derivative_ok ) then nwrong = nwrong + 1 vwrong(nwrong) = test @@ -276,7 +289,8 @@ END SUBROUTINE funH2 control%print_level = 5 inform%status = 1 - call CHECK_verify( nlp, data, control, inform, userdata, funF, funC, funG, funJ, funH ) + call CHECK_verify( nlp, data, control, inform, userdata, & + funF, funC, funG, funJ, funH ) if ( inform%status /= 0 .or. .not. inform%derivative_ok ) then nwrong = nwrong + 1 vwrong(nwrong) = test @@ -290,7 +304,8 @@ END SUBROUTINE funH2 control%checkJ = .true. control%checkH = .false. inform%status = 1 - call CHECK_verify( nlp, data, control, inform, userdata, funF, funC, funG, funJ, funH ) + call CHECK_verify( nlp, data, control, inform, userdata, & + funF, funC, funG, funJ, funH ) if ( inform%status /= 0 .or. .not. inform%derivative_ok ) then nwrong = nwrong + 1 vwrong(nwrong) = test @@ -300,7 +315,8 @@ END SUBROUTINE funH2 control%checkJ = .false. control%checkH = .true. inform%status = 1 - call CHECK_verify( nlp, data, control, inform, userdata, funF, funC, funG, funJ, funH ) + call CHECK_verify( nlp, data, control, inform, userdata, & + funF, funC, funG, funJ, funH ) if ( inform%status /= 0 .or. .not. inform%derivative_ok ) then nwrong = nwrong + 1 vwrong(nwrong) = test @@ -310,7 +326,8 @@ END SUBROUTINE funH2 control%checkJ = .false. control%checkH = .false. inform%status = 1 - call CHECK_verify( nlp, data, control, inform, userdata, funF, funC, funG, funJ, funH ) + call CHECK_verify( nlp, data, control, inform, userdata, & + funF, funC, funG, funJ, funH ) if ( inform%status /= 0 .or. .not. inform%derivative_ok ) then nwrong = nwrong + 1 vwrong(nwrong) = test @@ -320,7 +337,8 @@ END SUBROUTINE funH2 control%checkJ = .true. control%checkH = .true. inform%status = 1 - call CHECK_verify( nlp, data, control, inform, userdata, funF, funC, funG, funJ, funH ) + call CHECK_verify( nlp, data, control, inform, userdata, & + funF, funC, funG, funJ, funH ) if ( inform%status /= 0 .or. .not. inform%derivative_ok ) then nwrong = nwrong + 1 vwrong(nwrong) = test @@ -330,7 +348,8 @@ END SUBROUTINE funH2 control%checkJ = .true. control%checkH = .false. inform%status = 1 - call CHECK_verify( nlp, data, control, inform, userdata, funF, funC, funG, funJ, funH ) + call CHECK_verify( nlp, data, control, inform, userdata, & + funF, funC, funG, funJ, funH ) if ( inform%status /= 0 .or. .not. inform%derivative_ok ) then nwrong = nwrong + 1 vwrong(nwrong) = test @@ -340,7 +359,8 @@ END SUBROUTINE funH2 control%checkJ = .false. control%checkH = .true. inform%status = 1 - call CHECK_verify( nlp, data, control, inform, userdata, funF, funC, funG, funJ, funH ) + call CHECK_verify( nlp, data, control, inform, userdata, & + funF, funC, funG, funJ, funH ) if ( inform%status /= 0 .or. .not. inform%derivative_ok ) then nwrong = nwrong + 1 vwrong(nwrong) = test @@ -350,7 +370,8 @@ END SUBROUTINE funH2 control%checkJ = .false. control%checkH = .false. inform%status = 1 - call CHECK_verify( nlp, data, control, inform, userdata, funF, funC, funG, funJ, funH ) + call CHECK_verify( nlp, data, control, inform, userdata, & + funF, funC, funG, funJ, funH ) if ( inform%status /= 0 .or. .not. inform%derivative_ok ) then nwrong = nwrong + 1 vwrong(nwrong) = test @@ -390,7 +411,8 @@ END SUBROUTINE funH2 nlp%m = -1 inform%status = 1 - call CHECK_verify( nlp, data, control, inform, userdata, funF, funC, funG, funJ, funH) + call CHECK_verify( nlp, data, control, inform, userdata, & + funF, funC, funG, funJ, funH) if ( inform%status /= -3 ) then nwrong = nwrong + 1 vwrong(nwrong) = test @@ -399,7 +421,8 @@ END SUBROUTINE funH2 nlp%n = 0 inform%status = 1 - call CHECK_verify( nlp, data, control, inform, userdata, funF, funC, funG, funJ, funH) + call CHECK_verify( nlp, data, control, inform, userdata, & + funF, funC, funG, funJ, funH) if ( inform%status /= -3 ) then nwrong = nwrong + 1 vwrong(nwrong) = test @@ -407,14 +430,16 @@ END SUBROUTINE funH2 nlp%n = n inform%status = -1 - call CHECK_verify( nlp, data, control, inform, userdata, funF, funC, funG, funJ, funH) + call CHECK_verify( nlp, data, control, inform, userdata, & + funF, funC, funG, funJ, funH) if ( inform%status /= -50 ) then nwrong = nwrong + 1 vwrong(nwrong) = test end if inform%status = 0 - call CHECK_verify( nlp, data, control, inform, userdata, funF, funC, funG, funJ, funH) + call CHECK_verify( nlp, data, control, inform, userdata, & + funF, funC, funG, funJ, funH) if ( inform%status /= -51 ) then nwrong = nwrong + 1 vwrong(nwrong) = test @@ -423,7 +448,8 @@ END SUBROUTINE funH2 temp = nlp%X_l(1) nlp%X_l(1) = nlp%X_u(1) + one inform%status = 1 - call CHECK_verify( nlp, data, control, inform, userdata, funF, funC, funG, funJ, funH) + call CHECK_verify( nlp, data, control, inform, userdata, & + funF, funC, funG, funJ, funH) if ( inform%status /= -57 ) then nwrong = nwrong + 1 vwrong(nwrong) = test @@ -444,18 +470,21 @@ END SUBROUTINE funH2 if ( test == 9 ) then - ! Check initalize, verify, and terminate subroutines with default control parameters. + ! Check initalize, verify, and terminate subroutines with + ! default control parameters. call CHECK_initialize( control ) control%verify_level = 1 inform%status = 1 - call CHECK_verify( nlp, data, control, inform, userdata, funF, funC, funG, funJ, funH ) + call CHECK_verify( nlp, data, control, inform, userdata, & + funF, funC, funG, funJ, funH ) stat = inform%status call CHECK_terminate( data, control, inform ) - if ( inform%status /= 0 .or. stat /= 0 .or. .not. inform%derivative_ok ) then + if ( inform%status /= 0 .or. stat /= 0 .or. .not. & + inform%derivative_ok ) then nwrong = nwrong + 1 vwrong(nwrong) = test end if @@ -472,12 +501,14 @@ END SUBROUTINE funH2 IF ( stat == 0 ) call CHECK_read_specfile( control, 34 ) inform%status = 1 - call CHECK_verify( nlp, data, control, inform, userdata, funF, funC, funG, funJ, funH ) + call CHECK_verify( nlp, data, control, inform, userdata, & + funF, funC, funG, funJ, funH ) stat = inform%status call CHECK_terminate( data, control, inform ) - if ( inform%status /= 0 .or. stat /= 0 .or. .not. inform%derivative_ok ) then + if ( inform%status /= 0 .or. stat /= 0 .or. .not. & + inform%derivative_ok ) then nwrong = nwrong + 1 vwrong(nwrong) = test end if @@ -551,10 +582,12 @@ END SUBROUTINE funH2 call mop_Ax( one, nlp%J, data%RC%V, one, data%RC%U ) elseif ( inform%status == 7 ) then call funJ2(stat, data%RC%X, userdata, nlp%J%val) - call mop_Ax( one, nlp%J, data%RC%V, one, data%RC%U, transpose=.true. ) + call mop_Ax( one, nlp%J, data%RC%V, one, data%RC%U, & + transpose=.true. ) elseif ( inform%status == 9 ) then call funH2(stat, data%RC%X, data%RC%Y, userdata, nlp%H%val) - call mop_Ax( one, nlp%H, data%RC%V, one, data%RC%U, symmetric=.true. ) + call mop_Ax( one, nlp%H, data%RC%V, one, data%RC%U, & + symmetric=.true. ) else nwrong = nwrong + 1 vwrong(nwrong) = test @@ -574,7 +607,8 @@ END SUBROUTINE funH2 control%print_level = -1 inform%status = 1 - call CHECK_verify( nlp, data, control, inform, userdata, funF, funC, funG, funJ, funH ) + call CHECK_verify( nlp, data, control, inform, userdata, & + funF, funC, funG, funJ, funH ) if ( inform%status /= 0 .or. .not. inform%derivative_ok ) then nwrong = nwrong + 1 vwrong(nwrong) = test @@ -582,7 +616,8 @@ END SUBROUTINE funH2 control%print_level = 0 inform%status = 1 - call CHECK_verify( nlp, data, control, inform, userdata, funF, funC, funG, funJ, funH ) + call CHECK_verify( nlp, data, control, inform, userdata, & + funF, funC, funG, funJ, funH ) if ( inform%status /= 0 .or. .not. inform%derivative_ok ) then nwrong = nwrong + 1 vwrong(nwrong) = test @@ -590,7 +625,8 @@ END SUBROUTINE funH2 control%print_level = 1 inform%status = 1 - call CHECK_verify( nlp, data, control, inform, userdata, funF, funC, funG, funJ, funH ) + call CHECK_verify( nlp, data, control, inform, userdata, & + funF, funC, funG, funJ, funH ) if ( inform%status /= 0 .or. .not. inform%derivative_ok ) then nwrong = nwrong + 1 vwrong(nwrong) = test @@ -598,7 +634,8 @@ END SUBROUTINE funH2 control%print_level = 2 inform%status = 1 - call CHECK_verify( nlp, data, control, inform, userdata, funF, funC, funG, funJ, funH ) + call CHECK_verify( nlp, data, control, inform, userdata, & + funF, funC, funG, funJ, funH ) if ( inform%status /= 0 .or. .not. inform%derivative_ok ) then nwrong = nwrong + 1 vwrong(nwrong) = test @@ -606,7 +643,8 @@ END SUBROUTINE funH2 control%print_level = 3 inform%status = 1 - call CHECK_verify( nlp, data, control, inform, userdata, funF, funC, funG, funJ, funH ) + call CHECK_verify( nlp, data, control, inform, userdata, & + funF, funC, funG, funJ, funH ) if ( inform%status /= 0 .or. .not. inform%derivative_ok ) then nwrong = nwrong + 1 vwrong(nwrong) = test @@ -614,7 +652,8 @@ END SUBROUTINE funH2 control%print_level = 4 inform%status = 1 - call CHECK_verify( nlp, data, control, inform, userdata, funF, funC, funG, funJ, funH ) + call CHECK_verify( nlp, data, control, inform, userdata, & + funF, funC, funG, funJ, funH ) if ( inform%status /= 0 .or. .not. inform%derivative_ok ) then nwrong = nwrong + 1 vwrong(nwrong) = test @@ -622,7 +661,8 @@ END SUBROUTINE funH2 control%print_level = 5 inform%status = 1 - call CHECK_verify( nlp, data, control, inform, userdata, funF, funC, funG, funJ, funH ) + call CHECK_verify( nlp, data, control, inform, userdata, & + funF, funC, funG, funJ, funH ) if ( inform%status /= 0 .or. .not. inform%derivative_ok ) then nwrong = nwrong + 1 vwrong(nwrong) = test @@ -636,7 +676,8 @@ END SUBROUTINE funH2 control%checkJ = .true. control%checkH = .false. inform%status = 1 - call CHECK_verify( nlp, data, control, inform, userdata, funF, funC, funG, funJ, funH ) + call CHECK_verify( nlp, data, control, inform, userdata, & + funF, funC, funG, funJ, funH ) if ( inform%status /= 0 .or. .not. inform%derivative_ok ) then nwrong = nwrong + 1 vwrong(nwrong) = test @@ -646,7 +687,8 @@ END SUBROUTINE funH2 control%checkJ = .false. control%checkH = .true. inform%status = 1 - call CHECK_verify( nlp, data, control, inform, userdata, funF, funC, funG, funJ, funH ) + call CHECK_verify( nlp, data, control, inform, userdata, & + funF, funC, funG, funJ, funH ) if ( inform%status /= 0 .or. .not. inform%derivative_ok ) then nwrong = nwrong + 1 vwrong(nwrong) = test @@ -656,7 +698,8 @@ END SUBROUTINE funH2 control%checkJ = .false. control%checkH = .false. inform%status = 1 - call CHECK_verify( nlp, data, control, inform, userdata, funF, funC, funG, funJ, funH ) + call CHECK_verify( nlp, data, control, inform, userdata, & + funF, funC, funG, funJ, funH ) if ( inform%status /= 0 .or. .not. inform%derivative_ok ) then nwrong = nwrong + 1 vwrong(nwrong) = test @@ -666,7 +709,8 @@ END SUBROUTINE funH2 control%checkJ = .true. control%checkH = .true. inform%status = 1 - call CHECK_verify( nlp, data, control, inform, userdata, funF, funC, funG, funJ, funH ) + call CHECK_verify( nlp, data, control, inform, userdata, & + funF, funC, funG, funJ, funH ) if ( inform%status /= 0 .or. .not. inform%derivative_ok ) then nwrong = nwrong + 1 vwrong(nwrong) = test @@ -676,7 +720,8 @@ END SUBROUTINE funH2 control%checkJ = .true. control%checkH = .false. inform%status = 1 - call CHECK_verify( nlp, data, control, inform, userdata, funF, funC, funG, funJ, funH ) + call CHECK_verify( nlp, data, control, inform, userdata, & + funF, funC, funG, funJ, funH ) if ( inform%status /= 0 .or. .not. inform%derivative_ok ) then nwrong = nwrong + 1 vwrong(nwrong) = test @@ -686,7 +731,8 @@ END SUBROUTINE funH2 control%checkJ = .false. control%checkH = .true. inform%status = 1 - call CHECK_verify( nlp, data, control, inform, userdata, funF, funC, funG, funJ, funH ) + call CHECK_verify( nlp, data, control, inform, userdata, & + funF, funC, funG, funJ, funH ) if ( inform%status /= 0 .or. .not. inform%derivative_ok ) then nwrong = nwrong + 1 vwrong(nwrong) = test @@ -696,7 +742,8 @@ END SUBROUTINE funH2 control%checkJ = .false. control%checkH = .false. inform%status = 1 - call CHECK_verify( nlp, data, control, inform, userdata, funF, funC, funG, funJ, funH ) + call CHECK_verify( nlp, data, control, inform, userdata, & + funF, funC, funG, funJ, funH ) if ( inform%status /= 0 .or. .not. inform%derivative_ok ) then nwrong = nwrong + 1 vwrong(nwrong) = test @@ -717,7 +764,8 @@ END SUBROUTINE funH2 control%H_availability = 3 inform%status = 1 - call CHECK_verify( nlp, data, control, inform, userdata, funF, funC, & + call CHECK_verify( nlp, data, control, inform, userdata, & + funF, funC, & funG, eval_Jv=funJv, eval_Hv=funHv ) if ( inform%status /= 0 .or. .not. inform%derivative_ok ) then nwrong = nwrong + 1 @@ -736,7 +784,8 @@ END SUBROUTINE funH2 nlp%m = -1 inform%status = 1 - call CHECK_verify( nlp, data, control, inform, userdata, funF, funC, funG, funJ, funH) + call CHECK_verify( nlp, data, control, inform, userdata, & + funF, funC, funG, funJ, funH) if ( inform%status /= -3 ) then nwrong = nwrong + 1 vwrong(nwrong) = test @@ -745,7 +794,8 @@ END SUBROUTINE funH2 nlp%n = 0 inform%status = 1 - call CHECK_verify( nlp, data, control, inform, userdata, funF, funC, funG, funJ, funH) + call CHECK_verify( nlp, data, control, inform, userdata, & + funF, funC, funG, funJ, funH) if ( inform%status /= -3 ) then nwrong = nwrong + 1 vwrong(nwrong) = test @@ -753,14 +803,16 @@ END SUBROUTINE funH2 nlp%n = n inform%status = -1 - call CHECK_verify( nlp, data, control, inform, userdata, funF, funC, funG, funJ, funH) + call CHECK_verify( nlp, data, control, inform, userdata, & + funF, funC, funG, funJ, funH) if ( inform%status /= -50 ) then nwrong = nwrong + 1 vwrong(nwrong) = test end if inform%status = 0 - call CHECK_verify( nlp, data, control, inform, userdata, funF, funC, funG, funJ, funH) + call CHECK_verify( nlp, data, control, inform, userdata, & + funF, funC, funG, funJ, funH) if ( inform%status /= -51 ) then nwrong = nwrong + 1 vwrong(nwrong) = test @@ -769,7 +821,8 @@ END SUBROUTINE funH2 temp = nlp%X_l(1) nlp%X_l(1) = nlp%X_u(1) + one inform%status = 1 - call CHECK_verify( nlp, data, control, inform, userdata, funF, funC, funG, funJ, funH) + call CHECK_verify( nlp, data, control, inform, userdata, & + funF, funC, funG, funJ, funH) if ( inform%status /= -57 ) then nwrong = nwrong + 1 vwrong(nwrong) = test @@ -788,7 +841,8 @@ END SUBROUTINE funH2 control%verify_level = 0 inform%status = 1 - call CHECK_verify( nlp, data, control, inform, userdata, funF, funC, funG, funJ, funH) + call CHECK_verify( nlp, data, control, inform, userdata, & + funF, funC, funG, funJ, funH) if ( inform%status /= 0 .or. .not. inform%derivative_ok ) then nwrong = nwrong + 1 vwrong(nwrong) = test diff --git a/src/cqp/cqp.F90 b/src/cqp/cqp.F90 index 36b6cc08d0..bd3ebe8070 100644 --- a/src/cqp/cqp.F90 +++ b/src/cqp/cqp.F90 @@ -1954,8 +1954,8 @@ SUBROUTINE CQP_solve( prob, data, control, inform, C_stat, B_stat ) inform%nfacts = 1 IF ( ( control%cpu_time_limit >= zero .AND. & - REAL( time_now - time_start, rp_ ) > control%cpu_time_limit ) .OR. & - ( control%clock_time_limit >= zero .AND. & + REAL( time_now - time_start, rp_ ) > control%cpu_time_limit ) & + .OR. ( control%clock_time_limit >= zero .AND. & clock_now - clock_start > control%clock_time_limit ) ) THEN inform%status = GALAHAD_error_cpu_limit IF ( control%error > 0 .AND. control%print_level > 0 ) & diff --git a/src/dlp/dlp.F90 b/src/dlp/dlp.F90 index 2ea19b9740..f2528d07d5 100644 --- a/src/dlp/dlp.F90 +++ b/src/dlp/dlp.F90 @@ -792,8 +792,8 @@ SUBROUTINE DLP_solve( prob, data, control, inform, C_stat, X_stat ) inform%nfacts = 1 IF ( ( control%cpu_time_limit >= zero .AND. & - REAL( time_now - time_start, rp_ ) > control%cpu_time_limit ) .OR. & - ( control%clock_time_limit >= zero .AND. & + REAL( time_now - time_start, rp_ ) > control%cpu_time_limit ) & + .OR. ( control%clock_time_limit >= zero .AND. & clock_now - clock_start > control%clock_time_limit ) ) THEN inform%status = GALAHAD_error_cpu_limit IF ( control%error > 0 .AND. control%print_level > 0 ) & diff --git a/src/dlp/indlp.F90 b/src/dlp/indlp.F90 index 63b88cb18a..186debc9f3 100644 --- a/src/dlp/indlp.F90 +++ b/src/dlp/indlp.F90 @@ -336,7 +336,7 @@ PROGRAM RUNDLP_DATA_precision DEALLOCATE( IW ) ALLOCATE( prob%A%row( 0 ), STAT = alloc_stat ) IF ( alloc_stat /= 0 ) THEN - WRITE( out, "( ' whoa there - allocate error ', i6 )" ) alloc_stat; STOP + WRITE( out, "( ' stop - allocate error ', i6 )" ) alloc_stat; STOP END IF prob%new_problem_structure = .TRUE. diff --git a/src/dqp/dqp.F90 b/src/dqp/dqp.F90 index 5ea72a8546..dbed9d415d 100644 --- a/src/dqp/dqp.F90 +++ b/src/dqp/dqp.F90 @@ -2022,8 +2022,8 @@ SUBROUTINE DQP_solve( prob, data, control, inform, C_stat, X_stat ) inform%nfacts = 1 IF ( ( control%cpu_time_limit >= zero .AND. & - REAL( time_now - time_start, rp_ ) > control%cpu_time_limit ) .OR. & - ( control%clock_time_limit >= zero .AND. & + REAL( time_now - time_start, rp_ ) > control%cpu_time_limit ) & + .OR. ( control%clock_time_limit >= zero .AND. & clock_now - clock_start > control%clock_time_limit ) ) THEN inform%status = GALAHAD_error_cpu_limit IF ( control%error > 0 .AND. control%print_level > 0 ) & diff --git a/src/dqp/indqp.F90 b/src/dqp/indqp.F90 index 5b8a8aefc5..4534a5b565 100644 --- a/src/dqp/indqp.F90 +++ b/src/dqp/indqp.F90 @@ -367,7 +367,7 @@ PROGRAM RUNDQP_DATA_precision DEALLOCATE( IW ) ALLOCATE( prob%A%row( 0 ), prob%H%row( 0 ), STAT = alloc_stat ) IF ( alloc_stat /= 0 ) THEN - WRITE( out, "( ' whoa there - allocate error ', i6 )" ) alloc_stat ; STOP + WRITE( out, "( ' stop - allocate error ', i6 )" ) alloc_stat ; STOP END IF prob%new_problem_structure = .TRUE. diff --git a/src/dum/hsl_ma57d.f90 b/src/dum/hsl_ma57d.f90 index 17cdd26512..37df8d5685 100644 --- a/src/dum/hsl_ma57d.f90 +++ b/src/dum/hsl_ma57d.f90 @@ -135,10 +135,10 @@ module hsl_ma57_double end type ma57_finfo type ma57_sinfo - real(dp_) :: cond = -1.0_dp_ ! Condition # of matrix (category 1 equations) - real(dp_) :: cond2 = -1.0_dp_ ! Condition # of matrix (category 2 equations) - real(dp_) :: berr = -1.0_dp_ ! Condition # of matrix (category 1 equations) - real(dp_) :: berr2 = -1.0_dp_ ! Condition # of matrix (category 2 equations) + real(dp_) :: cond = -1.0_dp_ ! Condition # of matrix (cat 1 equations) + real(dp_) :: cond2 = -1.0_dp_ ! Condition # of matrix (cat 2 equations) + real(dp_) :: berr = -1.0_dp_ ! Condition # of matrix (cat 1 equations) + real(dp_) :: berr2 = -1.0_dp_ ! Condition # of matrix (cat 2 equations) real(dp_) :: error = -1.0_dp_ ! Estimate of forward error using above data integer(ip_) :: flag = 0 ! Flags success or failure case integer(ip_) :: stat = 0 ! STAT value after allocate failure @@ -413,11 +413,12 @@ subroutine ma57_get_factors(factors,control,nzl,iptrl,lrows,lvals, & nzd,iptrd,drows,dvals,perm,invperm,scale,sinfo) type(ma57_factors), intent(in) :: factors type(ma57_control), intent(in) :: control - real(dp_), intent(out) :: lvals(factors%nebdu),dvals(2*factors%n), & - scale(factors%n) - integer(ip_), intent(out) :: nzl,nzd,iptrl(factors%n+1),lrows(factors%nebdu), & - iptrd(factors%n+1),drows(2*factors%n), & - perm(factors%n),invperm(factors%n) + real(dp_), intent(out) :: lvals(factors%nebdu),dvals(2*factors%n), & + scale(factors%n) + integer(ip_), intent(out) :: nzl,nzd,iptrl(factors%n+1), & + lrows(factors%nebdu), & + iptrd(factors%n+1),drows(2*factors%n), & + perm(factors%n),invperm(factors%n) type(ma57_sinfo), intent(out) :: sinfo IF ( control%lp >= 0 ) WRITE( control%lp, & "( ' We regret that the solution options that you have ', /, & diff --git a/src/dum/hsl_ma57s.f90 b/src/dum/hsl_ma57s.f90 index f401113dbc..d9f185729a 100644 --- a/src/dum/hsl_ma57s.f90 +++ b/src/dum/hsl_ma57s.f90 @@ -135,10 +135,10 @@ module hsl_ma57_single end type ma57_finfo type ma57_sinfo - real(sp_) :: cond = -1.0_sp_ ! Condition # of matrix (category 1 equations) - real(sp_) :: cond2 = -1.0_sp_ ! Condition # of matrix (category 2 equations) - real(sp_) :: berr = -1.0_sp_ ! Condition # of matrix (category 1 equations) - real(sp_) :: berr2 = -1.0_sp_ ! Condition # of matrix (category 2 equations) + real(sp_) :: cond = -1.0_sp_ ! Condition # of matrix (cat 1 equations) + real(sp_) :: cond2 = -1.0_sp_ ! Condition # of matrix (cat 2 equations) + real(sp_) :: berr = -1.0_sp_ ! Condition # of matrix (cat 1 equations) + real(sp_) :: berr2 = -1.0_sp_ ! Condition # of matrix (cat 2 equations) real(sp_) :: error = -1.0_sp_ ! Estimate of forward error using above data integer(ip_) :: flag = 0 ! Flags success or failure case integer(ip_) :: stat = 0 ! STAT value after allocate failure @@ -413,11 +413,12 @@ subroutine ma57_get_factors(factors,control,nzl,iptrl,lrows,lvals, & nzd,iptrd,drows,dvals,perm,invperm,scale,sinfo) type(ma57_factors), intent(in) :: factors type(ma57_control), intent(in) :: control - real(sp_), intent(out) :: lvals(factors%nebdu),dvals(2*factors%n), & - scale(factors%n) - integer(ip_), intent(out) :: nzl,nzd,iptrl(factors%n+1),lrows(factors%nebdu), & - iptrd(factors%n+1),drows(2*factors%n), & - perm(factors%n),invperm(factors%n) + real(sp_), intent(out) :: lvals(factors%nebdu),dvals(2*factors%n), & + scale(factors%n) + integer(ip_), intent(out) :: nzl,nzd,iptrl(factors%n+1), & + lrows(factors%nebdu), & + iptrd(factors%n+1),drows(2*factors%n), & + perm(factors%n),invperm(factors%n) type(ma57_sinfo), intent(out) :: sinfo IF ( control%lp >= 0 ) WRITE( control%lp, & "( ' We regret that the solution options that you have ', /, & diff --git a/src/dum/hsl_ma86s.f90 b/src/dum/hsl_ma86s.f90 index 38c5408a55..9f4b6f9e2f 100644 --- a/src/dum/hsl_ma86s.f90 +++ b/src/dum/hsl_ma86s.f90 @@ -101,8 +101,8 @@ module hsl_MA86_single type block_type integer(ip_) :: bcol ! block column that blk belongs to - integer(ip_) :: blkm ! height of block (number of rows in blk) - integer(ip_) :: blkn ! width of block (number of columns in blk) + integer(ip_) :: blkm ! height of block (# rows in blk) + integer(ip_) :: blkn ! width of block (# columns in blk) integer(long_) :: dblk ! id of the block on the diagonal within the ! block column to which blk belongs integer(ip_) :: dep_initial ! initial dependency count for block, diff --git a/src/dum/hsl_ma97d.f90 b/src/dum/hsl_ma97d.f90 index 6fbe110d12..a38ee1966f 100644 --- a/src/dum/hsl_ma97d.f90 +++ b/src/dum/hsl_ma97d.f90 @@ -91,7 +91,7 @@ module hsl_MA97_double real(dp_) :: small = tiny(one) ! Minimum pivot size logical(lp_) :: solve_blas3 = .false. ! Use sgemm rather than sgemv in solve integer(long_) :: solve_min = 100000 ! Minimum value of info%num_factor - logical(lp_) :: solve_mf = .false. ! Do we use s/n (false) or m/f (true) solve? + logical(lp_) :: solve_mf = .false. ! Use s/n (false) or m/f (true) solve? real(dp_) :: u = 0.01 ! Initial relative pivot threshold integer(ip_) :: unit_diagnostics = 6 ! unit for diagnostic printing. integer(ip_) :: unit_error = 6 ! unit number for error messages diff --git a/src/dum/hsl_ma97s.f90 b/src/dum/hsl_ma97s.f90 index 4b900fcd37..7afb490609 100644 --- a/src/dum/hsl_ma97s.f90 +++ b/src/dum/hsl_ma97s.f90 @@ -91,7 +91,7 @@ module hsl_MA97_single real(sp_) :: small = tiny(one) ! Minimum pivot size logical(lp_) :: solve_blas3 = .false. ! Use sgemm rather than sgemv in solve integer(long_) :: solve_min = 100000 ! Minimum value of info%num_factor - logical(lp_) :: solve_mf = .false. ! Do we use s/n (false) or m/f (true) solve? + logical(lp_) :: solve_mf = .false. ! Use s/n (false) or m/f (true) solve? real(sp_) :: u = 0.01 ! Initial relative pivot threshold integer(ip_) :: unit_diagnostics = 6 ! unit for diagnostic printing. integer(ip_) :: unit_error = 6 ! unit number for error messages diff --git a/src/filtrane/filtrane.F90 b/src/filtrane/filtrane.F90 index 7b7e537aa9..a176d86a36 100644 --- a/src/filtrane/filtrane.F90 +++ b/src/filtrane/filtrane.F90 @@ -569,7 +569,7 @@ MODULE GALAHAD_FILTRANE_precision ! defined by the vector control%group. ! Default : none. - INTEGER ( KIND = ip_ ), POINTER, DIMENSION( : ) :: group ! INTENT( IN ) + INTEGER ( KIND = ip_ ), POINTER, DIMENSION( : ) :: group ! INTENT( IN ) ! group( i ) contains the index of the group to which ! the i-th constrained item is assigned. A constrained diff --git a/src/forthcoming/barc/barcs.f90 b/src/forthcoming/barc/barcs.f90 index d8585ce237..650809587d 100644 --- a/src/forthcoming/barc/barcs.f90 +++ b/src/forthcoming/barc/barcs.f90 @@ -26,6 +26,6 @@ PROGRAM BARC_test max_iter = max( max_iter, iter ) END DO CALL CPU_TIME( te ) - write(6,"( ' max iter, aver cpu, ', i0, 1X, F5.2 )" ) max_iter, & + WRITE( 6, "( ' max iter, aver cpu, ', i0, 1X, F5.2 )" ) max_iter, & ( te - ts ) / n_prob END PROGRAM BARC_test diff --git a/src/glrt/glrtt.F90 b/src/glrt/glrtt.F90 index d7b4714b5a..df90adc5b6 100644 --- a/src/glrt/glrtt.F90 +++ b/src/glrt/glrtt.F90 @@ -148,7 +148,7 @@ PROGRAM GALAHAD_GLRT_test_deck ! WRITE( 6, "( ' its, solution and Lagrange multiplier = ', I6, 2ES12.4 )")& ! inform%iter + inform%iter_pass2, f, inform%multiplier IF ( pass /= 3 .AND. pass /= 6 .AND. pass /= 7 ) & - CALL GLRT_terminate( data, control, inform ) ! delete internal workspace + CALL GLRT_terminate( data, control, inform ) ! delete internal workspace END DO ! ============= diff --git a/src/gltr/gltrt.F90 b/src/gltr/gltrt.F90 index 8219dda8ab..6eaf55d171 100644 --- a/src/gltr/gltrt.F90 +++ b/src/gltr/gltrt.F90 @@ -154,10 +154,10 @@ PROGRAM GALAHAD_GLTR_test_deck DO IF ( pass /= 4 ) THEN - CALL GLTR_solve( nn, radius, f, X( : nn ), R( : nn ), & + CALL GLTR_solve( nn, radius, f, X( : nn ), R( : nn ), & VECTOR( : nn ), data, control, info ) ELSE - CALL GLTR_solve( nn, radius, f, X0, R0, & + CALL GLTR_solve( nn, radius, f, X0, R0, & VECTOR0, data, control, info ) END IF @@ -179,7 +179,7 @@ PROGRAM GALAHAD_GLTR_test_deck CASE ( 3, 7 ) H_vector( 1 ) = - two * VECTOR( 1 ) + VECTOR( 2 ) DO i = 2, n - 1 - H_vector( i ) = VECTOR( i - 1 ) - two * VECTOR( i ) + & + H_vector( i ) = VECTOR( i - 1 ) - two * VECTOR( i ) + & VECTOR( i + 1 ) END DO H_vector( n ) = VECTOR( n - 1 ) - two * VECTOR( n ) diff --git a/src/l1qp/inl1qp.F90 b/src/l1qp/inl1qp.F90 index 35ffac9ed3..37ddf9331e 100644 --- a/src/l1qp/inl1qp.F90 +++ b/src/l1qp/inl1qp.F90 @@ -367,7 +367,7 @@ PROGRAM RUNL1QP_DATA_precision DEALLOCATE( IW ) ALLOCATE( prob%A%row( 0 ), prob%H%row( 0 ), STAT = alloc_stat ) IF ( alloc_stat /= 0 ) THEN - WRITE( out, "( ' whoa there - allocate error ', i6 )" ) alloc_stat ; STOP + WRITE( out, "( ' stop - allocate error ', i6 )" ) alloc_stat ; STOP END IF prob%new_problem_structure = .TRUE. diff --git a/src/l2rt/l2rt.F90 b/src/l2rt/l2rt.F90 index 76089ccbb4..f01c8fb25f 100644 --- a/src/l2rt/l2rt.F90 +++ b/src/l2rt/l2rt.F90 @@ -758,7 +758,7 @@ SUBROUTINE L2RT_solve( m, n, p, sigma, mu, X, U, V, data, control, inform) IF ( inform%status /= 0 ) GO TO 960 array_name = 'gltr: G' - CALL SPACE_resize_array( 0_ip_, data%itmax, data%G, & + CALL SPACE_resize_array( 0_ip_, data%itmax, data%G, & inform%status, inform%alloc_status, array_name = array_name, & deallocate_error_fatal = control%deallocate_error_fatal, & exact_size = control%space_critical, & diff --git a/src/lancelot/lancelot_steering.F90 b/src/lancelot/lancelot_steering.F90 index d3fda2f4a1..8b85a8294b 100644 --- a/src/lancelot/lancelot_steering.F90 +++ b/src/lancelot/lancelot_steering.F90 @@ -2671,7 +2671,7 @@ SUBROUTINE LANCELOT_solve_main( & INTEGER ( KIND = ip_ ), ALLOCATABLE, DIMENSION( : , : ) :: IKEEP, IW1 INTEGER ( KIND = ip_ ), ALLOCATABLE, DIMENSION( : ) :: IW, IVUSE INTEGER ( KIND = ip_ ), ALLOCATABLE, DIMENSION( : ) :: H_col_ptr, L_col_ptr - REAL ( KIND = rp_ ), ALLOCATABLE, DIMENSION( : ) :: & + REAL ( KIND = rp_ ), ALLOCATABLE, DIMENSION( : ) :: & W, RHS, RHS2, P2, G , DIAG REAL ( KIND = rp_ ), ALLOCATABLE, DIMENSION( : , : ) :: W1, OFFDIA diff --git a/src/lancelot/uselancelot.F90 b/src/lancelot/uselancelot.F90 index 29fa03a98e..e9806eebec 100644 --- a/src/lancelot/uselancelot.F90 +++ b/src/lancelot/uselancelot.F90 @@ -1386,9 +1386,9 @@ END SUBROUTINE GROUP_r CALL ELFUN_r ( FUVALS, XT, prob%EPVALU, inform%ncalcf, prob%ITYPEE, & prob%ISTAEV, prob%IELVAR, prob%INTVAR, prob%ISTADH, & - prob%ISTEPA, ICALCF, prob%nel, prob%nel + 1_ip_, & - prob%ISTAEV( prob%nel + 1 ) - 1_ip_, prob%nel + 1_ip_, & - prob%nel + 1_ip_, prob%nel + 1_ip_, prob%nel, lfuval, prob%n, & + prob%ISTEPA, ICALCF, prob%nel, prob%nel + 1_ip_, & + prob%ISTAEV( prob%nel + 1 ) - 1_ip_, prob%nel + 1_ip_, & + prob%nel + 1_ip_, prob%nel + 1_ip_, prob%nel, lfuval, prob%n, & prob%ISTEPA( prob%nel + 1 ) - 1_ip_, 1_ip_, i ) IF ( i /= 0 ) THEN IF ( inform%status == - 1 ) THEN diff --git a/src/lapack/blas.f90 b/src/lapack/blas.f90 index 64150125c2..dff8770fae 100644 --- a/src/lapack/blas.f90 +++ b/src/lapack/blas.f90 @@ -1,4 +1,4 @@ -! THIS VERSION: GALAHAD 4.3 - 2024-01-25 AT 15:32 GMT +! THIS VERSION: GALAHAD 4.3 - 2024-01-28 AT 10:43 GMT #include "galahad_blas.h" @@ -27,8 +27,8 @@ REAL(r8_) FUNCTION DASUM(n, dx, incx) END IF mp1 = m + 1 DO i = mp1, n, 6 - dtemp = dtemp + DABS(dx(i)) + DABS(dx(i+1)) + DABS(dx(i+2)) + & - DABS(dx(i+3)) + DABS(dx(i+4)) + DABS(dx(i+5)) + dtemp = dtemp + DABS(dx(i)) + DABS(dx(i+1)) + DABS(dx(i+2)) & + + DABS(dx(i+3)) + DABS(dx(i+4)) + DABS(dx(i+5)) END DO ELSE nincx = n*incx @@ -148,7 +148,7 @@ REAL(r8_) FUNCTION DDOT(n, dx, incx, dy, incy) END IF mp1 = m + 1 DO i = mp1, n, 5 - dtemp = dtemp + dx(i)*dy(i) + dx(i+1)*dy(i+1) + & + dtemp = dtemp + dx(i)*dy(i) + dx(i+1)*dy(i+1) + & dx(i+2)*dy(i+2) + dx(i+3)*dy(i+3) + dx(i+4)*dy(i+4) END DO ELSE @@ -166,7 +166,7 @@ REAL(r8_) FUNCTION DDOT(n, dx, incx, dy, incy) RETURN END FUNCTION - SUBROUTINE DGEMM(transa, transb, m, n, k, alpha, a, lda, b, ldb, & + SUBROUTINE DGEMM(transa, transb, m, n, k, alpha, a, lda, b, ldb, & beta, c, ldc) USE GALAHAD_KINDS REAL(r8_) :: alpha, beta @@ -195,10 +195,10 @@ SUBROUTINE DGEMM(transa, transb, m, n, k, alpha, a, lda, b, ldb, & nrowb = n END IF info = 0 - IF ((.NOT. nota) .AND. (.NOT. LSAME(transa, 'C')) .AND. (.NOT. & + IF ((.NOT. nota) .AND. (.NOT. LSAME(transa, 'C')) .AND. (.NOT. & LSAME(transa,'T'))) THEN info = 1 - ELSE IF ((.NOT. notb) .AND. (.NOT. LSAME(transb, 'C')) .AND. & + ELSE IF ((.NOT. notb) .AND. (.NOT. LSAME(transb, 'C')) .AND. & (.NOT. LSAME(transb,'T'))) THEN info = 2 ELSE IF (m<0) THEN @@ -218,7 +218,7 @@ SUBROUTINE DGEMM(transa, transb, m, n, k, alpha, a, lda, b, ldb, & CALL XERBLA('DGEMM ', info) RETURN END IF - IF ((m==0) .OR. (n==0) .OR. (((alpha==zero) .OR. (k==0)) .AND. ( & + IF ((m==0) .OR. (n==0) .OR. (((alpha==zero) .OR. (k==0)) .AND. ( & beta==one))) RETURN IF (alpha==zero) THEN IF (beta==zero) THEN @@ -308,7 +308,8 @@ SUBROUTINE DGEMM(transa, transb, m, n, k, alpha, a, lda, b, ldb, & RETURN END SUBROUTINE - SUBROUTINE DGEMV(trans, m, n, alpha, a, lda, x, incx, beta, y, incy) + SUBROUTINE DGEMV(trans, m, n, alpha, a, lda, x, incx, beta, y, & + incy) USE GALAHAD_KINDS REAL(r8_) :: alpha, beta INTEGER(ip_) :: incx, incy, lda, m, n @@ -323,7 +324,7 @@ SUBROUTINE DGEMV(trans, m, n, alpha, a, lda, x, incx, beta, y, incy) EXTERNAL :: XERBLA INTRINSIC :: MAX info = 0 - IF (.NOT. LSAME(trans,'N') .AND. .NOT. LSAME(trans,'T') .AND. & + IF (.NOT. LSAME(trans,'N') .AND. .NOT. LSAME(trans,'T') .AND. & .NOT. LSAME(trans,'C')) THEN info = 1 ELSE IF (m<0) THEN @@ -341,7 +342,7 @@ SUBROUTINE DGEMV(trans, m, n, alpha, a, lda, x, incx, beta, y, incy) CALL XERBLA('DGEMV ', info) RETURN END IF - IF ((m==0) .OR. (n==0) .OR. ((alpha==zero) .AND. (beta== one))) & + IF ((m==0) .OR. (n==0) .OR. ((alpha==zero) .AND. (beta== one))) & RETURN IF (LSAME(trans,'N')) THEN lenx = n @@ -668,7 +669,7 @@ SUBROUTINE DSWAP(n, dx, incx, dy, incy) RETURN END SUBROUTINE - SUBROUTINE DSYMM(side, uplo, m, n, alpha, a, lda, b, ldb, beta, c, & + SUBROUTINE DSYMM(side, uplo, m, n, alpha, a, lda, b, ldb, beta, c, & ldc) USE GALAHAD_KINDS REAL(r8_) :: alpha, beta @@ -710,7 +711,7 @@ SUBROUTINE DSYMM(side, uplo, m, n, alpha, a, lda, b, ldb, beta, c, & CALL XERBLA('DSYMM ', info) RETURN END IF - IF ((m==0) .OR. (n==0) .OR. ((alpha==zero) .AND. (beta== one))) & + IF ((m==0) .OR. (n==0) .OR. ((alpha==zero) .AND. (beta== one))) & RETURN IF (alpha==zero) THEN IF (beta==zero) THEN @@ -1124,8 +1125,8 @@ SUBROUTINE DSYR2(uplo, n, alpha, x, incx, y, incy, a, lda) RETURN END SUBROUTINE - SUBROUTINE DSYR2K(uplo, trans, n, k, alpha, a, lda, b, ldb, beta, c, & - ldc) + SUBROUTINE DSYR2K(uplo, trans, n, k, alpha, a, lda, b, ldb, beta, & + c, ldc) USE GALAHAD_KINDS REAL(r8_) :: alpha, beta INTEGER(ip_) :: k, lda, ldb, ldc, n @@ -1149,8 +1150,8 @@ SUBROUTINE DSYR2K(uplo, trans, n, k, alpha, a, lda, b, ldb, beta, c, & info = 0 IF ((.NOT. upper) .AND. (.NOT. LSAME(uplo,'L'))) THEN info = 1 - ELSE IF ((.NOT. LSAME(trans,'N')) .AND. (.NOT. LSAME(trans, 'T')) & - .AND. (.NOT. LSAME(trans,'C'))) THEN + ELSE IF ((.NOT. LSAME(trans,'N')) .AND. (.NOT. LSAME(trans, & + 'T')) .AND. (.NOT. LSAME(trans,'C'))) THEN info = 2 ELSE IF (n<0) THEN info = 3 @@ -1167,8 +1168,8 @@ SUBROUTINE DSYR2K(uplo, trans, n, k, alpha, a, lda, b, ldb, beta, c, & CALL XERBLA('DSYR2K', info) RETURN END IF - IF ((n==0) .OR. (((alpha==zero) .OR. (k==0)) .AND. (beta== one))) & - RETURN + IF ((n==0) .OR. (((alpha==zero) .OR. (k==0)) .AND. (beta== & + one))) RETURN IF (alpha==zero) THEN IF (upper) THEN IF (beta==zero) THEN @@ -1307,8 +1308,8 @@ SUBROUTINE DSYRK(uplo, trans, n, k, alpha, a, lda, beta, c, ldc) info = 0 IF ((.NOT. upper) .AND. (.NOT. LSAME(uplo,'L'))) THEN info = 1 - ELSE IF ((.NOT. LSAME(trans,'N')) .AND. (.NOT. LSAME(trans, 'T')) & - .AND. (.NOT. LSAME(trans,'C'))) THEN + ELSE IF ((.NOT. LSAME(trans,'N')) .AND. (.NOT. LSAME(trans, & + 'T')) .AND. (.NOT. LSAME(trans,'C'))) THEN info = 2 ELSE IF (n<0) THEN info = 3 @@ -1323,8 +1324,8 @@ SUBROUTINE DSYRK(uplo, trans, n, k, alpha, a, lda, beta, c, ldc) CALL XERBLA('DSYRK ', info) RETURN END IF - IF ((n==0) .OR. (((alpha==zero) .OR. (k==0)) .AND. (beta== one))) & - RETURN + IF ((n==0) .OR. (((alpha==zero) .OR. (k==0)) .AND. (beta== & + one))) RETURN IF (alpha==zero) THEN IF (upper) THEN IF (beta==zero) THEN @@ -1450,7 +1451,7 @@ SUBROUTINE DTBSV(uplo, trans, diag, n, k, a, lda, x, incx) info = 0 IF (.NOT. LSAME(uplo,'U') .AND. .NOT. LSAME(uplo,'L')) THEN info = 1 - ELSE IF (.NOT. LSAME(trans,'N') .AND. .NOT. LSAME(trans,'T') & + ELSE IF (.NOT. LSAME(trans,'N') .AND. .NOT. LSAME(trans,'T') & .AND. .NOT. LSAME(trans,'C')) THEN info = 2 ELSE IF (.NOT. LSAME(diag,'U') .AND. .NOT. LSAME(diag,'N')) THEN @@ -1615,7 +1616,7 @@ SUBROUTINE DTPMV(uplo, trans, diag, n, ap, x, incx) info = 0 IF (.NOT. LSAME(uplo,'U') .AND. .NOT. LSAME(uplo,'L')) THEN info = 1 - ELSE IF (.NOT. LSAME(trans,'N') .AND. .NOT. LSAME(trans,'T') & + ELSE IF (.NOT. LSAME(trans,'N') .AND. .NOT. LSAME(trans,'T') & .AND. .NOT. LSAME(trans,'C')) THEN info = 2 ELSE IF (.NOT. LSAME(diag,'U') .AND. .NOT. LSAME(diag,'N')) THEN @@ -1781,7 +1782,7 @@ SUBROUTINE DTPSV(uplo, trans, diag, n, ap, x, incx) info = 0 IF (.NOT. LSAME(uplo,'U') .AND. .NOT. LSAME(uplo,'L')) THEN info = 1 - ELSE IF (.NOT. LSAME(trans,'N') .AND. .NOT. LSAME(trans,'T') & + ELSE IF (.NOT. LSAME(trans,'N') .AND. .NOT. LSAME(trans,'T') & .AND. .NOT. LSAME(trans,'C')) THEN info = 2 ELSE IF (.NOT. LSAME(diag,'U') .AND. .NOT. LSAME(diag,'N')) THEN @@ -1931,7 +1932,7 @@ SUBROUTINE DTPSV(uplo, trans, diag, n, ap, x, incx) RETURN END SUBROUTINE - SUBROUTINE DTRMM(side, uplo, transa, diag, m, n, alpha, a, lda, b, & + SUBROUTINE DTRMM(side, uplo, transa, diag, m, n, alpha, a, lda, b, & ldb) USE GALAHAD_KINDS REAL(r8_) :: alpha @@ -1960,10 +1961,10 @@ SUBROUTINE DTRMM(side, uplo, transa, diag, m, n, alpha, a, lda, b, & info = 1 ELSE IF ((.NOT. upper) .AND. (.NOT. LSAME(uplo,'L'))) THEN info = 2 - ELSE IF ((.NOT. LSAME(transa,'N')) .AND. (.NOT. LSAME(transa, & + ELSE IF ((.NOT. LSAME(transa,'N')) .AND. (.NOT. LSAME(transa, & 'T')) .AND. (.NOT. LSAME(transa,'C'))) THEN info = 3 - ELSE IF ((.NOT. LSAME(diag,'U')) .AND. (.NOT. LSAME(diag, 'N'))) & + ELSE IF ((.NOT. LSAME(diag,'U')) .AND. (.NOT. LSAME(diag, 'N'))) & THEN info = 4 ELSE IF (m<0) THEN @@ -2137,7 +2138,7 @@ SUBROUTINE DTRMV(uplo, trans, diag, n, a, lda, x, incx) info = 0 IF (.NOT. LSAME(uplo,'U') .AND. .NOT. LSAME(uplo,'L')) THEN info = 1 - ELSE IF (.NOT. LSAME(trans,'N') .AND. .NOT. LSAME(trans,'T') & + ELSE IF (.NOT. LSAME(trans,'N') .AND. .NOT. LSAME(trans,'T') & .AND. .NOT. LSAME(trans,'C')) THEN info = 2 ELSE IF (.NOT. LSAME(diag,'U') .AND. .NOT. LSAME(diag,'N')) THEN @@ -2269,7 +2270,7 @@ SUBROUTINE DTRMV(uplo, trans, diag, n, a, lda, x, incx) RETURN END SUBROUTINE - SUBROUTINE DTRSM(side, uplo, transa, diag, m, n, alpha, a, lda, b, & + SUBROUTINE DTRSM(side, uplo, transa, diag, m, n, alpha, a, lda, b, & ldb) USE GALAHAD_KINDS REAL(r8_) :: alpha @@ -2298,10 +2299,10 @@ SUBROUTINE DTRSM(side, uplo, transa, diag, m, n, alpha, a, lda, b, & info = 1 ELSE IF ((.NOT. upper) .AND. (.NOT. LSAME(uplo,'L'))) THEN info = 2 - ELSE IF ((.NOT. LSAME(transa,'N')) .AND. (.NOT. LSAME(transa, & + ELSE IF ((.NOT. LSAME(transa,'N')) .AND. (.NOT. LSAME(transa, & 'T')) .AND. (.NOT. LSAME(transa,'C'))) THEN info = 3 - ELSE IF ((.NOT. LSAME(diag,'U')) .AND. (.NOT. LSAME(diag, 'N'))) & + ELSE IF ((.NOT. LSAME(diag,'U')) .AND. (.NOT. LSAME(diag, 'N'))) & THEN info = 4 ELSE IF (m<0) THEN @@ -2499,7 +2500,7 @@ SUBROUTINE DTRSV(uplo, trans, diag, n, a, lda, x, incx) info = 0 IF (.NOT. LSAME(uplo,'U') .AND. .NOT. LSAME(uplo,'L')) THEN info = 1 - ELSE IF (.NOT. LSAME(trans,'N') .AND. .NOT. LSAME(trans,'T') & + ELSE IF (.NOT. LSAME(trans,'N') .AND. .NOT. LSAME(trans,'T') & .AND. .NOT. LSAME(trans,'C')) THEN info = 2 ELSE IF (.NOT. LSAME(diag,'U') .AND. .NOT. LSAME(diag,'N')) THEN @@ -2753,9 +2754,9 @@ LOGICAL FUNCTION LSAME(ca, cb) IF (inta>=97 .AND. inta<=122) inta = inta - 32 IF (intb>=97 .AND. intb<=122) intb = intb - 32 ELSE IF (zcode==233 .OR. zcode==169) THEN - IF (inta>=129 .AND. inta<=137 .OR. inta>=145 .AND. inta<=153 & + IF (inta>=129 .AND. inta<=137 .OR. inta>=145 .AND. inta<=153 & .OR. inta>=162 .AND. inta<=169) inta = inta + 64 - IF (intb>=129 .AND. intb<=137 .OR. intb>=145 .AND. intb<=153 & + IF (intb>=129 .AND. intb<=137 .OR. intb>=145 .AND. intb<=153 & .OR. intb>=162 .AND. intb<=169) intb = intb + 64 ELSE IF (zcode==218 .OR. zcode==250) THEN IF (inta>=225 .AND. inta<=250) inta = inta - 32 @@ -2787,7 +2788,7 @@ REAL(r4_) FUNCTION SASUM(n, sx, incx) END IF mp1 = m + 1 DO i = mp1, n, 6 - stemp = stemp + ABS(sx(i)) + ABS(sx(i+1)) + ABS(sx(i+2)) + & + stemp = stemp + ABS(sx(i)) + ABS(sx(i+1)) + ABS(sx(i+2)) + & ABS(sx(i+3)) + ABS(sx(i+4)) + ABS(sx(i+5)) END DO ELSE @@ -2900,7 +2901,7 @@ REAL(r4_) FUNCTION SDOT(n, sx, incx, sy, incy) END IF mp1 = m + 1 DO i = mp1, n, 5 - stemp = stemp + sx(i)*sy(i) + sx(i+1)*sy(i+1) + & + stemp = stemp + sx(i)*sy(i) + sx(i+1)*sy(i+1) + & sx(i+2)*sy(i+2) + sx(i+3)*sy(i+3) + sx(i+4)*sy(i+4) END DO ELSE @@ -2918,7 +2919,7 @@ REAL(r4_) FUNCTION SDOT(n, sx, incx, sy, incy) RETURN END FUNCTION - SUBROUTINE SGEMM(transa, transb, m, n, k, alpha, a, lda, b, ldb, & + SUBROUTINE SGEMM(transa, transb, m, n, k, alpha, a, lda, b, ldb, & beta, c, ldc) USE GALAHAD_KINDS REAL(r4_) :: alpha, beta @@ -2947,10 +2948,10 @@ SUBROUTINE SGEMM(transa, transb, m, n, k, alpha, a, lda, b, ldb, & nrowb = n END IF info = 0 - IF ((.NOT. nota) .AND. (.NOT. LSAME(transa, 'C')) .AND. (.NOT. & + IF ((.NOT. nota) .AND. (.NOT. LSAME(transa, 'C')) .AND. (.NOT. & LSAME(transa,'T'))) THEN info = 1 - ELSE IF ((.NOT. notb) .AND. (.NOT. LSAME(transb, 'C')) .AND. & + ELSE IF ((.NOT. notb) .AND. (.NOT. LSAME(transb, 'C')) .AND. & (.NOT. LSAME(transb,'T'))) THEN info = 2 ELSE IF (m<0) THEN @@ -2970,7 +2971,7 @@ SUBROUTINE SGEMM(transa, transb, m, n, k, alpha, a, lda, b, ldb, & CALL XERBLA('SGEMM ', info) RETURN END IF - IF ((m==0) .OR. (n==0) .OR. (((alpha==zero) .OR. (k==0)) .AND. ( & + IF ((m==0) .OR. (n==0) .OR. (((alpha==zero) .OR. (k==0)) .AND. ( & beta==one))) RETURN IF (alpha==zero) THEN IF (beta==zero) THEN @@ -3060,7 +3061,8 @@ SUBROUTINE SGEMM(transa, transb, m, n, k, alpha, a, lda, b, ldb, & RETURN END SUBROUTINE - SUBROUTINE SGEMV(trans, m, n, alpha, a, lda, x, incx, beta, y, incy) + SUBROUTINE SGEMV(trans, m, n, alpha, a, lda, x, incx, beta, y, & + incy) USE GALAHAD_KINDS REAL(r4_) :: alpha, beta INTEGER(ip_) :: incx, incy, lda, m, n @@ -3075,7 +3077,7 @@ SUBROUTINE SGEMV(trans, m, n, alpha, a, lda, x, incx, beta, y, incy) EXTERNAL :: XERBLA INTRINSIC :: MAX info = 0 - IF (.NOT. LSAME(trans,'N') .AND. .NOT. LSAME(trans,'T') .AND. & + IF (.NOT. LSAME(trans,'N') .AND. .NOT. LSAME(trans,'T') .AND. & .NOT. LSAME(trans,'C')) THEN info = 1 ELSE IF (m<0) THEN @@ -3093,7 +3095,7 @@ SUBROUTINE SGEMV(trans, m, n, alpha, a, lda, x, incx, beta, y, incy) CALL XERBLA('SGEMV ', info) RETURN END IF - IF ((m==0) .OR. (n==0) .OR. ((alpha==zero) .AND. (beta== one))) & + IF ((m==0) .OR. (n==0) .OR. ((alpha==zero) .AND. (beta== one))) & RETURN IF (LSAME(trans,'N')) THEN lenx = n @@ -3420,7 +3422,7 @@ SUBROUTINE SSWAP(n, sx, incx, sy, incy) RETURN END SUBROUTINE - SUBROUTINE SSYMM(side, uplo, m, n, alpha, a, lda, b, ldb, beta, c, & + SUBROUTINE SSYMM(side, uplo, m, n, alpha, a, lda, b, ldb, beta, c, & ldc) USE GALAHAD_KINDS REAL(r4_) :: alpha, beta @@ -3462,7 +3464,7 @@ SUBROUTINE SSYMM(side, uplo, m, n, alpha, a, lda, b, ldb, beta, c, & CALL XERBLA('SSYMM ', info) RETURN END IF - IF ((m==0) .OR. (n==0) .OR. ((alpha==zero) .AND. (beta== one))) & + IF ((m==0) .OR. (n==0) .OR. ((alpha==zero) .AND. (beta== one))) & RETURN IF (alpha==zero) THEN IF (beta==zero) THEN @@ -3876,8 +3878,8 @@ SUBROUTINE SSYR2(uplo, n, alpha, x, incx, y, incy, a, lda) RETURN END SUBROUTINE - SUBROUTINE SSYR2K(uplo, trans, n, k, alpha, a, lda, b, ldb, beta, c, & - ldc) + SUBROUTINE SSYR2K(uplo, trans, n, k, alpha, a, lda, b, ldb, beta, & + c, ldc) USE GALAHAD_KINDS REAL(r4_) :: alpha, beta INTEGER(ip_) :: k, lda, ldb, ldc, n @@ -3901,8 +3903,8 @@ SUBROUTINE SSYR2K(uplo, trans, n, k, alpha, a, lda, b, ldb, beta, c, & info = 0 IF ((.NOT. upper) .AND. (.NOT. LSAME(uplo,'L'))) THEN info = 1 - ELSE IF ((.NOT. LSAME(trans,'N')) .AND. (.NOT. LSAME(trans, 'T')) & - .AND. (.NOT. LSAME(trans,'C'))) THEN + ELSE IF ((.NOT. LSAME(trans,'N')) .AND. (.NOT. LSAME(trans, & + 'T')) .AND. (.NOT. LSAME(trans,'C'))) THEN info = 2 ELSE IF (n<0) THEN info = 3 @@ -3919,8 +3921,8 @@ SUBROUTINE SSYR2K(uplo, trans, n, k, alpha, a, lda, b, ldb, beta, c, & CALL XERBLA('SSYR2K', info) RETURN END IF - IF ((n==0) .OR. (((alpha==zero) .OR. (k==0)) .AND. (beta== one))) & - RETURN + IF ((n==0) .OR. (((alpha==zero) .OR. (k==0)) .AND. (beta== & + one))) RETURN IF (alpha==zero) THEN IF (upper) THEN IF (beta==zero) THEN @@ -4059,8 +4061,8 @@ SUBROUTINE SSYRK(uplo, trans, n, k, alpha, a, lda, beta, c, ldc) info = 0 IF ((.NOT. upper) .AND. (.NOT. LSAME(uplo,'L'))) THEN info = 1 - ELSE IF ((.NOT. LSAME(trans,'N')) .AND. (.NOT. LSAME(trans, 'T')) & - .AND. (.NOT. LSAME(trans,'C'))) THEN + ELSE IF ((.NOT. LSAME(trans,'N')) .AND. (.NOT. LSAME(trans, & + 'T')) .AND. (.NOT. LSAME(trans,'C'))) THEN info = 2 ELSE IF (n<0) THEN info = 3 @@ -4075,8 +4077,8 @@ SUBROUTINE SSYRK(uplo, trans, n, k, alpha, a, lda, beta, c, ldc) CALL XERBLA('SSYRK ', info) RETURN END IF - IF ((n==0) .OR. (((alpha==zero) .OR. (k==0)) .AND. (beta== one))) & - RETURN + IF ((n==0) .OR. (((alpha==zero) .OR. (k==0)) .AND. (beta== & + one))) RETURN IF (alpha==zero) THEN IF (upper) THEN IF (beta==zero) THEN @@ -4202,7 +4204,7 @@ SUBROUTINE STBSV(uplo, trans, diag, n, k, a, lda, x, incx) info = 0 IF (.NOT. LSAME(uplo,'U') .AND. .NOT. LSAME(uplo,'L')) THEN info = 1 - ELSE IF (.NOT. LSAME(trans,'N') .AND. .NOT. LSAME(trans,'T') & + ELSE IF (.NOT. LSAME(trans,'N') .AND. .NOT. LSAME(trans,'T') & .AND. .NOT. LSAME(trans,'C')) THEN info = 2 ELSE IF (.NOT. LSAME(diag,'U') .AND. .NOT. LSAME(diag,'N')) THEN @@ -4367,7 +4369,7 @@ SUBROUTINE STPMV(uplo, trans, diag, n, ap, x, incx) info = 0 IF (.NOT. LSAME(uplo,'U') .AND. .NOT. LSAME(uplo,'L')) THEN info = 1 - ELSE IF (.NOT. LSAME(trans,'N') .AND. .NOT. LSAME(trans,'T') & + ELSE IF (.NOT. LSAME(trans,'N') .AND. .NOT. LSAME(trans,'T') & .AND. .NOT. LSAME(trans,'C')) THEN info = 2 ELSE IF (.NOT. LSAME(diag,'U') .AND. .NOT. LSAME(diag,'N')) THEN @@ -4533,7 +4535,7 @@ SUBROUTINE STPSV(uplo, trans, diag, n, ap, x, incx) info = 0 IF (.NOT. LSAME(uplo,'U') .AND. .NOT. LSAME(uplo,'L')) THEN info = 1 - ELSE IF (.NOT. LSAME(trans,'N') .AND. .NOT. LSAME(trans,'T') & + ELSE IF (.NOT. LSAME(trans,'N') .AND. .NOT. LSAME(trans,'T') & .AND. .NOT. LSAME(trans,'C')) THEN info = 2 ELSE IF (.NOT. LSAME(diag,'U') .AND. .NOT. LSAME(diag,'N')) THEN @@ -4683,7 +4685,7 @@ SUBROUTINE STPSV(uplo, trans, diag, n, ap, x, incx) RETURN END SUBROUTINE - SUBROUTINE STRMM(side, uplo, transa, diag, m, n, alpha, a, lda, b, & + SUBROUTINE STRMM(side, uplo, transa, diag, m, n, alpha, a, lda, b, & ldb) USE GALAHAD_KINDS REAL(r4_) :: alpha @@ -4712,10 +4714,10 @@ SUBROUTINE STRMM(side, uplo, transa, diag, m, n, alpha, a, lda, b, & info = 1 ELSE IF ((.NOT. upper) .AND. (.NOT. LSAME(uplo,'L'))) THEN info = 2 - ELSE IF ((.NOT. LSAME(transa,'N')) .AND. (.NOT. LSAME(transa, & + ELSE IF ((.NOT. LSAME(transa,'N')) .AND. (.NOT. LSAME(transa, & 'T')) .AND. (.NOT. LSAME(transa,'C'))) THEN info = 3 - ELSE IF ((.NOT. LSAME(diag,'U')) .AND. (.NOT. LSAME(diag, 'N'))) & + ELSE IF ((.NOT. LSAME(diag,'U')) .AND. (.NOT. LSAME(diag, 'N'))) & THEN info = 4 ELSE IF (m<0) THEN @@ -4889,7 +4891,7 @@ SUBROUTINE STRMV(uplo, trans, diag, n, a, lda, x, incx) info = 0 IF (.NOT. LSAME(uplo,'U') .AND. .NOT. LSAME(uplo,'L')) THEN info = 1 - ELSE IF (.NOT. LSAME(trans,'N') .AND. .NOT. LSAME(trans,'T') & + ELSE IF (.NOT. LSAME(trans,'N') .AND. .NOT. LSAME(trans,'T') & .AND. .NOT. LSAME(trans,'C')) THEN info = 2 ELSE IF (.NOT. LSAME(diag,'U') .AND. .NOT. LSAME(diag,'N')) THEN @@ -5021,7 +5023,7 @@ SUBROUTINE STRMV(uplo, trans, diag, n, a, lda, x, incx) RETURN END SUBROUTINE - SUBROUTINE STRSM(side, uplo, transa, diag, m, n, alpha, a, lda, b, & + SUBROUTINE STRSM(side, uplo, transa, diag, m, n, alpha, a, lda, b, & ldb) USE GALAHAD_KINDS REAL(r4_) :: alpha @@ -5050,10 +5052,10 @@ SUBROUTINE STRSM(side, uplo, transa, diag, m, n, alpha, a, lda, b, & info = 1 ELSE IF ((.NOT. upper) .AND. (.NOT. LSAME(uplo,'L'))) THEN info = 2 - ELSE IF ((.NOT. LSAME(transa,'N')) .AND. (.NOT. LSAME(transa, & + ELSE IF ((.NOT. LSAME(transa,'N')) .AND. (.NOT. LSAME(transa, & 'T')) .AND. (.NOT. LSAME(transa,'C'))) THEN info = 3 - ELSE IF ((.NOT. LSAME(diag,'U')) .AND. (.NOT. LSAME(diag, 'N'))) & + ELSE IF ((.NOT. LSAME(diag,'U')) .AND. (.NOT. LSAME(diag, 'N'))) & THEN info = 4 ELSE IF (m<0) THEN @@ -5251,7 +5253,7 @@ SUBROUTINE STRSV(uplo, trans, diag, n, a, lda, x, incx) info = 0 IF (.NOT. LSAME(uplo,'U') .AND. .NOT. LSAME(uplo,'L')) THEN info = 1 - ELSE IF (.NOT. LSAME(trans,'N') .AND. .NOT. LSAME(trans,'T') & + ELSE IF (.NOT. LSAME(trans,'N') .AND. .NOT. LSAME(trans,'T') & .AND. .NOT. LSAME(trans,'C')) THEN info = 2 ELSE IF (.NOT. LSAME(diag,'U') .AND. .NOT. LSAME(diag,'N')) THEN @@ -5390,7 +5392,7 @@ SUBROUTINE XERBLA(srname, info) INTRINSIC :: LEN_TRIM WRITE (*, FMT=9999) srname(1:LEN_TRIM(srname)), info STOP - 9999 FORMAT (' ** On entry to ', A, ' parameter number ', I2, ' had ', & + 9999 FORMAT (' ** On entry to ', A, ' parameter number ', I2, ' had ', & 'an illegal value') END SUBROUTINE @@ -5468,7 +5470,7 @@ SUBROUTINE ZDSCAL(n, da, zx, incx) RETURN END SUBROUTINE - SUBROUTINE ZGEMM(transa, transb, m, n, k, alpha, a, lda, b, ldb, & + SUBROUTINE ZGEMM(transa, transb, m, n, k, alpha, a, lda, b, ldb, & beta, c, ldc) USE GALAHAD_KINDS COMPLEX(c8_) :: alpha, beta @@ -5501,10 +5503,10 @@ SUBROUTINE ZGEMM(transa, transb, m, n, k, alpha, a, lda, b, ldb, & nrowb = n END IF info = 0 - IF ((.NOT. nota) .AND. (.NOT. conja) .AND. (.NOT. LSAME(transa, & + IF ((.NOT. nota) .AND. (.NOT. conja) .AND. (.NOT. LSAME(transa, & 'T'))) THEN info = 1 - ELSE IF ((.NOT. notb) .AND. (.NOT. conjb) .AND. (.NOT. LSAME( & + ELSE IF ((.NOT. notb) .AND. (.NOT. conjb) .AND. (.NOT. LSAME( & transb,'T'))) THEN info = 2 ELSE IF (m<0) THEN @@ -5524,7 +5526,7 @@ SUBROUTINE ZGEMM(transa, transb, m, n, k, alpha, a, lda, b, ldb, & CALL XERBLA('ZGEMM ', info) RETURN END IF - IF ((m==0) .OR. (n==0) .OR. (((alpha==zero) .OR. (k==0)) .AND. ( & + IF ((m==0) .OR. (n==0) .OR. (((alpha==zero) .OR. (k==0)) .AND. ( & beta==one))) RETURN IF (alpha==zero) THEN IF (beta==zero) THEN @@ -5692,7 +5694,8 @@ SUBROUTINE ZGEMM(transa, transb, m, n, k, alpha, a, lda, b, ldb, & RETURN END SUBROUTINE - SUBROUTINE ZGEMV(trans, m, n, alpha, a, lda, x, incx, beta, y, incy) + SUBROUTINE ZGEMV(trans, m, n, alpha, a, lda, x, incx, beta, y, & + incy) USE GALAHAD_KINDS COMPLEX(c8_) :: alpha, beta INTEGER(ip_) :: incx, incy, lda, m, n @@ -5710,7 +5713,7 @@ SUBROUTINE ZGEMV(trans, m, n, alpha, a, lda, x, incx, beta, y, incy) EXTERNAL :: XERBLA INTRINSIC :: DCONJG, MAX info = 0 - IF (.NOT. LSAME(trans,'N') .AND. .NOT. LSAME(trans,'T') .AND. & + IF (.NOT. LSAME(trans,'N') .AND. .NOT. LSAME(trans,'T') .AND. & .NOT. LSAME(trans,'C')) THEN info = 1 ELSE IF (m<0) THEN @@ -5728,7 +5731,7 @@ SUBROUTINE ZGEMV(trans, m, n, alpha, a, lda, x, incx, beta, y, incy) CALL XERBLA('ZGEMV ', info) RETURN END IF - IF ((m==0) .OR. (n==0) .OR. ((alpha==zero) .AND. (beta== one))) & + IF ((m==0) .OR. (n==0) .OR. ((alpha==zero) .AND. (beta== one))) & RETURN noconj = LSAME(trans, 'T') IF (LSAME(trans,'N')) THEN @@ -6111,7 +6114,7 @@ SUBROUTINE ZSWAP(n, zx, incx, zy, incy) RETURN END SUBROUTINE - SUBROUTINE ZTRMM(side, uplo, transa, diag, m, n, alpha, a, lda, b, & + SUBROUTINE ZTRMM(side, uplo, transa, diag, m, n, alpha, a, lda, b, & ldb) USE GALAHAD_KINDS COMPLEX(c8_) :: alpha @@ -6143,10 +6146,10 @@ SUBROUTINE ZTRMM(side, uplo, transa, diag, m, n, alpha, a, lda, b, & info = 1 ELSE IF ((.NOT. upper) .AND. (.NOT. LSAME(uplo,'L'))) THEN info = 2 - ELSE IF ((.NOT. LSAME(transa,'N')) .AND. (.NOT. LSAME(transa, & + ELSE IF ((.NOT. LSAME(transa,'N')) .AND. (.NOT. LSAME(transa, & 'T')) .AND. (.NOT. LSAME(transa,'C'))) THEN info = 3 - ELSE IF ((.NOT. LSAME(diag,'U')) .AND. (.NOT. LSAME(diag, 'N'))) & + ELSE IF ((.NOT. LSAME(diag,'U')) .AND. (.NOT. LSAME(diag, 'N'))) & THEN info = 4 ELSE IF (m<0) THEN @@ -6354,7 +6357,7 @@ SUBROUTINE ZTRMV(uplo, trans, diag, n, a, lda, x, incx) info = 0 IF (.NOT. LSAME(uplo,'U') .AND. .NOT. LSAME(uplo,'L')) THEN info = 1 - ELSE IF (.NOT. LSAME(trans,'N') .AND. .NOT. LSAME(trans,'T') & + ELSE IF (.NOT. LSAME(trans,'N') .AND. .NOT. LSAME(trans,'T') & .AND. .NOT. LSAME(trans,'C')) THEN info = 2 ELSE IF (.NOT. LSAME(diag,'U') .AND. .NOT. LSAME(diag,'N')) THEN @@ -6517,7 +6520,7 @@ SUBROUTINE ZTRMV(uplo, trans, diag, n, a, lda, x, incx) RETURN END SUBROUTINE - SUBROUTINE ZTRSM(side, uplo, transa, diag, m, n, alpha, a, lda, b, & + SUBROUTINE ZTRSM(side, uplo, transa, diag, m, n, alpha, a, lda, b, & ldb) USE GALAHAD_KINDS COMPLEX(c8_) :: alpha @@ -6549,10 +6552,10 @@ SUBROUTINE ZTRSM(side, uplo, transa, diag, m, n, alpha, a, lda, b, & info = 1 ELSE IF ((.NOT. upper) .AND. (.NOT. LSAME(uplo,'L'))) THEN info = 2 - ELSE IF ((.NOT. LSAME(transa,'N')) .AND. (.NOT. LSAME(transa, & + ELSE IF ((.NOT. LSAME(transa,'N')) .AND. (.NOT. LSAME(transa, & 'T')) .AND. (.NOT. LSAME(transa,'C'))) THEN info = 3 - ELSE IF ((.NOT. LSAME(diag,'U')) .AND. (.NOT. LSAME(diag, 'N'))) & + ELSE IF ((.NOT. LSAME(diag,'U')) .AND. (.NOT. LSAME(diag, 'N'))) & THEN info = 4 ELSE IF (m<0) THEN diff --git a/src/lapack/lapack.f90 b/src/lapack/lapack.f90 index e30bd7dea0..b27b6b517c 100644 --- a/src/lapack/lapack.f90 +++ b/src/lapack/lapack.f90 @@ -1,15 +1,15 @@ -! THIS VERSION: GALAHAD 4.3 - 2024-01-25 AT 15:32 GMT +! THIS VERSION: GALAHAD 4.3 - 2024-01-28 AT 10:43 GMT #include "galahad_lapack.h" ! Reference lapack, see http://www.netlib.org/lapack/explore-html/ - SUBROUTINE DBDSQR(uplo, n, ncvt, nru, ncc, d, e, vt, ldvt, u, ldu, & + SUBROUTINE DBDSQR(uplo, n, ncvt, nru, ncc, d, e, vt, ldvt, u, ldu, & c, ldc, work, info) USE GALAHAD_KINDS CHARACTER :: uplo INTEGER(ip_) :: info, ldc, ldu, ldvt, n, ncc, ncvt, nru - REAL(r8_) :: c(ldc, *), d(*), e(*), u(ldu, *), vt(ldvt, *), & + REAL(r8_) :: c(ldc, *), d(*), e(*), u(ldu, *), vt(ldvt, *), & work(*) REAL(r8_) :: zero PARAMETER (zero=0.0_r8_) @@ -28,15 +28,15 @@ SUBROUTINE DBDSQR(uplo, n, ncvt, nru, ncc, d, e, vt, ldvt, u, ldu, & INTEGER(ip_) :: maxitr PARAMETER (maxitr=6) LOGICAL :: lower, rotate - INTEGER(ip_) :: i, idir, isub, iter, iterdivn, j, ll, lll, m, & + INTEGER(ip_) :: i, idir, isub, iter, iterdivn, j, ll, lll, m, & maxitdivn, nm1, nm12, nm13, oldll, oldm - REAL(r8_) :: abse, abss, cosl, cosr, cs, eps, f, g, h, mu, oldcs, & - oldsn, r, shift, sigmn, sigmx, sinl, sinr, sll, smax, smin, sminl, & - sminoa, sn, thresh, tol, tolmul, unfl + REAL(r8_) :: abse, abss, cosl, cosr, cs, eps, f, g, h, mu, oldcs, & + oldsn, r, shift, sigmn, sigmx, sinl, sinr, sll, smax, smin, & + sminl, sminoa, sn, thresh, tol, tolmul, unfl LOGICAL :: LSAME REAL(r8_) :: DLAMCH EXTERNAL :: LSAME, DLAMCH - EXTERNAL :: DLARTG, DLAS2, DLASQ1, DLASR, DLASV2, & + EXTERNAL :: DLARTG, DLAS2, DLASQ1, DLASR, DLASV2, & DROT, DSCAL, DSWAP, XERBLA INTRINSIC :: ABS, DBLE, MAX, MIN, SIGN, SQRT info = 0 @@ -51,12 +51,12 @@ SUBROUTINE DBDSQR(uplo, n, ncvt, nru, ncc, d, e, vt, ldvt, u, ldu, & info = -4 ELSE IF (ncc<0) THEN info = -5 - ELSE IF ((ncvt==0 .AND. ldvt<1) .OR. (ncvt>0 .AND. ldvt0 .AND. ldvt0 .AND. ldc0 .AND. ldc0) CALL DLASR('R', 'V', 'F', nru, n, work(1), work(n), & + IF (nru>0) CALL DLASR('R', 'V', 'F', nru, n, work(1), work(n), & u, ldu) - IF (ncc>0) CALL DLASR('L', 'V', 'F', n, ncc, work(1), work(n), & + IF (ncc>0) CALL DLASR('L', 'V', 'F', n, ncc, work(1), work(n), & c, ldc) END IF tolmul = MAX(ten, MIN(hndrd,eps**meigth)) @@ -153,16 +153,16 @@ SUBROUTINE DBDSQR(uplo, n, ncvt, nru, ncc, d, e, vt, ldvt, u, ldu, & 90 CONTINUE ll = ll + 1 IF (ll==m-1) THEN - CALL DLASV2(d(m-1), e(m-1), d(m), sigmn, sigmx, sinr, cosr, & + CALL DLASV2(d(m-1), e(m-1), d(m), sigmn, sigmx, sinr, cosr, & sinl, cosl) d(m-1) = sigmx e(m-1) = zero d(m) = sigmn - IF (ncvt>0) CALL DROT(ncvt, vt(m-1,1), ldvt, vt(m,1), ldvt, & + IF (ncvt>0) CALL DROT(ncvt, vt(m-1,1), ldvt, vt(m,1), ldvt, & cosr, sinr) - IF (nru>0) CALL DROT(nru, u(1,m-1), 1_ip_, u(1,m), 1_ip_, cosl, & + IF (nru>0) CALL DROT(nru, u(1,m-1), 1_ip_, u(1,m), 1_ip_, cosl, & sinl) - IF (ncc>0) CALL DROT(ncc, c(m-1,1), ldc, c(m,1), ldc, cosl, & + IF (ncc>0) CALL DROT(ncc, c(m-1,1), ldc, c(m,1), ldc, cosl, & sinl) m = m - 2 GO TO 60 @@ -175,7 +175,7 @@ SUBROUTINE DBDSQR(uplo, n, ncvt, nru, ncc, d, e, vt, ldvt, u, ldu, & END IF END IF IF (idir==1) THEN - IF (ABS(e(m-1))<=ABS(tol)*ABS(d(m)) .OR. (tol0) CALL DLASR('L', 'V', 'F', m-ll+1, ncvt, work(1), & + IF (ncvt>0) CALL DLASR('L', 'V', 'F', m-ll+1, ncvt, work(1), & work(n), vt(ll,1), ldvt) - IF (nru>0) CALL DLASR('R', 'V', 'F', nru, m-ll+1, & + IF (nru>0) CALL DLASR('R', 'V', 'F', nru, m-ll+1, & work(nm12+1), work(nm13+1), u(1,ll), ldu) - IF (ncc>0) CALL DLASR('L', 'V', 'F', m-ll+1, ncc, & + IF (ncc>0) CALL DLASR('L', 'V', 'F', m-ll+1, ncc, & work(nm12+1), work(nm13+1), c(ll,1), ldc) IF (ABS(e(m-1))<=thresh) e(m-1) = zero ELSE @@ -266,11 +266,11 @@ SUBROUTINE DBDSQR(uplo, n, ncvt, nru, ncc, d, e, vt, ldvt, u, ldu, & h = d(ll)*cs d(ll) = h*oldcs e(ll) = h*oldsn - IF (ncvt>0) CALL DLASR('L', 'V', 'B', m-ll+1, ncvt, & + IF (ncvt>0) CALL DLASR('L', 'V', 'B', m-ll+1, ncvt, & work(nm12+1), work(nm13+1), vt(ll,1), ldvt) - IF (nru>0) CALL DLASR('R', 'V', 'B', nru, m-ll+1, work(1), & + IF (nru>0) CALL DLASR('R', 'V', 'B', nru, m-ll+1, work(1), & work(n), u(1,ll), ldu) - IF (ncc>0) CALL DLASR('L', 'V', 'B', m-ll+1, ncc, work(1), & + IF (ncc>0) CALL DLASR('L', 'V', 'B', m-ll+1, ncc, work(1), & work(n), c(ll,1), ldc) IF (ABS(e(ll))<=thresh) e(ll) = zero END IF @@ -299,11 +299,11 @@ SUBROUTINE DBDSQR(uplo, n, ncvt, nru, ncc, d, e, vt, ldvt, u, ldu, & work(i-ll+1+nm13) = sinl END DO e(m-1) = f - IF (ncvt>0) CALL DLASR('L', 'V', 'F', m-ll+1, ncvt, work(1), & + IF (ncvt>0) CALL DLASR('L', 'V', 'F', m-ll+1, ncvt, work(1), & work(n), vt(ll,1), ldvt) - IF (nru>0) CALL DLASR('R', 'V', 'F', nru, m-ll+1, & + IF (nru>0) CALL DLASR('R', 'V', 'F', nru, m-ll+1, & work(nm12+1), work(nm13+1), u(1,ll), ldu) - IF (ncc>0) CALL DLASR('L', 'V', 'F', m-ll+1, ncc, & + IF (ncc>0) CALL DLASR('L', 'V', 'F', m-ll+1, ncc, & work(nm12+1), work(nm13+1), c(ll,1), ldc) IF (ABS(e(m-1))<=thresh) e(m-1) = zero ELSE @@ -331,11 +331,11 @@ SUBROUTINE DBDSQR(uplo, n, ncvt, nru, ncc, d, e, vt, ldvt, u, ldu, & END DO e(ll) = f IF (ABS(e(ll))<=thresh) e(ll) = zero - IF (ncvt>0) CALL DLASR('L', 'V', 'B', m-ll+1, ncvt, & + IF (ncvt>0) CALL DLASR('L', 'V', 'B', m-ll+1, ncvt, & work(nm12+1), work(nm13+1), vt(ll,1), ldvt) - IF (nru>0) CALL DLASR('R', 'V', 'B', nru, m-ll+1, work(1), & + IF (nru>0) CALL DLASR('R', 'V', 'B', nru, m-ll+1, work(1), & work(n), u(1,ll), ldu) - IF (ncc>0) CALL DLASR('L', 'V', 'B', m-ll+1, ncc, work(1), & + IF (ncc>0) CALL DLASR('L', 'V', 'B', m-ll+1, ncc, work(1), & work(n), c(ll,1), ldc) END IF END IF @@ -359,9 +359,9 @@ SUBROUTINE DBDSQR(uplo, n, ncvt, nru, ncc, d, e, vt, ldvt, u, ldu, & IF (isub/=n+1-i) THEN d(isub) = d(n+1-i) d(n+1-i) = smin - IF (ncvt>0) CALL DSWAP(ncvt, vt(isub,1), ldvt, vt(n+1-i,1), & + IF (ncvt>0) CALL DSWAP(ncvt, vt(isub,1), ldvt, vt(n+1-i,1), & ldvt) - IF (nru>0) CALL DSWAP(nru, u(1,isub), 1_ip_, u(1,n+1-i), & + IF (nru>0) CALL DSWAP(nru, u(1,isub), 1_ip_, u(1,n+1-i), & 1_ip_) IF (ncc>0) CALL DSWAP(ncc, c(isub,1), ldc, c(n+1-i,1), ldc) END IF @@ -420,15 +420,15 @@ SUBROUTINE DGEBD2(m, n, a, lda, d, e, tauq, taup, work, info) CALL DLARFG(m-i+1, a(i,i), a(MIN(i+1,m),i), 1_ip_, tauq(i)) d(i) = a(i, i) a(i, i) = one - IF (i=n) THEN DO j = i, i + nb - 1 a(j, j) = d(j) @@ -536,7 +537,7 @@ SUBROUTINE DGEBRD(m, n, a, lda, d, e, tauq, taup, work, lwork, info) END DO END IF END DO - CALL DGEBD2(m-i+1, n-i+1, a(i,i), lda, d(i), e(i), tauq(i), & + CALL DGEBD2(m-i+1, n-i+1, a(i,i), lda, d(i), e(i), tauq(i), & taup(i), work, iinfo) work(1) = ws RETURN @@ -570,9 +571,9 @@ SUBROUTINE DGEHD2(n, ilo, ihi, a, lda, tau, work, info) CALL DLARFG(ihi-i, a(i+1,i), a(MIN(i+2,n),i), 1_ip_, tau(i)) aii = a(i+1, i) a(i+1, i) = one - CALL DLARF('Right', ihi, ihi-i, a(i+1,i), 1_ip_, tau(i), a(1, & + CALL DLARF('Right', ihi, ihi-i, a(i+1,i), 1_ip_, tau(i), a(1, & i+1), lda, work) - CALL DLARF('Left', ihi-i, n-i, a(i+1,i), 1_ip_, tau(i), a(i+1, & + CALL DLARF('Left', ihi-i, n-i, a(i+1,i), 1_ip_, tau(i), a(i+1, & i+1), lda, work) a(i+1, i) = aii END DO @@ -588,10 +589,10 @@ SUBROUTINE DGEHRD(n, ilo, ihi, a, lda, tau, work, lwork, info) REAL(r8_) :: zero, one PARAMETER (zero=0.0_r8_, one=1.0_r8_) LOGICAL :: lquery - INTEGER(ip_) :: i, ib, iinfo, iwt, j, ldwork, lwkopt, nb, nbmin, & + INTEGER(ip_) :: i, ib, iinfo, iwt, j, ldwork, lwkopt, nb, nbmin, & nh, nx REAL(r8_) :: ei - EXTERNAL :: DAXPY, DGEHD2, DGEMM, DLAHR2, DLARFB, & + EXTERNAL :: DAXPY, DGEHD2, DGEMM, DLAHR2, DLARFB, & DTRMM, XERBLA INTRINSIC :: MAX, MIN INTEGER(ip_) :: ILAENV @@ -637,7 +638,7 @@ SUBROUTINE DGEHRD(n, ilo, ihi, a, lda, tau, work, lwork, info) nx = MAX(nb, ILAENV(3_ip_,'DGEHRD',' ',n,ilo,ihi,-1_ip_)) IF (nx=(n*nbmin+tsize)) THEN nb = (lwork-tsize)/n @@ -654,21 +655,21 @@ SUBROUTINE DGEHRD(n, ilo, ihi, a, lda, tau, work, lwork, info) iwt = 1 + n*nb DO i = ilo, ihi - 1 - nx, nb ib = MIN(nb, ihi-i) - CALL DLAHR2(ihi, i, ib, a(1,i), lda, tau(i), work(iwt), ldt, & + CALL DLAHR2(ihi, i, ib, a(1,i), lda, tau(i), work(iwt), ldt, & work, ldwork) ei = a(i+ib, i+ib-1) a(i+ib, i+ib-1) = one - CALL DGEMM('No transpose', 'Transpose', ihi, ihi-i-ib+1, ib, & + CALL DGEMM('No transpose', 'Transpose', ihi, ihi-i-ib+1, ib, & -one, work, ldwork, a(i+ib,i), lda, one, a(1,i+ib), lda) a(i+ib, i+ib-1) = ei - CALL DTRMM('Right', 'Lower', 'Transpose', 'Unit', i, ib-1, & + CALL DTRMM('Right', 'Lower', 'Transpose', 'Unit', i, ib-1, & one, a(i+1,i), lda, work, ldwork) DO j = 0, ib - 2 - CALL DAXPY(i, -one, work(ldwork*j+1), 1_ip_, a(1,i+j+1), & + CALL DAXPY(i, -one, work(ldwork*j+1), 1_ip_, a(1,i+j+1), & 1_ip_) END DO - CALL DLARFB('Left', 'Transpose', 'Forward', 'Columnwise', & - ihi-i, n-i-ib+1, ib, a(i+1,i), lda, work(iwt), ldt, a(i+1, & + CALL DLARFB('Left', 'Transpose', 'Forward', 'Columnwise', & + ihi-i, n-i-ib+1, ib, a(i+1,i), lda, work(iwt), ldt, a(i+1, & i+ib), lda, work, ldwork) END DO END IF @@ -705,8 +706,8 @@ SUBROUTINE DGELQ2(m, n, a, lda, tau, work, info) IF (izero .AND. anrmbignum) THEN - CALL DLASCL('G', 0_ip_, 0_ip_, anrm, bignum, m, n, a, lda, info) + CALL DLASCL('G', 0_ip_, 0_ip_, anrm, bignum, m, n, a, lda, & + info) iascl = 2 ELSE IF (anrm==zero) THEN CALL DLASET('F', MAX(m,n), nrhs, zero, zero, b, ldb) @@ -873,28 +876,28 @@ SUBROUTINE DGELS(trans, m, n, nrhs, a, lda, b, ldb, work, lwork, & bnrm = DLANGE('M', brow, nrhs, b, ldb, rwork) ibscl = 0 IF (bnrm>zero .AND. bnrmbignum) THEN - CALL DLASCL('G', 0_ip_, 0_ip_, bnrm, bignum, brow, nrhs, b, ldb, & - info) + CALL DLASCL('G', 0_ip_, 0_ip_, bnrm, bignum, brow, nrhs, b, & + ldb, info) ibscl = 2 END IF IF (m>=n) THEN CALL DGEQRF(m, n, a, lda, work(1), work(mn+1), lwork-mn, info) IF (.NOT. tpsd) THEN - CALL DORMQR('Left', 'Transpose', m, nrhs, n, a, lda, work(1), & + CALL DORMQR('Left', 'Transpose', m, nrhs, n, a, lda, work(1), & b, ldb, work(mn+1), lwork-mn, info) - CALL DTRTRS('Upper', 'No transpose', 'Non-unit', n, nrhs, a, & + CALL DTRTRS('Upper', 'No transpose', 'Non-unit', n, nrhs, a, & lda, b, ldb, info) IF (info>0) THEN RETURN END IF scllen = n ELSE - CALL DTRTRS('Upper', 'Transpose', 'Non-unit', n, nrhs, a, lda, & - b, ldb, info) + CALL DTRTRS('Upper', 'Transpose', 'Non-unit', n, nrhs, a, & + lda, b, ldb, info) IF (info>0) THEN RETURN END IF @@ -903,14 +906,14 @@ SUBROUTINE DGELS(trans, m, n, nrhs, a, lda, b, ldb, work, lwork, & b(i, j) = zero END DO END DO - CALL DORMQR('Left', 'No transpose', m, nrhs, n, a, lda, & + CALL DORMQR('Left', 'No transpose', m, nrhs, n, a, lda, & work(1), b, ldb, work(mn+1), lwork-mn, info) scllen = m END IF ELSE CALL DGELQF(m, n, a, lda, work(1), work(mn+1), lwork-mn, info) IF (.NOT. tpsd) THEN - CALL DTRTRS('Lower', 'No transpose', 'Non-unit', m, nrhs, a, & + CALL DTRTRS('Lower', 'No transpose', 'Non-unit', m, nrhs, a, & lda, b, ldb, info) IF (info>0) THEN RETURN @@ -920,14 +923,14 @@ SUBROUTINE DGELS(trans, m, n, nrhs, a, lda, b, ldb, work, lwork, & b(i, j) = zero END DO END DO - CALL DORMLQ('Left', 'Transpose', n, nrhs, m, a, lda, work(1), & + CALL DORMLQ('Left', 'Transpose', n, nrhs, m, a, lda, work(1), & b, ldb, work(mn+1), lwork-mn, info) scllen = n ELSE - CALL DORMLQ('Left', 'No transpose', n, nrhs, m, a, lda, & + CALL DORMLQ('Left', 'No transpose', n, nrhs, m, a, lda, & work(1), b, ldb, work(mn+1), lwork-mn, info) - CALL DTRTRS('Lower', 'Transpose', 'Non-unit', m, nrhs, a, lda, & - b, ldb, info) + CALL DTRTRS('Lower', 'Transpose', 'Non-unit', m, nrhs, a, & + lda, b, ldb, info) IF (info>0) THEN RETURN END IF @@ -935,17 +938,17 @@ SUBROUTINE DGELS(trans, m, n, nrhs, a, lda, b, ldb, work, lwork, & END IF END IF IF (iascl==1) THEN - CALL DLASCL('G', 0_ip_, 0_ip_, anrm, smlnum, scllen, nrhs, b, & + CALL DLASCL('G', 0_ip_, 0_ip_, anrm, smlnum, scllen, nrhs, b, & ldb, info) ELSE IF (iascl==2) THEN - CALL DLASCL('G', 0_ip_, 0_ip_, anrm, bignum, scllen, nrhs, b, & + CALL DLASCL('G', 0_ip_, 0_ip_, anrm, bignum, scllen, nrhs, b, & ldb, info) END IF IF (ibscl==1) THEN - CALL DLASCL('G', 0_ip_, 0_ip_, smlnum, bnrm, scllen, nrhs, b, & + CALL DLASCL('G', 0_ip_, 0_ip_, smlnum, bnrm, scllen, nrhs, b, & ldb, info) ELSE IF (ibscl==2) THEN - CALL DLASCL('G', 0_ip_, 0_ip_, bignum, bnrm, scllen, nrhs, b, & + CALL DLASCL('G', 0_ip_, 0_ip_, bignum, bnrm, scllen, nrhs, b, & ldb, info) END IF 50 CONTINUE @@ -953,7 +956,7 @@ SUBROUTINE DGELS(trans, m, n, nrhs, a, lda, b, ldb, work, lwork, & RETURN END SUBROUTINE - SUBROUTINE DGELSD(m, n, nrhs, a, lda, b, ldb, s, rcond, rank, work, & + SUBROUTINE DGELSD(m, n, nrhs, a, lda, b, ldb, s, rcond, rank, work, & lwork, iwork, info) USE GALAHAD_KINDS INTEGER(ip_) :: info, lda, ldb, lwork, m, n, nrhs, rank @@ -963,12 +966,12 @@ SUBROUTINE DGELSD(m, n, nrhs, a, lda, b, ldb, s, rcond, rank, work, & REAL(r8_) :: zero, one, two PARAMETER (zero=0.0_r8_, one=1.0_r8_, two=2.0_r8_) LOGICAL :: lquery - INTEGER(ip_) :: iascl, ibscl, ie, il, itau, itaup, itauq, ldwork, & - liwork, maxmn, maxwrk, minmn, minwrk, mm, mnthr, nlvl, nwork, & + INTEGER(ip_) :: iascl, ibscl, ie, il, itau, itaup, itauq, ldwork, & + liwork, maxmn, maxwrk, minmn, minwrk, mm, mnthr, nlvl, nwork, & smlsiz, wlalsd REAL(r8_) :: anrm, bignum, bnrm, eps, sfmin, smlnum - EXTERNAL :: DGEBRD, DGELQF, DGEQRF, DLABAD, & - DLACPY, DLALSD, DLASCL, DLASET, DORMBR, DORMLQ, & + EXTERNAL :: DGEBRD, DGELQF, DGEQRF, DLABAD, & + DLACPY, DLALSD, DLASCL, DLASET, DORMBR, DORMLQ, & DORMQR, XERBLA INTEGER(ip_) :: ILAENV REAL(r8_) :: DLAMCH, DLANGE @@ -994,24 +997,25 @@ SUBROUTINE DGELSD(m, n, nrhs, a, lda, b, ldb, s, rcond, rank, work, & minwrk = 1 liwork = 1 minmn = MAX(1, minmn) - nlvl = MAX(INT(LOG(DBLE(minmn)/DBLE(smlsiz+1))/LOG(two))+1, 0_ip_) + nlvl = MAX(INT(LOG(DBLE(minmn)/DBLE(smlsiz+1))/LOG(two))+1, & + 0_ip_) IF (info==0) THEN maxwrk = 0 liwork = 3*minmn*nlvl + 11*minmn mm = m IF (m>=n .AND. m>=mnthr) THEN mm = n - maxwrk = MAX(maxwrk, n+n*ILAENV(1_ip_,'DGEQRF',' ',m,n,-1_ip_, & - -1_ip_)) - maxwrk = MAX(maxwrk, n+nrhs*ILAENV(1_ip_,'DORMQR','LT',m,nrhs, & - n, -1_ip_)) + maxwrk = MAX(maxwrk, n+n*ILAENV(1_ip_,'DGEQRF',' ',m,n, & + -1_ip_,-1_ip_)) + maxwrk = MAX(maxwrk, n+nrhs*ILAENV(1_ip_,'DORMQR','LT',m, & + nrhs,n, -1_ip_)) END IF IF (m>=n) THEN - maxwrk = MAX(maxwrk, 3*n+(mm+n)*ILAENV(1_ip_,'DGEBRD',' ',mm, & + maxwrk = MAX(maxwrk, 3*n+(mm+n)*ILAENV(1_ip_,'DGEBRD',' ',mm, & n, -1_ip_,-1_ip_)) - maxwrk = MAX(maxwrk, 3*n+nrhs*ILAENV(1_ip_,'DORMBR','QLT',mm, & + maxwrk = MAX(maxwrk, 3*n+nrhs*ILAENV(1_ip_,'DORMBR','QLT',mm, & nrhs,n,-1_ip_)) - maxwrk = MAX(maxwrk, 3*n+(n-1)*ILAENV(1_ip_,'DORMBR','PLN',n, & + maxwrk = MAX(maxwrk, 3*n+(n-1)*ILAENV(1_ip_,'DORMBR','PLN',n, & nrhs,n,-1_ip_)) wlalsd = 9*n + 2*n*smlsiz + 8*n*nlvl + n*nrhs + (smlsiz+1)**2 maxwrk = MAX(maxwrk, 3*n+wlalsd) @@ -1020,29 +1024,29 @@ SUBROUTINE DGELSD(m, n, nrhs, a, lda, b, ldb, s, rcond, rank, work, & IF (n>m) THEN wlalsd = 9*m + 2*m*smlsiz + 8*m*nlvl + m*nrhs + (smlsiz+1)**2 IF (n>=mnthr) THEN - maxwrk = m + m*ILAENV(1_ip_, 'DGELQF', ' ', m, n, -1_ip_, & + maxwrk = m + m*ILAENV(1_ip_, 'DGELQF', ' ', m, n, -1_ip_, & -1_ip_) - maxwrk = MAX(maxwrk, m*m+4*m+2*m*ILAENV(1_ip_,'DGEBRD',' ', & + maxwrk = MAX(maxwrk, m*m+4*m+2*m*ILAENV(1_ip_,'DGEBRD',' ', & m,m ,-1_ip_,-1_ip_)) - maxwrk = MAX(maxwrk, m*m+4*m+nrhs*ILAENV(1_ip_,'DORMBR', & + maxwrk = MAX(maxwrk, m*m+4*m+nrhs*ILAENV(1_ip_,'DORMBR', & 'QLT', m,nrhs,m,-1_ip_)) - maxwrk = MAX(maxwrk, m*m+4*m+(m-1)*ILAENV(1_ip_,'DORMBR', & + maxwrk = MAX(maxwrk, m*m+4*m+(m-1)*ILAENV(1_ip_,'DORMBR', & 'PLN' ,m,nrhs,m,-1_ip_)) IF (nrhs>1) THEN maxwrk = MAX(maxwrk, m*m+m+m*nrhs) ELSE maxwrk = MAX(maxwrk, m*m+2*m) END IF - maxwrk = MAX(maxwrk, m+nrhs*ILAENV(1_ip_,'DORMLQ','LT',n, & + maxwrk = MAX(maxwrk, m+nrhs*ILAENV(1_ip_,'DORMLQ','LT',n, & nrhs, m,-1_ip_)) maxwrk = MAX(maxwrk, m*m+4*m+wlalsd) maxwrk = MAX(maxwrk, 4*m+m*m+MAX(m,2*m-4,nrhs,n-3*m)) ELSE - maxwrk = 3*m + (n+m)*ILAENV(1_ip_, 'DGEBRD', ' ', m, n, & + maxwrk = 3*m + (n+m)*ILAENV(1_ip_, 'DGEBRD', ' ', m, n, & -1_ip_, -1_ip_ ) - maxwrk = MAX(maxwrk, 3*m+nrhs*ILAENV(1_ip_,'DORMBR','QLT',m, & - nrhs,n,-1_ip_)) - maxwrk = MAX(maxwrk, 3*m+m*ILAENV(1_ip_,'DORMBR','PLN',n, & + maxwrk = MAX(maxwrk, 3*m+nrhs*ILAENV(1_ip_,'DORMBR','QLT', & + m, nrhs,n,-1_ip_)) + maxwrk = MAX(maxwrk, 3*m+m*ILAENV(1_ip_,'DORMBR','PLN',n, & nrhs, m,-1_ip_)) maxwrk = MAX(maxwrk, 3*m+wlalsd) END IF @@ -1073,10 +1077,12 @@ SUBROUTINE DGELSD(m, n, nrhs, a, lda, b, ldb, s, rcond, rank, work, & anrm = DLANGE('M', m, n, a, lda, work) iascl = 0 IF (anrm>zero .AND. anrmbignum) THEN - CALL DLASCL('G', 0_ip_, 0_ip_, anrm, bignum, m, n, a, lda, info) + CALL DLASCL('G', 0_ip_, 0_ip_, anrm, bignum, m, n, a, lda, & + info) iascl = 2 ELSE IF (anrm==zero) THEN CALL DLASET('F', MAX(m,n), nrhs, zero, zero, b, ldb) @@ -1087,11 +1093,11 @@ SUBROUTINE DGELSD(m, n, nrhs, a, lda, b, ldb, s, rcond, rank, work, & bnrm = DLANGE('M', m, nrhs, b, ldb, work) ibscl = 0 IF (bnrm>zero .AND. bnrmbignum) THEN - CALL DLASCL('G', 0_ip_, 0_ip_, bnrm, bignum, m, nrhs, b, ldb, & + CALL DLASCL('G', 0_ip_, 0_ip_, bnrm, bignum, m, nrhs, b, ldb, & info) ibscl = 2 END IF @@ -1102,9 +1108,9 @@ SUBROUTINE DGELSD(m, n, nrhs, a, lda, b, ldb, s, rcond, rank, work, & mm = n itau = 1 nwork = itau + n - CALL DGEQRF(m, n, a, lda, work(itau), work(nwork), & + CALL DGEQRF(m, n, a, lda, work(itau), work(nwork), & lwork-nwork+1, info) - CALL DORMQR('L', 'T', m, nrhs, n, a, lda, work(itau), b, ldb, & + CALL DORMQR('L', 'T', m, nrhs, n, a, lda, work(itau), b, ldb, & work(nwork), lwork-nwork+1, info) IF (n>1) THEN CALL DLASET('L', n-1, n-1, zero, zero, a(2,1), lda) @@ -1114,25 +1120,25 @@ SUBROUTINE DGELSD(m, n, nrhs, a, lda, b, ldb, s, rcond, rank, work, & itauq = ie + n itaup = itauq + n nwork = itaup + n - CALL DGEBRD(mm, n, a, lda, s, work(ie), work(itauq), & + CALL DGEBRD(mm, n, a, lda, s, work(ie), work(itauq), & work(itaup), work(nwork), lwork-nwork+1, info) - CALL DORMBR('Q', 'L', 'T', mm, nrhs, n, a, lda, work(itauq), b, & + CALL DORMBR('Q', 'L', 'T', mm, nrhs, n, a, lda, work(itauq), b, & ldb, work(nwork), lwork-nwork+1, info) - CALL DLALSD('U', smlsiz, n, nrhs, s, work(ie), b, ldb, rcond, & + CALL DLALSD('U', smlsiz, n, nrhs, s, work(ie), b, ldb, rcond, & rank, work(nwork), iwork, info) IF (info/=0) THEN GO TO 10 END IF - CALL DORMBR('P', 'L', 'N', n, nrhs, n, a, lda, work(itaup), b, & + CALL DORMBR('P', 'L', 'N', n, nrhs, n, a, lda, work(itaup), b, & ldb, work(nwork), lwork-nwork+1, info) - ELSE IF (n>=mnthr .AND. lwork>=4*m+m*m+MAX(m,2*m-4,nrhs,n-3*m, & + ELSE IF (n>=mnthr .AND. lwork>=4*m+m*m+MAX(m,2*m-4,nrhs,n-3*m, & wlalsd)) THEN ldwork = m - IF (lwork>=MAX(4*m+m*lda+MAX(m,2*m-4,nrhs, n-3*m), & + IF (lwork>=MAX(4*m+m*lda+MAX(m,2*m-4,nrhs, n-3*m), & m*lda+m+m*nrhs,4*m+m*lda+wlalsd)) ldwork = lda itau = 1 nwork = m + 1 - CALL DGELQF(m, n, a, lda, work(itau), work(nwork), & + CALL DGELQF(m, n, a, lda, work(itau), work(nwork), & lwork-nwork+1, info) il = nwork CALL DLACPY('L', m, m, a, lda, work(il), ldwork) @@ -1141,54 +1147,54 @@ SUBROUTINE DGELSD(m, n, nrhs, a, lda, b, ldb, s, rcond, rank, work, & itauq = ie + m itaup = itauq + m nwork = itaup + m - CALL DGEBRD(m, m, work(il), ldwork, s, work(ie), work(itauq), & + CALL DGEBRD(m, m, work(il), ldwork, s, work(ie), work(itauq), & work(itaup), work(nwork), lwork-nwork+1, info) - CALL DORMBR('Q', 'L', 'T', m, nrhs, m, work(il), ldwork, & + CALL DORMBR('Q', 'L', 'T', m, nrhs, m, work(il), ldwork, & work(itauq), b, ldb, work(nwork), lwork-nwork+1, info) - CALL DLALSD('U', smlsiz, m, nrhs, s, work(ie), b, ldb, rcond, & + CALL DLALSD('U', smlsiz, m, nrhs, s, work(ie), b, ldb, rcond, & rank, work(nwork), iwork, info) IF (info/=0) THEN GO TO 10 END IF - CALL DORMBR('P', 'L', 'N', m, nrhs, m, work(il), ldwork, & + CALL DORMBR('P', 'L', 'N', m, nrhs, m, work(il), ldwork, & work(itaup), b, ldb, work(nwork), lwork-nwork+1, info) CALL DLASET('F', n-m, nrhs, zero, zero, b(m+1,1), ldb) nwork = itau + m - CALL DORMLQ('L', 'T', n, nrhs, m, a, lda, work(itau), b, ldb, & + CALL DORMLQ('L', 'T', n, nrhs, m, a, lda, work(itau), b, ldb, & work(nwork), lwork-nwork+1, info) ELSE ie = 1 itauq = ie + m itaup = itauq + m nwork = itaup + m - CALL DGEBRD(m, n, a, lda, s, work(ie), work(itauq), work(itaup), & - work(nwork), lwork-nwork+1, info) - CALL DORMBR('Q', 'L', 'T', m, nrhs, n, a, lda, work(itauq), b, & + CALL DGEBRD(m, n, a, lda, s, work(ie), work(itauq), & + work(itaup), work(nwork), lwork-nwork+1, info) + CALL DORMBR('Q', 'L', 'T', m, nrhs, n, a, lda, work(itauq), b, & ldb, work(nwork), lwork-nwork+1, info) - CALL DLALSD('L', smlsiz, m, nrhs, s, work(ie), b, ldb, rcond, & + CALL DLALSD('L', smlsiz, m, nrhs, s, work(ie), b, ldb, rcond, & rank, work(nwork), iwork, info) IF (info/=0) THEN GO TO 10 END IF - CALL DORMBR('P', 'L', 'N', n, nrhs, m, a, lda, work(itaup), b, & + CALL DORMBR('P', 'L', 'N', n, nrhs, m, a, lda, work(itaup), b, & ldb, work(nwork), lwork-nwork+1, info) END IF IF (iascl==1) THEN - CALL DLASCL('G', 0_ip_, 0_ip_, anrm, smlnum, n, nrhs, b, ldb, & + CALL DLASCL('G', 0_ip_, 0_ip_, anrm, smlnum, n, nrhs, b, ldb, & info) - CALL DLASCL('G', 0_ip_, 0_ip_, smlnum, anrm, minmn, 1_ip_, s, & + CALL DLASCL('G', 0_ip_, 0_ip_, smlnum, anrm, minmn, 1_ip_, s, & minmn, info) ELSE IF (iascl==2) THEN - CALL DLASCL('G', 0_ip_, 0_ip_, anrm, bignum, n, nrhs, b, ldb, & + CALL DLASCL('G', 0_ip_, 0_ip_, anrm, bignum, n, nrhs, b, ldb, & info) - CALL DLASCL('G', 0_ip_, 0_ip_, bignum, anrm, minmn, 1_ip_, s, & + CALL DLASCL('G', 0_ip_, 0_ip_, bignum, anrm, minmn, 1_ip_, s, & minmn, info) END IF IF (ibscl==1) THEN - CALL DLASCL('G', 0_ip_, 0_ip_, smlnum, bnrm, n, nrhs, b, ldb, & + CALL DLASCL('G', 0_ip_, 0_ip_, smlnum, bnrm, n, nrhs, b, ldb, & info) ELSE IF (ibscl==2) THEN - CALL DLASCL('G', 0_ip_, 0_ip_, bignum, bnrm, n, nrhs, b, ldb, & + CALL DLASCL('G', 0_ip_, 0_ip_, bignum, bnrm, n, nrhs, b, ldb, & info) END IF 10 CONTINUE @@ -1197,7 +1203,7 @@ SUBROUTINE DGELSD(m, n, nrhs, a, lda, b, ldb, s, rcond, rank, work, & RETURN END SUBROUTINE - SUBROUTINE DGELSS(m, n, nrhs, a, lda, b, ldb, s, rcond, rank, work, & + SUBROUTINE DGELSS(m, n, nrhs, a, lda, b, ldb, s, rcond, rank, work, & lwork, info) USE GALAHAD_KINDS INTEGER(ip_) :: info, lda, ldb, lwork, m, n, nrhs, rank @@ -1206,15 +1212,15 @@ SUBROUTINE DGELSS(m, n, nrhs, a, lda, b, ldb, s, rcond, rank, work, & REAL(r8_) :: zero, one PARAMETER (zero=0.0_r8_, one=1.0_r8_) LOGICAL :: lquery - INTEGER(ip_) :: bdspac, bl, chunk, i, iascl, ibscl, ie, il, itau, & - itaup, itauq, iwork, ldwork, maxmn, maxwrk, minmn, minwrk, mm, & + INTEGER(ip_) :: bdspac, bl, chunk, i, iascl, ibscl, ie, il, itau, & + itaup, itauq, iwork, ldwork, maxmn, maxwrk, minmn, minwrk, mm, & mnthr - INTEGER(ip_) :: lwork_dgeqrf, lwork_dormqr, lwork_dgebrd, & + INTEGER(ip_) :: lwork_dgeqrf, lwork_dormqr, lwork_dgebrd, & lwork_dormbr, lwork_dorgbr, lwork_dormlq, lwork_dgelqf REAL(r8_) :: anrm, bignum, bnrm, eps, sfmin, smlnum, thr REAL(r8_) :: dum(1) - EXTERNAL :: DBDSQR, DCOPY, DGEBRD, DGELQF, DGEMM, & - DGEMV, DGEQRF, DLABAD, DLACPY, DLASCL, DLASET, & + EXTERNAL :: DBDSQR, DCOPY, DGEBRD, DGELQF, DGEMM, & + DGEMV, DGEQRF, DLABAD, DLACPY, DLASCL, DLASET, & DORGBR, DORMBR, DORMLQ, DORMQR, DRSCL, XERBLA INTEGER(ip_) :: ILAENV REAL(r8_) :: DLAMCH, DLANGE @@ -1244,7 +1250,7 @@ SUBROUTINE DGELSS(m, n, nrhs, a, lda, b, ldb, s, rcond, rank, work, & IF (m>=n .AND. m>=mnthr) THEN CALL DGEQRF(m, n, a, lda, dum(1), dum(1), -1_ip_, info) lwork_dgeqrf = dum(1) - CALL DORMQR('L', 'T', m, nrhs, n, a, lda, dum(1), b, ldb, & + CALL DORMQR('L', 'T', m, nrhs, n, a, lda, dum(1), b, ldb, & dum(1), -1_ip_, info) lwork_dormqr = dum(1) mm = n @@ -1253,13 +1259,13 @@ SUBROUTINE DGELSS(m, n, nrhs, a, lda, b, ldb, s, rcond, rank, work, & END IF IF (m>=n) THEN bdspac = MAX(1, 5*n) - CALL DGEBRD(mm, n, a, lda, s, dum(1), dum(1), dum(1), & + CALL DGEBRD(mm, n, a, lda, s, dum(1), dum(1), dum(1), & dum(1), -1_ip_, info) lwork_dgebrd = dum(1) - CALL DORMBR('Q', 'L', 'T', mm, nrhs, n, a, lda, dum(1), b, & + CALL DORMBR('Q', 'L', 'T', mm, nrhs, n, a, lda, dum(1), b, & ldb, dum(1), -1_ip_, info) lwork_dormbr = dum(1) - CALL DORGBR('P', n, n, n, a, lda, dum(1), dum(1), -1_ip_, & + CALL DORGBR('P', n, n, n, a, lda, dum(1), dum(1), -1_ip_, & info) lwork_dorgbr = dum(1) maxwrk = MAX(maxwrk, 3*n+lwork_dgebrd) @@ -1276,16 +1282,16 @@ SUBROUTINE DGELSS(m, n, nrhs, a, lda, b, ldb, s, rcond, rank, work, & IF (n>=mnthr) THEN CALL DGELQF(m, n, a, lda, dum(1), dum(1), -1_ip_, info) lwork_dgelqf = dum(1) - CALL DGEBRD(m, m, a, lda, s, dum(1), dum(1), dum(1), & + CALL DGEBRD(m, m, a, lda, s, dum(1), dum(1), dum(1), & dum(1), -1_ip_, info) lwork_dgebrd = dum(1) - CALL DORMBR('Q', 'L', 'T', m, nrhs, n, a, lda, dum(1), b, & + CALL DORMBR('Q', 'L', 'T', m, nrhs, n, a, lda, dum(1), b, & ldb, dum(1), -1_ip_, info) lwork_dormbr = dum(1) - CALL DORGBR('P', m, m, m, a, lda, dum(1), dum(1), -1_ip_, & + CALL DORGBR('P', m, m, m, a, lda, dum(1), dum(1), -1_ip_, & info) lwork_dorgbr = dum(1) - CALL DORMLQ('L', 'T', n, nrhs, m, a, lda, dum(1), b, ldb, & + CALL DORMLQ('L', 'T', n, nrhs, m, a, lda, dum(1), b, ldb, & dum(1), -1_ip_, info) lwork_dormlq = dum(1) maxwrk = m + lwork_dgelqf @@ -1300,13 +1306,13 @@ SUBROUTINE DGELSS(m, n, nrhs, a, lda, b, ldb, s, rcond, rank, work, & END IF maxwrk = MAX(maxwrk, m+lwork_dormlq) ELSE - CALL DGEBRD(m, n, a, lda, s, dum(1), dum(1), dum(1), & + CALL DGEBRD(m, n, a, lda, s, dum(1), dum(1), dum(1), & dum(1), -1_ip_, info) lwork_dgebrd = dum(1) - CALL DORMBR('Q', 'L', 'T', m, nrhs, m, a, lda, dum(1), b, & + CALL DORMBR('Q', 'L', 'T', m, nrhs, m, a, lda, dum(1), b, & ldb, dum(1), -1_ip_, info) lwork_dormbr = dum(1) - CALL DORGBR('P', m, n, m, a, lda, dum(1), dum(1), -1_ip_, & + CALL DORGBR('P', m, n, m, a, lda, dum(1), dum(1), -1_ip_, & info) lwork_dorgbr = dum(1) maxwrk = 3*m + lwork_dgebrd @@ -1339,10 +1345,12 @@ SUBROUTINE DGELSS(m, n, nrhs, a, lda, b, ldb, s, rcond, rank, work, & anrm = DLANGE('M', m, n, a, lda, work) iascl = 0 IF (anrm>zero .AND. anrmbignum) THEN - CALL DLASCL('G', 0_ip_, 0_ip_, anrm, bignum, m, n, a, lda, info) + CALL DLASCL('G', 0_ip_, 0_ip_, anrm, bignum, m, n, a, lda, & + info) iascl = 2 ELSE IF (anrm==zero) THEN CALL DLASET('F', MAX(m,n), nrhs, zero, zero, b, ldb) @@ -1353,11 +1361,11 @@ SUBROUTINE DGELSS(m, n, nrhs, a, lda, b, ldb, s, rcond, rank, work, & bnrm = DLANGE('M', m, nrhs, b, ldb, work) ibscl = 0 IF (bnrm>zero .AND. bnrmbignum) THEN - CALL DLASCL('G', 0_ip_, 0_ip_, bnrm, bignum, m, nrhs, b, ldb, & + CALL DLASCL('G', 0_ip_, 0_ip_, bnrm, bignum, m, nrhs, b, ldb, & info) ibscl = 2 END IF @@ -1367,9 +1375,9 @@ SUBROUTINE DGELSS(m, n, nrhs, a, lda, b, ldb, s, rcond, rank, work, & mm = n itau = 1 iwork = itau + n - CALL DGEQRF(m, n, a, lda, work(itau), work(iwork), & + CALL DGEQRF(m, n, a, lda, work(itau), work(iwork), & lwork-iwork+1, info) - CALL DORMQR('L', 'T', m, nrhs, n, a, lda, work(itau), b, ldb, & + CALL DORMQR('L', 'T', m, nrhs, n, a, lda, work(itau), b, ldb, & work(iwork), lwork-iwork+1, info) IF (n>1) CALL DLASET('L', n-1, n-1, zero, zero, a(2,1), lda) END IF @@ -1377,14 +1385,14 @@ SUBROUTINE DGELSS(m, n, nrhs, a, lda, b, ldb, s, rcond, rank, work, & itauq = ie + n itaup = itauq + n iwork = itaup + n - CALL DGEBRD(mm, n, a, lda, s, work(ie), work(itauq), & + CALL DGEBRD(mm, n, a, lda, s, work(ie), work(itauq), & work(itaup), work(iwork), lwork-iwork+1, info) - CALL DORMBR('Q', 'L', 'T', mm, nrhs, n, a, lda, work(itauq), b, & + CALL DORMBR('Q', 'L', 'T', mm, nrhs, n, a, lda, work(itauq), b, & ldb, work(iwork), lwork-iwork+1, info) - CALL DORGBR('P', n, n, n, a, lda, work(itaup), work(iwork), & + CALL DORGBR('P', n, n, n, a, lda, work(itaup), work(iwork), & lwork-iwork+1, info) iwork = ie + n - CALL DBDSQR('U', n, n, 0_ip_, nrhs, s, work(ie), a, lda, dum, & + CALL DBDSQR('U', n, n, 0_ip_, nrhs, s, work(ie), a, lda, dum, & 1_ip_, b, ldb, work(iwork), info) IF (info/=0) GO TO 70 thr = MAX(rcond*s(1), sfmin) @@ -1399,30 +1407,30 @@ SUBROUTINE DGELSS(m, n, nrhs, a, lda, b, ldb, s, rcond, rank, work, & END IF END DO IF (lwork>=ldb*nrhs .AND. nrhs>1) THEN - CALL DGEMM('T', 'N', n, nrhs, n, one, a, lda, b, ldb, zero, & + CALL DGEMM('T', 'N', n, nrhs, n, one, a, lda, b, ldb, zero, & work, ldb) CALL DLACPY('G', n, nrhs, work, ldb, b, ldb) ELSE IF (nrhs>1) THEN chunk = lwork/n DO i = 1, nrhs, chunk bl = MIN(nrhs-i+1, chunk) - CALL DGEMM('T', 'N', n, bl, n, one, a, lda, b(1,i), ldb, & + CALL DGEMM('T', 'N', n, bl, n, one, a, lda, b(1,i), ldb, & zero, work, n) CALL DLACPY('G', n, bl, work, n, b(1,i), ldb) END DO ELSE - CALL DGEMV('T', n, n, one, a, lda, b, 1_ip_, zero, work, & + CALL DGEMV('T', n, n, one, a, lda, b, 1_ip_, zero, work, & 1_ip_) CALL DCOPY(n, work, 1_ip_, b, 1_ip_) END IF - ELSE IF (n>=mnthr .AND. lwork>=4*m+m*m+MAX(m,2*m-4,nrhs,n-3*m)) & + ELSE IF (n>=mnthr .AND. lwork>=4*m+m*m+MAX(m,2*m-4,nrhs,n-3*m)) & THEN ldwork = m - IF (lwork>=MAX(4*m+m*lda+MAX(m,2*m-4,nrhs, n-3*m), & + IF (lwork>=MAX(4*m+m*lda+MAX(m,2*m-4,nrhs, n-3*m), & m*lda+m+m*nrhs)) ldwork = lda itau = 1 iwork = m + 1 - CALL DGELQF(m, n, a, lda, work(itau), work(iwork), & + CALL DGELQF(m, n, a, lda, work(itau), work(iwork), & lwork-iwork+1, info) il = iwork CALL DLACPY('L', m, m, a, lda, work(il), ldwork) @@ -1431,14 +1439,14 @@ SUBROUTINE DGELSS(m, n, nrhs, a, lda, b, ldb, s, rcond, rank, work, & itauq = ie + m itaup = itauq + m iwork = itaup + m - CALL DGEBRD(m, m, work(il), ldwork, s, work(ie), work(itauq), & + CALL DGEBRD(m, m, work(il), ldwork, s, work(ie), work(itauq), & work(itaup), work(iwork), lwork-iwork+1, info) - CALL DORMBR('Q', 'L', 'T', m, nrhs, m, work(il), ldwork, & + CALL DORMBR('Q', 'L', 'T', m, nrhs, m, work(il), ldwork, & work(itauq), b, ldb, work(iwork), lwork-iwork+1, info) - CALL DORGBR('P', m, m, m, work(il), ldwork, work(itaup), & + CALL DORGBR('P', m, m, m, work(il), ldwork, work(itaup), & work(iwork), lwork-iwork+1, info) iwork = ie + m - CALL DBDSQR('U', m, m, 0_ip_, nrhs, s, work(ie), work(il), & + CALL DBDSQR('U', m, m, 0_ip_, nrhs, s, work(ie), work(il), & ldwork, a, lda, b, ldb, work(iwork), info) IF (info/=0) GO TO 70 thr = MAX(rcond*s(1), sfmin) @@ -1454,39 +1462,39 @@ SUBROUTINE DGELSS(m, n, nrhs, a, lda, b, ldb, s, rcond, rank, work, & END DO iwork = ie IF (lwork>=ldb*nrhs+iwork-1 .AND. nrhs>1) THEN - CALL DGEMM('T', 'N', m, nrhs, m, one, work(il), ldwork, b, & + CALL DGEMM('T', 'N', m, nrhs, m, one, work(il), ldwork, b, & ldb, zero, work(iwork), ldb) CALL DLACPY('G', m, nrhs, work(iwork), ldb, b, ldb) ELSE IF (nrhs>1) THEN chunk = (lwork-iwork+1)/m DO i = 1, nrhs, chunk bl = MIN(nrhs-i+1, chunk) - CALL DGEMM('T', 'N', m, bl, m, one, work(il), ldwork, b(1, & + CALL DGEMM('T', 'N', m, bl, m, one, work(il), ldwork, b(1, & i), ldb, zero, work(iwork), m) CALL DLACPY('G', m, bl, work(iwork), m, b(1,i), ldb) END DO ELSE - CALL DGEMV('T', m, m, one, work(il), ldwork, b(1,1), 1_ip_, & + CALL DGEMV('T', m, m, one, work(il), ldwork, b(1,1), 1_ip_, & zero, work(iwork), 1_ip_) CALL DCOPY(m, work(iwork), 1_ip_, b(1,1), 1_ip_) END IF CALL DLASET('F', n-m, nrhs, zero, zero, b(m+1,1), ldb) iwork = itau + m - CALL DORMLQ('L', 'T', n, nrhs, m, a, lda, work(itau), b, ldb, & + CALL DORMLQ('L', 'T', n, nrhs, m, a, lda, work(itau), b, ldb, & work(iwork), lwork-iwork+1, info) ELSE ie = 1 itauq = ie + m itaup = itauq + m iwork = itaup + m - CALL DGEBRD(m, n, a, lda, s, work(ie), work(itauq), work(itaup), & - work(iwork), lwork-iwork+1, info) - CALL DORMBR('Q', 'L', 'T', m, nrhs, n, a, lda, work(itauq), b, & + CALL DGEBRD(m, n, a, lda, s, work(ie), work(itauq), & + work(itaup), work(iwork), lwork-iwork+1, info) + CALL DORMBR('Q', 'L', 'T', m, nrhs, n, a, lda, work(itauq), b, & ldb, work(iwork), lwork-iwork+1, info) - CALL DORGBR('P', m, n, m, a, lda, work(itaup), work(iwork), & + CALL DORGBR('P', m, n, m, a, lda, work(itaup), work(iwork), & lwork-iwork+1, info) iwork = ie + m - CALL DBDSQR('L', m, n, 0_ip_, nrhs, s, work(ie), a, lda, dum, & + CALL DBDSQR('L', m, n, 0_ip_, nrhs, s, work(ie), a, lda, dum, & 1_ip_, b, ldb, work(iwork), info) IF (info/=0) GO TO 70 thr = MAX(rcond*s(1), sfmin) @@ -1501,39 +1509,39 @@ SUBROUTINE DGELSS(m, n, nrhs, a, lda, b, ldb, s, rcond, rank, work, & END IF END DO IF (lwork>=ldb*nrhs .AND. nrhs>1) THEN - CALL DGEMM('T', 'N', n, nrhs, m, one, a, lda, b, ldb, zero, & + CALL DGEMM('T', 'N', n, nrhs, m, one, a, lda, b, ldb, zero, & work, ldb) CALL DLACPY('F', n, nrhs, work, ldb, b, ldb) ELSE IF (nrhs>1) THEN chunk = lwork/n DO i = 1, nrhs, chunk bl = MIN(nrhs-i+1, chunk) - CALL DGEMM('T', 'N', n, bl, m, one, a, lda, b(1,i), ldb, & + CALL DGEMM('T', 'N', n, bl, m, one, a, lda, b(1,i), ldb, & zero, work, n) CALL DLACPY('F', n, bl, work, n, b(1,i), ldb) END DO ELSE - CALL DGEMV('T', m, n, one, a, lda, b, 1_ip_, zero, work, & + CALL DGEMV('T', m, n, one, a, lda, b, 1_ip_, zero, work, & 1_ip_) CALL DCOPY(n, work, 1_ip_, b, 1_ip_) END IF END IF IF (iascl==1) THEN - CALL DLASCL('G', 0_ip_, 0_ip_, anrm, smlnum, n, nrhs, b, ldb, & + CALL DLASCL('G', 0_ip_, 0_ip_, anrm, smlnum, n, nrhs, b, ldb, & info) - CALL DLASCL('G', 0_ip_, 0_ip_, smlnum, anrm, minmn, 1_ip_, s, & + CALL DLASCL('G', 0_ip_, 0_ip_, smlnum, anrm, minmn, 1_ip_, s, & minmn, info) ELSE IF (iascl==2) THEN - CALL DLASCL('G', 0_ip_, 0_ip_, anrm, bignum, n, nrhs, b, ldb, & + CALL DLASCL('G', 0_ip_, 0_ip_, anrm, bignum, n, nrhs, b, ldb, & info) - CALL DLASCL('G', 0_ip_, 0_ip_, bignum, anrm, minmn, 1_ip_, s, & + CALL DLASCL('G', 0_ip_, 0_ip_, bignum, anrm, minmn, 1_ip_, s, & minmn, info) END IF IF (ibscl==1) THEN - CALL DLASCL('G', 0_ip_, 0_ip_, smlnum, bnrm, n, nrhs, b, ldb, & + CALL DLASCL('G', 0_ip_, 0_ip_, smlnum, bnrm, n, nrhs, b, ldb, & info) ELSE IF (ibscl==2) THEN - CALL DLASCL('G', 0_ip_, 0_ip_, bignum, bnrm, n, nrhs, b, ldb, & + CALL DLASCL('G', 0_ip_, 0_ip_, bignum, bnrm, n, nrhs, b, ldb, & info) END IF 70 CONTINUE @@ -1541,7 +1549,7 @@ SUBROUTINE DGELSS(m, n, nrhs, a, lda, b, ldb, s, rcond, rank, work, & RETURN END SUBROUTINE - SUBROUTINE DGELSY(m, n, nrhs, a, lda, b, ldb, jpvt, rcond, rank, & + SUBROUTINE DGELSY(m, n, nrhs, a, lda, b, ldb, jpvt, rcond, rank, & work, lwork, info) USE GALAHAD_KINDS INTEGER(ip_) :: info, lda, ldb, lwork, m, n, nrhs, rank @@ -1553,15 +1561,16 @@ SUBROUTINE DGELSY(m, n, nrhs, a, lda, b, ldb, jpvt, rcond, rank, & REAL(r8_) :: zero, one PARAMETER (zero=0.0_r8_, one=1.0_r8_) LOGICAL :: lquery - INTEGER(ip_) :: i, iascl, ibscl, ismax, ismin, j, lwkmin, lwkopt, & + INTEGER(ip_) :: i, iascl, ibscl, ismax, ismin, j, lwkmin, lwkopt, & mn, nb, nb1, nb2, nb3, nb4 - REAL(r8_) :: anrm, bignum, bnrm, c1, c2, s1, s2, smax, smaxpr, & + REAL(r8_) :: anrm, bignum, bnrm, c1, c2, s1, s2, smax, smaxpr, & smin, sminpr, smlnum, wsize INTEGER(ip_) :: ILAENV REAL(r8_) :: DLAMCH, DLANGE EXTERNAL :: ILAENV, DLAMCH, DLANGE - EXTERNAL :: DCOPY, DGEQP3, DLABAD, DLAIC1, DLASCL, & - DLASET, DORMQR, DORMRZ, DTRSM, DTZRZF, XERBLA + EXTERNAL :: DCOPY, DGEQP3, DLABAD, DLAIC1, & + DLASCL, DLASET, DORMQR, DORMRZ, DTRSM, DTZRZF, & + XERBLA INTRINSIC :: ABS, MAX, MIN mn = MIN(m, n) ismin = mn + 1 @@ -1613,10 +1622,12 @@ SUBROUTINE DGELSY(m, n, nrhs, a, lda, b, ldb, jpvt, rcond, rank, & anrm = DLANGE('M', m, n, a, lda, work) iascl = 0 IF (anrm>zero .AND. anrmbignum) THEN - CALL DLASCL('G', 0_ip_, 0_ip_, anrm, bignum, m, n, a, lda, info) + CALL DLASCL('G', 0_ip_, 0_ip_, anrm, bignum, m, n, a, lda, & + info) iascl = 2 ELSE IF (anrm==zero) THEN CALL DLASET('F', MAX(m,n), nrhs, zero, zero, b, ldb) @@ -1626,15 +1637,15 @@ SUBROUTINE DGELSY(m, n, nrhs, a, lda, b, ldb, jpvt, rcond, rank, & bnrm = DLANGE('M', m, nrhs, b, ldb, work) ibscl = 0 IF (bnrm>zero .AND. bnrmbignum) THEN - CALL DLASCL('G', 0_ip_, 0_ip_, bnrm, bignum, m, nrhs, b, ldb, & + CALL DLASCL('G', 0_ip_, 0_ip_, bnrm, bignum, m, nrhs, b, ldb, & info) ibscl = 2 END IF - CALL DGEQP3(m, n, a, lda, jpvt, work(1), work(mn+1), lwork-mn, & + CALL DGEQP3(m, n, a, lda, jpvt, work(1), work(mn+1), lwork-mn, & info) wsize = mn + work(mn+1) work(ismin) = one @@ -1651,9 +1662,9 @@ SUBROUTINE DGELSY(m, n, nrhs, a, lda, b, ldb, jpvt, rcond, rank, & 10 CONTINUE IF (rank1) .AND. (nb=n .AND. minmn>0) THEN - mnthr = ILAENV(6_ip_, 'DGESVD', jobu//jobvt, m, n, 0_ip_, & + mnthr = ILAENV(6_ip_, 'DGESVD', jobu//jobvt, m, n, 0_ip_, & 0_ip_) bdspac = 5*n CALL DGEQRF(m, n, a, lda, dum(1), dum(1), -1_ip_, ierr) @@ -2008,20 +2019,20 @@ SUBROUTINE DGESVD(jobu, jobvt, m, n, a, lda, s, u, ldu, vt, ldvt, & lwork_dorgqr_n = INT(dum(1)) CALL DORGQR(m, m, n, a, lda, dum(1), dum(1), -1_ip_, ierr) lwork_dorgqr_m = INT(dum(1)) - CALL DGEBRD(n, n, a, lda, s, dum(1), dum(1), dum(1), dum(1), & + CALL DGEBRD(n, n, a, lda, s, dum(1), dum(1), dum(1), dum(1), & -1_ip_, ierr) lwork_dgebrd = INT(dum(1)) - CALL DORGBR('P', n, n, n, a, lda, dum(1), dum(1), -1_ip_, & + CALL DORGBR('P', n, n, n, a, lda, dum(1), dum(1), -1_ip_, & ierr) lwork_dorgbr_p = INT(dum(1)) - CALL DORGBR('Q', n, n, n, a, lda, dum(1), dum(1), -1_ip_, & + CALL DORGBR('Q', n, n, n, a, lda, dum(1), dum(1), -1_ip_, & ierr) lwork_dorgbr_q = INT(dum(1)) IF (m>=mnthr) THEN IF (wntun) THEN maxwrk = n + lwork_dgeqrf maxwrk = MAX(maxwrk, 3*n+lwork_dgebrd) - IF (wntvo .OR. wntvas) maxwrk = MAX(maxwrk, & + IF (wntvo .OR. wntvas) maxwrk = MAX(maxwrk, & 3*n+lwork_dorgbr_p) maxwrk = MAX(maxwrk, bdspac) minwrk = MAX(4*n, bdspac) @@ -2096,18 +2107,18 @@ SUBROUTINE DGESVD(jobu, jobvt, m, n, a, lda, s, u, ldu, vt, ldvt, & minwrk = MAX(3*n+m, bdspac) END IF ELSE - CALL DGEBRD(m, n, a, lda, s, dum(1), dum(1), dum(1), dum(1), & - -1_ip_, ierr) + CALL DGEBRD(m, n, a, lda, s, dum(1), dum(1), dum(1), & + dum(1), -1_ip_, ierr) lwork_dgebrd = INT(dum(1)) maxwrk = 3*n + lwork_dgebrd IF (wntus .OR. wntuo) THEN - CALL DORGBR('Q', m, n, n, a, lda, dum(1), dum(1), -1_ip_, & + CALL DORGBR('Q', m, n, n, a, lda, dum(1), dum(1), -1_ip_, & ierr) lwork_dorgbr_q = INT(dum(1)) maxwrk = MAX(maxwrk, 3*n+lwork_dorgbr_q) END IF IF (wntua) THEN - CALL DORGBR('Q', m, m, n, a, lda, dum(1), dum(1), -1_ip_, & + CALL DORGBR('Q', m, m, n, a, lda, dum(1), dum(1), -1_ip_, & ierr) lwork_dorgbr_q = INT(dum(1)) maxwrk = MAX(maxwrk, 3*n+lwork_dorgbr_q) @@ -2119,7 +2130,7 @@ SUBROUTINE DGESVD(jobu, jobvt, m, n, a, lda, s, u, ldu, vt, ldvt, & minwrk = MAX(3*n+m, bdspac) END IF ELSE IF (minmn>0) THEN - mnthr = ILAENV(6_ip_, 'DGESVD', jobu//jobvt, m, n, 0_ip_, & + mnthr = ILAENV(6_ip_, 'DGESVD', jobu//jobvt, m, n, 0_ip_, & 0_ip_) bdspac = 5*m CALL DGELQF(m, n, a, lda, dum(1), dum(1), -1_ip_, ierr) @@ -2128,7 +2139,7 @@ SUBROUTINE DGESVD(jobu, jobvt, m, n, a, lda, s, u, ldu, vt, ldvt, & lwork_dorglq_n = INT(dum(1)) CALL DORGLQ(m, n, m, a, lda, dum(1), dum(1), -1_ip_, ierr) lwork_dorglq_m = INT(dum(1)) - CALL DGEBRD(m, m, a, lda, s, dum(1), dum(1), dum(1), dum(1), & + CALL DGEBRD(m, m, a, lda, s, dum(1), dum(1), dum(1), dum(1), & -1_ip_, ierr) lwork_dgebrd = INT(dum(1)) CALL DORGBR('P', m, m, m, a, n, dum(1), dum(1), -1_ip_, ierr) @@ -2139,7 +2150,7 @@ SUBROUTINE DGESVD(jobu, jobvt, m, n, a, lda, s, u, ldu, vt, ldvt, & IF (wntvn) THEN maxwrk = m + lwork_dgelqf maxwrk = MAX(maxwrk, 3*m+lwork_dgebrd) - IF (wntuo .OR. wntuas) maxwrk = MAX(maxwrk, & + IF (wntuo .OR. wntuas) maxwrk = MAX(maxwrk, & 3*m+lwork_dorgbr_q) maxwrk = MAX(maxwrk, bdspac) minwrk = MAX(4*m, bdspac) @@ -2214,18 +2225,18 @@ SUBROUTINE DGESVD(jobu, jobvt, m, n, a, lda, s, u, ldu, vt, ldvt, & minwrk = MAX(3*m+n, bdspac) END IF ELSE - CALL DGEBRD(m, n, a, lda, s, dum(1), dum(1), dum(1), dum(1), & - -1_ip_, ierr) + CALL DGEBRD(m, n, a, lda, s, dum(1), dum(1), dum(1), & + dum(1), -1_ip_, ierr) lwork_dgebrd = INT(dum(1)) maxwrk = 3*m + lwork_dgebrd IF (wntvs .OR. wntvo) THEN - CALL DORGBR('P', m, n, m, a, n, dum(1), dum(1), -1_ip_, & + CALL DORGBR('P', m, n, m, a, n, dum(1), dum(1), -1_ip_, & ierr) lwork_dorgbr_p = INT(dum(1)) maxwrk = MAX(maxwrk, 3*m+lwork_dorgbr_p) END IF IF (wntva) THEN - CALL DORGBR('P', n, n, m, a, n, dum(1), dum(1), -1_ip_, & + CALL DORGBR('P', n, n, m, a, n, dum(1), dum(1), -1_ip_, & ierr) lwork_dorgbr_p = INT(dum(1)) maxwrk = MAX(maxwrk, 3*m+lwork_dorgbr_p) @@ -2259,17 +2270,19 @@ SUBROUTINE DGESVD(jobu, jobvt, m, n, a, lda, s, u, ldu, vt, ldvt, & iscl = 0 IF (anrm>zero .AND. anrmbignum) THEN iscl = 1 - CALL DLASCL('G', 0_ip_, 0_ip_, anrm, bignum, m, n, a, lda, ierr) + CALL DLASCL('G', 0_ip_, 0_ip_, anrm, bignum, m, n, a, lda, & + ierr) END IF IF (m>=n) THEN IF (m>=mnthr) THEN IF (wntun) THEN itau = 1 iwork = itau + n - CALL DGEQRF(m, n, a, lda, work(itau), work(iwork), & + CALL DGEQRF(m, n, a, lda, work(itau), work(iwork), & lwork-iwork+1, ierr) IF (n>1) THEN CALL DLASET('L', n-1, n-1, zero, zero, a(2,1), lda) @@ -2278,17 +2291,17 @@ SUBROUTINE DGESVD(jobu, jobvt, m, n, a, lda, s, u, ldu, vt, ldvt, & itauq = ie + n itaup = itauq + n iwork = itaup + n - CALL DGEBRD(n, n, a, lda, s, work(ie), work(itauq), & + CALL DGEBRD(n, n, a, lda, s, work(ie), work(itauq), & work(itaup), work(iwork), lwork-iwork+1, ierr) ncvt = 0 IF (wntvo .OR. wntvas) THEN - CALL DORGBR('P', n, n, n, a, lda, work(itaup), & + CALL DORGBR('P', n, n, n, a, lda, work(itaup), & work(iwork), lwork-iwork+1, ierr) ncvt = n END IF iwork = ie + n - CALL DBDSQR('U', n, ncvt, 0_ip_, 0_ip_, s, work(ie), a, lda, & - dum, 1_ip_, dum, 1_ip_, work(iwork), info) + CALL DBDSQR('U', n, ncvt, 0_ip_, 0_ip_, s, work(ie), a, & + lda, dum, 1_ip_, dum, 1_ip_, work(iwork), info) IF (wntvas) CALL DLACPY('F', n, n, a, lda, vt, ldvt) ELSE IF (wntuo .AND. wntvn) THEN IF (lwork>=n*n+MAX(4*n,bdspac)) THEN @@ -2305,30 +2318,31 @@ SUBROUTINE DGESVD(jobu, jobvt, m, n, a, lda, s, u, ldu, vt, ldvt, & END IF itau = ir + ldwrkr*n iwork = itau + n - CALL DGEQRF(m, n, a, lda, work(itau), work(iwork), & + CALL DGEQRF(m, n, a, lda, work(itau), work(iwork), & lwork-iwork+1, ierr) CALL DLACPY('U', n, n, a, lda, work(ir), ldwrkr) - CALL DLASET('L', n-1, n-1, zero, zero, work(ir+1), ldwrkr) - CALL DORGQR(m, n, n, a, lda, work(itau), work(iwork), & + CALL DLASET('L', n-1, n-1, zero, zero, work(ir+1), & + ldwrkr) + CALL DORGQR(m, n, n, a, lda, work(itau), work(iwork), & lwork-iwork+1, ierr) ie = itau itauq = ie + n itaup = itauq + n iwork = itaup + n - CALL DGEBRD(n, n, work(ir), ldwrkr, s, work(ie), & - work(itauq), work(itaup), work(iwork), lwork-iwork+1, & + CALL DGEBRD(n, n, work(ir), ldwrkr, s, work(ie), & + work(itauq), work(itaup), work(iwork), lwork-iwork+1, & ierr) - CALL DORGBR('Q', n, n, n, work(ir), ldwrkr, work(itauq), & + CALL DORGBR('Q', n, n, n, work(ir), ldwrkr, work(itauq), & work(iwork), lwork-iwork+1, ierr) iwork = ie + n - CALL DBDSQR('U', n, 0_ip_, n, 0_ip_, s, work(ie), dum, & + CALL DBDSQR('U', n, 0_ip_, n, 0_ip_, s, work(ie), dum, & 1_ip_, work(ir), ldwrkr, dum, 1_ip_, work(iwork), info) iu = ie + n DO i = 1, m, ldwrku chunk = MIN(m-i+1, ldwrku) - CALL DGEMM('N', 'N', chunk, n, n, one, a(i,1), lda, & + CALL DGEMM('N', 'N', chunk, n, n, one, a(i,1), lda, & work(ir), ldwrkr, zero, work(iu), ldwrku) - CALL DLACPY('F', chunk, n, work(iu), ldwrku, a(i,1), & + CALL DLACPY('F', chunk, n, work(iu), ldwrku, a(i,1), & lda) END DO ELSE @@ -2336,12 +2350,12 @@ SUBROUTINE DGESVD(jobu, jobvt, m, n, a, lda, s, u, ldu, vt, ldvt, & itauq = ie + n itaup = itauq + n iwork = itaup + n - CALL DGEBRD(m, n, a, lda, s, work(ie), work(itauq), & + CALL DGEBRD(m, n, a, lda, s, work(ie), work(itauq), & work(itaup), work(iwork), lwork-iwork+1, ierr) - CALL DORGBR('Q', m, n, n, a, lda, work(itauq), & + CALL DORGBR('Q', m, n, n, a, lda, work(itauq), & work(iwork), lwork-iwork+1, ierr) iwork = ie + n - CALL DBDSQR('U', n, 0_ip_, m, 0_ip_, s, work(ie), dum, & + CALL DBDSQR('U', n, 0_ip_, m, 0_ip_, s, work(ie), dum, & 1_ip_, a, lda, dum, 1_ip_, work(iwork), info) END IF ELSE IF (wntuo .AND. wntvas) THEN @@ -2359,58 +2373,58 @@ SUBROUTINE DGESVD(jobu, jobvt, m, n, a, lda, s, u, ldu, vt, ldvt, & END IF itau = ir + ldwrkr*n iwork = itau + n - CALL DGEQRF(m, n, a, lda, work(itau), work(iwork), & + CALL DGEQRF(m, n, a, lda, work(itau), work(iwork), & lwork-iwork+1, ierr) CALL DLACPY('U', n, n, a, lda, vt, ldvt) - IF (n>1) CALL DLASET('L', n-1, n-1, zero, zero, vt(2,1), & + IF (n>1) CALL DLASET('L', n-1, n-1, zero, zero, vt(2,1), & ldvt) - CALL DORGQR(m, n, n, a, lda, work(itau), work(iwork), & + CALL DORGQR(m, n, n, a, lda, work(itau), work(iwork), & lwork-iwork+1, ierr) ie = itau itauq = ie + n itaup = itauq + n iwork = itaup + n - CALL DGEBRD(n, n, vt, ldvt, s, work(ie), work(itauq), & + CALL DGEBRD(n, n, vt, ldvt, s, work(ie), work(itauq), & work(itaup), work(iwork), lwork-iwork+1, ierr) CALL DLACPY('L', n, n, vt, ldvt, work(ir), ldwrkr) - CALL DORGBR('Q', n, n, n, work(ir), ldwrkr, work(itauq), & + CALL DORGBR('Q', n, n, n, work(ir), ldwrkr, work(itauq), & work(iwork), lwork-iwork+1, ierr) - CALL DORGBR('P', n, n, n, vt, ldvt, work(itaup), & + CALL DORGBR('P', n, n, n, vt, ldvt, work(itaup), & work(iwork), lwork-iwork+1, ierr) iwork = ie + n - CALL DBDSQR('U', n, n, n, 0_ip_, s, work(ie), vt, ldvt, & + CALL DBDSQR('U', n, n, n, 0_ip_, s, work(ie), vt, ldvt, & work(ir), ldwrkr, dum, 1_ip_, work(iwork), info) iu = ie + n DO i = 1, m, ldwrku chunk = MIN(m-i+1, ldwrku) - CALL DGEMM('N', 'N', chunk, n, n, one, a(i,1), lda, & + CALL DGEMM('N', 'N', chunk, n, n, one, a(i,1), lda, & work(ir), ldwrkr, zero, work(iu), ldwrku) - CALL DLACPY('F', chunk, n, work(iu), ldwrku, a(i,1), & + CALL DLACPY('F', chunk, n, work(iu), ldwrku, a(i,1), & lda) END DO ELSE itau = 1 iwork = itau + n - CALL DGEQRF(m, n, a, lda, work(itau), work(iwork), & + CALL DGEQRF(m, n, a, lda, work(itau), work(iwork), & lwork-iwork+1, ierr) CALL DLACPY('U', n, n, a, lda, vt, ldvt) - IF (n>1) CALL DLASET('L', n-1, n-1, zero, zero, vt(2,1), & + IF (n>1) CALL DLASET('L', n-1, n-1, zero, zero, vt(2,1), & ldvt) - CALL DORGQR(m, n, n, a, lda, work(itau), work(iwork), & + CALL DORGQR(m, n, n, a, lda, work(itau), work(iwork), & lwork-iwork+1, ierr) ie = itau itauq = ie + n itaup = itauq + n iwork = itaup + n - CALL DGEBRD(n, n, vt, ldvt, s, work(ie), work(itauq), & + CALL DGEBRD(n, n, vt, ldvt, s, work(ie), work(itauq), & work(itaup), work(iwork), lwork-iwork+1, ierr) - CALL DORMBR('Q', 'R', 'N', m, n, n, vt, ldvt, work(itauq), & - a, lda, work(iwork), lwork-iwork+1, ierr) - CALL DORGBR('P', n, n, n, vt, ldvt, work(itaup), & + CALL DORMBR('Q', 'R', 'N', m, n, n, vt, ldvt, & + work(itauq), a, lda, work(iwork), lwork-iwork+1, ierr) + CALL DORGBR('P', n, n, n, vt, ldvt, work(itaup), & work(iwork), lwork-iwork+1, ierr) iwork = ie + n - CALL DBDSQR('U', n, n, m, 0_ip_, s, work(ie), vt, ldvt, a, & - lda, dum, 1_ip_, work(iwork), info) + CALL DBDSQR('U', n, n, m, 0_ip_, s, work(ie), vt, ldvt, & + a, lda, dum, 1_ip_, work(iwork), info) END IF ELSE IF (wntus) THEN IF (wntvn) THEN @@ -2423,34 +2437,34 @@ SUBROUTINE DGESVD(jobu, jobvt, m, n, a, lda, s, u, ldu, vt, ldvt, & END IF itau = ir + ldwrkr*n iwork = itau + n - CALL DGEQRF(m, n, a, lda, work(itau), work(iwork), & + CALL DGEQRF(m, n, a, lda, work(itau), work(iwork), & lwork-iwork+1, ierr) CALL DLACPY('U', n, n, a, lda, work(ir), ldwrkr) - CALL DLASET('L', n-1, n-1, zero, zero, work(ir+1), & + CALL DLASET('L', n-1, n-1, zero, zero, work(ir+1), & ldwrkr) - CALL DORGQR(m, n, n, a, lda, work(itau), work(iwork), & + CALL DORGQR(m, n, n, a, lda, work(itau), work(iwork), & lwork-iwork+1, ierr) ie = itau itauq = ie + n itaup = itauq + n iwork = itaup + n - CALL DGEBRD(n, n, work(ir), ldwrkr, s, work(ie), & - work(itauq), work(itaup), work(iwork), lwork-iwork+1, & + CALL DGEBRD(n, n, work(ir), ldwrkr, s, work(ie), & + work(itauq), work(itaup), work(iwork), lwork-iwork+1, & ierr) - CALL DORGBR('Q', n, n, n, work(ir), ldwrkr, work(itauq), & - work(iwork), lwork-iwork+1, ierr) + CALL DORGBR('Q', n, n, n, work(ir), ldwrkr, & + work(itauq), work(iwork), lwork-iwork+1, ierr) iwork = ie + n - CALL DBDSQR('U', n, 0_ip_, n, 0_ip_, s, work(ie), dum, & + CALL DBDSQR('U', n, 0_ip_, n, 0_ip_, s, work(ie), dum, & 1_ip_, work(ir), ldwrkr, dum, 1_ip_, work(iwork), info) - CALL DGEMM('N', 'N', m, n, n, one, a, lda, work(ir), & + CALL DGEMM('N', 'N', m, n, n, one, a, lda, work(ir), & ldwrkr, zero, u, ldu) ELSE itau = 1 iwork = itau + n - CALL DGEQRF(m, n, a, lda, work(itau), work(iwork), & + CALL DGEQRF(m, n, a, lda, work(itau), work(iwork), & lwork-iwork+1, ierr) CALL DLACPY('L', m, n, a, lda, u, ldu) - CALL DORGQR(m, n, n, u, ldu, work(itau), work(iwork), & + CALL DORGQR(m, n, n, u, ldu, work(itau), work(iwork), & lwork-iwork+1, ierr) ie = itau itauq = ie + n @@ -2459,12 +2473,12 @@ SUBROUTINE DGESVD(jobu, jobvt, m, n, a, lda, s, u, ldu, vt, ldvt, & IF (n>1) THEN CALL DLASET('L', n-1, n-1, zero, zero, a(2,1), lda) END IF - CALL DGEBRD(n, n, a, lda, s, work(ie), work(itauq), & + CALL DGEBRD(n, n, a, lda, s, work(ie), work(itauq), & work(itaup), work(iwork), lwork-iwork+1, ierr) - CALL DORMBR('Q', 'R', 'N', m, n, n, a, lda, work(itauq), & - u, ldu, work(iwork), lwork-iwork+1, ierr) + CALL DORMBR('Q', 'R', 'N', m, n, n, a, lda, & + work(itauq), u, ldu, work(iwork), lwork-iwork+1, ierr) iwork = ie + n - CALL DBDSQR('U', n, 0_ip_, m, 0_ip_, s, work(ie), dum, & + CALL DBDSQR('U', n, 0_ip_, m, 0_ip_, s, work(ie), dum, & 1_ip_, u, ldu, dum, 1_ip_, work(iwork), info) END IF ELSE IF (wntvo) THEN @@ -2485,39 +2499,40 @@ SUBROUTINE DGESVD(jobu, jobvt, m, n, a, lda, s, u, ldu, vt, ldvt, & END IF itau = ir + ldwrkr*n iwork = itau + n - CALL DGEQRF(m, n, a, lda, work(itau), work(iwork), & + CALL DGEQRF(m, n, a, lda, work(itau), work(iwork), & lwork-iwork+1, ierr) CALL DLACPY('U', n, n, a, lda, work(iu), ldwrku) - CALL DLASET('L', n-1, n-1, zero, zero, work(iu+1), & + CALL DLASET('L', n-1, n-1, zero, zero, work(iu+1), & ldwrku) - CALL DORGQR(m, n, n, a, lda, work(itau), work(iwork), & + CALL DORGQR(m, n, n, a, lda, work(itau), work(iwork), & lwork-iwork+1, ierr) ie = itau itauq = ie + n itaup = itauq + n iwork = itaup + n - CALL DGEBRD(n, n, work(iu), ldwrku, s, work(ie), & - work(itauq), work(itaup), work(iwork), lwork-iwork+1, & + CALL DGEBRD(n, n, work(iu), ldwrku, s, work(ie), & + work(itauq), work(itaup), work(iwork), lwork-iwork+1, & ierr) - CALL DLACPY('U', n, n, work(iu), ldwrku, work(ir), & + CALL DLACPY('U', n, n, work(iu), ldwrku, work(ir), & ldwrkr) - CALL DORGBR('Q', n, n, n, work(iu), ldwrku, work(itauq), & - work(iwork), lwork-iwork+1, ierr) - CALL DORGBR('P', n, n, n, work(ir), ldwrkr, work(itaup), & - work(iwork), lwork-iwork+1, ierr) + CALL DORGBR('Q', n, n, n, work(iu), ldwrku, & + work(itauq), work(iwork), lwork-iwork+1, ierr) + CALL DORGBR('P', n, n, n, work(ir), ldwrkr, & + work(itaup), work(iwork), lwork-iwork+1, ierr) iwork = ie + n - CALL DBDSQR('U', n, n, n, 0_ip_, s, work(ie), work(ir), & - ldwrkr, work(iu), ldwrku, dum, 1_ip_, work(iwork), info) - CALL DGEMM('N', 'N', m, n, n, one, a, lda, work(iu), & + CALL DBDSQR('U', n, n, n, 0_ip_, s, work(ie), work(ir), & + ldwrkr, work(iu), ldwrku, dum, 1_ip_, work(iwork), & + info) + CALL DGEMM('N', 'N', m, n, n, one, a, lda, work(iu), & ldwrku, zero, u, ldu) CALL DLACPY('F', n, n, work(ir), ldwrkr, a, lda) ELSE itau = 1 iwork = itau + n - CALL DGEQRF(m, n, a, lda, work(itau), work(iwork), & + CALL DGEQRF(m, n, a, lda, work(itau), work(iwork), & lwork-iwork+1, ierr) CALL DLACPY('L', m, n, a, lda, u, ldu) - CALL DORGQR(m, n, n, u, ldu, work(itau), work(iwork), & + CALL DORGQR(m, n, n, u, ldu, work(itau), work(iwork), & lwork-iwork+1, ierr) ie = itau itauq = ie + n @@ -2526,15 +2541,15 @@ SUBROUTINE DGESVD(jobu, jobvt, m, n, a, lda, s, u, ldu, vt, ldvt, & IF (n>1) THEN CALL DLASET('L', n-1, n-1, zero, zero, a(2,1), lda) END IF - CALL DGEBRD(n, n, a, lda, s, work(ie), work(itauq), & + CALL DGEBRD(n, n, a, lda, s, work(ie), work(itauq), & work(itaup), work(iwork), lwork-iwork+1, ierr) - CALL DORMBR('Q', 'R', 'N', m, n, n, a, lda, work(itauq), & - u, ldu, work(iwork), lwork-iwork+1, ierr) - CALL DORGBR('P', n, n, n, a, lda, work(itaup), & + CALL DORMBR('Q', 'R', 'N', m, n, n, a, lda, & + work(itauq), u, ldu, work(iwork), lwork-iwork+1, ierr) + CALL DORGBR('P', n, n, n, a, lda, work(itaup), & work(iwork), lwork-iwork+1, ierr) iwork = ie + n - CALL DBDSQR('U', n, n, m, 0_ip_, s, work(ie), a, lda, u, & - ldu, dum, 1_ip_, work(iwork), info) + CALL DBDSQR('U', n, n, m, 0_ip_, s, work(ie), a, lda, & + u, ldu, dum, 1_ip_, work(iwork), info) END IF ELSE IF (wntvas) THEN IF (lwork>=n*n+MAX(4*n,bdspac)) THEN @@ -2546,53 +2561,53 @@ SUBROUTINE DGESVD(jobu, jobvt, m, n, a, lda, s, u, ldu, vt, ldvt, & END IF itau = iu + ldwrku*n iwork = itau + n - CALL DGEQRF(m, n, a, lda, work(itau), work(iwork), & + CALL DGEQRF(m, n, a, lda, work(itau), work(iwork), & lwork-iwork+1, ierr) CALL DLACPY('U', n, n, a, lda, work(iu), ldwrku) - CALL DLASET('L', n-1, n-1, zero, zero, work(iu+1), & + CALL DLASET('L', n-1, n-1, zero, zero, work(iu+1), & ldwrku) - CALL DORGQR(m, n, n, a, lda, work(itau), work(iwork), & + CALL DORGQR(m, n, n, a, lda, work(itau), work(iwork), & lwork-iwork+1, ierr) ie = itau itauq = ie + n itaup = itauq + n iwork = itaup + n - CALL DGEBRD(n, n, work(iu), ldwrku, s, work(ie), & - work(itauq), work(itaup), work(iwork), lwork-iwork+1, & + CALL DGEBRD(n, n, work(iu), ldwrku, s, work(ie), & + work(itauq), work(itaup), work(iwork), lwork-iwork+1, & ierr) CALL DLACPY('U', n, n, work(iu), ldwrku, vt, ldvt) - CALL DORGBR('Q', n, n, n, work(iu), ldwrku, work(itauq), & - work(iwork), lwork-iwork+1, ierr) - CALL DORGBR('P', n, n, n, vt, ldvt, work(itaup), & + CALL DORGBR('Q', n, n, n, work(iu), ldwrku, & + work(itauq), work(iwork), lwork-iwork+1, ierr) + CALL DORGBR('P', n, n, n, vt, ldvt, work(itaup), & work(iwork), lwork-iwork+1, ierr) iwork = ie + n - CALL DBDSQR('U', n, n, n, 0_ip_, s, work(ie), vt, ldvt, & + CALL DBDSQR('U', n, n, n, 0_ip_, s, work(ie), vt, ldvt, & work(iu), ldwrku, dum, 1_ip_, work(iwork), info) - CALL DGEMM('N', 'N', m, n, n, one, a, lda, work(iu), & + CALL DGEMM('N', 'N', m, n, n, one, a, lda, work(iu), & ldwrku, zero, u, ldu) ELSE itau = 1 iwork = itau + n - CALL DGEQRF(m, n, a, lda, work(itau), work(iwork), & + CALL DGEQRF(m, n, a, lda, work(itau), work(iwork), & lwork-iwork+1, ierr) CALL DLACPY('L', m, n, a, lda, u, ldu) - CALL DORGQR(m, n, n, u, ldu, work(itau), work(iwork), & + CALL DORGQR(m, n, n, u, ldu, work(itau), work(iwork), & lwork-iwork+1, ierr) CALL DLACPY('U', n, n, a, lda, vt, ldvt) - IF (n>1) CALL DLASET('L', n-1, n-1, zero, zero, vt(2,1), & - ldvt) + IF (n>1) CALL DLASET('L', n-1, n-1, zero, zero, vt(2, & + 1), ldvt) ie = itau itauq = ie + n itaup = itauq + n iwork = itaup + n - CALL DGEBRD(n, n, vt, ldvt, s, work(ie), work(itauq), & + CALL DGEBRD(n, n, vt, ldvt, s, work(ie), work(itauq), & work(itaup), work(iwork), lwork-iwork+1, ierr) - CALL DORMBR('Q', 'R', 'N', m, n, n, vt, ldvt, & + CALL DORMBR('Q', 'R', 'N', m, n, n, vt, ldvt, & work(itauq), u, ldu, work(iwork), lwork-iwork+1, ierr) - CALL DORGBR('P', n, n, n, vt, ldvt, work(itaup), & + CALL DORGBR('P', n, n, n, vt, ldvt, work(itaup), & work(iwork), lwork-iwork+1, ierr) iwork = ie + n - CALL DBDSQR('U', n, n, m, 0_ip_, s, work(ie), vt, ldvt, & + CALL DBDSQR('U', n, n, m, 0_ip_, s, work(ie), vt, ldvt, & u, ldu, dum, 1_ip_, work(iwork), info) END IF END IF @@ -2607,36 +2622,36 @@ SUBROUTINE DGESVD(jobu, jobvt, m, n, a, lda, s, u, ldu, vt, ldvt, & END IF itau = ir + ldwrkr*n iwork = itau + n - CALL DGEQRF(m, n, a, lda, work(itau), work(iwork), & + CALL DGEQRF(m, n, a, lda, work(itau), work(iwork), & lwork-iwork+1, ierr) CALL DLACPY('L', m, n, a, lda, u, ldu) CALL DLACPY('U', n, n, a, lda, work(ir), ldwrkr) - CALL DLASET('L', n-1, n-1, zero, zero, work(ir+1), & + CALL DLASET('L', n-1, n-1, zero, zero, work(ir+1), & ldwrkr) - CALL DORGQR(m, m, n, u, ldu, work(itau), work(iwork), & + CALL DORGQR(m, m, n, u, ldu, work(itau), work(iwork), & lwork-iwork+1, ierr) ie = itau itauq = ie + n itaup = itauq + n iwork = itaup + n - CALL DGEBRD(n, n, work(ir), ldwrkr, s, work(ie), & - work(itauq), work(itaup), work(iwork), lwork-iwork+1, & + CALL DGEBRD(n, n, work(ir), ldwrkr, s, work(ie), & + work(itauq), work(itaup), work(iwork), lwork-iwork+1, & ierr) - CALL DORGBR('Q', n, n, n, work(ir), ldwrkr, work(itauq), & - work(iwork), lwork-iwork+1, ierr) + CALL DORGBR('Q', n, n, n, work(ir), ldwrkr, & + work(itauq), work(iwork), lwork-iwork+1, ierr) iwork = ie + n - CALL DBDSQR('U', n, 0_ip_, n, 0_ip_, s, work(ie), dum, & + CALL DBDSQR('U', n, 0_ip_, n, 0_ip_, s, work(ie), dum, & 1_ip_, work(ir), ldwrkr, dum, 1_ip_, work(iwork), info) - CALL DGEMM('N', 'N', m, n, n, one, u, ldu, work(ir), & + CALL DGEMM('N', 'N', m, n, n, one, u, ldu, work(ir), & ldwrkr, zero, a, lda) CALL DLACPY('F', m, n, a, lda, u, ldu) ELSE itau = 1 iwork = itau + n - CALL DGEQRF(m, n, a, lda, work(itau), work(iwork), & + CALL DGEQRF(m, n, a, lda, work(itau), work(iwork), & lwork-iwork+1, ierr) CALL DLACPY('L', m, n, a, lda, u, ldu) - CALL DORGQR(m, m, n, u, ldu, work(itau), work(iwork), & + CALL DORGQR(m, m, n, u, ldu, work(itau), work(iwork), & lwork-iwork+1, ierr) ie = itau itauq = ie + n @@ -2645,12 +2660,12 @@ SUBROUTINE DGESVD(jobu, jobvt, m, n, a, lda, s, u, ldu, vt, ldvt, & IF (n>1) THEN CALL DLASET('L', n-1, n-1, zero, zero, a(2,1), lda) END IF - CALL DGEBRD(n, n, a, lda, s, work(ie), work(itauq), & + CALL DGEBRD(n, n, a, lda, s, work(ie), work(itauq), & work(itaup), work(iwork), lwork-iwork+1, ierr) - CALL DORMBR('Q', 'R', 'N', m, n, n, a, lda, work(itauq), & - u, ldu, work(iwork), lwork-iwork+1, ierr) + CALL DORMBR('Q', 'R', 'N', m, n, n, a, lda, & + work(itauq), u, ldu, work(iwork), lwork-iwork+1, ierr) iwork = ie + n - CALL DBDSQR('U', n, 0_ip_, m, 0_ip_, s, work(ie), dum, & + CALL DBDSQR('U', n, 0_ip_, m, 0_ip_, s, work(ie), dum, & 1_ip_, u, ldu, dum, 1_ip_, work(iwork), info) END IF ELSE IF (wntvo) THEN @@ -2671,41 +2686,42 @@ SUBROUTINE DGESVD(jobu, jobvt, m, n, a, lda, s, u, ldu, vt, ldvt, & END IF itau = ir + ldwrkr*n iwork = itau + n - CALL DGEQRF(m, n, a, lda, work(itau), work(iwork), & + CALL DGEQRF(m, n, a, lda, work(itau), work(iwork), & lwork-iwork+1, ierr) CALL DLACPY('L', m, n, a, lda, u, ldu) - CALL DORGQR(m, m, n, u, ldu, work(itau), work(iwork), & + CALL DORGQR(m, m, n, u, ldu, work(itau), work(iwork), & lwork-iwork+1, ierr) CALL DLACPY('U', n, n, a, lda, work(iu), ldwrku) - CALL DLASET('L', n-1, n-1, zero, zero, work(iu+1), & + CALL DLASET('L', n-1, n-1, zero, zero, work(iu+1), & ldwrku) ie = itau itauq = ie + n itaup = itauq + n iwork = itaup + n - CALL DGEBRD(n, n, work(iu), ldwrku, s, work(ie), & - work(itauq), work(itaup), work(iwork), lwork-iwork+1, & + CALL DGEBRD(n, n, work(iu), ldwrku, s, work(ie), & + work(itauq), work(itaup), work(iwork), lwork-iwork+1, & ierr) - CALL DLACPY('U', n, n, work(iu), ldwrku, work(ir), & + CALL DLACPY('U', n, n, work(iu), ldwrku, work(ir), & ldwrkr) - CALL DORGBR('Q', n, n, n, work(iu), ldwrku, work(itauq), & - work(iwork), lwork-iwork+1, ierr) - CALL DORGBR('P', n, n, n, work(ir), ldwrkr, work(itaup), & - work(iwork), lwork-iwork+1, ierr) + CALL DORGBR('Q', n, n, n, work(iu), ldwrku, & + work(itauq), work(iwork), lwork-iwork+1, ierr) + CALL DORGBR('P', n, n, n, work(ir), ldwrkr, & + work(itaup), work(iwork), lwork-iwork+1, ierr) iwork = ie + n - CALL DBDSQR('U', n, n, n, 0_ip_, s, work(ie), work(ir), & - ldwrkr, work(iu), ldwrku, dum, 1_ip_, work(iwork), info) - CALL DGEMM('N', 'N', m, n, n, one, u, ldu, work(iu), & + CALL DBDSQR('U', n, n, n, 0_ip_, s, work(ie), work(ir), & + ldwrkr, work(iu), ldwrku, dum, 1_ip_, work(iwork), & + info) + CALL DGEMM('N', 'N', m, n, n, one, u, ldu, work(iu), & ldwrku, zero, a, lda) CALL DLACPY('F', m, n, a, lda, u, ldu) CALL DLACPY('F', n, n, work(ir), ldwrkr, a, lda) ELSE itau = 1 iwork = itau + n - CALL DGEQRF(m, n, a, lda, work(itau), work(iwork), & + CALL DGEQRF(m, n, a, lda, work(itau), work(iwork), & lwork-iwork+1, ierr) CALL DLACPY('L', m, n, a, lda, u, ldu) - CALL DORGQR(m, m, n, u, ldu, work(itau), work(iwork), & + CALL DORGQR(m, m, n, u, ldu, work(itau), work(iwork), & lwork-iwork+1, ierr) ie = itau itauq = ie + n @@ -2714,15 +2730,15 @@ SUBROUTINE DGESVD(jobu, jobvt, m, n, a, lda, s, u, ldu, vt, ldvt, & IF (n>1) THEN CALL DLASET('L', n-1, n-1, zero, zero, a(2,1), lda) END IF - CALL DGEBRD(n, n, a, lda, s, work(ie), work(itauq), & + CALL DGEBRD(n, n, a, lda, s, work(ie), work(itauq), & work(itaup), work(iwork), lwork-iwork+1, ierr) - CALL DORMBR('Q', 'R', 'N', m, n, n, a, lda, work(itauq), & - u, ldu, work(iwork), lwork-iwork+1, ierr) - CALL DORGBR('P', n, n, n, a, lda, work(itaup), & + CALL DORMBR('Q', 'R', 'N', m, n, n, a, lda, & + work(itauq), u, ldu, work(iwork), lwork-iwork+1, ierr) + CALL DORGBR('P', n, n, n, a, lda, work(itaup), & work(iwork), lwork-iwork+1, ierr) iwork = ie + n - CALL DBDSQR('U', n, n, m, 0_ip_, s, work(ie), a, lda, u, & - ldu, dum, 1_ip_, work(iwork), info) + CALL DBDSQR('U', n, n, m, 0_ip_, s, work(ie), a, lda, & + u, ldu, dum, 1_ip_, work(iwork), info) END IF ELSE IF (wntvas) THEN IF (lwork>=n*n+MAX(n+m,4*n,bdspac)) THEN @@ -2734,55 +2750,55 @@ SUBROUTINE DGESVD(jobu, jobvt, m, n, a, lda, s, u, ldu, vt, ldvt, & END IF itau = iu + ldwrku*n iwork = itau + n - CALL DGEQRF(m, n, a, lda, work(itau), work(iwork), & + CALL DGEQRF(m, n, a, lda, work(itau), work(iwork), & lwork-iwork+1, ierr) CALL DLACPY('L', m, n, a, lda, u, ldu) - CALL DORGQR(m, m, n, u, ldu, work(itau), work(iwork), & + CALL DORGQR(m, m, n, u, ldu, work(itau), work(iwork), & lwork-iwork+1, ierr) CALL DLACPY('U', n, n, a, lda, work(iu), ldwrku) - CALL DLASET('L', n-1, n-1, zero, zero, work(iu+1), & + CALL DLASET('L', n-1, n-1, zero, zero, work(iu+1), & ldwrku) ie = itau itauq = ie + n itaup = itauq + n iwork = itaup + n - CALL DGEBRD(n, n, work(iu), ldwrku, s, work(ie), & - work(itauq), work(itaup), work(iwork), lwork-iwork+1, & + CALL DGEBRD(n, n, work(iu), ldwrku, s, work(ie), & + work(itauq), work(itaup), work(iwork), lwork-iwork+1, & ierr) CALL DLACPY('U', n, n, work(iu), ldwrku, vt, ldvt) - CALL DORGBR('Q', n, n, n, work(iu), ldwrku, work(itauq), & - work(iwork), lwork-iwork+1, ierr) - CALL DORGBR('P', n, n, n, vt, ldvt, work(itaup), & + CALL DORGBR('Q', n, n, n, work(iu), ldwrku, & + work(itauq), work(iwork), lwork-iwork+1, ierr) + CALL DORGBR('P', n, n, n, vt, ldvt, work(itaup), & work(iwork), lwork-iwork+1, ierr) iwork = ie + n - CALL DBDSQR('U', n, n, n, 0_ip_, s, work(ie), vt, ldvt, & + CALL DBDSQR('U', n, n, n, 0_ip_, s, work(ie), vt, ldvt, & work(iu), ldwrku, dum, 1_ip_, work(iwork), info) - CALL DGEMM('N', 'N', m, n, n, one, u, ldu, work(iu), & + CALL DGEMM('N', 'N', m, n, n, one, u, ldu, work(iu), & ldwrku, zero, a, lda) CALL DLACPY('F', m, n, a, lda, u, ldu) ELSE itau = 1 iwork = itau + n - CALL DGEQRF(m, n, a, lda, work(itau), work(iwork), & + CALL DGEQRF(m, n, a, lda, work(itau), work(iwork), & lwork-iwork+1, ierr) CALL DLACPY('L', m, n, a, lda, u, ldu) - CALL DORGQR(m, m, n, u, ldu, work(itau), work(iwork), & + CALL DORGQR(m, m, n, u, ldu, work(itau), work(iwork), & lwork-iwork+1, ierr) CALL DLACPY('U', n, n, a, lda, vt, ldvt) - IF (n>1) CALL DLASET('L', n-1, n-1, zero, zero, vt(2,1), & - ldvt) + IF (n>1) CALL DLASET('L', n-1, n-1, zero, zero, vt(2, & + 1), ldvt) ie = itau itauq = ie + n itaup = itauq + n iwork = itaup + n - CALL DGEBRD(n, n, vt, ldvt, s, work(ie), work(itauq), & + CALL DGEBRD(n, n, vt, ldvt, s, work(ie), work(itauq), & work(itaup), work(iwork), lwork-iwork+1, ierr) - CALL DORMBR('Q', 'R', 'N', m, n, n, vt, ldvt, & + CALL DORMBR('Q', 'R', 'N', m, n, n, vt, ldvt, & work(itauq), u, ldu, work(iwork), lwork-iwork+1, ierr) - CALL DORGBR('P', n, n, n, vt, ldvt, work(itaup), & + CALL DORGBR('P', n, n, n, vt, ldvt, work(itaup), & work(iwork), lwork-iwork+1, ierr) iwork = ie + n - CALL DBDSQR('U', n, n, m, 0_ip_, s, work(ie), vt, ldvt, & + CALL DBDSQR('U', n, n, m, 0_ip_, s, work(ie), vt, ldvt, & u, ldu, dum, 1_ip_, work(iwork), info) END IF END IF @@ -2792,26 +2808,26 @@ SUBROUTINE DGESVD(jobu, jobvt, m, n, a, lda, s, u, ldu, vt, ldvt, & itauq = ie + n itaup = itauq + n iwork = itaup + n - CALL DGEBRD(m, n, a, lda, s, work(ie), work(itauq), & + CALL DGEBRD(m, n, a, lda, s, work(ie), work(itauq), & work(itaup), work(iwork), lwork-iwork+1, ierr) IF (wntuas) THEN CALL DLACPY('L', m, n, a, lda, u, ldu) IF (wntus) ncu = n IF (wntua) ncu = m - CALL DORGBR('Q', m, ncu, n, u, ldu, work(itauq), & + CALL DORGBR('Q', m, ncu, n, u, ldu, work(itauq), & work(iwork), lwork-iwork+1, ierr) END IF IF (wntvas) THEN CALL DLACPY('U', n, n, a, lda, vt, ldvt) - CALL DORGBR('P', n, n, n, vt, ldvt, work(itaup), & + CALL DORGBR('P', n, n, n, vt, ldvt, work(itaup), & work(iwork), lwork-iwork+1, ierr) END IF IF (wntuo) THEN - CALL DORGBR('Q', m, n, n, a, lda, work(itauq), work(iwork), & + CALL DORGBR('Q', m, n, n, a, lda, work(itauq), work(iwork), & lwork-iwork+1, ierr) END IF IF (wntvo) THEN - CALL DORGBR('P', n, n, n, a, lda, work(itaup), work(iwork), & + CALL DORGBR('P', n, n, n, a, lda, work(itaup), work(iwork), & lwork-iwork+1, ierr) END IF iwork = ie + n @@ -2820,14 +2836,14 @@ SUBROUTINE DGESVD(jobu, jobvt, m, n, a, lda, s, u, ldu, vt, ldvt, & IF (wntvas .OR. wntvo) ncvt = n IF (wntvn) ncvt = 0 IF ((.NOT. wntuo) .AND. (.NOT. wntvo)) THEN - CALL DBDSQR('U', n, ncvt, nru, 0_ip_, s, work(ie), vt, ldvt, & - u, ldu, dum, 1_ip_, work(iwork), info) + CALL DBDSQR('U', n, ncvt, nru, 0_ip_, s, work(ie), vt, & + ldvt, u, ldu, dum, 1_ip_, work(iwork), info) ELSE IF ((.NOT. wntuo) .AND. wntvo) THEN - CALL DBDSQR('U', n, ncvt, nru, 0_ip_, s, work(ie), a, lda, & + CALL DBDSQR('U', n, ncvt, nru, 0_ip_, s, work(ie), a, lda, & u, ldu, dum, 1_ip_, work(iwork), info) ELSE - CALL DBDSQR('U', n, ncvt, nru, 0_ip_, s, work(ie), vt, ldvt, & - a, lda, dum, 1_ip_, work(iwork), info) + CALL DBDSQR('U', n, ncvt, nru, 0_ip_, s, work(ie), vt, & + ldvt, a, lda, dum, 1_ip_, work(iwork), info) END IF END IF ELSE @@ -2835,23 +2851,23 @@ SUBROUTINE DGESVD(jobu, jobvt, m, n, a, lda, s, u, ldu, vt, ldvt, & IF (wntvn) THEN itau = 1 iwork = itau + m - CALL DGELQF(m, n, a, lda, work(itau), work(iwork), & + CALL DGELQF(m, n, a, lda, work(itau), work(iwork), & lwork-iwork+1, ierr) CALL DLASET('U', m-1, m-1, zero, zero, a(1,2), lda) ie = 1 itauq = ie + m itaup = itauq + m iwork = itaup + m - CALL DGEBRD(m, m, a, lda, s, work(ie), work(itauq), & + CALL DGEBRD(m, m, a, lda, s, work(ie), work(itauq), & work(itaup), work(iwork), lwork-iwork+1, ierr) IF (wntuo .OR. wntuas) THEN - CALL DORGBR('Q', m, m, m, a, lda, work(itauq), & + CALL DORGBR('Q', m, m, m, a, lda, work(itauq), & work(iwork), lwork-iwork+1, ierr) END IF iwork = ie + m nru = 0 IF (wntuo .OR. wntuas) nru = m - CALL DBDSQR('U', m, 0_ip_, nru, 0_ip_, s, work(ie), dum, & + CALL DBDSQR('U', m, 0_ip_, nru, 0_ip_, s, work(ie), dum, & 1_ip_, a, lda, dum, 1_ip_, work(iwork), info) IF (wntuas) CALL DLACPY('F', m, m, a, lda, u, ldu) ELSE IF (wntvo .AND. wntun) THEN @@ -2872,30 +2888,30 @@ SUBROUTINE DGESVD(jobu, jobvt, m, n, a, lda, s, u, ldu, vt, ldvt, & END IF itau = ir + ldwrkr*m iwork = itau + m - CALL DGELQF(m, n, a, lda, work(itau), work(iwork), & + CALL DGELQF(m, n, a, lda, work(itau), work(iwork), & lwork-iwork+1, ierr) CALL DLACPY('L', m, m, a, lda, work(ir), ldwrkr) - CALL DLASET('U', m-1, m-1, zero, zero, work(ir+ldwrkr), & + CALL DLASET('U', m-1, m-1, zero, zero, work(ir+ldwrkr), & ldwrkr) - CALL DORGLQ(m, n, m, a, lda, work(itau), work(iwork), & + CALL DORGLQ(m, n, m, a, lda, work(itau), work(iwork), & lwork-iwork+1, ierr) ie = itau itauq = ie + m itaup = itauq + m iwork = itaup + m - CALL DGEBRD(m, m, work(ir), ldwrkr, s, work(ie), & - work(itauq), work(itaup), work(iwork), lwork-iwork+1, & + CALL DGEBRD(m, m, work(ir), ldwrkr, s, work(ie), & + work(itauq), work(itaup), work(iwork), lwork-iwork+1, & ierr) - CALL DORGBR('P', m, m, m, work(ir), ldwrkr, work(itaup), & + CALL DORGBR('P', m, m, m, work(ir), ldwrkr, work(itaup), & work(iwork), lwork-iwork+1, ierr) iwork = ie + m - CALL DBDSQR('U', m, m, 0_ip_, 0_ip_, s, work(ie), & - work(ir), ldwrkr, dum, 1_ip_, dum, 1_ip_, work(iwork), & + CALL DBDSQR('U', m, m, 0_ip_, 0_ip_, s, work(ie), & + work(ir), ldwrkr, dum, 1_ip_, dum, 1_ip_, work(iwork), & info) iu = ie + m DO i = 1, n, chunk blk = MIN(n-i+1, chunk) - CALL DGEMM('N', 'N', m, blk, m, one, work(ir), ldwrkr, & + CALL DGEMM('N', 'N', m, blk, m, one, work(ir), ldwrkr, & a(1,i), lda, zero, work(iu), ldwrku) CALL DLACPY('F', m, blk, work(iu), ldwrku, a(1,i), lda) END DO @@ -2904,12 +2920,12 @@ SUBROUTINE DGESVD(jobu, jobvt, m, n, a, lda, s, u, ldu, vt, ldvt, & itauq = ie + m itaup = itauq + m iwork = itaup + m - CALL DGEBRD(m, n, a, lda, s, work(ie), work(itauq), & + CALL DGEBRD(m, n, a, lda, s, work(ie), work(itauq), & work(itaup), work(iwork), lwork-iwork+1, ierr) - CALL DORGBR('P', m, n, m, a, lda, work(itaup), & + CALL DORGBR('P', m, n, m, a, lda, work(itaup), & work(iwork), lwork-iwork+1, ierr) iwork = ie + m - CALL DBDSQR('L', m, n, 0_ip_, 0_ip_, s, work(ie), a, lda, & + CALL DBDSQR('L', m, n, 0_ip_, 0_ip_, s, work(ie), a, lda, & dum, 1_ip_, dum, 1_ip_, work(iwork), info) END IF ELSE IF (wntvo .AND. wntuas) THEN @@ -2930,54 +2946,54 @@ SUBROUTINE DGESVD(jobu, jobvt, m, n, a, lda, s, u, ldu, vt, ldvt, & END IF itau = ir + ldwrkr*m iwork = itau + m - CALL DGELQF(m, n, a, lda, work(itau), work(iwork), & + CALL DGELQF(m, n, a, lda, work(itau), work(iwork), & lwork-iwork+1, ierr) CALL DLACPY('L', m, m, a, lda, u, ldu) CALL DLASET('U', m-1, m-1, zero, zero, u(1,2), ldu) - CALL DORGLQ(m, n, m, a, lda, work(itau), work(iwork), & + CALL DORGLQ(m, n, m, a, lda, work(itau), work(iwork), & lwork-iwork+1, ierr) ie = itau itauq = ie + m itaup = itauq + m iwork = itaup + m - CALL DGEBRD(m, m, u, ldu, s, work(ie), work(itauq), & + CALL DGEBRD(m, m, u, ldu, s, work(ie), work(itauq), & work(itaup), work(iwork), lwork-iwork+1, ierr) CALL DLACPY('U', m, m, u, ldu, work(ir), ldwrkr) - CALL DORGBR('P', m, m, m, work(ir), ldwrkr, work(itaup), & + CALL DORGBR('P', m, m, m, work(ir), ldwrkr, work(itaup), & work(iwork), lwork-iwork+1, ierr) - CALL DORGBR('Q', m, m, m, u, ldu, work(itauq), & + CALL DORGBR('Q', m, m, m, u, ldu, work(itauq), & work(iwork), lwork-iwork+1, ierr) iwork = ie + m - CALL DBDSQR('U', m, m, m, 0_ip_, s, work(ie), work(ir), & + CALL DBDSQR('U', m, m, m, 0_ip_, s, work(ie), work(ir), & ldwrkr, u, ldu, dum, 1_ip_, work(iwork), info) iu = ie + m DO i = 1, n, chunk blk = MIN(n-i+1, chunk) - CALL DGEMM('N', 'N', m, blk, m, one, work(ir), ldwrkr, & + CALL DGEMM('N', 'N', m, blk, m, one, work(ir), ldwrkr, & a(1,i), lda, zero, work(iu), ldwrku) CALL DLACPY('F', m, blk, work(iu), ldwrku, a(1,i), lda) END DO ELSE itau = 1 iwork = itau + m - CALL DGELQF(m, n, a, lda, work(itau), work(iwork), & + CALL DGELQF(m, n, a, lda, work(itau), work(iwork), & lwork-iwork+1, ierr) CALL DLACPY('L', m, m, a, lda, u, ldu) CALL DLASET('U', m-1, m-1, zero, zero, u(1,2), ldu) - CALL DORGLQ(m, n, m, a, lda, work(itau), work(iwork), & + CALL DORGLQ(m, n, m, a, lda, work(itau), work(iwork), & lwork-iwork+1, ierr) ie = itau itauq = ie + m itaup = itauq + m iwork = itaup + m - CALL DGEBRD(m, m, u, ldu, s, work(ie), work(itauq), & + CALL DGEBRD(m, m, u, ldu, s, work(ie), work(itauq), & work(itaup), work(iwork), lwork-iwork+1, ierr) - CALL DORMBR('P', 'L', 'T', m, n, m, u, ldu, work(itaup), & + CALL DORMBR('P', 'L', 'T', m, n, m, u, ldu, work(itaup), & a, lda, work(iwork), lwork-iwork+1, ierr) - CALL DORGBR('Q', m, m, m, u, ldu, work(itauq), & + CALL DORGBR('Q', m, m, m, u, ldu, work(itauq), & work(iwork), lwork-iwork+1, ierr) iwork = ie + m - CALL DBDSQR('U', m, n, m, 0_ip_, s, work(ie), a, lda, u, & + CALL DBDSQR('U', m, n, m, 0_ip_, s, work(ie), a, lda, u, & ldu, dum, 1_ip_, work(iwork), info) END IF ELSE IF (wntvs) THEN @@ -2991,47 +3007,48 @@ SUBROUTINE DGESVD(jobu, jobvt, m, n, a, lda, s, u, ldu, vt, ldvt, & END IF itau = ir + ldwrkr*m iwork = itau + m - CALL DGELQF(m, n, a, lda, work(itau), work(iwork), & + CALL DGELQF(m, n, a, lda, work(itau), work(iwork), & lwork-iwork+1, ierr) CALL DLACPY('L', m, m, a, lda, work(ir), ldwrkr) - CALL DLASET('U', m-1, m-1, zero, zero, work(ir+ldwrkr), & + CALL DLASET('U', m-1, m-1, zero, zero, work(ir+ldwrkr), & ldwrkr) - CALL DORGLQ(m, n, m, a, lda, work(itau), work(iwork), & + CALL DORGLQ(m, n, m, a, lda, work(itau), work(iwork), & lwork-iwork+1, ierr) ie = itau itauq = ie + m itaup = itauq + m iwork = itaup + m - CALL DGEBRD(m, m, work(ir), ldwrkr, s, work(ie), & - work(itauq), work(itaup), work(iwork), lwork-iwork+1, & + CALL DGEBRD(m, m, work(ir), ldwrkr, s, work(ie), & + work(itauq), work(itaup), work(iwork), lwork-iwork+1, & ierr) - CALL DORGBR('P', m, m, m, work(ir), ldwrkr, work(itaup), & - work(iwork), lwork-iwork+1, ierr) + CALL DORGBR('P', m, m, m, work(ir), ldwrkr, & + work(itaup), work(iwork), lwork-iwork+1, ierr) iwork = ie + m - CALL DBDSQR('U', m, m, 0_ip_, 0_ip_, s, work(ie), & - work(ir), ldwrkr, dum, 1_ip_, dum, 1_ip_, work(iwork), & + CALL DBDSQR('U', m, m, 0_ip_, 0_ip_, s, work(ie), & + work(ir), ldwrkr, dum, 1_ip_, dum, 1_ip_, work(iwork),& info) - CALL DGEMM('N', 'N', m, n, m, one, work(ir), ldwrkr, a, & + CALL DGEMM('N', 'N', m, n, m, one, work(ir), ldwrkr, a, & lda, zero, vt, ldvt) ELSE itau = 1 iwork = itau + m - CALL DGELQF(m, n, a, lda, work(itau), work(iwork), & + CALL DGELQF(m, n, a, lda, work(itau), work(iwork), & lwork-iwork+1, ierr) CALL DLACPY('U', m, n, a, lda, vt, ldvt) - CALL DORGLQ(m, n, m, vt, ldvt, work(itau), work(iwork), & + CALL DORGLQ(m, n, m, vt, ldvt, work(itau), work(iwork), & lwork-iwork+1, ierr) ie = itau itauq = ie + m itaup = itauq + m iwork = itaup + m CALL DLASET('U', m-1, m-1, zero, zero, a(1,2), lda) - CALL DGEBRD(m, m, a, lda, s, work(ie), work(itauq), & + CALL DGEBRD(m, m, a, lda, s, work(ie), work(itauq), & work(itaup), work(iwork), lwork-iwork+1, ierr) - CALL DORMBR('P', 'L', 'T', m, n, m, a, lda, work(itaup), & - vt, ldvt, work(iwork), lwork-iwork+1, ierr) + CALL DORMBR('P', 'L', 'T', m, n, m, a, lda, & + work(itaup), vt, ldvt, work(iwork), lwork-iwork+1, & + ierr) iwork = ie + m - CALL DBDSQR('U', m, n, 0_ip_, 0_ip_, s, work(ie), vt, & + CALL DBDSQR('U', m, n, 0_ip_, 0_ip_, s, work(ie), vt, & ldvt, dum, 1_ip_, dum, 1_ip_, work(iwork), info) END IF ELSE IF (wntuo) THEN @@ -3052,53 +3069,55 @@ SUBROUTINE DGESVD(jobu, jobvt, m, n, a, lda, s, u, ldu, vt, ldvt, & END IF itau = ir + ldwrkr*m iwork = itau + m - CALL DGELQF(m, n, a, lda, work(itau), work(iwork), & + CALL DGELQF(m, n, a, lda, work(itau), work(iwork), & lwork-iwork+1, ierr) CALL DLACPY('L', m, m, a, lda, work(iu), ldwrku) - CALL DLASET('U', m-1, m-1, zero, zero, work(iu+ldwrku), & + CALL DLASET('U', m-1, m-1, zero, zero, work(iu+ldwrku), & ldwrku) - CALL DORGLQ(m, n, m, a, lda, work(itau), work(iwork), & + CALL DORGLQ(m, n, m, a, lda, work(itau), work(iwork), & lwork-iwork+1, ierr) ie = itau itauq = ie + m itaup = itauq + m iwork = itaup + m - CALL DGEBRD(m, m, work(iu), ldwrku, s, work(ie), & - work(itauq), work(itaup), work(iwork), lwork-iwork+1, & + CALL DGEBRD(m, m, work(iu), ldwrku, s, work(ie), & + work(itauq), work(itaup), work(iwork), lwork-iwork+1, & ierr) - CALL DLACPY('L', m, m, work(iu), ldwrku, work(ir), & + CALL DLACPY('L', m, m, work(iu), ldwrku, work(ir), & ldwrkr) - CALL DORGBR('P', m, m, m, work(iu), ldwrku, work(itaup), & - work(iwork), lwork-iwork+1, ierr) - CALL DORGBR('Q', m, m, m, work(ir), ldwrkr, work(itauq), & - work(iwork), lwork-iwork+1, ierr) + CALL DORGBR('P', m, m, m, work(iu), ldwrku, & + work(itaup), work(iwork), lwork-iwork+1, ierr) + CALL DORGBR('Q', m, m, m, work(ir), ldwrkr, & + work(itauq), work(iwork), lwork-iwork+1, ierr) iwork = ie + m - CALL DBDSQR('U', m, m, m, 0_ip_, s, work(ie), work(iu), & - ldwrku, work(ir), ldwrkr, dum, 1_ip_, work(iwork), info) - CALL DGEMM('N', 'N', m, n, m, one, work(iu), ldwrku, a, & + CALL DBDSQR('U', m, m, m, 0_ip_, s, work(ie), work(iu), & + ldwrku, work(ir), ldwrkr, dum, 1_ip_, work(iwork), & + info) + CALL DGEMM('N', 'N', m, n, m, one, work(iu), ldwrku, a, & lda, zero, vt, ldvt) CALL DLACPY('F', m, m, work(ir), ldwrkr, a, lda) ELSE itau = 1 iwork = itau + m - CALL DGELQF(m, n, a, lda, work(itau), work(iwork), & + CALL DGELQF(m, n, a, lda, work(itau), work(iwork), & lwork-iwork+1, ierr) CALL DLACPY('U', m, n, a, lda, vt, ldvt) - CALL DORGLQ(m, n, m, vt, ldvt, work(itau), work(iwork), & + CALL DORGLQ(m, n, m, vt, ldvt, work(itau), work(iwork), & lwork-iwork+1, ierr) ie = itau itauq = ie + m itaup = itauq + m iwork = itaup + m CALL DLASET('U', m-1, m-1, zero, zero, a(1,2), lda) - CALL DGEBRD(m, m, a, lda, s, work(ie), work(itauq), & + CALL DGEBRD(m, m, a, lda, s, work(ie), work(itauq), & work(itaup), work(iwork), lwork-iwork+1, ierr) - CALL DORMBR('P', 'L', 'T', m, n, m, a, lda, work(itaup), & - vt, ldvt, work(iwork), lwork-iwork+1, ierr) - CALL DORGBR('Q', m, m, m, a, lda, work(itauq), & + CALL DORMBR('P', 'L', 'T', m, n, m, a, lda, & + work(itaup), vt, ldvt, work(iwork), lwork-iwork+1, & + ierr) + CALL DORGBR('Q', m, m, m, a, lda, work(itauq), & work(iwork), lwork-iwork+1, ierr) iwork = ie + m - CALL DBDSQR('U', m, n, m, 0_ip_, s, work(ie), vt, ldvt, & + CALL DBDSQR('U', m, n, m, 0_ip_, s, work(ie), vt, ldvt, & a, lda, dum, 1_ip_, work(iwork), info) END IF ELSE IF (wntuas) THEN @@ -3111,37 +3130,37 @@ SUBROUTINE DGESVD(jobu, jobvt, m, n, a, lda, s, u, ldu, vt, ldvt, & END IF itau = iu + ldwrku*m iwork = itau + m - CALL DGELQF(m, n, a, lda, work(itau), work(iwork), & + CALL DGELQF(m, n, a, lda, work(itau), work(iwork), & lwork-iwork+1, ierr) CALL DLACPY('L', m, m, a, lda, work(iu), ldwrku) - CALL DLASET('U', m-1, m-1, zero, zero, work(iu+ldwrku), & + CALL DLASET('U', m-1, m-1, zero, zero, work(iu+ldwrku), & ldwrku) - CALL DORGLQ(m, n, m, a, lda, work(itau), work(iwork), & + CALL DORGLQ(m, n, m, a, lda, work(itau), work(iwork), & lwork-iwork+1, ierr) ie = itau itauq = ie + m itaup = itauq + m iwork = itaup + m - CALL DGEBRD(m, m, work(iu), ldwrku, s, work(ie), & - work(itauq), work(itaup), work(iwork), lwork-iwork+1, & + CALL DGEBRD(m, m, work(iu), ldwrku, s, work(ie), & + work(itauq), work(itaup), work(iwork), lwork-iwork+1, & ierr) CALL DLACPY('L', m, m, work(iu), ldwrku, u, ldu) - CALL DORGBR('P', m, m, m, work(iu), ldwrku, work(itaup), & - work(iwork), lwork-iwork+1, ierr) - CALL DORGBR('Q', m, m, m, u, ldu, work(itauq), & + CALL DORGBR('P', m, m, m, work(iu), ldwrku, & + work(itaup), work(iwork), lwork-iwork+1, ierr) + CALL DORGBR('Q', m, m, m, u, ldu, work(itauq), & work(iwork), lwork-iwork+1, ierr) iwork = ie + m - CALL DBDSQR('U', m, m, m, 0_ip_, s, work(ie), work(iu), & + CALL DBDSQR('U', m, m, m, 0_ip_, s, work(ie), work(iu), & ldwrku, u, ldu, dum, 1_ip_, work(iwork), info) - CALL DGEMM('N', 'N', m, n, m, one, work(iu), ldwrku, a, & + CALL DGEMM('N', 'N', m, n, m, one, work(iu), ldwrku, a, & lda, zero, vt, ldvt) ELSE itau = 1 iwork = itau + m - CALL DGELQF(m, n, a, lda, work(itau), work(iwork), & + CALL DGELQF(m, n, a, lda, work(itau), work(iwork), & lwork-iwork+1, ierr) CALL DLACPY('U', m, n, a, lda, vt, ldvt) - CALL DORGLQ(m, n, m, vt, ldvt, work(itau), work(iwork), & + CALL DORGLQ(m, n, m, vt, ldvt, work(itau), work(iwork), & lwork-iwork+1, ierr) CALL DLACPY('L', m, m, a, lda, u, ldu) CALL DLASET('U', m-1, m-1, zero, zero, u(1,2), ldu) @@ -3149,14 +3168,15 @@ SUBROUTINE DGESVD(jobu, jobvt, m, n, a, lda, s, u, ldu, vt, ldvt, & itauq = ie + m itaup = itauq + m iwork = itaup + m - CALL DGEBRD(m, m, u, ldu, s, work(ie), work(itauq), & + CALL DGEBRD(m, m, u, ldu, s, work(ie), work(itauq), & work(itaup), work(iwork), lwork-iwork+1, ierr) - CALL DORMBR('P', 'L', 'T', m, n, m, u, ldu, work(itaup), & - vt, ldvt, work(iwork), lwork-iwork+1, ierr) - CALL DORGBR('Q', m, m, m, u, ldu, work(itauq), & + CALL DORMBR('P', 'L', 'T', m, n, m, u, ldu, & + work(itaup), vt, ldvt, work(iwork), lwork-iwork+1, & + ierr) + CALL DORGBR('Q', m, m, m, u, ldu, work(itauq), & work(iwork), lwork-iwork+1, ierr) iwork = ie + m - CALL DBDSQR('U', m, n, m, 0_ip_, s, work(ie), vt, ldvt, & + CALL DBDSQR('U', m, n, m, 0_ip_, s, work(ie), vt, ldvt, & u, ldu, dum, 1_ip_, work(iwork), info) END IF END IF @@ -3171,49 +3191,50 @@ SUBROUTINE DGESVD(jobu, jobvt, m, n, a, lda, s, u, ldu, vt, ldvt, & END IF itau = ir + ldwrkr*m iwork = itau + m - CALL DGELQF(m, n, a, lda, work(itau), work(iwork), & + CALL DGELQF(m, n, a, lda, work(itau), work(iwork), & lwork-iwork+1, ierr) CALL DLACPY('U', m, n, a, lda, vt, ldvt) CALL DLACPY('L', m, m, a, lda, work(ir), ldwrkr) - CALL DLASET('U', m-1, m-1, zero, zero, work(ir+ldwrkr), & + CALL DLASET('U', m-1, m-1, zero, zero, work(ir+ldwrkr), & ldwrkr) - CALL DORGLQ(n, n, m, vt, ldvt, work(itau), work(iwork), & + CALL DORGLQ(n, n, m, vt, ldvt, work(itau), work(iwork), & lwork-iwork+1, ierr) ie = itau itauq = ie + m itaup = itauq + m iwork = itaup + m - CALL DGEBRD(m, m, work(ir), ldwrkr, s, work(ie), & - work(itauq), work(itaup), work(iwork), lwork-iwork+1, & + CALL DGEBRD(m, m, work(ir), ldwrkr, s, work(ie), & + work(itauq), work(itaup), work(iwork), lwork-iwork+1, & ierr) - CALL DORGBR('P', m, m, m, work(ir), ldwrkr, work(itaup), & - work(iwork), lwork-iwork+1, ierr) + CALL DORGBR('P', m, m, m, work(ir), ldwrkr, & + work(itaup), work(iwork), lwork-iwork+1, ierr) iwork = ie + m - CALL DBDSQR('U', m, m, 0_ip_, 0_ip_, s, work(ie), & - work(ir), ldwrkr, dum, 1_ip_, dum, 1_ip_, work(iwork), & + CALL DBDSQR('U', m, m, 0_ip_, 0_ip_, s, work(ie), & + work(ir), ldwrkr, dum, 1_ip_, dum, 1_ip_, work(iwork),& info) - CALL DGEMM('N', 'N', m, n, m, one, work(ir), ldwrkr, vt, & - ldvt, zero, a, lda) + CALL DGEMM('N', 'N', m, n, m, one, work(ir), ldwrkr, & + vt, ldvt, zero, a, lda) CALL DLACPY('F', m, n, a, lda, vt, ldvt) ELSE itau = 1 iwork = itau + m - CALL DGELQF(m, n, a, lda, work(itau), work(iwork), & + CALL DGELQF(m, n, a, lda, work(itau), work(iwork), & lwork-iwork+1, ierr) CALL DLACPY('U', m, n, a, lda, vt, ldvt) - CALL DORGLQ(n, n, m, vt, ldvt, work(itau), work(iwork), & + CALL DORGLQ(n, n, m, vt, ldvt, work(itau), work(iwork), & lwork-iwork+1, ierr) ie = itau itauq = ie + m itaup = itauq + m iwork = itaup + m CALL DLASET('U', m-1, m-1, zero, zero, a(1,2), lda) - CALL DGEBRD(m, m, a, lda, s, work(ie), work(itauq), & + CALL DGEBRD(m, m, a, lda, s, work(ie), work(itauq), & work(itaup), work(iwork), lwork-iwork+1, ierr) - CALL DORMBR('P', 'L', 'T', m, n, m, a, lda, work(itaup), & - vt, ldvt, work(iwork), lwork-iwork+1, ierr) + CALL DORMBR('P', 'L', 'T', m, n, m, a, lda, & + work(itaup), vt, ldvt, work(iwork), lwork-iwork+1, & + ierr) iwork = ie + m - CALL DBDSQR('U', m, n, 0_ip_, 0_ip_, s, work(ie), vt, & + CALL DBDSQR('U', m, n, 0_ip_, 0_ip_, s, work(ie), vt, & ldvt, dum, 1_ip_, dum, 1_ip_, work(iwork), info) END IF ELSE IF (wntuo) THEN @@ -3234,55 +3255,57 @@ SUBROUTINE DGESVD(jobu, jobvt, m, n, a, lda, s, u, ldu, vt, ldvt, & END IF itau = ir + ldwrkr*m iwork = itau + m - CALL DGELQF(m, n, a, lda, work(itau), work(iwork), & + CALL DGELQF(m, n, a, lda, work(itau), work(iwork), & lwork-iwork+1, ierr) CALL DLACPY('U', m, n, a, lda, vt, ldvt) - CALL DORGLQ(n, n, m, vt, ldvt, work(itau), work(iwork), & + CALL DORGLQ(n, n, m, vt, ldvt, work(itau), work(iwork), & lwork-iwork+1, ierr) CALL DLACPY('L', m, m, a, lda, work(iu), ldwrku) - CALL DLASET('U', m-1, m-1, zero, zero, work(iu+ldwrku), & + CALL DLASET('U', m-1, m-1, zero, zero, work(iu+ldwrku), & ldwrku) ie = itau itauq = ie + m itaup = itauq + m iwork = itaup + m - CALL DGEBRD(m, m, work(iu), ldwrku, s, work(ie), & - work(itauq), work(itaup), work(iwork), lwork-iwork+1, & + CALL DGEBRD(m, m, work(iu), ldwrku, s, work(ie), & + work(itauq), work(itaup), work(iwork), lwork-iwork+1, & ierr) - CALL DLACPY('L', m, m, work(iu), ldwrku, work(ir), & + CALL DLACPY('L', m, m, work(iu), ldwrku, work(ir), & ldwrkr) - CALL DORGBR('P', m, m, m, work(iu), ldwrku, work(itaup), & - work(iwork), lwork-iwork+1, ierr) - CALL DORGBR('Q', m, m, m, work(ir), ldwrkr, work(itauq), & - work(iwork), lwork-iwork+1, ierr) + CALL DORGBR('P', m, m, m, work(iu), ldwrku, & + work(itaup), work(iwork), lwork-iwork+1, ierr) + CALL DORGBR('Q', m, m, m, work(ir), ldwrkr, & + work(itauq), work(iwork), lwork-iwork+1, ierr) iwork = ie + m - CALL DBDSQR('U', m, m, m, 0_ip_, s, work(ie), work(iu), & - ldwrku, work(ir), ldwrkr, dum, 1_ip_, work(iwork), info) - CALL DGEMM('N', 'N', m, n, m, one, work(iu), ldwrku, vt, & - ldvt, zero, a, lda) + CALL DBDSQR('U', m, m, m, 0_ip_, s, work(ie), work(iu), & + ldwrku, work(ir), ldwrkr, dum, 1_ip_, work(iwork), & + info) + CALL DGEMM('N', 'N', m, n, m, one, work(iu), ldwrku, & + vt, ldvt, zero, a, lda) CALL DLACPY('F', m, n, a, lda, vt, ldvt) CALL DLACPY('F', m, m, work(ir), ldwrkr, a, lda) ELSE itau = 1 iwork = itau + m - CALL DGELQF(m, n, a, lda, work(itau), work(iwork), & + CALL DGELQF(m, n, a, lda, work(itau), work(iwork), & lwork-iwork+1, ierr) CALL DLACPY('U', m, n, a, lda, vt, ldvt) - CALL DORGLQ(n, n, m, vt, ldvt, work(itau), work(iwork), & + CALL DORGLQ(n, n, m, vt, ldvt, work(itau), work(iwork), & lwork-iwork+1, ierr) ie = itau itauq = ie + m itaup = itauq + m iwork = itaup + m CALL DLASET('U', m-1, m-1, zero, zero, a(1,2), lda) - CALL DGEBRD(m, m, a, lda, s, work(ie), work(itauq), & + CALL DGEBRD(m, m, a, lda, s, work(ie), work(itauq), & work(itaup), work(iwork), lwork-iwork+1, ierr) - CALL DORMBR('P', 'L', 'T', m, n, m, a, lda, work(itaup), & - vt, ldvt, work(iwork), lwork-iwork+1, ierr) - CALL DORGBR('Q', m, m, m, a, lda, work(itauq), & + CALL DORMBR('P', 'L', 'T', m, n, m, a, lda, & + work(itaup), vt, ldvt, work(iwork), lwork-iwork+1, & + ierr) + CALL DORGBR('Q', m, m, m, a, lda, work(itauq), & work(iwork), lwork-iwork+1, ierr) iwork = ie + m - CALL DBDSQR('U', m, n, m, 0_ip_, s, work(ie), vt, ldvt, & + CALL DBDSQR('U', m, n, m, 0_ip_, s, work(ie), vt, ldvt, & a, lda, dum, 1_ip_, work(iwork), info) END IF ELSE IF (wntuas) THEN @@ -3295,39 +3318,39 @@ SUBROUTINE DGESVD(jobu, jobvt, m, n, a, lda, s, u, ldu, vt, ldvt, & END IF itau = iu + ldwrku*m iwork = itau + m - CALL DGELQF(m, n, a, lda, work(itau), work(iwork), & + CALL DGELQF(m, n, a, lda, work(itau), work(iwork), & lwork-iwork+1, ierr) CALL DLACPY('U', m, n, a, lda, vt, ldvt) - CALL DORGLQ(n, n, m, vt, ldvt, work(itau), work(iwork), & + CALL DORGLQ(n, n, m, vt, ldvt, work(itau), work(iwork), & lwork-iwork+1, ierr) CALL DLACPY('L', m, m, a, lda, work(iu), ldwrku) - CALL DLASET('U', m-1, m-1, zero, zero, work(iu+ldwrku), & + CALL DLASET('U', m-1, m-1, zero, zero, work(iu+ldwrku), & ldwrku) ie = itau itauq = ie + m itaup = itauq + m iwork = itaup + m - CALL DGEBRD(m, m, work(iu), ldwrku, s, work(ie), & - work(itauq), work(itaup), work(iwork), lwork-iwork+1, & + CALL DGEBRD(m, m, work(iu), ldwrku, s, work(ie), & + work(itauq), work(itaup), work(iwork), lwork-iwork+1, & ierr) CALL DLACPY('L', m, m, work(iu), ldwrku, u, ldu) - CALL DORGBR('P', m, m, m, work(iu), ldwrku, work(itaup), & - work(iwork), lwork-iwork+1, ierr) - CALL DORGBR('Q', m, m, m, u, ldu, work(itauq), & + CALL DORGBR('P', m, m, m, work(iu), ldwrku, & + work(itaup), work(iwork), lwork-iwork+1, ierr) + CALL DORGBR('Q', m, m, m, u, ldu, work(itauq), & work(iwork), lwork-iwork+1, ierr) iwork = ie + m - CALL DBDSQR('U', m, m, m, 0_ip_, s, work(ie), work(iu), & + CALL DBDSQR('U', m, m, m, 0_ip_, s, work(ie), work(iu), & ldwrku, u, ldu, dum, 1_ip_, work(iwork), info) - CALL DGEMM('N', 'N', m, n, m, one, work(iu), ldwrku, vt, & - ldvt, zero, a, lda) + CALL DGEMM('N', 'N', m, n, m, one, work(iu), ldwrku, & + vt, ldvt, zero, a, lda) CALL DLACPY('F', m, n, a, lda, vt, ldvt) ELSE itau = 1 iwork = itau + m - CALL DGELQF(m, n, a, lda, work(itau), work(iwork), & + CALL DGELQF(m, n, a, lda, work(itau), work(iwork), & lwork-iwork+1, ierr) CALL DLACPY('U', m, n, a, lda, vt, ldvt) - CALL DORGLQ(n, n, m, vt, ldvt, work(itau), work(iwork), & + CALL DORGLQ(n, n, m, vt, ldvt, work(itau), work(iwork), & lwork-iwork+1, ierr) CALL DLACPY('L', m, m, a, lda, u, ldu) CALL DLASET('U', m-1, m-1, zero, zero, u(1,2), ldu) @@ -3335,14 +3358,15 @@ SUBROUTINE DGESVD(jobu, jobvt, m, n, a, lda, s, u, ldu, vt, ldvt, & itauq = ie + m itaup = itauq + m iwork = itaup + m - CALL DGEBRD(m, m, u, ldu, s, work(ie), work(itauq), & + CALL DGEBRD(m, m, u, ldu, s, work(ie), work(itauq), & work(itaup), work(iwork), lwork-iwork+1, ierr) - CALL DORMBR('P', 'L', 'T', m, n, m, u, ldu, work(itaup), & - vt, ldvt, work(iwork), lwork-iwork+1, ierr) - CALL DORGBR('Q', m, m, m, u, ldu, work(itauq), & + CALL DORMBR('P', 'L', 'T', m, n, m, u, ldu, & + work(itaup), vt, ldvt, work(iwork), lwork-iwork+1, & + ierr) + CALL DORGBR('Q', m, m, m, u, ldu, work(itauq), & work(iwork), lwork-iwork+1, ierr) iwork = ie + m - CALL DBDSQR('U', m, n, m, 0_ip_, s, work(ie), vt, ldvt, & + CALL DBDSQR('U', m, n, m, 0_ip_, s, work(ie), vt, ldvt, & u, ldu, dum, 1_ip_, work(iwork), info) END IF END IF @@ -3352,26 +3376,26 @@ SUBROUTINE DGESVD(jobu, jobvt, m, n, a, lda, s, u, ldu, vt, ldvt, & itauq = ie + m itaup = itauq + m iwork = itaup + m - CALL DGEBRD(m, n, a, lda, s, work(ie), work(itauq), & + CALL DGEBRD(m, n, a, lda, s, work(ie), work(itauq), & work(itaup), work(iwork), lwork-iwork+1, ierr) IF (wntuas) THEN CALL DLACPY('L', m, m, a, lda, u, ldu) - CALL DORGBR('Q', m, m, n, u, ldu, work(itauq), work(iwork), & + CALL DORGBR('Q', m, m, n, u, ldu, work(itauq), work(iwork), & lwork-iwork+1, ierr) END IF IF (wntvas) THEN CALL DLACPY('U', m, n, a, lda, vt, ldvt) IF (wntva) nrvt = n IF (wntvs) nrvt = m - CALL DORGBR('P', nrvt, n, m, vt, ldvt, work(itaup), & + CALL DORGBR('P', nrvt, n, m, vt, ldvt, work(itaup), & work(iwork), lwork-iwork+1, ierr) END IF IF (wntuo) THEN - CALL DORGBR('Q', m, m, n, a, lda, work(itauq), work(iwork), & + CALL DORGBR('Q', m, m, n, a, lda, work(itauq), work(iwork), & lwork-iwork+1, ierr) END IF IF (wntvo) THEN - CALL DORGBR('P', m, n, m, a, lda, work(itaup), work(iwork), & + CALL DORGBR('P', m, n, m, a, lda, work(itaup), work(iwork), & lwork-iwork+1, ierr) END IF iwork = ie + m @@ -3380,14 +3404,14 @@ SUBROUTINE DGESVD(jobu, jobvt, m, n, a, lda, s, u, ldu, vt, ldvt, & IF (wntvas .OR. wntvo) ncvt = n IF (wntvn) ncvt = 0 IF ((.NOT. wntuo) .AND. (.NOT. wntvo)) THEN - CALL DBDSQR('L', m, ncvt, nru, 0_ip_, s, work(ie), vt, ldvt, & - u, ldu, dum, 1_ip_, work(iwork), info) + CALL DBDSQR('L', m, ncvt, nru, 0_ip_, s, work(ie), vt, & + ldvt, u, ldu, dum, 1_ip_, work(iwork), info) ELSE IF ((.NOT. wntuo) .AND. wntvo) THEN - CALL DBDSQR('L', m, ncvt, nru, 0_ip_, s, work(ie), a, lda, & + CALL DBDSQR('L', m, ncvt, nru, 0_ip_, s, work(ie), a, lda, & u, ldu, dum, 1_ip_, work(iwork), info) ELSE - CALL DBDSQR('L', m, ncvt, nru, 0_ip_, s, work(ie), vt, ldvt, & - a, lda, dum, 1_ip_, work(iwork), info) + CALL DBDSQR('L', m, ncvt, nru, 0_ip_, s, work(ie), vt, & + ldvt, a, lda, dum, 1_ip_, work(iwork), info) END IF END IF END IF @@ -3404,13 +3428,13 @@ SUBROUTINE DGESVD(jobu, jobvt, m, n, a, lda, s, u, ldu, vt, ldvt, & END IF END IF IF (iscl==1) THEN - IF (anrm>bignum) CALL DLASCL('G', 0_ip_, 0_ip_, bignum, anrm, & + IF (anrm>bignum) CALL DLASCL('G', 0_ip_, 0_ip_, bignum, anrm, & minmn, 1_ip_, s, minmn, ierr) - IF (info/=0 .AND. anrm>bignum) CALL DLASCL('G', 0_ip_, 0_ip_, & + IF (info/=0 .AND. anrm>bignum) CALL DLASCL('G', 0_ip_, 0_ip_, & bignum, anrm, minmn-1, 1_ip_, work(2), minmn, ierr) - IF (anrm0) info = iinfo CALL DLASWP(n2, a(1,n1+1), lda, 1_ip_, n1, ipiv, 1_ip_) - CALL DTRSM('L', 'L', 'N', 'U', n1, n2, one, a, lda, a(1,n1+1), & + CALL DTRSM('L', 'L', 'N', 'U', n1, n2, one, a, lda, a(1,n1+1), & lda) - CALL DGEMM('N', 'N', m-n1, n2, n1, -one, a(n1+1,1), lda, a(1, & + CALL DGEMM('N', 'N', m-n1, n2, n1, -one, a(n1+1,1), lda, a(1, & n1+1), lda, one, a(n1+1,n1+1), lda) CALL DGETRF2(m-n1, n2, a(n1+1,n1+1), lda, ipiv(n1+1), iinfo) IF (info==0 .AND. iinfo>0) info = iinfo + n1 @@ -3608,7 +3632,7 @@ SUBROUTINE DGETRS(trans, n, nrhs, a, lda, ipiv, b, ldb, info) INTRINSIC :: MAX info = 0 notran = LSAME(trans, 'N') - IF (.NOT. notran .AND. .NOT. LSAME(trans,'T') .AND. .NOT. & + IF (.NOT. notran .AND. .NOT. LSAME(trans,'T') .AND. .NOT. & LSAME(trans,'C')) THEN info = -1 ELSE IF (n<0) THEN @@ -3627,21 +3651,21 @@ SUBROUTINE DGETRS(trans, n, nrhs, a, lda, ipiv, b, ldb, info) IF (n==0 .OR. nrhs==0) RETURN IF (notran) THEN CALL DLASWP(nrhs, b, ldb, 1_ip_, n, ipiv, 1_ip_) - CALL DTRSM('Left', 'Lower', 'No transpose', 'Unit', n, nrhs, & - one, a, lda, b, ldb) - CALL DTRSM('Left', 'Upper', 'No transpose', 'Non-unit', n, nrhs, & + CALL DTRSM('Left', 'Lower', 'No transpose', 'Unit', n, nrhs, & one, a, lda, b, ldb) + CALL DTRSM('Left', 'Upper', 'No transpose', 'Non-unit', n, & + nrhs, one, a, lda, b, ldb) ELSE - CALL DTRSM('Left', 'Upper', 'Transpose', 'Non-unit', n, nrhs, & + CALL DTRSM('Left', 'Upper', 'Transpose', 'Non-unit', n, nrhs, & one, a, lda, b, ldb) - CALL DTRSM('Left', 'Lower', 'Transpose', 'Unit', n, nrhs, one, & + CALL DTRSM('Left', 'Lower', 'Transpose', 'Unit', n, nrhs, one, & a, lda, b, ldb) CALL DLASWP(nrhs, b, ldb, 1_ip_, n, ipiv, -1_ip_) END IF RETURN END SUBROUTINE - SUBROUTINE DHSEQR(job, compz, n, ilo, ihi, h, ldh, wr, wi, z, ldz, & + SUBROUTINE DHSEQR(job, compz, n, ilo, ihi, h, ldh, wr, wi, z, ldz, & work, lwork, info) USE GALAHAD_KINDS INTEGER(ip_) :: ihi, ilo, info, ldh, ldz, lwork, n @@ -3659,7 +3683,8 @@ SUBROUTINE DHSEQR(job, compz, n, ilo, ihi, h, ldh, wr, wi, z, ldz, & INTEGER(ip_) :: ILAENV LOGICAL :: LSAME EXTERNAL :: ILAENV, LSAME - EXTERNAL :: DLACPY, DLAHQR, DLAQR0, DLASET, XERBLA + EXTERNAL :: DLACPY, DLAHQR, DLAQR0, DLASET, & + XERBLA INTRINSIC :: DBLE, MAX, MIN wantt = LSAME(job, 'S') initz = LSAME(compz, 'I') @@ -3690,8 +3715,8 @@ SUBROUTINE DHSEQR(job, compz, n, ilo, ihi, h, ldh, wr, wi, z, ldz, & ELSE IF (n==0) THEN RETURN ELSE IF (lquery) THEN - CALL DLAQR0(wantt, wantz, n, ilo, ihi, h, ldh, wr, wi, ilo, ihi, & - z, ldz, work, lwork, info) + CALL DLAQR0(wantt, wantz, n, ilo, ihi, h, ldh, wr, wi, ilo, & + ihi, z, ldz, work, lwork, info) work(1) = MAX(DBLE(MAX(1,n)), work(1)) RETURN ELSE @@ -3709,32 +3734,32 @@ SUBROUTINE DHSEQR(job, compz, n, ilo, ihi, h, ldh, wr, wi, z, ldz, & wi(ilo) = zero RETURN END IF - nmin = ILAENV(12_ip_, 'DHSEQR', job(:1)//compz(:1), n, ilo, ihi, & - lwork) + nmin = ILAENV(12_ip_, 'DHSEQR', job(:1)//compz(:1), n, ilo, & + ihi, lwork) nmin = MAX(ntiny, nmin) IF (n>nmin) THEN - CALL DLAQR0(wantt, wantz, n, ilo, ihi, h, ldh, wr, wi, ilo, & + CALL DLAQR0(wantt, wantz, n, ilo, ihi, h, ldh, wr, wi, ilo, & ihi, z, ldz, work, lwork, info) ELSE - CALL DLAHQR(wantt, wantz, n, ilo, ihi, h, ldh, wr, wi, ilo, & + CALL DLAHQR(wantt, wantz, n, ilo, ihi, h, ldh, wr, wi, ilo, & ihi, z, ldz, info) IF (info>0) THEN kbot = info IF (n>=nl) THEN - CALL DLAQR0(wantt, wantz, n, ilo, kbot, h, ldh, wr, wi, & + CALL DLAQR0(wantt, wantz, n, ilo, kbot, h, ldh, wr, wi, & ilo, ihi, z, ldz, work, lwork, info) ELSE CALL DLACPY('A', n, n, h, ldh, hl, nl) hl(n+1, n) = zero CALL DLASET('A', nl, nl-n, zero, zero, hl(1,n+1), nl) - CALL DLAQR0(wantt, wantz, nl, ilo, kbot, hl, nl, wr, wi, & + CALL DLAQR0(wantt, wantz, nl, ilo, kbot, hl, nl, wr, wi, & ilo, ihi, z, ldz, workl, nl, info) - IF (wantt .OR. info/=0) CALL DLACPY('A', n, n, hl, nl, h, & + IF (wantt .OR. info/=0) CALL DLACPY('A', n, n, hl, nl, h, & ldh) END IF END IF END IF - IF ((wantt .OR. info/=0) .AND. n>2) CALL DLASET('L', n-2, n-2, & + IF ((wantt .OR. info/=0) .AND. n>2) CALL DLASET('L', n-2, n-2, & zero, zero, h(3,1), ldh) work(1) = MAX(DBLE(MAX(1,n)), work(1)) END IF @@ -3760,11 +3785,11 @@ SUBROUTINE DLABAD(small, large) RETURN END SUBROUTINE - SUBROUTINE DLABRD(m, n, nb, a, lda, d, e, tauq, taup, x, ldx, y, & + SUBROUTINE DLABRD(m, n, nb, a, lda, d, e, tauq, taup, x, ldx, y, & ldy) USE GALAHAD_KINDS INTEGER(ip_) :: lda, ldx, ldy, m, n, nb - REAL(r8_) :: a(lda, *), d(*), e(*), taup(*), tauq(*), x(ldx, *), & + REAL(r8_) :: a(lda, *), d(*), e(*), taup(*), tauq(*), x(ldx, *), & y(ldy, *) REAL(r8_) :: zero, one PARAMETER (zero=0.0_r8_, one=1.0_r8_) @@ -3774,83 +3799,83 @@ SUBROUTINE DLABRD(m, n, nb, a, lda, d, e, tauq, taup, x, ldx, y, & IF (m<=0 .OR. n<=0) RETURN IF (m>=n) THEN DO i = 1, nb - CALL DGEMV('No transpose', m-i+1, i-1, -one, a(i,1), lda, y(i, & - 1), ldy, one, a(i,i), 1_ip_) - CALL DGEMV('No transpose', m-i+1, i-1, -one, x(i,1), ldx, a(1, & - i), 1_ip_, one, a(i,i), 1_ip_) + CALL DGEMV('No transpose', m-i+1, i-1, -one, a(i,1), lda, & + y(i,1), ldy, one, a(i,i), 1_ip_) + CALL DGEMV('No transpose', m-i+1, i-1, -one, x(i,1), ldx, & + a(1,i), 1_ip_, one, a(i,i), 1_ip_) CALL DLARFG(m-i+1, a(i,i), a(MIN(i+1,m),i), 1_ip_, tauq(i)) d(i) = a(i, i) IF (ithresh) GO TO & - 50 + IF (MAX(ABS(d(3,1)),ABS(d(3,2)),ABS(d(3,3)- t11))>thresh) GO & + TO 50 CALL DLARFX('L', 3_ip_, n-j1+1, u, tau, t(j1,j1), ldt, work) CALL DLARFX('R', j2, 3_ip_, u, tau, t(1,j1), ldt, work) t(j3, j1) = zero @@ -4367,8 +4392,8 @@ SUBROUTINE DLAEXC(wantq, n, t, ldt, q, ldq, j1, n1, n2, work, info) t33 = t(j3, j3) CALL DLARFX('L', 3_ip_, 3_ip_, u, tau, d, ldd, work) CALL DLARFX('R', 3_ip_, 3_ip_, u, tau, d, ldd, work) - IF (MAX(ABS(d(2,1)),ABS(d(3,1)),ABS(d(1,1)- t33))>thresh) GO TO & - 50 + IF (MAX(ABS(d(2,1)),ABS(d(3,1)),ABS(d(1,1)- t33))>thresh) GO & + TO 50 CALL DLARFX('R', j3, 3_ip_, u, tau, t(1,j1), ldt, work) CALL DLARFX('L', 3_ip_, n-j1, u, tau, t(j1,j2), ldt, work) t(j1, j1) = t33 @@ -4394,7 +4419,7 @@ SUBROUTINE DLAEXC(wantq, n, t, ldt, q, ldq, j1, n1, n2, work, info) CALL DLARFX('R', 4_ip_, 3_ip_, u1, tau1, d, ldd, work) CALL DLARFX('L', 3_ip_, 4_ip_, u2, tau2, d(2,1), ldd, work) CALL DLARFX('R', 4_ip_, 3_ip_, u2, tau2, d(1,2), ldd, work) - IF (MAX(ABS(d(3,1)),ABS(d(3,2)),ABS(d(4,1)),ABS( d(4, & + IF (MAX(ABS(d(3,1)),ABS(d(3,2)),ABS(d(4,1)),ABS( d(4, & 2)))>thresh) GO TO 50 CALL DLARFX('L', 3_ip_, n-j1+1, u1, tau1, t(j1,j1), ldt, work) CALL DLARFX('R', j4, 3_ip_, u1, tau1, t(1,j1), ldt, work) @@ -4410,22 +4435,22 @@ SUBROUTINE DLAEXC(wantq, n, t, ldt, q, ldq, j1, n1, n2, work, info) END IF 40 CONTINUE IF (n2==2) THEN - CALL DLANV2(t(j1,j1), t(j1,j2), t(j2,j1), t(j2,j2), wr1, wi1, & + CALL DLANV2(t(j1,j1), t(j1,j2), t(j2,j1), t(j2,j2), wr1, wi1, & wr2, wi2, cs, sn) CALL DROT(n-j1-1, t(j1,j1+2), ldt, t(j2,j1+2), ldt, cs, sn) CALL DROT(j1-1, t(1,j1), 1_ip_, t(1,j2), 1_ip_, cs, sn) - IF (wantq) CALL DROT(n, q(1,j1), 1_ip_, q(1,j2), 1_ip_, cs, & + IF (wantq) CALL DROT(n, q(1,j1), 1_ip_, q(1,j2), 1_ip_, cs, & sn) END IF IF (n1==2) THEN j3 = j1 + n2 j4 = j3 + 1 - CALL DLANV2(t(j3,j3), t(j3,j4), t(j4,j3), t(j4,j4), wr1, wi1, & + CALL DLANV2(t(j3,j3), t(j3,j4), t(j4,j3), t(j4,j4), wr1, wi1, & wr2, wi2, cs, sn) - IF (j3+2<=n) CALL DROT(n-j3-1, t(j3,j3+2), ldt, t(j4,j3+2), & + IF (j3+2<=n) CALL DROT(n-j3-1, t(j3,j3+2), ldt, t(j4,j3+2), & ldt, cs, sn) CALL DROT(j3-1, t(1,j3), 1_ip_, t(1,j4), 1_ip_, cs, sn) - IF (wantq) CALL DROT(n, q(1,j3), 1_ip_, q(1,j4), 1_ip_, cs, & + IF (wantq) CALL DROT(n, q(1,j3), 1_ip_, q(1,j4), 1_ip_, cs, & sn) END IF END IF @@ -4435,7 +4460,7 @@ SUBROUTINE DLAEXC(wantq, n, t, ldt, q, ldq, j1, n1, n2, work, info) RETURN END SUBROUTINE - SUBROUTINE DLAHQR(wantt, wantz, n, ilo, ihi, h, ldh, wr, wi, iloz, & + SUBROUTINE DLAHQR(wantt, wantz, n, ilo, ihi, h, ldh, wr, wi, iloz, & ihiz, z, ldz, info) USE GALAHAD_KINDS IMPLICIT NONE @@ -4448,10 +4473,10 @@ SUBROUTINE DLAHQR(wantt, wantz, n, ilo, ihi, h, ldh, wr, wi, iloz, & PARAMETER (dat1=3.0_r8_/4.0_r8_, dat2=-0.4375_r8_) INTEGER(ip_) :: kexsh PARAMETER (kexsh=10) - REAL(r8_) :: aa, ab, ba, bb, cs, det, h11, h12, h21, h21s, h22, & - rt1i, rt1r, rt2i, rt2r, rtdisc, s, safmax, safmin, smlnum, sn, & + REAL(r8_) :: aa, ab, ba, bb, cs, det, h11, h12, h21, h21s, h22, & + rt1i, rt1r, rt2i, rt2r, rtdisc, s, safmax, safmin, smlnum, sn, & sum, t1, t2, t3, tr, tst, ulp, v2, v3 - INTEGER(ip_) :: i, i1, i2, its, itmax, j, k, l, m, nh, nr, nz, & + INTEGER(ip_) :: i, i1, i2, its, itmax, j, k, l, m, nh, nr, nz, & kdefl REAL(r8_) :: v(3) REAL(r8_) :: DLAMCH @@ -4570,7 +4595,7 @@ SUBROUTINE DLAHQR(wantt, wantz, n, ilo, ihi, h, ldh, wr, wi, iloz, & h21s = h(m+1, m) s = ABS(h(m,m)-rt2r) + ABS(rt2i) + ABS(h21s) h21s = h(m+1, m)/s - v(1) = h21s*h(m, m+1) + (h(m,m)-rt1r)*((h(m, m)-rt2r)/s) - & + v(1) = h21s*h(m, m+1) + (h(m,m)-rt1r)*((h(m, m)-rt2r)/s) - & rt1i*(rt2i/s) v(2) = h21s*(h(m,m)+h(m+1,m+1)-rt1r-rt2r) v(3) = h21s*h(m+2, m+1) @@ -4579,7 +4604,7 @@ SUBROUTINE DLAHQR(wantt, wantz, n, ilo, ihi, h, ldh, wr, wi, iloz, & v(2) = v(2)/s v(3) = v(3)/s IF (m==l) GO TO 60 - IF (ABS(h(m,m-1))*(ABS(v(2))+ABS(v(3)))<=ulp*ABS(v(1))*(ABS( & + IF (ABS(h(m,m-1))*(ABS(v(2))+ABS(v(3)))<=ulp*ABS(v(1))*(ABS( & h(m-1,m-1))+ABS(h(m,m))+ABS(h(m+1,m+1)))) GO TO 60 END DO 60 CONTINUE @@ -4647,10 +4672,10 @@ SUBROUTINE DLAHQR(wantt, wantz, n, ilo, ihi, h, ldh, wr, wi, iloz, & wr(i) = h(i, i) wi(i) = zero ELSE IF (l==i-1) THEN - CALL DLANV2(h(i-1,i-1), h(i-1,i), h(i,i-1), h(i,i), wr(i-1), & + CALL DLANV2(h(i-1,i-1), h(i-1,i), h(i,i-1), h(i,i), wr(i-1), & wi(i-1), wr(i), wi(i), cs, sn) IF (wantt) THEN - IF (i2>i) CALL DROT(i2-i, h(i-1,i+1), ldh, h(i,i+1), ldh, cs, & + IF (i2>i) CALL DROT(i2-i, h(i-1,i+1), ldh, h(i,i+1), ldh, cs, & sn) CALL DROT(i-i1-1, h(i1,i-1), 1_ip_, h(i1,i), 1_ip_, cs, sn) END IF @@ -4673,50 +4698,51 @@ SUBROUTINE DLAHR2(n, k, nb, a, lda, tau, t, ldt, y, ldy) PARAMETER (zero=0.0_r8_, one=1.0_r8_) INTEGER(ip_) :: i REAL(r8_) :: ei - EXTERNAL :: DAXPY, DCOPY, DGEMM, DGEMV, DLACPY, & + EXTERNAL :: DAXPY, DCOPY, DGEMM, DGEMV, DLACPY, & DLARFG, DSCAL, DTRMM, DTRMV INTRINSIC :: MIN IF (n<=1) RETURN DO i = 1, nb IF (i>1) THEN - CALL DGEMV('NO TRANSPOSE', n-k, i-1, -one, y(k+1,1), ldy, & + CALL DGEMV('NO TRANSPOSE', n-k, i-1, -one, y(k+1,1), ldy, & a(k+i-1,1), lda, one, a(k+1,i), 1_ip_) CALL DCOPY(i-1, a(k+1,i), 1_ip_, t(1,nb), 1_ip_) - CALL DTRMV('Lower', 'Transpose', 'UNIT', i-1, a(k+1,1), lda, & + CALL DTRMV('Lower', 'Transpose', 'UNIT', i-1, a(k+1,1), lda, & t(1,nb), 1_ip_) - CALL DGEMV('Transpose', n-k-i+1, i-1, one, a(k+i,1), lda, & + CALL DGEMV('Transpose', n-k-i+1, i-1, one, a(k+i,1), lda, & a(k+i,i), 1_ip_, one, t(1,nb), 1_ip_) - CALL DTRMV('Upper', 'Transpose', 'NON-UNIT', i-1, t, ldt, t(1, & - nb), 1_ip_) - CALL DGEMV('NO TRANSPOSE', n-k-i+1, i-1, -one, a(k+i,1), lda, & + CALL DTRMV('Upper', 'Transpose', 'NON-UNIT', i-1, t, ldt, & + t(1,nb), 1_ip_) + CALL DGEMV('NO TRANSPOSE', n-k-i+1, i-1, -one, a(k+i,1), lda, & t(1,nb), 1_ip_, one, a(k+i,i), 1_ip_) - CALL DTRMV('Lower', 'NO TRANSPOSE', 'UNIT', i-1, a(k+1,1), & + CALL DTRMV('Lower', 'NO TRANSPOSE', 'UNIT', i-1, a(k+1,1), & lda, t(1,nb), 1_ip_) CALL DAXPY(i-1, -one, t(1,nb), 1_ip_, a(k+1,i), 1_ip_) a(k+i-1, i-1) = ei END IF - CALL DLARFG(n-k-i+1, a(k+i,i), a(MIN(k+i+1,n),i), 1_ip_, tau(i)) + CALL DLARFG(n-k-i+1, a(k+i,i), a(MIN(k+i+1,n),i), 1_ip_, & + tau(i)) ei = a(k+i, i) a(k+i, i) = one - CALL DGEMV('NO TRANSPOSE', n-k, n-k-i+1, one, a(k+1,i+1), lda, & + CALL DGEMV('NO TRANSPOSE', n-k, n-k-i+1, one, a(k+1,i+1), lda, & a(k+i,i), 1_ip_, zero, y(k+1,i), 1_ip_) - CALL DGEMV('Transpose', n-k-i+1, i-1, one, a(k+i,1), lda, a(k+i, & - i), 1_ip_, zero, t(1,i), 1_ip_) - CALL DGEMV('NO TRANSPOSE', n-k, i-1, -one, y(k+1,1), ldy, t(1, & + CALL DGEMV('Transpose', n-k-i+1, i-1, one, a(k+i,1), lda, & + a(k+i,i), 1_ip_, zero, t(1,i), 1_ip_) + CALL DGEMV('NO TRANSPOSE', n-k, i-1, -one, y(k+1,1), ldy, t(1, & i), 1_ip_, one, y(k+1,i), 1_ip_) CALL DSCAL(n-k, tau(i), y(k+1,i), 1_ip_) CALL DSCAL(i-1, -tau(i), t(1,i), 1_ip_) - CALL DTRMV('Upper', 'No Transpose', 'NON-UNIT', i-1, t, ldt, & + CALL DTRMV('Upper', 'No Transpose', 'NON-UNIT', i-1, t, ldt, & t(1,i), 1_ip_) t(i, i) = tau(i) END DO a(k+nb, nb) = ei CALL DLACPY('ALL', k, nb, a(1,2), lda, y, ldy) - CALL DTRMM('RIGHT', 'Lower', 'NO TRANSPOSE', 'UNIT', k, nb, one, & + CALL DTRMM('RIGHT', 'Lower', 'NO TRANSPOSE', 'UNIT', k, nb, one, & a(k+1,1), lda, y, ldy) - IF (n>k+nb) CALL DGEMM('NO TRANSPOSE', 'NO TRANSPOSE', k, nb, & + IF (n>k+nb) CALL DGEMM('NO TRANSPOSE', 'NO TRANSPOSE', k, nb, & n-k-nb, one, a(1,2+nb), lda, a(k+1+nb,1), lda, one, y, ldy) - CALL DTRMM('RIGHT', 'Upper', 'NO TRANSPOSE', 'NON-UNIT', k, nb, & + CALL DTRMM('RIGHT', 'Upper', 'NO TRANSPOSE', 'NON-UNIT', k, nb, & one, t, ldt, y, ldy) RETURN END SUBROUTINE @@ -4730,8 +4756,8 @@ SUBROUTINE DLAIC1(job, j, x, sest, w, gamma, sestpr, s, c) PARAMETER (zero=0.0_r8_, one=1.0_r8_, two=2.0_r8_) REAL(r8_) :: half, four PARAMETER (half=0.5_r8_, four=4.0_r8_) - REAL(r8_) :: absalp, absest, absgam, alpha, b, cosine, eps, norma, & - s1, s2, sine, t, test, tmp, zeta1, zeta2 + REAL(r8_) :: absalp, absest, absgam, alpha, b, cosine, eps, & + norma, s1, s2, sine, t, test, tmp, zeta1, zeta2 INTRINSIC :: ABS, MAX, SIGN, SQRT REAL(r8_) :: DDOT, DLAMCH EXTERNAL :: DDOT, DLAMCH @@ -4867,7 +4893,7 @@ SUBROUTINE DLAIC1(job, j, x, sest, w, gamma, sestpr, s, c) ELSE zeta1 = alpha/absest zeta2 = gamma/absest - norma = MAX(one+zeta1*zeta1+ABS(zeta1*zeta2), & + norma = MAX(one+zeta1*zeta1+ABS(zeta1*zeta2), & ABS(zeta1*zeta2)+zeta2*zeta2) test = one + two*(zeta1-zeta2)*(zeta1+zeta2) IF (test>=zero) THEN @@ -4905,21 +4931,21 @@ LOGICAL FUNCTION DLAISNAN(din1, din2) RETURN END FUNCTION - SUBROUTINE DLALS0(icompq, nl, nr, sqre, nrhs, b, ldb, bx, ldbx, & - perm, givptr, givcol, ldgcol, givnum, ldgnum, poles, difl, difr, z, & + SUBROUTINE DLALS0(icompq, nl, nr, sqre, nrhs, b, ldb, bx, ldbx, & + perm, givptr, givcol, ldgcol, givnum, ldgnum, poles, difl, difr, z,& k, c, s, work, info) USE GALAHAD_KINDS - INTEGER(ip_) :: givptr, icompq, info, k, ldb, ldbx, ldgcol, & + INTEGER(ip_) :: givptr, icompq, info, k, ldb, ldbx, ldgcol, & ldgnum, nl, nr, nrhs, sqre REAL(r8_) :: c, s INTEGER(ip_) :: givcol(ldgcol, *), perm(*) - REAL(r8_) :: b(ldb, *), bx(ldbx, *), difl(*), difr(ldgnum, *), & + REAL(r8_) :: b(ldb, *), bx(ldbx, *), difl(*), difr(ldgnum, *), & givnum(ldgnum, *), poles(ldgnum, *), work(*), z(*) REAL(r8_) :: one, zero, negone PARAMETER (one=1.0_r8_, zero=0.0_r8_, negone=-1.0_r8_) INTEGER(ip_) :: i, j, m, n, nlp1 REAL(r8_) :: diflj, difrj, dj, dsigj, dsigjp, temp - EXTERNAL :: DCOPY, DGEMV, DLACPY, DLASCL, DROT, & + EXTERNAL :: DCOPY, DGEMV, DLACPY, DLASCL, DROT, & DSCAL, XERBLA REAL(r8_) :: DLAMC3, DNRM2 EXTERNAL :: DLAMC3, DNRM2 @@ -4957,7 +4983,7 @@ SUBROUTINE DLALS0(icompq, nl, nr, sqre, nrhs, b, ldb, bx, ldbx, & nlp1 = nl + 1 IF (icompq==0) THEN DO i = 1, givptr - CALL DROT(nrhs, b(givcol(i,2),1), ldb, b(givcol(i, 1_ip_),1), & + CALL DROT(nrhs, b(givcol(i,2),1), ldb, b(givcol(i, 1_ip_),1), & ldb, givnum(i,2), givnum(i,1)) END DO CALL DCOPY(nrhs, b(nlp1,1), ldb, bx(1,1), ldbx) @@ -4987,7 +5013,7 @@ SUBROUTINE DLALS0(icompq, nl, nr, sqre, nrhs, b, ldb, bx, ldbx, & IF ((z(i)==zero) .OR. (poles(i,2)==zero)) THEN work(i) = zero ELSE - work(i) = poles(i, 2_ip_)*z(i)/(DLAMC3(poles(i, 2_ip_), & + work(i) = poles(i, 2_ip_)*z(i)/(DLAMC3(poles(i, 2_ip_), & dsigj)-diflj)/(poles(i,2)+dj) END IF END DO @@ -4995,19 +5021,19 @@ SUBROUTINE DLALS0(icompq, nl, nr, sqre, nrhs, b, ldb, bx, ldbx, & IF ((z(i)==zero) .OR. (poles(i,2)==zero)) THEN work(i) = zero ELSE - work(i) = poles(i, 2_ip_)*z(i)/(DLAMC3(poles(i, 2_ip_), & + work(i) = poles(i, 2_ip_)*z(i)/(DLAMC3(poles(i, 2_ip_), & dsigjp)+difrj)/(poles(i,2)+dj) END IF END DO work(1) = negone temp = DNRM2(k, work, 1_ip_) - CALL DGEMV('T', k, nrhs, one, bx, ldbx, work, 1_ip_, zero, & + CALL DGEMV('T', k, nrhs, one, bx, ldbx, work, 1_ip_, zero, & b(j,1), ldb) - CALL DLASCL('G', 0_ip_, 0_ip_, temp, one, 1_ip_, nrhs, b(j, & + CALL DLASCL('G', 0_ip_, 0_ip_, temp, one, 1_ip_, nrhs, b(j, & 1), ldb, info) END DO END IF - IF (k1) THEN - CALL DGEMV('No transpose', m-rk+1, k-1, -one, a(rk,1), lda, & + CALL DGEMV('No transpose', m-rk+1, k-1, -one, a(rk,1), lda, & f(k,1), ldf, one, a(rk,k), 1_ip_) END IF IF (rk1) THEN - CALL DGEMV('Transpose', m-rk+1, k-1, -tau(k), a(rk,1), lda, & + CALL DGEMV('Transpose', m-rk+1, k-1, -tau(k), a(rk,1), lda, & a(rk,k), 1_ip_, zero, auxv(1), 1_ip_) - CALL DGEMV('No transpose', n, k-1, one, f(1,1), ldf, auxv(1), & + CALL DGEMV('No transpose', n, k-1, one, f(1,1), ldf, auxv(1), & 1_ip_, one, f(1,k), 1_ip_) END IF IF (kABS(h(kwtop-1, kwtop-2))) nw = & + IF (ABS(h(kwtop,kwtop-1))>ABS(h(kwtop-1, kwtop-2))) nw = & nw + 1 END IF END IF @@ -6187,12 +6219,12 @@ SUBROUTINE DLAQR0(wantt, wantz, n, ilo, ihi, h, ldh, wr, wi, iloz, & nho = (n-nw-1) - kt + 1 kwv = nw + 2 nve = (n-nw) - kwv + 1 - CALL DLAQR3(wantt, wantz, n, ktop, kbot, nw, h, ldh, iloz, & - ihiz, z, ldz, ls, ld, wr, wi, h(kv,1), ldh, nho, h(kv,kt), & + CALL DLAQR3(wantt, wantz, n, ktop, kbot, nw, h, ldh, iloz, & + ihiz, z, ldz, ls, ld, wr, wi, h(kv,1), ldh, nho, h(kv,kt), & ldh, nve, h(kwv,1), ldh, work, lwork) kbot = kbot - ld ks = kbot - ls + 1 - IF ((ld==0) .OR. ((100*ld<=nw*nibble) .AND. (kbot-ktop+1> & + IF ((ld==0) .OR. ((100*ld<=nw*nibble) .AND. (kbot-ktop+1> & MIN(nmin,nwmax)))) THEN ns = MIN(nsmax, nsr, MAX(2,kbot-ktop)) ns = ns - MOD(ns, 2_ip_) @@ -6204,7 +6236,7 @@ SUBROUTINE DLAQR0(wantt, wantz, n, ilo, ihi, h, ldh, wr, wi, iloz, & bb = ss cc = wilk2*ss dd = aa - CALL DLANV2(aa, bb, cc, dd, wr(i-1), wi(i-1), wr(i), & + CALL DLANV2(aa, bb, cc, dd, wr(i-1), wi(i-1), wr(i), & wi(i), cs, sn) END DO IF (ks==ktop) THEN @@ -6219,11 +6251,11 @@ SUBROUTINE DLAQR0(wantt, wantz, n, ilo, ihi, h, ldh, wr, wi, iloz, & kt = n - ns + 1 CALL DLACPY('A', ns, ns, h(ks,ks), ldh, h(kt,1), ldh) IF (ns>nmin) THEN - CALL DLAQR4(.FALSE., .FALSE., ns, 1_ip_, ns, h(kt,1), & - ldh, wr(ks), wi(ks), 1_ip_, 1_ip_, zdum, 1_ip_, work, & + CALL DLAQR4(.FALSE., .FALSE., ns, 1_ip_, ns, h(kt,1), & + ldh, wr(ks), wi(ks), 1_ip_, 1_ip_, zdum, 1_ip_, work,& lwork, inf) ELSE - CALL DLAHQR(.FALSE., .FALSE., ns, 1_ip_, ns, h(kt,1), & + CALL DLAHQR(.FALSE., .FALSE., ns, 1_ip_, ns, h(kt,1), & ldh, wr(ks), wi(ks), 1_ip_, 1_ip_, zdum, 1_ip_, inf) END IF ks = ks + inf @@ -6232,7 +6264,7 @@ SUBROUTINE DLAQR0(wantt, wantz, n, ilo, ihi, h, ldh, wr, wi, iloz, & cc = h(kbot, kbot-1) bb = h(kbot-1, kbot) dd = h(kbot, kbot) - CALL DLANV2(aa, bb, cc, dd, wr(kbot-1), wi(kbot-1), & + CALL DLANV2(aa, bb, cc, dd, wr(kbot-1), wi(kbot-1), & wr(kbot), wi(kbot), cs, sn) ks = kbot - 1 END IF @@ -6243,7 +6275,7 @@ SUBROUTINE DLAQR0(wantt, wantz, n, ilo, ihi, h, ldh, wr, wi, iloz, & IF (sorted) GO TO 60 sorted = .TRUE. DO i = ks, k - 1 - IF (ABS(wr(i))+ABS(wi(i))0) THEN ndfl = 1 @@ -6324,7 +6356,7 @@ SUBROUTINE DLAQR1(n, h, ldh, sr1, si1, sr2, si2, v) v(2) = zero ELSE h21s = h( 2_ip_, 1_ip_)/s - v(1) = h21s*h(1, 2_ip_) + (h(1,1)-sr1)*((h(1, 1_ip_)-sr2)/s) & + v(1) = h21s*h(1, 2_ip_) + (h(1,1)-sr1)*((h(1, 1_ip_)-sr2)/s) & - si1*(si2/s) v(2) = h21s*(h(1,1)+h(2,2)-sr1-sr2) END IF @@ -6337,7 +6369,7 @@ SUBROUTINE DLAQR1(n, h, ldh, sr1, si1, sr2, si2, v) ELSE h21s = h( 2_ip_, 1_ip_)/s h31s = h( 3_ip_, 1_ip_)/s - v(1) = (h(1,1)-sr1)*((h(1,1)-sr2)/s) - si1*(si2/s) + h(1, & + v(1) = (h(1,1)-sr1)*((h(1,1)-sr2)/s) - si1*(si2/s) + h(1, & 2_ip_) *h21s + h(1, 3_ip_)*h31s v(2) = h21s*(h(1,1)+h(2,2)-sr1-sr2) + h( 2_ip_, 3_ip_)*h31s v(3) = h31s*(h(1,1)+h(3,3)-sr1-sr2) + h21s*h( 3_ip_, 2_ip_) @@ -6345,26 +6377,26 @@ SUBROUTINE DLAQR1(n, h, ldh, sr1, si1, sr2, si2, v) END IF END SUBROUTINE - SUBROUTINE DLAQR2(wantt, wantz, n, ktop, kbot, nw, h, ldh, iloz, & - ihiz, z, ldz, ns, nd, sr, si, v, ldv, nh, t, ldt, nv, wv, ldwv, & + SUBROUTINE DLAQR2(wantt, wantz, n, ktop, kbot, nw, h, ldh, iloz, & + ihiz, z, ldz, ns, nd, sr, si, v, ldv, nh, t, ldt, nv, wv, ldwv, & work, lwork) USE GALAHAD_KINDS - INTEGER(ip_) :: ihiz, iloz, kbot, ktop, ldh, ldt, ldv, ldwv, ldz, & + INTEGER(ip_) :: ihiz, iloz, kbot, ktop, ldh, ldt, ldv, ldwv, ldz, & lwork, n, nd, nh, ns, nv, nw LOGICAL :: wantt, wantz - REAL(r8_) :: h(ldh, *), si(*), sr(*), t(ldt, *), v(ldv, *), & + REAL(r8_) :: h(ldh, *), si(*), sr(*), t(ldt, *), v(ldv, *), & work(*), wv(ldwv, *), z(ldz, *) REAL(r8_) :: zero, one PARAMETER (zero=0.0_r8_, one=1.0_r8_) - REAL(r8_) :: aa, bb, beta, cc, cs, dd, evi, evk, foo, s, safmax, & + REAL(r8_) :: aa, bb, beta, cc, cs, dd, evi, evk, foo, s, safmax, & safmin, smlnum, sn, tau, ulp - INTEGER(ip_) :: i, ifst, ilst, info, infqr, j, jw, k, kcol, kend, & + INTEGER(ip_) :: i, ifst, ilst, info, infqr, j, jw, k, kcol, kend, & kln, krow, kwtop, ltop, lwk1, lwk2, lwkopt LOGICAL :: bulge, sorted REAL(r8_) :: DLAMCH EXTERNAL :: DLAMCH - EXTERNAL :: DCOPY, DGEHRD, DGEMM, DLABAD, DLACPY, & - DLAHQR, DLANV2, DLARF, DLARFG, DLASET, DORMHR, & + EXTERNAL :: DCOPY, DGEHRD, DGEMM, DLABAD, DLACPY, & + DLAHQR, DLANV2, DLARF, DLARFG, DLASET, DORMHR, & DTREXC INTRINSIC :: ABS, DBLE, INT, MAX, MIN, SQRT jw = MIN(nw, kbot-ktop+1) @@ -6373,8 +6405,8 @@ SUBROUTINE DLAQR2(wantt, wantz, n, ktop, kbot, nw, h, ldh, iloz, & ELSE CALL DGEHRD(jw, 1_ip_, jw-1, t, ldt, work, work, -1_ip_, info) lwk1 = INT(work(1)) - CALL DORMHR('R', 'N', jw, jw, 1_ip_, jw-1, t, ldt, work, v, ldv, & - work, -1_ip_, info) + CALL DORMHR('R', 'N', jw, jw, 1_ip_, jw-1, t, ldt, work, v, & + ldv, work, -1_ip_, info) lwk2 = INT(work(1)) lwkopt = jw + MAX(lwk1, lwk2) END IF @@ -6415,7 +6447,7 @@ SUBROUTINE DLAQR2(wantt, wantz, n, ktop, kbot, nw, h, ldh, iloz, & CALL DLACPY('U', jw, jw, h(kwtop,kwtop), ldh, t, ldt) CALL DCOPY(jw-1, h(kwtop+1,kwtop), ldh+1, t(2,1), ldt+1) CALL DLASET('A', jw, jw, zero, one, v, ldv) - CALL DLAHQR(.TRUE., .TRUE., jw, 1_ip_, jw, t, ldt, sr(kwtop), & + CALL DLAHQR(.TRUE., .TRUE., jw, 1_ip_, jw, t, ldt, sr(kwtop), & si(kwtop), 1_ip_, jw, v, ldv, infqr) DO j = 1, jw - 3 t(j+2, j) = zero @@ -6438,19 +6470,21 @@ SUBROUTINE DLAQR2(wantt, wantz, n, ktop, kbot, nw, h, ldh, iloz, & ns = ns - 1 ELSE ifst = ns - CALL DTREXC('V', jw, t, ldt, v, ldv, ifst, ilst, work, info) + CALL DTREXC('V', jw, t, ldt, v, ldv, ifst, ilst, work, & + info) ilst = ilst + 1 END IF ELSE - foo = ABS(t(ns,ns)) + SQRT(ABS(t(ns,ns-1)))*SQRT(ABS(t(ns-1, & + foo = ABS(t(ns,ns)) + SQRT(ABS(t(ns,ns-1)))*SQRT(ABS(t(ns-1, & ns))) IF (foo==zero) foo = ABS(s) - IF (MAX(ABS(s*v(1,ns)),ABS(s*v(1,ns-1)))<=MAX(smlnum,ulp*foo & + IF (MAX(ABS(s*v(1,ns)),ABS(s*v(1,ns-1)))<=MAX(smlnum,ulp*foo & )) THEN ns = ns - 2 ELSE ifst = ns - CALL DTREXC('V', jw, t, ldt, v, ldv, ifst, ilst, work, info) + CALL DTREXC('V', jw, t, ldt, v, ldv, ifst, ilst, work, & + info) ilst = ilst + 2 END IF END IF @@ -6477,14 +6511,16 @@ SUBROUTINE DLAQR2(wantt, wantz, n, ktop, kbot, nw, h, ldh, iloz, & IF (k==i+1) THEN evi = ABS(t(i,i)) ELSE - evi = ABS(t(i,i)) + SQRT(ABS(t(i+1,i)))*SQRT(ABS(t(i, i+1))) + evi = ABS(t(i,i)) + SQRT(ABS(t(i+1,i)))*SQRT(ABS(t(i, & + i+1))) END IF IF (k==kend) THEN evk = ABS(t(k,k)) ELSE IF (t(k+1,k)==zero) THEN evk = ABS(t(k,k)) ELSE - evk = ABS(t(k,k)) + SQRT(ABS(t(k+1,k)))*SQRT(ABS(t(k, k+1))) + evk = ABS(t(k,k)) + SQRT(ABS(t(k+1,k)))*SQRT(ABS(t(k, & + k+1))) END IF IF (evi>=evk) THEN i = k @@ -6492,7 +6528,8 @@ SUBROUTINE DLAQR2(wantt, wantz, n, ktop, kbot, nw, h, ldh, iloz, & sorted = .FALSE. ifst = i ilst = k - CALL DTREXC('V', jw, t, ldt, v, ldv, ifst, ilst, work, info) + CALL DTREXC('V', jw, t, ldt, v, ldv, ifst, ilst, work, & + info) IF (info==0) THEN i = ilst ELSE @@ -6527,7 +6564,7 @@ SUBROUTINE DLAQR2(wantt, wantz, n, ktop, kbot, nw, h, ldh, iloz, & cc = t(i, i-1) bb = t(i-1, i) dd = t(i, i) - CALL DLANV2(aa, bb, cc, dd, sr(kwtop+i-2), si(kwtop+i-2), & + CALL DLANV2(aa, bb, cc, dd, sr(kwtop+i-2), si(kwtop+i-2), & sr(kwtop+i-1), si(kwtop+i-1), cs, sn) i = i - 2 END IF @@ -6543,14 +6580,14 @@ SUBROUTINE DLAQR2(wantt, wantz, n, ktop, kbot, nw, h, ldh, iloz, & CALL DLARF('L', ns, jw, work, 1_ip_, tau, t, ldt, work(jw+1)) CALL DLARF('R', ns, ns, work, 1_ip_, tau, t, ldt, work(jw+1)) CALL DLARF('R', jw, ns, work, 1_ip_, tau, v, ldv, work(jw+1)) - CALL DGEHRD(jw, 1_ip_, ns, t, ldt, work, work(jw+1), lwork-jw, & - info) + CALL DGEHRD(jw, 1_ip_, ns, t, ldt, work, work(jw+1), & + lwork-jw, info) END IF IF (kwtop>1) h(kwtop, kwtop-1) = s*v(1, 1_ip_) CALL DLACPY('U', jw, jw, t, ldt, h(kwtop,kwtop), ldh) CALL DCOPY(jw-1, t(2,1), ldt+1, h(kwtop+1,kwtop), ldh+1) - IF (ns>1 .AND. s/=zero) CALL DORMHR('R', 'N', jw, ns, 1_ip_, ns, & - t, ldt, work, v, ldv, work(jw+1), lwork-jw, info) + IF (ns>1 .AND. s/=zero) CALL DORMHR('R', 'N', jw, ns, 1_ip_, & + ns, t, ldt, work, v, ldv, work(jw+1), lwork-jw, info) IF (wantt) THEN ltop = 1 ELSE @@ -6558,14 +6595,14 @@ SUBROUTINE DLAQR2(wantt, wantz, n, ktop, kbot, nw, h, ldh, iloz, & END IF DO krow = ltop, kwtop - 1, nv kln = MIN(nv, kwtop-krow) - CALL DGEMM('N', 'N', kln, jw, jw, one, h(krow,kwtop), ldh, v, & + CALL DGEMM('N', 'N', kln, jw, jw, one, h(krow,kwtop), ldh, v, & ldv, zero, wv, ldwv) CALL DLACPY('A', kln, jw, wv, ldwv, h(krow,kwtop), ldh) END DO IF (wantt) THEN DO kcol = kbot + 1, n, nh kln = MIN(nh, n-kcol+1) - CALL DGEMM('C', 'N', jw, kln, jw, one, v, ldv, h(kwtop, & + CALL DGEMM('C', 'N', jw, kln, jw, one, v, ldv, h(kwtop, & kcol), ldh, zero, t, ldt) CALL DLACPY('A', jw, kln, t, ldt, h(kwtop,kcol), ldh) END DO @@ -6573,7 +6610,7 @@ SUBROUTINE DLAQR2(wantt, wantz, n, ktop, kbot, nw, h, ldh, iloz, & IF (wantz) THEN DO krow = iloz, ihiz, nv kln = MIN(nv, ihiz-krow+1) - CALL DGEMM('N', 'N', kln, jw, jw, one, z(krow,kwtop), ldz, & + CALL DGEMM('N', 'N', kln, jw, jw, one, z(krow,kwtop), ldz, & v, ldv, zero, wv, ldwv) CALL DLACPY('A', kln, jw, wv, ldwv, z(krow,kwtop), ldz) END DO @@ -6584,27 +6621,27 @@ SUBROUTINE DLAQR2(wantt, wantz, n, ktop, kbot, nw, h, ldh, iloz, & work(1) = DBLE(lwkopt) END SUBROUTINE - SUBROUTINE DLAQR3(wantt, wantz, n, ktop, kbot, nw, h, ldh, iloz, & - ihiz, z, ldz, ns, nd, sr, si, v, ldv, nh, t, ldt, nv, wv, ldwv, & + SUBROUTINE DLAQR3(wantt, wantz, n, ktop, kbot, nw, h, ldh, iloz, & + ihiz, z, ldz, ns, nd, sr, si, v, ldv, nh, t, ldt, nv, wv, ldwv, & work, lwork) USE GALAHAD_KINDS - INTEGER(ip_) :: ihiz, iloz, kbot, ktop, ldh, ldt, ldv, ldwv, ldz, & + INTEGER(ip_) :: ihiz, iloz, kbot, ktop, ldh, ldt, ldv, ldwv, ldz, & lwork, n, nd, nh, ns, nv, nw LOGICAL :: wantt, wantz - REAL(r8_) :: h(ldh, *), si(*), sr(*), t(ldt, *), v(ldv, *), & + REAL(r8_) :: h(ldh, *), si(*), sr(*), t(ldt, *), v(ldv, *), & work(*), wv(ldwv, *), z(ldz, *) REAL(r8_) :: zero, one PARAMETER (zero=0.0_r8_, one=1.0_r8_) - REAL(r8_) :: aa, bb, beta, cc, cs, dd, evi, evk, foo, s, safmax, & + REAL(r8_) :: aa, bb, beta, cc, cs, dd, evi, evk, foo, s, safmax, & safmin, smlnum, sn, tau, ulp - INTEGER(ip_) :: i, ifst, ilst, info, infqr, j, jw, k, kcol, kend, & + INTEGER(ip_) :: i, ifst, ilst, info, infqr, j, jw, k, kcol, kend, & kln, krow, kwtop, ltop, lwk1, lwk2, lwk3, lwkopt, nmin LOGICAL :: bulge, sorted REAL(r8_) :: DLAMCH INTEGER(ip_) :: ILAENV EXTERNAL :: DLAMCH, ILAENV - EXTERNAL :: DCOPY, DGEHRD, DGEMM, DLABAD, DLACPY, & - DLAHQR, DLANV2, DLAQR4, DLARF, DLARFG, DLASET, & + EXTERNAL :: DCOPY, DGEHRD, DGEMM, DLABAD, DLACPY, & + DLAHQR, DLANV2, DLAQR4, DLARF, DLARFG, DLASET, & DORMHR, DTREXC INTRINSIC :: ABS, DBLE, INT, MAX, MIN, SQRT jw = MIN(nw, kbot-ktop+1) @@ -6613,10 +6650,10 @@ SUBROUTINE DLAQR3(wantt, wantz, n, ktop, kbot, nw, h, ldh, iloz, & ELSE CALL DGEHRD(jw, 1_ip_, jw-1, t, ldt, work, work, -1_ip_, info) lwk1 = INT(work(1)) - CALL DORMHR('R', 'N', jw, jw, 1_ip_, jw-1, t, ldt, work, v, ldv, & - work, -1_ip_, info) + CALL DORMHR('R', 'N', jw, jw, 1_ip_, jw-1, t, ldt, work, v, & + ldv, work, -1_ip_, info) lwk2 = INT(work(1)) - CALL DLAQR4(.TRUE., .TRUE., jw, 1_ip_, jw, t, ldt, sr, si, & + CALL DLAQR4(.TRUE., .TRUE., jw, 1_ip_, jw, t, ldt, sr, si, & 1_ip_, jw, v, ldv, work, -1_ip_, infqr) lwk3 = INT(work(1)) lwkopt = MAX(jw+MAX(lwk1,lwk2), lwk3) @@ -6660,10 +6697,10 @@ SUBROUTINE DLAQR3(wantt, wantz, n, ktop, kbot, nw, h, ldh, iloz, & CALL DLASET('A', jw, jw, zero, one, v, ldv) nmin = ILAENV(12_ip_, 'DLAQR3', 'SV', jw, 1_ip_, jw, lwork) IF (jw>nmin) THEN - CALL DLAQR4(.TRUE., .TRUE., jw, 1_ip_, jw, t, ldt, sr(kwtop), & + CALL DLAQR4(.TRUE., .TRUE., jw, 1_ip_, jw, t, ldt, sr(kwtop), & si(kwtop), 1_ip_, jw, v, ldv, work, lwork, infqr) ELSE - CALL DLAHQR(.TRUE., .TRUE., jw, 1_ip_, jw, t, ldt, sr(kwtop), & + CALL DLAHQR(.TRUE., .TRUE., jw, 1_ip_, jw, t, ldt, sr(kwtop), & si(kwtop), 1_ip_, jw, v, ldv, infqr) END IF DO j = 1, jw - 3 @@ -6687,19 +6724,21 @@ SUBROUTINE DLAQR3(wantt, wantz, n, ktop, kbot, nw, h, ldh, iloz, & ns = ns - 1 ELSE ifst = ns - CALL DTREXC('V', jw, t, ldt, v, ldv, ifst, ilst, work, info) + CALL DTREXC('V', jw, t, ldt, v, ldv, ifst, ilst, work, & + info) ilst = ilst + 1 END IF ELSE - foo = ABS(t(ns,ns)) + SQRT(ABS(t(ns,ns-1)))*SQRT(ABS(t(ns-1, & + foo = ABS(t(ns,ns)) + SQRT(ABS(t(ns,ns-1)))*SQRT(ABS(t(ns-1, & ns))) IF (foo==zero) foo = ABS(s) - IF (MAX(ABS(s*v(1,ns)),ABS(s*v(1,ns-1)))<=MAX(smlnum,ulp*foo & + IF (MAX(ABS(s*v(1,ns)),ABS(s*v(1,ns-1)))<=MAX(smlnum,ulp*foo & )) THEN ns = ns - 2 ELSE ifst = ns - CALL DTREXC('V', jw, t, ldt, v, ldv, ifst, ilst, work, info) + CALL DTREXC('V', jw, t, ldt, v, ldv, ifst, ilst, work, & + info) ilst = ilst + 2 END IF END IF @@ -6726,14 +6765,16 @@ SUBROUTINE DLAQR3(wantt, wantz, n, ktop, kbot, nw, h, ldh, iloz, & IF (k==i+1) THEN evi = ABS(t(i,i)) ELSE - evi = ABS(t(i,i)) + SQRT(ABS(t(i+1,i)))*SQRT(ABS(t(i, i+1))) + evi = ABS(t(i,i)) + SQRT(ABS(t(i+1,i)))*SQRT(ABS(t(i, & + i+1))) END IF IF (k==kend) THEN evk = ABS(t(k,k)) ELSE IF (t(k+1,k)==zero) THEN evk = ABS(t(k,k)) ELSE - evk = ABS(t(k,k)) + SQRT(ABS(t(k+1,k)))*SQRT(ABS(t(k, k+1))) + evk = ABS(t(k,k)) + SQRT(ABS(t(k+1,k)))*SQRT(ABS(t(k, & + k+1))) END IF IF (evi>=evk) THEN i = k @@ -6741,7 +6782,8 @@ SUBROUTINE DLAQR3(wantt, wantz, n, ktop, kbot, nw, h, ldh, iloz, & sorted = .FALSE. ifst = i ilst = k - CALL DTREXC('V', jw, t, ldt, v, ldv, ifst, ilst, work, info) + CALL DTREXC('V', jw, t, ldt, v, ldv, ifst, ilst, work, & + info) IF (info==0) THEN i = ilst ELSE @@ -6776,7 +6818,7 @@ SUBROUTINE DLAQR3(wantt, wantz, n, ktop, kbot, nw, h, ldh, iloz, & cc = t(i, i-1) bb = t(i-1, i) dd = t(i, i) - CALL DLANV2(aa, bb, cc, dd, sr(kwtop+i-2), si(kwtop+i-2), & + CALL DLANV2(aa, bb, cc, dd, sr(kwtop+i-2), si(kwtop+i-2), & sr(kwtop+i-1), si(kwtop+i-1), cs, sn) i = i - 2 END IF @@ -6792,14 +6834,14 @@ SUBROUTINE DLAQR3(wantt, wantz, n, ktop, kbot, nw, h, ldh, iloz, & CALL DLARF('L', ns, jw, work, 1_ip_, tau, t, ldt, work(jw+1)) CALL DLARF('R', ns, ns, work, 1_ip_, tau, t, ldt, work(jw+1)) CALL DLARF('R', jw, ns, work, 1_ip_, tau, v, ldv, work(jw+1)) - CALL DGEHRD(jw, 1_ip_, ns, t, ldt, work, work(jw+1), lwork-jw, & - info) + CALL DGEHRD(jw, 1_ip_, ns, t, ldt, work, work(jw+1), & + lwork-jw, info) END IF IF (kwtop>1) h(kwtop, kwtop-1) = s*v(1, 1_ip_) CALL DLACPY('U', jw, jw, t, ldt, h(kwtop,kwtop), ldh) CALL DCOPY(jw-1, t(2,1), ldt+1, h(kwtop+1,kwtop), ldh+1) - IF (ns>1 .AND. s/=zero) CALL DORMHR('R', 'N', jw, ns, 1_ip_, ns, & - t, ldt, work, v, ldv, work(jw+1), lwork-jw, info) + IF (ns>1 .AND. s/=zero) CALL DORMHR('R', 'N', jw, ns, 1_ip_, & + ns, t, ldt, work, v, ldv, work(jw+1), lwork-jw, info) IF (wantt) THEN ltop = 1 ELSE @@ -6807,14 +6849,14 @@ SUBROUTINE DLAQR3(wantt, wantz, n, ktop, kbot, nw, h, ldh, iloz, & END IF DO krow = ltop, kwtop - 1, nv kln = MIN(nv, kwtop-krow) - CALL DGEMM('N', 'N', kln, jw, jw, one, h(krow,kwtop), ldh, v, & + CALL DGEMM('N', 'N', kln, jw, jw, one, h(krow,kwtop), ldh, v, & ldv, zero, wv, ldwv) CALL DLACPY('A', kln, jw, wv, ldwv, h(krow,kwtop), ldh) END DO IF (wantt) THEN DO kcol = kbot + 1, n, nh kln = MIN(nh, n-kcol+1) - CALL DGEMM('C', 'N', jw, kln, jw, one, v, ldv, h(kwtop, & + CALL DGEMM('C', 'N', jw, kln, jw, one, v, ldv, h(kwtop, & kcol), ldh, zero, t, ldt) CALL DLACPY('A', jw, kln, t, ldt, h(kwtop,kcol), ldh) END DO @@ -6822,7 +6864,7 @@ SUBROUTINE DLAQR3(wantt, wantz, n, ktop, kbot, nw, h, ldh, iloz, & IF (wantz) THEN DO krow = iloz, ihiz, nv kln = MIN(nv, ihiz-krow+1) - CALL DGEMM('N', 'N', kln, jw, jw, one, z(krow,kwtop), ldz, & + CALL DGEMM('N', 'N', kln, jw, jw, one, z(krow,kwtop), ldz, & v, ldv, zero, wv, ldwv) CALL DLACPY('A', kln, jw, wv, ldwv, z(krow,kwtop), ldz) END DO @@ -6833,7 +6875,7 @@ SUBROUTINE DLAQR3(wantt, wantz, n, ktop, kbot, nw, h, ldh, iloz, & work(1) = DBLE(lwkopt) END SUBROUTINE - SUBROUTINE DLAQR4(wantt, wantz, n, ilo, ihi, h, ldh, wr, wi, iloz, & + SUBROUTINE DLAQR4(wantt, wantz, n, ilo, ihi, h, ldh, wr, wi, iloz, & ihiz, z, ldz, work, lwork, info) USE GALAHAD_KINDS INTEGER(ip_) :: ihi, ihiz, ilo, iloz, info, ldh, ldz, lwork, n @@ -6850,15 +6892,16 @@ SUBROUTINE DLAQR4(wantt, wantz, n, ilo, ihi, h, ldh, wr, wi, iloz, & REAL(r8_) :: zero, one PARAMETER (zero=0.0_r8_, one=1.0_r8_) REAL(r8_) :: aa, bb, cc, cs, dd, sn, ss, swap - INTEGER(ip_) :: i, inf, it, itmax, k, kacc22, kbot, kdu, ks, kt, & - ktop, ku, kv, kwh, kwtop, kwv, ld, ls, lwkopt, ndec, ndfl, nh, & + INTEGER(ip_) :: i, inf, it, itmax, k, kacc22, kbot, kdu, ks, kt, & + ktop, ku, kv, kwh, kwtop, kwv, ld, ls, lwkopt, ndec, ndfl, nh, & nho, nibble, nmin, ns, nsmax, nsr, nve, nw, nwmax, nwr, nwupbd LOGICAL :: sorted CHARACTER :: jbcmpz*2 INTEGER(ip_) :: ILAENV EXTERNAL :: ILAENV REAL(r8_) :: zdum(1, 1_ip_) - EXTERNAL :: DLACPY, DLAHQR, DLANV2, DLAQR2, DLAQR5 + EXTERNAL :: DLACPY, DLAHQR, DLANV2, DLAQR2, & + DLAQR5 INTRINSIC :: ABS, DBLE, INT, MAX, MIN, MOD info = 0 IF (n==0) THEN @@ -6867,7 +6910,7 @@ SUBROUTINE DLAQR4(wantt, wantz, n, ilo, ihi, h, ldh, wr, wi, iloz, & END IF IF (n<=ntiny) THEN lwkopt = 1 - IF (lwork/=-1) CALL DLAHQR(wantt, wantz, n, ilo, ihi, h, ldh, & + IF (lwork/=-1) CALL DLAHQR(wantt, wantz, n, ilo, ihi, h, ldh, & wr, wi, iloz, ihiz, z, ldz, info) ELSE info = 0 @@ -6887,8 +6930,8 @@ SUBROUTINE DLAQR4(wantt, wantz, n, ilo, ihi, h, ldh, wr, wi, iloz, & nsr = ILAENV(15_ip_, 'DLAQR4', jbcmpz, n, ilo, ihi, lwork) nsr = MIN(nsr, (n-3)/6, ihi-ilo) nsr = MAX( 2_ip_, nsr-MOD(nsr,2)) - CALL DLAQR2(wantt, wantz, n, ilo, ihi, nwr+1, h, ldh, iloz, & - ihiz, z, ldz, ls, ld, wr, wi, h, ldh, n, h, ldh, n, h, ldh, & + CALL DLAQR2(wantt, wantz, n, ilo, ihi, nwr+1, h, ldh, iloz, & + ihiz, z, ldz, ls, ld, wr, wi, h, ldh, n, h, ldh, n, h, ldh, & work, -1_ip_) lwkopt = MAX(3*nsr/2, INT(work(1))) IF (lwork==-1) THEN @@ -6929,7 +6972,7 @@ SUBROUTINE DLAQR4(wantt, wantz, n, ilo, ihi, h, ldh, wr, wi, iloz, & nw = nh ELSE kwtop = kbot - nw + 1 - IF (ABS(h(kwtop,kwtop-1))>ABS(h(kwtop-1, kwtop-2))) nw = & + IF (ABS(h(kwtop,kwtop-1))>ABS(h(kwtop-1, kwtop-2))) nw = & nw + 1 END IF END IF @@ -6945,12 +6988,12 @@ SUBROUTINE DLAQR4(wantt, wantz, n, ilo, ihi, h, ldh, wr, wi, iloz, & nho = (n-nw-1) - kt + 1 kwv = nw + 2 nve = (n-nw) - kwv + 1 - CALL DLAQR2(wantt, wantz, n, ktop, kbot, nw, h, ldh, iloz, & - ihiz, z, ldz, ls, ld, wr, wi, h(kv,1), ldh, nho, h(kv,kt), & + CALL DLAQR2(wantt, wantz, n, ktop, kbot, nw, h, ldh, iloz, & + ihiz, z, ldz, ls, ld, wr, wi, h(kv,1), ldh, nho, h(kv,kt), & ldh, nve, h(kwv,1), ldh, work, lwork) kbot = kbot - ld ks = kbot - ls + 1 - IF ((ld==0) .OR. ((100*ld<=nw*nibble) .AND. (kbot-ktop+1> & + IF ((ld==0) .OR. ((100*ld<=nw*nibble) .AND. (kbot-ktop+1> & MIN(nmin,nwmax)))) THEN ns = MIN(nsmax, nsr, MAX(2,kbot-ktop)) ns = ns - MOD(ns, 2_ip_) @@ -6962,7 +7005,7 @@ SUBROUTINE DLAQR4(wantt, wantz, n, ilo, ihi, h, ldh, wr, wi, iloz, & bb = ss cc = wilk2*ss dd = aa - CALL DLANV2(aa, bb, cc, dd, wr(i-1), wi(i-1), wr(i), & + CALL DLANV2(aa, bb, cc, dd, wr(i-1), wi(i-1), wr(i), & wi(i), cs, sn) END DO IF (ks==ktop) THEN @@ -6976,7 +7019,7 @@ SUBROUTINE DLAQR4(wantt, wantz, n, ilo, ihi, h, ldh, wr, wi, iloz, & ks = kbot - ns + 1 kt = n - ns + 1 CALL DLACPY('A', ns, ns, h(ks,ks), ldh, h(kt,1), ldh) - CALL DLAHQR(.FALSE., .FALSE., ns, 1_ip_, ns, h(kt,1), & + CALL DLAHQR(.FALSE., .FALSE., ns, 1_ip_, ns, h(kt,1), & ldh, wr(ks), wi(ks), 1_ip_, 1_ip_, zdum, 1_ip_, inf) ks = ks + inf IF (ks>=kbot) THEN @@ -6984,7 +7027,7 @@ SUBROUTINE DLAQR4(wantt, wantz, n, ilo, ihi, h, ldh, wr, wi, iloz, & cc = h(kbot, kbot-1) bb = h(kbot-1, kbot) dd = h(kbot, kbot) - CALL DLANV2(aa, bb, cc, dd, wr(kbot-1), wi(kbot-1), & + CALL DLANV2(aa, bb, cc, dd, wr(kbot-1), wi(kbot-1), & wr(kbot), wi(kbot), cs, sn) ks = kbot - 1 END IF @@ -6995,7 +7038,7 @@ SUBROUTINE DLAQR4(wantt, wantz, n, ilo, ihi, h, ldh, wr, wi, iloz, & IF (sorted) GO TO 60 sorted = .TRUE. DO i = ks, k - 1 - IF (ABS(wr(i))+ABS(wi(i))0) THEN ndfl = 1 @@ -7057,29 +7100,30 @@ SUBROUTINE DLAQR4(wantt, wantz, n, ilo, ihi, h, ldh, wr, wi, iloz, & work(1) = DBLE(lwkopt) END SUBROUTINE - SUBROUTINE DLAQR5(wantt, wantz, kacc22, n, ktop, kbot, nshfts, sr, & - si, h, ldh, iloz, ihiz, z, ldz, v, ldv, u, ldu, nv, wv, ldwv, nh, & + SUBROUTINE DLAQR5(wantt, wantz, kacc22, n, ktop, kbot, nshfts, sr, & + si, h, ldh, iloz, ihiz, z, ldz, v, ldv, u, ldu, nv, wv, ldwv, nh, & wh, ldwh) USE GALAHAD_KINDS IMPLICIT NONE - INTEGER(ip_) :: ihiz, iloz, kacc22, kbot, ktop, ldh, ldu, ldv, & + INTEGER(ip_) :: ihiz, iloz, kacc22, kbot, ktop, ldh, ldu, ldv, & ldwh, ldwv, ldz, n, nh, nshfts, nv LOGICAL :: wantt, wantz - REAL(r8_) :: h(ldh, *), si(*), sr(*), u(ldu, *), v(ldv, *), & + REAL(r8_) :: h(ldh, *), si(*), sr(*), u(ldu, *), v(ldv, *), & wh(ldwh, *), wv(ldwv, *), z(ldz, *) REAL(r8_) :: zero, one PARAMETER (zero=0.0_r8_, one=1.0_r8_) - REAL(r8_) :: alpha, beta, h11, h12, h21, h22, refsum, safmax, & + REAL(r8_) :: alpha, beta, h11, h12, h21, h22, refsum, safmax, & safmin, scl, smlnum, swap, tst1, tst2, ulp - INTEGER(ip_) :: i, i2, i4, incol, j, jbot, jcol, jlen, jrow, jtop, & - k, k1, kdu, kms, krcol, m, m22, mbot, mtop, nbmps, ndcol, ns, nu + INTEGER(ip_) :: i, i2, i4, incol, j, jbot, jcol, jlen, jrow, & + jtop, k, k1, kdu, kms, krcol, m, m22, mbot, mtop, nbmps, ndcol, & + ns, nu LOGICAL :: accum, bmp22 REAL(r8_) :: DLAMCH EXTERNAL :: DLAMCH INTRINSIC :: ABS, DBLE, MAX, MIN, MOD REAL(r8_) :: vt(3) - EXTERNAL :: DGEMM, DLABAD, DLACPY, DLAQR1, DLARFG, & - DLASET, DTRMM + EXTERNAL :: DGEMM, DLABAD, DLACPY, DLAQR1, & + DLARFG, DLASET, DTRMM IF (nshfts<2) RETURN IF (ktop>=kbot) RETURN DO i = 1, nshfts - 2, 2 @@ -7122,7 +7166,7 @@ SUBROUTINE DLAQR5(wantt, wantz, kacc22, n, ktop, kbot, nshfts, sr, & IF (bmp22) THEN k = krcol + 2*(m22-1) IF (k==ktop-1) THEN - CALL DLAQR1( 2_ip_, h(k+1,k+1), ldh, sr(2*m22-1), & + CALL DLAQR1( 2_ip_, h(k+1,k+1), ldh, sr(2*m22-1), & si(2*m22-1), sr(2*m22), si(2*m22), v(1,m22)) beta = v(1, m22) CALL DLARFG( 2_ip_, beta, v(2,m22), 1_ip_, v(1,m22)) @@ -7168,7 +7212,7 @@ SUBROUTINE DLAQR5(wantt, wantz, kacc22, n, ktop, kbot, nshfts, sr, & h22 = MIN(ABS(h(k+1,k+1)), ABS(h(k,k)-h(k+1,k+1))) scl = h11 + h12 tst2 = h22*(h11/scl) - IF (tst2==zero .OR. h21*(h12/scl)<=MAX(smlnum,ulp* & + IF (tst2==zero .OR. h21*(h12/scl)<=MAX(smlnum,ulp* & tst2)) THEN h(k+1, k) = zero END IF @@ -7193,7 +7237,7 @@ SUBROUTINE DLAQR5(wantt, wantz, kacc22, n, ktop, kbot, nshfts, sr, & DO m = mbot, mtop, -1_ip_ k = krcol + 2*(m-1) IF (k==ktop-1) THEN - CALL DLAQR1( 3_ip_, h(ktop,ktop), ldh, sr(2*m-1), & + CALL DLAQR1( 3_ip_, h(ktop,ktop), ldh, sr(2*m-1), & si(2*m-1), sr(2*m), si(2*m), v(1,m)) alpha = v(1, m) CALL DLARFG( 3_ip_, alpha, v(2,m), 1_ip_, v(1,m)) @@ -7206,18 +7250,18 @@ SUBROUTINE DLAQR5(wantt, wantz, kacc22, n, ktop, kbot, nshfts, sr, & v( 2_ip_, m) = h(k+2, k) v( 3_ip_, m) = h(k+3, k) CALL DLARFG( 3_ip_, beta, v(2,m), 1_ip_, v(1,m)) - IF (h(k+3,k)/=zero .OR. h(k+3,k+1)/=zero .OR. h(k+3, & + IF (h(k+3,k)/=zero .OR. h(k+3,k+1)/=zero .OR. h(k+3, & k+2)==zero) THEN h(k+1, k) = beta h(k+2, k) = zero h(k+3, k) = zero ELSE - CALL DLAQR1( 3_ip_, h(k+1,k+1), ldh, sr(2*m-1), & + CALL DLAQR1( 3_ip_, h(k+1,k+1), ldh, sr(2*m-1), & si(2*m-1), sr(2*m), si(2*m), vt) alpha = vt(1) CALL DLARFG( 3_ip_, alpha, vt(2), 1_ip_, vt(1)) refsum = vt(1)*(h(k+1,k)+vt(2)*h(k+2,k)) - IF (ABS(h(k+2,k)-refsum*vt(2))+ABS(refsum*vt(3))>ulp*( & + IF (ABS(h(k+2,k)-refsum*vt(2))+ABS(refsum*vt(3))>ulp*( & ABS(h(k,k))+ABS(h(k+1,k+1))+ABS(h(k+2,k+2)))) THEN h(k+1, k) = beta h(k+2, k) = zero @@ -7233,13 +7277,13 @@ SUBROUTINE DLAQR5(wantt, wantz, kacc22, n, ktop, kbot, nshfts, sr, & END IF END IF DO j = jtop, MIN(kbot, k+3) - refsum = v(1, m)*(h(j,k+1)+v(2,m)*h(j,k+2)+v(3,m)*h(j,k+ & + refsum = v(1, m)*(h(j,k+1)+v(2,m)*h(j,k+2)+v(3,m)*h(j,k+ & 3)) h(j, k+1) = h(j, k+1) - refsum h(j, k+2) = h(j, k+2) - refsum*v( 2_ip_, m) h(j, k+3) = h(j, k+3) - refsum*v( 3_ip_, m) END DO - refsum = v(1, m)*(h(k+1,k+1)+v(2,m)*h(k+2,k+1)+v(3,m)*h(k+ & + refsum = v(1, m)*(h(k+1,k+1)+v(2,m)*h(k+2,k+1)+v(3,m)*h(k+ & 3,k+1)) h(k+1, k+1) = h(k+1, k+1) - refsum h(k+2, k+1) = h(k+2, k+1) - refsum*v( 2_ip_, m) @@ -7262,7 +7306,7 @@ SUBROUTINE DLAQR5(wantt, wantz, kacc22, n, ktop, kbot, nshfts, sr, & h22 = MIN(ABS(h(k+1,k+1)), ABS(h(k,k)-h(k+1,k+1))) scl = h11 + h12 tst2 = h22*(h11/scl) - IF (tst2==zero .OR. h21*(h12/scl)<=MAX(smlnum,ulp*tst2 & + IF (tst2==zero .OR. h21*(h12/scl)<=MAX(smlnum,ulp*tst2 & )) THEN h(k+1, k) = zero END IF @@ -7279,7 +7323,7 @@ SUBROUTINE DLAQR5(wantt, wantz, kacc22, n, ktop, kbot, nshfts, sr, & DO m = mbot, mtop, -1_ip_ k = krcol + 2*(m-1) DO j = MAX(ktop, krcol+2*m), jbot - refsum = v(1, m)*(h(k+1,j)+v(2,m)*h(k+2,j)+v(3,m)*h(k+3, & + refsum = v(1, m)*(h(k+1,j)+v(2,m)*h(k+2,j)+v(3,m)*h(k+3, & j)) h(k+1, j) = h(k+1, j) - refsum h(k+2, j) = h(k+2, j) - refsum*v( 2_ip_, m) @@ -7294,7 +7338,7 @@ SUBROUTINE DLAQR5(wantt, wantz, kacc22, n, ktop, kbot, nshfts, sr, & i2 = MAX(i2, kms-(krcol-incol)+1) i4 = MIN(kdu, krcol+2*(mbot-1)-incol+5) DO j = i2, i4 - refsum = v(1, m)*(u(j,kms+1)+v(2,m)*u(j,kms+2)+v(3,m)* & + refsum = v(1, m)*(u(j,kms+1)+v(2,m)*u(j,kms+2)+v(3,m)* & u(j,kms+3)) u(j, kms+1) = u(j, kms+1) - refsum u(j, kms+2) = u(j, kms+2) - refsum*v( 2_ip_, m) @@ -7305,7 +7349,7 @@ SUBROUTINE DLAQR5(wantt, wantz, kacc22, n, ktop, kbot, nshfts, sr, & DO m = mbot, mtop, -1_ip_ k = krcol + 2*(m-1) DO j = iloz, ihiz - refsum = v(1, m)*(z(j,k+1)+v(2,m)*z(j,k+2)+v(3,m)*z(j, & + refsum = v(1, m)*(z(j,k+1)+v(2,m)*z(j,k+2)+v(3,m)*z(j, & k+3)) z(j, k+1) = z(j, k+1) - refsum z(j, k+2) = z(j, k+2) - refsum*v( 2_ip_, m) @@ -7326,24 +7370,24 @@ SUBROUTINE DLAQR5(wantt, wantz, kacc22, n, ktop, kbot, nshfts, sr, & nu = (kdu-MAX(0,ndcol-kbot)) - k1 + 1 DO jcol = MIN(ndcol, kbot) + 1, jbot, nh jlen = MIN(nh, jbot-jcol+1) - CALL DGEMM('C', 'N', nu, jlen, nu, one, u(k1,k1), ldu, & + CALL DGEMM('C', 'N', nu, jlen, nu, one, u(k1,k1), ldu, & h(incol+k1,jcol), ldh, zero, wh, ldwh) - CALL DLACPY('ALL', nu, jlen, wh, ldwh, h(incol+k1,jcol), & + CALL DLACPY('ALL', nu, jlen, wh, ldwh, h(incol+k1,jcol), & ldh) END DO DO jrow = jtop, MAX(ktop, incol) - 1, nv jlen = MIN(nv, MAX(ktop,incol)-jrow) - CALL DGEMM('N', 'N', jlen, nu, nu, one, h(jrow,incol+k1), & + CALL DGEMM('N', 'N', jlen, nu, nu, one, h(jrow,incol+k1), & ldh, u(k1,k1), ldu, zero, wv, ldwv) - CALL DLACPY('ALL', jlen, nu, wv, ldwv, h(jrow,incol+k1), & + CALL DLACPY('ALL', jlen, nu, wv, ldwv, h(jrow,incol+k1), & ldh) END DO IF (wantz) THEN DO jrow = iloz, ihiz, nv jlen = MIN(nv, ihiz-jrow+1) - CALL DGEMM('N', 'N', jlen, nu, nu, one, z(jrow,incol+k1), & + CALL DGEMM('N', 'N', jlen, nu, nu, one, z(jrow,incol+k1), & ldz, u(k1,k1), ldu, zero, wv, ldwv) - CALL DLACPY('ALL', jlen, nu, wv, ldwv, z(jrow,incol+k1), & + CALL DLACPY('ALL', jlen, nu, wv, ldwv, z(jrow,incol+k1), & ldz) END DO END IF @@ -7391,21 +7435,21 @@ SUBROUTINE DLARF(side, m, n, v, incv, tau, c, ldc, work) END IF IF (applyleft) THEN IF (lastv>0) THEN - CALL DGEMV('Transpose', lastv, lastc, one, c, ldc, v, incv, & + CALL DGEMV('Transpose', lastv, lastc, one, c, ldc, v, incv, & zero, work, 1_ip_) CALL DGER(lastv, lastc, -tau, v, incv, work, 1_ip_, c, ldc) END IF ELSE IF (lastv>0) THEN - CALL DGEMV('No transpose', lastc, lastv, one, c, ldc, v, incv, & - zero, work, 1_ip_) + CALL DGEMV('No transpose', lastc, lastv, one, c, ldc, v, & + incv, zero, work, 1_ip_) CALL DGER(lastc, lastv, -tau, work, 1_ip_, v, incv, c, ldc) END IF END IF RETURN END SUBROUTINE - SUBROUTINE DLARFB(side, trans, direct, storev, m, n, k, v, ldv, t, & + SUBROUTINE DLARFB(side, trans, direct, storev, m, n, k, v, ldv, t, & ldt, c, ldc, work, ldwork) USE GALAHAD_KINDS CHARACTER :: direct, side, storev, trans @@ -7430,20 +7474,20 @@ SUBROUTINE DLARFB(side, trans, direct, storev, m, n, k, v, ldv, t, & DO j = 1, k CALL DCOPY(n, c(j,1), ldc, work(1,j), 1_ip_) END DO - CALL DTRMM('Right', 'Lower', 'No transpose', 'Unit', n, k, & + CALL DTRMM('Right', 'Lower', 'No transpose', 'Unit', n, k, & one, v, ldv, work, ldwork) IF (m>k) THEN - CALL DGEMM('Transpose', 'No transpose', n, k, m-k, one, & + CALL DGEMM('Transpose', 'No transpose', n, k, m-k, one, & c(k+1,1), ldc, v(k+1,1), ldv, one, work, ldwork) END IF - CALL DTRMM('Right', 'Upper', transt, 'Non-unit', n, k, one, & + CALL DTRMM('Right', 'Upper', transt, 'Non-unit', n, k, one, & t, ldt, work, ldwork) IF (m>k) THEN - CALL DGEMM('No transpose', 'Transpose', m-k, n, k, -one, & + CALL DGEMM('No transpose', 'Transpose', m-k, n, k, -one, & v(k+1,1), ldv, work, ldwork, one, c(k+1,1), ldc) END IF - CALL DTRMM('Right', 'Lower', 'Transpose', 'Unit', n, k, one, & - v, ldv, work, ldwork) + CALL DTRMM('Right', 'Lower', 'Transpose', 'Unit', n, k, & + one, v, ldv, work, ldwork) DO j = 1, k DO i = 1, n c(j, i) = c(j, i) - work(i, j) @@ -7453,20 +7497,20 @@ SUBROUTINE DLARFB(side, trans, direct, storev, m, n, k, v, ldv, t, & DO j = 1, k CALL DCOPY(m, c(1,j), 1_ip_, work(1,j), 1_ip_) END DO - CALL DTRMM('Right', 'Lower', 'No transpose', 'Unit', m, k, & + CALL DTRMM('Right', 'Lower', 'No transpose', 'Unit', m, k, & one, v, ldv, work, ldwork) IF (n>k) THEN - CALL DGEMM('No transpose', 'No transpose', m, k, n-k, one, & - c(1,k+1), ldc, v(k+1,1), ldv, one, work, ldwork) + CALL DGEMM('No transpose', 'No transpose', m, k, n-k, & + one, c(1,k+1), ldc, v(k+1,1), ldv, one, work, ldwork) END IF - CALL DTRMM('Right', 'Upper', trans, 'Non-unit', m, k, one, & + CALL DTRMM('Right', 'Upper', trans, 'Non-unit', m, k, one, & t, ldt, work, ldwork) IF (n>k) THEN - CALL DGEMM('No transpose', 'Transpose', m, n-k, k, -one, & + CALL DGEMM('No transpose', 'Transpose', m, n-k, k, -one, & work, ldwork, v(k+1,1), ldv, one, c(1,k+1), ldc) END IF - CALL DTRMM('Right', 'Lower', 'Transpose', 'Unit', m, k, one, & - v, ldv, work, ldwork) + CALL DTRMM('Right', 'Lower', 'Transpose', 'Unit', m, k, & + one, v, ldv, work, ldwork) DO j = 1, k DO i = 1, m c(i, j) = c(i, j) - work(i, j) @@ -7478,20 +7522,20 @@ SUBROUTINE DLARFB(side, trans, direct, storev, m, n, k, v, ldv, t, & DO j = 1, k CALL DCOPY(n, c(m-k+j,1), ldc, work(1,j), 1_ip_) END DO - CALL DTRMM('Right', 'Upper', 'No transpose', 'Unit', n, k, & + CALL DTRMM('Right', 'Upper', 'No transpose', 'Unit', n, k, & one, v(m-k+1,1), ldv, work, ldwork) IF (m>k) THEN - CALL DGEMM('Transpose', 'No transpose', n, k, m-k, one, c, & - ldc, v, ldv, one, work, ldwork) + CALL DGEMM('Transpose', 'No transpose', n, k, m-k, one, & + c, ldc, v, ldv, one, work, ldwork) END IF - CALL DTRMM('Right', 'Lower', transt, 'Non-unit', n, k, one, & + CALL DTRMM('Right', 'Lower', transt, 'Non-unit', n, k, one, & t, ldt, work, ldwork) IF (m>k) THEN - CALL DGEMM('No transpose', 'Transpose', m-k, n, k, -one, & + CALL DGEMM('No transpose', 'Transpose', m-k, n, k, -one, & v, ldv, work, ldwork, one, c, ldc) END IF - CALL DTRMM('Right', 'Upper', 'Transpose', 'Unit', n, k, one, & - v(m-k+1,1), ldv, work, ldwork) + CALL DTRMM('Right', 'Upper', 'Transpose', 'Unit', n, k, & + one, v(m-k+1,1), ldv, work, ldwork) DO j = 1, k DO i = 1, n c(m-k+j, i) = c(m-k+j, i) - work(i, j) @@ -7501,20 +7545,20 @@ SUBROUTINE DLARFB(side, trans, direct, storev, m, n, k, v, ldv, t, & DO j = 1, k CALL DCOPY(m, c(1,n-k+j), 1_ip_, work(1,j), 1_ip_) END DO - CALL DTRMM('Right', 'Upper', 'No transpose', 'Unit', m, k, & + CALL DTRMM('Right', 'Upper', 'No transpose', 'Unit', m, k, & one, v(n-k+1,1), ldv, work, ldwork) IF (n>k) THEN - CALL DGEMM('No transpose', 'No transpose', m, k, n-k, one, & - c, ldc, v, ldv, one, work, ldwork) + CALL DGEMM('No transpose', 'No transpose', m, k, n-k, & + one, c, ldc, v, ldv, one, work, ldwork) END IF - CALL DTRMM('Right', 'Lower', trans, 'Non-unit', m, k, one, & + CALL DTRMM('Right', 'Lower', trans, 'Non-unit', m, k, one, & t, ldt, work, ldwork) IF (n>k) THEN - CALL DGEMM('No transpose', 'Transpose', m, n-k, k, -one, & + CALL DGEMM('No transpose', 'Transpose', m, n-k, k, -one, & work, ldwork, v, ldv, one, c, ldc) END IF - CALL DTRMM('Right', 'Upper', 'Transpose', 'Unit', m, k, one, & - v(n-k+1,1), ldv, work, ldwork) + CALL DTRMM('Right', 'Upper', 'Transpose', 'Unit', m, k, & + one, v(n-k+1,1), ldv, work, ldwork) DO j = 1, k DO i = 1, m c(i, n-k+j) = c(i, n-k+j) - work(i, j) @@ -7528,19 +7572,19 @@ SUBROUTINE DLARFB(side, trans, direct, storev, m, n, k, v, ldv, t, & DO j = 1, k CALL DCOPY(n, c(j,1), ldc, work(1,j), 1_ip_) END DO - CALL DTRMM('Right', 'Upper', 'Transpose', 'Unit', n, k, one, & - v, ldv, work, ldwork) + CALL DTRMM('Right', 'Upper', 'Transpose', 'Unit', n, k, & + one, v, ldv, work, ldwork) IF (m>k) THEN - CALL DGEMM('Transpose', 'Transpose', n, k, m-k, one, & + CALL DGEMM('Transpose', 'Transpose', n, k, m-k, one, & c(k+1,1), ldc, v(1,k+1), ldv, one, work, ldwork) END IF - CALL DTRMM('Right', 'Upper', transt, 'Non-unit', n, k, one, & + CALL DTRMM('Right', 'Upper', transt, 'Non-unit', n, k, one, & t, ldt, work, ldwork) IF (m>k) THEN - CALL DGEMM('Transpose', 'Transpose', m-k, n, k, -one, v(1, & - k+1), ldv, work, ldwork, one, c(k+1,1), ldc) + CALL DGEMM('Transpose', 'Transpose', m-k, n, k, -one, & + v(1,k+1), ldv, work, ldwork, one, c(k+1,1), ldc) END IF - CALL DTRMM('Right', 'Upper', 'No transpose', 'Unit', n, k, & + CALL DTRMM('Right', 'Upper', 'No transpose', 'Unit', n, k, & one, v, ldv, work, ldwork) DO j = 1, k DO i = 1, n @@ -7551,19 +7595,19 @@ SUBROUTINE DLARFB(side, trans, direct, storev, m, n, k, v, ldv, t, & DO j = 1, k CALL DCOPY(m, c(1,j), 1_ip_, work(1,j), 1_ip_) END DO - CALL DTRMM('Right', 'Upper', 'Transpose', 'Unit', m, k, one, & - v, ldv, work, ldwork) + CALL DTRMM('Right', 'Upper', 'Transpose', 'Unit', m, k, & + one, v, ldv, work, ldwork) IF (n>k) THEN - CALL DGEMM('No transpose', 'Transpose', m, k, n-k, one, & + CALL DGEMM('No transpose', 'Transpose', m, k, n-k, one, & c(1,k+1), ldc, v(1,k+1), ldv, one, work, ldwork) END IF - CALL DTRMM('Right', 'Upper', trans, 'Non-unit', m, k, one, & + CALL DTRMM('Right', 'Upper', trans, 'Non-unit', m, k, one, & t, ldt, work, ldwork) IF (n>k) THEN - CALL DGEMM('No transpose', 'No transpose', m, n-k, k, & + CALL DGEMM('No transpose', 'No transpose', m, n-k, k, & -one, work, ldwork, v(1,k+1), ldv, one, c(1,k+1), ldc) END IF - CALL DTRMM('Right', 'Upper', 'No transpose', 'Unit', m, k, & + CALL DTRMM('Right', 'Upper', 'No transpose', 'Unit', m, k, & one, v, ldv, work, ldwork) DO j = 1, k DO i = 1, m @@ -7576,19 +7620,19 @@ SUBROUTINE DLARFB(side, trans, direct, storev, m, n, k, v, ldv, t, & DO j = 1, k CALL DCOPY(n, c(m-k+j,1), ldc, work(1,j), 1_ip_) END DO - CALL DTRMM('Right', 'Lower', 'Transpose', 'Unit', n, k, one, & - v(1,m-k+1), ldv, work, ldwork) + CALL DTRMM('Right', 'Lower', 'Transpose', 'Unit', n, k, & + one, v(1,m-k+1), ldv, work, ldwork) IF (m>k) THEN - CALL DGEMM('Transpose', 'Transpose', n, k, m-k, one, c, & + CALL DGEMM('Transpose', 'Transpose', n, k, m-k, one, c, & ldc, v, ldv, one, work, ldwork) END IF - CALL DTRMM('Right', 'Lower', transt, 'Non-unit', n, k, one, & + CALL DTRMM('Right', 'Lower', transt, 'Non-unit', n, k, one, & t, ldt, work, ldwork) IF (m>k) THEN - CALL DGEMM('Transpose', 'Transpose', m-k, n, k, -one, v, & + CALL DGEMM('Transpose', 'Transpose', m-k, n, k, -one, v, & ldv, work, ldwork, one, c, ldc) END IF - CALL DTRMM('Right', 'Lower', 'No transpose', 'Unit', n, k, & + CALL DTRMM('Right', 'Lower', 'No transpose', 'Unit', n, k, & one, v(1,m-k+1), ldv, work, ldwork) DO j = 1, k DO i = 1, n @@ -7599,19 +7643,19 @@ SUBROUTINE DLARFB(side, trans, direct, storev, m, n, k, v, ldv, t, & DO j = 1, k CALL DCOPY(m, c(1,n-k+j), 1_ip_, work(1,j), 1_ip_) END DO - CALL DTRMM('Right', 'Lower', 'Transpose', 'Unit', m, k, one, & - v(1,n-k+1), ldv, work, ldwork) + CALL DTRMM('Right', 'Lower', 'Transpose', 'Unit', m, k, & + one, v(1,n-k+1), ldv, work, ldwork) IF (n>k) THEN - CALL DGEMM('No transpose', 'Transpose', m, k, n-k, one, c, & - ldc, v, ldv, one, work, ldwork) + CALL DGEMM('No transpose', 'Transpose', m, k, n-k, one, & + c, ldc, v, ldv, one, work, ldwork) END IF - CALL DTRMM('Right', 'Lower', trans, 'Non-unit', m, k, one, & + CALL DTRMM('Right', 'Lower', trans, 'Non-unit', m, k, one, & t, ldt, work, ldwork) IF (n>k) THEN - CALL DGEMM('No transpose', 'No transpose', m, n-k, k, & + CALL DGEMM('No transpose', 'No transpose', m, n-k, k, & -one, work, ldwork, v, ldv, one, c, ldc) END IF - CALL DTRMM('Right', 'Lower', 'No transpose', 'Unit', m, k, & + CALL DTRMM('Right', 'Lower', 'No transpose', 'Unit', m, k, & one, v(1,n-k+1), ldv, work, ldwork) DO j = 1, k DO i = 1, m @@ -7698,7 +7742,7 @@ SUBROUTINE DLARFT(direct, storev, n, k, v, ldv, tau, t, ldt) t(j, i) = -tau(i)*v(i, j) END DO j = MIN(lastv, prevlastv) - CALL DGEMV('Transpose', j-i, i-1, -tau(i), v(i+1,1), ldv, & + CALL DGEMV('Transpose', j-i, i-1, -tau(i), v(i+1,1), ldv, & v(i+1,i), 1_ip_, one, t(1,i), 1_ip_) ELSE DO lastv = n, i + 1, -1_ip_ @@ -7708,11 +7752,11 @@ SUBROUTINE DLARFT(direct, storev, n, k, v, ldv, tau, t, ldt) t(j, i) = -tau(i)*v(j, i) END DO j = MIN(lastv, prevlastv) - CALL DGEMV('No transpose', i-1, j-i, -tau(i), v(1,i+1), & + CALL DGEMV('No transpose', i-1, j-i, -tau(i), v(1,i+1), & ldv, v(i,i+1), ldv, one, t(1,i), 1_ip_) END IF - CALL DTRMV('Upper', 'No transpose', 'Non-unit', i-1, t, ldt, & - t(1,i), 1_ip_) + CALL DTRMV('Upper', 'No transpose', 'Non-unit', i-1, t, & + ldt, t(1,i), 1_ip_) t(i, i) = tau(i) IF (i>1) THEN prevlastv = MAX(prevlastv, lastv) @@ -7738,8 +7782,8 @@ SUBROUTINE DLARFT(direct, storev, n, k, v, ldv, tau, t, ldt) t(j, i) = -tau(i)*v(n-k+i, j) END DO j = MAX(lastv, prevlastv) - CALL DGEMV('Transpose', n-k+i-j, k-i, -tau(i), v(j,i+1), & - ldv, v(j,i), 1_ip_, one, t(i+1,i), 1_ip_) + CALL DGEMV('Transpose', n-k+i-j, k-i, -tau(i), v(j, & + i+1), ldv, v(j,i), 1_ip_, one, t(i+1,i), 1_ip_) ELSE DO lastv = 1, i - 1 IF (v(i,lastv)/=zero) EXIT @@ -7748,10 +7792,10 @@ SUBROUTINE DLARFT(direct, storev, n, k, v, ldv, tau, t, ldt) t(j, i) = -tau(i)*v(j, n-k+i) END DO j = MAX(lastv, prevlastv) - CALL DGEMV('No transpose', k-i, n-k+i-j, -tau(i), v(i+1, & - j), ldv, v(i,j), ldv, one, t(i+1,i), 1_ip_) + CALL DGEMV('No transpose', k-i, n-k+i-j, -tau(i), & + v(i+1,j), ldv, v(i,j), ldv, one, t(i+1,i), 1_ip_) END IF - CALL DTRMV('Lower', 'No transpose', 'Non-unit', k-i, & + CALL DTRMV('Lower', 'No transpose', 'Non-unit', k-i, & t(i+1,i+1), ldt, t(i+1,i), 1_ip_) IF (i>1) THEN prevlastv = MIN(prevlastv, lastv) @@ -7775,7 +7819,7 @@ SUBROUTINE DLARFX(side, m, n, v, tau, c, ldc, work) REAL(r8_) :: zero, one PARAMETER (zero=0.0_r8_, one=1.0_r8_) INTEGER(ip_) :: j - REAL(r8_) :: sum, t1, t10, t2, t3, t4, t5, t6, t7, t8, t9, v1, & + REAL(r8_) :: sum, t1, t10, t2, t3, t4, t5, t6, t7, t8, t9, v1, & v10, v2, v3, v4, v5, v6, v7, v8, v9 LOGICAL :: LSAME EXTERNAL :: LSAME @@ -7826,7 +7870,7 @@ SUBROUTINE DLARFX(side, m, n, v, tau, c, ldc, work) v4 = v(4) t4 = tau*v4 DO j = 1, n - sum = v1*c(1, j) + v2*c( 2_ip_, j) + v3*c( 3_ip_, j) + v4*c( & + sum = v1*c(1, j) + v2*c( 2_ip_, j) + v3*c( 3_ip_, j) + v4*c( & 4_ip_, j) c(1, j) = c(1, j) - sum*t1 c( 2_ip_, j) = c( 2_ip_, j) - sum*t2 @@ -7846,7 +7890,7 @@ SUBROUTINE DLARFX(side, m, n, v, tau, c, ldc, work) v5 = v(5) t5 = tau*v5 DO j = 1, n - sum = v1*c(1, j) + v2*c( 2_ip_, j) + v3*c( 3_ip_, j) + v4*c( & + sum = v1*c(1, j) + v2*c( 2_ip_, j) + v3*c( 3_ip_, j) + v4*c( & 4_ip_, j) + v5*c(5, j) c(1, j) = c(1, j) - sum*t1 c( 2_ip_, j) = c( 2_ip_, j) - sum*t2 @@ -7869,7 +7913,7 @@ SUBROUTINE DLARFX(side, m, n, v, tau, c, ldc, work) v6 = v(6) t6 = tau*v6 DO j = 1, n - sum = v1*c(1, j) + v2*c( 2_ip_, j) + v3*c( 3_ip_, j) + v4*c( & + sum = v1*c(1, j) + v2*c( 2_ip_, j) + v3*c( 3_ip_, j) + v4*c( & 4_ip_, j) + v5*c(5, j) + v6*c(6, j) c(1, j) = c(1, j) - sum*t1 c( 2_ip_, j) = c( 2_ip_, j) - sum*t2 @@ -7895,7 +7939,7 @@ SUBROUTINE DLARFX(side, m, n, v, tau, c, ldc, work) v7 = v(7) t7 = tau*v7 DO j = 1, n - sum = v1*c(1, j) + v2*c( 2_ip_, j) + v3*c( 3_ip_, j) + v4*c( & + sum = v1*c(1, j) + v2*c( 2_ip_, j) + v3*c( 3_ip_, j) + v4*c( & 4_ip_, j) + v5*c(5, j) + v6*c(6, j) + v7*c(7, j) c(1, j) = c(1, j) - sum*t1 c( 2_ip_, j) = c( 2_ip_, j) - sum*t2 @@ -7924,7 +7968,7 @@ SUBROUTINE DLARFX(side, m, n, v, tau, c, ldc, work) v8 = v(8) t8 = tau*v8 DO j = 1, n - sum = v1*c(1, j) + v2*c( 2_ip_, j) + v3*c( 3_ip_, j) + v4*c( & + sum = v1*c(1, j) + v2*c( 2_ip_, j) + v3*c( 3_ip_, j) + v4*c( & 4_ip_, j) + v5*c(5, j) + v6*c(6, j) + v7*c(7, j) + v8*c(8, j) c(1, j) = c(1, j) - sum*t1 c( 2_ip_, j) = c( 2_ip_, j) - sum*t2 @@ -7956,9 +8000,9 @@ SUBROUTINE DLARFX(side, m, n, v, tau, c, ldc, work) v9 = v(9) t9 = tau*v9 DO j = 1, n - sum = v1*c(1, j) + v2*c( 2_ip_, j) + v3*c( 3_ip_, j) + v4*c( & - 4_ip_, j) + v5*c(5, j) + v6*c(6, j) + v7*c(7, j) + v8*c(8, j) & - + v9*c(9, j) + sum = v1*c(1, j) + v2*c( 2_ip_, j) + v3*c( 3_ip_, j) + v4*c( & + 4_ip_, j) + v5*c(5, j) + v6*c(6, j) + v7*c(7, j) + v8*c(8, & + j) + v9*c(9, j) c(1, j) = c(1, j) - sum*t1 c( 2_ip_, j) = c( 2_ip_, j) - sum*t2 c( 3_ip_, j) = c( 3_ip_, j) - sum*t3 @@ -7992,9 +8036,9 @@ SUBROUTINE DLARFX(side, m, n, v, tau, c, ldc, work) v10 = v(10) t10 = tau*v10 DO j = 1, n - sum = v1*c(1, j) + v2*c( 2_ip_, j) + v3*c( 3_ip_, j) + v4*c( & - 4_ip_, j) + v5*c(5, j) + v6*c(6, j) + v7*c(7, j) + v8*c(8, j) & - + v9*c(9, j) + v10*c(10, j) + sum = v1*c(1, j) + v2*c( 2_ip_, j) + v3*c( 3_ip_, j) + v4*c( & + 4_ip_, j) + v5*c(5, j) + v6*c(6, j) + v7*c(7, j) + v8*c(8, & + j) + v9*c(9, j) + v10*c(10, j) c(1, j) = c(1, j) - sum*t1 c( 2_ip_, j) = c( 2_ip_, j) - sum*t2 c( 3_ip_, j) = c( 3_ip_, j) - sum*t3 @@ -8052,7 +8096,7 @@ SUBROUTINE DLARFX(side, m, n, v, tau, c, ldc, work) v4 = v(4) t4 = tau*v4 DO j = 1, m - sum = v1*c(j, 1_ip_) + v2*c(j, 2_ip_) + v3*c(j, 3_ip_) + & + sum = v1*c(j, 1_ip_) + v2*c(j, 2_ip_) + v3*c(j, 3_ip_) + & v4*c(j, 4_ip_) c(j, 1_ip_) = c(j, 1_ip_) - sum*t1 c(j, 2_ip_) = c(j, 2_ip_) - sum*t2 @@ -8072,7 +8116,7 @@ SUBROUTINE DLARFX(side, m, n, v, tau, c, ldc, work) v5 = v(5) t5 = tau*v5 DO j = 1, m - sum = v1*c(j, 1_ip_) + v2*c(j, 2_ip_) + v3*c(j, 3_ip_) + & + sum = v1*c(j, 1_ip_) + v2*c(j, 2_ip_) + v3*c(j, 3_ip_) + & v4*c(j, 4_ip_) + v5*c(j, 5) c(j, 1_ip_) = c(j, 1_ip_) - sum*t1 c(j, 2_ip_) = c(j, 2_ip_) - sum*t2 @@ -8095,7 +8139,7 @@ SUBROUTINE DLARFX(side, m, n, v, tau, c, ldc, work) v6 = v(6) t6 = tau*v6 DO j = 1, m - sum = v1*c(j, 1_ip_) + v2*c(j, 2_ip_) + v3*c(j, 3_ip_) + & + sum = v1*c(j, 1_ip_) + v2*c(j, 2_ip_) + v3*c(j, 3_ip_) + & v4*c(j, 4_ip_) + v5*c(j, 5) + v6*c(j, 6) c(j, 1_ip_) = c(j, 1_ip_) - sum*t1 c(j, 2_ip_) = c(j, 2_ip_) - sum*t2 @@ -8121,7 +8165,7 @@ SUBROUTINE DLARFX(side, m, n, v, tau, c, ldc, work) v7 = v(7) t7 = tau*v7 DO j = 1, m - sum = v1*c(j, 1_ip_) + v2*c(j, 2_ip_) + v3*c(j, 3_ip_) + & + sum = v1*c(j, 1_ip_) + v2*c(j, 2_ip_) + v3*c(j, 3_ip_) + & v4*c(j, 4_ip_) + v5*c(j, 5) + v6*c(j, 6) + v7*c(j, 7) c(j, 1_ip_) = c(j, 1_ip_) - sum*t1 c(j, 2_ip_) = c(j, 2_ip_) - sum*t2 @@ -8150,8 +8194,8 @@ SUBROUTINE DLARFX(side, m, n, v, tau, c, ldc, work) v8 = v(8) t8 = tau*v8 DO j = 1, m - sum = v1*c(j, 1_ip_) + v2*c(j, 2_ip_) + v3*c(j, 3_ip_) + & - v4*c(j, 4_ip_) + v5*c(j, 5) + v6*c(j, 6) + v7*c(j, 7) + & + sum = v1*c(j, 1_ip_) + v2*c(j, 2_ip_) + v3*c(j, 3_ip_) + & + v4*c(j, 4_ip_) + v5*c(j, 5) + v6*c(j, 6) + v7*c(j, 7) + & v8*c(j, 8) c(j, 1_ip_) = c(j, 1_ip_) - sum*t1 c(j, 2_ip_) = c(j, 2_ip_) - sum*t2 @@ -8183,8 +8227,8 @@ SUBROUTINE DLARFX(side, m, n, v, tau, c, ldc, work) v9 = v(9) t9 = tau*v9 DO j = 1, m - sum = v1*c(j, 1_ip_) + v2*c(j, 2_ip_) + v3*c(j, 3_ip_) + & - v4*c(j, 4_ip_) + v5*c(j, 5) + v6*c(j, 6) + v7*c(j, 7) + & + sum = v1*c(j, 1_ip_) + v2*c(j, 2_ip_) + v3*c(j, 3_ip_) + & + v4*c(j, 4_ip_) + v5*c(j, 5) + v6*c(j, 6) + v7*c(j, 7) + & v8*c(j, 8) + v9*c(j, 9) c(j, 1_ip_) = c(j, 1_ip_) - sum*t1 c(j, 2_ip_) = c(j, 2_ip_) - sum*t2 @@ -8219,8 +8263,8 @@ SUBROUTINE DLARFX(side, m, n, v, tau, c, ldc, work) v10 = v(10) t10 = tau*v10 DO j = 1, m - sum = v1*c(j, 1_ip_) + v2*c(j, 2_ip_) + v3*c(j, 3_ip_) + & - v4*c(j, 4_ip_) + v5*c(j, 5) + v6*c(j, 6) + v7*c(j, 7) + & + sum = v1*c(j, 1_ip_) + v2*c(j, 2_ip_) + v3*c(j, 3_ip_) + & + v4*c(j, 4_ip_) + v5*c(j, 5) + v6*c(j, 6) + v7*c(j, 7) + & v8*c(j, 8) + v9*c(j, 9) + v10*c(j, 10) c(j, 1_ip_) = c(j, 1_ip_) - sum*t1 c(j, 2_ip_) = c(j, 2_ip_) - sum*t2 @@ -8325,7 +8369,7 @@ SUBROUTINE DLARZ(side, m, n, l, v, incv, tau, c, ldc, work) IF (LSAME(side,'L')) THEN IF (tau/=zero) THEN CALL DCOPY(n, c, ldc, work, 1_ip_) - CALL DGEMV('Transpose', l, n, one, c(m-l+1,1), ldc, v, incv, & + CALL DGEMV('Transpose', l, n, one, c(m-l+1,1), ldc, v, incv, & one, work, 1_ip_) CALL DAXPY(n, -tau, work, 1_ip_, c, ldc) CALL DGER(l, n, -tau, v, incv, work, 1_ip_, c(m-l+1,1), ldc) @@ -8333,7 +8377,7 @@ SUBROUTINE DLARZ(side, m, n, l, v, incv, tau, c, ldc, work) ELSE IF (tau/=zero) THEN CALL DCOPY(m, c, 1_ip_, work, 1_ip_) - CALL DGEMV('No transpose', m, l, one, c(1,n-l+1), ldc, v, & + CALL DGEMV('No transpose', m, l, one, c(1,n-l+1), ldc, v, & incv, one, work, 1_ip_) CALL DAXPY(m, -tau, work, 1_ip_, c, 1_ip_) CALL DGER(m, l, -tau, work, 1_ip_, v, incv, c(1,n-l+1), ldc) @@ -8342,7 +8386,7 @@ SUBROUTINE DLARZ(side, m, n, l, v, incv, tau, c, ldc, work) RETURN END SUBROUTINE - SUBROUTINE DLARZB(side, trans, direct, storev, m, n, k, l, v, ldv, & + SUBROUTINE DLARZB(side, trans, direct, storev, m, n, k, l, v, ldv, & t, ldt, c, ldc, work, ldwork) USE GALAHAD_KINDS CHARACTER :: direct, side, storev, trans @@ -8375,31 +8419,31 @@ SUBROUTINE DLARZB(side, trans, direct, storev, m, n, k, l, v, ldv, & DO j = 1, k CALL DCOPY(n, c(j,1), ldc, work(1,j), 1_ip_) END DO - IF (l>0) CALL DGEMM('Transpose', 'Transpose', n, k, l, one, & + IF (l>0) CALL DGEMM('Transpose', 'Transpose', n, k, l, one, & c(m-l+1,1), ldc, v, ldv, one, work, ldwork) - CALL DTRMM('Right', 'Lower', transt, 'Non-unit', n, k, one, t, & + CALL DTRMM('Right', 'Lower', transt, 'Non-unit', n, k, one, t, & ldt, work, ldwork) DO j = 1, n DO i = 1, k c(i, j) = c(i, j) - work(j, i) END DO END DO - IF (l>0) CALL DGEMM('Transpose', 'Transpose', l, n, k, -one, v, & + IF (l>0) CALL DGEMM('Transpose', 'Transpose', l, n, k, -one, v, & ldv, work, ldwork, one, c(m-l+1,1), ldc) ELSE IF (LSAME(side,'R')) THEN DO j = 1, k CALL DCOPY(m, c(1,j), 1_ip_, work(1,j), 1_ip_) END DO - IF (l>0) CALL DGEMM('No transpose', 'Transpose', m, k, l, one, & + IF (l>0) CALL DGEMM('No transpose', 'Transpose', m, k, l, one, & c(1,n-l+1), ldc, v, ldv, one, work, ldwork) - CALL DTRMM('Right', 'Lower', trans, 'Non-unit', m, k, one, t, & + CALL DTRMM('Right', 'Lower', trans, 'Non-unit', m, k, one, t, & ldt, work, ldwork) DO j = 1, k DO i = 1, m c(i, j) = c(i, j) - work(i, j) END DO END DO - IF (l>0) CALL DGEMM('No transpose', 'No transpose', m, l, k, & + IF (l>0) CALL DGEMM('No transpose', 'No transpose', m, l, k, & -one, work, ldwork, v, ldv, one, c(1,n-l+1), ldc) END IF RETURN @@ -8433,9 +8477,9 @@ SUBROUTINE DLARZT(direct, storev, n, k, v, ldv, tau, t, ldt) END DO ELSE IF (i=4) THEN IF (kl<0 .OR. kl>MAX(m-1,0)) THEN info = -2 - ELSE IF (ku<0 .OR. ku>MAX(n-1,0) .OR. ((itype==4 .OR. itype== & + ELSE IF (ku<0 .OR. ku>MAX(n-1,0) .OR. ((itype==4 .OR. itype== & 5) .AND. kl/=ku)) THEN info = -3 - ELSE IF ((itype==4 .AND. ldazero) THEN @@ -8863,7 +8907,7 @@ SUBROUTINE DLASD4(n, i, d, z, delta, rho, sigma, work, info) END IF tau = tau2/(d(i)+SQRT(d(i)*d(i)+tau2)) temp = SQRT(eps) - IF ((d(i)<=temp*d(ip1)) .AND. (ABS(z(i))<=temp) .AND. (d( & + IF ((d(i)<=temp*d(ip1)) .AND. (ABS(z(i))<=temp) .AND. (d( & i)>zero)) THEN tau = MIN(ten*d(i), sgub) geomavg = .TRUE. @@ -8919,7 +8963,8 @@ SUBROUTINE DLASD4(n, i, d, z, delta, rho, sigma, work, info) dw = dpsi + dphi + temp*temp temp = z(ii)*temp w = w + temp - erretm = eight*(phi-psi) + erretm + two*rhoinv + three*ABS(temp) + erretm = eight*(phi-psi) + erretm + two*rhoinv + & + three*ABS(temp) IF (ABS(w)<=eps*erretm) THEN GO TO 240 END IF @@ -8960,7 +9005,7 @@ SUBROUTINE DLASD4(n, i, d, z, delta, rho, sigma, work, info) IF (orgati) THEN temp1 = z(iim1)/dtiim temp1 = temp1*temp1 - c = (temp-dtiip*(dpsi+dphi)) - (d(iim1)-d(iip1))*(d(iim1)+ & + c = (temp-dtiip*(dpsi+dphi)) - (d(iim1)-d(iip1))*(d(iim1)+ & d(iip1))*temp1 zz(1) = z(iim1)*z(iim1) IF (dpsiABS(prew)/ten) swtch = .TRUE. @@ -9249,9 +9295,9 @@ SUBROUTINE DLASD4(n, i, d, z, delta, rho, sigma, work, info) dw = dpsi + dphi + temp*temp temp = z(ii)*temp w = rhoinv + phi + psi + temp - erretm = eight*(phi-psi) + erretm + two*rhoinv + & + erretm = eight*(phi-psi) + erretm + two*rhoinv + & three*ABS(temp) - IF (w*prew>zero .AND. ABS(w)>ABS(prew)/ten) swtch = .NOT. & + IF (w*prew>zero .AND. ABS(w)>ABS(prew)/ten) swtch = .NOT. & swtch END DO info = 1 @@ -9266,14 +9312,14 @@ SUBROUTINE DLASD5(i, d, z, delta, rho, dsigma, work) REAL(r8_) :: dsigma, rho REAL(r8_) :: d(2), delta(2), work(2), z(2) REAL(r8_) :: zero, one, two, three, four - PARAMETER (zero=0.0_r8_, one=1.0_r8_, two=2.0_r8_, three=3.0_r8_, & + PARAMETER (zero=0.0_r8_, one=1.0_r8_, two=2.0_r8_, three=3.0_r8_, & four=4.0_r8_) REAL(r8_) :: b, c, del, delsq, tau, w INTRINSIC :: ABS, SQRT del = d(2) - d(1) delsq = del*(d(2)+d(1)) IF (i==1) THEN - w = one + four*rho*(z(2)*z(2)/(d(1)+three*d(2))-z(1)*z(1)/( & + w = one + four*rho*(z(2)*z(2)/(d(1)+three*d(2))-z(1)*z(1)/( & three*d(1)+d(2)))/del IF (w>zero) THEN b = delsq + rho*(z(1)*z(1)+z(2)*z(2)) @@ -9318,23 +9364,23 @@ SUBROUTINE DLASD5(i, d, z, delta, rho, dsigma, work) RETURN END SUBROUTINE - SUBROUTINE DLASD6(icompq, nl, nr, sqre, d, vf, vl, alpha, beta, & - idxq, perm, givptr, givcol, ldgcol, givnum, ldgnum, poles, difl, & + SUBROUTINE DLASD6(icompq, nl, nr, sqre, d, vf, vl, alpha, beta, & + idxq, perm, givptr, givcol, ldgcol, givnum, ldgnum, poles, difl, & difr, z, k, c, s, work, iwork, info) USE GALAHAD_KINDS - INTEGER(ip_) :: givptr, icompq, info, k, ldgcol, ldgnum, nl, nr, & + INTEGER(ip_) :: givptr, icompq, info, k, ldgcol, ldgnum, nl, nr, & sqre REAL(r8_) :: alpha, beta, c, s INTEGER(ip_) :: givcol(ldgcol, *), idxq(*), iwork(*), perm(*) - REAL(r8_) :: d(*), difl(*), difr(*), givnum(ldgnum, *), & + REAL(r8_) :: d(*), difl(*), difr(*), givnum(ldgnum, *), & poles(ldgnum, *), vf(*), vl(*), work(*), z(*) REAL(r8_) :: one, zero PARAMETER (one=1.0_r8_, zero=0.0_r8_) - INTEGER(ip_) :: i, idx, idxc, idxp, isigma, ivfw, ivlw, iw, m, n, & + INTEGER(ip_) :: i, idx, idxc, idxp, isigma, ivfw, ivlw, iw, m, n, & n1, n2 REAL(r8_) :: orgnrm - EXTERNAL :: DCOPY, DLAMRG, DLASCL, DLASD7, DLASD8, & - XERBLA + EXTERNAL :: DCOPY, DLAMRG, DLASCL, DLASD7, & + DLASD8, XERBLA INTRINSIC :: ABS, MAX info = 0 n = nl + nr + 1 @@ -9373,11 +9419,11 @@ SUBROUTINE DLASD6(icompq, nl, nr, sqre, d, vf, vl, alpha, beta, & CALL DLASCL('G', 0_ip_, 0_ip_, orgnrm, one, n, 1_ip_, d, n, info) alpha = alpha/orgnrm beta = beta/orgnrm - CALL DLASD7(icompq, nl, nr, sqre, k, d, z, work(iw), vf, & - work(ivfw), vl, work(ivlw), alpha, beta, work(isigma), iwork(idx), & - iwork(idxp), idxq, perm, givptr, givcol, ldgcol, givnum, ldgnum, & - c, s, info) - CALL DLASD8(icompq, k, d, z, vf, vl, difl, difr, ldgnum, & + CALL DLASD7(icompq, nl, nr, sqre, k, d, z, work(iw), vf, & + work(ivfw), vl, work(ivlw), alpha, beta, work(isigma), & + iwork(idx), iwork(idxp), idxq, perm, givptr, givcol, ldgcol, & + givnum, ldgnum, c, s, info) + CALL DLASD8(icompq, k, d, z, vf, vl, difl, difr, ldgnum, & work(isigma), work(iw), info) IF (info/=0) THEN RETURN @@ -9393,20 +9439,20 @@ SUBROUTINE DLASD6(icompq, nl, nr, sqre, d, vf, vl, alpha, beta, & RETURN END SUBROUTINE - SUBROUTINE DLASD7(icompq, nl, nr, sqre, k, d, z, zw, vf, vfw, vl, & - vlw, alpha, beta, dsigma, idx, idxp, idxq, perm, givptr, givcol, & + SUBROUTINE DLASD7(icompq, nl, nr, sqre, k, d, z, zw, vf, vfw, vl, & + vlw, alpha, beta, dsigma, idx, idxp, idxq, perm, givptr, givcol, & ldgcol, givnum, ldgnum, c, s, info) USE GALAHAD_KINDS - INTEGER(ip_) :: givptr, icompq, info, k, ldgcol, ldgnum, nl, nr, & + INTEGER(ip_) :: givptr, icompq, info, k, ldgcol, ldgnum, nl, nr, & sqre REAL(r8_) :: alpha, beta, c, s - INTEGER(ip_) :: givcol(ldgcol, *), idx(*), idxp(*), idxq(*), & + INTEGER(ip_) :: givcol(ldgcol, *), idx(*), idxp(*), idxq(*), & perm(*) - REAL(r8_) :: d(*), dsigma(*), givnum(ldgnum, *), vf(*), vfw(*), & + REAL(r8_) :: d(*), dsigma(*), givnum(ldgnum, *), vf(*), vfw(*), & vl(*), vlw(*), z(*), zw(*) REAL(r8_) :: zero, one, two, eight PARAMETER (zero=0.0_r8_, one=1.0_r8_, two=2.0_r8_, eight=8.0_r8_) - INTEGER(ip_) :: i, idxi, idxj, idxjp, j, jp, jprev, k2, m, n, & + INTEGER(ip_) :: i, idxi, idxj, idxjp, j, jp, jprev, k2, m, n, & nlp1, nlp2 REAL(r8_) :: eps, hlftol, tau, tol, z1 EXTERNAL :: DCOPY, DLAMRG, DROT, XERBLA @@ -9581,11 +9627,11 @@ SUBROUTINE DLASD7(icompq, nl, nr, sqre, k, d, z, zw, vf, vfw, vl, & RETURN END SUBROUTINE - SUBROUTINE DLASD8(icompq, k, d, z, vf, vl, difl, difr, lddifr, & + SUBROUTINE DLASD8(icompq, k, d, z, vf, vl, difl, difr, lddifr, & dsigma, work, info) USE GALAHAD_KINDS INTEGER(ip_) :: icompq, info, k, lddifr - REAL(r8_) :: d(*), difl(*), difr(lddifr, *), dsigma(*), vf(*), & + REAL(r8_) :: d(*), difl(*), difr(lddifr, *), dsigma(*), vf(*), & vl(*), work(*), z(*) REAL(r8_) :: one PARAMETER (one=1.0_r8_) @@ -9629,7 +9675,7 @@ SUBROUTINE DLASD8(icompq, k, d, z, vf, vl, difl, difr, lddifr, & rho = rho*rho CALL DLASET('A', k, 1_ip_, one, one, work(iwk3), k) DO j = 1, k - CALL DLASD4(k, j, dsigma, z, work(iwk1), rho, d(j), work(iwk2), & + CALL DLASD4(k, j, dsigma, z, work(iwk1), rho, d(j), work(iwk2), & info) IF (info/=0) THEN RETURN @@ -9638,11 +9684,11 @@ SUBROUTINE DLASD8(icompq, k, d, z, vf, vl, difl, difr, lddifr, & difl(j) = -work(j) difr(j, 1_ip_) = -work(j+1) DO i = 1, j - 1 - work(iwk3i+i) = work(iwk3i+i)*work(i)*work(iwk2i+i)/ & + work(iwk3i+i) = work(iwk3i+i)*work(i)*work(iwk2i+i)/ & (dsigma(i)-dsigma(j))/(dsigma(i)+dsigma(j)) END DO DO i = j + 1, k - work(iwk3i+i) = work(iwk3i+i)*work(i)*work(iwk2i+i)/ & + work(iwk3i+i) = work(iwk3i+i)*work(i)*work(iwk2i+i)/ & (dsigma(i)-dsigma(j))/(dsigma(i)+dsigma(j)) END DO END DO @@ -9659,10 +9705,11 @@ SUBROUTINE DLASD8(icompq, k, d, z, vf, vl, difl, difr, lddifr, & END IF work(j) = -z(j)/diflj/(dsigma(j)+dj) DO i = 1, j - 1 - work(i) = z(i)/(DLAMC3(dsigma(i),dsigj)-diflj)/ (dsigma(i)+dj) + work(i) = z(i)/(DLAMC3(dsigma(i),dsigj)-diflj)/ & + (dsigma(i)+dj) END DO DO i = j + 1, k - work(i) = z(i)/(DLAMC3(dsigma(i),dsigjp)+difrj)/ & + work(i) = z(i)/(DLAMC3(dsigma(i),dsigjp)+difrj)/ & (dsigma(i)+dj) END DO temp = DNRM2(k, work, 1_ip_) @@ -9677,25 +9724,25 @@ SUBROUTINE DLASD8(icompq, k, d, z, vf, vl, difl, difr, lddifr, & RETURN END SUBROUTINE - SUBROUTINE DLASDA(icompq, smlsiz, n, sqre, d, e, u, ldu, vt, k, & - difl, difr, z, poles, givptr, givcol, ldgcol, perm, givnum, c, s, & + SUBROUTINE DLASDA(icompq, smlsiz, n, sqre, d, e, u, ldu, vt, k, & + difl, difr, z, poles, givptr, givcol, ldgcol, perm, givnum, c, s, & work, iwork, info) USE GALAHAD_KINDS INTEGER(ip_) :: icompq, info, ldgcol, ldu, n, smlsiz, sqre - INTEGER(ip_) :: givcol(ldgcol, *), givptr(*), iwork(*), k(*), & + INTEGER(ip_) :: givcol(ldgcol, *), givptr(*), iwork(*), k(*), & perm(ldgcol, *) - REAL(r8_) :: c(*), d(*), difl(ldu, *), difr(ldu, *), e(*), & - givnum(ldu, *), poles(ldu, *), s(*), u(ldu, *), vt(ldu, *), & + REAL(r8_) :: c(*), d(*), difl(ldu, *), difr(ldu, *), e(*), & + givnum(ldu, *), poles(ldu, *), s(*), u(ldu, *), vt(ldu, *), & work(*), z(ldu, *) REAL(r8_) :: zero, one PARAMETER (zero=0.0_r8_, one=1.0_r8_) - INTEGER(ip_) :: i, i1, ic, idxq, idxqi, im1, inode, itemp, iwk, j, & - lf, ll, lvl, lvl2, m, ncc, nd, ndb1, ndiml, ndimr, nl, nlf, nlp1, & - nlvl, nr, nrf, nrp1, nru, nwork1, nwork2, smlszp, sqrei, vf, vfi, & - vl, vli + INTEGER(ip_) :: i, i1, ic, idxq, idxqi, im1, inode, itemp, iwk, & + j, lf, ll, lvl, lvl2, m, ncc, nd, ndb1, ndiml, ndimr, nl, nlf, & + nlp1, nlvl, nr, nrf, nrp1, nru, nwork1, nwork2, smlszp, sqrei, & + vf, vfi, vl, vli REAL(r8_) :: alpha, beta - EXTERNAL :: DCOPY, DLASD6, DLASDQ, DLASDT, DLASET, & - XERBLA + EXTERNAL :: DCOPY, DLASD6, DLASDQ, DLASDT, & + DLASET, XERBLA info = 0 IF ((icompq<0) .OR. (icompq>1)) THEN info = -1 @@ -9717,10 +9764,10 @@ SUBROUTINE DLASDA(icompq, smlsiz, n, sqre, d, e, u, ldu, vt, k, & m = n + sqre IF (n<=smlsiz) THEN IF (icompq==0) THEN - CALL DLASDQ('U', sqre, n, 0_ip_, 0_ip_, 0_ip_, d, e, vt, ldu, & + CALL DLASDQ('U', sqre, n, 0_ip_, 0_ip_, 0_ip_, d, e, vt, ldu, & u, ldu, u, ldu, work, info) ELSE - CALL DLASDQ('U', sqre, n, m, n, 0_ip_, d, e, vt, ldu, u, ldu, & + CALL DLASDQ('U', sqre, n, m, n, 0_ip_, d, e, vt, ldu, u, ldu, & u, ldu, work, info) END IF RETURN @@ -9737,8 +9784,8 @@ SUBROUTINE DLASDA(icompq, smlsiz, n, sqre, d, e, u, ldu, vt, k, & vl = vf + m nwork1 = vl + m nwork2 = nwork1 + smlszp*smlszp - CALL DLASDT(n, nlvl, nd, iwork(inode), iwork(ndiml), iwork(ndimr), & - smlsiz) + CALL DLASDT(n, nlvl, nd, iwork(inode), iwork(ndiml), & + iwork(ndimr), smlsiz) ndb1 = (nd+1)/2 DO i = ndb1, nd i1 = i - 1 @@ -9754,8 +9801,8 @@ SUBROUTINE DLASDA(icompq, smlsiz, n, sqre, d, e, u, ldu, vt, k, & sqrei = 1 IF (icompq==0) THEN CALL DLASET('A', nlp1, nlp1, zero, one, work(nwork1), smlszp) - CALL DLASDQ('U', sqrei, nl, nlp1, nru, ncc, d(nlf), e(nlf), & - work(nwork1), smlszp, work(nwork2), nl, work(nwork2), nl, & + CALL DLASDQ('U', sqrei, nl, nlp1, nru, ncc, d(nlf), e(nlf), & + work(nwork1), smlszp, work(nwork2), nl, work(nwork2), nl, & work(nwork2), info) itemp = nwork1 + nl*smlszp CALL DCOPY(nlp1, work(nwork1), 1_ip_, work(vfi), 1_ip_) @@ -9763,8 +9810,8 @@ SUBROUTINE DLASDA(icompq, smlsiz, n, sqre, d, e, u, ldu, vt, k, & ELSE CALL DLASET('A', nl, nl, zero, one, u(nlf,1), ldu) CALL DLASET('A', nlp1, nlp1, zero, one, vt(nlf,1), ldu) - CALL DLASDQ('U', sqrei, nl, nlp1, nl, ncc, d(nlf), e(nlf), & - vt(nlf,1), ldu, u(nlf,1), ldu, u(nlf,1), ldu, work(nwork1), & + CALL DLASDQ('U', sqrei, nl, nlp1, nl, ncc, d(nlf), e(nlf), & + vt(nlf,1), ldu, u(nlf,1), ldu, u(nlf,1), ldu, work(nwork1), & info) CALL DCOPY(nlp1, vt(nlf,1), 1_ip_, work(vfi), 1_ip_) CALL DCOPY(nlp1, vt(nlf,nlp1), 1_ip_, work(vli), 1_ip_) @@ -9786,8 +9833,8 @@ SUBROUTINE DLASDA(icompq, smlsiz, n, sqre, d, e, u, ldu, vt, k, & nrp1 = nr + sqrei IF (icompq==0) THEN CALL DLASET('A', nrp1, nrp1, zero, one, work(nwork1), smlszp) - CALL DLASDQ('U', sqrei, nr, nrp1, nru, ncc, d(nrf), e(nrf), & - work(nwork1), smlszp, work(nwork2), nr, work(nwork2), nr, & + CALL DLASDQ('U', sqrei, nr, nrp1, nru, ncc, d(nrf), e(nrf), & + work(nwork1), smlszp, work(nwork2), nr, work(nwork2), nr, & work(nwork2), info) itemp = nwork1 + (nrp1-1)*smlszp CALL DCOPY(nrp1, work(nwork1), 1_ip_, work(vfi), 1_ip_) @@ -9795,8 +9842,8 @@ SUBROUTINE DLASDA(icompq, smlsiz, n, sqre, d, e, u, ldu, vt, k, & ELSE CALL DLASET('A', nr, nr, zero, one, u(nrf,1), ldu) CALL DLASET('A', nrp1, nrp1, zero, one, vt(nrf,1), ldu) - CALL DLASDQ('U', sqrei, nr, nrp1, nr, ncc, d(nrf), e(nrf), & - vt(nrf,1), ldu, u(nrf,1), ldu, u(nrf,1), ldu, work(nwork1), & + CALL DLASDQ('U', sqrei, nr, nrp1, nr, ncc, d(nrf), e(nrf), & + vt(nrf,1), ldu, u(nrf,1), ldu, u(nrf,1), ldu, work(nwork1), & info) CALL DCOPY(nrp1, vt(nrf,1), 1_ip_, work(vfi), 1_ip_) CALL DCOPY(nrp1, vt(nrf,nrp1), 1_ip_, work(vli), 1_ip_) @@ -9836,16 +9883,16 @@ SUBROUTINE DLASDA(icompq, smlsiz, n, sqre, d, e, u, ldu, vt, k, & alpha = d(ic) beta = e(ic) IF (icompq==0) THEN - CALL DLASD6(icompq, nl, nr, sqrei, d(nlf), work(vfi), & - work(vli), alpha, beta, iwork(idxqi), perm, givptr(1), & - givcol, ldgcol, givnum, ldu, poles, difl, difr, z, k(1), & + CALL DLASD6(icompq, nl, nr, sqrei, d(nlf), work(vfi), & + work(vli), alpha, beta, iwork(idxqi), perm, givptr(1), & + givcol, ldgcol, givnum, ldu, poles, difl, difr, z, k(1), & c(1), s(1), work(nwork1), iwork(iwk), info) ELSE j = j - 1 - CALL DLASD6(icompq, nl, nr, sqrei, d(nlf), work(vfi), & - work(vli), alpha, beta, iwork(idxqi), perm(nlf,lvl), & - givptr(j), givcol(nlf,lvl2), ldgcol, givnum(nlf,lvl2), ldu, & - poles(nlf,lvl2), difl(nlf,lvl), difr(nlf,lvl2), z(nlf,lvl), & + CALL DLASD6(icompq, nl, nr, sqrei, d(nlf), work(vfi), & + work(vli), alpha, beta, iwork(idxqi), perm(nlf,lvl), & + givptr(j), givcol(nlf,lvl2), ldgcol, givnum(nlf,lvl2), ldu,& + poles(nlf,lvl2), difl(nlf,lvl), difr(nlf,lvl2), z(nlf,lvl),& k(j), c(j), s(j), work(nwork1), iwork(iwk), info) END IF IF (info/=0) THEN @@ -9856,12 +9903,12 @@ SUBROUTINE DLASDA(icompq, smlsiz, n, sqre, d, e, u, ldu, vt, k, & RETURN END SUBROUTINE - SUBROUTINE DLASDQ(uplo, sqre, n, ncvt, nru, ncc, d, e, vt, ldvt, u, & + SUBROUTINE DLASDQ(uplo, sqre, n, ncvt, nru, ncc, d, e, vt, ldvt, u, & ldu, c, ldc, work, info) USE GALAHAD_KINDS CHARACTER :: uplo INTEGER(ip_) :: info, ldc, ldu, ldvt, n, ncc, ncvt, nru, sqre - REAL(r8_) :: c(ldc, *), d(*), e(*), u(ldu, *), vt(ldvt, *), & + REAL(r8_) :: c(ldc, *), d(*), e(*), u(ldu, *), vt(ldvt, *), & work(*) REAL(r8_) :: zero PARAMETER (zero=0.0_r8_) @@ -9888,12 +9935,12 @@ SUBROUTINE DLASDQ(uplo, sqre, n, ncvt, nru, ncc, d, e, vt, ldvt, u, & info = -5 ELSE IF (ncc<0) THEN info = -6 - ELSE IF ((ncvt==0 .AND. ldvt<1) .OR. (ncvt>0 .AND. ldvt0 .AND. ldvt0 .AND. ldc0 .AND. ldc0) CALL DLASR('L', 'V', 'F', np1, ncvt, work(1), & + IF (ncvt>0) CALL DLASR('L', 'V', 'F', np1, ncvt, work(1), & work(np1), vt, ldvt) END IF IF (iuplo==2) THEN @@ -9949,24 +9996,24 @@ SUBROUTINE DLASDQ(uplo, sqre, n, ncvt, nru, ncc, d, e, vt, ldvt, u, & END IF IF (nru>0) THEN IF (sqre1==0) THEN - CALL DLASR('R', 'V', 'F', nru, n, work(1), work(np1), u, & + CALL DLASR('R', 'V', 'F', nru, n, work(1), work(np1), u, & ldu) ELSE - CALL DLASR('R', 'V', 'F', nru, np1, work(1), work(np1), u, & + CALL DLASR('R', 'V', 'F', nru, np1, work(1), work(np1), u, & ldu) END IF END IF IF (ncc>0) THEN IF (sqre1==0) THEN - CALL DLASR('L', 'V', 'F', n, ncc, work(1), work(np1), c, & + CALL DLASR('L', 'V', 'F', n, ncc, work(1), work(np1), c, & ldc) ELSE - CALL DLASR('L', 'V', 'F', np1, ncc, work(1), work(np1), c, & + CALL DLASR('L', 'V', 'F', np1, ncc, work(1), work(np1), c, & ldc) END IF END IF END IF - CALL DBDSQR('U', n, ncvt, nru, ncc, d, e, vt, ldvt, u, ldu, c, & + CALL DBDSQR('U', n, ncvt, nru, ncc, d, e, vt, ldvt, u, ldu, c, & ldc, work, info) DO i = 1, n isub = i @@ -10068,7 +10115,7 @@ SUBROUTINE DLASQ1(n, d, e, work, info) PARAMETER (zero=0.0_r8_) INTEGER(ip_) :: i, iinfo REAL(r8_) :: eps, scale, safmin, sigmn, sigmx - EXTERNAL :: DCOPY, DLAS2, DLASCL, DLASQ2, DLASRT, & + EXTERNAL :: DCOPY, DLAS2, DLASCL, DLASQ2, DLASRT, & XERBLA REAL(r8_) :: DLAMCH EXTERNAL :: DLAMCH @@ -10107,7 +10154,7 @@ SUBROUTINE DLASQ1(n, d, e, work, info) scale = SQRT(eps/safmin) CALL DCOPY(n, d, 1_ip_, work(1), 2_ip_) CALL DCOPY(n-1, e, 1_ip_, work(2), 2_ip_) - CALL DLASCL('G', 0_ip_, 0_ip_, sigmx, scale, 2*n-1, 1_ip_, work, & + CALL DLASCL('G', 0_ip_, 0_ip_, sigmx, scale, 2*n-1, 1_ip_, work, & 2*n-1, iinfo) DO i = 1, 2*n - 1 work(i) = work(i)**2 @@ -10118,16 +10165,16 @@ SUBROUTINE DLASQ1(n, d, e, work, info) DO i = 1, n d(i) = SQRT(work(i)) END DO - CALL DLASCL('G', 0_ip_, 0_ip_, scale, sigmx, n, 1_ip_, d, n, & + CALL DLASCL('G', 0_ip_, 0_ip_, scale, sigmx, n, 1_ip_, d, n, & iinfo) ELSE IF (info==2) THEN DO i = 1, n d(i) = SQRT(work(2*i-1)) e(i) = SQRT(work(2*i)) END DO - CALL DLASCL('G', 0_ip_, 0_ip_, scale, sigmx, n, 1_ip_, d, n, & + CALL DLASCL('G', 0_ip_, 0_ip_, scale, sigmx, n, 1_ip_, d, n, & iinfo) - CALL DLASCL('G', 0_ip_, 0_ip_, scale, sigmx, n, 1_ip_, e, n, & + CALL DLASCL('G', 0_ip_, 0_ip_, scale, sigmx, n, 1_ip_, e, n, & iinfo) END IF RETURN @@ -10140,13 +10187,13 @@ SUBROUTINE DLASQ2(n, z, info) REAL(r8_) :: cbias PARAMETER (cbias=1.50_r8_) REAL(r8_) :: zero, half, one, two, four, hundrd - PARAMETER (zero=0.0_r8_, half=0.5_r8_, one=1.0_r8_, two=2.0_r8_, & + PARAMETER (zero=0.0_r8_, half=0.5_r8_, one=1.0_r8_, two=2.0_r8_, & four=4.0_r8_, hundrd=100.0_r8_) LOGICAL :: ieee - INTEGER(ip_) :: i0, i1, i4, iinfo, ipn4, iter, iwhila, iwhilb, k, & + INTEGER(ip_) :: i0, i1, i4, iinfo, ipn4, iter, iwhila, iwhilb, k, & kmin, n0, n1, nbig, ndiv, nfail, pp, splt, ttype - REAL(r8_) :: d, dee, deemin, desig, dmin, dmin1, dmin2, dn, dn1, & - dn2, e, emax, emin, eps, g, oldemn, qmax, qmin, s, safmin, sigma, & + REAL(r8_) :: d, dee, deemin, desig, dmin, dmin1, dmin2, dn, dn1, & + dn2, e, emax, emin, eps, g, oldemn, qmax, qmin, s, safmin, sigma,& t, tau, temp, tol, tol2, trace, zmax, tempe, tempq EXTERNAL :: DLASQ3, DLASRT, XERBLA INTEGER(ip_) :: ILAENV @@ -10288,7 +10335,7 @@ SUBROUTINE DLASQ2(n, z, info) z(i4-2*pp-2) = d z(i4-2*pp) = zero d = z(i4+1) - ELSE IF (safmin*z(i4+1)n0) GO TO 150 - CALL DLASQ3(i0, n0, z, pp, dmin, sigma, desig, qmax, nfail, & + CALL DLASQ3(i0, n0, z, pp, dmin, sigma, desig, qmax, nfail, & iter, ndiv, ieee, ttype, dmin1, dmin2, dn, dn1, dn2, g, tau) pp = 1 - pp IF (pp==0 .AND. n0-i0>=3) THEN @@ -10462,18 +10509,18 @@ SUBROUTINE DLASQ2(n, z, info) RETURN END SUBROUTINE - SUBROUTINE DLASQ3(i0, n0, z, pp, dmin, sigma, desig, qmax, nfail, & + SUBROUTINE DLASQ3(i0, n0, z, pp, dmin, sigma, desig, qmax, nfail, & iter, ndiv, ieee, ttype, dmin1, dmin2, dn, dn1, dn2, g, tau) USE GALAHAD_KINDS LOGICAL :: ieee INTEGER(ip_) :: i0, iter, n0, ndiv, nfail, pp - REAL(r8_) :: desig, dmin, dmin1, dmin2, dn, dn1, dn2, g, qmax, & + REAL(r8_) :: desig, dmin, dmin1, dmin2, dn, dn1, dn2, g, qmax, & sigma, tau REAL(r8_) :: z(*) REAL(r8_) :: cbias PARAMETER (cbias=1.50_r8_) REAL(r8_) :: zero, qurtr, half, one, two, hundrd - PARAMETER (zero=0.0_r8_, qurtr=0.250_r8_, half=0.5_r8_, & + PARAMETER (zero=0.0_r8_, qurtr=0.250_r8_, half=0.5_r8_, & one=1.0_r8_, two=2.0_r8_, hundrd=100.0_r8_) INTEGER(ip_) :: ipn4, j4, n0in, nn, ttype REAL(r8_) :: eps, s, t, temp, tol, tol2 @@ -10491,7 +10538,7 @@ SUBROUTINE DLASQ3(i0, n0, z, pp, dmin, sigma, desig, qmax, nfail, & IF (n0==i0) GO TO 20 nn = 4*n0 + pp IF (n0==(i0+1)) GO TO 40 - IF (z(nn-5)>tol2*(sigma+z(nn-3)) .AND. z(nn-2*pp-4)>tol2*z(nn-7) & + IF (z(nn-5)>tol2*(sigma+z(nn-3)) .AND. z(nn-2*pp-4)>tol2*z(nn-7) & ) GO TO 30 20 CONTINUE z(4*n0-3) = z(4*n0+pp-3) + sigma @@ -10551,16 +10598,16 @@ SUBROUTINE DLASQ3(i0, n0, z, pp, dmin, sigma, desig, qmax, nfail, & dmin = -zero END IF END IF - CALL DLASQ4(i0, n0, z, pp, n0in, dmin, dmin1, dmin2, dn, dn1, dn2, & - tau, ttype, g) + CALL DLASQ4(i0, n0, z, pp, n0in, dmin, dmin1, dmin2, dn, dn1, & + dn2, tau, ttype, g) 70 CONTINUE - CALL DLASQ5(i0, n0, z, pp, tau, sigma, dmin, dmin1, dmin2, dn, & + CALL DLASQ5(i0, n0, z, pp, tau, sigma, dmin, dmin1, dmin2, dn, & dn1, dn2, ieee, eps) ndiv = ndiv + (n0-i0+2) iter = iter + 1 IF (dmin>=zero .AND. dmin1>=zero) THEN GO TO 90 - ELSE IF (dminzero .AND. z(4*(n0- & + ELSE IF (dminzero .AND. z(4*(n0- & 1)-pp)ABS(u22) .OR. (two*smlnum)*ABS( & + IF ((two*smlnum)*ABS(btmp(2))>ABS(u22) .OR. (two*smlnum)*ABS( & btmp(1))>ABS(u11)) THEN scale = half/MAX(ABS(btmp(1)), ABS(btmp(2))) btmp(1) = btmp(1)*scale @@ -11762,9 +11810,9 @@ SUBROUTINE DLASY2(ltranl, ltranr, isgn, n1, n2, tl, ldtl, tr, ldtr, & END IF RETURN 50 CONTINUE - smin = MAX(ABS(tr(1,1)), ABS(tr(1,2)), ABS(tr(2,1)), ABS(tr( & + smin = MAX(ABS(tr(1,1)), ABS(tr(1,2)), ABS(tr(2,1)), ABS(tr( & 2_ip_, 2_ip_))) - smin = MAX(smin, ABS(tl(1,1)), ABS(tl(1,2)), ABS(tl( 2_ip_, & + smin = MAX(smin, ABS(tl(1,1)), ABS(tl(1,2)), ABS(tl( 2_ip_, & 1_ip_)), ABS(tl(2,2))) smin = MAX(eps*smin, smlnum) btmp(1) = zero @@ -11816,7 +11864,7 @@ SUBROUTINE DLASY2(ltranl, ltranr, isgn, n1, n2, tl, ldtl, tr, ldtr, & btmp(i) = btmp(ipsv) btmp(ipsv) = temp END IF - IF (jpsv/=i) CALL DSWAP( 4_ip_, t16(1,jpsv), 1_ip_, t16(1,i), & + IF (jpsv/=i) CALL DSWAP( 4_ip_, t16(1,jpsv), 1_ip_, t16(1,i), & 1_ip_) jpiv(i) = jpsv IF (ABS(t16(i,i))ABS(t16(1, 1_ip_)) .OR. & - (eight*smlnum)*ABS(btmp(2))>ABS(t16( 2_ip_, 2_ip_)) .OR. & - (eight*smlnum)*ABS(btmp(3))>ABS(t16( 3_ip_, 3_ip_)) .OR. & + IF ((eight*smlnum)*ABS(btmp(1))>ABS(t16(1, 1_ip_)) .OR. & + (eight*smlnum)*ABS(btmp(2))>ABS(t16( 2_ip_, 2_ip_)) .OR. & + (eight*smlnum)*ABS(btmp(3))>ABS(t16( 3_ip_, 3_ip_)) .OR. & (eight*smlnum)*ABS(btmp(4))>ABS(t16(4,4))) THEN - scale = (one/eight)/MAX(ABS(btmp(1)), ABS(btmp(2)), ABS(btmp(3 & + scale = (one/eight)/MAX(ABS(btmp(1)), ABS(btmp(2)), ABS(btmp(3 & )), ABS(btmp(4))) btmp(1) = btmp(1)*scale btmp(2) = btmp(2)*scale @@ -11880,7 +11928,7 @@ SUBROUTINE DLASYF(uplo, n, nb, kb, a, lda, ipiv, w, ldw, info) PARAMETER (zero=0.0_r8_, one=1.0_r8_) REAL(r8_) :: eight, sevten PARAMETER (eight=8.0_r8_, sevten=17.0_r8_) - INTEGER(ip_) :: imax, j, jb, jj, jmax, jp, k, kk, kkw, kp, kstep, & + INTEGER(ip_) :: imax, j, jb, jj, jmax, jp, k, kk, kkw, kp, kstep, & kw REAL(r8_) :: absakk, alpha, colmax, d11, d21, d22, r1, rowmax, t LOGICAL :: LSAME @@ -11896,8 +11944,8 @@ SUBROUTINE DLASYF(uplo, n, nb, kb, a, lda, ipiv, w, ldw, info) kw = nb + k - n IF ((k<=n-nb+1 .AND. nb1) THEN @@ -11914,9 +11962,9 @@ SUBROUTINE DLASYF(uplo, n, nb, kb, a, lda, ipiv, w, ldw, info) kp = k ELSE CALL DCOPY(imax, a(1,imax), 1_ip_, w(1,kw-1), 1_ip_) - CALL DCOPY(k-imax, a(imax,imax+1), lda, w(imax+1,kw-1), & + CALL DCOPY(k-imax, a(imax,imax+1), lda, w(imax+1,kw-1), & 1_ip_) - IF (k=nb .AND. nbn) GO TO 90 CALL DCOPY(n-k+1, a(k,k), 1_ip_, w(k,k), 1_ip_) - CALL DGEMV('No transpose', n-k+1, k-1, -one, a(k,1), lda, w(k, & + CALL DGEMV('No transpose', n-k+1, k-1, -one, a(k,1), lda, w(k, & 1), ldw, one, w(k,k), 1_ip_) kstep = 1 absakk = ABS(w(k,k)) @@ -12018,9 +12066,9 @@ SUBROUTINE DLASYF(uplo, n, nb, kb, a, lda, ipiv, w, ldw, info) kp = k ELSE CALL DCOPY(imax-k, a(imax,k), lda, w(k,k+1), 1_ip_) - CALL DCOPY(n-imax+1, a(imax,imax), 1_ip_, w(imax,k+1), & + CALL DCOPY(n-imax+1, a(imax,imax), 1_ip_, w(imax,k+1), & 1_ip_) - CALL DGEMV('No transpose', n-k+1, k-1, -one, a(k,1), lda, & + CALL DGEMV('No transpose', n-k+1, k-1, -one, a(k,1), lda, & w(imax,1), ldw, one, w(k,k+1), 1_ip_) jmax = k - 1 + IDAMAX(imax-k, w(k,k+1), 1_ip_) rowmax = ABS(w(jmax,k+1)) @@ -12042,7 +12090,7 @@ SUBROUTINE DLASYF(uplo, n, nb, kb, a, lda, ipiv, w, ldw, info) IF (kp/=kk) THEN a(kp, kp) = a(kk, kk) CALL DCOPY(kp-kk-1, a(kk+1,kk), 1_ip_, a(kp,kk+1), lda) - IF (kp1) CALL DSWAP(k-1, a(kk,1), lda, a(kp,1), lda) CALL DSWAP(kk, w(kk,1), ldw, w(kp,1), ldw) @@ -12082,12 +12130,12 @@ SUBROUTINE DLASYF(uplo, n, nb, kb, a, lda, ipiv, w, ldw, info) DO j = k, n, nb jb = MIN(nb, n-j+1) DO jj = j, j + jb - 1 - CALL DGEMV('No transpose', j+jb-jj, k-1, -one, a(jj,1), lda, & - w(jj,1), ldw, one, a(jj,jj), 1_ip_) + CALL DGEMV('No transpose', j+jb-jj, k-1, -one, a(jj,1), & + lda, w(jj,1), ldw, one, a(jj,jj), 1_ip_) END DO - IF (j+jb<=n) CALL DGEMM('No transpose', 'Transpose', n-j-jb+1, & - jb, k-1, -one, a(j+jb,1), lda, w(j,1), ldw, one, a(j+jb,j), & - lda) + IF (j+jb<=n) CALL DGEMM('No transpose', 'Transpose', & + n-j-jb+1, jb, k-1, -one, a(j+jb,1), lda, w(j,1), ldw, one, & + a(j+jb,j), lda) END DO j = k - 1 120 CONTINUE @@ -12098,7 +12146,8 @@ SUBROUTINE DLASYF(uplo, n, nb, kb, a, lda, ipiv, w, ldw, info) j = j - 1 END IF j = j - 1 - IF (jp/=jj .AND. j>=1) CALL DSWAP(j, a(jp,1), lda, a(jj,1), lda) + IF (jp/=jj .AND. j>=1) CALL DSWAP(j, a(jp,1), lda, a(jj,1), & + lda) IF (j>1) GO TO 120 kb = k - 1 END IF @@ -12124,55 +12173,55 @@ SUBROUTINE DLATRD(uplo, n, nb, a, lda, e, tau, w, ldw) DO i = n, n - nb + 1, -1_ip_ iw = i - n + nb IF (i1) THEN CALL DLARFG(i-1, a(i-1,i), a(1,i), 1_ip_, tau(i-1)) e(i-1) = a(i-1, i) a(i-1, i) = one - CALL DSYMV('Upper', i-1, one, a, lda, a(1,i), 1_ip_, zero, & + CALL DSYMV('Upper', i-1, one, a, lda, a(1,i), 1_ip_, zero, & w(1,iw), 1_ip_) IF (im .OR. nm .OR. nn .OR. m1) THEN - CALL DORGQR(m-1, m-1, m-1, a(2,2), lda, tau, work, -1_ip_, & - iinfo) + CALL DORGQR(m-1, m-1, m-1, a(2,2), lda, tau, work, & + -1_ip_, iinfo) END IF END IF ELSE @@ -12341,8 +12390,8 @@ SUBROUTINE DORGBR(vect, m, n, k, a, lda, tau, work, lwork, info) CALL DORGLQ(m, n, k, a, lda, tau, work, -1_ip_, iinfo) ELSE IF (n>1) THEN - CALL DORGLQ(n-1, n-1, n-1, a(2,2), lda, tau, work, -1_ip_, & - iinfo) + CALL DORGLQ(n-1, n-1, n-1, a(2,2), lda, tau, work, & + -1_ip_, iinfo) END IF END IF END IF @@ -12375,7 +12424,7 @@ SUBROUTINE DORGBR(vect, m, n, k, a, lda, tau, work, lwork, info) a(i, 1_ip_) = zero END DO IF (m>1) THEN - CALL DORGQR(m-1, m-1, m-1, a(2,2), lda, tau, work, lwork, & + CALL DORGQR(m-1, m-1, m-1, a(2,2), lda, tau, work, lwork, & iinfo) END IF END IF @@ -12394,7 +12443,7 @@ SUBROUTINE DORGBR(vect, m, n, k, a, lda, tau, work, lwork, info) a(1, j) = zero END DO IF (n>1) THEN - CALL DORGLQ(n-1, n-1, n-1, a(2,2), lda, tau, work, lwork, & + CALL DORGLQ(n-1, n-1, n-1, a(2,2), lda, tau, work, lwork, & iinfo) END IF END IF @@ -12439,7 +12488,7 @@ SUBROUTINE DORGL2(m, n, k, a, lda, tau, work, info) IF (i0) THEN DO i = ki + 1, 1_ip_, -nb ib = MIN(nb, k-i+1) IF (i+ib<=m) THEN - CALL DLARFT('Forward', 'Rowwise', n-i+1, ib, a(i,i), lda, & + CALL DLARFT('Forward', 'Rowwise', n-i+1, ib, a(i,i), lda, & tau(i), work, ldwork) - CALL DLARFB('Right', 'Transpose', 'Forward', 'Rowwise', & - m-i-ib+1, n-i+1, ib, a(i,i), lda, work, ldwork, a(i+ib,i), & + CALL DLARFB('Right', 'Transpose', 'Forward', 'Rowwise', & + m-i-ib+1, n-i+1, ib, a(i,i), lda, work, ldwork, a(i+ib,i),& lda, work(ib+1), ldwork) END IF CALL DORGL2(ib, n-i+1, ib, a(i,i), lda, tau(i), work, iinfo) @@ -12547,7 +12596,7 @@ SUBROUTINE DORGQL(m, n, k, a, lda, tau, work, lwork, info) REAL(r8_) :: zero PARAMETER (zero=0.0_r8_) LOGICAL :: lquery - INTEGER(ip_) :: i, ib, iinfo, iws, j, kk, l, ldwork, lwkopt, nb, & + INTEGER(ip_) :: i, ib, iinfo, iws, j, kk, l, ldwork, lwkopt, nb, & nbmin, nx EXTERNAL :: DLARFB, DLARFT, DORG2L, XERBLA INTRINSIC :: MAX, MIN @@ -12614,14 +12663,14 @@ SUBROUTINE DORGQL(m, n, k, a, lda, tau, work, lwork, info) DO i = k - kk + 1, k, nb ib = MIN(nb, k-i+1) IF (n-k+i>1) THEN - CALL DLARFT('Backward', 'Columnwise', m-k+i+ib-1, ib, a(1, & + CALL DLARFT('Backward', 'Columnwise', m-k+i+ib-1, ib, a(1, & n-k+i), lda, tau(i), work, ldwork) - CALL DLARFB('Left', 'No transpose', 'Backward', & - 'Columnwise', m-k+i+ib-1, n-k+i-1, ib, a(1,n-k+i), lda, & + CALL DLARFB('Left', 'No transpose', 'Backward', & + 'Columnwise', m-k+i+ib-1, n-k+i-1, ib, a(1,n-k+i), lda, & work, ldwork, a, lda, work(ib+1), ldwork) END IF - CALL DORG2L(m-k+i+ib-1, ib, ib, a(1,n-k+i), lda, tau(i), work, & - iinfo) + CALL DORG2L(m-k+i+ib-1, ib, ib, a(1,n-k+i), lda, tau(i), & + work, iinfo) DO j = n - k + i, n - k + i + ib - 1 DO l = m - k + i + ib, m a(l, j) = zero @@ -12640,7 +12689,7 @@ SUBROUTINE DORGQR(m, n, k, a, lda, tau, work, lwork, info) REAL(r8_) :: zero PARAMETER (zero=0.0_r8_) LOGICAL :: lquery - INTEGER(ip_) :: i, ib, iinfo, iws, j, ki, kk, l, ldwork, lwkopt, & + INTEGER(ip_) :: i, ib, iinfo, iws, j, ki, kk, l, ldwork, lwkopt, & nb, nbmin, nx EXTERNAL :: DLARFB, DLARFT, DORG2R, XERBLA INTRINSIC :: MAX, MIN @@ -12697,17 +12746,17 @@ SUBROUTINE DORGQR(m, n, k, a, lda, tau, work, lwork, info) ELSE kk = 0 END IF - IF (kk0) THEN DO i = ki + 1, 1_ip_, -nb ib = MIN(nb, k-i+1) IF (i+ib<=n) THEN - CALL DLARFT('Forward', 'Columnwise', m-i+1, ib, a(i,i), lda, & - tau(i), work, ldwork) - CALL DLARFB('Left', 'No transpose', 'Forward', 'Columnwise', & - m-i+1, n-i-ib+1, ib, a(i,i), lda, work, ldwork, a(i,i+ib), & - lda, work(ib+1), ldwork) + CALL DLARFT('Forward', 'Columnwise', m-i+1, ib, a(i,i), & + lda, tau(i), work, ldwork) + CALL DLARFB('Left', 'No transpose', 'Forward', & + 'Columnwise', m-i+1, n-i-ib+1, ib, a(i,i), lda, work, & + ldwork, a(i,i+ib), lda, work(ib+1), ldwork) END IF CALL DORG2R(m-i+1, ib, ib, a(i,i), lda, tau(i), work, iinfo) DO j = i, i + ib - 1 @@ -12790,7 +12839,7 @@ SUBROUTINE DORGTR(uplo, n, a, lda, tau, work, lwork, info) a(i, 1_ip_) = zero END DO IF (n>1) THEN - CALL DORGQR(n-1, n-1, n-1, a(2,2), lda, tau, work, lwork, & + CALL DORGQR(n-1, n-1, n-1, a(2,2), lda, tau, work, lwork, & iinfo) END IF END IF @@ -12798,7 +12847,7 @@ SUBROUTINE DORGTR(uplo, n, a, lda, tau, work, lwork, info) RETURN END SUBROUTINE - SUBROUTINE DORM2R(side, trans, m, n, k, a, lda, tau, c, ldc, work, & + SUBROUTINE DORM2R(side, trans, m, n, k, a, lda, tau, c, ldc, work, & info) USE GALAHAD_KINDS CHARACTER :: side, trans @@ -12841,7 +12890,8 @@ SUBROUTINE DORM2R(side, trans, m, n, k, a, lda, tau, c, ldc, work, & RETURN END IF IF (m==0 .OR. n==0 .OR. k==0) RETURN - IF ((left .AND. .NOT. notran) .OR. (.NOT. left .AND. notran)) THEN + IF ((left .AND. .NOT. notran) .OR. (.NOT. left .AND. notran)) & + THEN i1 = 1 i2 = k i3 = 1 @@ -12867,14 +12917,14 @@ SUBROUTINE DORM2R(side, trans, m, n, k, a, lda, tau, c, ldc, work, & END IF aii = a(i, i) a(i, i) = one - CALL DLARF(side, mi, ni, a(i,i), 1_ip_, tau(i), c(ic,jc), ldc, & + CALL DLARF(side, mi, ni, a(i,i), 1_ip_, tau(i), c(ic,jc), ldc, & work) a(i, i) = aii END DO RETURN END SUBROUTINE - SUBROUTINE DORMBR(vect, side, trans, m, n, k, a, lda, tau, c, ldc, & + SUBROUTINE DORMBR(vect, side, trans, m, n, k, a, lda, tau, c, ldc, & work, lwork, info) USE GALAHAD_KINDS CHARACTER :: side, trans, vect @@ -12912,7 +12962,7 @@ SUBROUTINE DORMBR(vect, side, trans, m, n, k, a, lda, tau, c, ldc, & info = -5 ELSE IF (k<0) THEN info = -6 - ELSE IF ((applyq .AND. lda=k) THEN - CALL DORMQR(side, trans, m, n, k, a, lda, tau, c, ldc, work, & + CALL DORMQR(side, trans, m, n, k, a, lda, tau, c, ldc, work, & lwork, iinfo) ELSE IF (nq>1) THEN IF (left) THEN @@ -12965,8 +13015,8 @@ SUBROUTINE DORMBR(vect, side, trans, m, n, k, a, lda, tau, c, ldc, & i1 = 1 i2 = 2 END IF - CALL DORMQR(side, trans, mi, ni, nq-1, a(2,1), lda, tau, c(i1, & - i2), ldc, work, lwork, iinfo) + CALL DORMQR(side, trans, mi, ni, nq-1, a(2,1), lda, tau, & + c(i1,i2), ldc, work, lwork, iinfo) END IF ELSE IF (notran) THEN @@ -12975,7 +13025,7 @@ SUBROUTINE DORMBR(vect, side, trans, m, n, k, a, lda, tau, c, ldc, & transt = 'N' END IF IF (nq>k) THEN - CALL DORMLQ(side, transt, m, n, k, a, lda, tau, c, ldc, work, & + CALL DORMLQ(side, transt, m, n, k, a, lda, tau, c, ldc, work, & lwork, iinfo) ELSE IF (nq>1) THEN IF (left) THEN @@ -12989,7 +13039,7 @@ SUBROUTINE DORMBR(vect, side, trans, m, n, k, a, lda, tau, c, ldc, & i1 = 1 i2 = 2 END IF - CALL DORMLQ(side, transt, mi, ni, nq-1, a(1,2), lda, tau, & + CALL DORMLQ(side, transt, mi, ni, nq-1, a(1,2), lda, tau, & c(i1,i2), ldc, work, lwork, iinfo) END IF END IF @@ -12997,7 +13047,7 @@ SUBROUTINE DORMBR(vect, side, trans, m, n, k, a, lda, tau, c, ldc, & RETURN END SUBROUTINE - SUBROUTINE DORMHR(side, trans, m, n, ilo, ihi, a, lda, tau, c, ldc, & + SUBROUTINE DORMHR(side, trans, m, n, ilo, ihi, a, lda, tau, c, ldc, & work, lwork, info) USE GALAHAD_KINDS CHARACTER :: side, trans @@ -13023,7 +13073,8 @@ SUBROUTINE DORMHR(side, trans, m, n, ilo, ihi, a, lda, tau, c, ldc, & END IF IF (.NOT. left .AND. .NOT. LSAME(side,'R')) THEN info = -1 - ELSE IF (.NOT. LSAME(trans,'N') .AND. .NOT. LSAME(trans,'T')) THEN + ELSE IF (.NOT. LSAME(trans,'N') .AND. .NOT. LSAME(trans,'T')) & + THEN info = -2 ELSE IF (m<0) THEN info = -3 @@ -13070,13 +13121,13 @@ SUBROUTINE DORMHR(side, trans, m, n, ilo, ihi, a, lda, tau, c, ldc, & i1 = 1 i2 = ilo + 1 END IF - CALL DORMQR(side, trans, mi, ni, nh, a(ilo+1,ilo), lda, tau(ilo), & + CALL DORMQR(side, trans, mi, ni, nh, a(ilo+1,ilo), lda, tau(ilo), & c(i1,i2), ldc, work, lwork, iinfo) work(1) = lwkopt RETURN END SUBROUTINE - SUBROUTINE DORML2(side, trans, m, n, k, a, lda, tau, c, ldc, work, & + SUBROUTINE DORML2(side, trans, m, n, k, a, lda, tau, c, ldc, work, & info) USE GALAHAD_KINDS CHARACTER :: side, trans @@ -13119,7 +13170,8 @@ SUBROUTINE DORML2(side, trans, m, n, k, a, lda, tau, c, ldc, work, & RETURN END IF IF (m==0 .OR. n==0 .OR. k==0) RETURN - IF ((left .AND. notran) .OR. (.NOT. left .AND. .NOT. notran)) THEN + IF ((left .AND. notran) .OR. (.NOT. left .AND. .NOT. notran)) & + THEN i1 = 1 i2 = k i3 = 1 @@ -13145,14 +13197,14 @@ SUBROUTINE DORML2(side, trans, m, n, k, a, lda, tau, c, ldc, work, & END IF aii = a(i, i) a(i, i) = one - CALL DLARF(side, mi, ni, a(i,i), lda, tau(i), c(ic,jc), ldc, & + CALL DLARF(side, mi, ni, a(i,i), lda, tau(i), c(ic,jc), ldc, & work) a(i, i) = aii END DO RETURN END SUBROUTINE - SUBROUTINE DORMLQ(side, trans, m, n, k, a, lda, tau, c, ldc, work, & + SUBROUTINE DORMLQ(side, trans, m, n, k, a, lda, tau, c, ldc, work, & lwork, info) USE GALAHAD_KINDS CHARACTER :: side, trans @@ -13162,7 +13214,7 @@ SUBROUTINE DORMLQ(side, trans, m, n, k, a, lda, tau, c, ldc, work, & PARAMETER (nbmax=64, ldt=nbmax+1, tsize=ldt*nbmax) LOGICAL :: left, lquery, notran CHARACTER :: transt - INTEGER(ip_) :: i, i1, i2, i3, ib, ic, iinfo, iwt, jc, ldwork, & + INTEGER(ip_) :: i, i1, i2, i3, ib, ic, iinfo, iwt, jc, ldwork, & lwkopt, mi, nb, nbmin, ni, nq, nw LOGICAL :: LSAME INTEGER(ip_) :: ILAENV @@ -13198,7 +13250,8 @@ SUBROUTINE DORMLQ(side, trans, m, n, k, a, lda, tau, c, ldc, work, & info = -12 END IF IF (info==0) THEN - nb = MIN(nbmax, ILAENV(1_ip_,'DORMLQ',side//trans,m,n,k,-1_ip_)) + nb = MIN(nbmax, ILAENV(1_ip_,'DORMLQ',side//trans,m,n,k, & + -1_ip_)) lwkopt = MAX(1, nw)*nb + tsize work(1) = lwkopt END IF @@ -13217,16 +13270,16 @@ SUBROUTINE DORMLQ(side, trans, m, n, k, a, lda, tau, c, ldc, work, & IF (nb>1 .AND. nb=k) THEN - CALL DORML2(side, trans, m, n, k, a, lda, tau, c, ldc, work, & + CALL DORML2(side, trans, m, n, k, a, lda, tau, c, ldc, work, & iinfo) ELSE iwt = 1 + nw*nb - IF ((left .AND. notran) .OR. (.NOT. left .AND. .NOT. notran)) & + IF ((left .AND. notran) .OR. (.NOT. left .AND. .NOT. notran)) & THEN i1 = 1 i2 = k @@ -13250,7 +13303,7 @@ SUBROUTINE DORMLQ(side, trans, m, n, k, a, lda, tau, c, ldc, work, & END IF DO i = i1, i2, i3 ib = MIN(nb, k-i+1) - CALL DLARFT('Forward', 'Rowwise', nq-i+1, ib, a(i,i), lda, & + CALL DLARFT('Forward', 'Rowwise', nq-i+1, ib, a(i,i), lda, & tau(i), work(iwt), ldt) IF (left) THEN mi = m - i + 1 @@ -13259,7 +13312,7 @@ SUBROUTINE DORMLQ(side, trans, m, n, k, a, lda, tau, c, ldc, work, & ni = n - i + 1 jc = i END IF - CALL DLARFB(side, transt, 'Forward', 'Rowwise', mi, ni, ib, & + CALL DLARFB(side, transt, 'Forward', 'Rowwise', mi, ni, ib, & a(i,i), lda, work(iwt), ldt, c(ic,jc), ldc, work, ldwork) END DO END IF @@ -13267,7 +13320,7 @@ SUBROUTINE DORMLQ(side, trans, m, n, k, a, lda, tau, c, ldc, work, & RETURN END SUBROUTINE - SUBROUTINE DORMQR(side, trans, m, n, k, a, lda, tau, c, ldc, work, & + SUBROUTINE DORMQR(side, trans, m, n, k, a, lda, tau, c, ldc, work, & lwork, info) USE GALAHAD_KINDS CHARACTER :: side, trans @@ -13276,7 +13329,7 @@ SUBROUTINE DORMQR(side, trans, m, n, k, a, lda, tau, c, ldc, work, & INTEGER(ip_) :: nbmax, ldt, tsize PARAMETER (nbmax=64, ldt=nbmax+1, tsize=ldt*nbmax) LOGICAL :: left, lquery, notran - INTEGER(ip_) :: i, i1, i2, i3, ib, ic, iinfo, iwt, jc, ldwork, & + INTEGER(ip_) :: i, i1, i2, i3, ib, ic, iinfo, iwt, jc, ldwork, & lwkopt, mi, nb, nbmin, ni, nq, nw LOGICAL :: LSAME INTEGER(ip_) :: ILAENV @@ -13312,7 +13365,8 @@ SUBROUTINE DORMQR(side, trans, m, n, k, a, lda, tau, c, ldc, work, & info = -12 END IF IF (info==0) THEN - nb = MIN(nbmax, ILAENV(1_ip_,'DORMQR',side//trans,m,n,k,-1_ip_)) + nb = MIN(nbmax, ILAENV(1_ip_,'DORMQR',side//trans,m,n,k, & + -1_ip_)) lwkopt = MAX(1, nw)*nb + tsize work(1) = lwkopt END IF @@ -13331,16 +13385,16 @@ SUBROUTINE DORMQR(side, trans, m, n, k, a, lda, tau, c, ldc, work, & IF (nb>1 .AND. nb=k) THEN - CALL DORM2R(side, trans, m, n, k, a, lda, tau, c, ldc, work, & + CALL DORM2R(side, trans, m, n, k, a, lda, tau, c, ldc, work, & iinfo) ELSE iwt = 1 + nw*nb - IF ((left .AND. .NOT. notran) .OR. (.NOT. left .AND. notran)) & + IF ((left .AND. .NOT. notran) .OR. (.NOT. left .AND. notran)) & THEN i1 = 1 i2 = k @@ -13359,7 +13413,7 @@ SUBROUTINE DORMQR(side, trans, m, n, k, a, lda, tau, c, ldc, work, & END IF DO i = i1, i2, i3 ib = MIN(nb, k-i+1) - CALL DLARFT('Forward', 'Columnwise', nq-i+1, ib, a(i,i), lda, & + CALL DLARFT('Forward', 'Columnwise', nq-i+1, ib, a(i,i), lda, & tau(i), work(iwt), ldt) IF (left) THEN mi = m - i + 1 @@ -13368,7 +13422,7 @@ SUBROUTINE DORMQR(side, trans, m, n, k, a, lda, tau, c, ldc, work, & ni = n - i + 1 jc = i END IF - CALL DLARFB(side, trans, 'Forward', 'Columnwise', mi, ni, ib, & + CALL DLARFB(side, trans, 'Forward', 'Columnwise', mi, ni, ib, & a(i,i), lda, work(iwt), ldt, c(ic,jc), ldc, work, ldwork) END DO END IF @@ -13376,7 +13430,7 @@ SUBROUTINE DORMQR(side, trans, m, n, k, a, lda, tau, c, ldc, work, & RETURN END SUBROUTINE - SUBROUTINE DORMR3(side, trans, m, n, k, l, a, lda, tau, c, ldc, & + SUBROUTINE DORMR3(side, trans, m, n, k, l, a, lda, tau, c, ldc, & work, info) USE GALAHAD_KINDS CHARACTER :: side, trans @@ -13406,7 +13460,7 @@ SUBROUTINE DORMR3(side, trans, m, n, k, l, a, lda, tau, c, ldc, & info = -4 ELSE IF (k<0 .OR. k>nq) THEN info = -5 - ELSE IF (l<0 .OR. (left .AND. (l>m)) .OR. (.NOT. left .AND. (l> & + ELSE IF (l<0 .OR. (left .AND. (l>m)) .OR. (.NOT. left .AND. (l> & n))) THEN info = -6 ELSE IF (ldanq) THEN info = -5 - ELSE IF (l<0 .OR. (left .AND. (l>m)) .OR. (.NOT. left .AND. (l> & + ELSE IF (l<0 .OR. (left .AND. (l>m)) .OR. (.NOT. left .AND. (l> & n))) THEN info = -6 ELSE IF (lda1 .AND. nb=k) THEN - CALL DORMR3(side, trans, m, n, k, l, a, lda, tau, c, ldc, work, & + CALL DORMR3(side, trans, m, n, k, l, a, lda, tau, c, ldc, work, & iinfo) ELSE iwt = 1 + nw*nb - IF ((left .AND. .NOT. notran) .OR. (.NOT. left .AND. notran)) & + IF ((left .AND. .NOT. notran) .OR. (.NOT. left .AND. notran)) & THEN i1 = 1 i2 = k @@ -13559,7 +13613,7 @@ SUBROUTINE DORMRZ(side, trans, m, n, k, l, a, lda, tau, c, ldc, & END IF DO i = i1, i2, i3 ib = MIN(nb, k-i+1) - CALL DLARZT('Backward', 'Rowwise', l, ib, a(i,ja), lda, & + CALL DLARZT('Backward', 'Rowwise', l, ib, a(i,ja), lda, & tau(i), work(iwt), ldt) IF (left) THEN mi = m - i + 1 @@ -13568,7 +13622,7 @@ SUBROUTINE DORMRZ(side, trans, m, n, k, l, a, lda, tau, c, ldc, & ni = n - i + 1 jc = i END IF - CALL DLARZB(side, transt, 'Backward', 'Rowwise', mi, ni, ib, & + CALL DLARZB(side, transt, 'Backward', 'Rowwise', mi, ni, ib, & l, a(i,ja), lda, work(iwt), ldt, c(ic,jc), ldc, work, ldwork) END DO END IF @@ -13616,7 +13670,7 @@ SUBROUTINE DPBTF2(uplo, n, kd, ab, ldab, info) kn = MIN(kd, n-j) IF (kn>0) THEN CALL DSCAL(kn, one/ajj, ab(kd,j+1), kld) - CALL DSYR('Upper', kn, -one, ab(kd,j+1), kld, ab(kd+1,j+1), & + CALL DSYR('Upper', kn, -one, ab(kd,j+1), kld, ab(kd+1,j+1), & kld) END IF END DO @@ -13629,7 +13683,8 @@ SUBROUTINE DPBTF2(uplo, n, kd, ab, ldab, info) kn = MIN(kd, n-j) IF (kn>0) THEN CALL DSCAL(kn, one/ajj, ab(2,j), 1_ip_) - CALL DSYR('Lower', kn, -one, ab(2,j), 1_ip_, ab(1,j+1), kld) + CALL DSYR('Lower', kn, -one, ab(2,j), 1_ip_, ab(1,j+1), & + kld) END IF END DO END IF @@ -13653,7 +13708,7 @@ SUBROUTINE DPBTRF(uplo, n, kd, ab, ldab, info) LOGICAL :: LSAME INTEGER(ip_) :: ILAENV EXTERNAL :: LSAME, ILAENV - EXTERNAL :: DGEMM, DPBTF2, DPOTF2, DSYRK, DTRSM, & + EXTERNAL :: DGEMM, DPBTF2, DPOTF2, DSYRK, DTRSM, & XERBLA INTRINSIC :: MIN info = 0 @@ -13693,9 +13748,10 @@ SUBROUTINE DPBTRF(uplo, n, kd, ab, ldab, info) i2 = MIN(kd-ib, n-i-ib+1) i3 = MIN(ib, n-i-kd+1) IF (i2>0) THEN - CALL DTRSM('Left', 'Upper', 'Transpose', 'Non-unit', ib, & - i2, one, ab(kd+1,i), ldab-1, ab(kd+1-ib,i+ib), ldab-1) - CALL DSYRK('Upper', 'Transpose', i2, ib, -one, & + CALL DTRSM('Left', 'Upper', 'Transpose', 'Non-unit', & + ib, i2, one, ab(kd+1,i), ldab-1, ab(kd+1-ib,i+ib), & + ldab-1) + CALL DSYRK('Upper', 'Transpose', i2, ib, -one, & ab(kd+1-ib,i+ib), ldab-1, one, ab(kd+1,i+ib), ldab-1) END IF IF (i3>0) THEN @@ -13704,12 +13760,12 @@ SUBROUTINE DPBTRF(uplo, n, kd, ab, ldab, info) work(ii, jj) = ab(ii-jj+1, jj+i+kd-1) END DO END DO - CALL DTRSM('Left', 'Upper', 'Transpose', 'Non-unit', ib, & - i3, one, ab(kd+1,i), ldab-1, work, ldwork) - IF (i2>0) CALL DGEMM('Transpose', 'No Transpose', i2, & - i3, ib, -one, ab(kd+1-ib,i+ib), ldab-1, work, ldwork, & + CALL DTRSM('Left', 'Upper', 'Transpose', 'Non-unit', & + ib, i3, one, ab(kd+1,i), ldab-1, work, ldwork) + IF (i2>0) CALL DGEMM('Transpose', 'No Transpose', i2, & + i3, ib, -one, ab(kd+1-ib,i+ib), ldab-1, work, ldwork, & one, ab(1+ib,i+kd), ldab-1) - CALL DSYRK('Upper', 'Transpose', i3, ib, -one, work, & + CALL DSYRK('Upper', 'Transpose', i3, ib, -one, work, & ldwork, one, ab(kd+1,i+kd), ldab-1) DO jj = 1, i3 DO ii = jj, ib @@ -13736,9 +13792,9 @@ SUBROUTINE DPBTRF(uplo, n, kd, ab, ldab, info) i2 = MIN(kd-ib, n-i-ib+1) i3 = MIN(ib, n-i-kd+1) IF (i2>0) THEN - CALL DTRSM('Right', 'Lower', 'Transpose', 'Non-unit', & + CALL DTRSM('Right', 'Lower', 'Transpose', 'Non-unit', & i2, ib, one, ab(1,i), ldab-1, ab(1+ib,i), ldab-1) - CALL DSYRK('Lower', 'No Transpose', i2, ib, -one, & + CALL DSYRK('Lower', 'No Transpose', i2, ib, -one, & ab(1+ib,i), ldab-1, one, ab(1,i+ib), ldab-1) END IF IF (i3>0) THEN @@ -13747,12 +13803,12 @@ SUBROUTINE DPBTRF(uplo, n, kd, ab, ldab, info) work(ii, jj) = ab(kd+1-jj+ii, jj+i-1) END DO END DO - CALL DTRSM('Right', 'Lower', 'Transpose', 'Non-unit', & + CALL DTRSM('Right', 'Lower', 'Transpose', 'Non-unit', & i3, ib, one, ab(1,i), ldab-1, work, ldwork) - IF (i2>0) CALL DGEMM('No transpose', 'Transpose', i3, & - i2, ib, -one, work, ldwork, ab(1+ib,i), ldab-1, one, & + IF (i2>0) CALL DGEMM('No transpose', 'Transpose', i3, & + i2, ib, -one, work, ldwork, ab(1+ib,i), ldab-1, one, & ab(1+kd-ib,i+ib), ldab-1) - CALL DSYRK('Lower', 'No Transpose', i3, ib, -one, work, & + CALL DSYRK('Lower', 'No Transpose', i3, ib, -one, work, & ldwork, one, ab(1,i+kd), ldab-1) DO jj = 1, ib DO ii = 1, MIN(jj, i3) @@ -13802,16 +13858,16 @@ SUBROUTINE DPBTRS(uplo, n, kd, nrhs, ab, ldab, b, ldb, info) IF (n==0 .OR. nrhs==0) RETURN IF (upper) THEN DO j = 1, nrhs - CALL DTBSV('Upper', 'Transpose', 'Non-unit', n, kd, ab, ldab, & + CALL DTBSV('Upper', 'Transpose', 'Non-unit', n, kd, ab, ldab, & b(1,j), 1_ip_) - CALL DTBSV('Upper', 'No transpose', 'Non-unit', n, kd, ab, & + CALL DTBSV('Upper', 'No transpose', 'Non-unit', n, kd, ab, & ldab, b(1,j), 1_ip_) END DO ELSE DO j = 1, nrhs - CALL DTBSV('Lower', 'No transpose', 'Non-unit', n, kd, ab, & + CALL DTBSV('Lower', 'No transpose', 'Non-unit', n, kd, ab, & ldab, b(1,j), 1_ip_) - CALL DTBSV('Lower', 'Transpose', 'Non-unit', n, kd, ab, ldab, & + CALL DTBSV('Lower', 'Transpose', 'Non-unit', n, kd, ab, ldab, & b(1,j), 1_ip_) END DO END IF @@ -13857,7 +13913,7 @@ SUBROUTINE DPOTF2(uplo, n, a, lda, info) ajj = SQRT(ajj) a(j, j) = ajj IF (j=nrhs) THEN CALL DPTTS2(n, nrhs, d, e, b, ldb) @@ -14234,15 +14293,15 @@ SUBROUTINE DSTEQR(compz, n, d, e, z, ldz, work, info) PARAMETER (zero=0.0_r8_, one=1.0_r8_, two=2.0_r8_, three=3.0_r8_) INTEGER(ip_) :: maxit PARAMETER (maxit=30) - INTEGER(ip_) :: i, icompz, ii, iscale, j, jtot, k, l, l1, lend, & + INTEGER(ip_) :: i, icompz, ii, iscale, j, jtot, k, l, l1, lend, & lendm1, lendp1, lendsv, lm1, lsv, m, mm, mm1, nm1, nmaxit - REAL(r8_) :: anorm, b, c, eps, eps2, f, g, p, r, rt1, rt2, s, & + REAL(r8_) :: anorm, b, c, eps, eps2, f, g, p, r, rt1, rt2, s, & safmax, safmin, ssfmax, ssfmin, tst LOGICAL :: LSAME REAL(r8_) :: DLAMCH, DLANST, DLAPY2 EXTERNAL :: LSAME, DLAMCH, DLANST, DLAPY2 - EXTERNAL :: DLAE2, DLAEV2, DLARTG, DLASCL, DLASET, & - DLASR, DLASRT, DSWAP, XERBLA + EXTERNAL :: DLAE2, DLAEV2, DLARTG, DLASCL, & + DLASET, DLASR, DLASRT, DSWAP, XERBLA INTRINSIC :: ABS, MAX, SIGN, SQRT info = 0 IF (LSAME(compz,'N')) THEN @@ -14307,15 +14366,15 @@ SUBROUTINE DSTEQR(compz, n, d, e, z, ldz, work, info) IF (anorm==zero) GO TO 10 IF (anorm>ssfmax) THEN iscale = 1 - CALL DLASCL('G', 0_ip_, 0_ip_, anorm, ssfmax, lend-l+1, 1_ip_, & + CALL DLASCL('G', 0_ip_, 0_ip_, anorm, ssfmax, lend-l+1, 1_ip_, & d(l), n, info) - CALL DLASCL('G', 0_ip_, 0_ip_, anorm, ssfmax, lend-l, 1_ip_, & + CALL DLASCL('G', 0_ip_, 0_ip_, anorm, ssfmax, lend-l, 1_ip_, & e(l), n, info) ELSE IF (anorm0) THEN mm = m - l + 1 - CALL DLASR('R', 'V', 'B', n, mm, work(l), work(n-1+l), z(1,l), & - ldz) + CALL DLASR('R', 'V', 'B', n, mm, work(l), work(n-1+l), z(1, & + l), ldz) END IF d(l) = d(l) - p e(l) = g @@ -14409,7 +14468,7 @@ SUBROUTINE DSTEQR(compz, n, d, e, z, ldz, work, info) CALL DLAEV2(d(l-1), e(l-1), d(l), rt1, rt2, c, s) work(m) = c work(n-1+m) = s - CALL DLASR('R', 'V', 'F', n, 2_ip_, work(m), work(n-1+m), & + CALL DLASR('R', 'V', 'F', n, 2_ip_, work(m), work(n-1+m), & z(1,l-1), ldz) ELSE CALL DLAE2(d(l-1), e(l-1), d(l), rt1, rt2) @@ -14447,8 +14506,8 @@ SUBROUTINE DSTEQR(compz, n, d, e, z, ldz, work, info) END DO IF (icompz>0) THEN mm = l - m + 1 - CALL DLASR('R', 'V', 'F', n, mm, work(m), work(n-1+m), z(1,m), & - ldz) + CALL DLASR('R', 'V', 'F', n, mm, work(m), work(n-1+m), z(1, & + m), ldz) END IF d(l) = d(l) - p e(lm1) = g @@ -14461,15 +14520,15 @@ SUBROUTINE DSTEQR(compz, n, d, e, z, ldz, work, info) END IF 140 CONTINUE IF (iscale==1) THEN - CALL DLASCL('G', 0_ip_, 0_ip_, ssfmax, anorm, lendsv-lsv+1, & + CALL DLASCL('G', 0_ip_, 0_ip_, ssfmax, anorm, lendsv-lsv+1, & 1_ip_, d(lsv), n, info) - CALL DLASCL('G', 0_ip_, 0_ip_, ssfmax, anorm, lendsv-lsv, 1_ip_, & - e(lsv), n, info) + CALL DLASCL('G', 0_ip_, 0_ip_, ssfmax, anorm, lendsv-lsv, & + 1_ip_, e(lsv), n, info) ELSE IF (iscale==2) THEN - CALL DLASCL('G', 0_ip_, 0_ip_, ssfmin, anorm, lendsv-lsv+1, & + CALL DLASCL('G', 0_ip_, 0_ip_, ssfmin, anorm, lendsv-lsv+1, & 1_ip_, d(lsv), n, info) - CALL DLASCL('G', 0_ip_, 0_ip_, ssfmin, anorm, lendsv-lsv, 1_ip_, & - e(lsv), n, info) + CALL DLASCL('G', 0_ip_, 0_ip_, ssfmin, anorm, lendsv-lsv, & + 1_ip_, e(lsv), n, info) END IF IF (jtotssfmax)) THEN iscale = 1 - CALL DLASCL('G', 0_ip_, 0_ip_, anorm, ssfmax, lend-l+1, 1_ip_, & + CALL DLASCL('G', 0_ip_, 0_ip_, anorm, ssfmax, lend-l+1, 1_ip_, & d(l), n, info) - CALL DLASCL('G', 0_ip_, 0_ip_, anorm, ssfmax, lend-l, 1_ip_, & + CALL DLASCL('G', 0_ip_, 0_ip_, anorm, ssfmax, lend-l, 1_ip_, & e(l), n, info) ELSE IF (anorm1 .AND. nbnb) THEN - CALL DLASYF(uplo, k, nb, kb, a, lda, ipiv, work, ldwork, & + CALL DLASYF(uplo, k, nb, kb, a, lda, ipiv, work, ldwork, & iinfo) ELSE CALL DSYTF2(uplo, k, a, lda, ipiv, iinfo) @@ -15521,7 +15584,7 @@ SUBROUTINE DSYTRF(uplo, n, a, lda, ipiv, work, lwork, info) 20 CONTINUE IF (k>n) GO TO 40 IF (k<=n-nb) THEN - CALL DLASYF(uplo, n-k+1, nb, kb, a(k,k), lda, ipiv(k), work, & + CALL DLASYF(uplo, n-k+1, nb, kb, a(k,k), lda, ipiv(k), work, & ldwork, iinfo) ELSE CALL DSYTF2(uplo, n-k+1, a(k,k), lda, ipiv(k), iinfo) @@ -15583,16 +15646,16 @@ SUBROUTINE DSYTRS(uplo, n, nrhs, a, lda, ipiv, b, ldb, info) IF (ipiv(k)>0) THEN kp = ipiv(k) IF (kp/=k) CALL DSWAP(nrhs, b(k,1), ldb, b(kp,1), ldb) - CALL DGER(k-1, nrhs, -one, a(1,k), 1_ip_, b(k,1), ldb, b(1,1), & - ldb) + CALL DGER(k-1, nrhs, -one, a(1,k), 1_ip_, b(k,1), ldb, b(1, & + 1), ldb) CALL DSCAL(nrhs, one/a(k,k), b(k,1), ldb) k = k - 1 ELSE kp = -ipiv(k) IF (kp/=k-1) CALL DSWAP(nrhs, b(k-1,1), ldb, b(kp,1), ldb) - CALL DGER(k-2, nrhs, -one, a(1,k), 1_ip_, b(k,1), ldb, b(1,1), & - ldb) - CALL DGER(k-2, nrhs, -one, a(1,k-1), 1_ip_, b(k-1,1), ldb, & + CALL DGER(k-2, nrhs, -one, a(1,k), 1_ip_, b(k,1), ldb, b(1, & + 1), ldb) + CALL DGER(k-2, nrhs, -one, a(1,k-1), 1_ip_, b(k-1,1), ldb, & b(1,1), ldb) akm1k = a(k-1, k) akm1 = a(k-1, k-1)/akm1k @@ -15612,15 +15675,15 @@ SUBROUTINE DSYTRS(uplo, n, nrhs, a, lda, ipiv, b, ldb, info) 40 CONTINUE IF (k>n) GO TO 50 IF (ipiv(k)>0) THEN - CALL DGEMV('Transpose', k-1, nrhs, -one, b, ldb, a(1,k), & + CALL DGEMV('Transpose', k-1, nrhs, -one, b, ldb, a(1,k), & 1_ip_, one, b(k,1), ldb) kp = ipiv(k) IF (kp/=k) CALL DSWAP(nrhs, b(k,1), ldb, b(kp,1), ldb) k = k + 1 ELSE - CALL DGEMV('Transpose', k-1, nrhs, -one, b, ldb, a(1,k), & + CALL DGEMV('Transpose', k-1, nrhs, -one, b, ldb, a(1,k), & 1_ip_, one, b(k,1), ldb) - CALL DGEMV('Transpose', k-1, nrhs, -one, b, ldb, a(1,k+1), & + CALL DGEMV('Transpose', k-1, nrhs, -one, b, ldb, a(1,k+1), & 1_ip_, one, b(k+1,1), ldb) kp = -ipiv(k) IF (kp/=k) CALL DSWAP(nrhs, b(k,1), ldb, b(kp,1), ldb) @@ -15635,7 +15698,7 @@ SUBROUTINE DSYTRS(uplo, n, nrhs, a, lda, ipiv, b, ldb, info) IF (ipiv(k)>0) THEN kp = ipiv(k) IF (kp/=k) CALL DSWAP(nrhs, b(k,1), ldb, b(kp,1), ldb) - IF (k0) THEN - IF (k=3) THEN IF (t(here-1,here-2)/=zero) nbnext = 2 END IF - CALL DLAEXC(wantq, n, t, ldt, q, ldq, here-nbnext, nbnext, & + CALL DLAEXC(wantq, n, t, ldt, q, ldq, here-nbnext, nbnext, & nbf, work, info) IF (info/=0) THEN ilst = here @@ -15814,20 +15877,20 @@ SUBROUTINE DTREXC(compq, n, t, ldt, q, ldq, ifst, ilst, work, info) IF (here>=3) THEN IF (t(here-1,here-2)/=zero) nbnext = 2 END IF - CALL DLAEXC(wantq, n, t, ldt, q, ldq, here-nbnext, nbnext, & + CALL DLAEXC(wantq, n, t, ldt, q, ldq, here-nbnext, nbnext, & 1_ip_, work, info) IF (info/=0) THEN ilst = here RETURN END IF IF (nbnext==1) THEN - CALL DLAEXC(wantq, n, t, ldt, q, ldq, here, nbnext, 1_ip_, & + CALL DLAEXC(wantq, n, t, ldt, q, ldq, here, nbnext, 1_ip_, & work, info) here = here - 1 ELSE IF (t(here,here-1)==zero) nbnext = 1 IF (nbnext==2) THEN - CALL DLAEXC(wantq, n, t, ldt, q, ldq, here-1, 2_ip_, & + CALL DLAEXC(wantq, n, t, ldt, q, ldq, here-1, 2_ip_, & 1_ip_, work, info) IF (info/=0) THEN ilst = here @@ -15835,9 +15898,9 @@ SUBROUTINE DTREXC(compq, n, t, ldt, q, ldq, ifst, ilst, work, info) END IF here = here - 2 ELSE - CALL DLAEXC(wantq, n, t, ldt, q, ldq, here, 1_ip_, 1_ip_, & + CALL DLAEXC(wantq, n, t, ldt, q, ldq, here, 1_ip_, 1_ip_, & work, info) - CALL DLAEXC(wantq, n, t, ldt, q, ldq, here-1, 1_ip_, & + CALL DLAEXC(wantq, n, t, ldt, q, ldq, here-1, 1_ip_, & 1_ip_, work, info) here = here - 2 END IF @@ -15865,7 +15928,7 @@ SUBROUTINE DTRTRS(uplo, trans, diag, n, nrhs, a, lda, b, ldb, info) nounit = LSAME(diag, 'N') IF (.NOT. LSAME(uplo,'U') .AND. .NOT. LSAME(uplo,'L')) THEN info = -1 - ELSE IF (.NOT. LSAME(trans,'N') .AND. .NOT. LSAME(trans,'T') & + ELSE IF (.NOT. LSAME(trans,'N') .AND. .NOT. LSAME(trans,'T') & .AND. .NOT. LSAME(trans,'C')) THEN info = -2 ELSE IF (.NOT. nounit .AND. .NOT. LSAME(diag,'U')) THEN @@ -15890,7 +15953,7 @@ SUBROUTINE DTRTRS(uplo, trans, diag, n, nrhs, a, lda, b, ldb, info) END DO END IF info = 0 - CALL DTRSM('Left', uplo, trans, diag, n, nrhs, one, a, lda, b, & + CALL DTRSM('Left', uplo, trans, diag, n, nrhs, one, a, lda, b, & ldb) RETURN END SUBROUTINE @@ -15902,7 +15965,7 @@ SUBROUTINE DTZRZF(m, n, a, lda, tau, work, lwork, info) REAL(r8_) :: zero PARAMETER (zero=0.0_r8_) LOGICAL :: lquery - INTEGER(ip_) :: i, ib, iws, ki, kk, ldwork, lwkmin, lwkopt, m1, & + INTEGER(ip_) :: i, ib, iws, ki, kk, ldwork, lwkmin, lwkopt, m1, & mu, nb, nbmin, nx EXTERNAL :: XERBLA, DLARZB, DLARZT, DLATRZ INTRINSIC :: MAX, MIN @@ -15955,7 +16018,7 @@ SUBROUTINE DTZRZF(m, n, a, lda, tau, work, lwork, info) iws = ldwork*nb IF (lwork1) THEN - CALL DLARZT('Backward', 'Rowwise', n-m, ib, a(i,m1), lda, & + CALL DLARZT('Backward', 'Rowwise', n-m, ib, a(i,m1), lda, & tau(i), work, ldwork) - CALL DLARZB('Right', 'No transpose', 'Backward', 'Rowwise', & - i-1, n-i+1, ib, n-m, a(i,m1), lda, work, ldwork, a(1,i), & + CALL DLARZB('Right', 'No transpose', 'Backward', 'Rowwise', & + i-1, n-i+1, ib, n-m, a(i,m1), lda, work, ldwork, a(1,i), & lda, work(ib+1), ldwork) END IF END DO @@ -16039,8 +16102,8 @@ INTEGER(ip_) FUNCTION ILAENV(ispec, name, opts, n1, n2, n3, n4) INTRINSIC :: CHAR, ICHAR, INT, MIN, REAL INTEGER(ip_) :: IEEECK, IPARMQ, IPARAM2STAGE EXTERNAL :: IEEECK, IPARMQ, IPARAM2STAGE - GO TO (10, 10, 10, 80, 90, 100, 110, 120, 130, 140, 150, 160, 160, & - 160, 160, 160) ispec + GO TO (10, 10, 10, 80, 90, 100, 110, 120, 130, 140, 150, 160, & + 160, 160, 160, 160) ispec ILAENV = -1 RETURN 10 CONTINUE @@ -16057,12 +16120,12 @@ INTEGER(ip_) FUNCTION ILAENV(ispec, name, opts, n1, n2, n3, n4) END DO END IF ELSE IF (iz==233 .OR. iz==169) THEN - IF ((ic>=129 .AND. ic<=137) .OR. (ic>=145 .AND. ic<=153) .OR. & + IF ((ic>=129 .AND. ic<=137) .OR. (ic>=145 .AND. ic<=153) .OR. & (ic>=162 .AND. ic<=169)) THEN subnam(1:1) = CHAR(ic+64) DO i = 2, 6 ic = ICHAR(subnam(i:i)) - IF ((ic>=129 .AND. ic<=137) .OR. (ic>=145 .AND. ic<=153) & + IF ((ic>=129 .AND. ic<=137) .OR. (ic>=145 .AND. ic<=153) & .OR. (ic>=162 .AND. ic<=169)) subnam(i:i) = CHAR(ic+64) END DO END IF @@ -16099,7 +16162,7 @@ INTEGER(ip_) FUNCTION ILAENV(ispec, name, opts, n1, n2, n3, n4) ELSE nb = 64 END IF - ELSE IF (c3=='QRF' .OR. c3=='RQF' .OR. c3=='LQF' .OR. & + ELSE IF (c3=='QRF' .OR. c3=='RQF' .OR. c3=='LQF' .OR. & c3=='QLF') THEN IF (sname) THEN nb = 32 @@ -16211,24 +16274,24 @@ INTEGER(ip_) FUNCTION ILAENV(ispec, name, opts, n1, n2, n3, n4) END IF ELSE IF (sname .AND. c2=='OR') THEN IF (c3(1:1)=='G') THEN - IF (c4=='QR' .OR. c4=='RQ' .OR. c4=='LQ' .OR. c4=='QL' .OR. & + IF (c4=='QR' .OR. c4=='RQ' .OR. c4=='LQ' .OR. c4=='QL' .OR. & c4=='HR' .OR. c4=='TR' .OR. c4=='BR') THEN nb = 32 END IF ELSE IF (c3(1:1)=='M') THEN - IF (c4=='QR' .OR. c4=='RQ' .OR. c4=='LQ' .OR. c4=='QL' .OR. & + IF (c4=='QR' .OR. c4=='RQ' .OR. c4=='LQ' .OR. c4=='QL' .OR. & c4=='HR' .OR. c4=='TR' .OR. c4=='BR') THEN nb = 32 END IF END IF ELSE IF (cname .AND. c2=='UN') THEN IF (c3(1:1)=='G') THEN - IF (c4=='QR' .OR. c4=='RQ' .OR. c4=='LQ' .OR. c4=='QL' .OR. & + IF (c4=='QR' .OR. c4=='RQ' .OR. c4=='LQ' .OR. c4=='QL' .OR. & c4=='HR' .OR. c4=='TR' .OR. c4=='BR') THEN nb = 32 END IF ELSE IF (c3(1:1)=='M') THEN - IF (c4=='QR' .OR. c4=='RQ' .OR. c4=='LQ' .OR. c4=='QL' .OR. & + IF (c4=='QR' .OR. c4=='RQ' .OR. c4=='LQ' .OR. c4=='QL' .OR. & c4=='HR' .OR. c4=='TR' .OR. c4=='BR') THEN nb = 32 END IF @@ -16306,7 +16369,8 @@ INTEGER(ip_) FUNCTION ILAENV(ispec, name, opts, n1, n2, n3, n4) 60 CONTINUE nbmin = 2 IF (c2=='GE') THEN - IF (c3=='QRF' .OR. c3=='RQF' .OR. c3=='LQF' .OR. c3=='QLF') THEN + IF (c3=='QRF' .OR. c3=='RQF' .OR. c3=='LQF' .OR. c3=='QLF') & + THEN IF (sname) THEN nbmin = 2 ELSE @@ -16347,24 +16411,24 @@ INTEGER(ip_) FUNCTION ILAENV(ispec, name, opts, n1, n2, n3, n4) END IF ELSE IF (sname .AND. c2=='OR') THEN IF (c3(1:1)=='G') THEN - IF (c4=='QR' .OR. c4=='RQ' .OR. c4=='LQ' .OR. c4=='QL' .OR. & + IF (c4=='QR' .OR. c4=='RQ' .OR. c4=='LQ' .OR. c4=='QL' .OR. & c4=='HR' .OR. c4=='TR' .OR. c4=='BR') THEN nbmin = 2 END IF ELSE IF (c3(1:1)=='M') THEN - IF (c4=='QR' .OR. c4=='RQ' .OR. c4=='LQ' .OR. c4=='QL' .OR. & + IF (c4=='QR' .OR. c4=='RQ' .OR. c4=='LQ' .OR. c4=='QL' .OR. & c4=='HR' .OR. c4=='TR' .OR. c4=='BR') THEN nbmin = 2 END IF END IF ELSE IF (cname .AND. c2=='UN') THEN IF (c3(1:1)=='G') THEN - IF (c4=='QR' .OR. c4=='RQ' .OR. c4=='LQ' .OR. c4=='QL' .OR. & + IF (c4=='QR' .OR. c4=='RQ' .OR. c4=='LQ' .OR. c4=='QL' .OR. & c4=='HR' .OR. c4=='TR' .OR. c4=='BR') THEN nbmin = 2 END IF ELSE IF (c3(1:1)=='M') THEN - IF (c4=='QR' .OR. c4=='RQ' .OR. c4=='LQ' .OR. c4=='QL' .OR. & + IF (c4=='QR' .OR. c4=='RQ' .OR. c4=='LQ' .OR. c4=='QL' .OR. & c4=='HR' .OR. c4=='TR' .OR. c4=='BR') THEN nbmin = 2 END IF @@ -16380,7 +16444,8 @@ INTEGER(ip_) FUNCTION ILAENV(ispec, name, opts, n1, n2, n3, n4) 70 CONTINUE nx = 0 IF (c2=='GE') THEN - IF (c3=='QRF' .OR. c3=='RQF' .OR. c3=='LQF' .OR. c3=='QLF') THEN + IF (c3=='QRF' .OR. c3=='RQF' .OR. c3=='LQF' .OR. c3=='QLF') & + THEN IF (sname) THEN nx = 128 ELSE @@ -16409,14 +16474,14 @@ INTEGER(ip_) FUNCTION ILAENV(ispec, name, opts, n1, n2, n3, n4) END IF ELSE IF (sname .AND. c2=='OR') THEN IF (c3(1:1)=='G') THEN - IF (c4=='QR' .OR. c4=='RQ' .OR. c4=='LQ' .OR. c4=='QL' .OR. & + IF (c4=='QR' .OR. c4=='RQ' .OR. c4=='LQ' .OR. c4=='QL' .OR. & c4=='HR' .OR. c4=='TR' .OR. c4=='BR') THEN nx = 128 END IF END IF ELSE IF (cname .AND. c2=='UN') THEN IF (c3(1:1)=='G') THEN - IF (c4=='QR' .OR. c4=='RQ' .OR. c4=='LQ' .OR. c4=='QL' .OR. & + IF (c4=='QR' .OR. c4=='RQ' .OR. c4=='LQ' .OR. c4=='QL' .OR. & c4=='HR' .OR. c4=='TR' .OR. c4=='BR') THEN nx = 128 END IF @@ -16568,7 +16633,8 @@ INTEGER(ip_) FUNCTION IPARMQ(ispec, name, opts, n, ilo, ihi, lwork) INTEGER(ip_) :: i, ic, iz CHARACTER :: subnam*6 INTRINSIC :: LOG, MAX, MOD, NINT, REAL - IF ((ispec==ishfts) .OR. (ispec==inwin) .OR. (ispec==iacc22)) THEN + IF ((ispec==ishfts) .OR. (ispec==inwin) .OR. (ispec==iacc22)) & + THEN nh = ihi - ilo + 1 ns = 2 IF (nh>=30) ns = 4 @@ -16605,12 +16671,12 @@ INTEGER(ip_) FUNCTION IPARMQ(ispec, name, opts, n, ilo, ihi, lwork) END DO END IF ELSE IF (iz==233 .OR. iz==169) THEN - IF ((ic>=129 .AND. ic<=137) .OR. (ic>=145 .AND. ic<=153) .OR. & - (ic>=162 .AND. ic<=169)) THEN + IF ((ic>=129 .AND. ic<=137) .OR. (ic>=145 .AND. ic<=153) & + .OR. (ic>=162 .AND. ic<=169)) THEN subnam(1:1) = CHAR(ic+64) DO i = 2, 6 ic = ICHAR(subnam(i:i)) - IF ((ic>=129 .AND. ic<=137) .OR. (ic>=145 .AND. ic<=153) & + IF ((ic>=129 .AND. ic<=137) .OR. (ic>=145 .AND. ic<=153) & .OR. (ic>=162 .AND. ic<=169)) subnam(i:i) = CHAR(ic+64) END DO END IF @@ -16638,12 +16704,12 @@ INTEGER(ip_) FUNCTION IPARMQ(ispec, name, opts, n, ilo, ihi, lwork) END IF END FUNCTION - SUBROUTINE SBDSQR(uplo, n, ncvt, nru, ncc, d, e, vt, ldvt, u, ldu, & + SUBROUTINE SBDSQR(uplo, n, ncvt, nru, ncc, d, e, vt, ldvt, u, ldu, & c, ldc, work, info) USE GALAHAD_KINDS CHARACTER :: uplo INTEGER(ip_) :: info, ldc, ldu, ldvt, n, ncc, ncvt, nru - REAL(r4_) :: c(ldc, *), d(*), e(*), u(ldu, *), vt(ldvt, *), & + REAL(r4_) :: c(ldc, *), d(*), e(*), u(ldu, *), vt(ldvt, *), & work(*) REAL(r4_) :: zero PARAMETER (zero=0.0_r4_) @@ -16662,15 +16728,15 @@ SUBROUTINE SBDSQR(uplo, n, ncvt, nru, ncc, d, e, vt, ldvt, u, ldu, & INTEGER(ip_) :: maxitr PARAMETER (maxitr=6) LOGICAL :: lower, rotate - INTEGER(ip_) :: i, idir, isub, iter, iterdivn, j, ll, lll, m, & + INTEGER(ip_) :: i, idir, isub, iter, iterdivn, j, ll, lll, m, & maxitdivn, nm1, nm12, nm13, oldll, oldm - REAL(r4_) :: abse, abss, cosl, cosr, cs, eps, f, g, h, mu, oldcs, & - oldsn, r, shift, sigmn, sigmx, sinl, sinr, sll, smax, smin, sminl, & - sminoa, sn, thresh, tol, tolmul, unfl + REAL(r4_) :: abse, abss, cosl, cosr, cs, eps, f, g, h, mu, oldcs, & + oldsn, r, shift, sigmn, sigmx, sinl, sinr, sll, smax, smin, & + sminl, sminoa, sn, thresh, tol, tolmul, unfl LOGICAL :: LSAME REAL(r4_) :: SLAMCH EXTERNAL :: LSAME, SLAMCH - EXTERNAL :: SLARTG, SLAS2, SLASQ1, SLASR, SLASV2, & + EXTERNAL :: SLARTG, SLAS2, SLASQ1, SLASR, SLASV2, & SROT, SSCAL, SSWAP, XERBLA INTRINSIC :: ABS, MAX, MIN, REAL, SIGN, SQRT info = 0 @@ -16685,12 +16751,12 @@ SUBROUTINE SBDSQR(uplo, n, ncvt, nru, ncc, d, e, vt, ldvt, u, ldu, & info = -4 ELSE IF (ncc<0) THEN info = -5 - ELSE IF ((ncvt==0 .AND. ldvt<1) .OR. (ncvt>0 .AND. ldvt0 .AND. ldvt0 .AND. ldc0 .AND. ldc0) CALL SLASR('R', 'V', 'F', nru, n, work(1), work(n), & + IF (nru>0) CALL SLASR('R', 'V', 'F', nru, n, work(1), work(n), & u, ldu) - IF (ncc>0) CALL SLASR('L', 'V', 'F', n, ncc, work(1), work(n), & + IF (ncc>0) CALL SLASR('L', 'V', 'F', n, ncc, work(1), work(n), & c, ldc) END IF tolmul = MAX(ten, MIN(hndrd,eps**meigth)) @@ -16787,16 +16853,16 @@ SUBROUTINE SBDSQR(uplo, n, ncvt, nru, ncc, d, e, vt, ldvt, u, ldu, & 90 CONTINUE ll = ll + 1 IF (ll==m-1) THEN - CALL SLASV2(d(m-1), e(m-1), d(m), sigmn, sigmx, sinr, cosr, & + CALL SLASV2(d(m-1), e(m-1), d(m), sigmn, sigmx, sinr, cosr, & sinl, cosl) d(m-1) = sigmx e(m-1) = zero d(m) = sigmn - IF (ncvt>0) CALL SROT(ncvt, vt(m-1,1), ldvt, vt(m,1), ldvt, & + IF (ncvt>0) CALL SROT(ncvt, vt(m-1,1), ldvt, vt(m,1), ldvt, & cosr, sinr) - IF (nru>0) CALL SROT(nru, u(1,m-1), 1_ip_, u(1,m), 1_ip_, cosl, & + IF (nru>0) CALL SROT(nru, u(1,m-1), 1_ip_, u(1,m), 1_ip_, cosl, & sinl) - IF (ncc>0) CALL SROT(ncc, c(m-1,1), ldc, c(m,1), ldc, cosl, & + IF (ncc>0) CALL SROT(ncc, c(m-1,1), ldc, c(m,1), ldc, cosl, & sinl) m = m - 2 GO TO 60 @@ -16809,7 +16875,7 @@ SUBROUTINE SBDSQR(uplo, n, ncvt, nru, ncc, d, e, vt, ldvt, u, ldu, & END IF END IF IF (idir==1) THEN - IF (ABS(e(m-1))<=ABS(tol)*ABS(d(m)) .OR. (tol0) CALL SLASR('L', 'V', 'F', m-ll+1, ncvt, work(1), & + IF (ncvt>0) CALL SLASR('L', 'V', 'F', m-ll+1, ncvt, work(1), & work(n), vt(ll,1), ldvt) - IF (nru>0) CALL SLASR('R', 'V', 'F', nru, m-ll+1, & + IF (nru>0) CALL SLASR('R', 'V', 'F', nru, m-ll+1, & work(nm12+1), work(nm13+1), u(1,ll), ldu) - IF (ncc>0) CALL SLASR('L', 'V', 'F', m-ll+1, ncc, & + IF (ncc>0) CALL SLASR('L', 'V', 'F', m-ll+1, ncc, & work(nm12+1), work(nm13+1), c(ll,1), ldc) IF (ABS(e(m-1))<=thresh) e(m-1) = zero ELSE @@ -16900,11 +16966,11 @@ SUBROUTINE SBDSQR(uplo, n, ncvt, nru, ncc, d, e, vt, ldvt, u, ldu, & h = d(ll)*cs d(ll) = h*oldcs e(ll) = h*oldsn - IF (ncvt>0) CALL SLASR('L', 'V', 'B', m-ll+1, ncvt, & + IF (ncvt>0) CALL SLASR('L', 'V', 'B', m-ll+1, ncvt, & work(nm12+1), work(nm13+1), vt(ll,1), ldvt) - IF (nru>0) CALL SLASR('R', 'V', 'B', nru, m-ll+1, work(1), & + IF (nru>0) CALL SLASR('R', 'V', 'B', nru, m-ll+1, work(1), & work(n), u(1,ll), ldu) - IF (ncc>0) CALL SLASR('L', 'V', 'B', m-ll+1, ncc, work(1), & + IF (ncc>0) CALL SLASR('L', 'V', 'B', m-ll+1, ncc, work(1), & work(n), c(ll,1), ldc) IF (ABS(e(ll))<=thresh) e(ll) = zero END IF @@ -16933,11 +16999,11 @@ SUBROUTINE SBDSQR(uplo, n, ncvt, nru, ncc, d, e, vt, ldvt, u, ldu, & work(i-ll+1+nm13) = sinl END DO e(m-1) = f - IF (ncvt>0) CALL SLASR('L', 'V', 'F', m-ll+1, ncvt, work(1), & + IF (ncvt>0) CALL SLASR('L', 'V', 'F', m-ll+1, ncvt, work(1), & work(n), vt(ll,1), ldvt) - IF (nru>0) CALL SLASR('R', 'V', 'F', nru, m-ll+1, & + IF (nru>0) CALL SLASR('R', 'V', 'F', nru, m-ll+1, & work(nm12+1), work(nm13+1), u(1,ll), ldu) - IF (ncc>0) CALL SLASR('L', 'V', 'F', m-ll+1, ncc, & + IF (ncc>0) CALL SLASR('L', 'V', 'F', m-ll+1, ncc, & work(nm12+1), work(nm13+1), c(ll,1), ldc) IF (ABS(e(m-1))<=thresh) e(m-1) = zero ELSE @@ -16965,11 +17031,11 @@ SUBROUTINE SBDSQR(uplo, n, ncvt, nru, ncc, d, e, vt, ldvt, u, ldu, & END DO e(ll) = f IF (ABS(e(ll))<=thresh) e(ll) = zero - IF (ncvt>0) CALL SLASR('L', 'V', 'B', m-ll+1, ncvt, & + IF (ncvt>0) CALL SLASR('L', 'V', 'B', m-ll+1, ncvt, & work(nm12+1), work(nm13+1), vt(ll,1), ldvt) - IF (nru>0) CALL SLASR('R', 'V', 'B', nru, m-ll+1, work(1), & + IF (nru>0) CALL SLASR('R', 'V', 'B', nru, m-ll+1, work(1), & work(n), u(1,ll), ldu) - IF (ncc>0) CALL SLASR('L', 'V', 'B', m-ll+1, ncc, work(1), & + IF (ncc>0) CALL SLASR('L', 'V', 'B', m-ll+1, ncc, work(1), & work(n), c(ll,1), ldc) END IF END IF @@ -16993,9 +17059,9 @@ SUBROUTINE SBDSQR(uplo, n, ncvt, nru, ncc, d, e, vt, ldvt, u, ldu, & IF (isub/=n+1-i) THEN d(isub) = d(n+1-i) d(n+1-i) = smin - IF (ncvt>0) CALL SSWAP(ncvt, vt(isub,1), ldvt, vt(n+1-i,1), & + IF (ncvt>0) CALL SSWAP(ncvt, vt(isub,1), ldvt, vt(n+1-i,1), & ldvt) - IF (nru>0) CALL SSWAP(nru, u(1,isub), 1_ip_, u(1,n+1-i), & + IF (nru>0) CALL SSWAP(nru, u(1,isub), 1_ip_, u(1,n+1-i), & 1_ip_) IF (ncc>0) CALL SSWAP(ncc, c(isub,1), ldc, c(n+1-i,1), ldc) END IF @@ -17054,15 +17120,15 @@ SUBROUTINE SGEBD2(m, n, a, lda, d, e, tauq, taup, work, info) CALL SLARFG(m-i+1, a(i,i), a(MIN(i+1,m),i), 1_ip_, tauq(i)) d(i) = a(i, i) a(i, i) = one - IF (i=n) THEN DO j = i, i + nb - 1 a(j, j) = d(j) @@ -17170,7 +17237,7 @@ SUBROUTINE SGEBRD(m, n, a, lda, d, e, tauq, taup, work, lwork, info) END DO END IF END DO - CALL SGEBD2(m-i+1, n-i+1, a(i,i), lda, d(i), e(i), tauq(i), & + CALL SGEBD2(m-i+1, n-i+1, a(i,i), lda, d(i), e(i), tauq(i), & taup(i), work, iinfo) work(1) = ws RETURN @@ -17204,9 +17271,9 @@ SUBROUTINE SGEHD2(n, ilo, ihi, a, lda, tau, work, info) CALL SLARFG(ihi-i, a(i+1,i), a(MIN(i+2,n),i), 1_ip_, tau(i)) aii = a(i+1, i) a(i+1, i) = one - CALL SLARF('Right', ihi, ihi-i, a(i+1,i), 1_ip_, tau(i), a(1, & + CALL SLARF('Right', ihi, ihi-i, a(i+1,i), 1_ip_, tau(i), a(1, & i+1), lda, work) - CALL SLARF('Left', ihi-i, n-i, a(i+1,i), 1_ip_, tau(i), a(i+1, & + CALL SLARF('Left', ihi-i, n-i, a(i+1,i), 1_ip_, tau(i), a(i+1, & i+1), lda, work) a(i+1, i) = aii END DO @@ -17222,10 +17289,10 @@ SUBROUTINE SGEHRD(n, ilo, ihi, a, lda, tau, work, lwork, info) REAL(r4_) :: zero, one PARAMETER (zero=0.0_r4_, one=1.0_r4_) LOGICAL :: lquery - INTEGER(ip_) :: i, ib, iinfo, iwt, j, ldwork, lwkopt, nb, nbmin, & + INTEGER(ip_) :: i, ib, iinfo, iwt, j, ldwork, lwkopt, nb, nbmin, & nh, nx REAL(r4_) :: ei - EXTERNAL :: SAXPY, SGEHD2, SGEMM, SLAHR2, SLARFB, & + EXTERNAL :: SAXPY, SGEHD2, SGEMM, SLAHR2, SLARFB, & STRMM, XERBLA INTRINSIC :: MAX, MIN INTEGER(ip_) :: ILAENV @@ -17271,7 +17338,7 @@ SUBROUTINE SGEHRD(n, ilo, ihi, a, lda, tau, work, lwork, info) nx = MAX(nb, ILAENV(3_ip_,'SGEHRD',' ',n,ilo,ihi,-1_ip_)) IF (nx=(n*nbmin+tsize)) THEN nb = (lwork-tsize)/n @@ -17288,21 +17355,21 @@ SUBROUTINE SGEHRD(n, ilo, ihi, a, lda, tau, work, lwork, info) iwt = 1 + n*nb DO i = ilo, ihi - 1 - nx, nb ib = MIN(nb, ihi-i) - CALL SLAHR2(ihi, i, ib, a(1,i), lda, tau(i), work(iwt), ldt, & + CALL SLAHR2(ihi, i, ib, a(1,i), lda, tau(i), work(iwt), ldt, & work, ldwork) ei = a(i+ib, i+ib-1) a(i+ib, i+ib-1) = one - CALL SGEMM('No transpose', 'Transpose', ihi, ihi-i-ib+1, ib, & + CALL SGEMM('No transpose', 'Transpose', ihi, ihi-i-ib+1, ib, & -one, work, ldwork, a(i+ib,i), lda, one, a(1,i+ib), lda) a(i+ib, i+ib-1) = ei - CALL STRMM('Right', 'Lower', 'Transpose', 'Unit', i, ib-1, & + CALL STRMM('Right', 'Lower', 'Transpose', 'Unit', i, ib-1, & one, a(i+1,i), lda, work, ldwork) DO j = 0, ib - 2 - CALL SAXPY(i, -one, work(ldwork*j+1), 1_ip_, a(1,i+j+1), & + CALL SAXPY(i, -one, work(ldwork*j+1), 1_ip_, a(1,i+j+1), & 1_ip_) END DO - CALL SLARFB('Left', 'Transpose', 'Forward', 'Columnwise', & - ihi-i, n-i-ib+1, ib, a(i+1,i), lda, work(iwt), ldt, a(i+1, & + CALL SLARFB('Left', 'Transpose', 'Forward', 'Columnwise', & + ihi-i, n-i-ib+1, ib, a(i+1,i), lda, work(iwt), ldt, a(i+1, & i+ib), lda, work, ldwork) END DO END IF @@ -17339,8 +17406,8 @@ SUBROUTINE SGELQ2(m, n, a, lda, tau, work, info) IF (izero .AND. anrmbignum) THEN - CALL SLASCL('G', 0_ip_, 0_ip_, anrm, bignum, m, n, a, lda, info) + CALL SLASCL('G', 0_ip_, 0_ip_, anrm, bignum, m, n, a, lda, & + info) iascl = 2 ELSE IF (anrm==zero) THEN CALL SLASET('F', MAX(m,n), nrhs, zero, zero, b, ldb) @@ -17507,28 +17576,28 @@ SUBROUTINE SGELS(trans, m, n, nrhs, a, lda, b, ldb, work, lwork, & bnrm = SLANGE('M', brow, nrhs, b, ldb, rwork) ibscl = 0 IF (bnrm>zero .AND. bnrmbignum) THEN - CALL SLASCL('G', 0_ip_, 0_ip_, bnrm, bignum, brow, nrhs, b, ldb, & - info) + CALL SLASCL('G', 0_ip_, 0_ip_, bnrm, bignum, brow, nrhs, b, & + ldb, info) ibscl = 2 END IF IF (m>=n) THEN CALL SGEQRF(m, n, a, lda, work(1), work(mn+1), lwork-mn, info) IF (.NOT. tpsd) THEN - CALL SORMQR('Left', 'Transpose', m, nrhs, n, a, lda, work(1), & + CALL SORMQR('Left', 'Transpose', m, nrhs, n, a, lda, work(1), & b, ldb, work(mn+1), lwork-mn, info) - CALL STRTRS('Upper', 'No transpose', 'Non-unit', n, nrhs, a, & + CALL STRTRS('Upper', 'No transpose', 'Non-unit', n, nrhs, a, & lda, b, ldb, info) IF (info>0) THEN RETURN END IF scllen = n ELSE - CALL STRTRS('Upper', 'Transpose', 'Non-unit', n, nrhs, a, lda, & - b, ldb, info) + CALL STRTRS('Upper', 'Transpose', 'Non-unit', n, nrhs, a, & + lda, b, ldb, info) IF (info>0) THEN RETURN END IF @@ -17537,14 +17606,14 @@ SUBROUTINE SGELS(trans, m, n, nrhs, a, lda, b, ldb, work, lwork, & b(i, j) = zero END DO END DO - CALL SORMQR('Left', 'No transpose', m, nrhs, n, a, lda, & + CALL SORMQR('Left', 'No transpose', m, nrhs, n, a, lda, & work(1), b, ldb, work(mn+1), lwork-mn, info) scllen = m END IF ELSE CALL SGELQF(m, n, a, lda, work(1), work(mn+1), lwork-mn, info) IF (.NOT. tpsd) THEN - CALL STRTRS('Lower', 'No transpose', 'Non-unit', m, nrhs, a, & + CALL STRTRS('Lower', 'No transpose', 'Non-unit', m, nrhs, a, & lda, b, ldb, info) IF (info>0) THEN RETURN @@ -17554,14 +17623,14 @@ SUBROUTINE SGELS(trans, m, n, nrhs, a, lda, b, ldb, work, lwork, & b(i, j) = zero END DO END DO - CALL SORMLQ('Left', 'Transpose', n, nrhs, m, a, lda, work(1), & + CALL SORMLQ('Left', 'Transpose', n, nrhs, m, a, lda, work(1), & b, ldb, work(mn+1), lwork-mn, info) scllen = n ELSE - CALL SORMLQ('Left', 'No transpose', n, nrhs, m, a, lda, & + CALL SORMLQ('Left', 'No transpose', n, nrhs, m, a, lda, & work(1), b, ldb, work(mn+1), lwork-mn, info) - CALL STRTRS('Lower', 'Transpose', 'Non-unit', m, nrhs, a, lda, & - b, ldb, info) + CALL STRTRS('Lower', 'Transpose', 'Non-unit', m, nrhs, a, & + lda, b, ldb, info) IF (info>0) THEN RETURN END IF @@ -17569,17 +17638,17 @@ SUBROUTINE SGELS(trans, m, n, nrhs, a, lda, b, ldb, work, lwork, & END IF END IF IF (iascl==1) THEN - CALL SLASCL('G', 0_ip_, 0_ip_, anrm, smlnum, scllen, nrhs, b, & + CALL SLASCL('G', 0_ip_, 0_ip_, anrm, smlnum, scllen, nrhs, b, & ldb, info) ELSE IF (iascl==2) THEN - CALL SLASCL('G', 0_ip_, 0_ip_, anrm, bignum, scllen, nrhs, b, & + CALL SLASCL('G', 0_ip_, 0_ip_, anrm, bignum, scllen, nrhs, b, & ldb, info) END IF IF (ibscl==1) THEN - CALL SLASCL('G', 0_ip_, 0_ip_, smlnum, bnrm, scllen, nrhs, b, & + CALL SLASCL('G', 0_ip_, 0_ip_, smlnum, bnrm, scllen, nrhs, b, & ldb, info) ELSE IF (ibscl==2) THEN - CALL SLASCL('G', 0_ip_, 0_ip_, bignum, bnrm, scllen, nrhs, b, & + CALL SLASCL('G', 0_ip_, 0_ip_, bignum, bnrm, scllen, nrhs, b, & ldb, info) END IF 50 CONTINUE @@ -17587,7 +17656,7 @@ SUBROUTINE SGELS(trans, m, n, nrhs, a, lda, b, ldb, work, lwork, & RETURN END SUBROUTINE - SUBROUTINE SGELSD(m, n, nrhs, a, lda, b, ldb, s, rcond, rank, work, & + SUBROUTINE SGELSD(m, n, nrhs, a, lda, b, ldb, s, rcond, rank, work, & lwork, iwork, info) USE GALAHAD_KINDS INTEGER(ip_) :: info, lda, ldb, lwork, m, n, nrhs, rank @@ -17597,12 +17666,12 @@ SUBROUTINE SGELSD(m, n, nrhs, a, lda, b, ldb, s, rcond, rank, work, & REAL(r4_) :: zero, one, two PARAMETER (zero=0.0_r4_, one=1.0_r4_, two=2.0_r4_) LOGICAL :: lquery - INTEGER(ip_) :: iascl, ibscl, ie, il, itau, itaup, itauq, ldwork, & - liwork, maxmn, maxwrk, minmn, minwrk, mm, mnthr, nlvl, nwork, & + INTEGER(ip_) :: iascl, ibscl, ie, il, itau, itaup, itauq, ldwork, & + liwork, maxmn, maxwrk, minmn, minwrk, mm, mnthr, nlvl, nwork, & smlsiz, wlalsd REAL(r4_) :: anrm, bignum, bnrm, eps, sfmin, smlnum - EXTERNAL :: SGEBRD, SGELQF, SGEQRF, SLABAD, & - SLACPY, SLALSD, SLASCL, SLASET, SORMBR, SORMLQ, & + EXTERNAL :: SGEBRD, SGELQF, SGEQRF, SLABAD, & + SLACPY, SLALSD, SLASCL, SLASET, SORMBR, SORMLQ, & SORMQR, XERBLA INTEGER(ip_) :: ILAENV REAL(r4_) :: SLAMCH, SLANGE @@ -17628,59 +17697,59 @@ SUBROUTINE SGELSD(m, n, nrhs, a, lda, b, ldb, s, rcond, rank, work, & maxwrk = 1 liwork = 1 IF (minmn>0) THEN - smlsiz = ILAENV(9_ip_, 'SGELSD', ' ', 0_ip_, 0_ip_, 0_ip_, & + smlsiz = ILAENV(9_ip_, 'SGELSD', ' ', 0_ip_, 0_ip_, 0_ip_, & 0_ip_) mnthr = ILAENV(6_ip_, 'SGELSD', ' ', m, n, nrhs, -1_ip_) - nlvl = MAX(INT(LOG(REAL(minmn)/REAL(smlsiz+1))/LOG(two))+1, & + nlvl = MAX(INT(LOG(REAL(minmn)/REAL(smlsiz+1))/LOG(two))+1, & 0_ip_) liwork = 3*minmn*nlvl + 11*minmn mm = m IF (m>=n .AND. m>=mnthr) THEN mm = n - maxwrk = MAX(maxwrk, n+n*ILAENV(1_ip_,'SGEQRF',' ',m,n, & + maxwrk = MAX(maxwrk, n+n*ILAENV(1_ip_,'SGEQRF',' ',m,n, & -1_ip_,-1_ip_)) - maxwrk = MAX(maxwrk, n+nrhs*ILAENV(1_ip_,'SORMQR','LT',m, & + maxwrk = MAX(maxwrk, n+nrhs*ILAENV(1_ip_,'SORMQR','LT',m, & nrhs, n,-1_ip_)) END IF IF (m>=n) THEN - maxwrk = MAX(maxwrk, 3*n+(mm+n)*ILAENV(1_ip_,'SGEBRD',' ', & + maxwrk = MAX(maxwrk, 3*n+(mm+n)*ILAENV(1_ip_,'SGEBRD',' ', & mm,n ,-1_ip_,-1_ip_)) - maxwrk = MAX(maxwrk, 3*n+nrhs*ILAENV(1_ip_,'SORMBR','QLT', & + maxwrk = MAX(maxwrk, 3*n+nrhs*ILAENV(1_ip_,'SORMBR','QLT', & mm, nrhs,n,-1_ip_)) - maxwrk = MAX(maxwrk, 3*n+(n-1)*ILAENV(1_ip_,'SORMBR','PLN', & + maxwrk = MAX(maxwrk, 3*n+(n-1)*ILAENV(1_ip_,'SORMBR','PLN', & n, nrhs,n,-1_ip_)) - wlalsd = 9*n + 2*n*smlsiz + 8*n*nlvl + n*nrhs + & + wlalsd = 9*n + 2*n*smlsiz + 8*n*nlvl + n*nrhs + & (smlsiz+1)**2 maxwrk = MAX(maxwrk, 3*n+wlalsd) minwrk = MAX(3*n+mm, 3*n+nrhs, 3*n+wlalsd) END IF IF (n>m) THEN - wlalsd = 9*m + 2*m*smlsiz + 8*m*nlvl + m*nrhs + & + wlalsd = 9*m + 2*m*smlsiz + 8*m*nlvl + m*nrhs + & (smlsiz+1)**2 IF (n>=mnthr) THEN - maxwrk = m + m*ILAENV(1_ip_, 'SGELQF', ' ', m, n, -1_ip_, & + maxwrk = m + m*ILAENV(1_ip_, 'SGELQF', ' ', m, n, -1_ip_, & -1_ip_) - maxwrk = MAX(maxwrk, m*m+4*m+2*m*ILAENV(1_ip_,'SGEBRD', & + maxwrk = MAX(maxwrk, m*m+4*m+2*m*ILAENV(1_ip_,'SGEBRD', & ' ',m ,m,-1_ip_,-1_ip_)) - maxwrk = MAX(maxwrk, m*m+4*m+nrhs*ILAENV(1_ip_,'SORMBR', & + maxwrk = MAX(maxwrk, m*m+4*m+nrhs*ILAENV(1_ip_,'SORMBR', & 'QLT',m,nrhs,m,-1_ip_)) - maxwrk = MAX(maxwrk, m*m+4*m+(m-1)*ILAENV(1_ip_,'SORMBR', & + maxwrk = MAX(maxwrk, m*m+4*m+(m-1)*ILAENV(1_ip_,'SORMBR', & 'PLN',m,nrhs,m,-1_ip_)) IF (nrhs>1) THEN maxwrk = MAX(maxwrk, m*m+m+m*nrhs) ELSE maxwrk = MAX(maxwrk, m*m+2*m) END IF - maxwrk = MAX(maxwrk, m+nrhs*ILAENV(1_ip_,'SORMLQ','LT',n, & + maxwrk = MAX(maxwrk, m+nrhs*ILAENV(1_ip_,'SORMLQ','LT',n, & nrhs,m,-1_ip_)) maxwrk = MAX(maxwrk, m*m+4*m+wlalsd) maxwrk = MAX(maxwrk, 4*m+m*m+MAX(m,2*m-4,nrhs,n-3*m)) ELSE - maxwrk = 3*m + (n+m)*ILAENV(1_ip_, 'SGEBRD', ' ', m, n, & + maxwrk = 3*m + (n+m)*ILAENV(1_ip_, 'SGEBRD', ' ', m, n, & -1_ip_, -1_ip_) - maxwrk = MAX(maxwrk, 3*m+nrhs*ILAENV(1_ip_,'SORMBR','QLT', & - m, nrhs,n,-1_ip_)) - maxwrk = MAX(maxwrk, 3*m+m*ILAENV(1_ip_,'SORMBR','PLN',n, & + maxwrk = MAX(maxwrk, 3*m+nrhs*ILAENV(1_ip_,'SORMBR', & + 'QLT',m, nrhs,n,-1_ip_)) + maxwrk = MAX(maxwrk, 3*m+m*ILAENV(1_ip_,'SORMBR','PLN',n, & nrhs,m,-1_ip_)) maxwrk = MAX(maxwrk, 3*m+wlalsd) END IF @@ -17712,10 +17781,12 @@ SUBROUTINE SGELSD(m, n, nrhs, a, lda, b, ldb, s, rcond, rank, work, & anrm = SLANGE('M', m, n, a, lda, work) iascl = 0 IF (anrm>zero .AND. anrmbignum) THEN - CALL SLASCL('G', 0_ip_, 0_ip_, anrm, bignum, m, n, a, lda, info) + CALL SLASCL('G', 0_ip_, 0_ip_, anrm, bignum, m, n, a, lda, & + info) iascl = 2 ELSE IF (anrm==zero) THEN CALL SLASET('F', MAX(m,n), nrhs, zero, zero, b, ldb) @@ -17726,11 +17797,11 @@ SUBROUTINE SGELSD(m, n, nrhs, a, lda, b, ldb, s, rcond, rank, work, & bnrm = SLANGE('M', m, nrhs, b, ldb, work) ibscl = 0 IF (bnrm>zero .AND. bnrmbignum) THEN - CALL SLASCL('G', 0_ip_, 0_ip_, bnrm, bignum, m, nrhs, b, ldb, & + CALL SLASCL('G', 0_ip_, 0_ip_, bnrm, bignum, m, nrhs, b, ldb, & info) ibscl = 2 END IF @@ -17741,9 +17812,9 @@ SUBROUTINE SGELSD(m, n, nrhs, a, lda, b, ldb, s, rcond, rank, work, & mm = n itau = 1 nwork = itau + n - CALL SGEQRF(m, n, a, lda, work(itau), work(nwork), & + CALL SGEQRF(m, n, a, lda, work(itau), work(nwork), & lwork-nwork+1, info) - CALL SORMQR('L', 'T', m, nrhs, n, a, lda, work(itau), b, ldb, & + CALL SORMQR('L', 'T', m, nrhs, n, a, lda, work(itau), b, ldb, & work(nwork), lwork-nwork+1, info) IF (n>1) THEN CALL SLASET('L', n-1, n-1, zero, zero, a(2,1), lda) @@ -17753,25 +17824,25 @@ SUBROUTINE SGELSD(m, n, nrhs, a, lda, b, ldb, s, rcond, rank, work, & itauq = ie + n itaup = itauq + n nwork = itaup + n - CALL SGEBRD(mm, n, a, lda, s, work(ie), work(itauq), & + CALL SGEBRD(mm, n, a, lda, s, work(ie), work(itauq), & work(itaup), work(nwork), lwork-nwork+1, info) - CALL SORMBR('Q', 'L', 'T', mm, nrhs, n, a, lda, work(itauq), b, & + CALL SORMBR('Q', 'L', 'T', mm, nrhs, n, a, lda, work(itauq), b, & ldb, work(nwork), lwork-nwork+1, info) - CALL SLALSD('U', smlsiz, n, nrhs, s, work(ie), b, ldb, rcond, & + CALL SLALSD('U', smlsiz, n, nrhs, s, work(ie), b, ldb, rcond, & rank, work(nwork), iwork, info) IF (info/=0) THEN GO TO 10 END IF - CALL SORMBR('P', 'L', 'N', n, nrhs, n, a, lda, work(itaup), b, & + CALL SORMBR('P', 'L', 'N', n, nrhs, n, a, lda, work(itaup), b, & ldb, work(nwork), lwork-nwork+1, info) - ELSE IF (n>=mnthr .AND. lwork>=4*m+m*m+MAX(m,2*m-4,nrhs,n-3*m, & + ELSE IF (n>=mnthr .AND. lwork>=4*m+m*m+MAX(m,2*m-4,nrhs,n-3*m, & wlalsd)) THEN ldwork = m - IF (lwork>=MAX(4*m+m*lda+MAX(m,2*m-4,nrhs, n-3*m), & + IF (lwork>=MAX(4*m+m*lda+MAX(m,2*m-4,nrhs, n-3*m), & m*lda+m+m*nrhs,4*m+m*lda+wlalsd)) ldwork = lda itau = 1 nwork = m + 1 - CALL SGELQF(m, n, a, lda, work(itau), work(nwork), & + CALL SGELQF(m, n, a, lda, work(itau), work(nwork), & lwork-nwork+1, info) il = nwork CALL SLACPY('L', m, m, a, lda, work(il), ldwork) @@ -17780,54 +17851,54 @@ SUBROUTINE SGELSD(m, n, nrhs, a, lda, b, ldb, s, rcond, rank, work, & itauq = ie + m itaup = itauq + m nwork = itaup + m - CALL SGEBRD(m, m, work(il), ldwork, s, work(ie), work(itauq), & + CALL SGEBRD(m, m, work(il), ldwork, s, work(ie), work(itauq), & work(itaup), work(nwork), lwork-nwork+1, info) - CALL SORMBR('Q', 'L', 'T', m, nrhs, m, work(il), ldwork, & + CALL SORMBR('Q', 'L', 'T', m, nrhs, m, work(il), ldwork, & work(itauq), b, ldb, work(nwork), lwork-nwork+1, info) - CALL SLALSD('U', smlsiz, m, nrhs, s, work(ie), b, ldb, rcond, & + CALL SLALSD('U', smlsiz, m, nrhs, s, work(ie), b, ldb, rcond, & rank, work(nwork), iwork, info) IF (info/=0) THEN GO TO 10 END IF - CALL SORMBR('P', 'L', 'N', m, nrhs, m, work(il), ldwork, & + CALL SORMBR('P', 'L', 'N', m, nrhs, m, work(il), ldwork, & work(itaup), b, ldb, work(nwork), lwork-nwork+1, info) CALL SLASET('F', n-m, nrhs, zero, zero, b(m+1,1), ldb) nwork = itau + m - CALL SORMLQ('L', 'T', n, nrhs, m, a, lda, work(itau), b, ldb, & + CALL SORMLQ('L', 'T', n, nrhs, m, a, lda, work(itau), b, ldb, & work(nwork), lwork-nwork+1, info) ELSE ie = 1 itauq = ie + m itaup = itauq + m nwork = itaup + m - CALL SGEBRD(m, n, a, lda, s, work(ie), work(itauq), work(itaup), & - work(nwork), lwork-nwork+1, info) - CALL SORMBR('Q', 'L', 'T', m, nrhs, n, a, lda, work(itauq), b, & + CALL SGEBRD(m, n, a, lda, s, work(ie), work(itauq), & + work(itaup), work(nwork), lwork-nwork+1, info) + CALL SORMBR('Q', 'L', 'T', m, nrhs, n, a, lda, work(itauq), b, & ldb, work(nwork), lwork-nwork+1, info) - CALL SLALSD('L', smlsiz, m, nrhs, s, work(ie), b, ldb, rcond, & + CALL SLALSD('L', smlsiz, m, nrhs, s, work(ie), b, ldb, rcond, & rank, work(nwork), iwork, info) IF (info/=0) THEN GO TO 10 END IF - CALL SORMBR('P', 'L', 'N', n, nrhs, m, a, lda, work(itaup), b, & + CALL SORMBR('P', 'L', 'N', n, nrhs, m, a, lda, work(itaup), b, & ldb, work(nwork), lwork-nwork+1, info) END IF IF (iascl==1) THEN - CALL SLASCL('G', 0_ip_, 0_ip_, anrm, smlnum, n, nrhs, b, ldb, & + CALL SLASCL('G', 0_ip_, 0_ip_, anrm, smlnum, n, nrhs, b, ldb, & info) - CALL SLASCL('G', 0_ip_, 0_ip_, smlnum, anrm, minmn, 1_ip_, s, & + CALL SLASCL('G', 0_ip_, 0_ip_, smlnum, anrm, minmn, 1_ip_, s, & minmn, info) ELSE IF (iascl==2) THEN - CALL SLASCL('G', 0_ip_, 0_ip_, anrm, bignum, n, nrhs, b, ldb, & + CALL SLASCL('G', 0_ip_, 0_ip_, anrm, bignum, n, nrhs, b, ldb, & info) - CALL SLASCL('G', 0_ip_, 0_ip_, bignum, anrm, minmn, 1_ip_, s, & + CALL SLASCL('G', 0_ip_, 0_ip_, bignum, anrm, minmn, 1_ip_, s, & minmn, info) END IF IF (ibscl==1) THEN - CALL SLASCL('G', 0_ip_, 0_ip_, smlnum, bnrm, n, nrhs, b, ldb, & + CALL SLASCL('G', 0_ip_, 0_ip_, smlnum, bnrm, n, nrhs, b, ldb, & info) ELSE IF (ibscl==2) THEN - CALL SLASCL('G', 0_ip_, 0_ip_, bignum, bnrm, n, nrhs, b, ldb, & + CALL SLASCL('G', 0_ip_, 0_ip_, bignum, bnrm, n, nrhs, b, ldb, & info) END IF 10 CONTINUE @@ -17836,7 +17907,7 @@ SUBROUTINE SGELSD(m, n, nrhs, a, lda, b, ldb, s, rcond, rank, work, & RETURN END SUBROUTINE - SUBROUTINE SGELSS(m, n, nrhs, a, lda, b, ldb, s, rcond, rank, work, & + SUBROUTINE SGELSS(m, n, nrhs, a, lda, b, ldb, s, rcond, rank, work, & lwork, info) USE GALAHAD_KINDS INTEGER(ip_) :: info, lda, ldb, lwork, m, n, nrhs, rank @@ -17845,15 +17916,15 @@ SUBROUTINE SGELSS(m, n, nrhs, a, lda, b, ldb, s, rcond, rank, work, & REAL(r4_) :: zero, one PARAMETER (zero=0.0_r4_, one=1.0_r4_) LOGICAL :: lquery - INTEGER(ip_) :: bdspac, bl, chunk, i, iascl, ibscl, ie, il, itau, & - itaup, itauq, iwork, ldwork, maxmn, maxwrk, minmn, minwrk, mm, & + INTEGER(ip_) :: bdspac, bl, chunk, i, iascl, ibscl, ie, il, itau, & + itaup, itauq, iwork, ldwork, maxmn, maxwrk, minmn, minwrk, mm, & mnthr - INTEGER(ip_) :: lwork_sgeqrf, lwork_sormqr, lwork_sgebrd, & + INTEGER(ip_) :: lwork_sgeqrf, lwork_sormqr, lwork_sgebrd, & lwork_sormbr, lwork_sorgbr, lwork_sormlq REAL(r4_) :: anrm, bignum, bnrm, eps, sfmin, smlnum, thr REAL(r4_) :: dum(1) - EXTERNAL :: SBDSQR, SCOPY, SGEBRD, SGELQF, SGEMM, & - SGEMV, SGEQRF, SLABAD, SLACPY, SLASCL, SLASET, & + EXTERNAL :: SBDSQR, SCOPY, SGEBRD, SGELQF, SGEMM, & + SGEMV, SGEQRF, SLABAD, SLACPY, SLASCL, SLASET, & SORGBR, SORMBR, SORMLQ, SORMQR, SRSCL, XERBLA INTEGER(ip_) :: ILAENV REAL(r4_) :: SLAMCH, SLANGE @@ -17883,7 +17954,7 @@ SUBROUTINE SGELSS(m, n, nrhs, a, lda, b, ldb, s, rcond, rank, work, & IF (m>=n .AND. m>=mnthr) THEN CALL SGEQRF(m, n, a, lda, dum(1), dum(1), -1_ip_, info) lwork_sgeqrf = dum(1) - CALL SORMQR('L', 'T', m, nrhs, n, a, lda, dum(1), b, ldb, & + CALL SORMQR('L', 'T', m, nrhs, n, a, lda, dum(1), b, ldb, & dum(1), -1_ip_, info) lwork_sormqr = dum(1) mm = n @@ -17892,13 +17963,13 @@ SUBROUTINE SGELSS(m, n, nrhs, a, lda, b, ldb, s, rcond, rank, work, & END IF IF (m>=n) THEN bdspac = MAX(1, 5*n) - CALL SGEBRD(mm, n, a, lda, s, dum(1), dum(1), dum(1), & + CALL SGEBRD(mm, n, a, lda, s, dum(1), dum(1), dum(1), & dum(1), -1_ip_, info) lwork_sgebrd = dum(1) - CALL SORMBR('Q', 'L', 'T', mm, nrhs, n, a, lda, dum(1), b, & + CALL SORMBR('Q', 'L', 'T', mm, nrhs, n, a, lda, dum(1), b, & ldb, dum(1), -1_ip_, info) lwork_sormbr = dum(1) - CALL SORGBR('P', n, n, n, a, lda, dum(1), dum(1), -1_ip_, & + CALL SORGBR('P', n, n, n, a, lda, dum(1), dum(1), -1_ip_, & info) lwork_sorgbr = dum(1) maxwrk = MAX(maxwrk, 3*n+lwork_sgebrd) @@ -17913,19 +17984,19 @@ SUBROUTINE SGELSS(m, n, nrhs, a, lda, b, ldb, s, rcond, rank, work, & bdspac = MAX(1, 5*m) minwrk = MAX(3*m+nrhs, 3*m+n, bdspac) IF (n>=mnthr) THEN - CALL SGEBRD(m, m, a, lda, s, dum(1), dum(1), dum(1), & + CALL SGEBRD(m, m, a, lda, s, dum(1), dum(1), dum(1), & dum(1), -1_ip_, info) lwork_sgebrd = dum(1) - CALL SORMBR('Q', 'L', 'T', m, nrhs, n, a, lda, dum(1), b, & + CALL SORMBR('Q', 'L', 'T', m, nrhs, n, a, lda, dum(1), b, & ldb, dum(1), -1_ip_, info) lwork_sormbr = dum(1) - CALL SORGBR('P', m, m, m, a, lda, dum(1), dum(1), -1_ip_, & + CALL SORGBR('P', m, m, m, a, lda, dum(1), dum(1), -1_ip_, & info) lwork_sorgbr = dum(1) - CALL SORMLQ('L', 'T', n, nrhs, m, a, lda, dum(1), b, ldb, & + CALL SORMLQ('L', 'T', n, nrhs, m, a, lda, dum(1), b, ldb, & dum(1), -1_ip_, info) lwork_sormlq = dum(1) - maxwrk = m + m*ILAENV(1_ip_, 'SGELQF', ' ', m, n, -1_ip_, & + maxwrk = m + m*ILAENV(1_ip_, 'SGELQF', ' ', m, n, -1_ip_, & -1_ip_) maxwrk = MAX(maxwrk, m*m+4*m+lwork_sgebrd) maxwrk = MAX(maxwrk, m*m+4*m+lwork_sormbr) @@ -17938,13 +18009,13 @@ SUBROUTINE SGELSS(m, n, nrhs, a, lda, b, ldb, s, rcond, rank, work, & END IF maxwrk = MAX(maxwrk, m+lwork_sormlq) ELSE - CALL SGEBRD(m, n, a, lda, s, dum(1), dum(1), dum(1), & + CALL SGEBRD(m, n, a, lda, s, dum(1), dum(1), dum(1), & dum(1), -1_ip_, info) lwork_sgebrd = dum(1) - CALL SORMBR('Q', 'L', 'T', m, nrhs, m, a, lda, dum(1), b, & + CALL SORMBR('Q', 'L', 'T', m, nrhs, m, a, lda, dum(1), b, & ldb, dum(1), -1_ip_, info) lwork_sormbr = dum(1) - CALL SORGBR('P', m, n, m, a, lda, dum(1), dum(1), -1_ip_, & + CALL SORGBR('P', m, n, m, a, lda, dum(1), dum(1), -1_ip_, & info) lwork_sorgbr = dum(1) maxwrk = 3*m + lwork_sgebrd @@ -17977,10 +18048,12 @@ SUBROUTINE SGELSS(m, n, nrhs, a, lda, b, ldb, s, rcond, rank, work, & anrm = SLANGE('M', m, n, a, lda, work) iascl = 0 IF (anrm>zero .AND. anrmbignum) THEN - CALL SLASCL('G', 0_ip_, 0_ip_, anrm, bignum, m, n, a, lda, info) + CALL SLASCL('G', 0_ip_, 0_ip_, anrm, bignum, m, n, a, lda, & + info) iascl = 2 ELSE IF (anrm==zero) THEN CALL SLASET('F', MAX(m,n), nrhs, zero, zero, b, ldb) @@ -17991,11 +18064,11 @@ SUBROUTINE SGELSS(m, n, nrhs, a, lda, b, ldb, s, rcond, rank, work, & bnrm = SLANGE('M', m, nrhs, b, ldb, work) ibscl = 0 IF (bnrm>zero .AND. bnrmbignum) THEN - CALL SLASCL('G', 0_ip_, 0_ip_, bnrm, bignum, m, nrhs, b, ldb, & + CALL SLASCL('G', 0_ip_, 0_ip_, bnrm, bignum, m, nrhs, b, ldb, & info) ibscl = 2 END IF @@ -18005,9 +18078,9 @@ SUBROUTINE SGELSS(m, n, nrhs, a, lda, b, ldb, s, rcond, rank, work, & mm = n itau = 1 iwork = itau + n - CALL SGEQRF(m, n, a, lda, work(itau), work(iwork), & + CALL SGEQRF(m, n, a, lda, work(itau), work(iwork), & lwork-iwork+1, info) - CALL SORMQR('L', 'T', m, nrhs, n, a, lda, work(itau), b, ldb, & + CALL SORMQR('L', 'T', m, nrhs, n, a, lda, work(itau), b, ldb, & work(iwork), lwork-iwork+1, info) IF (n>1) CALL SLASET('L', n-1, n-1, zero, zero, a(2,1), lda) END IF @@ -18015,14 +18088,14 @@ SUBROUTINE SGELSS(m, n, nrhs, a, lda, b, ldb, s, rcond, rank, work, & itauq = ie + n itaup = itauq + n iwork = itaup + n - CALL SGEBRD(mm, n, a, lda, s, work(ie), work(itauq), & + CALL SGEBRD(mm, n, a, lda, s, work(ie), work(itauq), & work(itaup), work(iwork), lwork-iwork+1, info) - CALL SORMBR('Q', 'L', 'T', mm, nrhs, n, a, lda, work(itauq), b, & + CALL SORMBR('Q', 'L', 'T', mm, nrhs, n, a, lda, work(itauq), b, & ldb, work(iwork), lwork-iwork+1, info) - CALL SORGBR('P', n, n, n, a, lda, work(itaup), work(iwork), & + CALL SORGBR('P', n, n, n, a, lda, work(itaup), work(iwork), & lwork-iwork+1, info) iwork = ie + n - CALL SBDSQR('U', n, n, 0_ip_, nrhs, s, work(ie), a, lda, dum, & + CALL SBDSQR('U', n, n, 0_ip_, nrhs, s, work(ie), a, lda, dum, & 1_ip_, b, ldb, work(iwork), info) IF (info/=0) GO TO 70 thr = MAX(rcond*s(1), sfmin) @@ -18037,30 +18110,30 @@ SUBROUTINE SGELSS(m, n, nrhs, a, lda, b, ldb, s, rcond, rank, work, & END IF END DO IF (lwork>=ldb*nrhs .AND. nrhs>1) THEN - CALL SGEMM('T', 'N', n, nrhs, n, one, a, lda, b, ldb, zero, & + CALL SGEMM('T', 'N', n, nrhs, n, one, a, lda, b, ldb, zero, & work, ldb) CALL SLACPY('G', n, nrhs, work, ldb, b, ldb) ELSE IF (nrhs>1) THEN chunk = lwork/n DO i = 1, nrhs, chunk bl = MIN(nrhs-i+1, chunk) - CALL SGEMM('T', 'N', n, bl, n, one, a, lda, b(1,i), ldb, & + CALL SGEMM('T', 'N', n, bl, n, one, a, lda, b(1,i), ldb, & zero, work, n) CALL SLACPY('G', n, bl, work, n, b(1,i), ldb) END DO ELSE - CALL SGEMV('T', n, n, one, a, lda, b, 1_ip_, zero, work, & + CALL SGEMV('T', n, n, one, a, lda, b, 1_ip_, zero, work, & 1_ip_) CALL SCOPY(n, work, 1_ip_, b, 1_ip_) END IF - ELSE IF (n>=mnthr .AND. lwork>=4*m+m*m+MAX(m,2*m-4,nrhs,n-3*m)) & + ELSE IF (n>=mnthr .AND. lwork>=4*m+m*m+MAX(m,2*m-4,nrhs,n-3*m)) & THEN ldwork = m - IF (lwork>=MAX(4*m+m*lda+MAX(m,2*m-4,nrhs, n-3*m), & + IF (lwork>=MAX(4*m+m*lda+MAX(m,2*m-4,nrhs, n-3*m), & m*lda+m+m*nrhs)) ldwork = lda itau = 1 iwork = m + 1 - CALL SGELQF(m, n, a, lda, work(itau), work(iwork), & + CALL SGELQF(m, n, a, lda, work(itau), work(iwork), & lwork-iwork+1, info) il = iwork CALL SLACPY('L', m, m, a, lda, work(il), ldwork) @@ -18069,14 +18142,14 @@ SUBROUTINE SGELSS(m, n, nrhs, a, lda, b, ldb, s, rcond, rank, work, & itauq = ie + m itaup = itauq + m iwork = itaup + m - CALL SGEBRD(m, m, work(il), ldwork, s, work(ie), work(itauq), & + CALL SGEBRD(m, m, work(il), ldwork, s, work(ie), work(itauq), & work(itaup), work(iwork), lwork-iwork+1, info) - CALL SORMBR('Q', 'L', 'T', m, nrhs, m, work(il), ldwork, & + CALL SORMBR('Q', 'L', 'T', m, nrhs, m, work(il), ldwork, & work(itauq), b, ldb, work(iwork), lwork-iwork+1, info) - CALL SORGBR('P', m, m, m, work(il), ldwork, work(itaup), & + CALL SORGBR('P', m, m, m, work(il), ldwork, work(itaup), & work(iwork), lwork-iwork+1, info) iwork = ie + m - CALL SBDSQR('U', m, m, 0_ip_, nrhs, s, work(ie), work(il), & + CALL SBDSQR('U', m, m, 0_ip_, nrhs, s, work(ie), work(il), & ldwork, a, lda, b, ldb, work(iwork), info) IF (info/=0) GO TO 70 thr = MAX(rcond*s(1), sfmin) @@ -18092,39 +18165,39 @@ SUBROUTINE SGELSS(m, n, nrhs, a, lda, b, ldb, s, rcond, rank, work, & END DO iwork = ie IF (lwork>=ldb*nrhs+iwork-1 .AND. nrhs>1) THEN - CALL SGEMM('T', 'N', m, nrhs, m, one, work(il), ldwork, b, & + CALL SGEMM('T', 'N', m, nrhs, m, one, work(il), ldwork, b, & ldb, zero, work(iwork), ldb) CALL SLACPY('G', m, nrhs, work(iwork), ldb, b, ldb) ELSE IF (nrhs>1) THEN chunk = (lwork-iwork+1)/m DO i = 1, nrhs, chunk bl = MIN(nrhs-i+1, chunk) - CALL SGEMM('T', 'N', m, bl, m, one, work(il), ldwork, b(1, & + CALL SGEMM('T', 'N', m, bl, m, one, work(il), ldwork, b(1, & i), ldb, zero, work(iwork), m) CALL SLACPY('G', m, bl, work(iwork), m, b(1,i), ldb) END DO ELSE - CALL SGEMV('T', m, m, one, work(il), ldwork, b(1,1), 1_ip_, & + CALL SGEMV('T', m, m, one, work(il), ldwork, b(1,1), 1_ip_, & zero, work(iwork), 1_ip_) CALL SCOPY(m, work(iwork), 1_ip_, b(1,1), 1_ip_) END IF CALL SLASET('F', n-m, nrhs, zero, zero, b(m+1,1), ldb) iwork = itau + m - CALL SORMLQ('L', 'T', n, nrhs, m, a, lda, work(itau), b, ldb, & + CALL SORMLQ('L', 'T', n, nrhs, m, a, lda, work(itau), b, ldb, & work(iwork), lwork-iwork+1, info) ELSE ie = 1 itauq = ie + m itaup = itauq + m iwork = itaup + m - CALL SGEBRD(m, n, a, lda, s, work(ie), work(itauq), work(itaup), & - work(iwork), lwork-iwork+1, info) - CALL SORMBR('Q', 'L', 'T', m, nrhs, n, a, lda, work(itauq), b, & + CALL SGEBRD(m, n, a, lda, s, work(ie), work(itauq), & + work(itaup), work(iwork), lwork-iwork+1, info) + CALL SORMBR('Q', 'L', 'T', m, nrhs, n, a, lda, work(itauq), b, & ldb, work(iwork), lwork-iwork+1, info) - CALL SORGBR('P', m, n, m, a, lda, work(itaup), work(iwork), & + CALL SORGBR('P', m, n, m, a, lda, work(itaup), work(iwork), & lwork-iwork+1, info) iwork = ie + m - CALL SBDSQR('L', m, n, 0_ip_, nrhs, s, work(ie), a, lda, dum, & + CALL SBDSQR('L', m, n, 0_ip_, nrhs, s, work(ie), a, lda, dum, & 1_ip_, b, ldb, work(iwork), info) IF (info/=0) GO TO 70 thr = MAX(rcond*s(1), sfmin) @@ -18139,39 +18212,39 @@ SUBROUTINE SGELSS(m, n, nrhs, a, lda, b, ldb, s, rcond, rank, work, & END IF END DO IF (lwork>=ldb*nrhs .AND. nrhs>1) THEN - CALL SGEMM('T', 'N', n, nrhs, m, one, a, lda, b, ldb, zero, & + CALL SGEMM('T', 'N', n, nrhs, m, one, a, lda, b, ldb, zero, & work, ldb) CALL SLACPY('F', n, nrhs, work, ldb, b, ldb) ELSE IF (nrhs>1) THEN chunk = lwork/n DO i = 1, nrhs, chunk bl = MIN(nrhs-i+1, chunk) - CALL SGEMM('T', 'N', n, bl, m, one, a, lda, b(1,i), ldb, & + CALL SGEMM('T', 'N', n, bl, m, one, a, lda, b(1,i), ldb, & zero, work, n) CALL SLACPY('F', n, bl, work, n, b(1,i), ldb) END DO ELSE - CALL SGEMV('T', m, n, one, a, lda, b, 1_ip_, zero, work, & + CALL SGEMV('T', m, n, one, a, lda, b, 1_ip_, zero, work, & 1_ip_) CALL SCOPY(n, work, 1_ip_, b, 1_ip_) END IF END IF IF (iascl==1) THEN - CALL SLASCL('G', 0_ip_, 0_ip_, anrm, smlnum, n, nrhs, b, ldb, & + CALL SLASCL('G', 0_ip_, 0_ip_, anrm, smlnum, n, nrhs, b, ldb, & info) - CALL SLASCL('G', 0_ip_, 0_ip_, smlnum, anrm, minmn, 1_ip_, s, & + CALL SLASCL('G', 0_ip_, 0_ip_, smlnum, anrm, minmn, 1_ip_, s, & minmn, info) ELSE IF (iascl==2) THEN - CALL SLASCL('G', 0_ip_, 0_ip_, anrm, bignum, n, nrhs, b, ldb, & + CALL SLASCL('G', 0_ip_, 0_ip_, anrm, bignum, n, nrhs, b, ldb, & info) - CALL SLASCL('G', 0_ip_, 0_ip_, bignum, anrm, minmn, 1_ip_, s, & + CALL SLASCL('G', 0_ip_, 0_ip_, bignum, anrm, minmn, 1_ip_, s, & minmn, info) END IF IF (ibscl==1) THEN - CALL SLASCL('G', 0_ip_, 0_ip_, smlnum, bnrm, n, nrhs, b, ldb, & + CALL SLASCL('G', 0_ip_, 0_ip_, smlnum, bnrm, n, nrhs, b, ldb, & info) ELSE IF (ibscl==2) THEN - CALL SLASCL('G', 0_ip_, 0_ip_, bignum, bnrm, n, nrhs, b, ldb, & + CALL SLASCL('G', 0_ip_, 0_ip_, bignum, bnrm, n, nrhs, b, ldb, & info) END IF 70 CONTINUE @@ -18179,7 +18252,7 @@ SUBROUTINE SGELSS(m, n, nrhs, a, lda, b, ldb, s, rcond, rank, work, & RETURN END SUBROUTINE - SUBROUTINE SGELSY(m, n, nrhs, a, lda, b, ldb, jpvt, rcond, rank, & + SUBROUTINE SGELSY(m, n, nrhs, a, lda, b, ldb, jpvt, rcond, rank, & work, lwork, info) USE GALAHAD_KINDS INTEGER(ip_) :: info, lda, ldb, lwork, m, n, nrhs, rank @@ -18191,15 +18264,16 @@ SUBROUTINE SGELSY(m, n, nrhs, a, lda, b, ldb, jpvt, rcond, rank, & REAL(r4_) :: zero, one PARAMETER (zero=0.0_r4_, one=1.0_r4_) LOGICAL :: lquery - INTEGER(ip_) :: i, iascl, ibscl, ismax, ismin, j, lwkmin, lwkopt, & + INTEGER(ip_) :: i, iascl, ibscl, ismax, ismin, j, lwkmin, lwkopt, & mn, nb, nb1, nb2, nb3, nb4 - REAL(r4_) :: anrm, bignum, bnrm, c1, c2, s1, s2, smax, smaxpr, & + REAL(r4_) :: anrm, bignum, bnrm, c1, c2, s1, s2, smax, smaxpr, & smin, sminpr, smlnum, wsize INTEGER(ip_) :: ILAENV REAL(r4_) :: SLAMCH, SLANGE EXTERNAL :: ILAENV, SLAMCH, SLANGE - EXTERNAL :: SCOPY, SGEQP3, SLABAD, SLAIC1, SLASCL, & - SLASET, SORMQR, SORMRZ, STRSM, STZRZF, XERBLA + EXTERNAL :: SCOPY, SGEQP3, SLABAD, SLAIC1, & + SLASCL, SLASET, SORMQR, SORMRZ, STRSM, STZRZF, & + XERBLA INTRINSIC :: ABS, MAX, MIN mn = MIN(m, n) ismin = mn + 1 @@ -18251,10 +18325,12 @@ SUBROUTINE SGELSY(m, n, nrhs, a, lda, b, ldb, jpvt, rcond, rank, & anrm = SLANGE('M', m, n, a, lda, work) iascl = 0 IF (anrm>zero .AND. anrmbignum) THEN - CALL SLASCL('G', 0_ip_, 0_ip_, anrm, bignum, m, n, a, lda, info) + CALL SLASCL('G', 0_ip_, 0_ip_, anrm, bignum, m, n, a, lda, & + info) iascl = 2 ELSE IF (anrm==zero) THEN CALL SLASET('F', MAX(m,n), nrhs, zero, zero, b, ldb) @@ -18264,15 +18340,15 @@ SUBROUTINE SGELSY(m, n, nrhs, a, lda, b, ldb, jpvt, rcond, rank, & bnrm = SLANGE('M', m, nrhs, b, ldb, work) ibscl = 0 IF (bnrm>zero .AND. bnrmbignum) THEN - CALL SLASCL('G', 0_ip_, 0_ip_, bnrm, bignum, m, nrhs, b, ldb, & + CALL SLASCL('G', 0_ip_, 0_ip_, bnrm, bignum, m, nrhs, b, ldb, & info) ibscl = 2 END IF - CALL SGEQP3(m, n, a, lda, jpvt, work(1), work(mn+1), lwork-mn, & + CALL SGEQP3(m, n, a, lda, jpvt, work(1), work(mn+1), lwork-mn, & info) wsize = mn + work(mn+1) work(ismin) = one @@ -18289,9 +18365,9 @@ SUBROUTINE SGELSY(m, n, nrhs, a, lda, b, ldb, jpvt, rcond, rank, & 10 CONTINUE IF (rank1) .AND. (nb=n .AND. minmn>0) THEN - mnthr = ILAENV(6_ip_, 'SGESVD', jobu//jobvt, m, n, 0_ip_, & + mnthr = ILAENV(6_ip_, 'SGESVD', jobu//jobvt, m, n, 0_ip_, & 0_ip_) bdspac = 5*n CALL SGEQRF(m, n, a, lda, dum(1), dum(1), -1_ip_, ierr) @@ -18646,20 +18722,20 @@ SUBROUTINE SGESVD(jobu, jobvt, m, n, a, lda, s, u, ldu, vt, ldvt, & lwork_sorgqr_n = INT(dum(1)) CALL SORGQR(m, m, n, a, lda, dum(1), dum(1), -1_ip_, ierr) lwork_sorgqr_m = INT(dum(1)) - CALL SGEBRD(n, n, a, lda, s, dum(1), dum(1), dum(1), dum(1), & + CALL SGEBRD(n, n, a, lda, s, dum(1), dum(1), dum(1), dum(1), & -1_ip_, ierr) lwork_sgebrd = INT(dum(1)) - CALL SORGBR('P', n, n, n, a, lda, dum(1), dum(1), -1_ip_, & + CALL SORGBR('P', n, n, n, a, lda, dum(1), dum(1), -1_ip_, & ierr) lwork_sorgbr_p = INT(dum(1)) - CALL SORGBR('Q', n, n, n, a, lda, dum(1), dum(1), -1_ip_, & + CALL SORGBR('Q', n, n, n, a, lda, dum(1), dum(1), -1_ip_, & ierr) lwork_sorgbr_q = INT(dum(1)) IF (m>=mnthr) THEN IF (wntun) THEN maxwrk = n + lwork_sgeqrf maxwrk = MAX(maxwrk, 3*n+lwork_sgebrd) - IF (wntvo .OR. wntvas) maxwrk = MAX(maxwrk, & + IF (wntvo .OR. wntvas) maxwrk = MAX(maxwrk, & 3*n+lwork_sorgbr_p) maxwrk = MAX(maxwrk, bdspac) minwrk = MAX(4*n, bdspac) @@ -18734,18 +18810,18 @@ SUBROUTINE SGESVD(jobu, jobvt, m, n, a, lda, s, u, ldu, vt, ldvt, & minwrk = MAX(3*n+m, bdspac) END IF ELSE - CALL SGEBRD(m, n, a, lda, s, dum(1), dum(1), dum(1), dum(1), & - -1_ip_, ierr) + CALL SGEBRD(m, n, a, lda, s, dum(1), dum(1), dum(1), & + dum(1), -1_ip_, ierr) lwork_sgebrd = INT(dum(1)) maxwrk = 3*n + lwork_sgebrd IF (wntus .OR. wntuo) THEN - CALL SORGBR('Q', m, n, n, a, lda, dum(1), dum(1), -1_ip_, & + CALL SORGBR('Q', m, n, n, a, lda, dum(1), dum(1), -1_ip_, & ierr) lwork_sorgbr_q = INT(dum(1)) maxwrk = MAX(maxwrk, 3*n+lwork_sorgbr_q) END IF IF (wntua) THEN - CALL SORGBR('Q', m, m, n, a, lda, dum(1), dum(1), -1_ip_, & + CALL SORGBR('Q', m, m, n, a, lda, dum(1), dum(1), -1_ip_, & ierr) lwork_sorgbr_q = INT(dum(1)) maxwrk = MAX(maxwrk, 3*n+lwork_sorgbr_q) @@ -18757,7 +18833,7 @@ SUBROUTINE SGESVD(jobu, jobvt, m, n, a, lda, s, u, ldu, vt, ldvt, & minwrk = MAX(3*n+m, bdspac) END IF ELSE IF (minmn>0) THEN - mnthr = ILAENV(6_ip_, 'SGESVD', jobu//jobvt, m, n, 0_ip_, & + mnthr = ILAENV(6_ip_, 'SGESVD', jobu//jobvt, m, n, 0_ip_, & 0_ip_) bdspac = 5*m CALL SGELQF(m, n, a, lda, dum(1), dum(1), -1_ip_, ierr) @@ -18766,7 +18842,7 @@ SUBROUTINE SGESVD(jobu, jobvt, m, n, a, lda, s, u, ldu, vt, ldvt, & lwork_sorglq_n = INT(dum(1)) CALL SORGLQ(m, n, m, a, lda, dum(1), dum(1), -1_ip_, ierr) lwork_sorglq_m = INT(dum(1)) - CALL SGEBRD(m, m, a, lda, s, dum(1), dum(1), dum(1), dum(1), & + CALL SGEBRD(m, m, a, lda, s, dum(1), dum(1), dum(1), dum(1), & -1_ip_, ierr) lwork_sgebrd = INT(dum(1)) CALL SORGBR('P', m, m, m, a, n, dum(1), dum(1), -1_ip_, ierr) @@ -18777,7 +18853,7 @@ SUBROUTINE SGESVD(jobu, jobvt, m, n, a, lda, s, u, ldu, vt, ldvt, & IF (wntvn) THEN maxwrk = m + lwork_sgelqf maxwrk = MAX(maxwrk, 3*m+lwork_sgebrd) - IF (wntuo .OR. wntuas) maxwrk = MAX(maxwrk, & + IF (wntuo .OR. wntuas) maxwrk = MAX(maxwrk, & 3*m+lwork_sorgbr_q) maxwrk = MAX(maxwrk, bdspac) minwrk = MAX(4*m, bdspac) @@ -18853,18 +18929,18 @@ SUBROUTINE SGESVD(jobu, jobvt, m, n, a, lda, s, u, ldu, vt, ldvt, & minwrk = MAX(3*m+n, bdspac) END IF ELSE - CALL SGEBRD(m, n, a, lda, s, dum(1), dum(1), dum(1), dum(1), & - -1_ip_, ierr) + CALL SGEBRD(m, n, a, lda, s, dum(1), dum(1), dum(1), & + dum(1), -1_ip_, ierr) lwork_sgebrd = INT(dum(1)) maxwrk = 3*m + lwork_sgebrd IF (wntvs .OR. wntvo) THEN - CALL SORGBR('P', m, n, m, a, n, dum(1), dum(1), -1_ip_, & + CALL SORGBR('P', m, n, m, a, n, dum(1), dum(1), -1_ip_, & ierr) lwork_sorgbr_p = INT(dum(1)) maxwrk = MAX(maxwrk, 3*m+lwork_sorgbr_p) END IF IF (wntva) THEN - CALL SORGBR('P', n, n, m, a, n, dum(1), dum(1), -1_ip_, & + CALL SORGBR('P', n, n, m, a, n, dum(1), dum(1), -1_ip_, & ierr) lwork_sorgbr_p = INT(dum(1)) maxwrk = MAX(maxwrk, 3*m+lwork_sorgbr_p) @@ -18898,17 +18974,19 @@ SUBROUTINE SGESVD(jobu, jobvt, m, n, a, lda, s, u, ldu, vt, ldvt, & iscl = 0 IF (anrm>zero .AND. anrmbignum) THEN iscl = 1 - CALL SLASCL('G', 0_ip_, 0_ip_, anrm, bignum, m, n, a, lda, ierr) + CALL SLASCL('G', 0_ip_, 0_ip_, anrm, bignum, m, n, a, lda, & + ierr) END IF IF (m>=n) THEN IF (m>=mnthr) THEN IF (wntun) THEN itau = 1 iwork = itau + n - CALL SGEQRF(m, n, a, lda, work(itau), work(iwork), & + CALL SGEQRF(m, n, a, lda, work(itau), work(iwork), & lwork-iwork+1, ierr) IF (n>1) THEN CALL SLASET('L', n-1, n-1, zero, zero, a(2,1), lda) @@ -18917,17 +18995,17 @@ SUBROUTINE SGESVD(jobu, jobvt, m, n, a, lda, s, u, ldu, vt, ldvt, & itauq = ie + n itaup = itauq + n iwork = itaup + n - CALL SGEBRD(n, n, a, lda, s, work(ie), work(itauq), & + CALL SGEBRD(n, n, a, lda, s, work(ie), work(itauq), & work(itaup), work(iwork), lwork-iwork+1, ierr) ncvt = 0 IF (wntvo .OR. wntvas) THEN - CALL SORGBR('P', n, n, n, a, lda, work(itaup), & + CALL SORGBR('P', n, n, n, a, lda, work(itaup), & work(iwork), lwork-iwork+1, ierr) ncvt = n END IF iwork = ie + n - CALL SBDSQR('U', n, ncvt, 0_ip_, 0_ip_, s, work(ie), a, lda, & - dum, 1_ip_, dum, 1_ip_, work(iwork), info) + CALL SBDSQR('U', n, ncvt, 0_ip_, 0_ip_, s, work(ie), a, & + lda, dum, 1_ip_, dum, 1_ip_, work(iwork), info) IF (wntvas) CALL SLACPY('F', n, n, a, lda, vt, ldvt) ELSE IF (wntuo .AND. wntvn) THEN IF (lwork>=n*n+MAX(4*n,bdspac)) THEN @@ -18944,30 +19022,31 @@ SUBROUTINE SGESVD(jobu, jobvt, m, n, a, lda, s, u, ldu, vt, ldvt, & END IF itau = ir + ldwrkr*n iwork = itau + n - CALL SGEQRF(m, n, a, lda, work(itau), work(iwork), & + CALL SGEQRF(m, n, a, lda, work(itau), work(iwork), & lwork-iwork+1, ierr) CALL SLACPY('U', n, n, a, lda, work(ir), ldwrkr) - CALL SLASET('L', n-1, n-1, zero, zero, work(ir+1), ldwrkr) - CALL SORGQR(m, n, n, a, lda, work(itau), work(iwork), & + CALL SLASET('L', n-1, n-1, zero, zero, work(ir+1), & + ldwrkr) + CALL SORGQR(m, n, n, a, lda, work(itau), work(iwork), & lwork-iwork+1, ierr) ie = itau itauq = ie + n itaup = itauq + n iwork = itaup + n - CALL SGEBRD(n, n, work(ir), ldwrkr, s, work(ie), & - work(itauq), work(itaup), work(iwork), lwork-iwork+1, & + CALL SGEBRD(n, n, work(ir), ldwrkr, s, work(ie), & + work(itauq), work(itaup), work(iwork), lwork-iwork+1, & ierr) - CALL SORGBR('Q', n, n, n, work(ir), ldwrkr, work(itauq), & + CALL SORGBR('Q', n, n, n, work(ir), ldwrkr, work(itauq), & work(iwork), lwork-iwork+1, ierr) iwork = ie + n - CALL SBDSQR('U', n, 0_ip_, n, 0_ip_, s, work(ie), dum, & + CALL SBDSQR('U', n, 0_ip_, n, 0_ip_, s, work(ie), dum, & 1_ip_, work(ir), ldwrkr, dum, 1_ip_, work(iwork), info) iu = ie + n DO i = 1, m, ldwrku chunk = MIN(m-i+1, ldwrku) - CALL SGEMM('N', 'N', chunk, n, n, one, a(i,1), lda, & + CALL SGEMM('N', 'N', chunk, n, n, one, a(i,1), lda, & work(ir), ldwrkr, zero, work(iu), ldwrku) - CALL SLACPY('F', chunk, n, work(iu), ldwrku, a(i,1), & + CALL SLACPY('F', chunk, n, work(iu), ldwrku, a(i,1), & lda) END DO ELSE @@ -18975,12 +19054,12 @@ SUBROUTINE SGESVD(jobu, jobvt, m, n, a, lda, s, u, ldu, vt, ldvt, & itauq = ie + n itaup = itauq + n iwork = itaup + n - CALL SGEBRD(m, n, a, lda, s, work(ie), work(itauq), & + CALL SGEBRD(m, n, a, lda, s, work(ie), work(itauq), & work(itaup), work(iwork), lwork-iwork+1, ierr) - CALL SORGBR('Q', m, n, n, a, lda, work(itauq), & + CALL SORGBR('Q', m, n, n, a, lda, work(itauq), & work(iwork), lwork-iwork+1, ierr) iwork = ie + n - CALL SBDSQR('U', n, 0_ip_, m, 0_ip_, s, work(ie), dum, & + CALL SBDSQR('U', n, 0_ip_, m, 0_ip_, s, work(ie), dum, & 1_ip_, a, lda, dum, 1_ip_, work(iwork), info) END IF ELSE IF (wntuo .AND. wntvas) THEN @@ -18998,58 +19077,58 @@ SUBROUTINE SGESVD(jobu, jobvt, m, n, a, lda, s, u, ldu, vt, ldvt, & END IF itau = ir + ldwrkr*n iwork = itau + n - CALL SGEQRF(m, n, a, lda, work(itau), work(iwork), & + CALL SGEQRF(m, n, a, lda, work(itau), work(iwork), & lwork-iwork+1, ierr) CALL SLACPY('U', n, n, a, lda, vt, ldvt) - IF (n>1) CALL SLASET('L', n-1, n-1, zero, zero, vt(2,1), & + IF (n>1) CALL SLASET('L', n-1, n-1, zero, zero, vt(2,1), & ldvt) - CALL SORGQR(m, n, n, a, lda, work(itau), work(iwork), & + CALL SORGQR(m, n, n, a, lda, work(itau), work(iwork), & lwork-iwork+1, ierr) ie = itau itauq = ie + n itaup = itauq + n iwork = itaup + n - CALL SGEBRD(n, n, vt, ldvt, s, work(ie), work(itauq), & + CALL SGEBRD(n, n, vt, ldvt, s, work(ie), work(itauq), & work(itaup), work(iwork), lwork-iwork+1, ierr) CALL SLACPY('L', n, n, vt, ldvt, work(ir), ldwrkr) - CALL SORGBR('Q', n, n, n, work(ir), ldwrkr, work(itauq), & + CALL SORGBR('Q', n, n, n, work(ir), ldwrkr, work(itauq), & work(iwork), lwork-iwork+1, ierr) - CALL SORGBR('P', n, n, n, vt, ldvt, work(itaup), & + CALL SORGBR('P', n, n, n, vt, ldvt, work(itaup), & work(iwork), lwork-iwork+1, ierr) iwork = ie + n - CALL SBDSQR('U', n, n, n, 0_ip_, s, work(ie), vt, ldvt, & + CALL SBDSQR('U', n, n, n, 0_ip_, s, work(ie), vt, ldvt, & work(ir), ldwrkr, dum, 1_ip_, work(iwork), info) iu = ie + n DO i = 1, m, ldwrku chunk = MIN(m-i+1, ldwrku) - CALL SGEMM('N', 'N', chunk, n, n, one, a(i,1), lda, & + CALL SGEMM('N', 'N', chunk, n, n, one, a(i,1), lda, & work(ir), ldwrkr, zero, work(iu), ldwrku) - CALL SLACPY('F', chunk, n, work(iu), ldwrku, a(i,1), & + CALL SLACPY('F', chunk, n, work(iu), ldwrku, a(i,1), & lda) END DO ELSE itau = 1 iwork = itau + n - CALL SGEQRF(m, n, a, lda, work(itau), work(iwork), & + CALL SGEQRF(m, n, a, lda, work(itau), work(iwork), & lwork-iwork+1, ierr) CALL SLACPY('U', n, n, a, lda, vt, ldvt) - IF (n>1) CALL SLASET('L', n-1, n-1, zero, zero, vt(2,1), & + IF (n>1) CALL SLASET('L', n-1, n-1, zero, zero, vt(2,1), & ldvt) - CALL SORGQR(m, n, n, a, lda, work(itau), work(iwork), & + CALL SORGQR(m, n, n, a, lda, work(itau), work(iwork), & lwork-iwork+1, ierr) ie = itau itauq = ie + n itaup = itauq + n iwork = itaup + n - CALL SGEBRD(n, n, vt, ldvt, s, work(ie), work(itauq), & + CALL SGEBRD(n, n, vt, ldvt, s, work(ie), work(itauq), & work(itaup), work(iwork), lwork-iwork+1, ierr) - CALL SORMBR('Q', 'R', 'N', m, n, n, vt, ldvt, work(itauq), & - a, lda, work(iwork), lwork-iwork+1, ierr) - CALL SORGBR('P', n, n, n, vt, ldvt, work(itaup), & + CALL SORMBR('Q', 'R', 'N', m, n, n, vt, ldvt, & + work(itauq), a, lda, work(iwork), lwork-iwork+1, ierr) + CALL SORGBR('P', n, n, n, vt, ldvt, work(itaup), & work(iwork), lwork-iwork+1, ierr) iwork = ie + n - CALL SBDSQR('U', n, n, m, 0_ip_, s, work(ie), vt, ldvt, a, & - lda, dum, 1_ip_, work(iwork), info) + CALL SBDSQR('U', n, n, m, 0_ip_, s, work(ie), vt, ldvt, & + a, lda, dum, 1_ip_, work(iwork), info) END IF ELSE IF (wntus) THEN IF (wntvn) THEN @@ -19062,34 +19141,34 @@ SUBROUTINE SGESVD(jobu, jobvt, m, n, a, lda, s, u, ldu, vt, ldvt, & END IF itau = ir + ldwrkr*n iwork = itau + n - CALL SGEQRF(m, n, a, lda, work(itau), work(iwork), & + CALL SGEQRF(m, n, a, lda, work(itau), work(iwork), & lwork-iwork+1, ierr) CALL SLACPY('U', n, n, a, lda, work(ir), ldwrkr) - CALL SLASET('L', n-1, n-1, zero, zero, work(ir+1), & + CALL SLASET('L', n-1, n-1, zero, zero, work(ir+1), & ldwrkr) - CALL SORGQR(m, n, n, a, lda, work(itau), work(iwork), & + CALL SORGQR(m, n, n, a, lda, work(itau), work(iwork), & lwork-iwork+1, ierr) ie = itau itauq = ie + n itaup = itauq + n iwork = itaup + n - CALL SGEBRD(n, n, work(ir), ldwrkr, s, work(ie), & - work(itauq), work(itaup), work(iwork), lwork-iwork+1, & + CALL SGEBRD(n, n, work(ir), ldwrkr, s, work(ie), & + work(itauq), work(itaup), work(iwork), lwork-iwork+1, & ierr) - CALL SORGBR('Q', n, n, n, work(ir), ldwrkr, work(itauq), & - work(iwork), lwork-iwork+1, ierr) + CALL SORGBR('Q', n, n, n, work(ir), ldwrkr, & + work(itauq), work(iwork), lwork-iwork+1, ierr) iwork = ie + n - CALL SBDSQR('U', n, 0_ip_, n, 0_ip_, s, work(ie), dum, & + CALL SBDSQR('U', n, 0_ip_, n, 0_ip_, s, work(ie), dum, & 1_ip_, work(ir), ldwrkr, dum, 1_ip_, work(iwork), info) - CALL SGEMM('N', 'N', m, n, n, one, a, lda, work(ir), & + CALL SGEMM('N', 'N', m, n, n, one, a, lda, work(ir), & ldwrkr, zero, u, ldu) ELSE itau = 1 iwork = itau + n - CALL SGEQRF(m, n, a, lda, work(itau), work(iwork), & + CALL SGEQRF(m, n, a, lda, work(itau), work(iwork), & lwork-iwork+1, ierr) CALL SLACPY('L', m, n, a, lda, u, ldu) - CALL SORGQR(m, n, n, u, ldu, work(itau), work(iwork), & + CALL SORGQR(m, n, n, u, ldu, work(itau), work(iwork), & lwork-iwork+1, ierr) ie = itau itauq = ie + n @@ -19098,12 +19177,12 @@ SUBROUTINE SGESVD(jobu, jobvt, m, n, a, lda, s, u, ldu, vt, ldvt, & IF (n>1) THEN CALL SLASET('L', n-1, n-1, zero, zero, a(2,1), lda) END IF - CALL SGEBRD(n, n, a, lda, s, work(ie), work(itauq), & + CALL SGEBRD(n, n, a, lda, s, work(ie), work(itauq), & work(itaup), work(iwork), lwork-iwork+1, ierr) - CALL SORMBR('Q', 'R', 'N', m, n, n, a, lda, work(itauq), & - u, ldu, work(iwork), lwork-iwork+1, ierr) + CALL SORMBR('Q', 'R', 'N', m, n, n, a, lda, & + work(itauq), u, ldu, work(iwork), lwork-iwork+1, ierr) iwork = ie + n - CALL SBDSQR('U', n, 0_ip_, m, 0_ip_, s, work(ie), dum, & + CALL SBDSQR('U', n, 0_ip_, m, 0_ip_, s, work(ie), dum, & 1_ip_, u, ldu, dum, 1_ip_, work(iwork), info) END IF ELSE IF (wntvo) THEN @@ -19124,39 +19203,40 @@ SUBROUTINE SGESVD(jobu, jobvt, m, n, a, lda, s, u, ldu, vt, ldvt, & END IF itau = ir + ldwrkr*n iwork = itau + n - CALL SGEQRF(m, n, a, lda, work(itau), work(iwork), & + CALL SGEQRF(m, n, a, lda, work(itau), work(iwork), & lwork-iwork+1, ierr) CALL SLACPY('U', n, n, a, lda, work(iu), ldwrku) - CALL SLASET('L', n-1, n-1, zero, zero, work(iu+1), & + CALL SLASET('L', n-1, n-1, zero, zero, work(iu+1), & ldwrku) - CALL SORGQR(m, n, n, a, lda, work(itau), work(iwork), & + CALL SORGQR(m, n, n, a, lda, work(itau), work(iwork), & lwork-iwork+1, ierr) ie = itau itauq = ie + n itaup = itauq + n iwork = itaup + n - CALL SGEBRD(n, n, work(iu), ldwrku, s, work(ie), & - work(itauq), work(itaup), work(iwork), lwork-iwork+1, & + CALL SGEBRD(n, n, work(iu), ldwrku, s, work(ie), & + work(itauq), work(itaup), work(iwork), lwork-iwork+1, & ierr) - CALL SLACPY('U', n, n, work(iu), ldwrku, work(ir), & + CALL SLACPY('U', n, n, work(iu), ldwrku, work(ir), & ldwrkr) - CALL SORGBR('Q', n, n, n, work(iu), ldwrku, work(itauq), & - work(iwork), lwork-iwork+1, ierr) - CALL SORGBR('P', n, n, n, work(ir), ldwrkr, work(itaup), & - work(iwork), lwork-iwork+1, ierr) + CALL SORGBR('Q', n, n, n, work(iu), ldwrku, & + work(itauq), work(iwork), lwork-iwork+1, ierr) + CALL SORGBR('P', n, n, n, work(ir), ldwrkr, & + work(itaup), work(iwork), lwork-iwork+1, ierr) iwork = ie + n - CALL SBDSQR('U', n, n, n, 0_ip_, s, work(ie), work(ir), & - ldwrkr, work(iu), ldwrku, dum, 1_ip_, work(iwork), info) - CALL SGEMM('N', 'N', m, n, n, one, a, lda, work(iu), & + CALL SBDSQR('U', n, n, n, 0_ip_, s, work(ie), work(ir), & + ldwrkr, work(iu), ldwrku, dum, 1_ip_, work(iwork), & + info) + CALL SGEMM('N', 'N', m, n, n, one, a, lda, work(iu), & ldwrku, zero, u, ldu) CALL SLACPY('F', n, n, work(ir), ldwrkr, a, lda) ELSE itau = 1 iwork = itau + n - CALL SGEQRF(m, n, a, lda, work(itau), work(iwork), & + CALL SGEQRF(m, n, a, lda, work(itau), work(iwork), & lwork-iwork+1, ierr) CALL SLACPY('L', m, n, a, lda, u, ldu) - CALL SORGQR(m, n, n, u, ldu, work(itau), work(iwork), & + CALL SORGQR(m, n, n, u, ldu, work(itau), work(iwork), & lwork-iwork+1, ierr) ie = itau itauq = ie + n @@ -19165,15 +19245,15 @@ SUBROUTINE SGESVD(jobu, jobvt, m, n, a, lda, s, u, ldu, vt, ldvt, & IF (n>1) THEN CALL SLASET('L', n-1, n-1, zero, zero, a(2,1), lda) END IF - CALL SGEBRD(n, n, a, lda, s, work(ie), work(itauq), & + CALL SGEBRD(n, n, a, lda, s, work(ie), work(itauq), & work(itaup), work(iwork), lwork-iwork+1, ierr) - CALL SORMBR('Q', 'R', 'N', m, n, n, a, lda, work(itauq), & - u, ldu, work(iwork), lwork-iwork+1, ierr) - CALL SORGBR('P', n, n, n, a, lda, work(itaup), & + CALL SORMBR('Q', 'R', 'N', m, n, n, a, lda, & + work(itauq), u, ldu, work(iwork), lwork-iwork+1, ierr) + CALL SORGBR('P', n, n, n, a, lda, work(itaup), & work(iwork), lwork-iwork+1, ierr) iwork = ie + n - CALL SBDSQR('U', n, n, m, 0_ip_, s, work(ie), a, lda, u, & - ldu, dum, 1_ip_, work(iwork), info) + CALL SBDSQR('U', n, n, m, 0_ip_, s, work(ie), a, lda, & + u, ldu, dum, 1_ip_, work(iwork), info) END IF ELSE IF (wntvas) THEN IF (lwork>=n*n+MAX(4*n,bdspac)) THEN @@ -19185,53 +19265,53 @@ SUBROUTINE SGESVD(jobu, jobvt, m, n, a, lda, s, u, ldu, vt, ldvt, & END IF itau = iu + ldwrku*n iwork = itau + n - CALL SGEQRF(m, n, a, lda, work(itau), work(iwork), & + CALL SGEQRF(m, n, a, lda, work(itau), work(iwork), & lwork-iwork+1, ierr) CALL SLACPY('U', n, n, a, lda, work(iu), ldwrku) - CALL SLASET('L', n-1, n-1, zero, zero, work(iu+1), & + CALL SLASET('L', n-1, n-1, zero, zero, work(iu+1), & ldwrku) - CALL SORGQR(m, n, n, a, lda, work(itau), work(iwork), & + CALL SORGQR(m, n, n, a, lda, work(itau), work(iwork), & lwork-iwork+1, ierr) ie = itau itauq = ie + n itaup = itauq + n iwork = itaup + n - CALL SGEBRD(n, n, work(iu), ldwrku, s, work(ie), & - work(itauq), work(itaup), work(iwork), lwork-iwork+1, & + CALL SGEBRD(n, n, work(iu), ldwrku, s, work(ie), & + work(itauq), work(itaup), work(iwork), lwork-iwork+1, & ierr) CALL SLACPY('U', n, n, work(iu), ldwrku, vt, ldvt) - CALL SORGBR('Q', n, n, n, work(iu), ldwrku, work(itauq), & - work(iwork), lwork-iwork+1, ierr) - CALL SORGBR('P', n, n, n, vt, ldvt, work(itaup), & + CALL SORGBR('Q', n, n, n, work(iu), ldwrku, & + work(itauq), work(iwork), lwork-iwork+1, ierr) + CALL SORGBR('P', n, n, n, vt, ldvt, work(itaup), & work(iwork), lwork-iwork+1, ierr) iwork = ie + n - CALL SBDSQR('U', n, n, n, 0_ip_, s, work(ie), vt, ldvt, & + CALL SBDSQR('U', n, n, n, 0_ip_, s, work(ie), vt, ldvt, & work(iu), ldwrku, dum, 1_ip_, work(iwork), info) - CALL SGEMM('N', 'N', m, n, n, one, a, lda, work(iu), & + CALL SGEMM('N', 'N', m, n, n, one, a, lda, work(iu), & ldwrku, zero, u, ldu) ELSE itau = 1 iwork = itau + n - CALL SGEQRF(m, n, a, lda, work(itau), work(iwork), & + CALL SGEQRF(m, n, a, lda, work(itau), work(iwork), & lwork-iwork+1, ierr) CALL SLACPY('L', m, n, a, lda, u, ldu) - CALL SORGQR(m, n, n, u, ldu, work(itau), work(iwork), & + CALL SORGQR(m, n, n, u, ldu, work(itau), work(iwork), & lwork-iwork+1, ierr) CALL SLACPY('U', n, n, a, lda, vt, ldvt) - IF (n>1) CALL SLASET('L', n-1, n-1, zero, zero, vt(2,1), & - ldvt) + IF (n>1) CALL SLASET('L', n-1, n-1, zero, zero, vt(2, & + 1), ldvt) ie = itau itauq = ie + n itaup = itauq + n iwork = itaup + n - CALL SGEBRD(n, n, vt, ldvt, s, work(ie), work(itauq), & + CALL SGEBRD(n, n, vt, ldvt, s, work(ie), work(itauq), & work(itaup), work(iwork), lwork-iwork+1, ierr) - CALL SORMBR('Q', 'R', 'N', m, n, n, vt, ldvt, & + CALL SORMBR('Q', 'R', 'N', m, n, n, vt, ldvt, & work(itauq), u, ldu, work(iwork), lwork-iwork+1, ierr) - CALL SORGBR('P', n, n, n, vt, ldvt, work(itaup), & + CALL SORGBR('P', n, n, n, vt, ldvt, work(itaup), & work(iwork), lwork-iwork+1, ierr) iwork = ie + n - CALL SBDSQR('U', n, n, m, 0_ip_, s, work(ie), vt, ldvt, & + CALL SBDSQR('U', n, n, m, 0_ip_, s, work(ie), vt, ldvt, & u, ldu, dum, 1_ip_, work(iwork), info) END IF END IF @@ -19246,36 +19326,36 @@ SUBROUTINE SGESVD(jobu, jobvt, m, n, a, lda, s, u, ldu, vt, ldvt, & END IF itau = ir + ldwrkr*n iwork = itau + n - CALL SGEQRF(m, n, a, lda, work(itau), work(iwork), & + CALL SGEQRF(m, n, a, lda, work(itau), work(iwork), & lwork-iwork+1, ierr) CALL SLACPY('L', m, n, a, lda, u, ldu) CALL SLACPY('U', n, n, a, lda, work(ir), ldwrkr) - CALL SLASET('L', n-1, n-1, zero, zero, work(ir+1), & + CALL SLASET('L', n-1, n-1, zero, zero, work(ir+1), & ldwrkr) - CALL SORGQR(m, m, n, u, ldu, work(itau), work(iwork), & + CALL SORGQR(m, m, n, u, ldu, work(itau), work(iwork), & lwork-iwork+1, ierr) ie = itau itauq = ie + n itaup = itauq + n iwork = itaup + n - CALL SGEBRD(n, n, work(ir), ldwrkr, s, work(ie), & - work(itauq), work(itaup), work(iwork), lwork-iwork+1, & + CALL SGEBRD(n, n, work(ir), ldwrkr, s, work(ie), & + work(itauq), work(itaup), work(iwork), lwork-iwork+1, & ierr) - CALL SORGBR('Q', n, n, n, work(ir), ldwrkr, work(itauq), & - work(iwork), lwork-iwork+1, ierr) + CALL SORGBR('Q', n, n, n, work(ir), ldwrkr, & + work(itauq), work(iwork), lwork-iwork+1, ierr) iwork = ie + n - CALL SBDSQR('U', n, 0_ip_, n, 0_ip_, s, work(ie), dum, & + CALL SBDSQR('U', n, 0_ip_, n, 0_ip_, s, work(ie), dum, & 1_ip_, work(ir), ldwrkr, dum, 1_ip_, work(iwork), info) - CALL SGEMM('N', 'N', m, n, n, one, u, ldu, work(ir), & + CALL SGEMM('N', 'N', m, n, n, one, u, ldu, work(ir), & ldwrkr, zero, a, lda) CALL SLACPY('F', m, n, a, lda, u, ldu) ELSE itau = 1 iwork = itau + n - CALL SGEQRF(m, n, a, lda, work(itau), work(iwork), & + CALL SGEQRF(m, n, a, lda, work(itau), work(iwork), & lwork-iwork+1, ierr) CALL SLACPY('L', m, n, a, lda, u, ldu) - CALL SORGQR(m, m, n, u, ldu, work(itau), work(iwork), & + CALL SORGQR(m, m, n, u, ldu, work(itau), work(iwork), & lwork-iwork+1, ierr) ie = itau itauq = ie + n @@ -19284,12 +19364,12 @@ SUBROUTINE SGESVD(jobu, jobvt, m, n, a, lda, s, u, ldu, vt, ldvt, & IF (n>1) THEN CALL SLASET('L', n-1, n-1, zero, zero, a(2,1), lda) END IF - CALL SGEBRD(n, n, a, lda, s, work(ie), work(itauq), & + CALL SGEBRD(n, n, a, lda, s, work(ie), work(itauq), & work(itaup), work(iwork), lwork-iwork+1, ierr) - CALL SORMBR('Q', 'R', 'N', m, n, n, a, lda, work(itauq), & - u, ldu, work(iwork), lwork-iwork+1, ierr) + CALL SORMBR('Q', 'R', 'N', m, n, n, a, lda, & + work(itauq), u, ldu, work(iwork), lwork-iwork+1, ierr) iwork = ie + n - CALL SBDSQR('U', n, 0_ip_, m, 0_ip_, s, work(ie), dum, & + CALL SBDSQR('U', n, 0_ip_, m, 0_ip_, s, work(ie), dum, & 1_ip_, u, ldu, dum, 1_ip_, work(iwork), info) END IF ELSE IF (wntvo) THEN @@ -19310,41 +19390,42 @@ SUBROUTINE SGESVD(jobu, jobvt, m, n, a, lda, s, u, ldu, vt, ldvt, & END IF itau = ir + ldwrkr*n iwork = itau + n - CALL SGEQRF(m, n, a, lda, work(itau), work(iwork), & + CALL SGEQRF(m, n, a, lda, work(itau), work(iwork), & lwork-iwork+1, ierr) CALL SLACPY('L', m, n, a, lda, u, ldu) - CALL SORGQR(m, m, n, u, ldu, work(itau), work(iwork), & + CALL SORGQR(m, m, n, u, ldu, work(itau), work(iwork), & lwork-iwork+1, ierr) CALL SLACPY('U', n, n, a, lda, work(iu), ldwrku) - CALL SLASET('L', n-1, n-1, zero, zero, work(iu+1), & + CALL SLASET('L', n-1, n-1, zero, zero, work(iu+1), & ldwrku) ie = itau itauq = ie + n itaup = itauq + n iwork = itaup + n - CALL SGEBRD(n, n, work(iu), ldwrku, s, work(ie), & - work(itauq), work(itaup), work(iwork), lwork-iwork+1, & + CALL SGEBRD(n, n, work(iu), ldwrku, s, work(ie), & + work(itauq), work(itaup), work(iwork), lwork-iwork+1, & ierr) - CALL SLACPY('U', n, n, work(iu), ldwrku, work(ir), & + CALL SLACPY('U', n, n, work(iu), ldwrku, work(ir), & ldwrkr) - CALL SORGBR('Q', n, n, n, work(iu), ldwrku, work(itauq), & - work(iwork), lwork-iwork+1, ierr) - CALL SORGBR('P', n, n, n, work(ir), ldwrkr, work(itaup), & - work(iwork), lwork-iwork+1, ierr) + CALL SORGBR('Q', n, n, n, work(iu), ldwrku, & + work(itauq), work(iwork), lwork-iwork+1, ierr) + CALL SORGBR('P', n, n, n, work(ir), ldwrkr, & + work(itaup), work(iwork), lwork-iwork+1, ierr) iwork = ie + n - CALL SBDSQR('U', n, n, n, 0_ip_, s, work(ie), work(ir), & - ldwrkr, work(iu), ldwrku, dum, 1_ip_, work(iwork), info) - CALL SGEMM('N', 'N', m, n, n, one, u, ldu, work(iu), & + CALL SBDSQR('U', n, n, n, 0_ip_, s, work(ie), work(ir), & + ldwrkr, work(iu), ldwrku, dum, 1_ip_, work(iwork), & + info) + CALL SGEMM('N', 'N', m, n, n, one, u, ldu, work(iu), & ldwrku, zero, a, lda) CALL SLACPY('F', m, n, a, lda, u, ldu) CALL SLACPY('F', n, n, work(ir), ldwrkr, a, lda) ELSE itau = 1 iwork = itau + n - CALL SGEQRF(m, n, a, lda, work(itau), work(iwork), & + CALL SGEQRF(m, n, a, lda, work(itau), work(iwork), & lwork-iwork+1, ierr) CALL SLACPY('L', m, n, a, lda, u, ldu) - CALL SORGQR(m, m, n, u, ldu, work(itau), work(iwork), & + CALL SORGQR(m, m, n, u, ldu, work(itau), work(iwork), & lwork-iwork+1, ierr) ie = itau itauq = ie + n @@ -19353,15 +19434,15 @@ SUBROUTINE SGESVD(jobu, jobvt, m, n, a, lda, s, u, ldu, vt, ldvt, & IF (n>1) THEN CALL SLASET('L', n-1, n-1, zero, zero, a(2,1), lda) END IF - CALL SGEBRD(n, n, a, lda, s, work(ie), work(itauq), & + CALL SGEBRD(n, n, a, lda, s, work(ie), work(itauq), & work(itaup), work(iwork), lwork-iwork+1, ierr) - CALL SORMBR('Q', 'R', 'N', m, n, n, a, lda, work(itauq), & - u, ldu, work(iwork), lwork-iwork+1, ierr) - CALL SORGBR('P', n, n, n, a, lda, work(itaup), & + CALL SORMBR('Q', 'R', 'N', m, n, n, a, lda, & + work(itauq), u, ldu, work(iwork), lwork-iwork+1, ierr) + CALL SORGBR('P', n, n, n, a, lda, work(itaup), & work(iwork), lwork-iwork+1, ierr) iwork = ie + n - CALL SBDSQR('U', n, n, m, 0_ip_, s, work(ie), a, lda, u, & - ldu, dum, 1_ip_, work(iwork), info) + CALL SBDSQR('U', n, n, m, 0_ip_, s, work(ie), a, lda, & + u, ldu, dum, 1_ip_, work(iwork), info) END IF ELSE IF (wntvas) THEN IF (lwork>=n*n+MAX(n+m,4*n,bdspac)) THEN @@ -19373,55 +19454,55 @@ SUBROUTINE SGESVD(jobu, jobvt, m, n, a, lda, s, u, ldu, vt, ldvt, & END IF itau = iu + ldwrku*n iwork = itau + n - CALL SGEQRF(m, n, a, lda, work(itau), work(iwork), & + CALL SGEQRF(m, n, a, lda, work(itau), work(iwork), & lwork-iwork+1, ierr) CALL SLACPY('L', m, n, a, lda, u, ldu) - CALL SORGQR(m, m, n, u, ldu, work(itau), work(iwork), & + CALL SORGQR(m, m, n, u, ldu, work(itau), work(iwork), & lwork-iwork+1, ierr) CALL SLACPY('U', n, n, a, lda, work(iu), ldwrku) - CALL SLASET('L', n-1, n-1, zero, zero, work(iu+1), & + CALL SLASET('L', n-1, n-1, zero, zero, work(iu+1), & ldwrku) ie = itau itauq = ie + n itaup = itauq + n iwork = itaup + n - CALL SGEBRD(n, n, work(iu), ldwrku, s, work(ie), & - work(itauq), work(itaup), work(iwork), lwork-iwork+1, & + CALL SGEBRD(n, n, work(iu), ldwrku, s, work(ie), & + work(itauq), work(itaup), work(iwork), lwork-iwork+1, & ierr) CALL SLACPY('U', n, n, work(iu), ldwrku, vt, ldvt) - CALL SORGBR('Q', n, n, n, work(iu), ldwrku, work(itauq), & - work(iwork), lwork-iwork+1, ierr) - CALL SORGBR('P', n, n, n, vt, ldvt, work(itaup), & + CALL SORGBR('Q', n, n, n, work(iu), ldwrku, & + work(itauq), work(iwork), lwork-iwork+1, ierr) + CALL SORGBR('P', n, n, n, vt, ldvt, work(itaup), & work(iwork), lwork-iwork+1, ierr) iwork = ie + n - CALL SBDSQR('U', n, n, n, 0_ip_, s, work(ie), vt, ldvt, & + CALL SBDSQR('U', n, n, n, 0_ip_, s, work(ie), vt, ldvt, & work(iu), ldwrku, dum, 1_ip_, work(iwork), info) - CALL SGEMM('N', 'N', m, n, n, one, u, ldu, work(iu), & + CALL SGEMM('N', 'N', m, n, n, one, u, ldu, work(iu), & ldwrku, zero, a, lda) CALL SLACPY('F', m, n, a, lda, u, ldu) ELSE itau = 1 iwork = itau + n - CALL SGEQRF(m, n, a, lda, work(itau), work(iwork), & + CALL SGEQRF(m, n, a, lda, work(itau), work(iwork), & lwork-iwork+1, ierr) CALL SLACPY('L', m, n, a, lda, u, ldu) - CALL SORGQR(m, m, n, u, ldu, work(itau), work(iwork), & + CALL SORGQR(m, m, n, u, ldu, work(itau), work(iwork), & lwork-iwork+1, ierr) CALL SLACPY('U', n, n, a, lda, vt, ldvt) - IF (n>1) CALL SLASET('L', n-1, n-1, zero, zero, vt(2,1), & - ldvt) + IF (n>1) CALL SLASET('L', n-1, n-1, zero, zero, vt(2, & + 1), ldvt) ie = itau itauq = ie + n itaup = itauq + n iwork = itaup + n - CALL SGEBRD(n, n, vt, ldvt, s, work(ie), work(itauq), & + CALL SGEBRD(n, n, vt, ldvt, s, work(ie), work(itauq), & work(itaup), work(iwork), lwork-iwork+1, ierr) - CALL SORMBR('Q', 'R', 'N', m, n, n, vt, ldvt, & + CALL SORMBR('Q', 'R', 'N', m, n, n, vt, ldvt, & work(itauq), u, ldu, work(iwork), lwork-iwork+1, ierr) - CALL SORGBR('P', n, n, n, vt, ldvt, work(itaup), & + CALL SORGBR('P', n, n, n, vt, ldvt, work(itaup), & work(iwork), lwork-iwork+1, ierr) iwork = ie + n - CALL SBDSQR('U', n, n, m, 0_ip_, s, work(ie), vt, ldvt, & + CALL SBDSQR('U', n, n, m, 0_ip_, s, work(ie), vt, ldvt, & u, ldu, dum, 1_ip_, work(iwork), info) END IF END IF @@ -19431,26 +19512,26 @@ SUBROUTINE SGESVD(jobu, jobvt, m, n, a, lda, s, u, ldu, vt, ldvt, & itauq = ie + n itaup = itauq + n iwork = itaup + n - CALL SGEBRD(m, n, a, lda, s, work(ie), work(itauq), & + CALL SGEBRD(m, n, a, lda, s, work(ie), work(itauq), & work(itaup), work(iwork), lwork-iwork+1, ierr) IF (wntuas) THEN CALL SLACPY('L', m, n, a, lda, u, ldu) IF (wntus) ncu = n IF (wntua) ncu = m - CALL SORGBR('Q', m, ncu, n, u, ldu, work(itauq), & + CALL SORGBR('Q', m, ncu, n, u, ldu, work(itauq), & work(iwork), lwork-iwork+1, ierr) END IF IF (wntvas) THEN CALL SLACPY('U', n, n, a, lda, vt, ldvt) - CALL SORGBR('P', n, n, n, vt, ldvt, work(itaup), & + CALL SORGBR('P', n, n, n, vt, ldvt, work(itaup), & work(iwork), lwork-iwork+1, ierr) END IF IF (wntuo) THEN - CALL SORGBR('Q', m, n, n, a, lda, work(itauq), work(iwork), & + CALL SORGBR('Q', m, n, n, a, lda, work(itauq), work(iwork), & lwork-iwork+1, ierr) END IF IF (wntvo) THEN - CALL SORGBR('P', n, n, n, a, lda, work(itaup), work(iwork), & + CALL SORGBR('P', n, n, n, a, lda, work(itaup), work(iwork), & lwork-iwork+1, ierr) END IF iwork = ie + n @@ -19459,14 +19540,14 @@ SUBROUTINE SGESVD(jobu, jobvt, m, n, a, lda, s, u, ldu, vt, ldvt, & IF (wntvas .OR. wntvo) ncvt = n IF (wntvn) ncvt = 0 IF ((.NOT. wntuo) .AND. (.NOT. wntvo)) THEN - CALL SBDSQR('U', n, ncvt, nru, 0_ip_, s, work(ie), vt, ldvt, & - u, ldu, dum, 1_ip_, work(iwork), info) + CALL SBDSQR('U', n, ncvt, nru, 0_ip_, s, work(ie), vt, & + ldvt, u, ldu, dum, 1_ip_, work(iwork), info) ELSE IF ((.NOT. wntuo) .AND. wntvo) THEN - CALL SBDSQR('U', n, ncvt, nru, 0_ip_, s, work(ie), a, lda, & + CALL SBDSQR('U', n, ncvt, nru, 0_ip_, s, work(ie), a, lda, & u, ldu, dum, 1_ip_, work(iwork), info) ELSE - CALL SBDSQR('U', n, ncvt, nru, 0_ip_, s, work(ie), vt, ldvt, & - a, lda, dum, 1_ip_, work(iwork), info) + CALL SBDSQR('U', n, ncvt, nru, 0_ip_, s, work(ie), vt, & + ldvt, a, lda, dum, 1_ip_, work(iwork), info) END IF END IF ELSE @@ -19474,23 +19555,23 @@ SUBROUTINE SGESVD(jobu, jobvt, m, n, a, lda, s, u, ldu, vt, ldvt, & IF (wntvn) THEN itau = 1 iwork = itau + m - CALL SGELQF(m, n, a, lda, work(itau), work(iwork), & + CALL SGELQF(m, n, a, lda, work(itau), work(iwork), & lwork-iwork+1, ierr) CALL SLASET('U', m-1, m-1, zero, zero, a(1,2), lda) ie = 1 itauq = ie + m itaup = itauq + m iwork = itaup + m - CALL SGEBRD(m, m, a, lda, s, work(ie), work(itauq), & + CALL SGEBRD(m, m, a, lda, s, work(ie), work(itauq), & work(itaup), work(iwork), lwork-iwork+1, ierr) IF (wntuo .OR. wntuas) THEN - CALL SORGBR('Q', m, m, m, a, lda, work(itauq), & + CALL SORGBR('Q', m, m, m, a, lda, work(itauq), & work(iwork), lwork-iwork+1, ierr) END IF iwork = ie + m nru = 0 IF (wntuo .OR. wntuas) nru = m - CALL SBDSQR('U', m, 0_ip_, nru, 0_ip_, s, work(ie), dum, & + CALL SBDSQR('U', m, 0_ip_, nru, 0_ip_, s, work(ie), dum, & 1_ip_, a, lda, dum, 1_ip_, work(iwork), info) IF (wntuas) CALL SLACPY('F', m, m, a, lda, u, ldu) ELSE IF (wntvo .AND. wntun) THEN @@ -19511,30 +19592,30 @@ SUBROUTINE SGESVD(jobu, jobvt, m, n, a, lda, s, u, ldu, vt, ldvt, & END IF itau = ir + ldwrkr*m iwork = itau + m - CALL SGELQF(m, n, a, lda, work(itau), work(iwork), & + CALL SGELQF(m, n, a, lda, work(itau), work(iwork), & lwork-iwork+1, ierr) CALL SLACPY('L', m, m, a, lda, work(ir), ldwrkr) - CALL SLASET('U', m-1, m-1, zero, zero, work(ir+ldwrkr), & + CALL SLASET('U', m-1, m-1, zero, zero, work(ir+ldwrkr), & ldwrkr) - CALL SORGLQ(m, n, m, a, lda, work(itau), work(iwork), & + CALL SORGLQ(m, n, m, a, lda, work(itau), work(iwork), & lwork-iwork+1, ierr) ie = itau itauq = ie + m itaup = itauq + m iwork = itaup + m - CALL SGEBRD(m, m, work(ir), ldwrkr, s, work(ie), & - work(itauq), work(itaup), work(iwork), lwork-iwork+1, & + CALL SGEBRD(m, m, work(ir), ldwrkr, s, work(ie), & + work(itauq), work(itaup), work(iwork), lwork-iwork+1, & ierr) - CALL SORGBR('P', m, m, m, work(ir), ldwrkr, work(itaup), & + CALL SORGBR('P', m, m, m, work(ir), ldwrkr, work(itaup), & work(iwork), lwork-iwork+1, ierr) iwork = ie + m - CALL SBDSQR('U', m, m, 0_ip_, 0_ip_, s, work(ie), & - work(ir), ldwrkr, dum, 1_ip_, dum, 1_ip_, work(iwork), & + CALL SBDSQR('U', m, m, 0_ip_, 0_ip_, s, work(ie), & + work(ir), ldwrkr, dum, 1_ip_, dum, 1_ip_, work(iwork), & info) iu = ie + m DO i = 1, n, chunk blk = MIN(n-i+1, chunk) - CALL SGEMM('N', 'N', m, blk, m, one, work(ir), ldwrkr, & + CALL SGEMM('N', 'N', m, blk, m, one, work(ir), ldwrkr, & a(1,i), lda, zero, work(iu), ldwrku) CALL SLACPY('F', m, blk, work(iu), ldwrku, a(1,i), lda) END DO @@ -19543,12 +19624,12 @@ SUBROUTINE SGESVD(jobu, jobvt, m, n, a, lda, s, u, ldu, vt, ldvt, & itauq = ie + m itaup = itauq + m iwork = itaup + m - CALL SGEBRD(m, n, a, lda, s, work(ie), work(itauq), & + CALL SGEBRD(m, n, a, lda, s, work(ie), work(itauq), & work(itaup), work(iwork), lwork-iwork+1, ierr) - CALL SORGBR('P', m, n, m, a, lda, work(itaup), & + CALL SORGBR('P', m, n, m, a, lda, work(itaup), & work(iwork), lwork-iwork+1, ierr) iwork = ie + m - CALL SBDSQR('L', m, n, 0_ip_, 0_ip_, s, work(ie), a, lda, & + CALL SBDSQR('L', m, n, 0_ip_, 0_ip_, s, work(ie), a, lda, & dum, 1_ip_, dum, 1_ip_, work(iwork), info) END IF ELSE IF (wntvo .AND. wntuas) THEN @@ -19569,54 +19650,54 @@ SUBROUTINE SGESVD(jobu, jobvt, m, n, a, lda, s, u, ldu, vt, ldvt, & END IF itau = ir + ldwrkr*m iwork = itau + m - CALL SGELQF(m, n, a, lda, work(itau), work(iwork), & + CALL SGELQF(m, n, a, lda, work(itau), work(iwork), & lwork-iwork+1, ierr) CALL SLACPY('L', m, m, a, lda, u, ldu) CALL SLASET('U', m-1, m-1, zero, zero, u(1,2), ldu) - CALL SORGLQ(m, n, m, a, lda, work(itau), work(iwork), & + CALL SORGLQ(m, n, m, a, lda, work(itau), work(iwork), & lwork-iwork+1, ierr) ie = itau itauq = ie + m itaup = itauq + m iwork = itaup + m - CALL SGEBRD(m, m, u, ldu, s, work(ie), work(itauq), & + CALL SGEBRD(m, m, u, ldu, s, work(ie), work(itauq), & work(itaup), work(iwork), lwork-iwork+1, ierr) CALL SLACPY('U', m, m, u, ldu, work(ir), ldwrkr) - CALL SORGBR('P', m, m, m, work(ir), ldwrkr, work(itaup), & + CALL SORGBR('P', m, m, m, work(ir), ldwrkr, work(itaup), & work(iwork), lwork-iwork+1, ierr) - CALL SORGBR('Q', m, m, m, u, ldu, work(itauq), & + CALL SORGBR('Q', m, m, m, u, ldu, work(itauq), & work(iwork), lwork-iwork+1, ierr) iwork = ie + m - CALL SBDSQR('U', m, m, m, 0_ip_, s, work(ie), work(ir), & + CALL SBDSQR('U', m, m, m, 0_ip_, s, work(ie), work(ir), & ldwrkr, u, ldu, dum, 1_ip_, work(iwork), info) iu = ie + m DO i = 1, n, chunk blk = MIN(n-i+1, chunk) - CALL SGEMM('N', 'N', m, blk, m, one, work(ir), ldwrkr, & + CALL SGEMM('N', 'N', m, blk, m, one, work(ir), ldwrkr, & a(1,i), lda, zero, work(iu), ldwrku) CALL SLACPY('F', m, blk, work(iu), ldwrku, a(1,i), lda) END DO ELSE itau = 1 iwork = itau + m - CALL SGELQF(m, n, a, lda, work(itau), work(iwork), & + CALL SGELQF(m, n, a, lda, work(itau), work(iwork), & lwork-iwork+1, ierr) CALL SLACPY('L', m, m, a, lda, u, ldu) CALL SLASET('U', m-1, m-1, zero, zero, u(1,2), ldu) - CALL SORGLQ(m, n, m, a, lda, work(itau), work(iwork), & + CALL SORGLQ(m, n, m, a, lda, work(itau), work(iwork), & lwork-iwork+1, ierr) ie = itau itauq = ie + m itaup = itauq + m iwork = itaup + m - CALL SGEBRD(m, m, u, ldu, s, work(ie), work(itauq), & + CALL SGEBRD(m, m, u, ldu, s, work(ie), work(itauq), & work(itaup), work(iwork), lwork-iwork+1, ierr) - CALL SORMBR('P', 'L', 'T', m, n, m, u, ldu, work(itaup), & + CALL SORMBR('P', 'L', 'T', m, n, m, u, ldu, work(itaup), & a, lda, work(iwork), lwork-iwork+1, ierr) - CALL SORGBR('Q', m, m, m, u, ldu, work(itauq), & + CALL SORGBR('Q', m, m, m, u, ldu, work(itauq), & work(iwork), lwork-iwork+1, ierr) iwork = ie + m - CALL SBDSQR('U', m, n, m, 0_ip_, s, work(ie), a, lda, u, & + CALL SBDSQR('U', m, n, m, 0_ip_, s, work(ie), a, lda, u, & ldu, dum, 1_ip_, work(iwork), info) END IF ELSE IF (wntvs) THEN @@ -19630,47 +19711,48 @@ SUBROUTINE SGESVD(jobu, jobvt, m, n, a, lda, s, u, ldu, vt, ldvt, & END IF itau = ir + ldwrkr*m iwork = itau + m - CALL SGELQF(m, n, a, lda, work(itau), work(iwork), & + CALL SGELQF(m, n, a, lda, work(itau), work(iwork), & lwork-iwork+1, ierr) CALL SLACPY('L', m, m, a, lda, work(ir), ldwrkr) - CALL SLASET('U', m-1, m-1, zero, zero, work(ir+ldwrkr), & + CALL SLASET('U', m-1, m-1, zero, zero, work(ir+ldwrkr), & ldwrkr) - CALL SORGLQ(m, n, m, a, lda, work(itau), work(iwork), & + CALL SORGLQ(m, n, m, a, lda, work(itau), work(iwork), & lwork-iwork+1, ierr) ie = itau itauq = ie + m itaup = itauq + m iwork = itaup + m - CALL SGEBRD(m, m, work(ir), ldwrkr, s, work(ie), & - work(itauq), work(itaup), work(iwork), lwork-iwork+1, & + CALL SGEBRD(m, m, work(ir), ldwrkr, s, work(ie), & + work(itauq), work(itaup), work(iwork), lwork-iwork+1, & ierr) - CALL SORGBR('P', m, m, m, work(ir), ldwrkr, work(itaup), & - work(iwork), lwork-iwork+1, ierr) + CALL SORGBR('P', m, m, m, work(ir), ldwrkr, & + work(itaup), work(iwork), lwork-iwork+1, ierr) iwork = ie + m - CALL SBDSQR('U', m, m, 0_ip_, 0_ip_, s, work(ie), & - work(ir), ldwrkr, dum, 1_ip_, dum, 1_ip_, work(iwork), & + CALL SBDSQR('U', m, m, 0_ip_, 0_ip_, s, work(ie), & + work(ir), ldwrkr, dum, 1_ip_, dum, 1_ip_, work(iwork),& info) - CALL SGEMM('N', 'N', m, n, m, one, work(ir), ldwrkr, a, & + CALL SGEMM('N', 'N', m, n, m, one, work(ir), ldwrkr, a, & lda, zero, vt, ldvt) ELSE itau = 1 iwork = itau + m - CALL SGELQF(m, n, a, lda, work(itau), work(iwork), & + CALL SGELQF(m, n, a, lda, work(itau), work(iwork), & lwork-iwork+1, ierr) CALL SLACPY('U', m, n, a, lda, vt, ldvt) - CALL SORGLQ(m, n, m, vt, ldvt, work(itau), work(iwork), & + CALL SORGLQ(m, n, m, vt, ldvt, work(itau), work(iwork), & lwork-iwork+1, ierr) ie = itau itauq = ie + m itaup = itauq + m iwork = itaup + m CALL SLASET('U', m-1, m-1, zero, zero, a(1,2), lda) - CALL SGEBRD(m, m, a, lda, s, work(ie), work(itauq), & + CALL SGEBRD(m, m, a, lda, s, work(ie), work(itauq), & work(itaup), work(iwork), lwork-iwork+1, ierr) - CALL SORMBR('P', 'L', 'T', m, n, m, a, lda, work(itaup), & - vt, ldvt, work(iwork), lwork-iwork+1, ierr) + CALL SORMBR('P', 'L', 'T', m, n, m, a, lda, & + work(itaup), vt, ldvt, work(iwork), lwork-iwork+1, & + ierr) iwork = ie + m - CALL SBDSQR('U', m, n, 0_ip_, 0_ip_, s, work(ie), vt, & + CALL SBDSQR('U', m, n, 0_ip_, 0_ip_, s, work(ie), vt, & ldvt, dum, 1_ip_, dum, 1_ip_, work(iwork), info) END IF ELSE IF (wntuo) THEN @@ -19691,53 +19773,55 @@ SUBROUTINE SGESVD(jobu, jobvt, m, n, a, lda, s, u, ldu, vt, ldvt, & END IF itau = ir + ldwrkr*m iwork = itau + m - CALL SGELQF(m, n, a, lda, work(itau), work(iwork), & + CALL SGELQF(m, n, a, lda, work(itau), work(iwork), & lwork-iwork+1, ierr) CALL SLACPY('L', m, m, a, lda, work(iu), ldwrku) - CALL SLASET('U', m-1, m-1, zero, zero, work(iu+ldwrku), & + CALL SLASET('U', m-1, m-1, zero, zero, work(iu+ldwrku), & ldwrku) - CALL SORGLQ(m, n, m, a, lda, work(itau), work(iwork), & + CALL SORGLQ(m, n, m, a, lda, work(itau), work(iwork), & lwork-iwork+1, ierr) ie = itau itauq = ie + m itaup = itauq + m iwork = itaup + m - CALL SGEBRD(m, m, work(iu), ldwrku, s, work(ie), & - work(itauq), work(itaup), work(iwork), lwork-iwork+1, & + CALL SGEBRD(m, m, work(iu), ldwrku, s, work(ie), & + work(itauq), work(itaup), work(iwork), lwork-iwork+1, & ierr) - CALL SLACPY('L', m, m, work(iu), ldwrku, work(ir), & + CALL SLACPY('L', m, m, work(iu), ldwrku, work(ir), & ldwrkr) - CALL SORGBR('P', m, m, m, work(iu), ldwrku, work(itaup), & - work(iwork), lwork-iwork+1, ierr) - CALL SORGBR('Q', m, m, m, work(ir), ldwrkr, work(itauq), & - work(iwork), lwork-iwork+1, ierr) + CALL SORGBR('P', m, m, m, work(iu), ldwrku, & + work(itaup), work(iwork), lwork-iwork+1, ierr) + CALL SORGBR('Q', m, m, m, work(ir), ldwrkr, & + work(itauq), work(iwork), lwork-iwork+1, ierr) iwork = ie + m - CALL SBDSQR('U', m, m, m, 0_ip_, s, work(ie), work(iu), & - ldwrku, work(ir), ldwrkr, dum, 1_ip_, work(iwork), info) - CALL SGEMM('N', 'N', m, n, m, one, work(iu), ldwrku, a, & + CALL SBDSQR('U', m, m, m, 0_ip_, s, work(ie), work(iu), & + ldwrku, work(ir), ldwrkr, dum, 1_ip_, work(iwork), & + info) + CALL SGEMM('N', 'N', m, n, m, one, work(iu), ldwrku, a, & lda, zero, vt, ldvt) CALL SLACPY('F', m, m, work(ir), ldwrkr, a, lda) ELSE itau = 1 iwork = itau + m - CALL SGELQF(m, n, a, lda, work(itau), work(iwork), & + CALL SGELQF(m, n, a, lda, work(itau), work(iwork), & lwork-iwork+1, ierr) CALL SLACPY('U', m, n, a, lda, vt, ldvt) - CALL SORGLQ(m, n, m, vt, ldvt, work(itau), work(iwork), & + CALL SORGLQ(m, n, m, vt, ldvt, work(itau), work(iwork), & lwork-iwork+1, ierr) ie = itau itauq = ie + m itaup = itauq + m iwork = itaup + m CALL SLASET('U', m-1, m-1, zero, zero, a(1,2), lda) - CALL SGEBRD(m, m, a, lda, s, work(ie), work(itauq), & + CALL SGEBRD(m, m, a, lda, s, work(ie), work(itauq), & work(itaup), work(iwork), lwork-iwork+1, ierr) - CALL SORMBR('P', 'L', 'T', m, n, m, a, lda, work(itaup), & - vt, ldvt, work(iwork), lwork-iwork+1, ierr) - CALL SORGBR('Q', m, m, m, a, lda, work(itauq), & + CALL SORMBR('P', 'L', 'T', m, n, m, a, lda, & + work(itaup), vt, ldvt, work(iwork), lwork-iwork+1, & + ierr) + CALL SORGBR('Q', m, m, m, a, lda, work(itauq), & work(iwork), lwork-iwork+1, ierr) iwork = ie + m - CALL SBDSQR('U', m, n, m, 0_ip_, s, work(ie), vt, ldvt, & + CALL SBDSQR('U', m, n, m, 0_ip_, s, work(ie), vt, ldvt, & a, lda, dum, 1_ip_, work(iwork), info) END IF ELSE IF (wntuas) THEN @@ -19750,37 +19834,37 @@ SUBROUTINE SGESVD(jobu, jobvt, m, n, a, lda, s, u, ldu, vt, ldvt, & END IF itau = iu + ldwrku*m iwork = itau + m - CALL SGELQF(m, n, a, lda, work(itau), work(iwork), & + CALL SGELQF(m, n, a, lda, work(itau), work(iwork), & lwork-iwork+1, ierr) CALL SLACPY('L', m, m, a, lda, work(iu), ldwrku) - CALL SLASET('U', m-1, m-1, zero, zero, work(iu+ldwrku), & + CALL SLASET('U', m-1, m-1, zero, zero, work(iu+ldwrku), & ldwrku) - CALL SORGLQ(m, n, m, a, lda, work(itau), work(iwork), & + CALL SORGLQ(m, n, m, a, lda, work(itau), work(iwork), & lwork-iwork+1, ierr) ie = itau itauq = ie + m itaup = itauq + m iwork = itaup + m - CALL SGEBRD(m, m, work(iu), ldwrku, s, work(ie), & - work(itauq), work(itaup), work(iwork), lwork-iwork+1, & + CALL SGEBRD(m, m, work(iu), ldwrku, s, work(ie), & + work(itauq), work(itaup), work(iwork), lwork-iwork+1, & ierr) CALL SLACPY('L', m, m, work(iu), ldwrku, u, ldu) - CALL SORGBR('P', m, m, m, work(iu), ldwrku, work(itaup), & - work(iwork), lwork-iwork+1, ierr) - CALL SORGBR('Q', m, m, m, u, ldu, work(itauq), & + CALL SORGBR('P', m, m, m, work(iu), ldwrku, & + work(itaup), work(iwork), lwork-iwork+1, ierr) + CALL SORGBR('Q', m, m, m, u, ldu, work(itauq), & work(iwork), lwork-iwork+1, ierr) iwork = ie + m - CALL SBDSQR('U', m, m, m, 0_ip_, s, work(ie), work(iu), & + CALL SBDSQR('U', m, m, m, 0_ip_, s, work(ie), work(iu), & ldwrku, u, ldu, dum, 1_ip_, work(iwork), info) - CALL SGEMM('N', 'N', m, n, m, one, work(iu), ldwrku, a, & + CALL SGEMM('N', 'N', m, n, m, one, work(iu), ldwrku, a, & lda, zero, vt, ldvt) ELSE itau = 1 iwork = itau + m - CALL SGELQF(m, n, a, lda, work(itau), work(iwork), & + CALL SGELQF(m, n, a, lda, work(itau), work(iwork), & lwork-iwork+1, ierr) CALL SLACPY('U', m, n, a, lda, vt, ldvt) - CALL SORGLQ(m, n, m, vt, ldvt, work(itau), work(iwork), & + CALL SORGLQ(m, n, m, vt, ldvt, work(itau), work(iwork), & lwork-iwork+1, ierr) CALL SLACPY('L', m, m, a, lda, u, ldu) CALL SLASET('U', m-1, m-1, zero, zero, u(1,2), ldu) @@ -19788,14 +19872,15 @@ SUBROUTINE SGESVD(jobu, jobvt, m, n, a, lda, s, u, ldu, vt, ldvt, & itauq = ie + m itaup = itauq + m iwork = itaup + m - CALL SGEBRD(m, m, u, ldu, s, work(ie), work(itauq), & + CALL SGEBRD(m, m, u, ldu, s, work(ie), work(itauq), & work(itaup), work(iwork), lwork-iwork+1, ierr) - CALL SORMBR('P', 'L', 'T', m, n, m, u, ldu, work(itaup), & - vt, ldvt, work(iwork), lwork-iwork+1, ierr) - CALL SORGBR('Q', m, m, m, u, ldu, work(itauq), & + CALL SORMBR('P', 'L', 'T', m, n, m, u, ldu, & + work(itaup), vt, ldvt, work(iwork), lwork-iwork+1, & + ierr) + CALL SORGBR('Q', m, m, m, u, ldu, work(itauq), & work(iwork), lwork-iwork+1, ierr) iwork = ie + m - CALL SBDSQR('U', m, n, m, 0_ip_, s, work(ie), vt, ldvt, & + CALL SBDSQR('U', m, n, m, 0_ip_, s, work(ie), vt, ldvt, & u, ldu, dum, 1_ip_, work(iwork), info) END IF END IF @@ -19810,49 +19895,50 @@ SUBROUTINE SGESVD(jobu, jobvt, m, n, a, lda, s, u, ldu, vt, ldvt, & END IF itau = ir + ldwrkr*m iwork = itau + m - CALL SGELQF(m, n, a, lda, work(itau), work(iwork), & + CALL SGELQF(m, n, a, lda, work(itau), work(iwork), & lwork-iwork+1, ierr) CALL SLACPY('U', m, n, a, lda, vt, ldvt) CALL SLACPY('L', m, m, a, lda, work(ir), ldwrkr) - CALL SLASET('U', m-1, m-1, zero, zero, work(ir+ldwrkr), & + CALL SLASET('U', m-1, m-1, zero, zero, work(ir+ldwrkr), & ldwrkr) - CALL SORGLQ(n, n, m, vt, ldvt, work(itau), work(iwork), & + CALL SORGLQ(n, n, m, vt, ldvt, work(itau), work(iwork), & lwork-iwork+1, ierr) ie = itau itauq = ie + m itaup = itauq + m iwork = itaup + m - CALL SGEBRD(m, m, work(ir), ldwrkr, s, work(ie), & - work(itauq), work(itaup), work(iwork), lwork-iwork+1, & + CALL SGEBRD(m, m, work(ir), ldwrkr, s, work(ie), & + work(itauq), work(itaup), work(iwork), lwork-iwork+1, & ierr) - CALL SORGBR('P', m, m, m, work(ir), ldwrkr, work(itaup), & - work(iwork), lwork-iwork+1, ierr) + CALL SORGBR('P', m, m, m, work(ir), ldwrkr, & + work(itaup), work(iwork), lwork-iwork+1, ierr) iwork = ie + m - CALL SBDSQR('U', m, m, 0_ip_, 0_ip_, s, work(ie), & - work(ir), ldwrkr, dum, 1_ip_, dum, 1_ip_, work(iwork), & + CALL SBDSQR('U', m, m, 0_ip_, 0_ip_, s, work(ie), & + work(ir), ldwrkr, dum, 1_ip_, dum, 1_ip_, work(iwork),& info) - CALL SGEMM('N', 'N', m, n, m, one, work(ir), ldwrkr, vt, & - ldvt, zero, a, lda) + CALL SGEMM('N', 'N', m, n, m, one, work(ir), ldwrkr, & + vt, ldvt, zero, a, lda) CALL SLACPY('F', m, n, a, lda, vt, ldvt) ELSE itau = 1 iwork = itau + m - CALL SGELQF(m, n, a, lda, work(itau), work(iwork), & + CALL SGELQF(m, n, a, lda, work(itau), work(iwork), & lwork-iwork+1, ierr) CALL SLACPY('U', m, n, a, lda, vt, ldvt) - CALL SORGLQ(n, n, m, vt, ldvt, work(itau), work(iwork), & + CALL SORGLQ(n, n, m, vt, ldvt, work(itau), work(iwork), & lwork-iwork+1, ierr) ie = itau itauq = ie + m itaup = itauq + m iwork = itaup + m CALL SLASET('U', m-1, m-1, zero, zero, a(1,2), lda) - CALL SGEBRD(m, m, a, lda, s, work(ie), work(itauq), & + CALL SGEBRD(m, m, a, lda, s, work(ie), work(itauq), & work(itaup), work(iwork), lwork-iwork+1, ierr) - CALL SORMBR('P', 'L', 'T', m, n, m, a, lda, work(itaup), & - vt, ldvt, work(iwork), lwork-iwork+1, ierr) + CALL SORMBR('P', 'L', 'T', m, n, m, a, lda, & + work(itaup), vt, ldvt, work(iwork), lwork-iwork+1, & + ierr) iwork = ie + m - CALL SBDSQR('U', m, n, 0_ip_, 0_ip_, s, work(ie), vt, & + CALL SBDSQR('U', m, n, 0_ip_, 0_ip_, s, work(ie), vt, & ldvt, dum, 1_ip_, dum, 1_ip_, work(iwork), info) END IF ELSE IF (wntuo) THEN @@ -19873,55 +19959,57 @@ SUBROUTINE SGESVD(jobu, jobvt, m, n, a, lda, s, u, ldu, vt, ldvt, & END IF itau = ir + ldwrkr*m iwork = itau + m - CALL SGELQF(m, n, a, lda, work(itau), work(iwork), & + CALL SGELQF(m, n, a, lda, work(itau), work(iwork), & lwork-iwork+1, ierr) CALL SLACPY('U', m, n, a, lda, vt, ldvt) - CALL SORGLQ(n, n, m, vt, ldvt, work(itau), work(iwork), & + CALL SORGLQ(n, n, m, vt, ldvt, work(itau), work(iwork), & lwork-iwork+1, ierr) CALL SLACPY('L', m, m, a, lda, work(iu), ldwrku) - CALL SLASET('U', m-1, m-1, zero, zero, work(iu+ldwrku), & + CALL SLASET('U', m-1, m-1, zero, zero, work(iu+ldwrku), & ldwrku) ie = itau itauq = ie + m itaup = itauq + m iwork = itaup + m - CALL SGEBRD(m, m, work(iu), ldwrku, s, work(ie), & - work(itauq), work(itaup), work(iwork), lwork-iwork+1, & + CALL SGEBRD(m, m, work(iu), ldwrku, s, work(ie), & + work(itauq), work(itaup), work(iwork), lwork-iwork+1, & ierr) - CALL SLACPY('L', m, m, work(iu), ldwrku, work(ir), & + CALL SLACPY('L', m, m, work(iu), ldwrku, work(ir), & ldwrkr) - CALL SORGBR('P', m, m, m, work(iu), ldwrku, work(itaup), & - work(iwork), lwork-iwork+1, ierr) - CALL SORGBR('Q', m, m, m, work(ir), ldwrkr, work(itauq), & - work(iwork), lwork-iwork+1, ierr) + CALL SORGBR('P', m, m, m, work(iu), ldwrku, & + work(itaup), work(iwork), lwork-iwork+1, ierr) + CALL SORGBR('Q', m, m, m, work(ir), ldwrkr, & + work(itauq), work(iwork), lwork-iwork+1, ierr) iwork = ie + m - CALL SBDSQR('U', m, m, m, 0_ip_, s, work(ie), work(iu), & - ldwrku, work(ir), ldwrkr, dum, 1_ip_, work(iwork), info) - CALL SGEMM('N', 'N', m, n, m, one, work(iu), ldwrku, vt, & - ldvt, zero, a, lda) + CALL SBDSQR('U', m, m, m, 0_ip_, s, work(ie), work(iu), & + ldwrku, work(ir), ldwrkr, dum, 1_ip_, work(iwork), & + info) + CALL SGEMM('N', 'N', m, n, m, one, work(iu), ldwrku, & + vt, ldvt, zero, a, lda) CALL SLACPY('F', m, n, a, lda, vt, ldvt) CALL SLACPY('F', m, m, work(ir), ldwrkr, a, lda) ELSE itau = 1 iwork = itau + m - CALL SGELQF(m, n, a, lda, work(itau), work(iwork), & + CALL SGELQF(m, n, a, lda, work(itau), work(iwork), & lwork-iwork+1, ierr) CALL SLACPY('U', m, n, a, lda, vt, ldvt) - CALL SORGLQ(n, n, m, vt, ldvt, work(itau), work(iwork), & + CALL SORGLQ(n, n, m, vt, ldvt, work(itau), work(iwork), & lwork-iwork+1, ierr) ie = itau itauq = ie + m itaup = itauq + m iwork = itaup + m CALL SLASET('U', m-1, m-1, zero, zero, a(1,2), lda) - CALL SGEBRD(m, m, a, lda, s, work(ie), work(itauq), & + CALL SGEBRD(m, m, a, lda, s, work(ie), work(itauq), & work(itaup), work(iwork), lwork-iwork+1, ierr) - CALL SORMBR('P', 'L', 'T', m, n, m, a, lda, work(itaup), & - vt, ldvt, work(iwork), lwork-iwork+1, ierr) - CALL SORGBR('Q', m, m, m, a, lda, work(itauq), & + CALL SORMBR('P', 'L', 'T', m, n, m, a, lda, & + work(itaup), vt, ldvt, work(iwork), lwork-iwork+1, & + ierr) + CALL SORGBR('Q', m, m, m, a, lda, work(itauq), & work(iwork), lwork-iwork+1, ierr) iwork = ie + m - CALL SBDSQR('U', m, n, m, 0_ip_, s, work(ie), vt, ldvt, & + CALL SBDSQR('U', m, n, m, 0_ip_, s, work(ie), vt, ldvt, & a, lda, dum, 1_ip_, work(iwork), info) END IF ELSE IF (wntuas) THEN @@ -19934,39 +20022,39 @@ SUBROUTINE SGESVD(jobu, jobvt, m, n, a, lda, s, u, ldu, vt, ldvt, & END IF itau = iu + ldwrku*m iwork = itau + m - CALL SGELQF(m, n, a, lda, work(itau), work(iwork), & + CALL SGELQF(m, n, a, lda, work(itau), work(iwork), & lwork-iwork+1, ierr) CALL SLACPY('U', m, n, a, lda, vt, ldvt) - CALL SORGLQ(n, n, m, vt, ldvt, work(itau), work(iwork), & + CALL SORGLQ(n, n, m, vt, ldvt, work(itau), work(iwork), & lwork-iwork+1, ierr) CALL SLACPY('L', m, m, a, lda, work(iu), ldwrku) - CALL SLASET('U', m-1, m-1, zero, zero, work(iu+ldwrku), & + CALL SLASET('U', m-1, m-1, zero, zero, work(iu+ldwrku), & ldwrku) ie = itau itauq = ie + m itaup = itauq + m iwork = itaup + m - CALL SGEBRD(m, m, work(iu), ldwrku, s, work(ie), & - work(itauq), work(itaup), work(iwork), lwork-iwork+1, & + CALL SGEBRD(m, m, work(iu), ldwrku, s, work(ie), & + work(itauq), work(itaup), work(iwork), lwork-iwork+1, & ierr) CALL SLACPY('L', m, m, work(iu), ldwrku, u, ldu) - CALL SORGBR('P', m, m, m, work(iu), ldwrku, work(itaup), & - work(iwork), lwork-iwork+1, ierr) - CALL SORGBR('Q', m, m, m, u, ldu, work(itauq), & + CALL SORGBR('P', m, m, m, work(iu), ldwrku, & + work(itaup), work(iwork), lwork-iwork+1, ierr) + CALL SORGBR('Q', m, m, m, u, ldu, work(itauq), & work(iwork), lwork-iwork+1, ierr) iwork = ie + m - CALL SBDSQR('U', m, m, m, 0_ip_, s, work(ie), work(iu), & + CALL SBDSQR('U', m, m, m, 0_ip_, s, work(ie), work(iu), & ldwrku, u, ldu, dum, 1_ip_, work(iwork), info) - CALL SGEMM('N', 'N', m, n, m, one, work(iu), ldwrku, vt, & - ldvt, zero, a, lda) + CALL SGEMM('N', 'N', m, n, m, one, work(iu), ldwrku, & + vt, ldvt, zero, a, lda) CALL SLACPY('F', m, n, a, lda, vt, ldvt) ELSE itau = 1 iwork = itau + m - CALL SGELQF(m, n, a, lda, work(itau), work(iwork), & + CALL SGELQF(m, n, a, lda, work(itau), work(iwork), & lwork-iwork+1, ierr) CALL SLACPY('U', m, n, a, lda, vt, ldvt) - CALL SORGLQ(n, n, m, vt, ldvt, work(itau), work(iwork), & + CALL SORGLQ(n, n, m, vt, ldvt, work(itau), work(iwork), & lwork-iwork+1, ierr) CALL SLACPY('L', m, m, a, lda, u, ldu) CALL SLASET('U', m-1, m-1, zero, zero, u(1,2), ldu) @@ -19974,14 +20062,15 @@ SUBROUTINE SGESVD(jobu, jobvt, m, n, a, lda, s, u, ldu, vt, ldvt, & itauq = ie + m itaup = itauq + m iwork = itaup + m - CALL SGEBRD(m, m, u, ldu, s, work(ie), work(itauq), & + CALL SGEBRD(m, m, u, ldu, s, work(ie), work(itauq), & work(itaup), work(iwork), lwork-iwork+1, ierr) - CALL SORMBR('P', 'L', 'T', m, n, m, u, ldu, work(itaup), & - vt, ldvt, work(iwork), lwork-iwork+1, ierr) - CALL SORGBR('Q', m, m, m, u, ldu, work(itauq), & + CALL SORMBR('P', 'L', 'T', m, n, m, u, ldu, & + work(itaup), vt, ldvt, work(iwork), lwork-iwork+1, & + ierr) + CALL SORGBR('Q', m, m, m, u, ldu, work(itauq), & work(iwork), lwork-iwork+1, ierr) iwork = ie + m - CALL SBDSQR('U', m, n, m, 0_ip_, s, work(ie), vt, ldvt, & + CALL SBDSQR('U', m, n, m, 0_ip_, s, work(ie), vt, ldvt, & u, ldu, dum, 1_ip_, work(iwork), info) END IF END IF @@ -19991,26 +20080,26 @@ SUBROUTINE SGESVD(jobu, jobvt, m, n, a, lda, s, u, ldu, vt, ldvt, & itauq = ie + m itaup = itauq + m iwork = itaup + m - CALL SGEBRD(m, n, a, lda, s, work(ie), work(itauq), & + CALL SGEBRD(m, n, a, lda, s, work(ie), work(itauq), & work(itaup), work(iwork), lwork-iwork+1, ierr) IF (wntuas) THEN CALL SLACPY('L', m, m, a, lda, u, ldu) - CALL SORGBR('Q', m, m, n, u, ldu, work(itauq), work(iwork), & + CALL SORGBR('Q', m, m, n, u, ldu, work(itauq), work(iwork), & lwork-iwork+1, ierr) END IF IF (wntvas) THEN CALL SLACPY('U', m, n, a, lda, vt, ldvt) IF (wntva) nrvt = n IF (wntvs) nrvt = m - CALL SORGBR('P', nrvt, n, m, vt, ldvt, work(itaup), & + CALL SORGBR('P', nrvt, n, m, vt, ldvt, work(itaup), & work(iwork), lwork-iwork+1, ierr) END IF IF (wntuo) THEN - CALL SORGBR('Q', m, m, n, a, lda, work(itauq), work(iwork), & + CALL SORGBR('Q', m, m, n, a, lda, work(itauq), work(iwork), & lwork-iwork+1, ierr) END IF IF (wntvo) THEN - CALL SORGBR('P', m, n, m, a, lda, work(itaup), work(iwork), & + CALL SORGBR('P', m, n, m, a, lda, work(itaup), work(iwork), & lwork-iwork+1, ierr) END IF iwork = ie + m @@ -20019,14 +20108,14 @@ SUBROUTINE SGESVD(jobu, jobvt, m, n, a, lda, s, u, ldu, vt, ldvt, & IF (wntvas .OR. wntvo) ncvt = n IF (wntvn) ncvt = 0 IF ((.NOT. wntuo) .AND. (.NOT. wntvo)) THEN - CALL SBDSQR('L', m, ncvt, nru, 0_ip_, s, work(ie), vt, ldvt, & - u, ldu, dum, 1_ip_, work(iwork), info) + CALL SBDSQR('L', m, ncvt, nru, 0_ip_, s, work(ie), vt, & + ldvt, u, ldu, dum, 1_ip_, work(iwork), info) ELSE IF ((.NOT. wntuo) .AND. wntvo) THEN - CALL SBDSQR('L', m, ncvt, nru, 0_ip_, s, work(ie), a, lda, & + CALL SBDSQR('L', m, ncvt, nru, 0_ip_, s, work(ie), a, lda, & u, ldu, dum, 1_ip_, work(iwork), info) ELSE - CALL SBDSQR('L', m, ncvt, nru, 0_ip_, s, work(ie), vt, ldvt, & - a, lda, dum, 1_ip_, work(iwork), info) + CALL SBDSQR('L', m, ncvt, nru, 0_ip_, s, work(ie), vt, & + ldvt, a, lda, dum, 1_ip_, work(iwork), info) END IF END IF END IF @@ -20043,13 +20132,13 @@ SUBROUTINE SGESVD(jobu, jobvt, m, n, a, lda, s, u, ldu, vt, ldvt, & END IF END IF IF (iscl==1) THEN - IF (anrm>bignum) CALL SLASCL('G', 0_ip_, 0_ip_, bignum, anrm, & + IF (anrm>bignum) CALL SLASCL('G', 0_ip_, 0_ip_, bignum, anrm, & minmn, 1_ip_, s, minmn, ierr) - IF (info/=0 .AND. anrm>bignum) CALL SLASCL('G', 0_ip_, 0_ip_, & + IF (info/=0 .AND. anrm>bignum) CALL SLASCL('G', 0_ip_, 0_ip_, & bignum, anrm, minmn-1, 1_ip_, work(2), minmn, ierr) - IF (anrm0) info = iinfo CALL SLASWP(n2, a(1,n1+1), lda, 1_ip_, n1, ipiv, 1_ip_) - CALL STRSM('L', 'L', 'N', 'U', n1, n2, one, a, lda, a(1,n1+1), & + CALL STRSM('L', 'L', 'N', 'U', n1, n2, one, a, lda, a(1,n1+1), & lda) - CALL SGEMM('N', 'N', m-n1, n2, n1, -one, a(n1+1,1), lda, a(1, & + CALL SGEMM('N', 'N', m-n1, n2, n1, -one, a(n1+1,1), lda, a(1, & n1+1), lda, one, a(n1+1,n1+1), lda) CALL SGETRF2(m-n1, n2, a(n1+1,n1+1), lda, ipiv(n1+1), iinfo) IF (info==0 .AND. iinfo>0) info = iinfo + n1 @@ -20247,7 +20336,7 @@ SUBROUTINE SGETRS(trans, n, nrhs, a, lda, ipiv, b, ldb, info) INTRINSIC :: MAX info = 0 notran = LSAME(trans, 'N') - IF (.NOT. notran .AND. .NOT. LSAME(trans,'T') .AND. .NOT. & + IF (.NOT. notran .AND. .NOT. LSAME(trans,'T') .AND. .NOT. & LSAME(trans,'C')) THEN info = -1 ELSE IF (n<0) THEN @@ -20266,21 +20355,21 @@ SUBROUTINE SGETRS(trans, n, nrhs, a, lda, ipiv, b, ldb, info) IF (n==0 .OR. nrhs==0) RETURN IF (notran) THEN CALL SLASWP(nrhs, b, ldb, 1_ip_, n, ipiv, 1_ip_) - CALL STRSM('Left', 'Lower', 'No transpose', 'Unit', n, nrhs, & - one, a, lda, b, ldb) - CALL STRSM('Left', 'Upper', 'No transpose', 'Non-unit', n, nrhs, & + CALL STRSM('Left', 'Lower', 'No transpose', 'Unit', n, nrhs, & one, a, lda, b, ldb) + CALL STRSM('Left', 'Upper', 'No transpose', 'Non-unit', n, & + nrhs, one, a, lda, b, ldb) ELSE - CALL STRSM('Left', 'Upper', 'Transpose', 'Non-unit', n, nrhs, & + CALL STRSM('Left', 'Upper', 'Transpose', 'Non-unit', n, nrhs, & one, a, lda, b, ldb) - CALL STRSM('Left', 'Lower', 'Transpose', 'Unit', n, nrhs, one, & + CALL STRSM('Left', 'Lower', 'Transpose', 'Unit', n, nrhs, one, & a, lda, b, ldb) CALL SLASWP(nrhs, b, ldb, 1_ip_, n, ipiv, -1_ip_) END IF RETURN END SUBROUTINE - SUBROUTINE SHSEQR(job, compz, n, ilo, ihi, h, ldh, wr, wi, z, ldz, & + SUBROUTINE SHSEQR(job, compz, n, ilo, ihi, h, ldh, wr, wi, z, ldz, & work, lwork, info) USE GALAHAD_KINDS INTEGER(ip_) :: ihi, ilo, info, ldh, ldz, lwork, n @@ -20298,7 +20387,8 @@ SUBROUTINE SHSEQR(job, compz, n, ilo, ihi, h, ldh, wr, wi, z, ldz, & INTEGER(ip_) :: ILAENV LOGICAL :: LSAME EXTERNAL :: ILAENV, LSAME - EXTERNAL :: SLACPY, SLAHQR, SLAQR0, SLASET, XERBLA + EXTERNAL :: SLACPY, SLAHQR, SLAQR0, SLASET, & + XERBLA INTRINSIC :: MAX, MIN, REAL wantt = LSAME(job, 'S') initz = LSAME(compz, 'I') @@ -20329,8 +20419,8 @@ SUBROUTINE SHSEQR(job, compz, n, ilo, ihi, h, ldh, wr, wi, z, ldz, & ELSE IF (n==0) THEN RETURN ELSE IF (lquery) THEN - CALL SLAQR0(wantt, wantz, n, ilo, ihi, h, ldh, wr, wi, ilo, ihi, & - z, ldz, work, lwork, info) + CALL SLAQR0(wantt, wantz, n, ilo, ihi, h, ldh, wr, wi, ilo, & + ihi, z, ldz, work, lwork, info) work(1) = MAX(REAL(MAX(1,n)), work(1)) RETURN ELSE @@ -20348,32 +20438,32 @@ SUBROUTINE SHSEQR(job, compz, n, ilo, ihi, h, ldh, wr, wi, z, ldz, & wi(ilo) = zero RETURN END IF - nmin = ILAENV(12_ip_, 'SHSEQR', job(:1)//compz(:1), n, ilo, ihi, & - lwork) + nmin = ILAENV(12_ip_, 'SHSEQR', job(:1)//compz(:1), n, ilo, & + ihi, lwork) nmin = MAX(ntiny, nmin) IF (n>nmin) THEN - CALL SLAQR0(wantt, wantz, n, ilo, ihi, h, ldh, wr, wi, ilo, & + CALL SLAQR0(wantt, wantz, n, ilo, ihi, h, ldh, wr, wi, ilo, & ihi, z, ldz, work, lwork, info) ELSE - CALL SLAHQR(wantt, wantz, n, ilo, ihi, h, ldh, wr, wi, ilo, & + CALL SLAHQR(wantt, wantz, n, ilo, ihi, h, ldh, wr, wi, ilo, & ihi, z, ldz, info) IF (info>0) THEN kbot = info IF (n>=nl) THEN - CALL SLAQR0(wantt, wantz, n, ilo, kbot, h, ldh, wr, wi, & + CALL SLAQR0(wantt, wantz, n, ilo, kbot, h, ldh, wr, wi, & ilo, ihi, z, ldz, work, lwork, info) ELSE CALL SLACPY('A', n, n, h, ldh, hl, nl) hl(n+1, n) = zero CALL SLASET('A', nl, nl-n, zero, zero, hl(1,n+1), nl) - CALL SLAQR0(wantt, wantz, nl, ilo, kbot, hl, nl, wr, wi, & + CALL SLAQR0(wantt, wantz, nl, ilo, kbot, hl, nl, wr, wi, & ilo, ihi, z, ldz, workl, nl, info) - IF (wantt .OR. info/=0) CALL SLACPY('A', n, n, hl, nl, h, & + IF (wantt .OR. info/=0) CALL SLACPY('A', n, n, hl, nl, h, & ldh) END IF END IF END IF - IF ((wantt .OR. info/=0) .AND. n>2) CALL SLASET('L', n-2, n-2, & + IF ((wantt .OR. info/=0) .AND. n>2) CALL SLASET('L', n-2, n-2, & zero, zero, h(3,1), ldh) work(1) = MAX(REAL(MAX(1,n)), work(1)) END IF @@ -20399,11 +20489,11 @@ SUBROUTINE SLABAD(small, large) RETURN END SUBROUTINE - SUBROUTINE SLABRD(m, n, nb, a, lda, d, e, tauq, taup, x, ldx, y, & + SUBROUTINE SLABRD(m, n, nb, a, lda, d, e, tauq, taup, x, ldx, y, & ldy) USE GALAHAD_KINDS INTEGER(ip_) :: lda, ldx, ldy, m, n, nb - REAL(r4_) :: a(lda, *), d(*), e(*), taup(*), tauq(*), x(ldx, *), & + REAL(r4_) :: a(lda, *), d(*), e(*), taup(*), tauq(*), x(ldx, *), & y(ldy, *) REAL(r4_) :: zero, one PARAMETER (zero=0.0_r4_, one=1.0_r4_) @@ -20413,83 +20503,83 @@ SUBROUTINE SLABRD(m, n, nb, a, lda, d, e, tauq, taup, x, ldx, y, & IF (m<=0 .OR. n<=0) RETURN IF (m>=n) THEN DO i = 1, nb - CALL SGEMV('No transpose', m-i+1, i-1, -one, a(i,1), lda, y(i, & - 1), ldy, one, a(i,i), 1_ip_) - CALL SGEMV('No transpose', m-i+1, i-1, -one, x(i,1), ldx, a(1, & - i), 1_ip_, one, a(i,i), 1_ip_) + CALL SGEMV('No transpose', m-i+1, i-1, -one, a(i,1), lda, & + y(i,1), ldy, one, a(i,i), 1_ip_) + CALL SGEMV('No transpose', m-i+1, i-1, -one, x(i,1), ldx, & + a(1,i), 1_ip_, one, a(i,i), 1_ip_) CALL SLARFG(m-i+1, a(i,i), a(MIN(i+1,m),i), 1_ip_, tauq(i)) d(i) = a(i, i) IF (ithresh) GO TO & - 50 + IF (MAX(ABS(d(3,1)),ABS(d(3,2)),ABS(d(3,3)- t11))>thresh) GO & + TO 50 CALL SLARFX('L', 3_ip_, n-j1+1, u, tau, t(j1,j1), ldt, work) CALL SLARFX('R', j2, 3_ip_, u, tau, t(1,j1), ldt, work) t(j3, j1) = zero @@ -20915,8 +21005,8 @@ SUBROUTINE SLAEXC(wantq, n, t, ldt, q, ldq, j1, n1, n2, work, info) t33 = t(j3, j3) CALL SLARFX('L', 3_ip_, 3_ip_, u, tau, d, ldd, work) CALL SLARFX('R', 3_ip_, 3_ip_, u, tau, d, ldd, work) - IF (MAX(ABS(d(2,1)),ABS(d(3,1)),ABS(d(1,1)- t33))>thresh) GO TO & - 50 + IF (MAX(ABS(d(2,1)),ABS(d(3,1)),ABS(d(1,1)- t33))>thresh) GO & + TO 50 CALL SLARFX('R', j3, 3_ip_, u, tau, t(1,j1), ldt, work) CALL SLARFX('L', 3_ip_, n-j1, u, tau, t(j1,j2), ldt, work) t(j1, j1) = t33 @@ -20942,7 +21032,7 @@ SUBROUTINE SLAEXC(wantq, n, t, ldt, q, ldq, j1, n1, n2, work, info) CALL SLARFX('R', 4_ip_, 3_ip_, u1, tau1, d, ldd, work) CALL SLARFX('L', 3_ip_, 4_ip_, u2, tau2, d(2,1), ldd, work) CALL SLARFX('R', 4_ip_, 3_ip_, u2, tau2, d(1,2), ldd, work) - IF (MAX(ABS(d(3,1)),ABS(d(3,2)),ABS(d(4,1)),ABS( d(4, & + IF (MAX(ABS(d(3,1)),ABS(d(3,2)),ABS(d(4,1)),ABS( d(4, & 2)))>thresh) GO TO 50 CALL SLARFX('L', 3_ip_, n-j1+1, u1, tau1, t(j1,j1), ldt, work) CALL SLARFX('R', j4, 3_ip_, u1, tau1, t(1,j1), ldt, work) @@ -20958,22 +21048,22 @@ SUBROUTINE SLAEXC(wantq, n, t, ldt, q, ldq, j1, n1, n2, work, info) END IF 40 CONTINUE IF (n2==2) THEN - CALL SLANV2(t(j1,j1), t(j1,j2), t(j2,j1), t(j2,j2), wr1, wi1, & + CALL SLANV2(t(j1,j1), t(j1,j2), t(j2,j1), t(j2,j2), wr1, wi1, & wr2, wi2, cs, sn) CALL SROT(n-j1-1, t(j1,j1+2), ldt, t(j2,j1+2), ldt, cs, sn) CALL SROT(j1-1, t(1,j1), 1_ip_, t(1,j2), 1_ip_, cs, sn) - IF (wantq) CALL SROT(n, q(1,j1), 1_ip_, q(1,j2), 1_ip_, cs, & + IF (wantq) CALL SROT(n, q(1,j1), 1_ip_, q(1,j2), 1_ip_, cs, & sn) END IF IF (n1==2) THEN j3 = j1 + n2 j4 = j3 + 1 - CALL SLANV2(t(j3,j3), t(j3,j4), t(j4,j3), t(j4,j4), wr1, wi1, & + CALL SLANV2(t(j3,j3), t(j3,j4), t(j4,j3), t(j4,j4), wr1, wi1, & wr2, wi2, cs, sn) - IF (j3+2<=n) CALL SROT(n-j3-1, t(j3,j3+2), ldt, t(j4,j3+2), & + IF (j3+2<=n) CALL SROT(n-j3-1, t(j3,j3+2), ldt, t(j4,j3+2), & ldt, cs, sn) CALL SROT(j3-1, t(1,j3), 1_ip_, t(1,j4), 1_ip_, cs, sn) - IF (wantq) CALL SROT(n, q(1,j3), 1_ip_, q(1,j4), 1_ip_, cs, & + IF (wantq) CALL SROT(n, q(1,j3), 1_ip_, q(1,j4), 1_ip_, cs, & sn) END IF END IF @@ -20982,7 +21072,7 @@ SUBROUTINE SLAEXC(wantq, n, t, ldt, q, ldq, j1, n1, n2, work, info) RETURN END SUBROUTINE - SUBROUTINE SLAHQR(wantt, wantz, n, ilo, ihi, h, ldh, wr, wi, iloz, & + SUBROUTINE SLAHQR(wantt, wantz, n, ilo, ihi, h, ldh, wr, wi, iloz, & ihiz, z, ldz, info) USE GALAHAD_KINDS IMPLICIT NONE @@ -20995,10 +21085,10 @@ SUBROUTINE SLAHQR(wantt, wantz, n, ilo, ihi, h, ldh, wr, wi, iloz, & PARAMETER (dat1=3.0_r4_/4.0_r4_, dat2=-0.4375_r4_) INTEGER(ip_) :: kexsh PARAMETER (kexsh=10) - REAL(r4_) :: aa, ab, ba, bb, cs, det, h11, h12, h21, h21s, h22, & - rt1i, rt1r, rt2i, rt2r, rtdisc, s, safmax, safmin, smlnum, sn, & + REAL(r4_) :: aa, ab, ba, bb, cs, det, h11, h12, h21, h21s, h22, & + rt1i, rt1r, rt2i, rt2r, rtdisc, s, safmax, safmin, smlnum, sn, & sum, t1, t2, t3, tr, tst, ulp, v2, v3 - INTEGER(ip_) :: i, i1, i2, its, itmax, j, k, l, m, nh, nr, nz, & + INTEGER(ip_) :: i, i1, i2, its, itmax, j, k, l, m, nh, nr, nz, & kdefl REAL(r4_) :: v(3) REAL(r4_) :: SLAMCH @@ -21117,7 +21207,7 @@ SUBROUTINE SLAHQR(wantt, wantz, n, ilo, ihi, h, ldh, wr, wi, iloz, & h21s = h(m+1, m) s = ABS(h(m,m)-rt2r) + ABS(rt2i) + ABS(h21s) h21s = h(m+1, m)/s - v(1) = h21s*h(m, m+1) + (h(m,m)-rt1r)*((h(m, m)-rt2r)/s) - & + v(1) = h21s*h(m, m+1) + (h(m,m)-rt1r)*((h(m, m)-rt2r)/s) - & rt1i*(rt2i/s) v(2) = h21s*(h(m,m)+h(m+1,m+1)-rt1r-rt2r) v(3) = h21s*h(m+2, m+1) @@ -21126,7 +21216,7 @@ SUBROUTINE SLAHQR(wantt, wantz, n, ilo, ihi, h, ldh, wr, wi, iloz, & v(2) = v(2)/s v(3) = v(3)/s IF (m==l) GO TO 60 - IF (ABS(h(m,m-1))*(ABS(v(2))+ABS(v(3)))<=ulp*ABS(v(1))*(ABS( & + IF (ABS(h(m,m-1))*(ABS(v(2))+ABS(v(3)))<=ulp*ABS(v(1))*(ABS( & h(m-1,m-1))+ABS(h(m,m))+ABS(h(m+1,m+1)))) GO TO 60 END DO 60 CONTINUE @@ -21194,10 +21284,10 @@ SUBROUTINE SLAHQR(wantt, wantz, n, ilo, ihi, h, ldh, wr, wi, iloz, & wr(i) = h(i, i) wi(i) = zero ELSE IF (l==i-1) THEN - CALL SLANV2(h(i-1,i-1), h(i-1,i), h(i,i-1), h(i,i), wr(i-1), & + CALL SLANV2(h(i-1,i-1), h(i-1,i), h(i,i-1), h(i,i), wr(i-1), & wi(i-1), wr(i), wi(i), cs, sn) IF (wantt) THEN - IF (i2>i) CALL SROT(i2-i, h(i-1,i+1), ldh, h(i,i+1), ldh, cs, & + IF (i2>i) CALL SROT(i2-i, h(i-1,i+1), ldh, h(i,i+1), ldh, cs, & sn) CALL SROT(i-i1-1, h(i1,i-1), 1_ip_, h(i1,i), 1_ip_, cs, sn) END IF @@ -21220,50 +21310,51 @@ SUBROUTINE SLAHR2(n, k, nb, a, lda, tau, t, ldt, y, ldy) PARAMETER (zero=0.0_r4_, one=1.0_r4_) INTEGER(ip_) :: i REAL(r4_) :: ei - EXTERNAL :: SAXPY, SCOPY, SGEMM, SGEMV, SLACPY, & + EXTERNAL :: SAXPY, SCOPY, SGEMM, SGEMV, SLACPY, & SLARFG, SSCAL, STRMM, STRMV INTRINSIC :: MIN IF (n<=1) RETURN DO i = 1, nb IF (i>1) THEN - CALL SGEMV('NO TRANSPOSE', n-k, i-1, -one, y(k+1,1), ldy, & + CALL SGEMV('NO TRANSPOSE', n-k, i-1, -one, y(k+1,1), ldy, & a(k+i-1,1), lda, one, a(k+1,i), 1_ip_) CALL SCOPY(i-1, a(k+1,i), 1_ip_, t(1,nb), 1_ip_) - CALL STRMV('Lower', 'Transpose', 'UNIT', i-1, a(k+1,1), lda, & + CALL STRMV('Lower', 'Transpose', 'UNIT', i-1, a(k+1,1), lda, & t(1,nb), 1_ip_) - CALL SGEMV('Transpose', n-k-i+1, i-1, one, a(k+i,1), lda, & + CALL SGEMV('Transpose', n-k-i+1, i-1, one, a(k+i,1), lda, & a(k+i,i), 1_ip_, one, t(1,nb), 1_ip_) - CALL STRMV('Upper', 'Transpose', 'NON-UNIT', i-1, t, ldt, t(1, & - nb), 1_ip_) - CALL SGEMV('NO TRANSPOSE', n-k-i+1, i-1, -one, a(k+i,1), lda, & + CALL STRMV('Upper', 'Transpose', 'NON-UNIT', i-1, t, ldt, & + t(1,nb), 1_ip_) + CALL SGEMV('NO TRANSPOSE', n-k-i+1, i-1, -one, a(k+i,1), lda, & t(1,nb), 1_ip_, one, a(k+i,i), 1_ip_) - CALL STRMV('Lower', 'NO TRANSPOSE', 'UNIT', i-1, a(k+1,1), & + CALL STRMV('Lower', 'NO TRANSPOSE', 'UNIT', i-1, a(k+1,1), & lda, t(1,nb), 1_ip_) CALL SAXPY(i-1, -one, t(1,nb), 1_ip_, a(k+1,i), 1_ip_) a(k+i-1, i-1) = ei END IF - CALL SLARFG(n-k-i+1, a(k+i,i), a(MIN(k+i+1,n),i), 1_ip_, tau(i)) + CALL SLARFG(n-k-i+1, a(k+i,i), a(MIN(k+i+1,n),i), 1_ip_, & + tau(i)) ei = a(k+i, i) a(k+i, i) = one - CALL SGEMV('NO TRANSPOSE', n-k, n-k-i+1, one, a(k+1,i+1), lda, & + CALL SGEMV('NO TRANSPOSE', n-k, n-k-i+1, one, a(k+1,i+1), lda, & a(k+i,i), 1_ip_, zero, y(k+1,i), 1_ip_) - CALL SGEMV('Transpose', n-k-i+1, i-1, one, a(k+i,1), lda, a(k+i, & - i), 1_ip_, zero, t(1,i), 1_ip_) - CALL SGEMV('NO TRANSPOSE', n-k, i-1, -one, y(k+1,1), ldy, t(1, & + CALL SGEMV('Transpose', n-k-i+1, i-1, one, a(k+i,1), lda, & + a(k+i,i), 1_ip_, zero, t(1,i), 1_ip_) + CALL SGEMV('NO TRANSPOSE', n-k, i-1, -one, y(k+1,1), ldy, t(1, & i), 1_ip_, one, y(k+1,i), 1_ip_) CALL SSCAL(n-k, tau(i), y(k+1,i), 1_ip_) CALL SSCAL(i-1, -tau(i), t(1,i), 1_ip_) - CALL STRMV('Upper', 'No Transpose', 'NON-UNIT', i-1, t, ldt, & + CALL STRMV('Upper', 'No Transpose', 'NON-UNIT', i-1, t, ldt, & t(1,i), 1_ip_) t(i, i) = tau(i) END DO a(k+nb, nb) = ei CALL SLACPY('ALL', k, nb, a(1,2), lda, y, ldy) - CALL STRMM('RIGHT', 'Lower', 'NO TRANSPOSE', 'UNIT', k, nb, one, & + CALL STRMM('RIGHT', 'Lower', 'NO TRANSPOSE', 'UNIT', k, nb, one, & a(k+1,1), lda, y, ldy) - IF (n>k+nb) CALL SGEMM('NO TRANSPOSE', 'NO TRANSPOSE', k, nb, & + IF (n>k+nb) CALL SGEMM('NO TRANSPOSE', 'NO TRANSPOSE', k, nb, & n-k-nb, one, a(1,2+nb), lda, a(k+1+nb,1), lda, one, y, ldy) - CALL STRMM('RIGHT', 'Upper', 'NO TRANSPOSE', 'NON-UNIT', k, nb, & + CALL STRMM('RIGHT', 'Upper', 'NO TRANSPOSE', 'NON-UNIT', k, nb, & one, t, ldt, y, ldy) RETURN END SUBROUTINE @@ -21277,8 +21368,8 @@ SUBROUTINE SLAIC1(job, j, x, sest, w, gamma, sestpr, s, c) PARAMETER (zero=0.0_r4_, one=1.0_r4_, two=2.0_r4_) REAL(r4_) :: half, four PARAMETER (half=0.5_r4_, four=4.0_r4_) - REAL(r4_) :: absalp, absest, absgam, alpha, b, cosine, eps, norma, & - s1, s2, sine, t, test, tmp, zeta1, zeta2 + REAL(r4_) :: absalp, absest, absgam, alpha, b, cosine, eps, & + norma, s1, s2, sine, t, test, tmp, zeta1, zeta2 INTRINSIC :: ABS, MAX, SIGN, SQRT REAL(r4_) :: SDOT, SLAMCH EXTERNAL :: SDOT, SLAMCH @@ -21414,7 +21505,7 @@ SUBROUTINE SLAIC1(job, j, x, sest, w, gamma, sestpr, s, c) ELSE zeta1 = alpha/absest zeta2 = gamma/absest - norma = MAX(one+zeta1*zeta1+ABS(zeta1*zeta2), & + norma = MAX(one+zeta1*zeta1+ABS(zeta1*zeta2), & ABS(zeta1*zeta2)+zeta2*zeta2) test = one + two*(zeta1-zeta2)*(zeta1+zeta2) IF (test>=zero) THEN @@ -21452,21 +21543,21 @@ LOGICAL FUNCTION SLAISNAN(sin1, sin2) RETURN END FUNCTION - SUBROUTINE SLALS0(icompq, nl, nr, sqre, nrhs, b, ldb, bx, ldbx, & - perm, givptr, givcol, ldgcol, givnum, ldgnum, poles, difl, difr, z, & + SUBROUTINE SLALS0(icompq, nl, nr, sqre, nrhs, b, ldb, bx, ldbx, & + perm, givptr, givcol, ldgcol, givnum, ldgnum, poles, difl, difr, z,& k, c, s, work, info) USE GALAHAD_KINDS - INTEGER(ip_) :: givptr, icompq, info, k, ldb, ldbx, ldgcol, & + INTEGER(ip_) :: givptr, icompq, info, k, ldb, ldbx, ldgcol, & ldgnum, nl, nr, nrhs, sqre REAL(r4_) :: c, s INTEGER(ip_) :: givcol(ldgcol, *), perm(*) - REAL(r4_) :: b(ldb, *), bx(ldbx, *), difl(*), difr(ldgnum, *), & + REAL(r4_) :: b(ldb, *), bx(ldbx, *), difl(*), difr(ldgnum, *), & givnum(ldgnum, *), poles(ldgnum, *), work(*), z(*) REAL(r4_) :: one, zero, negone PARAMETER (one=1.0_r4_, zero=0.0_r4_, negone=-1.0_r4_) INTEGER(ip_) :: i, j, m, n, nlp1 REAL(r4_) :: diflj, difrj, dj, dsigj, dsigjp, temp - EXTERNAL :: SCOPY, SGEMV, SLACPY, SLASCL, SROT, & + EXTERNAL :: SCOPY, SGEMV, SLACPY, SLASCL, SROT, & SSCAL, XERBLA REAL(r4_) :: SLAMC3, SNRM2 EXTERNAL :: SLAMC3, SNRM2 @@ -21504,7 +21595,7 @@ SUBROUTINE SLALS0(icompq, nl, nr, sqre, nrhs, b, ldb, bx, ldbx, & nlp1 = nl + 1 IF (icompq==0) THEN DO i = 1, givptr - CALL SROT(nrhs, b(givcol(i,2),1), ldb, b(givcol(i, 1_ip_),1), & + CALL SROT(nrhs, b(givcol(i,2),1), ldb, b(givcol(i, 1_ip_),1), & ldb, givnum(i,2), givnum(i,1)) END DO CALL SCOPY(nrhs, b(nlp1,1), ldb, bx(1,1), ldbx) @@ -21534,7 +21625,7 @@ SUBROUTINE SLALS0(icompq, nl, nr, sqre, nrhs, b, ldb, bx, ldbx, & IF ((z(i)==zero) .OR. (poles(i,2)==zero)) THEN work(i) = zero ELSE - work(i) = poles(i, 2_ip_)*z(i)/(SLAMC3(poles(i, 2_ip_), & + work(i) = poles(i, 2_ip_)*z(i)/(SLAMC3(poles(i, 2_ip_), & dsigj)-diflj)/(poles(i,2)+dj) END IF END DO @@ -21542,19 +21633,19 @@ SUBROUTINE SLALS0(icompq, nl, nr, sqre, nrhs, b, ldb, bx, ldbx, & IF ((z(i)==zero) .OR. (poles(i,2)==zero)) THEN work(i) = zero ELSE - work(i) = poles(i, 2_ip_)*z(i)/(SLAMC3(poles(i, 2_ip_), & + work(i) = poles(i, 2_ip_)*z(i)/(SLAMC3(poles(i, 2_ip_), & dsigjp)+difrj)/(poles(i,2)+dj) END IF END DO work(1) = negone temp = SNRM2(k, work, 1_ip_) - CALL SGEMV('T', k, nrhs, one, bx, ldbx, work, 1_ip_, zero, & + CALL SGEMV('T', k, nrhs, one, bx, ldbx, work, 1_ip_, zero, & b(j,1), ldb) - CALL SLASCL('G', 0_ip_, 0_ip_, temp, one, 1_ip_, nrhs, b(j, & + CALL SLASCL('G', 0_ip_, 0_ip_, temp, one, 1_ip_, nrhs, b(j, & 1), ldb, info) END DO END IF - IF (k1) THEN - CALL SGEMV('No transpose', m-rk+1, k-1, -one, a(rk,1), lda, & + CALL SGEMV('No transpose', m-rk+1, k-1, -one, a(rk,1), lda, & f(k,1), ldf, one, a(rk,k), 1_ip_) END IF IF (rk1) THEN - CALL SGEMV('Transpose', m-rk+1, k-1, -tau(k), a(rk,1), lda, & + CALL SGEMV('Transpose', m-rk+1, k-1, -tau(k), a(rk,1), lda, & a(rk,k), 1_ip_, zero, auxv(1), 1_ip_) - CALL SGEMV('No transpose', n, k-1, one, f(1,1), ldf, auxv(1), & + CALL SGEMV('No transpose', n, k-1, one, f(1,1), ldf, auxv(1), & 1_ip_, one, f(1,k), 1_ip_) END IF IF (kABS(h(kwtop-1, kwtop-2))) nw = & + IF (ABS(h(kwtop,kwtop-1))>ABS(h(kwtop-1, kwtop-2))) nw = & nw + 1 END IF END IF @@ -22715,12 +22812,12 @@ SUBROUTINE SLAQR0(wantt, wantz, n, ilo, ihi, h, ldh, wr, wi, iloz, & nho = (n-nw-1) - kt + 1 kwv = nw + 2 nve = (n-nw) - kwv + 1 - CALL SLAQR3(wantt, wantz, n, ktop, kbot, nw, h, ldh, iloz, & - ihiz, z, ldz, ls, ld, wr, wi, h(kv,1), ldh, nho, h(kv,kt), & + CALL SLAQR3(wantt, wantz, n, ktop, kbot, nw, h, ldh, iloz, & + ihiz, z, ldz, ls, ld, wr, wi, h(kv,1), ldh, nho, h(kv,kt), & ldh, nve, h(kwv,1), ldh, work, lwork) kbot = kbot - ld ks = kbot - ls + 1 - IF ((ld==0) .OR. ((100*ld<=nw*nibble) .AND. (kbot-ktop+1> & + IF ((ld==0) .OR. ((100*ld<=nw*nibble) .AND. (kbot-ktop+1> & MIN(nmin,nwmax)))) THEN ns = MIN(nsmax, nsr, MAX(2,kbot-ktop)) ns = ns - MOD(ns, 2_ip_) @@ -22732,7 +22829,7 @@ SUBROUTINE SLAQR0(wantt, wantz, n, ilo, ihi, h, ldh, wr, wi, iloz, & bb = ss cc = wilk2*ss dd = aa - CALL SLANV2(aa, bb, cc, dd, wr(i-1), wi(i-1), wr(i), & + CALL SLANV2(aa, bb, cc, dd, wr(i-1), wi(i-1), wr(i), & wi(i), cs, sn) END DO IF (ks==ktop) THEN @@ -22747,11 +22844,11 @@ SUBROUTINE SLAQR0(wantt, wantz, n, ilo, ihi, h, ldh, wr, wi, iloz, & kt = n - ns + 1 CALL SLACPY('A', ns, ns, h(ks,ks), ldh, h(kt,1), ldh) IF (ns>nmin) THEN - CALL SLAQR4(.FALSE., .FALSE., ns, 1_ip_, ns, h(kt,1), & - ldh, wr(ks), wi(ks), 1_ip_, 1_ip_, zdum, 1_ip_, work, & + CALL SLAQR4(.FALSE., .FALSE., ns, 1_ip_, ns, h(kt,1), & + ldh, wr(ks), wi(ks), 1_ip_, 1_ip_, zdum, 1_ip_, work,& lwork, inf) ELSE - CALL SLAHQR(.FALSE., .FALSE., ns, 1_ip_, ns, h(kt,1), & + CALL SLAHQR(.FALSE., .FALSE., ns, 1_ip_, ns, h(kt,1), & ldh, wr(ks), wi(ks), 1_ip_, 1_ip_, zdum, 1_ip_, inf) END IF ks = ks + inf @@ -22760,7 +22857,7 @@ SUBROUTINE SLAQR0(wantt, wantz, n, ilo, ihi, h, ldh, wr, wi, iloz, & cc = h(kbot, kbot-1) bb = h(kbot-1, kbot) dd = h(kbot, kbot) - CALL SLANV2(aa, bb, cc, dd, wr(kbot-1), wi(kbot-1), & + CALL SLANV2(aa, bb, cc, dd, wr(kbot-1), wi(kbot-1), & wr(kbot), wi(kbot), cs, sn) ks = kbot - 1 END IF @@ -22771,7 +22868,7 @@ SUBROUTINE SLAQR0(wantt, wantz, n, ilo, ihi, h, ldh, wr, wi, iloz, & IF (sorted) GO TO 60 sorted = .TRUE. DO i = ks, k - 1 - IF (ABS(wr(i))+ABS(wi(i))0) THEN ndfl = 1 @@ -22852,7 +22949,7 @@ SUBROUTINE SLAQR1(n, h, ldh, sr1, si1, sr2, si2, v) v(2) = zero ELSE h21s = h( 2_ip_, 1_ip_)/s - v(1) = h21s*h(1, 2_ip_) + (h(1,1)-sr1)*((h(1, 1_ip_)-sr2)/s) & + v(1) = h21s*h(1, 2_ip_) + (h(1,1)-sr1)*((h(1, 1_ip_)-sr2)/s) & - si1*(si2/s) v(2) = h21s*(h(1,1)+h(2,2)-sr1-sr2) END IF @@ -22865,7 +22962,7 @@ SUBROUTINE SLAQR1(n, h, ldh, sr1, si1, sr2, si2, v) ELSE h21s = h( 2_ip_, 1_ip_)/s h31s = h( 3_ip_, 1_ip_)/s - v(1) = (h(1,1)-sr1)*((h(1,1)-sr2)/s) - si1*(si2/s) + h(1, & + v(1) = (h(1,1)-sr1)*((h(1,1)-sr2)/s) - si1*(si2/s) + h(1, & 2_ip_) *h21s + h(1, 3_ip_)*h31s v(2) = h21s*(h(1,1)+h(2,2)-sr1-sr2) + h( 2_ip_, 3_ip_)*h31s v(3) = h31s*(h(1,1)+h(3,3)-sr1-sr2) + h21s*h( 3_ip_, 2_ip_) @@ -22873,26 +22970,26 @@ SUBROUTINE SLAQR1(n, h, ldh, sr1, si1, sr2, si2, v) END IF END SUBROUTINE - SUBROUTINE SLAQR2(wantt, wantz, n, ktop, kbot, nw, h, ldh, iloz, & - ihiz, z, ldz, ns, nd, sr, si, v, ldv, nh, t, ldt, nv, wv, ldwv, & + SUBROUTINE SLAQR2(wantt, wantz, n, ktop, kbot, nw, h, ldh, iloz, & + ihiz, z, ldz, ns, nd, sr, si, v, ldv, nh, t, ldt, nv, wv, ldwv, & work, lwork) USE GALAHAD_KINDS - INTEGER(ip_) :: ihiz, iloz, kbot, ktop, ldh, ldt, ldv, ldwv, ldz, & + INTEGER(ip_) :: ihiz, iloz, kbot, ktop, ldh, ldt, ldv, ldwv, ldz, & lwork, n, nd, nh, ns, nv, nw LOGICAL :: wantt, wantz - REAL(r4_) :: h(ldh, *), si(*), sr(*), t(ldt, *), v(ldv, *), & + REAL(r4_) :: h(ldh, *), si(*), sr(*), t(ldt, *), v(ldv, *), & work(*), wv(ldwv, *), z(ldz, *) REAL(r4_) :: zero, one PARAMETER (zero=0.0_r4_, one=1.0_r4_) - REAL(r4_) :: aa, bb, beta, cc, cs, dd, evi, evk, foo, s, safmax, & + REAL(r4_) :: aa, bb, beta, cc, cs, dd, evi, evk, foo, s, safmax, & safmin, smlnum, sn, tau, ulp - INTEGER(ip_) :: i, ifst, ilst, info, infqr, j, jw, k, kcol, kend, & + INTEGER(ip_) :: i, ifst, ilst, info, infqr, j, jw, k, kcol, kend, & kln, krow, kwtop, ltop, lwk1, lwk2, lwkopt LOGICAL :: bulge, sorted REAL(r4_) :: SLAMCH EXTERNAL :: SLAMCH - EXTERNAL :: SCOPY, SGEHRD, SGEMM, SLABAD, SLACPY, & - SLAHQR, SLANV2, SLARF, SLARFG, SLASET, SORMHR, & + EXTERNAL :: SCOPY, SGEHRD, SGEMM, SLABAD, SLACPY, & + SLAHQR, SLANV2, SLARF, SLARFG, SLASET, SORMHR, & STREXC INTRINSIC :: ABS, INT, MAX, MIN, REAL, SQRT jw = MIN(nw, kbot-ktop+1) @@ -22901,8 +22998,8 @@ SUBROUTINE SLAQR2(wantt, wantz, n, ktop, kbot, nw, h, ldh, iloz, & ELSE CALL SGEHRD(jw, 1_ip_, jw-1, t, ldt, work, work, -1_ip_, info) lwk1 = INT(work(1)) - CALL SORMHR('R', 'N', jw, jw, 1_ip_, jw-1, t, ldt, work, v, ldv, & - work, -1_ip_, info) + CALL SORMHR('R', 'N', jw, jw, 1_ip_, jw-1, t, ldt, work, v, & + ldv, work, -1_ip_, info) lwk2 = INT(work(1)) lwkopt = jw + MAX(lwk1, lwk2) END IF @@ -22943,7 +23040,7 @@ SUBROUTINE SLAQR2(wantt, wantz, n, ktop, kbot, nw, h, ldh, iloz, & CALL SLACPY('U', jw, jw, h(kwtop,kwtop), ldh, t, ldt) CALL SCOPY(jw-1, h(kwtop+1,kwtop), ldh+1, t(2,1), ldt+1) CALL SLASET('A', jw, jw, zero, one, v, ldv) - CALL SLAHQR(.TRUE., .TRUE., jw, 1_ip_, jw, t, ldt, sr(kwtop), & + CALL SLAHQR(.TRUE., .TRUE., jw, 1_ip_, jw, t, ldt, sr(kwtop), & si(kwtop), 1_ip_, jw, v, ldv, infqr) DO j = 1, jw - 3 t(j+2, j) = zero @@ -22966,19 +23063,21 @@ SUBROUTINE SLAQR2(wantt, wantz, n, ktop, kbot, nw, h, ldh, iloz, & ns = ns - 1 ELSE ifst = ns - CALL STREXC('V', jw, t, ldt, v, ldv, ifst, ilst, work, info) + CALL STREXC('V', jw, t, ldt, v, ldv, ifst, ilst, work, & + info) ilst = ilst + 1 END IF ELSE - foo = ABS(t(ns,ns)) + SQRT(ABS(t(ns,ns-1)))*SQRT(ABS(t(ns-1, & + foo = ABS(t(ns,ns)) + SQRT(ABS(t(ns,ns-1)))*SQRT(ABS(t(ns-1, & ns))) IF (foo==zero) foo = ABS(s) - IF (MAX(ABS(s*v(1,ns)),ABS(s*v(1,ns-1)))<=MAX(smlnum,ulp*foo & + IF (MAX(ABS(s*v(1,ns)),ABS(s*v(1,ns-1)))<=MAX(smlnum,ulp*foo & )) THEN ns = ns - 2 ELSE ifst = ns - CALL STREXC('V', jw, t, ldt, v, ldv, ifst, ilst, work, info) + CALL STREXC('V', jw, t, ldt, v, ldv, ifst, ilst, work, & + info) ilst = ilst + 2 END IF END IF @@ -23005,14 +23104,16 @@ SUBROUTINE SLAQR2(wantt, wantz, n, ktop, kbot, nw, h, ldh, iloz, & IF (k==i+1) THEN evi = ABS(t(i,i)) ELSE - evi = ABS(t(i,i)) + SQRT(ABS(t(i+1,i)))*SQRT(ABS(t(i, i+1))) + evi = ABS(t(i,i)) + SQRT(ABS(t(i+1,i)))*SQRT(ABS(t(i, & + i+1))) END IF IF (k==kend) THEN evk = ABS(t(k,k)) ELSE IF (t(k+1,k)==zero) THEN evk = ABS(t(k,k)) ELSE - evk = ABS(t(k,k)) + SQRT(ABS(t(k+1,k)))*SQRT(ABS(t(k, k+1))) + evk = ABS(t(k,k)) + SQRT(ABS(t(k+1,k)))*SQRT(ABS(t(k, & + k+1))) END IF IF (evi>=evk) THEN i = k @@ -23020,7 +23121,8 @@ SUBROUTINE SLAQR2(wantt, wantz, n, ktop, kbot, nw, h, ldh, iloz, & sorted = .FALSE. ifst = i ilst = k - CALL STREXC('V', jw, t, ldt, v, ldv, ifst, ilst, work, info) + CALL STREXC('V', jw, t, ldt, v, ldv, ifst, ilst, work, & + info) IF (info==0) THEN i = ilst ELSE @@ -23055,7 +23157,7 @@ SUBROUTINE SLAQR2(wantt, wantz, n, ktop, kbot, nw, h, ldh, iloz, & cc = t(i, i-1) bb = t(i-1, i) dd = t(i, i) - CALL SLANV2(aa, bb, cc, dd, sr(kwtop+i-2), si(kwtop+i-2), & + CALL SLANV2(aa, bb, cc, dd, sr(kwtop+i-2), si(kwtop+i-2), & sr(kwtop+i-1), si(kwtop+i-1), cs, sn) i = i - 2 END IF @@ -23071,14 +23173,14 @@ SUBROUTINE SLAQR2(wantt, wantz, n, ktop, kbot, nw, h, ldh, iloz, & CALL SLARF('L', ns, jw, work, 1_ip_, tau, t, ldt, work(jw+1)) CALL SLARF('R', ns, ns, work, 1_ip_, tau, t, ldt, work(jw+1)) CALL SLARF('R', jw, ns, work, 1_ip_, tau, v, ldv, work(jw+1)) - CALL SGEHRD(jw, 1_ip_, ns, t, ldt, work, work(jw+1), lwork-jw, & - info) + CALL SGEHRD(jw, 1_ip_, ns, t, ldt, work, work(jw+1), & + lwork-jw, info) END IF IF (kwtop>1) h(kwtop, kwtop-1) = s*v(1, 1_ip_) CALL SLACPY('U', jw, jw, t, ldt, h(kwtop,kwtop), ldh) CALL SCOPY(jw-1, t(2,1), ldt+1, h(kwtop+1,kwtop), ldh+1) - IF (ns>1 .AND. s/=zero) CALL SORMHR('R', 'N', jw, ns, 1_ip_, ns, & - t, ldt, work, v, ldv, work(jw+1), lwork-jw, info) + IF (ns>1 .AND. s/=zero) CALL SORMHR('R', 'N', jw, ns, 1_ip_, & + ns, t, ldt, work, v, ldv, work(jw+1), lwork-jw, info) IF (wantt) THEN ltop = 1 ELSE @@ -23086,14 +23188,14 @@ SUBROUTINE SLAQR2(wantt, wantz, n, ktop, kbot, nw, h, ldh, iloz, & END IF DO krow = ltop, kwtop - 1, nv kln = MIN(nv, kwtop-krow) - CALL SGEMM('N', 'N', kln, jw, jw, one, h(krow,kwtop), ldh, v, & + CALL SGEMM('N', 'N', kln, jw, jw, one, h(krow,kwtop), ldh, v, & ldv, zero, wv, ldwv) CALL SLACPY('A', kln, jw, wv, ldwv, h(krow,kwtop), ldh) END DO IF (wantt) THEN DO kcol = kbot + 1, n, nh kln = MIN(nh, n-kcol+1) - CALL SGEMM('C', 'N', jw, kln, jw, one, v, ldv, h(kwtop, & + CALL SGEMM('C', 'N', jw, kln, jw, one, v, ldv, h(kwtop, & kcol), ldh, zero, t, ldt) CALL SLACPY('A', jw, kln, t, ldt, h(kwtop,kcol), ldh) END DO @@ -23101,7 +23203,7 @@ SUBROUTINE SLAQR2(wantt, wantz, n, ktop, kbot, nw, h, ldh, iloz, & IF (wantz) THEN DO krow = iloz, ihiz, nv kln = MIN(nv, ihiz-krow+1) - CALL SGEMM('N', 'N', kln, jw, jw, one, z(krow,kwtop), ldz, & + CALL SGEMM('N', 'N', kln, jw, jw, one, z(krow,kwtop), ldz, & v, ldv, zero, wv, ldwv) CALL SLACPY('A', kln, jw, wv, ldwv, z(krow,kwtop), ldz) END DO @@ -23112,27 +23214,27 @@ SUBROUTINE SLAQR2(wantt, wantz, n, ktop, kbot, nw, h, ldh, iloz, & work(1) = REAL(lwkopt) END SUBROUTINE - SUBROUTINE SLAQR3(wantt, wantz, n, ktop, kbot, nw, h, ldh, iloz, & - ihiz, z, ldz, ns, nd, sr, si, v, ldv, nh, t, ldt, nv, wv, ldwv, & + SUBROUTINE SLAQR3(wantt, wantz, n, ktop, kbot, nw, h, ldh, iloz, & + ihiz, z, ldz, ns, nd, sr, si, v, ldv, nh, t, ldt, nv, wv, ldwv, & work, lwork) USE GALAHAD_KINDS - INTEGER(ip_) :: ihiz, iloz, kbot, ktop, ldh, ldt, ldv, ldwv, ldz, & + INTEGER(ip_) :: ihiz, iloz, kbot, ktop, ldh, ldt, ldv, ldwv, ldz, & lwork, n, nd, nh, ns, nv, nw LOGICAL :: wantt, wantz - REAL(r4_) :: h(ldh, *), si(*), sr(*), t(ldt, *), v(ldv, *), & + REAL(r4_) :: h(ldh, *), si(*), sr(*), t(ldt, *), v(ldv, *), & work(*), wv(ldwv, *), z(ldz, *) REAL(r4_) :: zero, one PARAMETER (zero=0.0_r4_, one=1.0_r4_) - REAL(r4_) :: aa, bb, beta, cc, cs, dd, evi, evk, foo, s, safmax, & + REAL(r4_) :: aa, bb, beta, cc, cs, dd, evi, evk, foo, s, safmax, & safmin, smlnum, sn, tau, ulp - INTEGER(ip_) :: i, ifst, ilst, info, infqr, j, jw, k, kcol, kend, & + INTEGER(ip_) :: i, ifst, ilst, info, infqr, j, jw, k, kcol, kend, & kln, krow, kwtop, ltop, lwk1, lwk2, lwk3, lwkopt, nmin LOGICAL :: bulge, sorted REAL(r4_) :: SLAMCH INTEGER(ip_) :: ILAENV EXTERNAL :: SLAMCH, ILAENV - EXTERNAL :: SCOPY, SGEHRD, SGEMM, SLABAD, SLACPY, & - SLAHQR, SLANV2, SLAQR4, SLARF, SLARFG, SLASET, & + EXTERNAL :: SCOPY, SGEHRD, SGEMM, SLABAD, SLACPY, & + SLAHQR, SLANV2, SLAQR4, SLARF, SLARFG, SLASET, & SORMHR, STREXC INTRINSIC :: ABS, INT, MAX, MIN, REAL, SQRT jw = MIN(nw, kbot-ktop+1) @@ -23141,10 +23243,10 @@ SUBROUTINE SLAQR3(wantt, wantz, n, ktop, kbot, nw, h, ldh, iloz, & ELSE CALL SGEHRD(jw, 1_ip_, jw-1, t, ldt, work, work, -1_ip_, info) lwk1 = INT(work(1)) - CALL SORMHR('R', 'N', jw, jw, 1_ip_, jw-1, t, ldt, work, v, ldv, & - work, -1_ip_, info) + CALL SORMHR('R', 'N', jw, jw, 1_ip_, jw-1, t, ldt, work, v, & + ldv, work, -1_ip_, info) lwk2 = INT(work(1)) - CALL SLAQR4(.TRUE., .TRUE., jw, 1_ip_, jw, t, ldt, sr, si, & + CALL SLAQR4(.TRUE., .TRUE., jw, 1_ip_, jw, t, ldt, sr, si, & 1_ip_, jw, v, ldv, work, -1_ip_, infqr) lwk3 = INT(work(1)) lwkopt = MAX(jw+MAX(lwk1,lwk2), lwk3) @@ -23188,10 +23290,10 @@ SUBROUTINE SLAQR3(wantt, wantz, n, ktop, kbot, nw, h, ldh, iloz, & CALL SLASET('A', jw, jw, zero, one, v, ldv) nmin = ILAENV(12_ip_, 'SLAQR3', 'SV', jw, 1_ip_, jw, lwork) IF (jw>nmin) THEN - CALL SLAQR4(.TRUE., .TRUE., jw, 1_ip_, jw, t, ldt, sr(kwtop), & + CALL SLAQR4(.TRUE., .TRUE., jw, 1_ip_, jw, t, ldt, sr(kwtop), & si(kwtop), 1_ip_, jw, v, ldv, work, lwork, infqr) ELSE - CALL SLAHQR(.TRUE., .TRUE., jw, 1_ip_, jw, t, ldt, sr(kwtop), & + CALL SLAHQR(.TRUE., .TRUE., jw, 1_ip_, jw, t, ldt, sr(kwtop), & si(kwtop), 1_ip_, jw, v, ldv, infqr) END IF DO j = 1, jw - 3 @@ -23215,19 +23317,21 @@ SUBROUTINE SLAQR3(wantt, wantz, n, ktop, kbot, nw, h, ldh, iloz, & ns = ns - 1 ELSE ifst = ns - CALL STREXC('V', jw, t, ldt, v, ldv, ifst, ilst, work, info) + CALL STREXC('V', jw, t, ldt, v, ldv, ifst, ilst, work, & + info) ilst = ilst + 1 END IF ELSE - foo = ABS(t(ns,ns)) + SQRT(ABS(t(ns,ns-1)))*SQRT(ABS(t(ns-1, & + foo = ABS(t(ns,ns)) + SQRT(ABS(t(ns,ns-1)))*SQRT(ABS(t(ns-1, & ns))) IF (foo==zero) foo = ABS(s) - IF (MAX(ABS(s*v(1,ns)),ABS(s*v(1,ns-1)))<=MAX(smlnum,ulp*foo & + IF (MAX(ABS(s*v(1,ns)),ABS(s*v(1,ns-1)))<=MAX(smlnum,ulp*foo & )) THEN ns = ns - 2 ELSE ifst = ns - CALL STREXC('V', jw, t, ldt, v, ldv, ifst, ilst, work, info) + CALL STREXC('V', jw, t, ldt, v, ldv, ifst, ilst, work, & + info) ilst = ilst + 2 END IF END IF @@ -23254,14 +23358,16 @@ SUBROUTINE SLAQR3(wantt, wantz, n, ktop, kbot, nw, h, ldh, iloz, & IF (k==i+1) THEN evi = ABS(t(i,i)) ELSE - evi = ABS(t(i,i)) + SQRT(ABS(t(i+1,i)))*SQRT(ABS(t(i, i+1))) + evi = ABS(t(i,i)) + SQRT(ABS(t(i+1,i)))*SQRT(ABS(t(i, & + i+1))) END IF IF (k==kend) THEN evk = ABS(t(k,k)) ELSE IF (t(k+1,k)==zero) THEN evk = ABS(t(k,k)) ELSE - evk = ABS(t(k,k)) + SQRT(ABS(t(k+1,k)))*SQRT(ABS(t(k, k+1))) + evk = ABS(t(k,k)) + SQRT(ABS(t(k+1,k)))*SQRT(ABS(t(k, & + k+1))) END IF IF (evi>=evk) THEN i = k @@ -23269,7 +23375,8 @@ SUBROUTINE SLAQR3(wantt, wantz, n, ktop, kbot, nw, h, ldh, iloz, & sorted = .FALSE. ifst = i ilst = k - CALL STREXC('V', jw, t, ldt, v, ldv, ifst, ilst, work, info) + CALL STREXC('V', jw, t, ldt, v, ldv, ifst, ilst, work, & + info) IF (info==0) THEN i = ilst ELSE @@ -23304,7 +23411,7 @@ SUBROUTINE SLAQR3(wantt, wantz, n, ktop, kbot, nw, h, ldh, iloz, & cc = t(i, i-1) bb = t(i-1, i) dd = t(i, i) - CALL SLANV2(aa, bb, cc, dd, sr(kwtop+i-2), si(kwtop+i-2), & + CALL SLANV2(aa, bb, cc, dd, sr(kwtop+i-2), si(kwtop+i-2), & sr(kwtop+i-1), si(kwtop+i-1), cs, sn) i = i - 2 END IF @@ -23320,14 +23427,14 @@ SUBROUTINE SLAQR3(wantt, wantz, n, ktop, kbot, nw, h, ldh, iloz, & CALL SLARF('L', ns, jw, work, 1_ip_, tau, t, ldt, work(jw+1)) CALL SLARF('R', ns, ns, work, 1_ip_, tau, t, ldt, work(jw+1)) CALL SLARF('R', jw, ns, work, 1_ip_, tau, v, ldv, work(jw+1)) - CALL SGEHRD(jw, 1_ip_, ns, t, ldt, work, work(jw+1), lwork-jw, & - info) + CALL SGEHRD(jw, 1_ip_, ns, t, ldt, work, work(jw+1), & + lwork-jw, info) END IF IF (kwtop>1) h(kwtop, kwtop-1) = s*v(1, 1_ip_) CALL SLACPY('U', jw, jw, t, ldt, h(kwtop,kwtop), ldh) CALL SCOPY(jw-1, t(2,1), ldt+1, h(kwtop+1,kwtop), ldh+1) - IF (ns>1 .AND. s/=zero) CALL SORMHR('R', 'N', jw, ns, 1_ip_, ns, & - t, ldt, work, v, ldv, work(jw+1), lwork-jw, info) + IF (ns>1 .AND. s/=zero) CALL SORMHR('R', 'N', jw, ns, 1_ip_, & + ns, t, ldt, work, v, ldv, work(jw+1), lwork-jw, info) IF (wantt) THEN ltop = 1 ELSE @@ -23335,14 +23442,14 @@ SUBROUTINE SLAQR3(wantt, wantz, n, ktop, kbot, nw, h, ldh, iloz, & END IF DO krow = ltop, kwtop - 1, nv kln = MIN(nv, kwtop-krow) - CALL SGEMM('N', 'N', kln, jw, jw, one, h(krow,kwtop), ldh, v, & + CALL SGEMM('N', 'N', kln, jw, jw, one, h(krow,kwtop), ldh, v, & ldv, zero, wv, ldwv) CALL SLACPY('A', kln, jw, wv, ldwv, h(krow,kwtop), ldh) END DO IF (wantt) THEN DO kcol = kbot + 1, n, nh kln = MIN(nh, n-kcol+1) - CALL SGEMM('C', 'N', jw, kln, jw, one, v, ldv, h(kwtop, & + CALL SGEMM('C', 'N', jw, kln, jw, one, v, ldv, h(kwtop, & kcol), ldh, zero, t, ldt) CALL SLACPY('A', jw, kln, t, ldt, h(kwtop,kcol), ldh) END DO @@ -23350,7 +23457,7 @@ SUBROUTINE SLAQR3(wantt, wantz, n, ktop, kbot, nw, h, ldh, iloz, & IF (wantz) THEN DO krow = iloz, ihiz, nv kln = MIN(nv, ihiz-krow+1) - CALL SGEMM('N', 'N', kln, jw, jw, one, z(krow,kwtop), ldz, & + CALL SGEMM('N', 'N', kln, jw, jw, one, z(krow,kwtop), ldz, & v, ldv, zero, wv, ldwv) CALL SLACPY('A', kln, jw, wv, ldwv, z(krow,kwtop), ldz) END DO @@ -23361,7 +23468,7 @@ SUBROUTINE SLAQR3(wantt, wantz, n, ktop, kbot, nw, h, ldh, iloz, & work(1) = REAL(lwkopt) END SUBROUTINE - SUBROUTINE SLAQR4(wantt, wantz, n, ilo, ihi, h, ldh, wr, wi, iloz, & + SUBROUTINE SLAQR4(wantt, wantz, n, ilo, ihi, h, ldh, wr, wi, iloz, & ihiz, z, ldz, work, lwork, info) USE GALAHAD_KINDS INTEGER(ip_) :: ihi, ihiz, ilo, iloz, info, ldh, ldz, lwork, n @@ -23378,15 +23485,16 @@ SUBROUTINE SLAQR4(wantt, wantz, n, ilo, ihi, h, ldh, wr, wi, iloz, & REAL(r4_) :: zero, one PARAMETER (zero=0.0_r4_, one=1.0_r4_) REAL(r4_) :: aa, bb, cc, cs, dd, sn, ss, swap - INTEGER(ip_) :: i, inf, it, itmax, k, kacc22, kbot, kdu, ks, kt, & - ktop, ku, kv, kwh, kwtop, kwv, ld, ls, lwkopt, ndec, ndfl, nh, & + INTEGER(ip_) :: i, inf, it, itmax, k, kacc22, kbot, kdu, ks, kt, & + ktop, ku, kv, kwh, kwtop, kwv, ld, ls, lwkopt, ndec, ndfl, nh, & nho, nibble, nmin, ns, nsmax, nsr, nve, nw, nwmax, nwr, nwupbd LOGICAL :: sorted CHARACTER :: jbcmpz*2 INTEGER(ip_) :: ILAENV EXTERNAL :: ILAENV REAL(r4_) :: zdum(1, 1_ip_) - EXTERNAL :: SLACPY, SLAHQR, SLANV2, SLAQR2, SLAQR5 + EXTERNAL :: SLACPY, SLAHQR, SLANV2, SLAQR2, & + SLAQR5 INTRINSIC :: ABS, INT, MAX, MIN, MOD, REAL info = 0 IF (n==0) THEN @@ -23395,7 +23503,7 @@ SUBROUTINE SLAQR4(wantt, wantz, n, ilo, ihi, h, ldh, wr, wi, iloz, & END IF IF (n<=ntiny) THEN lwkopt = 1 - IF (lwork/=-1) CALL SLAHQR(wantt, wantz, n, ilo, ihi, h, ldh, & + IF (lwork/=-1) CALL SLAHQR(wantt, wantz, n, ilo, ihi, h, ldh, & wr, wi, iloz, ihiz, z, ldz, info) ELSE info = 0 @@ -23415,8 +23523,8 @@ SUBROUTINE SLAQR4(wantt, wantz, n, ilo, ihi, h, ldh, wr, wi, iloz, & nsr = ILAENV(15_ip_, 'SLAQR4', jbcmpz, n, ilo, ihi, lwork) nsr = MIN(nsr, (n-3)/6, ihi-ilo) nsr = MAX( 2_ip_, nsr-MOD(nsr,2)) - CALL SLAQR2(wantt, wantz, n, ilo, ihi, nwr+1, h, ldh, iloz, & - ihiz, z, ldz, ls, ld, wr, wi, h, ldh, n, h, ldh, n, h, ldh, & + CALL SLAQR2(wantt, wantz, n, ilo, ihi, nwr+1, h, ldh, iloz, & + ihiz, z, ldz, ls, ld, wr, wi, h, ldh, n, h, ldh, n, h, ldh, & work, -1_ip_) lwkopt = MAX(3*nsr/2, INT(work(1))) IF (lwork==-1) THEN @@ -23457,7 +23565,7 @@ SUBROUTINE SLAQR4(wantt, wantz, n, ilo, ihi, h, ldh, wr, wi, iloz, & nw = nh ELSE kwtop = kbot - nw + 1 - IF (ABS(h(kwtop,kwtop-1))>ABS(h(kwtop-1, kwtop-2))) nw = & + IF (ABS(h(kwtop,kwtop-1))>ABS(h(kwtop-1, kwtop-2))) nw = & nw + 1 END IF END IF @@ -23473,12 +23581,12 @@ SUBROUTINE SLAQR4(wantt, wantz, n, ilo, ihi, h, ldh, wr, wi, iloz, & nho = (n-nw-1) - kt + 1 kwv = nw + 2 nve = (n-nw) - kwv + 1 - CALL SLAQR2(wantt, wantz, n, ktop, kbot, nw, h, ldh, iloz, & - ihiz, z, ldz, ls, ld, wr, wi, h(kv,1), ldh, nho, h(kv,kt), & + CALL SLAQR2(wantt, wantz, n, ktop, kbot, nw, h, ldh, iloz, & + ihiz, z, ldz, ls, ld, wr, wi, h(kv,1), ldh, nho, h(kv,kt), & ldh, nve, h(kwv,1), ldh, work, lwork) kbot = kbot - ld ks = kbot - ls + 1 - IF ((ld==0) .OR. ((100*ld<=nw*nibble) .AND. (kbot-ktop+1> & + IF ((ld==0) .OR. ((100*ld<=nw*nibble) .AND. (kbot-ktop+1> & MIN(nmin,nwmax)))) THEN ns = MIN(nsmax, nsr, MAX(2,kbot-ktop)) ns = ns - MOD(ns, 2_ip_) @@ -23490,7 +23598,7 @@ SUBROUTINE SLAQR4(wantt, wantz, n, ilo, ihi, h, ldh, wr, wi, iloz, & bb = ss cc = wilk2*ss dd = aa - CALL SLANV2(aa, bb, cc, dd, wr(i-1), wi(i-1), wr(i), & + CALL SLANV2(aa, bb, cc, dd, wr(i-1), wi(i-1), wr(i), & wi(i), cs, sn) END DO IF (ks==ktop) THEN @@ -23504,7 +23612,7 @@ SUBROUTINE SLAQR4(wantt, wantz, n, ilo, ihi, h, ldh, wr, wi, iloz, & ks = kbot - ns + 1 kt = n - ns + 1 CALL SLACPY('A', ns, ns, h(ks,ks), ldh, h(kt,1), ldh) - CALL SLAHQR(.FALSE., .FALSE., ns, 1_ip_, ns, h(kt,1), & + CALL SLAHQR(.FALSE., .FALSE., ns, 1_ip_, ns, h(kt,1), & ldh, wr(ks), wi(ks), 1_ip_, 1_ip_, zdum, 1_ip_, inf) ks = ks + inf IF (ks>=kbot) THEN @@ -23512,7 +23620,7 @@ SUBROUTINE SLAQR4(wantt, wantz, n, ilo, ihi, h, ldh, wr, wi, iloz, & cc = h(kbot, kbot-1) bb = h(kbot-1, kbot) dd = h(kbot, kbot) - CALL SLANV2(aa, bb, cc, dd, wr(kbot-1), wi(kbot-1), & + CALL SLANV2(aa, bb, cc, dd, wr(kbot-1), wi(kbot-1), & wr(kbot), wi(kbot), cs, sn) ks = kbot - 1 END IF @@ -23523,7 +23631,7 @@ SUBROUTINE SLAQR4(wantt, wantz, n, ilo, ihi, h, ldh, wr, wi, iloz, & IF (sorted) GO TO 60 sorted = .TRUE. DO i = ks, k - 1 - IF (ABS(wr(i))+ABS(wi(i))0) THEN ndfl = 1 @@ -23585,29 +23693,30 @@ SUBROUTINE SLAQR4(wantt, wantz, n, ilo, ihi, h, ldh, wr, wi, iloz, & work(1) = REAL(lwkopt) END SUBROUTINE - SUBROUTINE SLAQR5(wantt, wantz, kacc22, n, ktop, kbot, nshfts, sr, & - si, h, ldh, iloz, ihiz, z, ldz, v, ldv, u, ldu, nv, wv, ldwv, nh, & + SUBROUTINE SLAQR5(wantt, wantz, kacc22, n, ktop, kbot, nshfts, sr, & + si, h, ldh, iloz, ihiz, z, ldz, v, ldv, u, ldu, nv, wv, ldwv, nh, & wh, ldwh) USE GALAHAD_KINDS IMPLICIT NONE - INTEGER(ip_) :: ihiz, iloz, kacc22, kbot, ktop, ldh, ldu, ldv, & + INTEGER(ip_) :: ihiz, iloz, kacc22, kbot, ktop, ldh, ldu, ldv, & ldwh, ldwv, ldz, n, nh, nshfts, nv LOGICAL :: wantt, wantz - REAL(r4_) :: h(ldh, *), si(*), sr(*), u(ldu, *), v(ldv, *), & + REAL(r4_) :: h(ldh, *), si(*), sr(*), u(ldu, *), v(ldv, *), & wh(ldwh, *), wv(ldwv, *), z(ldz, *) REAL(r4_) :: zero, one PARAMETER (zero=0.0_r4_, one=1.0_r4_) - REAL(r4_) :: alpha, beta, h11, h12, h21, h22, refsum, safmax, & + REAL(r4_) :: alpha, beta, h11, h12, h21, h22, refsum, safmax, & safmin, scl, smlnum, swap, tst1, tst2, ulp - INTEGER(ip_) :: i, i2, i4, incol, j, jbot, jcol, jlen, jrow, jtop, & - k, k1, kdu, kms, krcol, m, m22, mbot, mtop, nbmps, ndcol, ns, nu + INTEGER(ip_) :: i, i2, i4, incol, j, jbot, jcol, jlen, jrow, & + jtop, k, k1, kdu, kms, krcol, m, m22, mbot, mtop, nbmps, ndcol, & + ns, nu LOGICAL :: accum, bmp22 REAL(r4_) :: SLAMCH EXTERNAL :: SLAMCH INTRINSIC :: ABS, MAX, MIN, MOD, REAL REAL(r4_) :: vt(3) - EXTERNAL :: SGEMM, SLABAD, SLACPY, SLAQR1, SLARFG, & - SLASET, STRMM + EXTERNAL :: SGEMM, SLABAD, SLACPY, SLAQR1, & + SLARFG, SLASET, STRMM IF (nshfts<2) RETURN IF (ktop>=kbot) RETURN DO i = 1, nshfts - 2, 2 @@ -23650,7 +23759,7 @@ SUBROUTINE SLAQR5(wantt, wantz, kacc22, n, ktop, kbot, nshfts, sr, & IF (bmp22) THEN k = krcol + 2*(m22-1) IF (k==ktop-1) THEN - CALL SLAQR1( 2_ip_, h(k+1,k+1), ldh, sr(2*m22-1), & + CALL SLAQR1( 2_ip_, h(k+1,k+1), ldh, sr(2*m22-1), & si(2*m22-1), sr(2*m22), si(2*m22), v(1,m22)) beta = v(1, m22) CALL SLARFG( 2_ip_, beta, v(2,m22), 1_ip_, v(1,m22)) @@ -23696,7 +23805,7 @@ SUBROUTINE SLAQR5(wantt, wantz, kacc22, n, ktop, kbot, nshfts, sr, & h22 = MIN(ABS(h(k+1,k+1)), ABS(h(k,k)-h(k+1,k+1))) scl = h11 + h12 tst2 = h22*(h11/scl) - IF (tst2==zero .OR. h21*(h12/scl)<=MAX(smlnum,ulp* & + IF (tst2==zero .OR. h21*(h12/scl)<=MAX(smlnum,ulp* & tst2)) THEN h(k+1, k) = zero END IF @@ -23721,7 +23830,7 @@ SUBROUTINE SLAQR5(wantt, wantz, kacc22, n, ktop, kbot, nshfts, sr, & DO m = mbot, mtop, -1_ip_ k = krcol + 2*(m-1) IF (k==ktop-1) THEN - CALL SLAQR1( 3_ip_, h(ktop,ktop), ldh, sr(2*m-1), & + CALL SLAQR1( 3_ip_, h(ktop,ktop), ldh, sr(2*m-1), & si(2*m-1), sr(2*m), si(2*m), v(1,m)) alpha = v(1, m) CALL SLARFG( 3_ip_, alpha, v(2,m), 1_ip_, v(1,m)) @@ -23734,18 +23843,18 @@ SUBROUTINE SLAQR5(wantt, wantz, kacc22, n, ktop, kbot, nshfts, sr, & v( 2_ip_, m) = h(k+2, k) v( 3_ip_, m) = h(k+3, k) CALL SLARFG( 3_ip_, beta, v(2,m), 1_ip_, v(1,m)) - IF (h(k+3,k)/=zero .OR. h(k+3,k+1)/=zero .OR. h(k+3, & + IF (h(k+3,k)/=zero .OR. h(k+3,k+1)/=zero .OR. h(k+3, & k+2)==zero) THEN h(k+1, k) = beta h(k+2, k) = zero h(k+3, k) = zero ELSE - CALL SLAQR1( 3_ip_, h(k+1,k+1), ldh, sr(2*m-1), & + CALL SLAQR1( 3_ip_, h(k+1,k+1), ldh, sr(2*m-1), & si(2*m-1), sr(2*m), si(2*m), vt) alpha = vt(1) CALL SLARFG( 3_ip_, alpha, vt(2), 1_ip_, vt(1)) refsum = vt(1)*(h(k+1,k)+vt(2)*h(k+2,k)) - IF (ABS(h(k+2,k)-refsum*vt(2))+ABS(refsum*vt(3))>ulp*( & + IF (ABS(h(k+2,k)-refsum*vt(2))+ABS(refsum*vt(3))>ulp*( & ABS(h(k,k))+ABS(h(k+1,k+1))+ABS(h(k+2,k+2)))) THEN h(k+1, k) = beta h(k+2, k) = zero @@ -23761,13 +23870,13 @@ SUBROUTINE SLAQR5(wantt, wantz, kacc22, n, ktop, kbot, nshfts, sr, & END IF END IF DO j = jtop, MIN(kbot, k+3) - refsum = v(1, m)*(h(j,k+1)+v(2,m)*h(j,k+2)+v(3,m)*h(j,k+ & + refsum = v(1, m)*(h(j,k+1)+v(2,m)*h(j,k+2)+v(3,m)*h(j,k+ & 3)) h(j, k+1) = h(j, k+1) - refsum h(j, k+2) = h(j, k+2) - refsum*v( 2_ip_, m) h(j, k+3) = h(j, k+3) - refsum*v( 3_ip_, m) END DO - refsum = v(1, m)*(h(k+1,k+1)+v(2,m)*h(k+2,k+1)+v(3,m)*h(k+ & + refsum = v(1, m)*(h(k+1,k+1)+v(2,m)*h(k+2,k+1)+v(3,m)*h(k+ & 3,k+1)) h(k+1, k+1) = h(k+1, k+1) - refsum h(k+2, k+1) = h(k+2, k+1) - refsum*v( 2_ip_, m) @@ -23790,7 +23899,7 @@ SUBROUTINE SLAQR5(wantt, wantz, kacc22, n, ktop, kbot, nshfts, sr, & h22 = MIN(ABS(h(k+1,k+1)), ABS(h(k,k)-h(k+1,k+1))) scl = h11 + h12 tst2 = h22*(h11/scl) - IF (tst2==zero .OR. h21*(h12/scl)<=MAX(smlnum,ulp*tst2 & + IF (tst2==zero .OR. h21*(h12/scl)<=MAX(smlnum,ulp*tst2 & )) THEN h(k+1, k) = zero END IF @@ -23807,7 +23916,7 @@ SUBROUTINE SLAQR5(wantt, wantz, kacc22, n, ktop, kbot, nshfts, sr, & DO m = mbot, mtop, -1_ip_ k = krcol + 2*(m-1) DO j = MAX(ktop, krcol+2*m), jbot - refsum = v(1, m)*(h(k+1,j)+v(2,m)*h(k+2,j)+v(3,m)*h(k+3, & + refsum = v(1, m)*(h(k+1,j)+v(2,m)*h(k+2,j)+v(3,m)*h(k+3, & j)) h(k+1, j) = h(k+1, j) - refsum h(k+2, j) = h(k+2, j) - refsum*v( 2_ip_, m) @@ -23822,7 +23931,7 @@ SUBROUTINE SLAQR5(wantt, wantz, kacc22, n, ktop, kbot, nshfts, sr, & i2 = MAX(i2, kms-(krcol-incol)+1) i4 = MIN(kdu, krcol+2*(mbot-1)-incol+5) DO j = i2, i4 - refsum = v(1, m)*(u(j,kms+1)+v(2,m)*u(j,kms+2)+v(3,m)* & + refsum = v(1, m)*(u(j,kms+1)+v(2,m)*u(j,kms+2)+v(3,m)* & u(j,kms+3)) u(j, kms+1) = u(j, kms+1) - refsum u(j, kms+2) = u(j, kms+2) - refsum*v( 2_ip_, m) @@ -23833,7 +23942,7 @@ SUBROUTINE SLAQR5(wantt, wantz, kacc22, n, ktop, kbot, nshfts, sr, & DO m = mbot, mtop, -1_ip_ k = krcol + 2*(m-1) DO j = iloz, ihiz - refsum = v(1, m)*(z(j,k+1)+v(2,m)*z(j,k+2)+v(3,m)*z(j, & + refsum = v(1, m)*(z(j,k+1)+v(2,m)*z(j,k+2)+v(3,m)*z(j, & k+3)) z(j, k+1) = z(j, k+1) - refsum z(j, k+2) = z(j, k+2) - refsum*v( 2_ip_, m) @@ -23854,24 +23963,24 @@ SUBROUTINE SLAQR5(wantt, wantz, kacc22, n, ktop, kbot, nshfts, sr, & nu = (kdu-MAX(0,ndcol-kbot)) - k1 + 1 DO jcol = MIN(ndcol, kbot) + 1, jbot, nh jlen = MIN(nh, jbot-jcol+1) - CALL SGEMM('C', 'N', nu, jlen, nu, one, u(k1,k1), ldu, & + CALL SGEMM('C', 'N', nu, jlen, nu, one, u(k1,k1), ldu, & h(incol+k1,jcol), ldh, zero, wh, ldwh) - CALL SLACPY('ALL', nu, jlen, wh, ldwh, h(incol+k1,jcol), & + CALL SLACPY('ALL', nu, jlen, wh, ldwh, h(incol+k1,jcol), & ldh) END DO DO jrow = jtop, MAX(ktop, incol) - 1, nv jlen = MIN(nv, MAX(ktop,incol)-jrow) - CALL SGEMM('N', 'N', jlen, nu, nu, one, h(jrow,incol+k1), & + CALL SGEMM('N', 'N', jlen, nu, nu, one, h(jrow,incol+k1), & ldh, u(k1,k1), ldu, zero, wv, ldwv) - CALL SLACPY('ALL', jlen, nu, wv, ldwv, h(jrow,incol+k1), & + CALL SLACPY('ALL', jlen, nu, wv, ldwv, h(jrow,incol+k1), & ldh) END DO IF (wantz) THEN DO jrow = iloz, ihiz, nv jlen = MIN(nv, ihiz-jrow+1) - CALL SGEMM('N', 'N', jlen, nu, nu, one, z(jrow,incol+k1), & + CALL SGEMM('N', 'N', jlen, nu, nu, one, z(jrow,incol+k1), & ldz, u(k1,k1), ldu, zero, wv, ldwv) - CALL SLACPY('ALL', jlen, nu, wv, ldwv, z(jrow,incol+k1), & + CALL SLACPY('ALL', jlen, nu, wv, ldwv, z(jrow,incol+k1), & ldz) END DO END IF @@ -23919,21 +24028,21 @@ SUBROUTINE SLARF(side, m, n, v, incv, tau, c, ldc, work) END IF IF (applyleft) THEN IF (lastv>0) THEN - CALL SGEMV('Transpose', lastv, lastc, one, c, ldc, v, incv, & + CALL SGEMV('Transpose', lastv, lastc, one, c, ldc, v, incv, & zero, work, 1_ip_) CALL SGER(lastv, lastc, -tau, v, incv, work, 1_ip_, c, ldc) END IF ELSE IF (lastv>0) THEN - CALL SGEMV('No transpose', lastc, lastv, one, c, ldc, v, incv, & - zero, work, 1_ip_) + CALL SGEMV('No transpose', lastc, lastv, one, c, ldc, v, & + incv, zero, work, 1_ip_) CALL SGER(lastc, lastv, -tau, work, 1_ip_, v, incv, c, ldc) END IF END IF RETURN END SUBROUTINE - SUBROUTINE SLARFB(side, trans, direct, storev, m, n, k, v, ldv, t, & + SUBROUTINE SLARFB(side, trans, direct, storev, m, n, k, v, ldv, t, & ldt, c, ldc, work, ldwork) USE GALAHAD_KINDS CHARACTER :: direct, side, storev, trans @@ -23958,20 +24067,20 @@ SUBROUTINE SLARFB(side, trans, direct, storev, m, n, k, v, ldv, t, & DO j = 1, k CALL SCOPY(n, c(j,1), ldc, work(1,j), 1_ip_) END DO - CALL STRMM('Right', 'Lower', 'No transpose', 'Unit', n, k, & + CALL STRMM('Right', 'Lower', 'No transpose', 'Unit', n, k, & one, v, ldv, work, ldwork) IF (m>k) THEN - CALL SGEMM('Transpose', 'No transpose', n, k, m-k, one, & + CALL SGEMM('Transpose', 'No transpose', n, k, m-k, one, & c(k+1,1), ldc, v(k+1,1), ldv, one, work, ldwork) END IF - CALL STRMM('Right', 'Upper', transt, 'Non-unit', n, k, one, & + CALL STRMM('Right', 'Upper', transt, 'Non-unit', n, k, one, & t, ldt, work, ldwork) IF (m>k) THEN - CALL SGEMM('No transpose', 'Transpose', m-k, n, k, -one, & + CALL SGEMM('No transpose', 'Transpose', m-k, n, k, -one, & v(k+1,1), ldv, work, ldwork, one, c(k+1,1), ldc) END IF - CALL STRMM('Right', 'Lower', 'Transpose', 'Unit', n, k, one, & - v, ldv, work, ldwork) + CALL STRMM('Right', 'Lower', 'Transpose', 'Unit', n, k, & + one, v, ldv, work, ldwork) DO j = 1, k DO i = 1, n c(j, i) = c(j, i) - work(i, j) @@ -23981,20 +24090,20 @@ SUBROUTINE SLARFB(side, trans, direct, storev, m, n, k, v, ldv, t, & DO j = 1, k CALL SCOPY(m, c(1,j), 1_ip_, work(1,j), 1_ip_) END DO - CALL STRMM('Right', 'Lower', 'No transpose', 'Unit', m, k, & + CALL STRMM('Right', 'Lower', 'No transpose', 'Unit', m, k, & one, v, ldv, work, ldwork) IF (n>k) THEN - CALL SGEMM('No transpose', 'No transpose', m, k, n-k, one, & - c(1,k+1), ldc, v(k+1,1), ldv, one, work, ldwork) + CALL SGEMM('No transpose', 'No transpose', m, k, n-k, & + one, c(1,k+1), ldc, v(k+1,1), ldv, one, work, ldwork) END IF - CALL STRMM('Right', 'Upper', trans, 'Non-unit', m, k, one, & + CALL STRMM('Right', 'Upper', trans, 'Non-unit', m, k, one, & t, ldt, work, ldwork) IF (n>k) THEN - CALL SGEMM('No transpose', 'Transpose', m, n-k, k, -one, & + CALL SGEMM('No transpose', 'Transpose', m, n-k, k, -one, & work, ldwork, v(k+1,1), ldv, one, c(1,k+1), ldc) END IF - CALL STRMM('Right', 'Lower', 'Transpose', 'Unit', m, k, one, & - v, ldv, work, ldwork) + CALL STRMM('Right', 'Lower', 'Transpose', 'Unit', m, k, & + one, v, ldv, work, ldwork) DO j = 1, k DO i = 1, m c(i, j) = c(i, j) - work(i, j) @@ -24006,20 +24115,20 @@ SUBROUTINE SLARFB(side, trans, direct, storev, m, n, k, v, ldv, t, & DO j = 1, k CALL SCOPY(n, c(m-k+j,1), ldc, work(1,j), 1_ip_) END DO - CALL STRMM('Right', 'Upper', 'No transpose', 'Unit', n, k, & + CALL STRMM('Right', 'Upper', 'No transpose', 'Unit', n, k, & one, v(m-k+1,1), ldv, work, ldwork) IF (m>k) THEN - CALL SGEMM('Transpose', 'No transpose', n, k, m-k, one, c, & - ldc, v, ldv, one, work, ldwork) + CALL SGEMM('Transpose', 'No transpose', n, k, m-k, one, & + c, ldc, v, ldv, one, work, ldwork) END IF - CALL STRMM('Right', 'Lower', transt, 'Non-unit', n, k, one, & + CALL STRMM('Right', 'Lower', transt, 'Non-unit', n, k, one, & t, ldt, work, ldwork) IF (m>k) THEN - CALL SGEMM('No transpose', 'Transpose', m-k, n, k, -one, & + CALL SGEMM('No transpose', 'Transpose', m-k, n, k, -one, & v, ldv, work, ldwork, one, c, ldc) END IF - CALL STRMM('Right', 'Upper', 'Transpose', 'Unit', n, k, one, & - v(m-k+1,1), ldv, work, ldwork) + CALL STRMM('Right', 'Upper', 'Transpose', 'Unit', n, k, & + one, v(m-k+1,1), ldv, work, ldwork) DO j = 1, k DO i = 1, n c(m-k+j, i) = c(m-k+j, i) - work(i, j) @@ -24029,20 +24138,20 @@ SUBROUTINE SLARFB(side, trans, direct, storev, m, n, k, v, ldv, t, & DO j = 1, k CALL SCOPY(m, c(1,n-k+j), 1_ip_, work(1,j), 1_ip_) END DO - CALL STRMM('Right', 'Upper', 'No transpose', 'Unit', m, k, & + CALL STRMM('Right', 'Upper', 'No transpose', 'Unit', m, k, & one, v(n-k+1,1), ldv, work, ldwork) IF (n>k) THEN - CALL SGEMM('No transpose', 'No transpose', m, k, n-k, one, & - c, ldc, v, ldv, one, work, ldwork) + CALL SGEMM('No transpose', 'No transpose', m, k, n-k, & + one, c, ldc, v, ldv, one, work, ldwork) END IF - CALL STRMM('Right', 'Lower', trans, 'Non-unit', m, k, one, & + CALL STRMM('Right', 'Lower', trans, 'Non-unit', m, k, one, & t, ldt, work, ldwork) IF (n>k) THEN - CALL SGEMM('No transpose', 'Transpose', m, n-k, k, -one, & + CALL SGEMM('No transpose', 'Transpose', m, n-k, k, -one, & work, ldwork, v, ldv, one, c, ldc) END IF - CALL STRMM('Right', 'Upper', 'Transpose', 'Unit', m, k, one, & - v(n-k+1,1), ldv, work, ldwork) + CALL STRMM('Right', 'Upper', 'Transpose', 'Unit', m, k, & + one, v(n-k+1,1), ldv, work, ldwork) DO j = 1, k DO i = 1, m c(i, n-k+j) = c(i, n-k+j) - work(i, j) @@ -24056,19 +24165,19 @@ SUBROUTINE SLARFB(side, trans, direct, storev, m, n, k, v, ldv, t, & DO j = 1, k CALL SCOPY(n, c(j,1), ldc, work(1,j), 1_ip_) END DO - CALL STRMM('Right', 'Upper', 'Transpose', 'Unit', n, k, one, & - v, ldv, work, ldwork) + CALL STRMM('Right', 'Upper', 'Transpose', 'Unit', n, k, & + one, v, ldv, work, ldwork) IF (m>k) THEN - CALL SGEMM('Transpose', 'Transpose', n, k, m-k, one, & + CALL SGEMM('Transpose', 'Transpose', n, k, m-k, one, & c(k+1,1), ldc, v(1,k+1), ldv, one, work, ldwork) END IF - CALL STRMM('Right', 'Upper', transt, 'Non-unit', n, k, one, & + CALL STRMM('Right', 'Upper', transt, 'Non-unit', n, k, one, & t, ldt, work, ldwork) IF (m>k) THEN - CALL SGEMM('Transpose', 'Transpose', m-k, n, k, -one, v(1, & - k+1), ldv, work, ldwork, one, c(k+1,1), ldc) + CALL SGEMM('Transpose', 'Transpose', m-k, n, k, -one, & + v(1,k+1), ldv, work, ldwork, one, c(k+1,1), ldc) END IF - CALL STRMM('Right', 'Upper', 'No transpose', 'Unit', n, k, & + CALL STRMM('Right', 'Upper', 'No transpose', 'Unit', n, k, & one, v, ldv, work, ldwork) DO j = 1, k DO i = 1, n @@ -24079,19 +24188,19 @@ SUBROUTINE SLARFB(side, trans, direct, storev, m, n, k, v, ldv, t, & DO j = 1, k CALL SCOPY(m, c(1,j), 1_ip_, work(1,j), 1_ip_) END DO - CALL STRMM('Right', 'Upper', 'Transpose', 'Unit', m, k, one, & - v, ldv, work, ldwork) + CALL STRMM('Right', 'Upper', 'Transpose', 'Unit', m, k, & + one, v, ldv, work, ldwork) IF (n>k) THEN - CALL SGEMM('No transpose', 'Transpose', m, k, n-k, one, & + CALL SGEMM('No transpose', 'Transpose', m, k, n-k, one, & c(1,k+1), ldc, v(1,k+1), ldv, one, work, ldwork) END IF - CALL STRMM('Right', 'Upper', trans, 'Non-unit', m, k, one, & + CALL STRMM('Right', 'Upper', trans, 'Non-unit', m, k, one, & t, ldt, work, ldwork) IF (n>k) THEN - CALL SGEMM('No transpose', 'No transpose', m, n-k, k, & + CALL SGEMM('No transpose', 'No transpose', m, n-k, k, & -one, work, ldwork, v(1,k+1), ldv, one, c(1,k+1), ldc) END IF - CALL STRMM('Right', 'Upper', 'No transpose', 'Unit', m, k, & + CALL STRMM('Right', 'Upper', 'No transpose', 'Unit', m, k, & one, v, ldv, work, ldwork) DO j = 1, k DO i = 1, m @@ -24104,19 +24213,19 @@ SUBROUTINE SLARFB(side, trans, direct, storev, m, n, k, v, ldv, t, & DO j = 1, k CALL SCOPY(n, c(m-k+j,1), ldc, work(1,j), 1_ip_) END DO - CALL STRMM('Right', 'Lower', 'Transpose', 'Unit', n, k, one, & - v(1,m-k+1), ldv, work, ldwork) + CALL STRMM('Right', 'Lower', 'Transpose', 'Unit', n, k, & + one, v(1,m-k+1), ldv, work, ldwork) IF (m>k) THEN - CALL SGEMM('Transpose', 'Transpose', n, k, m-k, one, c, & + CALL SGEMM('Transpose', 'Transpose', n, k, m-k, one, c, & ldc, v, ldv, one, work, ldwork) END IF - CALL STRMM('Right', 'Lower', transt, 'Non-unit', n, k, one, & + CALL STRMM('Right', 'Lower', transt, 'Non-unit', n, k, one, & t, ldt, work, ldwork) IF (m>k) THEN - CALL SGEMM('Transpose', 'Transpose', m-k, n, k, -one, v, & + CALL SGEMM('Transpose', 'Transpose', m-k, n, k, -one, v, & ldv, work, ldwork, one, c, ldc) END IF - CALL STRMM('Right', 'Lower', 'No transpose', 'Unit', n, k, & + CALL STRMM('Right', 'Lower', 'No transpose', 'Unit', n, k, & one, v(1,m-k+1), ldv, work, ldwork) DO j = 1, k DO i = 1, n @@ -24127,19 +24236,19 @@ SUBROUTINE SLARFB(side, trans, direct, storev, m, n, k, v, ldv, t, & DO j = 1, k CALL SCOPY(m, c(1,n-k+j), 1_ip_, work(1,j), 1_ip_) END DO - CALL STRMM('Right', 'Lower', 'Transpose', 'Unit', m, k, one, & - v(1,n-k+1), ldv, work, ldwork) + CALL STRMM('Right', 'Lower', 'Transpose', 'Unit', m, k, & + one, v(1,n-k+1), ldv, work, ldwork) IF (n>k) THEN - CALL SGEMM('No transpose', 'Transpose', m, k, n-k, one, c, & - ldc, v, ldv, one, work, ldwork) + CALL SGEMM('No transpose', 'Transpose', m, k, n-k, one, & + c, ldc, v, ldv, one, work, ldwork) END IF - CALL STRMM('Right', 'Lower', trans, 'Non-unit', m, k, one, & + CALL STRMM('Right', 'Lower', trans, 'Non-unit', m, k, one, & t, ldt, work, ldwork) IF (n>k) THEN - CALL SGEMM('No transpose', 'No transpose', m, n-k, k, & + CALL SGEMM('No transpose', 'No transpose', m, n-k, k, & -one, work, ldwork, v, ldv, one, c, ldc) END IF - CALL STRMM('Right', 'Lower', 'No transpose', 'Unit', m, k, & + CALL STRMM('Right', 'Lower', 'No transpose', 'Unit', m, k, & one, v(1,n-k+1), ldv, work, ldwork) DO j = 1, k DO i = 1, m @@ -24226,7 +24335,7 @@ SUBROUTINE SLARFT(direct, storev, n, k, v, ldv, tau, t, ldt) t(j, i) = -tau(i)*v(i, j) END DO j = MIN(lastv, prevlastv) - CALL SGEMV('Transpose', j-i, i-1, -tau(i), v(i+1,1), ldv, & + CALL SGEMV('Transpose', j-i, i-1, -tau(i), v(i+1,1), ldv, & v(i+1,i), 1_ip_, one, t(1,i), 1_ip_) ELSE DO lastv = n, i + 1, -1_ip_ @@ -24236,11 +24345,11 @@ SUBROUTINE SLARFT(direct, storev, n, k, v, ldv, tau, t, ldt) t(j, i) = -tau(i)*v(j, i) END DO j = MIN(lastv, prevlastv) - CALL SGEMV('No transpose', i-1, j-i, -tau(i), v(1,i+1), & + CALL SGEMV('No transpose', i-1, j-i, -tau(i), v(1,i+1), & ldv, v(i,i+1), ldv, one, t(1,i), 1_ip_) END IF - CALL STRMV('Upper', 'No transpose', 'Non-unit', i-1, t, ldt, & - t(1,i), 1_ip_) + CALL STRMV('Upper', 'No transpose', 'Non-unit', i-1, t, & + ldt, t(1,i), 1_ip_) t(i, i) = tau(i) IF (i>1) THEN prevlastv = MAX(prevlastv, lastv) @@ -24266,8 +24375,8 @@ SUBROUTINE SLARFT(direct, storev, n, k, v, ldv, tau, t, ldt) t(j, i) = -tau(i)*v(n-k+i, j) END DO j = MAX(lastv, prevlastv) - CALL SGEMV('Transpose', n-k+i-j, k-i, -tau(i), v(j,i+1), & - ldv, v(j,i), 1_ip_, one, t(i+1,i), 1_ip_) + CALL SGEMV('Transpose', n-k+i-j, k-i, -tau(i), v(j, & + i+1), ldv, v(j,i), 1_ip_, one, t(i+1,i), 1_ip_) ELSE DO lastv = 1, i - 1 IF (v(i,lastv)/=zero) EXIT @@ -24276,10 +24385,10 @@ SUBROUTINE SLARFT(direct, storev, n, k, v, ldv, tau, t, ldt) t(j, i) = -tau(i)*v(j, n-k+i) END DO j = MAX(lastv, prevlastv) - CALL SGEMV('No transpose', k-i, n-k+i-j, -tau(i), v(i+1, & - j), ldv, v(i,j), ldv, one, t(i+1,i), 1_ip_) + CALL SGEMV('No transpose', k-i, n-k+i-j, -tau(i), & + v(i+1,j), ldv, v(i,j), ldv, one, t(i+1,i), 1_ip_) END IF - CALL STRMV('Lower', 'No transpose', 'Non-unit', k-i, & + CALL STRMV('Lower', 'No transpose', 'Non-unit', k-i, & t(i+1,i+1), ldt, t(i+1,i), 1_ip_) IF (i>1) THEN prevlastv = MIN(prevlastv, lastv) @@ -24303,7 +24412,7 @@ SUBROUTINE SLARFX(side, m, n, v, tau, c, ldc, work) REAL(r4_) :: zero, one PARAMETER (zero=0.0_r4_, one=1.0_r4_) INTEGER(ip_) :: j - REAL(r4_) :: sum, t1, t10, t2, t3, t4, t5, t6, t7, t8, t9, v1, & + REAL(r4_) :: sum, t1, t10, t2, t3, t4, t5, t6, t7, t8, t9, v1, & v10, v2, v3, v4, v5, v6, v7, v8, v9 LOGICAL :: LSAME EXTERNAL :: LSAME @@ -24354,7 +24463,7 @@ SUBROUTINE SLARFX(side, m, n, v, tau, c, ldc, work) v4 = v(4) t4 = tau*v4 DO j = 1, n - sum = v1*c(1, j) + v2*c( 2_ip_, j) + v3*c( 3_ip_, j) + v4*c( & + sum = v1*c(1, j) + v2*c( 2_ip_, j) + v3*c( 3_ip_, j) + v4*c( & 4_ip_, j) c(1, j) = c(1, j) - sum*t1 c( 2_ip_, j) = c( 2_ip_, j) - sum*t2 @@ -24374,7 +24483,7 @@ SUBROUTINE SLARFX(side, m, n, v, tau, c, ldc, work) v5 = v(5) t5 = tau*v5 DO j = 1, n - sum = v1*c(1, j) + v2*c( 2_ip_, j) + v3*c( 3_ip_, j) + v4*c( & + sum = v1*c(1, j) + v2*c( 2_ip_, j) + v3*c( 3_ip_, j) + v4*c( & 4_ip_, j) + v5*c(5, j) c(1, j) = c(1, j) - sum*t1 c( 2_ip_, j) = c( 2_ip_, j) - sum*t2 @@ -24397,7 +24506,7 @@ SUBROUTINE SLARFX(side, m, n, v, tau, c, ldc, work) v6 = v(6) t6 = tau*v6 DO j = 1, n - sum = v1*c(1, j) + v2*c( 2_ip_, j) + v3*c( 3_ip_, j) + v4*c( & + sum = v1*c(1, j) + v2*c( 2_ip_, j) + v3*c( 3_ip_, j) + v4*c( & 4_ip_, j) + v5*c(5, j) + v6*c(6, j) c(1, j) = c(1, j) - sum*t1 c( 2_ip_, j) = c( 2_ip_, j) - sum*t2 @@ -24423,7 +24532,7 @@ SUBROUTINE SLARFX(side, m, n, v, tau, c, ldc, work) v7 = v(7) t7 = tau*v7 DO j = 1, n - sum = v1*c(1, j) + v2*c( 2_ip_, j) + v3*c( 3_ip_, j) + v4*c( & + sum = v1*c(1, j) + v2*c( 2_ip_, j) + v3*c( 3_ip_, j) + v4*c( & 4_ip_, j) + v5*c(5, j) + v6*c(6, j) + v7*c(7, j) c(1, j) = c(1, j) - sum*t1 c( 2_ip_, j) = c( 2_ip_, j) - sum*t2 @@ -24452,7 +24561,7 @@ SUBROUTINE SLARFX(side, m, n, v, tau, c, ldc, work) v8 = v(8) t8 = tau*v8 DO j = 1, n - sum = v1*c(1, j) + v2*c( 2_ip_, j) + v3*c( 3_ip_, j) + v4*c( & + sum = v1*c(1, j) + v2*c( 2_ip_, j) + v3*c( 3_ip_, j) + v4*c( & 4_ip_, j) + v5*c(5, j) + v6*c(6, j) + v7*c(7, j) + v8*c(8, j) c(1, j) = c(1, j) - sum*t1 c( 2_ip_, j) = c( 2_ip_, j) - sum*t2 @@ -24484,9 +24593,9 @@ SUBROUTINE SLARFX(side, m, n, v, tau, c, ldc, work) v9 = v(9) t9 = tau*v9 DO j = 1, n - sum = v1*c(1, j) + v2*c( 2_ip_, j) + v3*c( 3_ip_, j) + v4*c( & - 4_ip_, j) + v5*c(5, j) + v6*c(6, j) + v7*c(7, j) + v8*c(8, j) & - + v9*c(9, j) + sum = v1*c(1, j) + v2*c( 2_ip_, j) + v3*c( 3_ip_, j) + v4*c( & + 4_ip_, j) + v5*c(5, j) + v6*c(6, j) + v7*c(7, j) + v8*c(8, & + j) + v9*c(9, j) c(1, j) = c(1, j) - sum*t1 c( 2_ip_, j) = c( 2_ip_, j) - sum*t2 c( 3_ip_, j) = c( 3_ip_, j) - sum*t3 @@ -24520,9 +24629,9 @@ SUBROUTINE SLARFX(side, m, n, v, tau, c, ldc, work) v10 = v(10) t10 = tau*v10 DO j = 1, n - sum = v1*c(1, j) + v2*c( 2_ip_, j) + v3*c( 3_ip_, j) + v4*c( & - 4_ip_, j) + v5*c(5, j) + v6*c(6, j) + v7*c(7, j) + v8*c(8, j) & - + v9*c(9, j) + v10*c(10, j) + sum = v1*c(1, j) + v2*c( 2_ip_, j) + v3*c( 3_ip_, j) + v4*c( & + 4_ip_, j) + v5*c(5, j) + v6*c(6, j) + v7*c(7, j) + v8*c(8, & + j) + v9*c(9, j) + v10*c(10, j) c(1, j) = c(1, j) - sum*t1 c( 2_ip_, j) = c( 2_ip_, j) - sum*t2 c( 3_ip_, j) = c( 3_ip_, j) - sum*t3 @@ -24580,7 +24689,7 @@ SUBROUTINE SLARFX(side, m, n, v, tau, c, ldc, work) v4 = v(4) t4 = tau*v4 DO j = 1, m - sum = v1*c(j, 1_ip_) + v2*c(j, 2_ip_) + v3*c(j, 3_ip_) + & + sum = v1*c(j, 1_ip_) + v2*c(j, 2_ip_) + v3*c(j, 3_ip_) + & v4*c(j, 4_ip_) c(j, 1_ip_) = c(j, 1_ip_) - sum*t1 c(j, 2_ip_) = c(j, 2_ip_) - sum*t2 @@ -24600,7 +24709,7 @@ SUBROUTINE SLARFX(side, m, n, v, tau, c, ldc, work) v5 = v(5) t5 = tau*v5 DO j = 1, m - sum = v1*c(j, 1_ip_) + v2*c(j, 2_ip_) + v3*c(j, 3_ip_) + & + sum = v1*c(j, 1_ip_) + v2*c(j, 2_ip_) + v3*c(j, 3_ip_) + & v4*c(j, 4_ip_) + v5*c(j, 5) c(j, 1_ip_) = c(j, 1_ip_) - sum*t1 c(j, 2_ip_) = c(j, 2_ip_) - sum*t2 @@ -24623,7 +24732,7 @@ SUBROUTINE SLARFX(side, m, n, v, tau, c, ldc, work) v6 = v(6) t6 = tau*v6 DO j = 1, m - sum = v1*c(j, 1_ip_) + v2*c(j, 2_ip_) + v3*c(j, 3_ip_) + & + sum = v1*c(j, 1_ip_) + v2*c(j, 2_ip_) + v3*c(j, 3_ip_) + & v4*c(j, 4_ip_) + v5*c(j, 5) + v6*c(j, 6) c(j, 1_ip_) = c(j, 1_ip_) - sum*t1 c(j, 2_ip_) = c(j, 2_ip_) - sum*t2 @@ -24649,7 +24758,7 @@ SUBROUTINE SLARFX(side, m, n, v, tau, c, ldc, work) v7 = v(7) t7 = tau*v7 DO j = 1, m - sum = v1*c(j, 1_ip_) + v2*c(j, 2_ip_) + v3*c(j, 3_ip_) + & + sum = v1*c(j, 1_ip_) + v2*c(j, 2_ip_) + v3*c(j, 3_ip_) + & v4*c(j, 4_ip_) + v5*c(j, 5) + v6*c(j, 6) + v7*c(j, 7) c(j, 1_ip_) = c(j, 1_ip_) - sum*t1 c(j, 2_ip_) = c(j, 2_ip_) - sum*t2 @@ -24678,8 +24787,8 @@ SUBROUTINE SLARFX(side, m, n, v, tau, c, ldc, work) v8 = v(8) t8 = tau*v8 DO j = 1, m - sum = v1*c(j, 1_ip_) + v2*c(j, 2_ip_) + v3*c(j, 3_ip_) + & - v4*c(j, 4_ip_) + v5*c(j, 5) + v6*c(j, 6) + v7*c(j, 7) + & + sum = v1*c(j, 1_ip_) + v2*c(j, 2_ip_) + v3*c(j, 3_ip_) + & + v4*c(j, 4_ip_) + v5*c(j, 5) + v6*c(j, 6) + v7*c(j, 7) + & v8*c(j, 8) c(j, 1_ip_) = c(j, 1_ip_) - sum*t1 c(j, 2_ip_) = c(j, 2_ip_) - sum*t2 @@ -24711,8 +24820,8 @@ SUBROUTINE SLARFX(side, m, n, v, tau, c, ldc, work) v9 = v(9) t9 = tau*v9 DO j = 1, m - sum = v1*c(j, 1_ip_) + v2*c(j, 2_ip_) + v3*c(j, 3_ip_) + & - v4*c(j, 4_ip_) + v5*c(j, 5) + v6*c(j, 6) + v7*c(j, 7) + & + sum = v1*c(j, 1_ip_) + v2*c(j, 2_ip_) + v3*c(j, 3_ip_) + & + v4*c(j, 4_ip_) + v5*c(j, 5) + v6*c(j, 6) + v7*c(j, 7) + & v8*c(j, 8) + v9*c(j, 9) c(j, 1_ip_) = c(j, 1_ip_) - sum*t1 c(j, 2_ip_) = c(j, 2_ip_) - sum*t2 @@ -24747,8 +24856,8 @@ SUBROUTINE SLARFX(side, m, n, v, tau, c, ldc, work) v10 = v(10) t10 = tau*v10 DO j = 1, m - sum = v1*c(j, 1_ip_) + v2*c(j, 2_ip_) + v3*c(j, 3_ip_) + & - v4*c(j, 4_ip_) + v5*c(j, 5) + v6*c(j, 6) + v7*c(j, 7) + & + sum = v1*c(j, 1_ip_) + v2*c(j, 2_ip_) + v3*c(j, 3_ip_) + & + v4*c(j, 4_ip_) + v5*c(j, 5) + v6*c(j, 6) + v7*c(j, 7) + & v8*c(j, 8) + v9*c(j, 9) + v10*c(j, 10) c(j, 1_ip_) = c(j, 1_ip_) - sum*t1 c(j, 2_ip_) = c(j, 2_ip_) - sum*t2 @@ -24852,7 +24961,7 @@ SUBROUTINE SLARZ(side, m, n, l, v, incv, tau, c, ldc, work) IF (LSAME(side,'L')) THEN IF (tau/=zero) THEN CALL SCOPY(n, c, ldc, work, 1_ip_) - CALL SGEMV('Transpose', l, n, one, c(m-l+1,1), ldc, v, incv, & + CALL SGEMV('Transpose', l, n, one, c(m-l+1,1), ldc, v, incv, & one, work, 1_ip_) CALL SAXPY(n, -tau, work, 1_ip_, c, ldc) CALL SGER(l, n, -tau, v, incv, work, 1_ip_, c(m-l+1,1), ldc) @@ -24860,7 +24969,7 @@ SUBROUTINE SLARZ(side, m, n, l, v, incv, tau, c, ldc, work) ELSE IF (tau/=zero) THEN CALL SCOPY(m, c, 1_ip_, work, 1_ip_) - CALL SGEMV('No transpose', m, l, one, c(1,n-l+1), ldc, v, & + CALL SGEMV('No transpose', m, l, one, c(1,n-l+1), ldc, v, & incv, one, work, 1_ip_) CALL SAXPY(m, -tau, work, 1_ip_, c, 1_ip_) CALL SGER(m, l, -tau, work, 1_ip_, v, incv, c(1,n-l+1), ldc) @@ -24869,7 +24978,7 @@ SUBROUTINE SLARZ(side, m, n, l, v, incv, tau, c, ldc, work) RETURN END SUBROUTINE - SUBROUTINE SLARZB(side, trans, direct, storev, m, n, k, l, v, ldv, & + SUBROUTINE SLARZB(side, trans, direct, storev, m, n, k, l, v, ldv, & t, ldt, c, ldc, work, ldwork) USE GALAHAD_KINDS CHARACTER :: direct, side, storev, trans @@ -24902,31 +25011,31 @@ SUBROUTINE SLARZB(side, trans, direct, storev, m, n, k, l, v, ldv, & DO j = 1, k CALL SCOPY(n, c(j,1), ldc, work(1,j), 1_ip_) END DO - IF (l>0) CALL SGEMM('Transpose', 'Transpose', n, k, l, one, & + IF (l>0) CALL SGEMM('Transpose', 'Transpose', n, k, l, one, & c(m-l+1,1), ldc, v, ldv, one, work, ldwork) - CALL STRMM('Right', 'Lower', transt, 'Non-unit', n, k, one, t, & + CALL STRMM('Right', 'Lower', transt, 'Non-unit', n, k, one, t, & ldt, work, ldwork) DO j = 1, n DO i = 1, k c(i, j) = c(i, j) - work(j, i) END DO END DO - IF (l>0) CALL SGEMM('Transpose', 'Transpose', l, n, k, -one, v, & + IF (l>0) CALL SGEMM('Transpose', 'Transpose', l, n, k, -one, v, & ldv, work, ldwork, one, c(m-l+1,1), ldc) ELSE IF (LSAME(side,'R')) THEN DO j = 1, k CALL SCOPY(m, c(1,j), 1_ip_, work(1,j), 1_ip_) END DO - IF (l>0) CALL SGEMM('No transpose', 'Transpose', m, k, l, one, & + IF (l>0) CALL SGEMM('No transpose', 'Transpose', m, k, l, one, & c(1,n-l+1), ldc, v, ldv, one, work, ldwork) - CALL STRMM('Right', 'Lower', trans, 'Non-unit', m, k, one, t, & + CALL STRMM('Right', 'Lower', trans, 'Non-unit', m, k, one, t, & ldt, work, ldwork) DO j = 1, k DO i = 1, m c(i, j) = c(i, j) - work(i, j) END DO END DO - IF (l>0) CALL SGEMM('No transpose', 'No transpose', m, l, k, & + IF (l>0) CALL SGEMM('No transpose', 'No transpose', m, l, k, & -one, work, ldwork, v, ldv, one, c(1,n-l+1), ldc) END IF RETURN @@ -24960,9 +25069,9 @@ SUBROUTINE SLARZT(direct, storev, n, k, v, ldv, tau, t, ldt) END DO ELSE IF (i=4) THEN IF (kl<0 .OR. kl>MAX(m-1,0)) THEN info = -2 - ELSE IF (ku<0 .OR. ku>MAX(n-1,0) .OR. ((itype==4 .OR. itype== & + ELSE IF (ku<0 .OR. ku>MAX(n-1,0) .OR. ((itype==4 .OR. itype== & 5) .AND. kl/=ku)) THEN info = -3 - ELSE IF ((itype==4 .AND. ldazero) THEN @@ -25390,7 +25499,7 @@ SUBROUTINE SLASD4(n, i, d, z, delta, rho, sigma, work, info) END IF tau = tau2/(d(i)+SQRT(d(i)*d(i)+tau2)) temp = SQRT(eps) - IF ((d(i)<=temp*d(ip1)) .AND. (ABS(z(i))<=temp) .AND. (d( & + IF ((d(i)<=temp*d(ip1)) .AND. (ABS(z(i))<=temp) .AND. (d( & i)>zero)) THEN tau = MIN(ten*d(i), sgub) geomavg = .TRUE. @@ -25446,7 +25555,8 @@ SUBROUTINE SLASD4(n, i, d, z, delta, rho, sigma, work, info) dw = dpsi + dphi + temp*temp temp = z(ii)*temp w = w + temp - erretm = eight*(phi-psi) + erretm + two*rhoinv + three*ABS(temp) + erretm = eight*(phi-psi) + erretm + two*rhoinv + & + three*ABS(temp) IF (ABS(w)<=eps*erretm) THEN GO TO 240 END IF @@ -25487,7 +25597,7 @@ SUBROUTINE SLASD4(n, i, d, z, delta, rho, sigma, work, info) IF (orgati) THEN temp1 = z(iim1)/dtiim temp1 = temp1*temp1 - c = (temp-dtiip*(dpsi+dphi)) - (d(iim1)-d(iip1))*(d(iim1)+ & + c = (temp-dtiip*(dpsi+dphi)) - (d(iim1)-d(iip1))*(d(iim1)+ & d(iip1))*temp1 zz(1) = z(iim1)*z(iim1) IF (dpsiABS(prew)/ten) swtch = .TRUE. @@ -25776,9 +25887,9 @@ SUBROUTINE SLASD4(n, i, d, z, delta, rho, sigma, work, info) dw = dpsi + dphi + temp*temp temp = z(ii)*temp w = rhoinv + phi + psi + temp - erretm = eight*(phi-psi) + erretm + two*rhoinv + & + erretm = eight*(phi-psi) + erretm + two*rhoinv + & three*ABS(temp) - IF (w*prew>zero .AND. ABS(w)>ABS(prew)/ten) swtch = .NOT. & + IF (w*prew>zero .AND. ABS(w)>ABS(prew)/ten) swtch = .NOT. & swtch END DO info = 1 @@ -25793,14 +25904,14 @@ SUBROUTINE SLASD5(i, d, z, delta, rho, dsigma, work) REAL(r4_) :: dsigma, rho REAL(r4_) :: d(2), delta(2), work(2), z(2) REAL(r4_) :: zero, one, two, three, four - PARAMETER (zero=0.0_r4_, one=1.0_r4_, two=2.0_r4_, three=3.0_r4_, & + PARAMETER (zero=0.0_r4_, one=1.0_r4_, two=2.0_r4_, three=3.0_r4_, & four=4.0_r4_) REAL(r4_) :: b, c, del, delsq, tau, w INTRINSIC :: ABS, SQRT del = d(2) - d(1) delsq = del*(d(2)+d(1)) IF (i==1) THEN - w = one + four*rho*(z(2)*z(2)/(d(1)+three*d(2))-z(1)*z(1)/( & + w = one + four*rho*(z(2)*z(2)/(d(1)+three*d(2))-z(1)*z(1)/( & three*d(1)+d(2)))/del IF (w>zero) THEN b = delsq + rho*(z(1)*z(1)+z(2)*z(2)) @@ -25845,23 +25956,23 @@ SUBROUTINE SLASD5(i, d, z, delta, rho, dsigma, work) RETURN END SUBROUTINE - SUBROUTINE SLASD6(icompq, nl, nr, sqre, d, vf, vl, alpha, beta, & - idxq, perm, givptr, givcol, ldgcol, givnum, ldgnum, poles, difl, & + SUBROUTINE SLASD6(icompq, nl, nr, sqre, d, vf, vl, alpha, beta, & + idxq, perm, givptr, givcol, ldgcol, givnum, ldgnum, poles, difl, & difr, z, k, c, s, work, iwork, info) USE GALAHAD_KINDS - INTEGER(ip_) :: givptr, icompq, info, k, ldgcol, ldgnum, nl, nr, & + INTEGER(ip_) :: givptr, icompq, info, k, ldgcol, ldgnum, nl, nr, & sqre REAL(r4_) :: alpha, beta, c, s INTEGER(ip_) :: givcol(ldgcol, *), idxq(*), iwork(*), perm(*) - REAL(r4_) :: d(*), difl(*), difr(*), givnum(ldgnum, *), & + REAL(r4_) :: d(*), difl(*), difr(*), givnum(ldgnum, *), & poles(ldgnum, *), vf(*), vl(*), work(*), z(*) REAL(r4_) :: one, zero PARAMETER (one=1.0_r4_, zero=0.0_r4_) - INTEGER(ip_) :: i, idx, idxc, idxp, isigma, ivfw, ivlw, iw, m, n, & + INTEGER(ip_) :: i, idx, idxc, idxp, isigma, ivfw, ivlw, iw, m, n, & n1, n2 REAL(r4_) :: orgnrm - EXTERNAL :: SCOPY, SLAMRG, SLASCL, SLASD7, SLASD8, & - XERBLA + EXTERNAL :: SCOPY, SLAMRG, SLASCL, SLASD7, & + SLASD8, XERBLA INTRINSIC :: ABS, MAX info = 0 n = nl + nr + 1 @@ -25900,11 +26011,11 @@ SUBROUTINE SLASD6(icompq, nl, nr, sqre, d, vf, vl, alpha, beta, & CALL SLASCL('G', 0_ip_, 0_ip_, orgnrm, one, n, 1_ip_, d, n, info) alpha = alpha/orgnrm beta = beta/orgnrm - CALL SLASD7(icompq, nl, nr, sqre, k, d, z, work(iw), vf, & - work(ivfw), vl, work(ivlw), alpha, beta, work(isigma), iwork(idx), & - iwork(idxp), idxq, perm, givptr, givcol, ldgcol, givnum, ldgnum, & - c, s, info) - CALL SLASD8(icompq, k, d, z, vf, vl, difl, difr, ldgnum, & + CALL SLASD7(icompq, nl, nr, sqre, k, d, z, work(iw), vf, & + work(ivfw), vl, work(ivlw), alpha, beta, work(isigma), & + iwork(idx), iwork(idxp), idxq, perm, givptr, givcol, ldgcol, & + givnum, ldgnum, c, s, info) + CALL SLASD8(icompq, k, d, z, vf, vl, difl, difr, ldgnum, & work(isigma), work(iw), info) IF (info/=0) THEN RETURN @@ -25920,20 +26031,20 @@ SUBROUTINE SLASD6(icompq, nl, nr, sqre, d, vf, vl, alpha, beta, & RETURN END SUBROUTINE - SUBROUTINE SLASD7(icompq, nl, nr, sqre, k, d, z, zw, vf, vfw, vl, & - vlw, alpha, beta, dsigma, idx, idxp, idxq, perm, givptr, givcol, & + SUBROUTINE SLASD7(icompq, nl, nr, sqre, k, d, z, zw, vf, vfw, vl, & + vlw, alpha, beta, dsigma, idx, idxp, idxq, perm, givptr, givcol, & ldgcol, givnum, ldgnum, c, s, info) USE GALAHAD_KINDS - INTEGER(ip_) :: givptr, icompq, info, k, ldgcol, ldgnum, nl, nr, & + INTEGER(ip_) :: givptr, icompq, info, k, ldgcol, ldgnum, nl, nr, & sqre REAL(r4_) :: alpha, beta, c, s - INTEGER(ip_) :: givcol(ldgcol, *), idx(*), idxp(*), idxq(*), & + INTEGER(ip_) :: givcol(ldgcol, *), idx(*), idxp(*), idxq(*), & perm(*) - REAL(r4_) :: d(*), dsigma(*), givnum(ldgnum, *), vf(*), vfw(*), & + REAL(r4_) :: d(*), dsigma(*), givnum(ldgnum, *), vf(*), vfw(*), & vl(*), vlw(*), z(*), zw(*) REAL(r4_) :: zero, one, two, eight PARAMETER (zero=0.0_r4_, one=1.0_r4_, two=2.0_r4_, eight=8.0_r4_) - INTEGER(ip_) :: i, idxi, idxj, idxjp, j, jp, jprev, k2, m, n, & + INTEGER(ip_) :: i, idxi, idxj, idxjp, j, jp, jprev, k2, m, n, & nlp1, nlp2 REAL(r4_) :: eps, hlftol, tau, tol, z1 EXTERNAL :: SCOPY, SLAMRG, SROT, XERBLA @@ -26108,11 +26219,11 @@ SUBROUTINE SLASD7(icompq, nl, nr, sqre, k, d, z, zw, vf, vfw, vl, & RETURN END SUBROUTINE - SUBROUTINE SLASD8(icompq, k, d, z, vf, vl, difl, difr, lddifr, & + SUBROUTINE SLASD8(icompq, k, d, z, vf, vl, difl, difr, lddifr, & dsigma, work, info) USE GALAHAD_KINDS INTEGER(ip_) :: icompq, info, k, lddifr - REAL(r4_) :: d(*), difl(*), difr(lddifr, *), dsigma(*), vf(*), & + REAL(r4_) :: d(*), difl(*), difr(lddifr, *), dsigma(*), vf(*), & vl(*), work(*), z(*) REAL(r4_) :: one PARAMETER (one=1.0_r4_) @@ -26156,7 +26267,7 @@ SUBROUTINE SLASD8(icompq, k, d, z, vf, vl, difl, difr, lddifr, & rho = rho*rho CALL SLASET('A', k, 1_ip_, one, one, work(iwk3), k) DO j = 1, k - CALL SLASD4(k, j, dsigma, z, work(iwk1), rho, d(j), work(iwk2), & + CALL SLASD4(k, j, dsigma, z, work(iwk1), rho, d(j), work(iwk2), & info) IF (info/=0) THEN RETURN @@ -26165,11 +26276,11 @@ SUBROUTINE SLASD8(icompq, k, d, z, vf, vl, difl, difr, lddifr, & difl(j) = -work(j) difr(j, 1_ip_) = -work(j+1) DO i = 1, j - 1 - work(iwk3i+i) = work(iwk3i+i)*work(i)*work(iwk2i+i)/ & + work(iwk3i+i) = work(iwk3i+i)*work(i)*work(iwk2i+i)/ & (dsigma(i)-dsigma(j))/(dsigma(i)+dsigma(j)) END DO DO i = j + 1, k - work(iwk3i+i) = work(iwk3i+i)*work(i)*work(iwk2i+i)/ & + work(iwk3i+i) = work(iwk3i+i)*work(i)*work(iwk2i+i)/ & (dsigma(i)-dsigma(j))/(dsigma(i)+dsigma(j)) END DO END DO @@ -26186,10 +26297,11 @@ SUBROUTINE SLASD8(icompq, k, d, z, vf, vl, difl, difr, lddifr, & END IF work(j) = -z(j)/diflj/(dsigma(j)+dj) DO i = 1, j - 1 - work(i) = z(i)/(SLAMC3(dsigma(i),dsigj)-diflj)/ (dsigma(i)+dj) + work(i) = z(i)/(SLAMC3(dsigma(i),dsigj)-diflj)/ & + (dsigma(i)+dj) END DO DO i = j + 1, k - work(i) = z(i)/(SLAMC3(dsigma(i),dsigjp)+difrj)/ & + work(i) = z(i)/(SLAMC3(dsigma(i),dsigjp)+difrj)/ & (dsigma(i)+dj) END DO temp = SNRM2(k, work, 1_ip_) @@ -26204,25 +26316,25 @@ SUBROUTINE SLASD8(icompq, k, d, z, vf, vl, difl, difr, lddifr, & RETURN END SUBROUTINE - SUBROUTINE SLASDA(icompq, smlsiz, n, sqre, d, e, u, ldu, vt, k, & - difl, difr, z, poles, givptr, givcol, ldgcol, perm, givnum, c, s, & + SUBROUTINE SLASDA(icompq, smlsiz, n, sqre, d, e, u, ldu, vt, k, & + difl, difr, z, poles, givptr, givcol, ldgcol, perm, givnum, c, s, & work, iwork, info) USE GALAHAD_KINDS INTEGER(ip_) :: icompq, info, ldgcol, ldu, n, smlsiz, sqre - INTEGER(ip_) :: givcol(ldgcol, *), givptr(*), iwork(*), k(*), & + INTEGER(ip_) :: givcol(ldgcol, *), givptr(*), iwork(*), k(*), & perm(ldgcol, *) - REAL(r4_) :: c(*), d(*), difl(ldu, *), difr(ldu, *), e(*), & - givnum(ldu, *), poles(ldu, *), s(*), u(ldu, *), vt(ldu, *), & + REAL(r4_) :: c(*), d(*), difl(ldu, *), difr(ldu, *), e(*), & + givnum(ldu, *), poles(ldu, *), s(*), u(ldu, *), vt(ldu, *), & work(*), z(ldu, *) REAL(r4_) :: zero, one PARAMETER (zero=0.0_r4_, one=1.0_r4_) - INTEGER(ip_) :: i, i1, ic, idxq, idxqi, im1, inode, itemp, iwk, j, & - lf, ll, lvl, lvl2, m, ncc, nd, ndb1, ndiml, ndimr, nl, nlf, nlp1, & - nlvl, nr, nrf, nrp1, nru, nwork1, nwork2, smlszp, sqrei, vf, vfi, & - vl, vli + INTEGER(ip_) :: i, i1, ic, idxq, idxqi, im1, inode, itemp, iwk, & + j, lf, ll, lvl, lvl2, m, ncc, nd, ndb1, ndiml, ndimr, nl, nlf, & + nlp1, nlvl, nr, nrf, nrp1, nru, nwork1, nwork2, smlszp, sqrei, & + vf, vfi, vl, vli REAL(r4_) :: alpha, beta - EXTERNAL :: SCOPY, SLASD6, SLASDQ, SLASDT, SLASET, & - XERBLA + EXTERNAL :: SCOPY, SLASD6, SLASDQ, SLASDT, & + SLASET, XERBLA info = 0 IF ((icompq<0) .OR. (icompq>1)) THEN info = -1 @@ -26244,10 +26356,10 @@ SUBROUTINE SLASDA(icompq, smlsiz, n, sqre, d, e, u, ldu, vt, k, & m = n + sqre IF (n<=smlsiz) THEN IF (icompq==0) THEN - CALL SLASDQ('U', sqre, n, 0_ip_, 0_ip_, 0_ip_, d, e, vt, ldu, & + CALL SLASDQ('U', sqre, n, 0_ip_, 0_ip_, 0_ip_, d, e, vt, ldu, & u, ldu, u, ldu, work, info) ELSE - CALL SLASDQ('U', sqre, n, m, n, 0_ip_, d, e, vt, ldu, u, ldu, & + CALL SLASDQ('U', sqre, n, m, n, 0_ip_, d, e, vt, ldu, u, ldu, & u, ldu, work, info) END IF RETURN @@ -26264,8 +26376,8 @@ SUBROUTINE SLASDA(icompq, smlsiz, n, sqre, d, e, u, ldu, vt, k, & vl = vf + m nwork1 = vl + m nwork2 = nwork1 + smlszp*smlszp - CALL SLASDT(n, nlvl, nd, iwork(inode), iwork(ndiml), iwork(ndimr), & - smlsiz) + CALL SLASDT(n, nlvl, nd, iwork(inode), iwork(ndiml), & + iwork(ndimr), smlsiz) ndb1 = (nd+1)/2 DO i = ndb1, nd i1 = i - 1 @@ -26281,8 +26393,8 @@ SUBROUTINE SLASDA(icompq, smlsiz, n, sqre, d, e, u, ldu, vt, k, & sqrei = 1 IF (icompq==0) THEN CALL SLASET('A', nlp1, nlp1, zero, one, work(nwork1), smlszp) - CALL SLASDQ('U', sqrei, nl, nlp1, nru, ncc, d(nlf), e(nlf), & - work(nwork1), smlszp, work(nwork2), nl, work(nwork2), nl, & + CALL SLASDQ('U', sqrei, nl, nlp1, nru, ncc, d(nlf), e(nlf), & + work(nwork1), smlszp, work(nwork2), nl, work(nwork2), nl, & work(nwork2), info) itemp = nwork1 + nl*smlszp CALL SCOPY(nlp1, work(nwork1), 1_ip_, work(vfi), 1_ip_) @@ -26290,8 +26402,8 @@ SUBROUTINE SLASDA(icompq, smlsiz, n, sqre, d, e, u, ldu, vt, k, & ELSE CALL SLASET('A', nl, nl, zero, one, u(nlf,1), ldu) CALL SLASET('A', nlp1, nlp1, zero, one, vt(nlf,1), ldu) - CALL SLASDQ('U', sqrei, nl, nlp1, nl, ncc, d(nlf), e(nlf), & - vt(nlf,1), ldu, u(nlf,1), ldu, u(nlf,1), ldu, work(nwork1), & + CALL SLASDQ('U', sqrei, nl, nlp1, nl, ncc, d(nlf), e(nlf), & + vt(nlf,1), ldu, u(nlf,1), ldu, u(nlf,1), ldu, work(nwork1), & info) CALL SCOPY(nlp1, vt(nlf,1), 1_ip_, work(vfi), 1_ip_) CALL SCOPY(nlp1, vt(nlf,nlp1), 1_ip_, work(vli), 1_ip_) @@ -26313,8 +26425,8 @@ SUBROUTINE SLASDA(icompq, smlsiz, n, sqre, d, e, u, ldu, vt, k, & nrp1 = nr + sqrei IF (icompq==0) THEN CALL SLASET('A', nrp1, nrp1, zero, one, work(nwork1), smlszp) - CALL SLASDQ('U', sqrei, nr, nrp1, nru, ncc, d(nrf), e(nrf), & - work(nwork1), smlszp, work(nwork2), nr, work(nwork2), nr, & + CALL SLASDQ('U', sqrei, nr, nrp1, nru, ncc, d(nrf), e(nrf), & + work(nwork1), smlszp, work(nwork2), nr, work(nwork2), nr, & work(nwork2), info) itemp = nwork1 + (nrp1-1)*smlszp CALL SCOPY(nrp1, work(nwork1), 1_ip_, work(vfi), 1_ip_) @@ -26322,8 +26434,8 @@ SUBROUTINE SLASDA(icompq, smlsiz, n, sqre, d, e, u, ldu, vt, k, & ELSE CALL SLASET('A', nr, nr, zero, one, u(nrf,1), ldu) CALL SLASET('A', nrp1, nrp1, zero, one, vt(nrf,1), ldu) - CALL SLASDQ('U', sqrei, nr, nrp1, nr, ncc, d(nrf), e(nrf), & - vt(nrf,1), ldu, u(nrf,1), ldu, u(nrf,1), ldu, work(nwork1), & + CALL SLASDQ('U', sqrei, nr, nrp1, nr, ncc, d(nrf), e(nrf), & + vt(nrf,1), ldu, u(nrf,1), ldu, u(nrf,1), ldu, work(nwork1), & info) CALL SCOPY(nrp1, vt(nrf,1), 1_ip_, work(vfi), 1_ip_) CALL SCOPY(nrp1, vt(nrf,nrp1), 1_ip_, work(vli), 1_ip_) @@ -26363,16 +26475,16 @@ SUBROUTINE SLASDA(icompq, smlsiz, n, sqre, d, e, u, ldu, vt, k, & alpha = d(ic) beta = e(ic) IF (icompq==0) THEN - CALL SLASD6(icompq, nl, nr, sqrei, d(nlf), work(vfi), & - work(vli), alpha, beta, iwork(idxqi), perm, givptr(1), & - givcol, ldgcol, givnum, ldu, poles, difl, difr, z, k(1), & + CALL SLASD6(icompq, nl, nr, sqrei, d(nlf), work(vfi), & + work(vli), alpha, beta, iwork(idxqi), perm, givptr(1), & + givcol, ldgcol, givnum, ldu, poles, difl, difr, z, k(1), & c(1), s(1), work(nwork1), iwork(iwk), info) ELSE j = j - 1 - CALL SLASD6(icompq, nl, nr, sqrei, d(nlf), work(vfi), & - work(vli), alpha, beta, iwork(idxqi), perm(nlf,lvl), & - givptr(j), givcol(nlf,lvl2), ldgcol, givnum(nlf,lvl2), ldu, & - poles(nlf,lvl2), difl(nlf,lvl), difr(nlf,lvl2), z(nlf,lvl), & + CALL SLASD6(icompq, nl, nr, sqrei, d(nlf), work(vfi), & + work(vli), alpha, beta, iwork(idxqi), perm(nlf,lvl), & + givptr(j), givcol(nlf,lvl2), ldgcol, givnum(nlf,lvl2), ldu,& + poles(nlf,lvl2), difl(nlf,lvl), difr(nlf,lvl2), z(nlf,lvl),& k(j), c(j), s(j), work(nwork1), iwork(iwk), info) END IF IF (info/=0) THEN @@ -26383,12 +26495,12 @@ SUBROUTINE SLASDA(icompq, smlsiz, n, sqre, d, e, u, ldu, vt, k, & RETURN END SUBROUTINE - SUBROUTINE SLASDQ(uplo, sqre, n, ncvt, nru, ncc, d, e, vt, ldvt, u, & + SUBROUTINE SLASDQ(uplo, sqre, n, ncvt, nru, ncc, d, e, vt, ldvt, u, & ldu, c, ldc, work, info) USE GALAHAD_KINDS CHARACTER :: uplo INTEGER(ip_) :: info, ldc, ldu, ldvt, n, ncc, ncvt, nru, sqre - REAL(r4_) :: c(ldc, *), d(*), e(*), u(ldu, *), vt(ldvt, *), & + REAL(r4_) :: c(ldc, *), d(*), e(*), u(ldu, *), vt(ldvt, *), & work(*) REAL(r4_) :: zero PARAMETER (zero=0.0_r4_) @@ -26415,12 +26527,12 @@ SUBROUTINE SLASDQ(uplo, sqre, n, ncvt, nru, ncc, d, e, vt, ldvt, u, & info = -5 ELSE IF (ncc<0) THEN info = -6 - ELSE IF ((ncvt==0 .AND. ldvt<1) .OR. (ncvt>0 .AND. ldvt0 .AND. ldvt0 .AND. ldc0 .AND. ldc0) CALL SLASR('L', 'V', 'F', np1, ncvt, work(1), & + IF (ncvt>0) CALL SLASR('L', 'V', 'F', np1, ncvt, work(1), & work(np1), vt, ldvt) END IF IF (iuplo==2) THEN @@ -26476,24 +26588,24 @@ SUBROUTINE SLASDQ(uplo, sqre, n, ncvt, nru, ncc, d, e, vt, ldvt, u, & END IF IF (nru>0) THEN IF (sqre1==0) THEN - CALL SLASR('R', 'V', 'F', nru, n, work(1), work(np1), u, & + CALL SLASR('R', 'V', 'F', nru, n, work(1), work(np1), u, & ldu) ELSE - CALL SLASR('R', 'V', 'F', nru, np1, work(1), work(np1), u, & + CALL SLASR('R', 'V', 'F', nru, np1, work(1), work(np1), u, & ldu) END IF END IF IF (ncc>0) THEN IF (sqre1==0) THEN - CALL SLASR('L', 'V', 'F', n, ncc, work(1), work(np1), c, & + CALL SLASR('L', 'V', 'F', n, ncc, work(1), work(np1), c, & ldc) ELSE - CALL SLASR('L', 'V', 'F', np1, ncc, work(1), work(np1), c, & + CALL SLASR('L', 'V', 'F', np1, ncc, work(1), work(np1), c, & ldc) END IF END IF END IF - CALL SBDSQR('U', n, ncvt, nru, ncc, d, e, vt, ldvt, u, ldu, c, & + CALL SBDSQR('U', n, ncvt, nru, ncc, d, e, vt, ldvt, u, ldu, c, & ldc, work, info) DO i = 1, n isub = i @@ -26595,7 +26707,7 @@ SUBROUTINE SLASQ1(n, d, e, work, info) PARAMETER (zero=0.0_r4_) INTEGER(ip_) :: i, iinfo REAL(r4_) :: eps, scale, safmin, sigmn, sigmx - EXTERNAL :: SCOPY, SLAS2, SLASCL, SLASQ2, SLASRT, & + EXTERNAL :: SCOPY, SLAS2, SLASCL, SLASQ2, SLASRT, & XERBLA REAL(r4_) :: SLAMCH EXTERNAL :: SLAMCH @@ -26634,7 +26746,7 @@ SUBROUTINE SLASQ1(n, d, e, work, info) scale = SQRT(eps/safmin) CALL SCOPY(n, d, 1_ip_, work(1), 2_ip_) CALL SCOPY(n-1, e, 1_ip_, work(2), 2_ip_) - CALL SLASCL('G', 0_ip_, 0_ip_, sigmx, scale, 2*n-1, 1_ip_, work, & + CALL SLASCL('G', 0_ip_, 0_ip_, sigmx, scale, 2*n-1, 1_ip_, work, & 2*n-1, iinfo) DO i = 1, 2*n - 1 work(i) = work(i)**2 @@ -26645,16 +26757,16 @@ SUBROUTINE SLASQ1(n, d, e, work, info) DO i = 1, n d(i) = SQRT(work(i)) END DO - CALL SLASCL('G', 0_ip_, 0_ip_, scale, sigmx, n, 1_ip_, d, n, & + CALL SLASCL('G', 0_ip_, 0_ip_, scale, sigmx, n, 1_ip_, d, n, & iinfo) ELSE IF (info==2) THEN DO i = 1, n d(i) = SQRT(work(2*i-1)) e(i) = SQRT(work(2*i)) END DO - CALL SLASCL('G', 0_ip_, 0_ip_, scale, sigmx, n, 1_ip_, d, n, & + CALL SLASCL('G', 0_ip_, 0_ip_, scale, sigmx, n, 1_ip_, d, n, & iinfo) - CALL SLASCL('G', 0_ip_, 0_ip_, scale, sigmx, n, 1_ip_, e, n, & + CALL SLASCL('G', 0_ip_, 0_ip_, scale, sigmx, n, 1_ip_, e, n, & iinfo) END IF RETURN @@ -26667,13 +26779,13 @@ SUBROUTINE SLASQ2(n, z, info) REAL(r4_) :: cbias PARAMETER (cbias=1.50_r4_) REAL(r4_) :: zero, half, one, two, four, hundrd - PARAMETER (zero=0.0_r4_, half=0.5_r4_, one=1.0_r4_, two=2.0_r4_, & + PARAMETER (zero=0.0_r4_, half=0.5_r4_, one=1.0_r4_, two=2.0_r4_, & four=4.0_r4_, hundrd=100.0_r4_) LOGICAL :: ieee - INTEGER(ip_) :: i0, i4, iinfo, ipn4, iter, iwhila, iwhilb, k, & + INTEGER(ip_) :: i0, i4, iinfo, ipn4, iter, iwhila, iwhilb, k, & kmin, n0, nbig, ndiv, nfail, pp, splt, ttype, i1, n1 - REAL(r4_) :: d, dee, deemin, desig, dmin, dmin1, dmin2, dn, dn1, & - dn2, e, emax, emin, eps, g, oldemn, qmax, qmin, s, safmin, sigma, & + REAL(r4_) :: d, dee, deemin, desig, dmin, dmin1, dmin2, dn, dn1, & + dn2, e, emax, emin, eps, g, oldemn, qmax, qmin, s, safmin, sigma,& t, tau, temp, tol, tol2, trace, zmax, tempe, tempq EXTERNAL :: SLASQ3, SLASRT, XERBLA REAL(r4_) :: SLAMCH @@ -26814,7 +26926,7 @@ SUBROUTINE SLASQ2(n, z, info) z(i4-2*pp-2) = d z(i4-2*pp) = zero d = z(i4+1) - ELSE IF (safmin*z(i4+1)n0) GO TO 150 - CALL SLASQ3(i0, n0, z, pp, dmin, sigma, desig, qmax, nfail, & + CALL SLASQ3(i0, n0, z, pp, dmin, sigma, desig, qmax, nfail, & iter, ndiv, ieee, ttype, dmin1, dmin2, dn, dn1, dn2, g, tau) pp = 1 - pp IF (pp==0 .AND. n0-i0>=3) THEN @@ -26990,18 +27102,18 @@ SUBROUTINE SLASQ2(n, z, info) RETURN END SUBROUTINE - SUBROUTINE SLASQ3(i0, n0, z, pp, dmin, sigma, desig, qmax, nfail, & + SUBROUTINE SLASQ3(i0, n0, z, pp, dmin, sigma, desig, qmax, nfail, & iter, ndiv, ieee, ttype, dmin1, dmin2, dn, dn1, dn2, g, tau) USE GALAHAD_KINDS LOGICAL :: ieee INTEGER(ip_) :: i0, iter, n0, ndiv, nfail, pp - REAL(r4_) :: desig, dmin, dmin1, dmin2, dn, dn1, dn2, g, qmax, & + REAL(r4_) :: desig, dmin, dmin1, dmin2, dn, dn1, dn2, g, qmax, & sigma, tau REAL(r4_) :: z(*) REAL(r4_) :: cbias PARAMETER (cbias=1.50_r4_) REAL(r4_) :: zero, qurtr, half, one, two, hundrd - PARAMETER (zero=0.0_r4_, qurtr=0.250_r4_, half=0.5_r4_, & + PARAMETER (zero=0.0_r4_, qurtr=0.250_r4_, half=0.5_r4_, & one=1.0_r4_, two=2.0_r4_, hundrd=100.0_r4_) INTEGER(ip_) :: ipn4, j4, n0in, nn, ttype REAL(r4_) :: eps, s, t, temp, tol, tol2 @@ -27019,7 +27131,7 @@ SUBROUTINE SLASQ3(i0, n0, z, pp, dmin, sigma, desig, qmax, nfail, & IF (n0==i0) GO TO 20 nn = 4*n0 + pp IF (n0==(i0+1)) GO TO 40 - IF (z(nn-5)>tol2*(sigma+z(nn-3)) .AND. z(nn-2*pp-4)>tol2*z(nn-7) & + IF (z(nn-5)>tol2*(sigma+z(nn-3)) .AND. z(nn-2*pp-4)>tol2*z(nn-7) & ) GO TO 30 20 CONTINUE z(4*n0-3) = z(4*n0+pp-3) + sigma @@ -27079,16 +27191,16 @@ SUBROUTINE SLASQ3(i0, n0, z, pp, dmin, sigma, desig, qmax, nfail, & dmin = -zero END IF END IF - CALL SLASQ4(i0, n0, z, pp, n0in, dmin, dmin1, dmin2, dn, dn1, dn2, & - tau, ttype, g) + CALL SLASQ4(i0, n0, z, pp, n0in, dmin, dmin1, dmin2, dn, dn1, & + dn2, tau, ttype, g) 70 CONTINUE - CALL SLASQ5(i0, n0, z, pp, tau, sigma, dmin, dmin1, dmin2, dn, & + CALL SLASQ5(i0, n0, z, pp, tau, sigma, dmin, dmin1, dmin2, dn, & dn1, dn2, ieee, eps) ndiv = ndiv + (n0-i0+2) iter = iter + 1 IF (dmin>=zero .AND. dmin1>=zero) THEN GO TO 90 - ELSE IF (dminzero .AND. z(4*(n0- & + ELSE IF (dminzero .AND. z(4*(n0- & 1)-pp)ABS(u22) .OR. (two*smlnum)*ABS( & + IF ((two*smlnum)*ABS(btmp(2))>ABS(u22) .OR. (two*smlnum)*ABS( & btmp(1))>ABS(u11)) THEN scale = half/MAX(ABS(btmp(1)), ABS(btmp(2))) btmp(1) = btmp(1)*scale @@ -28290,9 +28403,9 @@ SUBROUTINE SLASY2(ltranl, ltranr, isgn, n1, n2, tl, ldtl, tr, ldtr, & END IF RETURN 50 CONTINUE - smin = MAX(ABS(tr(1,1)), ABS(tr(1,2)), ABS(tr(2,1)), ABS(tr( & + smin = MAX(ABS(tr(1,1)), ABS(tr(1,2)), ABS(tr(2,1)), ABS(tr( & 2_ip_, 2_ip_))) - smin = MAX(smin, ABS(tl(1,1)), ABS(tl(1,2)), ABS(tl( 2_ip_, & + smin = MAX(smin, ABS(tl(1,1)), ABS(tl(1,2)), ABS(tl( 2_ip_, & 1_ip_)), ABS(tl(2,2))) smin = MAX(eps*smin, smlnum) btmp(1) = zero @@ -28344,7 +28457,7 @@ SUBROUTINE SLASY2(ltranl, ltranr, isgn, n1, n2, tl, ldtl, tr, ldtr, & btmp(i) = btmp(ipsv) btmp(ipsv) = temp END IF - IF (jpsv/=i) CALL SSWAP( 4_ip_, t16(1,jpsv), 1_ip_, t16(1,i), & + IF (jpsv/=i) CALL SSWAP( 4_ip_, t16(1,jpsv), 1_ip_, t16(1,i), & 1_ip_) jpiv(i) = jpsv IF (ABS(t16(i,i))ABS(t16(1, 1_ip_)) .OR. & - (eight*smlnum)*ABS(btmp(2))>ABS(t16( 2_ip_, 2_ip_)) .OR. & - (eight*smlnum)*ABS(btmp(3))>ABS(t16( 3_ip_, 3_ip_)) .OR. & + IF ((eight*smlnum)*ABS(btmp(1))>ABS(t16(1, 1_ip_)) .OR. & + (eight*smlnum)*ABS(btmp(2))>ABS(t16( 2_ip_, 2_ip_)) .OR. & + (eight*smlnum)*ABS(btmp(3))>ABS(t16( 3_ip_, 3_ip_)) .OR. & (eight*smlnum)*ABS(btmp(4))>ABS(t16(4,4))) THEN - scale = (one/eight)/MAX(ABS(btmp(1)), ABS(btmp(2)), ABS(btmp(3 & + scale = (one/eight)/MAX(ABS(btmp(1)), ABS(btmp(2)), ABS(btmp(3 & )), ABS(btmp(4))) btmp(1) = btmp(1)*scale btmp(2) = btmp(2)*scale @@ -28408,7 +28521,7 @@ SUBROUTINE SLASYF(uplo, n, nb, kb, a, lda, ipiv, w, ldw, info) PARAMETER (zero=0.0_r4_, one=1.0_r4_) REAL(r4_) :: eight, sevten PARAMETER (eight=8.0_r4_, sevten=17.0_r4_) - INTEGER(ip_) :: imax, j, jb, jj, jmax, jp, k, kk, kkw, kp, kstep, & + INTEGER(ip_) :: imax, j, jb, jj, jmax, jp, k, kk, kkw, kp, kstep, & kw REAL(r4_) :: absakk, alpha, colmax, d11, d21, d22, r1, rowmax, t LOGICAL :: LSAME @@ -28424,8 +28537,8 @@ SUBROUTINE SLASYF(uplo, n, nb, kb, a, lda, ipiv, w, ldw, info) kw = nb + k - n IF ((k<=n-nb+1 .AND. nb1) THEN @@ -28442,9 +28555,9 @@ SUBROUTINE SLASYF(uplo, n, nb, kb, a, lda, ipiv, w, ldw, info) kp = k ELSE CALL SCOPY(imax, a(1,imax), 1_ip_, w(1,kw-1), 1_ip_) - CALL SCOPY(k-imax, a(imax,imax+1), lda, w(imax+1,kw-1), & + CALL SCOPY(k-imax, a(imax,imax+1), lda, w(imax+1,kw-1), & 1_ip_) - IF (k=nb .AND. nbn) GO TO 90 CALL SCOPY(n-k+1, a(k,k), 1_ip_, w(k,k), 1_ip_) - CALL SGEMV('No transpose', n-k+1, k-1, -one, a(k,1), lda, w(k, & + CALL SGEMV('No transpose', n-k+1, k-1, -one, a(k,1), lda, w(k, & 1), ldw, one, w(k,k), 1_ip_) kstep = 1 absakk = ABS(w(k,k)) @@ -28546,9 +28659,9 @@ SUBROUTINE SLASYF(uplo, n, nb, kb, a, lda, ipiv, w, ldw, info) kp = k ELSE CALL SCOPY(imax-k, a(imax,k), lda, w(k,k+1), 1_ip_) - CALL SCOPY(n-imax+1, a(imax,imax), 1_ip_, w(imax,k+1), & + CALL SCOPY(n-imax+1, a(imax,imax), 1_ip_, w(imax,k+1), & 1_ip_) - CALL SGEMV('No transpose', n-k+1, k-1, -one, a(k,1), lda, & + CALL SGEMV('No transpose', n-k+1, k-1, -one, a(k,1), lda, & w(imax,1), ldw, one, w(k,k+1), 1_ip_) jmax = k - 1 + ISAMAX(imax-k, w(k,k+1), 1_ip_) rowmax = ABS(w(jmax,k+1)) @@ -28570,7 +28683,7 @@ SUBROUTINE SLASYF(uplo, n, nb, kb, a, lda, ipiv, w, ldw, info) IF (kp/=kk) THEN a(kp, kp) = a(kk, kk) CALL SCOPY(kp-kk-1, a(kk+1,kk), 1_ip_, a(kp,kk+1), lda) - IF (kp1) CALL SSWAP(k-1, a(kk,1), lda, a(kp,1), lda) CALL SSWAP(kk, w(kk,1), ldw, w(kp,1), ldw) @@ -28610,12 +28723,12 @@ SUBROUTINE SLASYF(uplo, n, nb, kb, a, lda, ipiv, w, ldw, info) DO j = k, n, nb jb = MIN(nb, n-j+1) DO jj = j, j + jb - 1 - CALL SGEMV('No transpose', j+jb-jj, k-1, -one, a(jj,1), lda, & - w(jj,1), ldw, one, a(jj,jj), 1_ip_) + CALL SGEMV('No transpose', j+jb-jj, k-1, -one, a(jj,1), & + lda, w(jj,1), ldw, one, a(jj,jj), 1_ip_) END DO - IF (j+jb<=n) CALL SGEMM('No transpose', 'Transpose', n-j-jb+1, & - jb, k-1, -one, a(j+jb,1), lda, w(j,1), ldw, one, a(j+jb,j), & - lda) + IF (j+jb<=n) CALL SGEMM('No transpose', 'Transpose', & + n-j-jb+1, jb, k-1, -one, a(j+jb,1), lda, w(j,1), ldw, one, & + a(j+jb,j), lda) END DO j = k - 1 120 CONTINUE @@ -28626,7 +28739,8 @@ SUBROUTINE SLASYF(uplo, n, nb, kb, a, lda, ipiv, w, ldw, info) j = j - 1 END IF j = j - 1 - IF (jp/=jj .AND. j>=1) CALL SSWAP(j, a(jp,1), lda, a(jj,1), lda) + IF (jp/=jj .AND. j>=1) CALL SSWAP(j, a(jp,1), lda, a(jj,1), & + lda) IF (j>1) GO TO 120 kb = k - 1 END IF @@ -28652,55 +28766,55 @@ SUBROUTINE SLATRD(uplo, n, nb, a, lda, e, tau, w, ldw) DO i = n, n - nb + 1, -1_ip_ iw = i - n + nb IF (i1) THEN CALL SLARFG(i-1, a(i-1,i), a(1,i), 1_ip_, tau(i-1)) e(i-1) = a(i-1, i) a(i-1, i) = one - CALL SSYMV('Upper', i-1, one, a, lda, a(1,i), 1_ip_, zero, & + CALL SSYMV('Upper', i-1, one, a, lda, a(1,i), 1_ip_, zero, & w(1,iw), 1_ip_) IF (im .OR. nm .OR. nn .OR. m1) THEN - CALL SORGQR(m-1, m-1, m-1, a(2,2), lda, tau, work, -1_ip_, & - iinfo) + CALL SORGQR(m-1, m-1, m-1, a(2,2), lda, tau, work, & + -1_ip_, iinfo) END IF END IF ELSE @@ -28869,8 +28983,8 @@ SUBROUTINE SORGBR(vect, m, n, k, a, lda, tau, work, lwork, info) CALL SORGLQ(m, n, k, a, lda, tau, work, -1_ip_, iinfo) ELSE IF (n>1) THEN - CALL SORGLQ(n-1, n-1, n-1, a(2,2), lda, tau, work, -1_ip_, & - iinfo) + CALL SORGLQ(n-1, n-1, n-1, a(2,2), lda, tau, work, & + -1_ip_, iinfo) END IF END IF END IF @@ -28903,7 +29017,7 @@ SUBROUTINE SORGBR(vect, m, n, k, a, lda, tau, work, lwork, info) a(i, 1_ip_) = zero END DO IF (m>1) THEN - CALL SORGQR(m-1, m-1, m-1, a(2,2), lda, tau, work, lwork, & + CALL SORGQR(m-1, m-1, m-1, a(2,2), lda, tau, work, lwork, & iinfo) END IF END IF @@ -28922,7 +29036,7 @@ SUBROUTINE SORGBR(vect, m, n, k, a, lda, tau, work, lwork, info) a(1, j) = zero END DO IF (n>1) THEN - CALL SORGLQ(n-1, n-1, n-1, a(2,2), lda, tau, work, lwork, & + CALL SORGLQ(n-1, n-1, n-1, a(2,2), lda, tau, work, lwork, & iinfo) END IF END IF @@ -28967,7 +29081,7 @@ SUBROUTINE SORGL2(m, n, k, a, lda, tau, work, info) IF (i0) THEN DO i = ki + 1, 1_ip_, -nb ib = MIN(nb, k-i+1) IF (i+ib<=m) THEN - CALL SLARFT('Forward', 'Rowwise', n-i+1, ib, a(i,i), lda, & + CALL SLARFT('Forward', 'Rowwise', n-i+1, ib, a(i,i), lda, & tau(i), work, ldwork) - CALL SLARFB('Right', 'Transpose', 'Forward', 'Rowwise', & - m-i-ib+1, n-i+1, ib, a(i,i), lda, work, ldwork, a(i+ib,i), & + CALL SLARFB('Right', 'Transpose', 'Forward', 'Rowwise', & + m-i-ib+1, n-i+1, ib, a(i,i), lda, work, ldwork, a(i+ib,i),& lda, work(ib+1), ldwork) END IF CALL SORGL2(ib, n-i+1, ib, a(i,i), lda, tau(i), work, iinfo) @@ -29075,7 +29189,7 @@ SUBROUTINE SORGQL(m, n, k, a, lda, tau, work, lwork, info) REAL(r4_) :: zero PARAMETER (zero=0.0_r4_) LOGICAL :: lquery - INTEGER(ip_) :: i, ib, iinfo, iws, j, kk, l, ldwork, lwkopt, nb, & + INTEGER(ip_) :: i, ib, iinfo, iws, j, kk, l, ldwork, lwkopt, nb, & nbmin, nx EXTERNAL :: SLARFB, SLARFT, SORG2L, XERBLA INTRINSIC :: MAX, MIN @@ -29142,14 +29256,14 @@ SUBROUTINE SORGQL(m, n, k, a, lda, tau, work, lwork, info) DO i = k - kk + 1, k, nb ib = MIN(nb, k-i+1) IF (n-k+i>1) THEN - CALL SLARFT('Backward', 'Columnwise', m-k+i+ib-1, ib, a(1, & + CALL SLARFT('Backward', 'Columnwise', m-k+i+ib-1, ib, a(1, & n-k+i), lda, tau(i), work, ldwork) - CALL SLARFB('Left', 'No transpose', 'Backward', & - 'Columnwise', m-k+i+ib-1, n-k+i-1, ib, a(1,n-k+i), lda, & + CALL SLARFB('Left', 'No transpose', 'Backward', & + 'Columnwise', m-k+i+ib-1, n-k+i-1, ib, a(1,n-k+i), lda, & work, ldwork, a, lda, work(ib+1), ldwork) END IF - CALL SORG2L(m-k+i+ib-1, ib, ib, a(1,n-k+i), lda, tau(i), work, & - iinfo) + CALL SORG2L(m-k+i+ib-1, ib, ib, a(1,n-k+i), lda, tau(i), & + work, iinfo) DO j = n - k + i, n - k + i + ib - 1 DO l = m - k + i + ib, m a(l, j) = zero @@ -29168,7 +29282,7 @@ SUBROUTINE SORGQR(m, n, k, a, lda, tau, work, lwork, info) REAL(r4_) :: zero PARAMETER (zero=0.0_r4_) LOGICAL :: lquery - INTEGER(ip_) :: i, ib, iinfo, iws, j, ki, kk, l, ldwork, lwkopt, & + INTEGER(ip_) :: i, ib, iinfo, iws, j, ki, kk, l, ldwork, lwkopt, & nb, nbmin, nx EXTERNAL :: SLARFB, SLARFT, SORG2R, XERBLA INTRINSIC :: MAX, MIN @@ -29225,17 +29339,17 @@ SUBROUTINE SORGQR(m, n, k, a, lda, tau, work, lwork, info) ELSE kk = 0 END IF - IF (kk0) THEN DO i = ki + 1, 1_ip_, -nb ib = MIN(nb, k-i+1) IF (i+ib<=n) THEN - CALL SLARFT('Forward', 'Columnwise', m-i+1, ib, a(i,i), lda, & - tau(i), work, ldwork) - CALL SLARFB('Left', 'No transpose', 'Forward', 'Columnwise', & - m-i+1, n-i-ib+1, ib, a(i,i), lda, work, ldwork, a(i,i+ib), & - lda, work(ib+1), ldwork) + CALL SLARFT('Forward', 'Columnwise', m-i+1, ib, a(i,i), & + lda, tau(i), work, ldwork) + CALL SLARFB('Left', 'No transpose', 'Forward', & + 'Columnwise', m-i+1, n-i-ib+1, ib, a(i,i), lda, work, & + ldwork, a(i,i+ib), lda, work(ib+1), ldwork) END IF CALL SORG2R(m-i+1, ib, ib, a(i,i), lda, tau(i), work, iinfo) DO j = i, i + ib - 1 @@ -29318,7 +29432,7 @@ SUBROUTINE SORGTR(uplo, n, a, lda, tau, work, lwork, info) a(i, 1_ip_) = zero END DO IF (n>1) THEN - CALL SORGQR(n-1, n-1, n-1, a(2,2), lda, tau, work, lwork, & + CALL SORGQR(n-1, n-1, n-1, a(2,2), lda, tau, work, lwork, & iinfo) END IF END IF @@ -29326,7 +29440,7 @@ SUBROUTINE SORGTR(uplo, n, a, lda, tau, work, lwork, info) RETURN END SUBROUTINE - SUBROUTINE SORM2R(side, trans, m, n, k, a, lda, tau, c, ldc, work, & + SUBROUTINE SORM2R(side, trans, m, n, k, a, lda, tau, c, ldc, work, & info) USE GALAHAD_KINDS CHARACTER :: side, trans @@ -29369,7 +29483,8 @@ SUBROUTINE SORM2R(side, trans, m, n, k, a, lda, tau, c, ldc, work, & RETURN END IF IF (m==0 .OR. n==0 .OR. k==0) RETURN - IF ((left .AND. .NOT. notran) .OR. (.NOT. left .AND. notran)) THEN + IF ((left .AND. .NOT. notran) .OR. (.NOT. left .AND. notran)) & + THEN i1 = 1 i2 = k i3 = 1 @@ -29395,14 +29510,14 @@ SUBROUTINE SORM2R(side, trans, m, n, k, a, lda, tau, c, ldc, work, & END IF aii = a(i, i) a(i, i) = one - CALL SLARF(side, mi, ni, a(i,i), 1_ip_, tau(i), c(ic,jc), ldc, & + CALL SLARF(side, mi, ni, a(i,i), 1_ip_, tau(i), c(ic,jc), ldc, & work) a(i, i) = aii END DO RETURN END SUBROUTINE - SUBROUTINE SORMBR(vect, side, trans, m, n, k, a, lda, tau, c, ldc, & + SUBROUTINE SORMBR(vect, side, trans, m, n, k, a, lda, tau, c, ldc, & work, lwork, info) USE GALAHAD_KINDS CHARACTER :: side, trans, vect @@ -29440,7 +29555,7 @@ SUBROUTINE SORMBR(vect, side, trans, m, n, k, a, lda, tau, c, ldc, & info = -5 ELSE IF (k<0) THEN info = -6 - ELSE IF ((applyq .AND. lda=k) THEN - CALL SORMQR(side, trans, m, n, k, a, lda, tau, c, ldc, work, & + CALL SORMQR(side, trans, m, n, k, a, lda, tau, c, ldc, work, & lwork, iinfo) ELSE IF (nq>1) THEN IF (left) THEN @@ -29493,8 +29608,8 @@ SUBROUTINE SORMBR(vect, side, trans, m, n, k, a, lda, tau, c, ldc, & i1 = 1 i2 = 2 END IF - CALL SORMQR(side, trans, mi, ni, nq-1, a(2,1), lda, tau, c(i1, & - i2), ldc, work, lwork, iinfo) + CALL SORMQR(side, trans, mi, ni, nq-1, a(2,1), lda, tau, & + c(i1,i2), ldc, work, lwork, iinfo) END IF ELSE IF (notran) THEN @@ -29503,7 +29618,7 @@ SUBROUTINE SORMBR(vect, side, trans, m, n, k, a, lda, tau, c, ldc, & transt = 'N' END IF IF (nq>k) THEN - CALL SORMLQ(side, transt, m, n, k, a, lda, tau, c, ldc, work, & + CALL SORMLQ(side, transt, m, n, k, a, lda, tau, c, ldc, work, & lwork, iinfo) ELSE IF (nq>1) THEN IF (left) THEN @@ -29517,7 +29632,7 @@ SUBROUTINE SORMBR(vect, side, trans, m, n, k, a, lda, tau, c, ldc, & i1 = 1 i2 = 2 END IF - CALL SORMLQ(side, transt, mi, ni, nq-1, a(1,2), lda, tau, & + CALL SORMLQ(side, transt, mi, ni, nq-1, a(1,2), lda, tau, & c(i1,i2), ldc, work, lwork, iinfo) END IF END IF @@ -29525,7 +29640,7 @@ SUBROUTINE SORMBR(vect, side, trans, m, n, k, a, lda, tau, c, ldc, & RETURN END SUBROUTINE - SUBROUTINE SORMHR(side, trans, m, n, ilo, ihi, a, lda, tau, c, ldc, & + SUBROUTINE SORMHR(side, trans, m, n, ilo, ihi, a, lda, tau, c, ldc, & work, lwork, info) USE GALAHAD_KINDS CHARACTER :: side, trans @@ -29551,7 +29666,8 @@ SUBROUTINE SORMHR(side, trans, m, n, ilo, ihi, a, lda, tau, c, ldc, & END IF IF (.NOT. left .AND. .NOT. LSAME(side,'R')) THEN info = -1 - ELSE IF (.NOT. LSAME(trans,'N') .AND. .NOT. LSAME(trans,'T')) THEN + ELSE IF (.NOT. LSAME(trans,'N') .AND. .NOT. LSAME(trans,'T')) & + THEN info = -2 ELSE IF (m<0) THEN info = -3 @@ -29598,13 +29714,13 @@ SUBROUTINE SORMHR(side, trans, m, n, ilo, ihi, a, lda, tau, c, ldc, & i1 = 1 i2 = ilo + 1 END IF - CALL SORMQR(side, trans, mi, ni, nh, a(ilo+1,ilo), lda, tau(ilo), & + CALL SORMQR(side, trans, mi, ni, nh, a(ilo+1,ilo), lda, tau(ilo), & c(i1,i2), ldc, work, lwork, iinfo) work(1) = lwkopt RETURN END SUBROUTINE - SUBROUTINE SORML2(side, trans, m, n, k, a, lda, tau, c, ldc, work, & + SUBROUTINE SORML2(side, trans, m, n, k, a, lda, tau, c, ldc, work, & info) USE GALAHAD_KINDS CHARACTER :: side, trans @@ -29647,7 +29763,8 @@ SUBROUTINE SORML2(side, trans, m, n, k, a, lda, tau, c, ldc, work, & RETURN END IF IF (m==0 .OR. n==0 .OR. k==0) RETURN - IF ((left .AND. notran) .OR. (.NOT. left .AND. .NOT. notran)) THEN + IF ((left .AND. notran) .OR. (.NOT. left .AND. .NOT. notran)) & + THEN i1 = 1 i2 = k i3 = 1 @@ -29673,14 +29790,14 @@ SUBROUTINE SORML2(side, trans, m, n, k, a, lda, tau, c, ldc, work, & END IF aii = a(i, i) a(i, i) = one - CALL SLARF(side, mi, ni, a(i,i), lda, tau(i), c(ic,jc), ldc, & + CALL SLARF(side, mi, ni, a(i,i), lda, tau(i), c(ic,jc), ldc, & work) a(i, i) = aii END DO RETURN END SUBROUTINE - SUBROUTINE SORMLQ(side, trans, m, n, k, a, lda, tau, c, ldc, work, & + SUBROUTINE SORMLQ(side, trans, m, n, k, a, lda, tau, c, ldc, work, & lwork, info) USE GALAHAD_KINDS CHARACTER :: side, trans @@ -29690,7 +29807,7 @@ SUBROUTINE SORMLQ(side, trans, m, n, k, a, lda, tau, c, ldc, work, & PARAMETER (nbmax=64, ldt=nbmax+1, tsize=ldt*nbmax) LOGICAL :: left, lquery, notran CHARACTER :: transt - INTEGER(ip_) :: i, i1, i2, i3, ib, ic, iinfo, iwt, jc, ldwork, & + INTEGER(ip_) :: i, i1, i2, i3, ib, ic, iinfo, iwt, jc, ldwork, & lwkopt, mi, nb, nbmin, ni, nq, nw LOGICAL :: LSAME INTEGER(ip_) :: ILAENV @@ -29726,7 +29843,8 @@ SUBROUTINE SORMLQ(side, trans, m, n, k, a, lda, tau, c, ldc, work, & info = -12 END IF IF (info==0) THEN - nb = MIN(nbmax, ILAENV(1_ip_,'SORMLQ',side//trans,m,n,k,-1_ip_)) + nb = MIN(nbmax, ILAENV(1_ip_,'SORMLQ',side//trans,m,n,k, & + -1_ip_)) lwkopt = MAX(1, nw)*nb + tsize work(1) = lwkopt END IF @@ -29745,16 +29863,16 @@ SUBROUTINE SORMLQ(side, trans, m, n, k, a, lda, tau, c, ldc, work, & IF (nb>1 .AND. nb=k) THEN - CALL SORML2(side, trans, m, n, k, a, lda, tau, c, ldc, work, & + CALL SORML2(side, trans, m, n, k, a, lda, tau, c, ldc, work, & iinfo) ELSE iwt = 1 + nw*nb - IF ((left .AND. notran) .OR. (.NOT. left .AND. .NOT. notran)) & + IF ((left .AND. notran) .OR. (.NOT. left .AND. .NOT. notran)) & THEN i1 = 1 i2 = k @@ -29778,7 +29896,7 @@ SUBROUTINE SORMLQ(side, trans, m, n, k, a, lda, tau, c, ldc, work, & END IF DO i = i1, i2, i3 ib = MIN(nb, k-i+1) - CALL SLARFT('Forward', 'Rowwise', nq-i+1, ib, a(i,i), lda, & + CALL SLARFT('Forward', 'Rowwise', nq-i+1, ib, a(i,i), lda, & tau(i), work(iwt), ldt) IF (left) THEN mi = m - i + 1 @@ -29787,7 +29905,7 @@ SUBROUTINE SORMLQ(side, trans, m, n, k, a, lda, tau, c, ldc, work, & ni = n - i + 1 jc = i END IF - CALL SLARFB(side, transt, 'Forward', 'Rowwise', mi, ni, ib, & + CALL SLARFB(side, transt, 'Forward', 'Rowwise', mi, ni, ib, & a(i,i), lda, work(iwt), ldt, c(ic,jc), ldc, work, ldwork) END DO END IF @@ -29795,7 +29913,7 @@ SUBROUTINE SORMLQ(side, trans, m, n, k, a, lda, tau, c, ldc, work, & RETURN END SUBROUTINE - SUBROUTINE SORMQR(side, trans, m, n, k, a, lda, tau, c, ldc, work, & + SUBROUTINE SORMQR(side, trans, m, n, k, a, lda, tau, c, ldc, work, & lwork, info) USE GALAHAD_KINDS CHARACTER :: side, trans @@ -29804,7 +29922,7 @@ SUBROUTINE SORMQR(side, trans, m, n, k, a, lda, tau, c, ldc, work, & INTEGER(ip_) :: nbmax, ldt, tsize PARAMETER (nbmax=64, ldt=nbmax+1, tsize=ldt*nbmax) LOGICAL :: left, lquery, notran - INTEGER(ip_) :: i, i1, i2, i3, ib, ic, iinfo, iwt, jc, ldwork, & + INTEGER(ip_) :: i, i1, i2, i3, ib, ic, iinfo, iwt, jc, ldwork, & lwkopt, mi, nb, nbmin, ni, nq, nw LOGICAL :: LSAME INTEGER(ip_) :: ILAENV @@ -29840,7 +29958,8 @@ SUBROUTINE SORMQR(side, trans, m, n, k, a, lda, tau, c, ldc, work, & info = -12 END IF IF (info==0) THEN - nb = MIN(nbmax, ILAENV(1_ip_,'SORMQR',side//trans,m,n,k,-1_ip_)) + nb = MIN(nbmax, ILAENV(1_ip_,'SORMQR',side//trans,m,n,k, & + -1_ip_)) lwkopt = MAX(1, nw)*nb + tsize work(1) = lwkopt END IF @@ -29859,16 +29978,16 @@ SUBROUTINE SORMQR(side, trans, m, n, k, a, lda, tau, c, ldc, work, & IF (nb>1 .AND. nb=k) THEN - CALL SORM2R(side, trans, m, n, k, a, lda, tau, c, ldc, work, & + CALL SORM2R(side, trans, m, n, k, a, lda, tau, c, ldc, work, & iinfo) ELSE iwt = 1 + nw*nb - IF ((left .AND. .NOT. notran) .OR. (.NOT. left .AND. notran)) & + IF ((left .AND. .NOT. notran) .OR. (.NOT. left .AND. notran)) & THEN i1 = 1 i2 = k @@ -29887,7 +30006,7 @@ SUBROUTINE SORMQR(side, trans, m, n, k, a, lda, tau, c, ldc, work, & END IF DO i = i1, i2, i3 ib = MIN(nb, k-i+1) - CALL SLARFT('Forward', 'Columnwise', nq-i+1, ib, a(i,i), lda, & + CALL SLARFT('Forward', 'Columnwise', nq-i+1, ib, a(i,i), lda, & tau(i), work(iwt), ldt) IF (left) THEN mi = m - i + 1 @@ -29896,7 +30015,7 @@ SUBROUTINE SORMQR(side, trans, m, n, k, a, lda, tau, c, ldc, work, & ni = n - i + 1 jc = i END IF - CALL SLARFB(side, trans, 'Forward', 'Columnwise', mi, ni, ib, & + CALL SLARFB(side, trans, 'Forward', 'Columnwise', mi, ni, ib, & a(i,i), lda, work(iwt), ldt, c(ic,jc), ldc, work, ldwork) END DO END IF @@ -29904,7 +30023,7 @@ SUBROUTINE SORMQR(side, trans, m, n, k, a, lda, tau, c, ldc, work, & RETURN END SUBROUTINE - SUBROUTINE SORMR3(side, trans, m, n, k, l, a, lda, tau, c, ldc, & + SUBROUTINE SORMR3(side, trans, m, n, k, l, a, lda, tau, c, ldc, & work, info) USE GALAHAD_KINDS CHARACTER :: side, trans @@ -29934,7 +30053,7 @@ SUBROUTINE SORMR3(side, trans, m, n, k, l, a, lda, tau, c, ldc, & info = -4 ELSE IF (k<0 .OR. k>nq) THEN info = -5 - ELSE IF (l<0 .OR. (left .AND. (l>m)) .OR. (.NOT. left .AND. (l> & + ELSE IF (l<0 .OR. (left .AND. (l>m)) .OR. (.NOT. left .AND. (l> & n))) THEN info = -6 ELSE IF (ldanq) THEN info = -5 - ELSE IF (l<0 .OR. (left .AND. (l>m)) .OR. (.NOT. left .AND. (l> & + ELSE IF (l<0 .OR. (left .AND. (l>m)) .OR. (.NOT. left .AND. (l> & n))) THEN info = -6 ELSE IF (lda1 .AND. nb=k) THEN - CALL SORMR3(side, trans, m, n, k, l, a, lda, tau, c, ldc, work, & + CALL SORMR3(side, trans, m, n, k, l, a, lda, tau, c, ldc, work, & iinfo) ELSE iwt = 1 + nw*nb - IF ((left .AND. .NOT. notran) .OR. (.NOT. left .AND. notran)) & + IF ((left .AND. .NOT. notran) .OR. (.NOT. left .AND. notran)) & THEN i1 = 1 i2 = k @@ -30086,7 +30205,7 @@ SUBROUTINE SORMRZ(side, trans, m, n, k, l, a, lda, tau, c, ldc, & END IF DO i = i1, i2, i3 ib = MIN(nb, k-i+1) - CALL SLARZT('Backward', 'Rowwise', l, ib, a(i,ja), lda, & + CALL SLARZT('Backward', 'Rowwise', l, ib, a(i,ja), lda, & tau(i), work(iwt), ldt) IF (left) THEN mi = m - i + 1 @@ -30095,7 +30214,7 @@ SUBROUTINE SORMRZ(side, trans, m, n, k, l, a, lda, tau, c, ldc, & ni = n - i + 1 jc = i END IF - CALL SLARZB(side, transt, 'Backward', 'Rowwise', mi, ni, ib, & + CALL SLARZB(side, transt, 'Backward', 'Rowwise', mi, ni, ib, & l, a(i,ja), lda, work(iwt), ldt, c(ic,jc), ldc, work, ldwork) END DO END IF @@ -30143,7 +30262,7 @@ SUBROUTINE SPBTF2(uplo, n, kd, ab, ldab, info) kn = MIN(kd, n-j) IF (kn>0) THEN CALL SSCAL(kn, one/ajj, ab(kd,j+1), kld) - CALL SSYR('Upper', kn, -one, ab(kd,j+1), kld, ab(kd+1,j+1), & + CALL SSYR('Upper', kn, -one, ab(kd,j+1), kld, ab(kd+1,j+1), & kld) END IF END DO @@ -30156,7 +30275,8 @@ SUBROUTINE SPBTF2(uplo, n, kd, ab, ldab, info) kn = MIN(kd, n-j) IF (kn>0) THEN CALL SSCAL(kn, one/ajj, ab(2,j), 1_ip_) - CALL SSYR('Lower', kn, -one, ab(2,j), 1_ip_, ab(1,j+1), kld) + CALL SSYR('Lower', kn, -one, ab(2,j), 1_ip_, ab(1,j+1), & + kld) END IF END DO END IF @@ -30180,7 +30300,7 @@ SUBROUTINE SPBTRF(uplo, n, kd, ab, ldab, info) LOGICAL :: LSAME INTEGER(ip_) :: ILAENV EXTERNAL :: LSAME, ILAENV - EXTERNAL :: SGEMM, SPBTF2, SPOTF2, SSYRK, STRSM, & + EXTERNAL :: SGEMM, SPBTF2, SPOTF2, SSYRK, STRSM, & XERBLA INTRINSIC :: MIN info = 0 @@ -30220,9 +30340,10 @@ SUBROUTINE SPBTRF(uplo, n, kd, ab, ldab, info) i2 = MIN(kd-ib, n-i-ib+1) i3 = MIN(ib, n-i-kd+1) IF (i2>0) THEN - CALL STRSM('Left', 'Upper', 'Transpose', 'Non-unit', ib, & - i2, one, ab(kd+1,i), ldab-1, ab(kd+1-ib,i+ib), ldab-1) - CALL SSYRK('Upper', 'Transpose', i2, ib, -one, & + CALL STRSM('Left', 'Upper', 'Transpose', 'Non-unit', & + ib, i2, one, ab(kd+1,i), ldab-1, ab(kd+1-ib,i+ib), & + ldab-1) + CALL SSYRK('Upper', 'Transpose', i2, ib, -one, & ab(kd+1-ib,i+ib), ldab-1, one, ab(kd+1,i+ib), ldab-1) END IF IF (i3>0) THEN @@ -30231,12 +30352,12 @@ SUBROUTINE SPBTRF(uplo, n, kd, ab, ldab, info) work(ii, jj) = ab(ii-jj+1, jj+i+kd-1) END DO END DO - CALL STRSM('Left', 'Upper', 'Transpose', 'Non-unit', ib, & - i3, one, ab(kd+1,i), ldab-1, work, ldwork) - IF (i2>0) CALL SGEMM('Transpose', 'No Transpose', i2, & - i3, ib, -one, ab(kd+1-ib,i+ib), ldab-1, work, ldwork, & + CALL STRSM('Left', 'Upper', 'Transpose', 'Non-unit', & + ib, i3, one, ab(kd+1,i), ldab-1, work, ldwork) + IF (i2>0) CALL SGEMM('Transpose', 'No Transpose', i2, & + i3, ib, -one, ab(kd+1-ib,i+ib), ldab-1, work, ldwork, & one, ab(1+ib,i+kd), ldab-1) - CALL SSYRK('Upper', 'Transpose', i3, ib, -one, work, & + CALL SSYRK('Upper', 'Transpose', i3, ib, -one, work, & ldwork, one, ab(kd+1,i+kd), ldab-1) DO jj = 1, i3 DO ii = jj, ib @@ -30263,9 +30384,9 @@ SUBROUTINE SPBTRF(uplo, n, kd, ab, ldab, info) i2 = MIN(kd-ib, n-i-ib+1) i3 = MIN(ib, n-i-kd+1) IF (i2>0) THEN - CALL STRSM('Right', 'Lower', 'Transpose', 'Non-unit', & + CALL STRSM('Right', 'Lower', 'Transpose', 'Non-unit', & i2, ib, one, ab(1,i), ldab-1, ab(1+ib,i), ldab-1) - CALL SSYRK('Lower', 'No Transpose', i2, ib, -one, & + CALL SSYRK('Lower', 'No Transpose', i2, ib, -one, & ab(1+ib,i), ldab-1, one, ab(1,i+ib), ldab-1) END IF IF (i3>0) THEN @@ -30274,12 +30395,12 @@ SUBROUTINE SPBTRF(uplo, n, kd, ab, ldab, info) work(ii, jj) = ab(kd+1-jj+ii, jj+i-1) END DO END DO - CALL STRSM('Right', 'Lower', 'Transpose', 'Non-unit', & + CALL STRSM('Right', 'Lower', 'Transpose', 'Non-unit', & i3, ib, one, ab(1,i), ldab-1, work, ldwork) - IF (i2>0) CALL SGEMM('No transpose', 'Transpose', i3, & - i2, ib, -one, work, ldwork, ab(1+ib,i), ldab-1, one, & + IF (i2>0) CALL SGEMM('No transpose', 'Transpose', i3, & + i2, ib, -one, work, ldwork, ab(1+ib,i), ldab-1, one, & ab(1+kd-ib,i+ib), ldab-1) - CALL SSYRK('Lower', 'No Transpose', i3, ib, -one, work, & + CALL SSYRK('Lower', 'No Transpose', i3, ib, -one, work, & ldwork, one, ab(1,i+kd), ldab-1) DO jj = 1, ib DO ii = 1, MIN(jj, i3) @@ -30329,16 +30450,16 @@ SUBROUTINE SPBTRS(uplo, n, kd, nrhs, ab, ldab, b, ldb, info) IF (n==0 .OR. nrhs==0) RETURN IF (upper) THEN DO j = 1, nrhs - CALL STBSV('Upper', 'Transpose', 'Non-unit', n, kd, ab, ldab, & + CALL STBSV('Upper', 'Transpose', 'Non-unit', n, kd, ab, ldab, & b(1,j), 1_ip_) - CALL STBSV('Upper', 'No transpose', 'Non-unit', n, kd, ab, & + CALL STBSV('Upper', 'No transpose', 'Non-unit', n, kd, ab, & ldab, b(1,j), 1_ip_) END DO ELSE DO j = 1, nrhs - CALL STBSV('Lower', 'No transpose', 'Non-unit', n, kd, ab, & + CALL STBSV('Lower', 'No transpose', 'Non-unit', n, kd, ab, & ldab, b(1,j), 1_ip_) - CALL STBSV('Lower', 'Transpose', 'Non-unit', n, kd, ab, ldab, & + CALL STBSV('Lower', 'Transpose', 'Non-unit', n, kd, ab, ldab, & b(1,j), 1_ip_) END DO END IF @@ -30384,7 +30505,7 @@ SUBROUTINE SPOTF2(uplo, n, a, lda, info) ajj = SQRT(ajj) a(j, j) = ajj IF (j=nrhs) THEN CALL SPTTS2(n, nrhs, d, e, b, ldb) @@ -30761,15 +30885,15 @@ SUBROUTINE SSTEQR(compz, n, d, e, z, ldz, work, info) PARAMETER (zero=0.0_r4_, one=1.0_r4_, two=2.0_r4_, three=3.0_r4_) INTEGER(ip_) :: maxit PARAMETER (maxit=30) - INTEGER(ip_) :: i, icompz, ii, iscale, j, jtot, k, l, l1, lend, & + INTEGER(ip_) :: i, icompz, ii, iscale, j, jtot, k, l, l1, lend, & lendm1, lendp1, lendsv, lm1, lsv, m, mm, mm1, nm1, nmaxit - REAL(r4_) :: anorm, b, c, eps, eps2, f, g, p, r, rt1, rt2, s, & + REAL(r4_) :: anorm, b, c, eps, eps2, f, g, p, r, rt1, rt2, s, & safmax, safmin, ssfmax, ssfmin, tst LOGICAL :: LSAME REAL(r4_) :: SLAMCH, SLANST, SLAPY2 EXTERNAL :: LSAME, SLAMCH, SLANST, SLAPY2 - EXTERNAL :: SLAE2, SLAEV2, SLARTG, SLASCL, SLASET, & - SLASR, SLASRT, SSWAP, XERBLA + EXTERNAL :: SLAE2, SLAEV2, SLARTG, SLASCL, & + SLASET, SLASR, SLASRT, SSWAP, XERBLA INTRINSIC :: ABS, MAX, SIGN, SQRT info = 0 IF (LSAME(compz,'N')) THEN @@ -30834,15 +30958,15 @@ SUBROUTINE SSTEQR(compz, n, d, e, z, ldz, work, info) IF (anorm==zero) GO TO 10 IF (anorm>ssfmax) THEN iscale = 1 - CALL SLASCL('G', 0_ip_, 0_ip_, anorm, ssfmax, lend-l+1, 1_ip_, & + CALL SLASCL('G', 0_ip_, 0_ip_, anorm, ssfmax, lend-l+1, 1_ip_, & d(l), n, info) - CALL SLASCL('G', 0_ip_, 0_ip_, anorm, ssfmax, lend-l, 1_ip_, & + CALL SLASCL('G', 0_ip_, 0_ip_, anorm, ssfmax, lend-l, 1_ip_, & e(l), n, info) ELSE IF (anorm0) THEN mm = m - l + 1 - CALL SLASR('R', 'V', 'B', n, mm, work(l), work(n-1+l), z(1,l), & - ldz) + CALL SLASR('R', 'V', 'B', n, mm, work(l), work(n-1+l), z(1, & + l), ldz) END IF d(l) = d(l) - p e(l) = g @@ -30936,7 +31060,7 @@ SUBROUTINE SSTEQR(compz, n, d, e, z, ldz, work, info) CALL SLAEV2(d(l-1), e(l-1), d(l), rt1, rt2, c, s) work(m) = c work(n-1+m) = s - CALL SLASR('R', 'V', 'F', n, 2_ip_, work(m), work(n-1+m), & + CALL SLASR('R', 'V', 'F', n, 2_ip_, work(m), work(n-1+m), & z(1,l-1), ldz) ELSE CALL SLAE2(d(l-1), e(l-1), d(l), rt1, rt2) @@ -30974,8 +31098,8 @@ SUBROUTINE SSTEQR(compz, n, d, e, z, ldz, work, info) END DO IF (icompz>0) THEN mm = l - m + 1 - CALL SLASR('R', 'V', 'F', n, mm, work(m), work(n-1+m), z(1,m), & - ldz) + CALL SLASR('R', 'V', 'F', n, mm, work(m), work(n-1+m), z(1, & + m), ldz) END IF d(l) = d(l) - p e(lm1) = g @@ -30988,15 +31112,15 @@ SUBROUTINE SSTEQR(compz, n, d, e, z, ldz, work, info) END IF 140 CONTINUE IF (iscale==1) THEN - CALL SLASCL('G', 0_ip_, 0_ip_, ssfmax, anorm, lendsv-lsv+1, & + CALL SLASCL('G', 0_ip_, 0_ip_, ssfmax, anorm, lendsv-lsv+1, & 1_ip_, d(lsv), n, info) - CALL SLASCL('G', 0_ip_, 0_ip_, ssfmax, anorm, lendsv-lsv, 1_ip_, & - e(lsv), n, info) + CALL SLASCL('G', 0_ip_, 0_ip_, ssfmax, anorm, lendsv-lsv, & + 1_ip_, e(lsv), n, info) ELSE IF (iscale==2) THEN - CALL SLASCL('G', 0_ip_, 0_ip_, ssfmin, anorm, lendsv-lsv+1, & + CALL SLASCL('G', 0_ip_, 0_ip_, ssfmin, anorm, lendsv-lsv+1, & 1_ip_, d(lsv), n, info) - CALL SLASCL('G', 0_ip_, 0_ip_, ssfmin, anorm, lendsv-lsv, 1_ip_, & - e(lsv), n, info) + CALL SLASCL('G', 0_ip_, 0_ip_, ssfmin, anorm, lendsv-lsv, & + 1_ip_, e(lsv), n, info) END IF IF (jtotssfmax) THEN iscale = 1 - CALL SLASCL('G', 0_ip_, 0_ip_, anorm, ssfmax, lend-l+1, 1_ip_, & + CALL SLASCL('G', 0_ip_, 0_ip_, anorm, ssfmax, lend-l+1, 1_ip_, & d(l), n, info) - CALL SLASCL('G', 0_ip_, 0_ip_, anorm, ssfmax, lend-l, 1_ip_, & + CALL SLASCL('G', 0_ip_, 0_ip_, anorm, ssfmax, lend-l, 1_ip_, & e(l), n, info) ELSE IF (anorm1 .AND. nbnb) THEN - CALL SLASYF(uplo, k, nb, kb, a, lda, ipiv, work, ldwork, & + CALL SLASYF(uplo, k, nb, kb, a, lda, ipiv, work, ldwork, & iinfo) ELSE CALL SSYTF2(uplo, k, a, lda, ipiv, iinfo) @@ -32046,7 +32174,7 @@ SUBROUTINE SSYTRF(uplo, n, a, lda, ipiv, work, lwork, info) 20 CONTINUE IF (k>n) GO TO 40 IF (k<=n-nb) THEN - CALL SLASYF(uplo, n-k+1, nb, kb, a(k,k), lda, ipiv(k), work, & + CALL SLASYF(uplo, n-k+1, nb, kb, a(k,k), lda, ipiv(k), work, & ldwork, iinfo) ELSE CALL SSYTF2(uplo, n-k+1, a(k,k), lda, ipiv(k), iinfo) @@ -32108,16 +32236,16 @@ SUBROUTINE SSYTRS(uplo, n, nrhs, a, lda, ipiv, b, ldb, info) IF (ipiv(k)>0) THEN kp = ipiv(k) IF (kp/=k) CALL SSWAP(nrhs, b(k,1), ldb, b(kp,1), ldb) - CALL SGER(k-1, nrhs, -one, a(1,k), 1_ip_, b(k,1), ldb, b(1,1), & - ldb) + CALL SGER(k-1, nrhs, -one, a(1,k), 1_ip_, b(k,1), ldb, b(1, & + 1), ldb) CALL SSCAL(nrhs, one/a(k,k), b(k,1), ldb) k = k - 1 ELSE kp = -ipiv(k) IF (kp/=k-1) CALL SSWAP(nrhs, b(k-1,1), ldb, b(kp,1), ldb) - CALL SGER(k-2, nrhs, -one, a(1,k), 1_ip_, b(k,1), ldb, b(1,1), & - ldb) - CALL SGER(k-2, nrhs, -one, a(1,k-1), 1_ip_, b(k-1,1), ldb, & + CALL SGER(k-2, nrhs, -one, a(1,k), 1_ip_, b(k,1), ldb, b(1, & + 1), ldb) + CALL SGER(k-2, nrhs, -one, a(1,k-1), 1_ip_, b(k-1,1), ldb, & b(1,1), ldb) akm1k = a(k-1, k) akm1 = a(k-1, k-1)/akm1k @@ -32137,15 +32265,15 @@ SUBROUTINE SSYTRS(uplo, n, nrhs, a, lda, ipiv, b, ldb, info) 40 CONTINUE IF (k>n) GO TO 50 IF (ipiv(k)>0) THEN - CALL SGEMV('Transpose', k-1, nrhs, -one, b, ldb, a(1,k), & + CALL SGEMV('Transpose', k-1, nrhs, -one, b, ldb, a(1,k), & 1_ip_, one, b(k,1), ldb) kp = ipiv(k) IF (kp/=k) CALL SSWAP(nrhs, b(k,1), ldb, b(kp,1), ldb) k = k + 1 ELSE - CALL SGEMV('Transpose', k-1, nrhs, -one, b, ldb, a(1,k), & + CALL SGEMV('Transpose', k-1, nrhs, -one, b, ldb, a(1,k), & 1_ip_, one, b(k,1), ldb) - CALL SGEMV('Transpose', k-1, nrhs, -one, b, ldb, a(1,k+1), & + CALL SGEMV('Transpose', k-1, nrhs, -one, b, ldb, a(1,k+1), & 1_ip_, one, b(k+1,1), ldb) kp = -ipiv(k) IF (kp/=k) CALL SSWAP(nrhs, b(k,1), ldb, b(kp,1), ldb) @@ -32160,7 +32288,7 @@ SUBROUTINE SSYTRS(uplo, n, nrhs, a, lda, ipiv, b, ldb, info) IF (ipiv(k)>0) THEN kp = ipiv(k) IF (kp/=k) CALL SSWAP(nrhs, b(k,1), ldb, b(kp,1), ldb) - IF (k0) THEN - IF (k=3) THEN IF (t(here-1,here-2)/=zero) nbnext = 2 END IF - CALL SLAEXC(wantq, n, t, ldt, q, ldq, here-nbnext, nbnext, & + CALL SLAEXC(wantq, n, t, ldt, q, ldq, here-nbnext, nbnext, & nbf, work, info) IF (info/=0) THEN ilst = here @@ -32339,20 +32467,20 @@ SUBROUTINE STREXC(compq, n, t, ldt, q, ldq, ifst, ilst, work, info) IF (here>=3) THEN IF (t(here-1,here-2)/=zero) nbnext = 2 END IF - CALL SLAEXC(wantq, n, t, ldt, q, ldq, here-nbnext, nbnext, & + CALL SLAEXC(wantq, n, t, ldt, q, ldq, here-nbnext, nbnext, & 1_ip_, work, info) IF (info/=0) THEN ilst = here RETURN END IF IF (nbnext==1) THEN - CALL SLAEXC(wantq, n, t, ldt, q, ldq, here, nbnext, 1_ip_, & + CALL SLAEXC(wantq, n, t, ldt, q, ldq, here, nbnext, 1_ip_, & work, info) here = here - 1 ELSE IF (t(here,here-1)==zero) nbnext = 1 IF (nbnext==2) THEN - CALL SLAEXC(wantq, n, t, ldt, q, ldq, here-1, 2_ip_, & + CALL SLAEXC(wantq, n, t, ldt, q, ldq, here-1, 2_ip_, & 1_ip_, work, info) IF (info/=0) THEN ilst = here @@ -32360,9 +32488,9 @@ SUBROUTINE STREXC(compq, n, t, ldt, q, ldq, ifst, ilst, work, info) END IF here = here - 2 ELSE - CALL SLAEXC(wantq, n, t, ldt, q, ldq, here, 1_ip_, 1_ip_, & + CALL SLAEXC(wantq, n, t, ldt, q, ldq, here, 1_ip_, 1_ip_, & work, info) - CALL SLAEXC(wantq, n, t, ldt, q, ldq, here-1, 1_ip_, & + CALL SLAEXC(wantq, n, t, ldt, q, ldq, here-1, 1_ip_, & 1_ip_, work, info) here = here - 2 END IF @@ -32390,7 +32518,7 @@ SUBROUTINE STRTRS(uplo, trans, diag, n, nrhs, a, lda, b, ldb, info) nounit = LSAME(diag, 'N') IF (.NOT. LSAME(uplo,'U') .AND. .NOT. LSAME(uplo,'L')) THEN info = -1 - ELSE IF (.NOT. LSAME(trans,'N') .AND. .NOT. LSAME(trans,'T') & + ELSE IF (.NOT. LSAME(trans,'N') .AND. .NOT. LSAME(trans,'T') & .AND. .NOT. LSAME(trans,'C')) THEN info = -2 ELSE IF (.NOT. nounit .AND. .NOT. LSAME(diag,'U')) THEN @@ -32415,7 +32543,7 @@ SUBROUTINE STRTRS(uplo, trans, diag, n, nrhs, a, lda, b, ldb, info) END DO END IF info = 0 - CALL STRSM('Left', uplo, trans, diag, n, nrhs, one, a, lda, b, & + CALL STRSM('Left', uplo, trans, diag, n, nrhs, one, a, lda, b, & ldb) RETURN END SUBROUTINE @@ -32427,7 +32555,7 @@ SUBROUTINE STZRZF(m, n, a, lda, tau, work, lwork, info) REAL(r4_) :: zero PARAMETER (zero=0.0_r4_) LOGICAL :: lquery - INTEGER(ip_) :: i, ib, iws, ki, kk, ldwork, lwkmin, lwkopt, m1, & + INTEGER(ip_) :: i, ib, iws, ki, kk, ldwork, lwkmin, lwkopt, m1, & mu, nb, nbmin, nx EXTERNAL :: XERBLA, SLARZB, SLARZT, SLATRZ INTRINSIC :: MAX, MIN @@ -32480,7 +32608,7 @@ SUBROUTINE STZRZF(m, n, a, lda, tau, work, lwork, info) iws = ldwork*nb IF (lwork1) THEN - CALL SLARZT('Backward', 'Rowwise', n-m, ib, a(i,m1), lda, & + CALL SLARZT('Backward', 'Rowwise', n-m, ib, a(i,m1), lda, & tau(i), work, ldwork) - CALL SLARZB('Right', 'No transpose', 'Backward', 'Rowwise', & - i-1, n-i+1, ib, n-m, a(i,m1), lda, work, ldwork, a(1,i), & + CALL SLARZB('Right', 'No transpose', 'Backward', 'Rowwise', & + i-1, n-i+1, ib, n-m, a(i,m1), lda, work, ldwork, a(1,i), & lda, work(ib+1), ldwork) END IF END DO @@ -32581,21 +32709,21 @@ SUBROUTINE ZLARF(side, m, n, v, incv, tau, c, ldc, work) END IF IF (applyleft) THEN IF (lastv>0) THEN - CALL ZGEMV('Conjugate transpose', lastv, lastc, one, c, ldc, & + CALL ZGEMV('Conjugate transpose', lastv, lastc, one, c, ldc, & v, incv, zero, work, 1_ip_) CALL ZGERC(lastv, lastc, -tau, v, incv, work, 1_ip_, c, ldc) END IF ELSE IF (lastv>0) THEN - CALL ZGEMV('No transpose', lastc, lastv, one, c, ldc, v, incv, & - zero, work, 1_ip_) + CALL ZGEMV('No transpose', lastc, lastv, one, c, ldc, v, & + incv, zero, work, 1_ip_) CALL ZGERC(lastc, lastv, -tau, work, 1_ip_, v, incv, c, ldc) END IF END IF RETURN END SUBROUTINE - SUBROUTINE ZLARFB(side, trans, direct, storev, m, n, k, v, ldv, t, & + SUBROUTINE ZLARFB(side, trans, direct, storev, m, n, k, v, ldv, t, & ldt, c, ldc, work, ldwork) USE GALAHAD_KINDS CHARACTER :: direct, side, storev, trans @@ -32622,19 +32750,20 @@ SUBROUTINE ZLARFB(side, trans, direct, storev, m, n, k, v, ldv, t, & CALL ZCOPY(n, c(j,1), ldc, work(1,j), 1_ip_) CALL ZLACGV(n, work(1,j), 1_ip_) END DO - CALL ZTRMM('Right', 'Lower', 'No transpose', 'Unit', n, k, & + CALL ZTRMM('Right', 'Lower', 'No transpose', 'Unit', n, k, & one, v, ldv, work, ldwork) IF (m>k) THEN - CALL ZGEMM('Conjugate transpose', 'No transpose', n, k, & - m-k, one, c(k+1,1), ldc, v(k+1,1), ldv, one, work, ldwork) + CALL ZGEMM('Conjugate transpose', 'No transpose', n, k, & + m-k, one, c(k+1,1), ldc, v(k+1,1), ldv, one, work, & + ldwork) END IF - CALL ZTRMM('Right', 'Upper', transt, 'Non-unit', n, k, one, & + CALL ZTRMM('Right', 'Upper', transt, 'Non-unit', n, k, one, & t, ldt, work, ldwork) IF (m>k) THEN - CALL ZGEMM('No transpose', 'Conjugate transpose', m-k, n, & + CALL ZGEMM('No transpose', 'Conjugate transpose', m-k, n, & k, -one, v(k+1,1), ldv, work, ldwork, one, c(k+1,1), ldc) END IF - CALL ZTRMM('Right', 'Lower', 'Conjugate transpose', 'Unit', & + CALL ZTRMM('Right', 'Lower', 'Conjugate transpose', 'Unit', & n, k, one, v, ldv, work, ldwork) DO j = 1, k DO i = 1, n @@ -32645,19 +32774,19 @@ SUBROUTINE ZLARFB(side, trans, direct, storev, m, n, k, v, ldv, t, & DO j = 1, k CALL ZCOPY(m, c(1,j), 1_ip_, work(1,j), 1_ip_) END DO - CALL ZTRMM('Right', 'Lower', 'No transpose', 'Unit', m, k, & + CALL ZTRMM('Right', 'Lower', 'No transpose', 'Unit', m, k, & one, v, ldv, work, ldwork) IF (n>k) THEN - CALL ZGEMM('No transpose', 'No transpose', m, k, n-k, one, & - c(1,k+1), ldc, v(k+1,1), ldv, one, work, ldwork) + CALL ZGEMM('No transpose', 'No transpose', m, k, n-k, & + one, c(1,k+1), ldc, v(k+1,1), ldv, one, work, ldwork) END IF - CALL ZTRMM('Right', 'Upper', trans, 'Non-unit', m, k, one, & + CALL ZTRMM('Right', 'Upper', trans, 'Non-unit', m, k, one, & t, ldt, work, ldwork) IF (n>k) THEN - CALL ZGEMM('No transpose', 'Conjugate transpose', m, n-k, & + CALL ZGEMM('No transpose', 'Conjugate transpose', m, n-k, & k, -one, work, ldwork, v(k+1,1), ldv, one, c(1,k+1), ldc) END IF - CALL ZTRMM('Right', 'Lower', 'Conjugate transpose', 'Unit', & + CALL ZTRMM('Right', 'Lower', 'Conjugate transpose', 'Unit', & m, k, one, v, ldv, work, ldwork) DO j = 1, k DO i = 1, m @@ -32671,19 +32800,19 @@ SUBROUTINE ZLARFB(side, trans, direct, storev, m, n, k, v, ldv, t, & CALL ZCOPY(n, c(m-k+j,1), ldc, work(1,j), 1_ip_) CALL ZLACGV(n, work(1,j), 1_ip_) END DO - CALL ZTRMM('Right', 'Upper', 'No transpose', 'Unit', n, k, & + CALL ZTRMM('Right', 'Upper', 'No transpose', 'Unit', n, k, & one, v(m-k+1,1), ldv, work, ldwork) IF (m>k) THEN - CALL ZGEMM('Conjugate transpose', 'No transpose', n, k, & + CALL ZGEMM('Conjugate transpose', 'No transpose', n, k, & m-k, one, c, ldc, v, ldv, one, work, ldwork) END IF - CALL ZTRMM('Right', 'Lower', transt, 'Non-unit', n, k, one, & + CALL ZTRMM('Right', 'Lower', transt, 'Non-unit', n, k, one, & t, ldt, work, ldwork) IF (m>k) THEN - CALL ZGEMM('No transpose', 'Conjugate transpose', m-k, n, & + CALL ZGEMM('No transpose', 'Conjugate transpose', m-k, n, & k, -one, v, ldv, work, ldwork, one, c, ldc) END IF - CALL ZTRMM('Right', 'Upper', 'Conjugate transpose', 'Unit', & + CALL ZTRMM('Right', 'Upper', 'Conjugate transpose', 'Unit', & n, k, one, v(m-k+1,1), ldv, work, ldwork) DO j = 1, k DO i = 1, n @@ -32694,19 +32823,19 @@ SUBROUTINE ZLARFB(side, trans, direct, storev, m, n, k, v, ldv, t, & DO j = 1, k CALL ZCOPY(m, c(1,n-k+j), 1_ip_, work(1,j), 1_ip_) END DO - CALL ZTRMM('Right', 'Upper', 'No transpose', 'Unit', m, k, & + CALL ZTRMM('Right', 'Upper', 'No transpose', 'Unit', m, k, & one, v(n-k+1,1), ldv, work, ldwork) IF (n>k) THEN - CALL ZGEMM('No transpose', 'No transpose', m, k, n-k, one, & - c, ldc, v, ldv, one, work, ldwork) + CALL ZGEMM('No transpose', 'No transpose', m, k, n-k, & + one, c, ldc, v, ldv, one, work, ldwork) END IF - CALL ZTRMM('Right', 'Lower', trans, 'Non-unit', m, k, one, & + CALL ZTRMM('Right', 'Lower', trans, 'Non-unit', m, k, one, & t, ldt, work, ldwork) IF (n>k) THEN - CALL ZGEMM('No transpose', 'Conjugate transpose', m, n-k, & + CALL ZGEMM('No transpose', 'Conjugate transpose', m, n-k, & k, -one, work, ldwork, v, ldv, one, c, ldc) END IF - CALL ZTRMM('Right', 'Upper', 'Conjugate transpose', 'Unit', & + CALL ZTRMM('Right', 'Upper', 'Conjugate transpose', 'Unit', & m, k, one, v(n-k+1,1), ldv, work, ldwork) DO j = 1, k DO i = 1, m @@ -32722,21 +32851,21 @@ SUBROUTINE ZLARFB(side, trans, direct, storev, m, n, k, v, ldv, t, & CALL ZCOPY(n, c(j,1), ldc, work(1,j), 1_ip_) CALL ZLACGV(n, work(1,j), 1_ip_) END DO - CALL ZTRMM('Right', 'Upper', 'Conjugate transpose', 'Unit', & + CALL ZTRMM('Right', 'Upper', 'Conjugate transpose', 'Unit', & n, k, one, v, ldv, work, ldwork) IF (m>k) THEN - CALL ZGEMM('Conjugate transpose', 'Conjugate transpose', & - n, k, m-k, one, c(k+1,1), ldc, v(1,k+1), ldv, one, work, & + CALL ZGEMM('Conjugate transpose', 'Conjugate transpose', & + n, k, m-k, one, c(k+1,1), ldc, v(1,k+1), ldv, one, work,& ldwork) END IF - CALL ZTRMM('Right', 'Upper', transt, 'Non-unit', n, k, one, & + CALL ZTRMM('Right', 'Upper', transt, 'Non-unit', n, k, one, & t, ldt, work, ldwork) IF (m>k) THEN - CALL ZGEMM('Conjugate transpose', 'Conjugate transpose', & - m-k, n, k, -one, v(1,k+1), ldv, work, ldwork, one, c(k+1, & + CALL ZGEMM('Conjugate transpose', 'Conjugate transpose', & + m-k, n, k, -one, v(1,k+1), ldv, work, ldwork, one, c(k+1,& 1), ldc) END IF - CALL ZTRMM('Right', 'Upper', 'No transpose', 'Unit', n, k, & + CALL ZTRMM('Right', 'Upper', 'No transpose', 'Unit', n, k, & one, v, ldv, work, ldwork) DO j = 1, k DO i = 1, n @@ -32747,19 +32876,20 @@ SUBROUTINE ZLARFB(side, trans, direct, storev, m, n, k, v, ldv, t, & DO j = 1, k CALL ZCOPY(m, c(1,j), 1_ip_, work(1,j), 1_ip_) END DO - CALL ZTRMM('Right', 'Upper', 'Conjugate transpose', 'Unit', & + CALL ZTRMM('Right', 'Upper', 'Conjugate transpose', 'Unit', & m, k, one, v, ldv, work, ldwork) IF (n>k) THEN - CALL ZGEMM('No transpose', 'Conjugate transpose', m, k, & - n-k, one, c(1,k+1), ldc, v(1,k+1), ldv, one, work, ldwork) + CALL ZGEMM('No transpose', 'Conjugate transpose', m, k, & + n-k, one, c(1,k+1), ldc, v(1,k+1), ldv, one, work, & + ldwork) END IF - CALL ZTRMM('Right', 'Upper', trans, 'Non-unit', m, k, one, & + CALL ZTRMM('Right', 'Upper', trans, 'Non-unit', m, k, one, & t, ldt, work, ldwork) IF (n>k) THEN - CALL ZGEMM('No transpose', 'No transpose', m, n-k, k, & + CALL ZGEMM('No transpose', 'No transpose', m, n-k, k, & -one, work, ldwork, v(1,k+1), ldv, one, c(1,k+1), ldc) END IF - CALL ZTRMM('Right', 'Upper', 'No transpose', 'Unit', m, k, & + CALL ZTRMM('Right', 'Upper', 'No transpose', 'Unit', m, k, & one, v, ldv, work, ldwork) DO j = 1, k DO i = 1, m @@ -32773,19 +32903,19 @@ SUBROUTINE ZLARFB(side, trans, direct, storev, m, n, k, v, ldv, t, & CALL ZCOPY(n, c(m-k+j,1), ldc, work(1,j), 1_ip_) CALL ZLACGV(n, work(1,j), 1_ip_) END DO - CALL ZTRMM('Right', 'Lower', 'Conjugate transpose', 'Unit', & + CALL ZTRMM('Right', 'Lower', 'Conjugate transpose', 'Unit', & n, k, one, v(1,m-k+1), ldv, work, ldwork) IF (m>k) THEN - CALL ZGEMM('Conjugate transpose', 'Conjugate transpose', & + CALL ZGEMM('Conjugate transpose', 'Conjugate transpose', & n, k, m-k, one, c, ldc, v, ldv, one, work, ldwork) END IF - CALL ZTRMM('Right', 'Lower', transt, 'Non-unit', n, k, one, & + CALL ZTRMM('Right', 'Lower', transt, 'Non-unit', n, k, one, & t, ldt, work, ldwork) IF (m>k) THEN - CALL ZGEMM('Conjugate transpose', 'Conjugate transpose', & + CALL ZGEMM('Conjugate transpose', 'Conjugate transpose', & m-k, n, k, -one, v, ldv, work, ldwork, one, c, ldc) END IF - CALL ZTRMM('Right', 'Lower', 'No transpose', 'Unit', n, k, & + CALL ZTRMM('Right', 'Lower', 'No transpose', 'Unit', n, k, & one, v(1,m-k+1), ldv, work, ldwork) DO j = 1, k DO i = 1, n @@ -32796,19 +32926,19 @@ SUBROUTINE ZLARFB(side, trans, direct, storev, m, n, k, v, ldv, t, & DO j = 1, k CALL ZCOPY(m, c(1,n-k+j), 1_ip_, work(1,j), 1_ip_) END DO - CALL ZTRMM('Right', 'Lower', 'Conjugate transpose', 'Unit', & + CALL ZTRMM('Right', 'Lower', 'Conjugate transpose', 'Unit', & m, k, one, v(1,n-k+1), ldv, work, ldwork) IF (n>k) THEN - CALL ZGEMM('No transpose', 'Conjugate transpose', m, k, & + CALL ZGEMM('No transpose', 'Conjugate transpose', m, k, & n-k, one, c, ldc, v, ldv, one, work, ldwork) END IF - CALL ZTRMM('Right', 'Lower', trans, 'Non-unit', m, k, one, & + CALL ZTRMM('Right', 'Lower', trans, 'Non-unit', m, k, one, & t, ldt, work, ldwork) IF (n>k) THEN - CALL ZGEMM('No transpose', 'No transpose', m, n-k, k, & + CALL ZGEMM('No transpose', 'No transpose', m, n-k, k, & -one, work, ldwork, v, ldv, one, c, ldc) END IF - CALL ZTRMM('Right', 'Lower', 'No transpose', 'Unit', m, k, & + CALL ZTRMM('Right', 'Lower', 'No transpose', 'Unit', m, k, & one, v(1,n-k+1), ldv, work, ldwork) DO j = 1, k DO i = 1, m @@ -32901,7 +33031,7 @@ SUBROUTINE ZLARFT(direct, storev, n, k, v, ldv, tau, t, ldt) t(j, i) = -tau(i)*CONJG(v(i,j)) END DO j = MIN(lastv, prevlastv) - CALL ZGEMV('Conjugate transpose', j-i, i-1, -tau(i), & + CALL ZGEMV('Conjugate transpose', j-i, i-1, -tau(i), & v(i+1,1), ldv, v(i+1,i), 1_ip_, one, t(1,i), 1_ip_) ELSE DO lastv = n, i + 1, -1_ip_ @@ -32911,11 +33041,11 @@ SUBROUTINE ZLARFT(direct, storev, n, k, v, ldv, tau, t, ldt) t(j, i) = -tau(i)*v(j, i) END DO j = MIN(lastv, prevlastv) - CALL ZGEMM('N', 'C', i-1, 1_ip_, j-i, -tau(i), v(1,i+1), & + CALL ZGEMM('N', 'C', i-1, 1_ip_, j-i, -tau(i), v(1,i+1), & ldv, v(i,i+1), ldv, one, t(1,i), ldt) END IF - CALL ZTRMV('Upper', 'No transpose', 'Non-unit', i-1, t, ldt, & - t(1,i), 1_ip_) + CALL ZTRMV('Upper', 'No transpose', 'Non-unit', i-1, t, & + ldt, t(1,i), 1_ip_) t(i, i) = tau(i) IF (i>1) THEN prevlastv = MAX(prevlastv, lastv) @@ -32941,8 +33071,9 @@ SUBROUTINE ZLARFT(direct, storev, n, k, v, ldv, tau, t, ldt) t(j, i) = -tau(i)*CONJG(v(n-k+i,j)) END DO j = MAX(lastv, prevlastv) - CALL ZGEMV('Conjugate transpose', n-k+i-j, k-i, -tau(i), & - v(j,i+1), ldv, v(j,i), 1_ip_, one, t(i+1,i), 1_ip_) + CALL ZGEMV('Conjugate transpose', n-k+i-j, k-i, & + -tau(i), v(j,i+1), ldv, v(j,i), 1_ip_, one, t(i+1,i), & + 1_ip_) ELSE DO lastv = 1, i - 1 IF (v(i,lastv)/=zero) EXIT @@ -32951,10 +33082,10 @@ SUBROUTINE ZLARFT(direct, storev, n, k, v, ldv, tau, t, ldt) t(j, i) = -tau(i)*v(j, n-k+i) END DO j = MAX(lastv, prevlastv) - CALL ZGEMM('N', 'C', k-i, 1_ip_, n-k+i-j, -tau(i), & + CALL ZGEMM('N', 'C', k-i, 1_ip_, n-k+i-j, -tau(i), & v(i+1,j), ldv, v(i,j), ldv, one, t(i+1,i), ldt) END IF - CALL ZTRMV('Lower', 'No transpose', 'Non-unit', k-i, & + CALL ZTRMV('Lower', 'No transpose', 'Non-unit', k-i, & t(i+1,i+1), ldt, t(i+1,i), 1_ip_) IF (i>1) THEN prevlastv = MIN(prevlastv, lastv) diff --git a/src/lapack/rebuild.F90 b/src/lapack/rebuild.F90 index 5290a06b3c..914081742c 100644 --- a/src/lapack/rebuild.F90 +++ b/src/lapack/rebuild.F90 @@ -12,6 +12,7 @@ PROGRAM BUILD INTEGER, PARAMETER :: hout = 25 ! for generated preprocessor header INTEGER, PARAMETER :: scratch = 26 ! for intermediate workings INTEGER, PARAMETER :: max_line = 400 ! maximum line length + INTEGER, PARAMETER :: max_chars = 75 ! maximum # characters in a line CHARACTER ( len = 80 ) :: new_line CHARACTER ( len = max_line ) :: in_line, line CHARACTER ( len = 8 ) :: date @@ -85,7 +86,8 @@ PROGRAM BUILD IF ( l + 9 <= l_end ) THEN IF ( new_line( l : l + 9 ) == 'L FUNCTION' .OR. & - new_line( l : l + 9 ) == 'N FUNCTION' ) THEN + new_line( l : l + 9 ) == 'N FUNCTION' .OR. & + new_line( l : l + 9 ) == 'R FUNCTION' ) THEN DO i = l + 10, l_end IF ( new_line( i + 1 : i + 1 ) == '(' ) EXIT END DO @@ -549,10 +551,10 @@ PROGRAM BUILD ! corresponds to an external statement) IF ( external_line ) THEN - line_max = 76 - nz - 16 + line_max = max_chars - nz - 16 IF ( line( l_end : l_end ) /= '&' ) external_line = .FALSE. ELSE - line_max = 76 - nz + line_max = max_chars - nz END IF DO @@ -561,8 +563,8 @@ PROGRAM BUILD WRITE( out, "( A, A )" ) REPEAT( ' ', nz ), TRIM( line ) EXIT -! the line has more than 76 characters, split it into two appropriate-sized -! chunks, and repeat +! the line has more than max_chars characters, split it into two +! appropriate-sized chunks, and repeat ELSE DO k = line_max, 1, - 1 @@ -572,11 +574,11 @@ PROGRAM BUILD IF ( line( k : k ) == ',' ) THEN WRITE( out, "( A, A, A, '&' )" ) & REPEAT( ' ', nz ), TRIM( line( 1 : k ) ), & - REPEAT( ' ', 79 - nz - k ) + REPEAT( ' ', max_chars + 2 - nz - k ) ELSE - WRITE( out, "( A, A, A, ' &' )" ) & + WRITE( out, "( A, A, A, '&' )" ) & REPEAT( ' ', nz ), TRIM( line( 1 : k ) ), & - REPEAT( ' ', 79 - nz - k ) + REPEAT( ' ', max_chars + 2 - nz - k ) END IF nz = MIN( nz + 2, nz2 ) EXIT diff --git a/src/lms/lms.F90 b/src/lms/lms.F90 index 8711e33365..0e7a92937f 100644 --- a/src/lms/lms.F90 +++ b/src/lms/lms.F90 @@ -325,7 +325,7 @@ SUBROUTINE LMS_setup( n, data, control, inform ) SELECT CASE( control%method ) CASE ( 2 ) method = 'SR1 ' - nb = LAENV( 1_ip_, 'DSYTRF', 'L', data%len_c, & + nb = LAENV( 1_ip_, 'DSYTRF', 'L', data%len_c, & - 1_ip_, - 1_ip_, - 1_ip_ ) data%lwork = data%len_c * nb len2_qp = 1 ; len2_qp_perm = 1 @@ -334,7 +334,7 @@ SUBROUTINE LMS_setup( n, data, control, inform ) CASE ( 4 ) method = 'ISBFGS' data%len_c = 2 * data%m ; len2_qp_perm = 1 - nb = LAENV( 1_ip_, 'DSYTRF', 'L', data%len_c, & + nb = LAENV( 1_ip_, 'DSYTRF', 'L', data%len_c, & - 1_ip_, - 1_ip_, - 1_ip_ ) data%lwork = data%len_c * nb CASE DEFAULT @@ -346,7 +346,7 @@ SUBROUTINE LMS_setup( n, data, control, inform ) IF ( data%any_method ) THEN method = 'ANY ' data%len_c = 2 * data%m - nb = LAENV( 1_ip_, 'DSYTRF', 'L', data%len_c, & + nb = LAENV( 1_ip_, 'DSYTRF', 'L', data%len_c, & - 1_ip_, - 1_ip_, - 1_ip_ ) data%lwork = MAX( data%len_c * nb, data%lwork ) END IF diff --git a/src/lpb/lpb.F90 b/src/lpb/lpb.F90 index 7d6aa3abca..95e31edffb 100644 --- a/src/lpb/lpb.F90 +++ b/src/lpb/lpb.F90 @@ -1787,8 +1787,8 @@ SUBROUTINE LPB_solve( prob, data, control, inform, C_stat, X_stat ) inform%nfacts = 1 IF ( ( control%cpu_time_limit >= zero .AND. & - REAL( time_now - time_start, rp_ ) > control%cpu_time_limit ) .OR. & - ( control%clock_time_limit >= zero .AND. & + REAL( time_now - time_start, rp_ ) > control%cpu_time_limit ) & + .OR. ( control%clock_time_limit >= zero .AND. & clock_now - clock_start > control%clock_time_limit ) ) THEN inform%status = GALAHAD_error_cpu_limit IF ( control%error > 0 .AND. control%print_level > 0 ) & diff --git a/src/lsqp/lsqp.F90 b/src/lsqp/lsqp.F90 index 879d0cbbca..fa10b823c4 100644 --- a/src/lsqp/lsqp.F90 +++ b/src/lsqp/lsqp.F90 @@ -7729,7 +7729,8 @@ SUBROUTINE LSQP_solve_qp( data, status, W, X0, G, f, A_val, C_l, C_u, & REAL ( KIND = rp_ ), DIMENSION( : ), INTENT( IN ) :: X_l, X_u REAL ( KIND = rp_ ), DIMENSION( : ), INTENT( INOUT ) :: X, Y, Z REAL ( KIND = rp_ ), DIMENSION( : ), INTENT( OUT ) :: C - INTEGER ( KIND = ip_ ), INTENT( OUT ), OPTIONAL, DIMENSION( : ) :: C_stat, X_stat + INTEGER ( KIND = ip_ ), INTENT( OUT ), OPTIONAL, DIMENSION( : ) :: C_stat + INTEGER ( KIND = ip_ ), INTENT( OUT ), OPTIONAL, DIMENSION( : ) :: X_stat ! local variables diff --git a/src/lsqp/lsqpt.F90 b/src/lsqp/lsqpt.F90 index 482169335f..bde823c172 100644 --- a/src/lsqp/lsqpt.F90 +++ b/src/lsqp/lsqpt.F90 @@ -233,7 +233,8 @@ PROGRAM GALAHAD_LSQP_test_deck ELSE p%A%val = (/ 2.0_rp_, 1.0_rp_, 0.0_rp_, 0.0_rp_, 1.0_rp_, 1.0_rp_ /) END IF - p%X = (/ -2.0_rp_, 1.0_rp_, 3.0_rp_ /) ; p%Y = 0.0_rp_ ; p%Z = 0.0_rp_ + p%X = (/ -2.0_rp_, 1.0_rp_, 3.0_rp_ /) ; p%Y = 0.0_rp_ + p%Z = 0.0_rp_ CALL LSQP_solve( p, data, control, info ) IF ( info%status == 0 ) THEN WRITE( 6, "( A1, 2I1, ':', I6, ' iterations. Value = ', F6.1 )" ) & diff --git a/src/lsrt/lsrts2.f90 b/src/lsrt/lsrts2.f90 index 0cfce16fc1..0984629b5e 100644 --- a/src/lsrt/lsrts2.f90 +++ b/src/lsrt/lsrts2.f90 @@ -21,7 +21,7 @@ PROGRAM GALAHAD_LSRT2_BIT_TEST TYPE ( LSRT_data_type ) :: data TYPE ( LSRT_control_type ) :: control TYPE ( LSRT_inform_type ) :: inform - sigmae = (/ 0.0001_working, 0.01_working, 1.0_working, 100.0_working, & + sigmae = (/ 0.0001_working, 0.01_working, 1.0_working, 100.0_working, & 10000.0_working /) rhos = (/ 0.01_working, 0.0001_working /) @@ -73,7 +73,7 @@ PROGRAM GALAHAD_LSRT2_BIT_TEST ! DO sig = 3, 3 sigma = sigmae( sig ) - CALL LSRT_initialize( data, control, inform ) ! Initialize control parameters + CALL LSRT_initialize( data, control, inform ) ! Initialize control params control%fraction_opt = 0.99 ! Only require 99% of the best ! control%print_level = 2 ! control%itmax = 4761 @@ -110,41 +110,41 @@ PROGRAM GALAHAD_LSRT2_BIT_TEST ! U( m ) = one ; U( 1 : m - 1 ) = zero ! re-initialize u to b U = one ! re-initialize u to b CASE ( - 2 : 0 ) ! Successful return - prod = DOT_PRODUCT( X, Z ) / tztz - Wn = X - prod * Z - IF ( m <= n ) THEN - Wm = Wn( : m ) * D( : m ) - ELSE - Wm( : n ) = Wn * D - Wm( n + 1 : ) = zero - END IF - prod = DOT_PRODUCT( Wm, Y ) / tyty - RES = Wm - prod * Y - one - WRITE( 6, "( 1X, I0, ' 1st pass and ', I0, ' 2nd pass iterations' )" )& - inform%iter, inform%iter_pass2 - WRITE( 6, "( ' objective recurred and calculated = ', 2ES16.8 )" ) & - inform%obj, 0.5_working * DOT_PRODUCT( RES, RES ) + ( sigma / p ) * & - ( SQRT( DOT_PRODUCT( X, X ) ) ) ** p - WRITE( 6, "( ' ||x|| recurred and calculated = ', 2ES16.8 )" ) & - inform%x_norm, SQRT( DOT_PRODUCT( X, X ) ) - WRITE( 6, "( ' ||Ax-b|| recurred and calculated = ', 2ES16.8 )" ) & - inform%r_norm, SQRT( DOT_PRODUCT( RES, RES ) ) - WRITE( 6, "( ' m, n, cond, sigma ', I0, 1X, I0, 2ES12.4 )" ) & - m, n, one / rho, sigma - WRITE( 6, "( ' min, mean, max, number boundary iterations ', & - & I0, F4.1, 1X, I0, 1X, I0 )" ) inform%biter_min, inform%biter_mean, & - inform%biter_max, inform%biters - WRITE( 44, "( 2I6, 2ES12.4, I4, F5.1, I4, I6 )" ) m, n, one / rho, & - sigma, inform%biter_min, inform%biter_mean, & - inform%biter_max, inform%biters - CALL LSRT_terminate( data, control, inform ) !delete internal workspace - it_min( sig, cond, dim ) = inform%biter_min - it_max( sig, cond, dim ) = inform%biter_max - it_mean( sig, cond, dim ) = inform%biter_mean - EXIT + prod = DOT_PRODUCT( X, Z ) / tztz + Wn = X - prod * Z + IF ( m <= n ) THEN + Wm = Wn( : m ) * D( : m ) + ELSE + Wm( : n ) = Wn * D + Wm( n + 1 : ) = zero + END IF + prod = DOT_PRODUCT( Wm, Y ) / tyty + RES = Wm - prod * Y - one + WRITE( 6, "( 1X, I0, ' 1st pass and ', I0, ' 2nd pass iterations' )" )& + inform%iter, inform%iter_pass2 + WRITE( 6, "( ' objective recurred and calculated = ', 2ES16.8 )" ) & + inform%obj, 0.5_working * DOT_PRODUCT( RES, RES ) + ( sigma / p ) * & + ( SQRT( DOT_PRODUCT( X, X ) ) ) ** p + WRITE( 6, "( ' ||x|| recurred and calculated = ', 2ES16.8 )" ) & + inform%x_norm, SQRT( DOT_PRODUCT( X, X ) ) + WRITE( 6, "( ' ||Ax-b|| recurred and calculated = ', 2ES16.8 )" ) & + inform%r_norm, SQRT( DOT_PRODUCT( RES, RES ) ) + WRITE( 6, "( ' m, n, cond, sigma ', I0, 1X, I0, 2ES12.4 )" ) & + m, n, one / rho, sigma + WRITE( 6, "( ' min, mean, max, number boundary iterations ', & + I0, F4.1, 1X, I0, 1X, I0 )" ) inform%biter_min, inform%biter_mean, & + inform%biter_max, inform%biters + WRITE( 44, "( 2I6, 2ES12.4, I4, F5.1, I4, I6 )" ) m, n, one / rho, & + sigma, inform%biter_min, inform%biter_mean, & + inform%biter_max, inform%biters + CALL LSRT_terminate( data, control, inform ) !delete internal workspace + it_min( sig, cond, dim ) = inform%biter_min + it_max( sig, cond, dim ) = inform%biter_max + it_mean( sig, cond, dim ) = inform%biter_mean + EXIT CASE DEFAULT ! Error returns WRITE( 6, "( ' LSRT_solve exit status = ', I6 ) " ) inform%status - CALL LSRT_terminate( data, control, inform ) !delete internal workspace + CALL LSRT_terminate( data, control, inform ) !delete internal worksp EXIT END SELECT END DO diff --git a/src/lstr/lstrs2.f90 b/src/lstr/lstrs2.f90 index d6f3bd3fba..131d46294e 100644 --- a/src/lstr/lstrs2.f90 +++ b/src/lstr/lstrs2.f90 @@ -71,7 +71,7 @@ PROGRAM GALAHAD_LSTR2_BIT_TEST ! DO rad = 3, 3 radius = radii( rad ) - CALL LSTR_initialize( data, control, inform ) ! Initialize control parameters + CALL LSTR_initialize( data, control, inform ) ! Initialize control params control%steihaug_toint = .FALSE. ! Try for an accurate solution control%fraction_opt = 0.99 ! Only require 99% of the best ! control%print_level = 2 @@ -109,38 +109,38 @@ PROGRAM GALAHAD_LSTR2_BIT_TEST ! U( m ) = one ; U( 1 : m - 1 ) = zero ! re-initialize u to b U = one ! re-initialize u to b CASE ( - 2 : 0 ) ! Successful return - prod = DOT_PRODUCT( X, Z ) / tztz - Wn = X - prod * Z - IF ( m <= n ) THEN - Wm = Wn( : m ) * D( : m ) - ELSE - Wm( : n ) = Wn * D - Wm( n + 1 : ) = zero - END IF - prod = DOT_PRODUCT( Wm, Y ) / tyty - RES = Wm - prod * Y - one - WRITE( 6, "( 1X, I0, ' 1st pass and ', I0, ' 2nd pass iterations' )" )& - inform%iter, inform%iter_pass2 - WRITE( 6, "( ' ||x|| recurred and calculated = ', 2ES16.8 )" ) & - inform%x_norm, SQRT( DOT_PRODUCT( X, X ) ) - WRITE( 6, "( ' ||Ax-b|| recurred and calculated = ', 2ES16.8 )" ) & - inform%r_norm, SQRT( DOT_PRODUCT( RES, RES ) ) - WRITE( 6, "( ' m, n, cond, radius ', I0, 1X, I0, 2ES12.4 )" ) & - m, n, one / rho, radius - WRITE( 6, "( ' min, mean, max, number boundary iterations ', & - & I0, F4.1, 1X, I0, 1X, I0 )" ) inform%biter_min, inform%biter_mean, & - inform%biter_max, inform%biters - WRITE( 44, "( 2I6, 2ES12.4, I4, F5.1, I4, I6 )" ) m, n, one / rho, & - radius, inform%biter_min, inform%biter_mean, & - inform%biter_max, inform%biters - CALL LSTR_terminate( data, control, inform ) !delete internal workspace - it_min( rad, cond, dim ) = inform%biter_min - it_max( rad, cond, dim ) = inform%biter_max - it_mean( rad, cond, dim ) = inform%biter_mean - EXIT + prod = DOT_PRODUCT( X, Z ) / tztz + Wn = X - prod * Z + IF ( m <= n ) THEN + Wm = Wn( : m ) * D( : m ) + ELSE + Wm( : n ) = Wn * D + Wm( n + 1 : ) = zero + END IF + prod = DOT_PRODUCT( Wm, Y ) / tyty + RES = Wm - prod * Y - one + WRITE( 6, "( 1X, I0, ' 1st pass and ', I0, ' 2nd pass iterations' )" )& + inform%iter, inform%iter_pass2 + WRITE( 6, "( ' ||x|| recurred and calculated = ', 2ES16.8 )" ) & + inform%x_norm, SQRT( DOT_PRODUCT( X, X ) ) + WRITE( 6, "( ' ||Ax-b|| recurred and calculated = ', 2ES16.8 )" ) & + inform%r_norm, SQRT( DOT_PRODUCT( RES, RES ) ) + WRITE( 6, "( ' m, n, cond, radius ', I0, 1X, I0, 2ES12.4 )" ) & + m, n, one / rho, radius + WRITE( 6, "( ' min, mean, max, number boundary iterations ', & + I0, F4.1, 1X, I0, 1X, I0 )" ) inform%biter_min, inform%biter_mean, & + inform%biter_max, inform%biters + WRITE( 44, "( 2I6, 2ES12.4, I4, F5.1, I4, I6 )" ) m, n, one / rho, & + radius, inform%biter_min, inform%biter_mean, & + inform%biter_max, inform%biters + CALL LSTR_terminate( data, control, inform ) !delete internal workspace + it_min( rad, cond, dim ) = inform%biter_min + it_max( rad, cond, dim ) = inform%biter_max + it_mean( rad, cond, dim ) = inform%biter_mean + EXIT CASE DEFAULT ! Error returns WRITE( 6, "( ' LSTR_solve exit status = ', I6 ) " ) inform%status - CALL LSTR_terminate( data, control, inform ) !delete internal workspace + CALL LSTR_terminate( data, control, inform ) !delete internal worksp EXIT END SELECT END DO diff --git a/src/matlab/galahad_arc_matlab_types.F90 b/src/matlab/galahad_arc_matlab_types.F90 index 260f67b2fc..730755eecd 100644 --- a/src/matlab/galahad_arc_matlab_types.F90 +++ b/src/matlab/galahad_arc_matlab_types.F90 @@ -219,7 +219,7 @@ SUBROUTINE ARC_matlab_control_set( ps, ARC_control, len ) CALL MATLAB_get_value( ps, 'renormalize_weight', & pc, ARC_control%renormalize_weight ) CASE( 'quadratic_ratio_test' ) - CALL MATLAB_get_value( ps, 'quadratic_ratio_test', & + CALL MATLAB_get_value( ps, 'quadratic_ratio_test', & pc, ARC_control%quadratic_ratio_test ) CASE( 'space_critical' ) CALL MATLAB_get_value( ps, 'space_critical', & diff --git a/src/matlab/galahad_bllsb.F90 b/src/matlab/galahad_bllsb.F90 index 459451e619..99be42adcc 100644 --- a/src/matlab/galahad_bllsb.F90 +++ b/src/matlab/galahad_bllsb.F90 @@ -174,7 +174,7 @@ SUBROUTINE mexFunction( nlhs, plhs, nrhs, prhs ) END IF IF ( nlhs > 3 ) & - CALL mexErrMsgTxt( ' galahad_bllsb provides at most 3 output arguments' ) + CALL mexErrMsgTxt( ' galahad_bllsb provides at most 3 output arguments') ! Initialize the internal structures for bllsb diff --git a/src/matlab/galahad_bllsb_matlab_types.F90 b/src/matlab/galahad_bllsb_matlab_types.F90 index fa2e6690c6..a81040e427 100644 --- a/src/matlab/galahad_bllsb_matlab_types.F90 +++ b/src/matlab/galahad_bllsb_matlab_types.F90 @@ -204,7 +204,7 @@ SUBROUTINE BLLSB_matlab_control_set( ps, BLLSB_control, len ) pc, BLLSB_control%remove_dependencies ) CASE( 'treat_zero_bounds_as_general' ) CALL MATLAB_get_value( ps,'treat_zero_bounds_as_general', & - pc, BLLSB_control%treat_zero_bounds_as_general ) + pc, BLLSB_control%treat_zero_bounds_as_general) CASE( 'just_feasible' ) CALL MATLAB_get_value( ps, 'just_feasible', & pc, BLLSB_control%just_feasible ) diff --git a/src/matlab/galahad_bqpb_matlab_types.F90 b/src/matlab/galahad_bqpb_matlab_types.F90 index 70fd27458c..b8ee9bc164 100644 --- a/src/matlab/galahad_bqpb_matlab_types.F90 +++ b/src/matlab/galahad_bqpb_matlab_types.F90 @@ -651,7 +651,7 @@ SUBROUTINE BQPB_matlab_inform_get( BQPB_inform, BQPB_pointer ) CALL MATLAB_copy_to_ptr( REAL( BQPB_inform%time%clock_preprocess, wp ), & mxGetPr( BQPB_pointer%time_pointer%clock_preprocess ) ) CALL MATLAB_copy_to_ptr( REAL( BQPB_inform%time%clock_find_dependent,wp),& - mxGetPr( BQPB_pointer%time_pointer%clock_find_dependent ) ) + mxGetPr( BQPB_pointer%time_pointer%clock_find_dependent) ) CALL MATLAB_copy_to_ptr( REAL( BQPB_inform%time%clock_analyse, wp ), & mxGetPr( BQPB_pointer%time_pointer%clock_analyse ) ) CALL MATLAB_copy_to_ptr( REAL( BQPB_inform%time%clock_factorize, wp ), & diff --git a/src/matlab/galahad_clls_matlab_types.F90 b/src/matlab/galahad_clls_matlab_types.F90 index 6282c94ce8..072d01d1ac 100644 --- a/src/matlab/galahad_clls_matlab_types.F90 +++ b/src/matlab/galahad_clls_matlab_types.F90 @@ -182,7 +182,7 @@ SUBROUTINE CLLS_matlab_control_set( ps, CLLS_control, len ) CALL MATLAB_get_value( ps, 'identical_bounds_tol', & pc, CLLS_control%identical_bounds_tol ) CASE( 'mu_pounce' ) - CALL MATLAB_get_value( ps, 'mu_pounce', & + CALL MATLAB_get_value( ps, 'mu_pounce', & pc, CLLS_control%mu_pounce ) CASE( 'indicator_tol_p' ) CALL MATLAB_get_value( ps, 'indicator_tol_p', & diff --git a/src/matlab/galahad_dqp_matlab_types.F90 b/src/matlab/galahad_dqp_matlab_types.F90 index a58c019de7..a86b4e50fe 100644 --- a/src/matlab/galahad_dqp_matlab_types.F90 +++ b/src/matlab/galahad_dqp_matlab_types.F90 @@ -408,7 +408,7 @@ SUBROUTINE DQP_matlab_control_get( struct, DQP_control, name ) ! create the components of sub-structure GLTR_control - CALL GLTR_matlab_control_get( pointer, DQP_control%GLTR_control, & + CALL GLTR_matlab_control_get( pointer, DQP_control%GLTR_control, & 'GLTR_control' ) RETURN diff --git a/src/matlab/galahad_psls_matlab_types.F90 b/src/matlab/galahad_psls_matlab_types.F90 index f69320a41c..aaac0959d7 100644 --- a/src/matlab/galahad_psls_matlab_types.F90 +++ b/src/matlab/galahad_psls_matlab_types.F90 @@ -425,7 +425,7 @@ SUBROUTINE PSLS_matlab_inform_get( PSLS_inform, PSLS_pointer ) mxGetPr( PSLS_pointer%time_pointer%factorize ) ) CALL MATLAB_copy_to_ptr( REAL( PSLS_inform%time%solve, wp ), & mxGetPr( PSLS_pointer%time_pointer%solve ) ) - CALL MATLAB_copy_to_ptr( REAL( PSLS_inform%time%update, wp ), & + CALL MATLAB_copy_to_ptr( REAL( PSLS_inform%time%update, wp ), & mxGetPr( PSLS_pointer%time_pointer%update ) ) ! symmetric linear system components diff --git a/src/miqr/miqr.F90 b/src/miqr/miqr.F90 index be17c459d7..d4f1774d83 100644 --- a/src/miqr/miqr.F90 +++ b/src/miqr/miqr.F90 @@ -2203,8 +2203,8 @@ SUBROUTINE MIQR_increase_row_mat_space( mat, name, extra, control, & ! Local variables - INTEGER ( KIND = ip_ ) :: old_length, used_length, min_length, new_length, new_size - INTEGER ( KIND = ip_ ) :: array_size + INTEGER ( KIND = ip_ ) :: old_length, used_length, min_length + INTEGER ( KIND = ip_ ) :: new_length, new_size, array_size inform%status = GALAHAD_ok diff --git a/src/nls/nls.F90 b/src/nls/nls.F90 index e4ad73c1f6..c23ecaab3d 100644 --- a/src/nls/nls.F90 +++ b/src/nls/nls.F90 @@ -7992,8 +7992,8 @@ SUBROUTINE NLS_set_map( A, B, IW, PTR, ROW, ORDER, b_in_a, & LOGICAL, INTENT( IN ) :: b_in_a, deallocate_error_fatal, space_critical INTEGER ( KIND = ip_ ), INTENT( OUT ) :: status INTEGER ( KIND = ip_ ), INTENT( INOUT ) :: alloc_status - INTEGER ( KIND = ip_ ), INTENT( INOUT ), ALLOCATABLE, DIMENSION( : ) :: IW, PTR, ROW - INTEGER ( KIND = ip_ ), INTENT( INOUT ), ALLOCATABLE, DIMENSION( : ) :: ORDER, MAP + INTEGER ( KIND = ip_ ), INTENT( INOUT ), ALLOCATABLE, & + DIMENSION( : ) :: IW, PTR, ROW, ORDER, MAP CHARACTER ( LEN = 80 ), INTENT( INOUT ) :: bad_alloc TYPE ( SMT_type ), INTENT( IN ) :: A, B diff --git a/src/oblivion/funnel/funnel.F90 b/src/oblivion/funnel/funnel.F90 index e3335da25f..ee0e54b153 100644 --- a/src/oblivion/funnel/funnel.F90 +++ b/src/oblivion/funnel/funnel.F90 @@ -5291,7 +5291,8 @@ FUNCTION MODEL_f( n_total, barrier, GRAD_barrier, HESS_barrier, D, HD ) INTEGER ( KIND = ip_ ), INTENT( IN ) :: n_total REAL ( KIND = rp_ ), INTENT( IN ) :: barrier - REAL ( KIND = rp_ ), INTENT( IN ), DIMENSION( n_total ) :: GRAD_barrier, D + REAL ( KIND = rp_ ), INTENT( IN ), & + DIMENSION( n_total ) :: GRAD_barrier, D REAL ( KIND = rp_ ), INTENT( OUT ), DIMENSION( n_total ) :: HD TYPE ( SMT_type ), INTENT( IN ) :: HESS_barrier diff --git a/src/oblivion/lcf/lcf.F90 b/src/oblivion/lcf/lcf.F90 index 6ee2fe58fa..13db8ffc3b 100644 --- a/src/oblivion/lcf/lcf.F90 +++ b/src/oblivion/lcf/lcf.F90 @@ -1598,7 +1598,7 @@ SUBROUTINE LCF_solve_main( dims, n, m, A_val, A_col, A_ptr, & DIMENSION( A_ptr( m + 1 ) - 1 ) :: A_val REAL ( KIND = rp_ ), INTENT( OUT ), DIMENSION( m ) :: C_RES REAL ( KIND = rp_ ), INTENT( INOUT ), DIMENSION( dims%v_e ) :: SOL - REAL ( KIND = rp_ ), INTENT( OUT ), & + REAL ( KIND = rp_ ), INTENT( OUT ), & DIMENSION( dims%c_l_start : dims%c_u_end ) :: C ! Allocatable arrays and structures @@ -2122,7 +2122,7 @@ SUBROUTINE LCF_solve_main( dims, n, m, A_val, A_col, A_ptr, & size_p = SUM( ( two * X - Pb_x - Pl_x ) ** 2 ) + & SUM( ( two * C - Pb_c - Pl_c ) ** 2 ) IF ( size_p /= zero ) THEN - alpha = 3.8_rp_ * & + alpha = 3.8_rp_ * & ( inform%size_b ** 2 + inform%size_l ** 2 ) / size_p ELSE alpha = 1.9_rp_ diff --git a/src/oblivion/s2qp/s2qp.F90 b/src/oblivion/s2qp/s2qp.F90 index 1dd13194b7..56d8ec8509 100644 --- a/src/oblivion/s2qp/s2qp.F90 +++ b/src/oblivion/s2qp/s2qp.F90 @@ -6062,7 +6062,8 @@ SUBROUTINE fill_QPpred( nlp, QPpred, status, data ) if ( print_level >= GALAHAD_crazy ) then write(out, 1015) write( out, '(4(2x, ES15.8))') & - ( data%BFGS%d(i), data%BFGS%Bs(i), data%BFGS%gradLx_new(i), data%BFGS%gradLx(i), i = 1, n ) + ( data%BFGS%d(i), data%BFGS%Bs(i), & + data%BFGS%gradLx_new(i), data%BFGS%gradLx(i), i = 1, n ) end if end if @@ -9330,8 +9331,10 @@ SUBROUTINE L1_viol( lv, res_vl, res_vu, v_type, viol, error, tiny, & real( kind = rp_ ), intent( in ), dimension( : ) :: res_vl, res_vu character ( len = 2 ), intent( in ), dimension( : ) :: v_type real( kind = rp_ ), intent( in ), optional :: tiny - INTEGER ( KIND = ip_ ), intent( inout ), dimension( : ), optional :: sat, vl_l, vl_u - INTEGER ( KIND = ip_ ), intent( inout ), optional :: num_sat, num_vl_l, num_vl_u + INTEGER ( KIND = ip_ ), intent( inout ), dimension( : ), & + optional :: sat, vl_l, vl_u + INTEGER ( KIND = ip_ ), intent( inout ), & + optional :: num_sat, num_vl_l, num_vl_u !------------------------------------------------------------------------------ ! L o c a l V a r i a b l e s @@ -10089,7 +10092,8 @@ SUBROUTINE get_L_BFGS( S, A, B, BSinner, B0, svec, gradLx_new, gradLx, y, & ! D u m m y A r g u m e n t s !----------------------------------------------------------------------------- - INTEGER ( KIND = ip_ ), intent( in ) :: L, error, out, n, print_level, num_update + INTEGER ( KIND = ip_ ), intent( in ) :: L, error, out, n + INTEGER ( KIND = ip_ ), intent( in ) :: print_level, num_update INTEGER ( KIND = ip_ ), intent( out ) :: status real( kind = rp_ ), intent( out ) :: theta real( kind = rp_ ), intent( in ) :: damp_factor @@ -10394,7 +10398,8 @@ SUBROUTINE print_predictor_info( data, nlp ) end if if ( m_a > 0 ) then - call print_real_vec( 'Ya_p', data%QPpred%Y(m+1:m+m_a), 5, num_print, out, error ) + call print_real_vec( 'Ya_p', data%QPpred%Y(m+1:m+m_a), 5, & + num_print, out, error ) end if call print_real_vec( 's_p', data%s_p, 5, num_print, out, error ) @@ -10467,7 +10472,8 @@ SUBROUTINE print_steering_info( data, nlp ) call print_real_vec( 'v_out', data%v_out, 5, num_print, out, error ) end if - call print_real_vec( 'X + s_steer', nlp%X+data%s_steer, 5, num_print, out, error ) + call print_real_vec( 'X + s_steer', nlp%X+data%s_steer, & + 5, num_print, out, error ) write( out, 3001 ) @@ -10711,11 +10717,13 @@ SUBROUTINE print_seqp_info( data, nlp ) call print_int_vec( 'x-fixed', data%fx, 10, num_print, out, error ) if ( m > 0 ) then call print_int_vec( 'J-in-working-set', data%wJ, 10, num_print, out, error ) - call print_int_vec( 'J-NOT-in-working-set', data%wJ_comp, 10, num_print, out, error ) + call print_int_vec( 'J-NOT-in-working-set', data%wJ_comp, & + 10, num_print, out, error ) end if if ( m_a > 0 ) then call print_int_vec( 'A-in-working-set', data%wA, 6, num_print, out, error ) - call print_int_vec( 'A-NOT-in-working set', data%wA_comp, 10, num_print, out, error ) + call print_int_vec( 'A-NOT-in-working set', data%wA_comp, & + 10, num_print, out, error ) end if call print_real_vec( 'S_s', data%s_s, 5, num_print, out, error ) @@ -11047,16 +11055,24 @@ SUBROUTINE print_step_summary( data ) 1X, 79('*'),/, & 1X, 23('*'),'BEGIN SUMMARY (S2QP) : ITERATE S(', I7,')', 23('*'), /, & 1X, 79('*'),/, & - 1X, 'B-approx-type = ', 12x, I1, T34, 'alpha-cauchy = ', ES13.6, T66, 'trial-step = ', 11x,A2, /, & - 1X, 'BFGS-mod-type = ', 12x, I1, T34, 'dec-cauchy = ', ES13.6, T66, 'dec-model = ', ES13.6, /, & - 1x, 'use-prev-pred = ', 12x, L1, T34, 'sEqp-computed = ', 12x,L1, T66, 'ratio = ', ES13.6, /, & - 1x, 'use-TR-pred = ', 12x, L1, T34, 'alpha-feas = ', ES13.6, T66, 'step-sucess = ', 6x, A7, /, & - 1X, 'iters-pred = ', 6x, I7, T34, 'sIqp-computed = ', 12x,L1, T66, 'step-accepted = ', 12x, L1, /, & - 1X, 'radius-pred = ', ES13.6, T34, 'descent = ', 9x, A4, T66, 'reverting = ', 12x, L1, /, & - 1X, 'inf-norm-pred = ', ES13.6, T34, 'iters-acc = ', 6x, I7, T66, 'NM-active = ', 12x, L1, /, & - 1x, 'inf-norm-Y_p = ', ES13.6, T34, 'acc-radius = ', ES13.6, T66, 'NM-steps = ', 12x, I1, /, & - T34, 'inf-norm-acc = ', ES13.6, T66, 'NM-#-fail = ', 12x, I1, /, & - T34, 'inf-norm-Y_s = ', ES13.6, /, & + 1X, 'B-approx-type = ', 12x, I1, T34, 'alpha-cauchy = ', ES13.6, & + T66, 'trial-step = ', 11x,A2, /, & + 1X, 'BFGS-mod-type = ', 12x, I1, T34, & + 'dec-cauchy = ', ES13.6, T66, 'dec-model = ', ES13.6, /, & + 1x, 'use-prev-pred = ', 12x, L1, T34, & + 'sEqp-computed = ', 12x,L1, T66, 'ratio = ', ES13.6, /, & + 1x, 'use-TR-pred = ', 12x, L1, T34, & + 'alpha-feas = ', ES13.6, T66, 'step-sucess = ', 6x, A7, /, & + 1X, 'iters-pred = ', 6x, I7, T34, & + 'sIqp-computed = ', 12x,L1, T66, 'step-accepted = ', 12x, L1, /, & + 1X, 'radius-pred = ', ES13.6, T34, & + 'descent = ', 9x, A4, T66, 'reverting = ', 12x, L1, /, & + 1X, 'inf-norm-pred = ', ES13.6, T34, & + 'iters-acc = ', 6x, I7, T66, 'NM-active = ', 12x, L1, /, & + 1x, 'inf-norm-Y_p = ', ES13.6, T34, & + 'acc-radius = ', ES13.6, T66, 'NM-steps = ', 12x, I1, /, & + T34, 'inf-norm-acc = ', ES13.6, T66, 'NM-#-fail = ', 12x, I1, /, & + T34, 'inf-norm-Y_s = ', ES13.6, /, & 1X, 79('*'),/, & 1X, 23('*'),'END SUMMARY (S2QP)', 23('*'), /, & 1X, 79('*') ) diff --git a/src/oblivion/superb/superb.F90 b/src/oblivion/superb/superb.F90 index 7fd27d6e78..27f924f712 100644 --- a/src/oblivion/superb/superb.F90 +++ b/src/oblivion/superb/superb.F90 @@ -7746,7 +7746,8 @@ SUBROUTINE SUPERB_exact_linesearch( n, m, nfree, nelastic, XFREE, S_type, & INTEGER ( KIND = ip_ ), INTENT( OUT ) :: search_error, J_ne LOGICAL, INTENT( IN ) :: printt, scale_xcf REAL ( KIND = rp_ ), INTENT( IN ) :: mu, nu, merit - REAL ( KIND = rp_ ), INTENT( OUT ) :: barrier, penalty, merit_trial, f_trial + REAL ( KIND = rp_ ), INTENT( OUT ) :: barrier, penalty + REAL ( KIND = rp_ ), INTENT( OUT ) :: merit_trial, f_trial REAL ( KIND = rp_ ), INTENT( INOUT ) :: alpha, slope, ratio INTEGER ( KIND = ip_ ), INTENT( IN ), DIMENSION( n ) :: XSTATE INTEGER ( KIND = ip_ ), INTENT( IN ), DIMENSION( nfree ) :: XFREE diff --git a/src/oblivion/tr2a/tr2ati.F90 b/src/oblivion/tr2a/tr2ati.F90 index d9db446b36..a58da0cddc 100644 --- a/src/oblivion/tr2a/tr2ati.F90 +++ b/src/oblivion/tr2a/tr2ati.F90 @@ -48,41 +48,41 @@ PROGRAM GALAHAD_TR2A_interface_test SELECT CASE ( data_storage_type ) CASE ( 1 ) ! sparse co-ordinate storage st = 'C' - CALL TR2A_import( control, data, status, n, & - 'coordinate', ne, H_row, H_col, H_ptr ) - CALL TR2A_solve_with_mat( data, userdata, status, X, G, & - FUN, GRAD, HESS, PREC ) + CALL TR2A_import( control, data, status, n, & + 'coordinate', ne, H_row, H_col, H_ptr ) + CALL TR2A_solve_with_mat( data, userdata, status, X, G, & + FUN, GRAD, HESS, PREC ) CASE ( 2 ) ! sparse by rows st = 'R' - CALL TR2A_import( control, data, status, n, & - 'sparse_by_rows', ne, H_row, H_col, H_ptr ) - CALL TR2A_solve_with_mat( data, userdata, status, X, G, & - FUN, GRAD, HESS, PREC ) + CALL TR2A_import( control, data, status, n, & + 'sparse_by_rows', ne, H_row, H_col, H_ptr ) + CALL TR2A_solve_with_mat( data, userdata, status, X, G, & + FUN, GRAD, HESS, PREC ) CASE ( 3 ) ! dense st = 'D' - CALL TR2A_import( control, data, status, n, & - 'dense', ne, H_row, H_col, H_ptr ) - CALL TR2A_solve_with_mat( data, userdata, status, X, G, & - FUN, GRAD, HESS_dense, PREC ) + CALL TR2A_import( control, data, status, n, & + 'dense', ne, H_row, H_col, H_ptr ) + CALL TR2A_solve_with_mat( data, userdata, status, X, G, & + FUN, GRAD, HESS_dense, PREC ) CASE ( 4 ) ! diagonal st = 'I' - CALL TR2A_import( control, data, status, n, & - 'diagonal', ne, H_row, H_col, H_ptr ) - CALL TR2A_solve_with_mat( data, userdata, status, X, G, & - FUN_diag, GRAD_diag, HESS_diag, PREC ) + CALL TR2A_import( control, data, status, n, & + 'diagonal', ne, H_row, H_col, H_ptr ) + CALL TR2A_solve_with_mat( data, userdata, status, X, G, & + FUN_diag, GRAD_diag, HESS_diag, PREC ) CASE ( 5 ) ! access by products st = 'P' - CALL TR2A_import( control, data, status, n, & - 'absent', ne, H_row, H_col, H_ptr ) - CALL TR2A_solve_without_mat( data, userdata, status, X, G, & - FUN, GRAD, HESSPROD, PREC ) + CALL TR2A_import( control, data, status, n, & + 'absent', ne, H_row, H_col, H_ptr ) + CALL TR2A_solve_without_mat( data, userdata, status, X, G, & + FUN, GRAD, HESSPROD, PREC ) END SELECT CALL TR2A_information( data, inform, status ) IF ( inform%status == 0 ) THEN WRITE( 6, "( A1, ':', I6, ' iterations. Optimal objective value = ', & & F5.2, ' status = ', I0 )" ) st, inform%iter, inform%obj, inform%status ELSE - WRITE( 6, "( A1, ': TR2A_solve exit status = ', I0 ) " ) st, inform%status + WRITE( 6, "( A1, ': TR2A_solve exit status = ', I0 )" ) st, inform%status END IF ! WRITE( 6, "( ' X ', 3ES12.5 )" ) X ! WRITE( 6, "( ' G ', 3ES12.5 )" ) G @@ -100,11 +100,11 @@ PROGRAM GALAHAD_TR2A_interface_test SELECT CASE ( data_storage_type ) CASE ( 1 ) ! sparse co-ordinate storage st = 'C' - CALL TR2A_import( control, data, status, n, & + CALL TR2A_import( control, data, status, n, & 'coordinate', ne, H_row, H_col, H_ptr ) DO ! reverse-communication loop - CALL TR2A_solve_reverse_with_mat( data, status, eval_status, & - X, f, G, H_val, U, V ) + CALL TR2A_solve_reverse_with_mat( data, status, eval_status, & + X, f, G, H_val, U, V ) SELECT CASE ( status ) CASE ( 0 ) ! successful termination EXIT @@ -126,11 +126,11 @@ PROGRAM GALAHAD_TR2A_interface_test END DO CASE ( 2 ) ! sparse by rows st = 'R' - CALL TR2A_import( control, data, status, n, & - 'sparse_by_rows', ne, H_row, H_col, H_ptr ) + CALL TR2A_import( control, data, status, n, & + 'sparse_by_rows', ne, H_row, H_col, H_ptr ) DO ! reverse-communication loop - CALL TR2A_solve_reverse_with_mat( data, status, eval_status, & - X, f, G, H_val, U, V ) + CALL TR2A_solve_reverse_with_mat( data, status, eval_status, & + X, f, G, H_val, U, V ) SELECT CASE ( status ) CASE ( 0 ) ! successful termination EXIT @@ -152,11 +152,11 @@ PROGRAM GALAHAD_TR2A_interface_test END DO CASE ( 3 ) ! dense st = 'D' - CALL TR2A_import( control, data, status, n, & - 'dense', ne, H_row, H_col, H_ptr ) + CALL TR2A_import( control, data, status, n, & + 'dense', ne, H_row, H_col, H_ptr ) DO ! reverse-communication loop - CALL TR2A_solve_reverse_with_mat( data, status, eval_status, & - X, f, G, H_dense, U, V ) + CALL TR2A_solve_reverse_with_mat( data, status, eval_status, & + X, f, G, H_dense, U, V ) SELECT CASE ( status ) CASE ( 0 ) ! successful termination EXIT @@ -178,11 +178,11 @@ PROGRAM GALAHAD_TR2A_interface_test END DO CASE ( 4 ) ! diagonal st = 'I' - CALL TR2A_import( control, data, status, n, & - 'diagonal', ne, H_row, H_col, H_ptr ) + CALL TR2A_import( control, data, status, n, & + 'diagonal', ne, H_row, H_col, H_ptr ) DO ! reverse-communication loop - CALL TR2A_solve_reverse_with_mat( data, status, eval_status, & - X, f, G, H_diag, U, V ) + CALL TR2A_solve_reverse_with_mat( data, status, eval_status, & + X, f, G, H_diag, U, V ) SELECT CASE ( status ) CASE ( 0 ) ! successful termination EXIT @@ -204,11 +204,11 @@ PROGRAM GALAHAD_TR2A_interface_test END DO CASE ( 5 ) ! access by products st = 'P' - CALL TR2A_import( control, data, status, n, & - 'absent', ne, H_row, H_col, H_ptr ) + CALL TR2A_import( control, data, status, n, & + 'absent', ne, H_row, H_col, H_ptr ) DO ! reverse-communication loop - CALL TR2A_solve_reverse_without_mat( data, status, eval_status, & - X, f, G, U, V ) + CALL TR2A_solve_reverse_without_mat( data, status, eval_status, & + X, f, G, U, V ) SELECT CASE ( status ) CASE ( 0 ) ! successful termination EXIT @@ -234,7 +234,7 @@ PROGRAM GALAHAD_TR2A_interface_test WRITE( 6, "( A1, ':', I6, ' iterations. Optimal objective value = ', & & F5.2, ' status = ', I0 )" ) st, inform%iter, inform%obj, inform%status ELSE - WRITE( 6, "( A1, ': TR2A_solve exit status = ', I0 ) " ) st, inform%status + WRITE( 6, "( A1, ': TR2A_solve exit status = ', I0 )" ) st, inform%status END IF ! WRITE( 6, "( ' X ', 3ES12.5 )" ) X ! WRITE( 6, "( ' G ', 3ES12.5 )" ) G diff --git a/src/oblivion/trimsqp/toy1.F90 b/src/oblivion/trimsqp/toy1.F90 index 0c375ca53e..4f25699b46 100644 --- a/src/oblivion/trimsqp/toy1.F90 +++ b/src/oblivion/trimsqp/toy1.F90 @@ -280,41 +280,42 @@ END SUBROUTINE funH_reverse SELECT CASE ( inform%status ) CASE (-1) - WRITE(*,*) 'Which means : an error has occured within TRIMSQP_solve.' + WRITE(*,*) 'Which means: an error has occured within TRIMSQP_solve.' CASE (0) - WRITE(*,*) 'Which means : ** Solution Found **' + WRITE(*,*) 'Which means: ** Solution Found **' solved = .TRUE. CASE (1) - WRITE(*,*) 'Which means : BUG, forgot to reset status upon initial entry' + WRITE(*,*) 'Which means: BUG, unset status upon initial entry' CASE (2) - WRITE(*,*) 'Which means : REVERSE COMMUNICATION : f and c are needed.' + WRITE(*,*) 'Which means: REVERSE COMMUNICATION : f and c are needed.' CALL funFC_reverse( nlp%f, nlp%C, nlp%X, userdata = userdata ) CASE (3) - WRITE(*,*) 'Which means : REVERSE COMMUNICATION : g is needed.' + WRITE(*,*) 'Which means: REVERSE COMMUNICATION : g is needed.' CALL funG_reverse( nlp%G, nlp%X ) CASE (4) - WRITE(*,*) 'Which means : REVERSE COMMUNICATION : J is needed.' + WRITE(*,*) 'Which means: REVERSE COMMUNICATION : J is needed.' CALL funJ_reverse( nlp%J_val, nlp%X ) CASE (5) - WRITE(*,*) 'Which means : REVERSE COMMUNICATION : g and J are needed.' + WRITE(*,*) 'Which means: REVERSE COMMUNICATION : g and J are needed.' CALL funG_reverse( nlp%G, nlp%X ) CALL funJ_reverse( nlp%J_val, nlp%X ) CASE (6) - WRITE(*,*) 'Which means : REVERSE COMMUNICATION : H is needed.' + WRITE(*,*) 'Which means: REVERSE COMMUNICATION : H is needed.' CALL funH_reverse( nlp%H_val, nlp%X, nlp%Y ) CASE (7) - WRITE(*,*) 'Which means : REVERSE COMMUNICATION : u <- J*v+u is needed.' + WRITE(*,*) 'Which means: REVERSE COMMUNICATION : u <- J*v+u needed.' !transpose = .FALSE. !CALL fun_JV_reverse( data%u, data%v, nlp%X, transpose ) CASE (8) - WRITE(*,*) 'Which means : REVERSE COMMUNICATION : u <- J^T*v+u is needed.' + WRITE(*,*) 'Which means: REVERSE COMMUNICATION : u <- J^T*v+u needed.' !transpose = .TRUE. !CALL fun_Jv_reverse( data%u, data%v, nlp%X, transpose ) CASE (9) - WRITE(*,*) 'Which means : REVERSE COMMUNICATION : u <- H*v+u is needed.' + WRITE(*,*) 'Which means: REVERSE COMMUNICATION : u <- H*v+u needed.' !CALL fun_Hv_reverse( data%u, data%v, nlp%X ) CASE DEFAULT - WRITE(*,*) 'Which means : an in-appropriate value of status has been returned.' + WRITE(*,*) 'Which means: an in-appropriate value of status', & + ' has been returned.' END SELECT num_recursive_calls = num_recursive_calls + 1 diff --git a/src/oblivion/trimsqp/trimsqp.F90 b/src/oblivion/trimsqp/trimsqp.F90 index 268e605867..8e6609c63a 100644 --- a/src/oblivion/trimsqp/trimsqp.F90 +++ b/src/oblivion/trimsqp/trimsqp.F90 @@ -1120,231 +1120,301 @@ END SUBROUTINE eval_HL ! CALL SPACE_resize_array( nlp%m, data%Jv, inform%status, inform%alloc_status ) ! IF ( inform%status /= GALAHAD_ok ) GO TO 990 - CALL SPACE_resize_array( nlp%m, data%JxSp, inform%status, inform%alloc_status) + CALL SPACE_resize_array( nlp%m, data%JxSp, & + inform%status, inform%alloc_status) IF ( inform%status /= GALAHAD_ok ) GO TO 990 - CALL SPACE_resize_array( nlp%m, data%JxSc, inform%status, inform%alloc_status) + CALL SPACE_resize_array( nlp%m, data%JxSc, & + inform%status, inform%alloc_status) IF ( inform%status /= GALAHAD_ok ) GO TO 990 - CALL SPACE_resize_array( nlp%m, data%JxSac, inform%status,inform%alloc_status) + CALL SPACE_resize_array( nlp%m, data%JxSac, & + inform%status,inform%alloc_status) IF ( inform%status /= GALAHAD_ok ) GO TO 990 - CALL SPACE_resize_array( nlp%m, data%JxSs, inform%status, inform%alloc_status) + CALL SPACE_resize_array( nlp%m, data%JxSs, & + inform%status, inform%alloc_status) IF ( inform%status /= GALAHAD_ok ) GO TO 990 - CALL SPACE_resize_array( nlp%m, data%JxSsteer, inform%status, & - inform%alloc_status ) + CALL SPACE_resize_array( nlp%m, data%JxSsteer, + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 - CALL SPACE_resize_array( nlp%m, data%JxSf, inform%status, inform%alloc_status) + CALL SPACE_resize_array( nlp%m, data%JxSf, & + inform%status, inform%alloc_status) IF ( inform%status /= GALAHAD_ok ) GO TO 990 - CALL SPACE_resize_array( nlp%m, data%Jpos, inform%status, inform%alloc_status) + CALL SPACE_resize_array( nlp%m, data%Jpos, & + inform%status, inform%alloc_status) IF ( inform%status /= GALAHAD_ok ) GO TO 990 - CALL SPACE_resize_array( nlp%m, data%Jneg, inform%status, inform%alloc_status) + CALL SPACE_resize_array( nlp%m, data%Jneg, & + inform%status, inform%alloc_status) IF ( inform%status /= GALAHAD_ok ) GO TO 990 - CALL SPACE_resize_array( nlp%m, data%u_in, inform%status, inform%alloc_status) + CALL SPACE_resize_array( nlp%m, data%u_in, & + inform%status, inform%alloc_status) IF ( inform%status /= GALAHAD_ok ) GO TO 990 - CALL SPACE_resize_array( nlp%m, data%v_in, inform%status, inform%alloc_status) + CALL SPACE_resize_array( nlp%m, data%v_in, & + inform%status, inform%alloc_status) IF ( inform%status /= GALAHAD_ok ) GO TO 990 - CALL SPACE_resize_array( nlp%n, data%JtY, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( nlp%n, data%JtY, & + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 - CALL SPACE_resize_array( nlp%n, data%JtY_cur, inform%status, & - inform%alloc_status ) + CALL SPACE_resize_array( nlp%n, data%JtY_cur, & + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 - CALL SPACE_resize_array( nlp%n, data%JtY_p, inform%status,inform%alloc_status) + CALL SPACE_resize_array( nlp%n, data%JtY_p, & + inform%status,inform%alloc_status) IF ( inform%status /= GALAHAD_ok ) GO TO 990 - CALL SPACE_resize_array( nlp%n, data%JtY_s, inform%status,inform%alloc_status) + CALL SPACE_resize_array( nlp%n, data%JtY_s, & + inform%status,inform%alloc_status) IF ( inform%status /= GALAHAD_ok ) GO TO 990 - !CALL SPACE_resize_array( nlp%n, data%Jtv, inform%status, inform%alloc_status ) + !CALL SPACE_resize_array( nlp%n, data%Jtv, & +! inform%status, inform%alloc_status ) !IF ( inform%status /= GALAHAD_ok ) GO TO 990 - !CALL SPACE_resize_array( nlp%n, data%Jtv_cur, inform%status, inform%alloc_status ) + !CALL SPACE_resize_array( nlp%n, data%Jtv_cur, & +! inform%status, inform%alloc_status ) !IF ( inform%status /= GALAHAD_ok ) GO TO 990 - !CALL SPACE_resize_array( nlp%n, data%Jtv_p, inform%status, inform%alloc_status ) + !CALL SPACE_resize_array( nlp%n, data%Jtv_p, & +! inform%status, inform%alloc_status ) !IF ( inform%status /= GALAHAD_ok ) GO TO 990 - !CALL SPACE_resize_array( nlp%n, data%Jtv_s, inform%status, inform%alloc_status ) + !CALL SPACE_resize_array( nlp%n, data%Jtv_s, & +! inform%status, inform%alloc_status ) !IF ( inform%status /= GALAHAD_ok ) GO TO 990 - !CALL SPACE_resize_array( nlp%n, data%Jtv2, inform%status, inform%alloc_status) + !CALL SPACE_resize_array( nlp%n, data%Jtv2, & +! inform%status, inform%alloc_status) !IF ( inform%status /= GALAHAD_ok ) GO TO 990 - !CALL SPACE_resize_array( nlp%n, data%Jtv3, inform%status, inform%alloc_status) + !CALL SPACE_resize_array( nlp%n, data%Jtv3, & +! inform%status, inform%alloc_status) !IF ( inform%status /= GALAHAD_ok ) GO TO 990 CALL SPACE_resize_array(nlp%m, data%C_new, inform%status, inform%alloc_status) IF ( inform%status /= GALAHAD_ok ) GO TO 990 - CALL SPACE_resize_array( nlp%m, data%C_cauchy, inform%status, & - inform%alloc_status ) + CALL SPACE_resize_array( nlp%m, data%C_cauchy, & + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 - CALL SPACE_resize_array( nlp%m, data%cauchy_Y, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( nlp%m, data%cauchy_Y, & + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 - CALL SPACE_resize_array( nlp%m, data%C_type, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( nlp%m, data%C_type, & + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 - CALL SPACE_resize_array( nlp%m, data%CplusJSc, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( nlp%m, data%CplusJSc, & + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 - CALL SPACE_resize_array( nlp%m, data%CplusJxSp, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( nlp%m, data%CplusJxSp, & + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 -! CALL SPACE_resize_array( nlp%m, data%CplusJxSs, inform%status, inform%alloc_status ) +! CALL SPACE_resize_array( nlp%m, data%CplusJxSs, & +! inform%status, inform%alloc_status ) ! IF ( inform%status /= GALAHAD_ok ) GO TO 990 - CALL SPACE_resize_array( nlp%m, data%w, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( nlp%m, data%w, inform%status, & + inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 - CALL SPACE_resize_array( nlp%m, data%J_norms, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( nlp%m, data%J_norms, & + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 - CALL SPACE_resize_array( nlp%m, data%Y_seqp, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( nlp%m, data%Y_seqp, inform%status, & + inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 - CALL SPACE_resize_array( nlp%m, data%sat, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( nlp%m, data%sat, inform%status, & + inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 - CALL SPACE_resize_array( nlp%m, data%vl_l, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( nlp%m, data%vl_l, inform%status, & + inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 - CALL SPACE_resize_array( nlp%m, data%vl_u, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( nlp%m, data%vl_u, inform%status, & + inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 - CALL SPACE_resize_array( data%lbreak, data%IBREAK, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( data%lbreak, data%IBREAK, & + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 - CALL SPACE_resize_array( data%lbreak, data%BREAKP, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( data%lbreak, data%BREAKP, & + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 - CALL SPACE_resize_array( nlp%m, data%C_RES_l, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( nlp%m, data%C_RES_l, & + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 - CALL SPACE_resize_array( nlp%m, data%C_RES_u, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( nlp%m, data%C_RES_u, & + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 - !CALL SPACE_resize_array( nlp%m_a, data%Av, inform%status, inform%alloc_status ) + !CALL SPACE_resize_array( nlp%m_a, data%Av, & + ! inform%status, inform%alloc_status ) !IF ( inform%status /= GALAHAD_ok ) GO TO 990 - CALL SPACE_resize_array( nlp%m_a, data%AXplusSc, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( nlp%m_a, data%AXplusSc, & + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 - CALL SPACE_resize_array( nlp%m_a, data%AxSp, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( nlp%m_a, data%AxSp, & + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 - CALL SPACE_resize_array( nlp%m_a, data%AxSc, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( nlp%m_a, data%AxSc, & + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 - CALL SPACE_resize_array( nlp%m_a, data%AxSac, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( nlp%m_a, data%AxSac, & + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 - CALL SPACE_resize_array( nlp%m_a, data%AxSs, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( nlp%m_a, data%AxSs, & + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 - CALL SPACE_resize_array( nlp%m_a, data%Apos, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( nlp%m_a, data%Apos, & + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 - CALL SPACE_resize_array( nlp%m_a, data%Aneg, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( nlp%m_a, data%Aneg, & + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 - CALL SPACE_resize_array( nlp%m_a, data%Ya_seqp, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( nlp%m_a, data%Ya_seqp, & + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 - !CALL SPACE_resize_array( nlp%n, data%Atv, inform%status, inform%alloc_status ) + !CALL SPACE_resize_array( nlp%n, data%Atv, & + ! inform%status, inform%alloc_status ) !IF ( inform%status /= GALAHAD_ok ) GO TO 990 - CALL SPACE_resize_array( nlp%n, data%G_prev, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( nlp%n, data%G_prev, & + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 - CALL SPACE_resize_array( nlp%n, data%AtYa, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( nlp%n, data%AtYa, & + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 - CALL SPACE_resize_array( nlp%n, data%AtYa_cur, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( nlp%n, data%AtYa_cur, & + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 - CALL SPACE_resize_array( nlp%n, data%AtYa_p, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( nlp%n, data%AtYa_p, & + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 - CALL SPACE_resize_array( nlp%n, data%AtYa_s, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( nlp%n, data%AtYa_s, & + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 - !CALL SPACE_resize_array( nlp%n, data%Atv_cur, inform%status, inform%alloc_status ) + !CALL SPACE_resize_array( nlp%n, data%Atv_cur, & + ! inform%status, inform%alloc_status ) !IF ( inform%status /= GALAHAD_ok ) GO TO 990 - !CALL SPACE_resize_array( nlp%n, data%Atv_p, inform%status, inform%alloc_status ) + !CALL SPACE_resize_array( nlp%n, data%Atv_p, & + ! inform%status, inform%alloc_status ) !IF ( inform%status /= GALAHAD_ok ) GO TO 990 - !CALL SPACE_resize_array( nlp%n, data%Atv_s, inform%status, inform%alloc_status ) + !CALL SPACE_resize_array( nlp%n, data%Atv_s, & + ! inform%status, inform%alloc_status ) !IF ( inform%status /= GALAHAD_ok ) GO TO 990 - !CALL SPACE_resize_array( nlp%n, data%Atv2, inform%status, inform%alloc_status ) + !CALL SPACE_resize_array( nlp%n, data%Atv2, & + ! inform%status, inform%alloc_status ) !IF ( inform%status /= GALAHAD_ok ) GO TO 990 - !CALL SPACE_resize_array( nlp%n, data%Atv3, inform%status, inform%alloc_status ) + !CALL SPACE_resize_array( nlp%n, data%Atv3, & + ! inform%status, inform%alloc_status ) !IF ( inform%status /= GALAHAD_ok ) GO TO 990 - CALL SPACE_resize_array( nlp%m_a, data%A_type, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( nlp%m_a, data%A_type, & + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 - CALL SPACE_resize_array( nlp%m_a, data%A_RES_l, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( nlp%m_a, data%A_RES_l, & + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 - CALL SPACE_resize_array( nlp%m_a, data%A_RES_u, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( nlp%m_a, data%A_RES_u, & + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 - CALL SPACE_resize_array( nlp%m_a, data%cauchy_Y_a, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( nlp%m_a, data%cauchy_Y_a, & + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 if ( data%control%NM_steps > 0 ) then - CALL SPACE_resize_array( nlp%n, data%revert%G_revert, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( nlp%n, data%revert%G_revert, & + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 - CALL SPACE_resize_array( nlp%n, data%revert%X_revert, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( nlp%n, data%revert%X_revert, & + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 - CALL SPACE_resize_array( nlp%n, data%revert%Z_revert, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( nlp%n, data%revert%Z_revert, & + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 - CALL SPACE_resize_array( nlp%m, data%revert%C_revert, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( nlp%m, data%revert%C_revert, & + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 - CALL SPACE_resize_array( nlp%m, data%revert%Y_revert, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( nlp%m, data%revert%Y_revert, & + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 - CALL SPACE_resize_array( nlp%m_a, data%revert%Ax_revert, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( nlp%m_a, data%revert%Ax_revert, & + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 - CALL SPACE_resize_array( nlp%m_a, data%revert%Y_a_revert, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( nlp%m_a, data%revert%Y_a_revert, & + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 - CALL SPACE_resize_array( nlp%m, data%revert%C_RES_l_revert, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( nlp%m, data%revert%C_RES_l_revert, & + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 - CALL SPACE_resize_array( nlp%m, data%revert%C_RES_u_revert, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( nlp%m, data%revert%C_RES_u_revert, & + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 - CALL SPACE_resize_array( nlp%m_a, data%revert%A_RES_l_revert, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( nlp%m_a, data%revert%A_RES_l_revert, & + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 - CALL SPACE_resize_array( nlp%m_a, data%revert%A_RES_u_revert, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( nlp%m_a, data%revert%A_RES_u_revert, & + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 - CALL SPACE_resize_array( nlp%n, data%revert%X_RES_l_revert, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( nlp%n, data%revert%X_RES_l_revert, & + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 - CALL SPACE_resize_array( nlp%n, data%revert%X_RES_u_revert, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( nlp%n, data%revert%X_RES_u_revert, & + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 end if @@ -2220,8 +2290,10 @@ END SUBROUTINE eval_HL out, control%error, symmetric=.true. ) if ( data%control%B_type == 2 ) then do i = 1, nLMV - data%BxSp = data%BxSp - dot_product(data%s_p, data%L_BFGS%A( :, nLMV )) * data%L_BFGS%A( :, nLMV ) - data%BxSp = data%BxSp + dot_product(data%s_p, data%L_BFGS%B( :, nLMV )) * data%L_BFGS%B( :, nLMV ) + data%BxSp = data%BxSp - dot_product(data%s_p, & + data%L_BFGS%A( :, nLMV )) * data%L_BFGS%A( :, nLMV ) + data%BxSp = data%BxSp + dot_product(data%s_p, & + data%L_BFGS%B( :, nLMV )) * data%L_BFGS%B( :, nLMV ) end do end if data%Sp_B_Sp = DOT_PRODUCT( data%BxSp, data%s_p ) ! s_p^T B s_p @@ -2231,13 +2303,16 @@ END SUBROUTINE eval_HL data%decreaseB = data%decreaseB - half * data%Sp_B_Sp ! Compute decrease in SMOOTH convex model. - data%decreaseB_smooth = -DOT_PRODUCT(nlp%G,data%s_p) - half * data%Sp_B_Sp + data%decreaseB_smooth = -DOT_PRODUCT(nlp%G,data%s_p) & + - half * data%Sp_B_Sp if ( nlp%m > 0 ) then dummy_real = zero do i = 1, m - dummy_real = data%u_in(i) + data%v_in(i) - data%QPpred%X(n+i) - data%QPpred%X(n+m+i) + dummy_real = data%u_in(i) + data%v_in(i) & + - data%QPpred%X(n+i) - data%QPpred%X(n+m+i) end do - data%decreaseB_smooth = data%decreaseB_smooth + data%penalty*dummy_real + data%decreaseB_smooth = data%decreaseB_smooth & + + data%penalty*dummy_real end if if ( data%control%print_level >= GALAHAD_DEBUG ) then @@ -2269,8 +2344,10 @@ END SUBROUTINE eval_HL out, control%error, transpose=.false. ) end if - if ( inform%QPpred_inform%status /= GALAHAD_OK .or. data%decreaseB < - tenm5 ) then - write(*,*) 'WARNING : trimsqp : entered the --Catch-- bad predictor.' + if ( inform%QPpred_inform%status /= GALAHAD_OK .or. & + data%decreaseB < - tenm5 ) then + write(*,*) 'WARNING : trimsqp : entered the --Catch', & + ' -- bad predictor.' write(*,*) 'Predictor status = ', inform%QPpred_inform%status write(*,*) 'decreaseB = ', data%decreaseB return @@ -2304,7 +2381,8 @@ END SUBROUTINE eval_HL if ( inform%QPpred_inform%status /= GALAHAD_OK ) then - write(out,*) ' QPpred : returned status ', inform%QPpred_inform%status + write(out,*) ' QPpred : returned status ', & + inform%QPpred_inform%status GO TO 999 end if @@ -2321,10 +2399,10 @@ END SUBROUTINE eval_HL !!$ call mop_Ax( one, nlp%J, data%s_p, one, data%JxSp, & !!$ out, control%error, transpose=.false. ) !!$ data%CplusJxSp = nlp%C + data%JxSp -!!$ call constraint_violation(nlp, data%CplusJxSp, data, & -!!$ data%norm_c_linearize_pred, inform%status, & -!!$ data%sat, data%vl_l, data%vl_u, & -!!$ data%num_sat, data%num_vl_l, data%num_vl_u ) +!!$ call constraint_violation(nlp, data%CplusJxSp, data, & +!!$ data%norm_c_linearize_pred, inform%status, & +!!$ data%sat, data%vl_l, data%vl_u, & +!!$ data%num_sat, data%num_vl_l, data%num_vl_u ) !!$ !!$ end if !!$ @@ -2397,7 +2475,8 @@ END SUBROUTINE eval_HL data%control%QPsteer_control, inform%QPsteer_inform) if ( inform%QPsteer_inform%status /= GALAHAD_ok ) then - write(out,*) ' QPsteer : returned status ', inform%QPsteer_inform%status + write(out,*) ' QPsteer : returned status ', & + inform%QPsteer_inform%status GO TO 999 end if @@ -2424,7 +2503,8 @@ END SUBROUTINE eval_HL ! data%steering_good = .false. ! data%penalty = min(data%control%penalty_expansion*data%penalty, data%control%max_penalty ) ! elseif ( data%dec_norm_c_pred >= data%steer_L_factor * data%dec_norm_c_steer ) then - if ( data%dec_norm_c_pred >= data%steer_L_factor * data%dec_norm_c_steer ) then + if ( data%dec_norm_c_pred >= & + data%steer_L_factor * data%dec_norm_c_steer ) then !if ( .true. ) then data%steering_good = .true. !else @@ -2438,7 +2518,8 @@ END SUBROUTINE eval_HL end if if ( data%steering_good ) then - if ( data%decreaseB >= data%steer_Q_factor * data%penalty * data%dec_norm_c_pred .or. & + if ( data%decreaseB >= & + data%steer_Q_factor * data%penalty * data%dec_norm_c_pred .or. & abs(data%decreaseB) <= tenm6 ) then ! relax...steering is already good. else @@ -2485,7 +2566,8 @@ END SUBROUTINE eval_HL end do data%iterates_pred = inform%QPpred_inform%QPA_inform%major_iter - data%iterates_pred = data%iterates_pred + inform%QPpred_inform%QPB_inform%iter + data%iterates_pred = data%iterates_pred & + +inform%QPpred_inform%QPB_inform%iter !!$ ! Compute decrease in CONVEX model. !!$ ! ********************************* @@ -2594,7 +2676,8 @@ END SUBROUTINE eval_HL data%decreaseH_pred = data%decreaseH_pred - half * data%Sp_H_Sp if ( data%control%print_level >= GALAHAD_DEBUG ) then - write( data%control%out, 3065 ) data%two_norm_s_p, data%gts_pred, data%Sp_H_Sp + write( data%control%out, 3065 ) data%two_norm_s_p, & + data%gts_pred, data%Sp_H_Sp end if ! Call subroutine get_cauchy_step if needed. @@ -2625,7 +2708,8 @@ END SUBROUTINE eval_HL write(out,*) 'C = ', nlp%C write(out,*) 'Js_p = ', data%JxSp else - print_1line = .false. ; print_detail = .false. ; print_debug = .false. + print_1line = .false. ; print_detail = .false. + print_debug = .false. end if call get_cauchy_step( nlp%m, data%C_type, & @@ -2677,14 +2761,18 @@ END SUBROUTINE eval_HL data%Sc_H_Sc = DOT_PRODUCT( data%HxSc, data%s_c ) ! s_c^T H s_c - data%decreaseH_cauchy = data%penalty * ( data%norm_c - data%norm_c_linearize_cauchy ) - data%decreaseH_cauchy = data%decreaseH_cauchy - DOT_PRODUCT( nlp%G, data%s_c ) + data%decreaseH_cauchy = data%penalty & + * ( data%norm_c - data%norm_c_linearize_cauchy ) + data%decreaseH_cauchy = data%decreaseH_cauchy & + - DOT_PRODUCT( nlp%G, data%s_c ) data%decreaseH_cauchy = data%decreaseH_cauchy - half * data%Sc_H_Sc if ( data%control%print_level >= GALAHAD_DEBUG ) then - write(out, 3067) data%norm_c, data%norm_c_linearize_cauchy, & - data%decreaseH_cauchy, data%num_sat, data%num_vl_l, data%num_vl_u - write(out,'(3(3x, I7, 13x) )') (data%sat(i), data%vl_l(i), data%vl_u(i), i = 1, m) + write(out, 3067) data%norm_c, data%norm_c_linearize_cauchy, & + data%decreaseH_cauchy, data%num_sat, & + data%num_vl_l, data%num_vl_u + write(out,'(3(3x, I7, 13x) )') & + (data%sat(i), data%vl_l(i), data%vl_u(i), i = 1, m) end if ! Possibly solve for SQP step s_s. @@ -2705,14 +2793,16 @@ END SUBROUTINE eval_HL data%seqp_computed = .false. - if (data%sqp_computed .and. data%norm_c_linearize_pred < tenm7 .and. data%control%use_seqp) then + if (data%sqp_computed .and. data%norm_c_linearize_pred < tenm7 .and. & + data%control%use_seqp) then ! Compute SEQP step. ! ***************** data%seqp_computed = .true. - data%TRsqp = max( data%control%TRsqp_scale * data%TRpred, data%min_TRsqp ) + data%TRsqp = max( data%control%TRsqp_scale * data%TRpred, & + data%min_TRsqp ) ! Compute approximate Cauchy point. ! ********************************* @@ -2753,10 +2843,12 @@ END SUBROUTINE eval_HL ! write(*,*) 'A_m =', data%QPseqp%A%m ! write(*,*) 'A_n =', data%QPseqp%A%n - call EQP_solve( data%QPseqp, data%QPseqp_data, data%control%QPseqp_control, inform%QPseqp_inform ) + call EQP_solve( data%QPseqp, data%QPseqp_data, & + data%control%QPseqp_control, inform%QPseqp_inform ) if ( inform%QPseqp_inform%status /= GALAHAD_OK ) then - write(out,*) ' TRIMSQP : qp_seqp status = ', inform%QPseqp_inform%status + write(out,*) ' TRIMSQP : qp_seqp status = ', & + inform%QPseqp_inform%status go to 999 end if @@ -2771,10 +2863,13 @@ END SUBROUTINE eval_HL data%Y_seqp( data%wJ( : data%nwJ) ) = data%QPseqp%Y( : data%nwJ ) data%Ya_seqp = zero - data%Ya_seqp( data%wA( : data%nwA) ) = data%QPseqp%Y( data%nwJ + 1 : data%nwJ + data%nwA ) + data%Ya_seqp( data%wA( : data%nwA) ) & + = data%QPseqp%Y( data%nwJ + 1 : data%nwJ + data%nwA ) data%Z_seqp = zero - data%Z_seqp( data%fx( : data%nfx) ) = data%QPseqp%Y( data%nwJ + data%nwA + 1 : data%nwJ + data%nwA + data%nfx ) + data%Z_seqp( data%fx( : data%nfx) ) & + = data%QPseqp%Y( data%nwJ + data%nwA + 1 : & + data%nwJ + data%nwA + data%nfx ) if (nlp%m > 0 ) then data%inf_norm_Y_s = maxval( abs(data%QPseqp%Y( : data%nwJ )) ) @@ -2801,7 +2896,8 @@ END SUBROUTINE eval_HL out, data%control%error, symmetric=.true. ) data%Ss_H_Ss = DOT_PRODUCT( data%HxSs, data%s_s ) - data%alpha_feas = max_feas_step( nlp, data, data%X_type, data%A_type, data%C_type ) + data%alpha_feas = max_feas_step( nlp, data, data%X_type, & + data%A_type, data%C_type ) ! The full step s_f. @@ -2842,13 +2938,15 @@ END SUBROUTINE eval_HL write( out, * ) 'alpha_feas = ', data%alpha_feas if ( data%seqp_use_pred ) then write( out, * ) 'HxS_p = ', data%HxSp - write( out, * ) 'X+S_p+alpha*S_s = ', nlp%X + data%s_p + data%alpha_feas*data%s_s + write( out, * ) 'X+S_p+alpha*S_s = ', & + nlp%X + data%s_p + data%alpha_feas*data%s_s write( out, * ) 'g+HxSp = ', nlp%G + data%HxSp dummy_real = DOT_PRODUCT( nlp%G + data%HxSp, data%s_s ) write( out, * ) '(g+HxSp)^T s_s = ', dummy_real else write( out, * ) 'HxS_ac = ', data%HxSac - write( out, * ) 'X+S_ac+alpha*S_s = ', nlp%X + data%s_ac + data%alpha_feas*data%s_s + write( out, * ) 'X+S_ac+alpha*S_s = ', & + nlp%X + data%s_ac + data%alpha_feas*data%s_s write( out, * ) 'g+HxSac = ', nlp%G + data%HxSac dummy_real = DOT_PRODUCT( nlp%G + data%HxSac, data%s_s ) write( out, * ) '(g+HxSac)^T s_s = ', dummy_real @@ -2883,7 +2981,8 @@ END SUBROUTINE eval_HL data%alpha_feas = -one - data%TRsqp = max( data%control%TRsqp_scale * data%TRpred, data%min_TRsqp ) + data%TRsqp = max( data%control%TRsqp_scale * data%TRpred, & + data%min_TRsqp ) ! Get A*s_c @@ -2959,13 +3058,15 @@ END SUBROUTINE eval_HL data%control%QPsiqp_control, inform%QPsiqp_inform ) if ( inform%QPsiqp_inform%status /= GALAHAD_OK ) then - write(out,*) 'TRIMSQP : QPsiqp status = ', inform%QPsiqp_inform%status + write(out,*) 'TRIMSQP : QPsiqp status = ', & + inform%QPsiqp_inform%status GO TO 999 end if qpc_successful = .true. data%iterates_sqp = inform%QPsiqp_inform%QPA_inform%major_iter - data%iterates_sqp = data%iterates_sqp + inform%QPsiqp_inform%QPB_inform%iter + data%iterates_sqp = data%iterates_sqp & + + inform%QPsiqp_inform%QPB_inform%iter end do @@ -2996,14 +3097,20 @@ END SUBROUTINE eval_HL ! J multipliers - data%QPsiqp%Y( data%vl_l(:data%num_vl_l) ) = data%QPsiqp%Y( data%vl_l(:data%num_vl_l) ) - data%penalty * dummy_real - data%QPsiqp%Y( data%vl_u(:data%num_vl_u) ) = data%QPsiqp%Y( data%vl_u(:data%num_vl_u) ) + data%penalty * dummy_real - data%QPsiqp%Y( : nlp%m ) = data%QPsiqp%Y( : nlp%m ) / ( one - dummy_real ) + data%QPsiqp%Y( data%vl_l(:data%num_vl_l) ) & + = data%QPsiqp%Y( data%vl_l(:data%num_vl_l) ) & + - data%penalty * dummy_real + data%QPsiqp%Y( data%vl_u(:data%num_vl_u) ) & + = data%QPsiqp%Y( data%vl_u(:data%num_vl_u) ) & + + data%penalty * dummy_real + data%QPsiqp%Y( : nlp%m ) & + = data%QPsiqp%Y( : nlp%m ) / ( one - dummy_real ) ! A and Z multipliers - data%QPsiqp%Y(m+1:m+m_a) = data%QPsiqp%Y(m+1:m+m_a) / (one - dummy_real) - data%QPsiqp%Z = data%QPsiqp%Z / (one - dummy_real) + data%QPsiqp%Y(m+1:m+m_a) & + = data%QPsiqp%Y(m+1:m+m_a) / (one - dummy_real) + data%QPsiqp%Z = data%QPsiqp%Z / (one - dummy_real) end if @@ -3049,7 +3156,8 @@ END SUBROUTINE eval_HL data%Sf_H_Sf = DOT_PRODUCT( data%HxSf, data%s_f ) ! s_f^T H s_f - data%decreaseH_full = data%penalty * (data%norm_c - data%norm_c_linearize_full) + data%decreaseH_full = data%penalty & + * (data%norm_c - data%norm_c_linearize_full) data%decreaseH_full = data%decreaseH_full - DOT_PRODUCT(nlp%G, data%s_f) data%decreaseH_full = data%decreaseH_full - half * data%Sf_H_sf @@ -3453,14 +3561,18 @@ END SUBROUTINE eval_HL IF ( data%control%print_sol ) THEN IF( data%control%fulsol ) then WRITE( data%control%out, "( ' X', / ( 3ES24.16 ) )" ) nlp%X - IF ( nlp%m > 0 ) WRITE( data%control%out, "( ' Y ', / ( 3ES24.16 ) )" ) nlp%Y - IF ( nlp%m_a> 0 ) WRITE( data%control%out, "( ' Y_a', / ( 3ES24.16 ) )" ) nlp%Y_a + IF ( nlp%m > 0 ) & + WRITE( data%control%out, "( ' Y ', / ( 3ES24.16 ) )" ) nlp%Y + IF ( nlp%m_a> 0 ) & + WRITE( data%control%out, "( ' Y_a', / ( 3ES24.16 ) )" ) nlp%Y_a WRITE( data%control%out, "( ' Z', / ( 3ES24.16 ) )" ) nlp%Z ELSE write(*,*) 'trimsqp : not yet implemented - 100' WRITE( data%control%out, "( ' X', / ( 3ES24.16 ) )" ) nlp%X - IF ( nlp%m > 0 ) WRITE( data%control%out, "( ' Y', / ( 3ES24.16 ) )" ) nlp%Y - IF ( nlp%m_a> 0 ) WRITE( data%control%out, "( ' Y_a', / ( 3ES24.16 ) )" ) nlp%Y_a + IF ( nlp%m > 0 ) & + WRITE( data%control%out, "( ' Y', / ( 3ES24.16 ) )" ) nlp%Y + IF ( nlp%m_a> 0 ) & + WRITE( data%control%out, "( ' Y_a', / ( 3ES24.16 ) )" ) nlp%Y_a WRITE( data%control%out, "( ' Z', / ( 3ES24.16 ) )" ) nlp%Z END IF END IF @@ -3490,26 +3602,26 @@ END SUBROUTINE eval_HL STATUS = 'NEW', IOSTAT = iores ) END IF IF ( iores /= 0 ) THEN - WRITE( data%control%out, "( ' IOSTAT = ', I6, ' when opening file ', A9 )" ) & + WRITE( data%control%out, "( ' IOSTAT = ', I6, ' when opening file ', A )")& iores, sfilename RETURN END IF - WRITE( sfiledevice, "( '* TRIMSQP solution for problem name: ', A8 )" ) & + WRITE( sfiledevice, "( '* TRIMSQP solution for problem name: ', A )" ) & nlp%pname WRITE( sfiledevice, "( /, '* variables ', / )" ) DO i = 1, nlp%n - WRITE( sfiledevice, "( ' Solution ', A10, ES12.5 )" ) & + WRITE( sfiledevice, "( ' Solution ', A10, ES12.5 )" ) & nlp%VNAMES( i ), nlp%X( i ) END DO - WRITE( sfiledevice, "( /, '* Lagrange multipliers - general constraints ', / )" ) + WRITE( sfiledevice,"( /, '* Lagrange multipliers - general constraints',/)") DO i = 1, nlp%m - WRITE( sfiledevice, "( ' M-gen Solution ', A10, ES12.5 )" ) & + WRITE( sfiledevice, "( ' M-gen Solution ', A10, ES12.5 )" ) & nlp%CNAMES( i ), nlp%Y( i ) END DO - WRITE( sfiledevice, "( /, '* Lagrange multipliers - linear constraints ', / )" ) + WRITE( sfiledevice, "( /, '* Lagrange multipliers - linear constraints',/)") DO i = 1, nlp%m_a - WRITE( sfiledevice, "( ' M-lin Solution ', A10, ES12.5 )" ) & + WRITE( sfiledevice, "( ' M-lin Solution ', A10, ES12.5 )" ) & nlp%ANAMES( i ), nlp%Y_a( i ) END DO WRITE( sfiledevice, "( /, ' XL Solution ', 10X, ES12.5 )" ) nlp%f @@ -3524,7 +3636,8 @@ END SUBROUTINE eval_HL STOP 991 CONTINUE - WRITE( data%control%out, "( ' TRIMSQP: error closing file. iores = ', I0 )" ) iores + WRITE( data%control%out, & + "( ' TRIMSQP: error closing file. iores = ', I0 )" ) iores STOP 992 CONTINUE @@ -3557,15 +3670,15 @@ END SUBROUTINE eval_HL 1x, (93('=')) ) !1002 FORMAT( /, & -! ' Iterate Penalty Merit Primal_vl Dual_vl ',& -! ' Comp_Slack TRpred TRsqp |c(x)|_1 C_forcing',& -! ' FOO Penalty' ) -!1003 FORMAT(3X, I5, 2X, ES8.2, 2X, ES19.12, 3(2X, ES15.9), 2(2X, ES8.2), & +! ' Iterate Penalty Merit Primal_vl Dual_vl ',& +! ' Comp_Slack TRpred TRsqp |c(x)|_1 C_forcing',& +! ' FOO Penalty' ) +!1003 FORMAT(3X, I5, 2X, ES8.2, 2X, ES19.12, 3(2X, ES15.9), 2(2X, ES8.2), & ! 2( 2X, ES15.9), 2X, L3, 2x, A8 ) !1004 FORMAT( /, & ! ' approx_B iter_p inf_norm_s_p alpha ', & -! 'decrease_cauchy sqp iter_s inf_norm_s_s descent decrease_full ', & -! ' ratio accept success' ) +! 'decrease_cauchy sqp iter_s inf_norm_s_s descent ', & + ' decrease_full ratio accept success' ) !1005 FORMAT(T11, A, 2X, I7, 2X, ES13.6, 2X, ES12.6, 2X, ES19.12, & ! 2X, A3, 2X, I7, 4X, ES13.6, 2X, A4, 5X, ES19.12, & ! 2X, ES9.2, 2X, A3, 5X, A7, / ) @@ -3729,10 +3842,11 @@ END SUBROUTINE eval_HL 1x, ' ------- ------- -------' ) 3068 format( 1x, '-- full step : (c_norm, c_linearize_norm) =', 2(2x, ES15.9 ) ) !3069 format( 1x, '-- recomputing merit function at new penalty value.' ) -3070 format( 1x, '-- full step computed and gives good decrease. GOOD!', /, & +3070 format( 1x, '-- full step computed and gives good decrease. GOOD!', /, & 1x, '(fnew, cnew_vl) =', 2(2x, ES16.9 ), /, & 1x, '(decrease cauchy, decrease full) =', 2(2x, ES16.9) ) -3071 format( 1x, '(c_norm, c_linearize_norm, dec_con_vl_s_p ) =', 3(2x, ES16.9 ), /, & +3071 format( 1x, '(c_norm, c_linearize_norm, dec_con_vl_s_p ) =', & + 3(2x, ES16.9 ), /, & 1x, 'decrease in CONVEX model at predictor point = ', ES16.9 ) !3072 format( 1x, '(c_norm, con_viol_s_steer, dec_con_vl_s_steer ) =', 3(2x, ES15.9 ) ) @@ -3787,7 +3901,7 @@ SUBROUTINE TRIMSQP_terminate( data, control, inform ) ! Deallocate arrays set for feasibility LP and steering LP. - CALL LSQP_terminate( data%QPfeas_data, control%QPfeas_control, & + CALL LSQP_terminate( data%QPfeas_data, control%QPfeas_control, & inform%QPfeas_inform ) IF ( inform%QPfeas_inform%status /= GALAHAD_ok ) THEN inform%status = GALAHAD_error_deallocate @@ -3796,7 +3910,7 @@ SUBROUTINE TRIMSQP_terminate( data, control, inform ) IF ( control%deallocate_error_fatal ) RETURN END IF -!!$ CALL LSQP_terminate( data%QPsteer_data, control%QPsteer_control, & +!!$ CALL LSQP_terminate( data%QPsteer_data, control%QPsteer_control, & !!$ inform%QPsteer_inform ) !!$ IF ( inform%QPsteer_inform%status /= GALAHAD_ok ) THEN !!$ inform%status = GALAHAD_error_deallocate @@ -3807,7 +3921,7 @@ SUBROUTINE TRIMSQP_terminate( data, control, inform ) ! Deallocate arrays set for QPC - CALL QPC_terminate( data%QPsteer_data, control%QPsteer_control, & + CALL QPC_terminate( data%QPsteer_data, control%QPsteer_control, & inform%QPsteer_inform ) IF ( inform%QPsteer_inform%status /= GALAHAD_ok ) THEN inform%status = GALAHAD_error_deallocate @@ -3816,7 +3930,7 @@ SUBROUTINE TRIMSQP_terminate( data, control, inform ) IF ( control%deallocate_error_fatal ) RETURN END IF - CALL QPC_terminate( data%QPpred_data, control%QPpred_control, & + CALL QPC_terminate( data%QPpred_data, control%QPpred_control, & inform%QPpred_inform ) IF ( inform%QPpred_inform%status /= GALAHAD_ok ) THEN inform%status = GALAHAD_error_deallocate @@ -3825,7 +3939,7 @@ SUBROUTINE TRIMSQP_terminate( data, control, inform ) IF ( control%deallocate_error_fatal ) RETURN END IF - CALL QPC_terminate( data%QPsiqp_data, control%QPsiqp_control, & + CALL QPC_terminate( data%QPsiqp_data, control%QPsiqp_control, & inform%QPsiqp_inform ) IF ( inform%QPsiqp_inform%status /= GALAHAD_ok ) THEN inform%status = GALAHAD_error_deallocate @@ -3848,50 +3962,50 @@ SUBROUTINE TRIMSQP_terminate( data, control, inform ) ! Deallocate all remaining allocated arrays !array_name = 'trimSQP: data%Jv' - !CALL SPACE_dealloc_array( data%Jv, & - ! inform%status, inform%alloc_status, array_name = array_name, & + !CALL SPACE_dealloc_array( data%Jv, & + ! inform%status, inform%alloc_status, array_name = array_name, & ! bad_alloc = inform%bad_alloc, out = control%error ) !IF ( control%deallocate_error_fatal .AND. & ! inform%status /= GALAHAD_ok ) RETURN !array_name = 'trimSQP: data%Jtv' - !CALL SPACE_dealloc_array( data%Jtv, & - ! inform%status, inform%alloc_status, array_name = array_name, & + !CALL SPACE_dealloc_array( data%Jtv, & + ! inform%status, inform%alloc_status, array_name = array_name, & ! bad_alloc = inform%bad_alloc, out = control%error ) !IF ( control%deallocate_error_fatal .AND. & ! inform%status /= GALAHAD_ok ) RETURN !array_name = 'trimSQP: data%Jtv2' - !CALL SPACE_dealloc_array( data%Jtv2, & - ! inform%status, inform%alloc_status, array_name = array_name, & + !CALL SPACE_dealloc_array( data%Jtv2, & + ! inform%status, inform%alloc_status, array_name = array_name, & ! bad_alloc = inform%bad_alloc, out = control%error ) !IF ( control%deallocate_error_fatal .AND. & ! inform%status /= GALAHAD_ok ) RETURN !array_name = 'trimSQP: data%Av' - !CALL SPACE_dealloc_array( data%Av, & - ! inform%status, inform%alloc_status, array_name = array_name, & + !CALL SPACE_dealloc_array( data%Av, & + ! inform%status, inform%alloc_status, array_name = array_name, & ! bad_alloc = inform%bad_alloc, out = control%error ) !IF ( control%deallocate_error_fatal .AND. & ! inform%status /= GALAHAD_ok ) RETURN !array_name = 'trimSQP: data%Atv' - !CALL SPACE_dealloc_array( data%Atv, & - ! inform%status, inform%alloc_status, array_name = array_name, & + !CALL SPACE_dealloc_array( data%Atv, & + ! inform%status, inform%alloc_status, array_name = array_name, & ! bad_alloc = inform%bad_alloc, out = control%error ) !IF ( control%deallocate_error_fatal .AND. & ! inform%status /= GALAHAD_ok ) RETURN !array_name = 'trimSQP: data%Atv2' - !CALL SPACE_dealloc_array( data%Atv2, & - ! inform%status, inform%alloc_status, array_name = array_name, & + !CALL SPACE_dealloc_array( data%Atv2, & + ! inform%status, inform%alloc_status, array_name = array_name, & ! bad_alloc = inform%bad_alloc, out = control%error ) !IF ( control%deallocate_error_fatal .AND. & ! inform%status /= GALAHAD_ok ) RETURN !array_name = 'trimSQP: data%Hv' - !CALL SPACE_dealloc_array( data%Hv, & - ! inform%status, inform%alloc_status, array_name = array_name, & + !CALL SPACE_dealloc_array( data%Hv, & + ! inform%status, inform%alloc_status, array_name = array_name, & ! bad_alloc = inform%bad_alloc, out = control%error ) !IF ( control%deallocate_error_fatal .AND. & ! inform%status /= GALAHAD_ok ) RETURN @@ -4109,34 +4223,44 @@ SUBROUTINE build_QPfeas( nlp, QPfeas, inform, control ) !CALL SPACE_resize_array( QPfeas%n, QPfeas%G, inform%status, inform%alloc_status ) !IF ( inform%status /= 0 ) GO TO 990 - CALL SPACE_resize_array( QPfeas%n, QPfeas%X_l, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( QPfeas%n, QPfeas%X_l, & + inform%status, inform%alloc_status ) IF ( inform%status /= 0 ) GO TO 990 - CALL SPACE_resize_array( QPfeas%n, QPfeas%X, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( QPfeas%n, QPfeas%X, & + inform%status, inform%alloc_status ) IF ( inform%status /= 0 ) GO TO 990 - CALL SPACE_resize_array( QPfeas%n, QPfeas%X0, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( QPfeas%n, QPfeas%X0, & + inform%status, inform%alloc_status ) IF ( inform%status /= 0 ) GO TO 990 - CALL SPACE_resize_array( QPfeas%n, QPfeas%X_u, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( QPfeas%n, QPfeas%X_u, & + inform%status, inform%alloc_status ) IF ( inform%status /= 0 ) GO TO 990 - CALL SPACE_resize_array( QPfeas%n, QPfeas%Z, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( QPfeas%n, QPfeas%Z, & + inform%status, inform%alloc_status ) IF ( inform%status /= 0 ) GO TO 990 - CALL SPACE_resize_array( QPfeas%n, QPfeas%WEIGHT, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( QPfeas%n, QPfeas%WEIGHT, & + inform%status, inform%alloc_status ) IF ( inform%status /= 0 ) GO TO 990 - CALL SPACE_resize_array( QPfeas%m, QPfeas%C_l, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( QPfeas%m, QPfeas%C_l, & + inform%status, inform%alloc_status ) IF ( inform%status /= 0 ) GO TO 990 - CALL SPACE_resize_array( QPfeas%m, QPfeas%C, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( QPfeas%m, QPfeas%C, & + inform%status, inform%alloc_status ) IF ( inform%status /= 0 ) GO TO 990 - CALL SPACE_resize_array( QPfeas%m, QPfeas%C_u, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( QPfeas%m, QPfeas%C_u, & + inform%status, inform%alloc_status ) IF ( inform%status /= 0 ) GO TO 990 - CALL SPACE_resize_array( QPfeas%m, QPfeas%Y, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( QPfeas%m, QPfeas%Y, & + inform%status, inform%alloc_status ) IF ( inform%status /= 0 ) GO TO 990 ! Allocate A: since LSQP does not support all storage types that @@ -4150,11 +4274,14 @@ SUBROUTINE build_QPfeas( nlp, QPfeas, inform, control ) len = nlp%m_a * nlp%n - CALL SPACE_resize_array( len, QPfeas%A%val, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( len, QPfeas%A%val, & + inform%status, inform%alloc_status ) IF ( inform%status /= 0 ) GO TO 990 - CALL SPACE_resize_array( len, QPfeas%A%col, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( len, QPfeas%A%col, & + inform%status, inform%alloc_status ) IF ( inform%status /= 0 ) GO TO 990 - CALL SPACE_resize_array( len, QPfeas%A%row, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( len, QPfeas%A%row, & + inform%status, inform%alloc_status ) IF ( inform%status /= 0 ) GO TO 990 QPfeas%A%ne = len @@ -4163,11 +4290,14 @@ SUBROUTINE build_QPfeas( nlp, QPfeas, inform, control ) len = nlp%A%ne - CALL SPACE_resize_array( len, QPfeas%A%val, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( len, QPfeas%A%val, & + inform%status, inform%alloc_status ) IF ( inform%status /= 0 ) GO TO 990 - CALL SPACE_resize_array( len, QPfeas%A%col, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( len, QPfeas%A%col, & + inform%status, inform%alloc_status ) IF ( inform%status /= 0 ) GO TO 990 - CALL SPACE_resize_array( len, QPfeas%A%row, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( len, QPfeas%A%row, & + inform%status, inform%alloc_status ) IF ( inform%status /= 0 ) GO TO 990 QPfeas%A%ne = len @@ -4176,11 +4306,14 @@ SUBROUTINE build_QPfeas( nlp, QPfeas, inform, control ) len = nlp%A%ptr( nlp%m_a + 1 ) - 1 - CALL SPACE_resize_array( len, QPfeas%A%val, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( len, QPfeas%A%val, & + inform%status, inform%alloc_status ) IF ( inform%status /= 0 ) GO TO 990 - CALL SPACE_resize_array( len, QPfeas%A%col, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( len, QPfeas%A%col, & + inform%status, inform%alloc_status ) IF ( inform%status /= 0 ) GO TO 990 - CALL SPACE_resize_array( len, QPfeas%A%row, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( len, QPfeas%A%row, & + inform%status, inform%alloc_status ) IF ( inform%status /= 0 ) GO TO 990 QPfeas%A%ne = len @@ -4189,11 +4322,14 @@ SUBROUTINE build_QPfeas( nlp, QPfeas, inform, control ) len = nlp%A%ptr( nlp%n + 1 ) - 1 - CALL SPACE_resize_array( len, QPfeas%A%val, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( len, QPfeas%A%val, & + inform%status, inform%alloc_status ) IF ( inform%status /= 0 ) GO TO 990 - CALL SPACE_resize_array( len, QPfeas%A%row, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( len, QPfeas%A%row, & + inform%status, inform%alloc_status ) IF ( inform%status /= 0 ) GO TO 990 - CALL SPACE_resize_array( len, QPfeas%A%col, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( len, QPfeas%A%col, & + inform%status, inform%alloc_status ) IF ( inform%status /= 0 ) GO TO 990 QPfeas%A%ne = len @@ -4278,43 +4414,56 @@ SUBROUTINE build_QPsteer( nlp, QPsteer, inform, control ) ! Allocate components independent of storage type. - CALL SPACE_resize_array( QPsteer%n, QPsteer%G, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( QPsteer%n, QPsteer%G, & + inform%status, inform%alloc_status ) IF ( inform%status /= 0 ) GO TO 990 - CALL SPACE_resize_array( QPsteer%n, QPsteer%X_l, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( QPsteer%n, QPsteer%X_l, & + inform%status, inform%alloc_status ) IF ( inform%status /= 0 ) GO TO 990 - CALL SPACE_resize_array( QPsteer%n, QPsteer%X, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( QPsteer%n, QPsteer%X, & + inform%status, inform%alloc_status ) IF ( inform%status /= 0 ) GO TO 990 - CALL SPACE_resize_array( QPsteer%n, QPsteer%X0, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( QPsteer%n, QPsteer%X0, & + inform%status, inform%alloc_status ) IF ( inform%status /= 0 ) GO TO 990 - CALL SPACE_resize_array( QPsteer%n, QPsteer%X_u, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( QPsteer%n, QPsteer%X_u, & + inform%status, inform%alloc_status ) IF ( inform%status /= 0 ) GO TO 990 - CALL SPACE_resize_array( QPsteer%n, QPsteer%X_status, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( QPsteer%n, QPsteer%X_status, & + inform%status, inform%alloc_status ) IF ( inform%status /= 0 ) GO TO 990 - CALL SPACE_resize_array( QPsteer%n, QPsteer%Z, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( QPsteer%n, QPsteer%Z, & + inform%status, inform%alloc_status ) IF ( inform%status /= 0 ) GO TO 990 - !CALL SPACE_resize_array( QPsteer%n, QPsteer%WEIGHT, inform%status, inform%alloc_status ) + !CALL SPACE_resize_array( QPsteer%n, QPsteer%WEIGHT, & + ! inform%status, inform%alloc_status ) !IF ( inform%status /= 0 ) GO TO 990 - CALL SPACE_resize_array( QPsteer%m, QPsteer%C_l, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( QPsteer%m, QPsteer%C_l, & + inform%status, inform%alloc_status ) IF ( inform%status /= 0 ) GO TO 990 - CALL SPACE_resize_array( QPsteer%m, QPsteer%C, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( QPsteer%m, QPsteer%C, & + inform%status, inform%alloc_status ) IF ( inform%status /= 0 ) GO TO 990 - CALL SPACE_resize_array( QPsteer%m, QPsteer%C_status, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( QPsteer%m, QPsteer%C_status, & + inform%status, inform%alloc_status ) IF ( inform%status /= 0 ) GO TO 990 - CALL SPACE_resize_array( QPsteer%m, QPsteer%C_u, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( QPsteer%m, QPsteer%C_u, & + inform%status, inform%alloc_status ) IF ( inform%status /= 0 ) GO TO 990 - CALL SPACE_resize_array( QPsteer%m, QPsteer%Y, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( QPsteer%m, QPsteer%Y, & + inform%status, inform%alloc_status ) IF ( inform%status /= 0 ) GO TO 990 ! Allocate A: since LSQP does not support all storage types that @@ -4328,11 +4477,14 @@ SUBROUTINE build_QPsteer( nlp, QPsteer, inform, control ) len = nlp%m_a * nlp%n - CALL SPACE_resize_array( len, QPsteer%A%val, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( len, QPsteer%A%val, & + inform%status, inform%alloc_status ) IF ( inform%status /= 0 ) GO TO 990 - CALL SPACE_resize_array( len, QPsteer%A%col, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( len, QPsteer%A%col, & + inform%status, inform%alloc_status ) IF ( inform%status /= 0 ) GO TO 990 - CALL SPACE_resize_array( len, QPsteer%A%row, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( len, QPsteer%A%row, & + inform%status, inform%alloc_status ) IF ( inform%status /= 0 ) GO TO 990 QPsteer%A%ne = len @@ -4341,11 +4493,14 @@ SUBROUTINE build_QPsteer( nlp, QPsteer, inform, control ) len = nlp%A%ne + nlp%J%ne + 2*nlp%m - CALL SPACE_resize_array( len, QPsteer%A%val, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( len, QPsteer%A%val, & + inform%status, inform%alloc_status ) IF ( inform%status /= 0 ) GO TO 990 - CALL SPACE_resize_array( len, QPsteer%A%col, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( len, QPsteer%A%col, & + inform%status, inform%alloc_status ) IF ( inform%status /= 0 ) GO TO 990 - CALL SPACE_resize_array( len, QPsteer%A%row, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( len, QPsteer%A%row, & + inform%status, inform%alloc_status ) IF ( inform%status /= 0 ) GO TO 990 QPsteer%A%ne = len @@ -4354,11 +4509,14 @@ SUBROUTINE build_QPsteer( nlp, QPsteer, inform, control ) len = nlp%A%ptr( nlp%m_a + 1 ) - 1 - CALL SPACE_resize_array( len, QPsteer%A%val, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( len, QPsteer%A%val, & + inform%status, inform%alloc_status ) IF ( inform%status /= 0 ) GO TO 990 - CALL SPACE_resize_array( len, QPsteer%A%col, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( len, QPsteer%A%col, & + inform%status, inform%alloc_status ) IF ( inform%status /= 0 ) GO TO 990 - CALL SPACE_resize_array( len, QPsteer%A%row, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( len, QPsteer%A%row, & + inform%status, inform%alloc_status ) IF ( inform%status /= 0 ) GO TO 990 QPsteer%A%ne = len @@ -4367,11 +4525,14 @@ SUBROUTINE build_QPsteer( nlp, QPsteer, inform, control ) len = nlp%A%ptr( nlp%n + 1 ) - 1 - CALL SPACE_resize_array( len, QPsteer%A%val, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( len, QPsteer%A%val, & + inform%status, inform%alloc_status ) IF ( inform%status /= 0 ) GO TO 990 - CALL SPACE_resize_array( len, QPsteer%A%row, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( len, QPsteer%A%row, & + inform%status, inform%alloc_status ) IF ( inform%status /= 0 ) GO TO 990 - CALL SPACE_resize_array( len, QPsteer%A%col, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( len, QPsteer%A%col, & + inform%status, inform%alloc_status ) IF ( inform%status /= 0 ) GO TO 990 QPsteer%A%ne = len @@ -4385,11 +4546,14 @@ SUBROUTINE build_QPsteer( nlp, QPsteer, inform, control ) call SMT_put( QPsteer%A%type, 'COORDINATE', inform%status ) call SMT_put( QPsteer%H%type, 'COORDINATE', inform%status ) - CALL SPACE_resize_array( 0, QPsteer%H%val, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( 0, QPsteer%H%val, & + inform%status, inform%alloc_status ) IF ( inform%status /= 0 ) GO TO 990 - CALL SPACE_resize_array( 0, QPsteer%H%col, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( 0, QPsteer%H%col, & + inform%status, inform%alloc_status ) IF ( inform%status /= 0 ) GO TO 990 - CALL SPACE_resize_array( 0, QPsteer%H%row, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( 0, QPsteer%H%row, & + inform%status, inform%alloc_status ) IF ( inform%status /= 0 ) GO TO 990 QPsteer%H%ne = 0 @@ -4492,37 +4656,48 @@ SUBROUTINE build_QPpred( nlp, QPpred, inform, data ) QPpred%gradient_kind = 2 - CALL SPACE_resize_array( QPpred%n, QPpred%G, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( QPpred%n, QPpred%G, & + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 - CALL SPACE_resize_array( QPpred%n, QPpred%X_l, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( QPpred%n, QPpred%X_l, & + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 - CALL SPACE_resize_array( QPpred%n, QPpred%X, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( QPpred%n, QPpred%X, & + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 - CALL SPACE_resize_array( QPpred%n, QPpred%X_u, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( QPpred%n, QPpred%X_u, & + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 - CALL SPACE_resize_array( QPpred%n, QPpred%Z, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( QPpred%n, QPpred%Z, & + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 - CALL SPACE_resize_array( QPpred%n, QPpred%X_status, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( QPpred%n, QPpred%X_status, & + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 - CALL SPACE_resize_array( QPpred%m, QPpred%C_l, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( QPpred%m, QPpred%C_l, & + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 - CALL SPACE_resize_array( QPpred%m, QPpred%C, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( QPpred%m, QPpred%C, & + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 - CALL SPACE_resize_array( QPpred%m, QPpred%C_u, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( QPpred%m, QPpred%C_u, & + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 - CALL SPACE_resize_array( QPpred%m, QPpred%C_status, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( QPpred%m, QPpred%C_status, & + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 - CALL SPACE_resize_array( QPpred%m, QPpred%Y, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( QPpred%m, QPpred%Y, & + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 if ( B_type == 2 ) then @@ -4608,11 +4783,14 @@ SUBROUTINE build_QPpred( nlp, QPpred, inform, data ) if ( m_a > 0 ) len = len + nlp%A%ne if ( B_type == 2 ) len = len + 2*(n+1)*L - CALL SPACE_resize_array( len, QPpred%A%val, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( len, QPpred%A%val, & + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 - CALL SPACE_resize_array( len, QPpred%A%col, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( len, QPpred%A%col, & + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 - CALL SPACE_resize_array( len, QPpred%A%row, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( len, QPpred%A%row, & + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 QPpred%A%val = zero @@ -4690,9 +4868,12 @@ SUBROUTINE build_QPpred( nlp, QPpred, inform, data ) len = n*(n+1)/2 call SMT_put( QPpred%H%type, 'COORDINATE', inform%status ) - CALL SPACE_resize_array( len, QPpred%H%val, inform%status, inform%alloc_status ) - CALL SPACE_resize_array( len, QPpred%H%row, inform%status, inform%alloc_status ) - CALL SPACE_resize_array( len, QPpred%H%col, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( len, QPpred%H%val, & + inform%status, inform%alloc_status ) + CALL SPACE_resize_array( len, QPpred%H%row, & + inform%status, inform%alloc_status ) + CALL SPACE_resize_array( len, QPpred%H%col, & + inform%status, inform%alloc_status ) QPpred%H%m = n + 2*m QPpred%H%n = n + 2*m QPpred%H%ne = len @@ -4707,9 +4888,12 @@ SUBROUTINE build_QPpred( nlp, QPpred, inform, data ) end do call SMT_put( data%B%type, 'COORDINATE', inform%status ) - call SPACE_resize_array( len, data%B%val, inform%status, inform%alloc_status ) - call SPACE_resize_array( len, data%B%row, inform%status, inform%alloc_status ) - call SPACE_resize_array( len, data%B%col, inform%status, inform%alloc_status ) + call SPACE_resize_array( len, data%B%val, & + inform%status, inform%alloc_status ) + call SPACE_resize_array( len, data%B%row, & + inform%status, inform%alloc_status ) + call SPACE_resize_array( len, data%B%col, & + inform%status, inform%alloc_status ) data%B%m = n data%B%n = n data%B%ne = len @@ -4718,10 +4902,14 @@ SUBROUTINE build_QPpred( nlp, QPpred, inform, data ) data%B%col = QPpred%H%col data%B%val = QPpred%H%val - CALL SPACE_resize_array( n, data%BFGS%d, inform%status, inform%alloc_status ) - CALL SPACE_resize_array( n, data%BFGS%Bs, inform%status, inform%alloc_status ) - CALL SPACE_resize_array( n, data%BFGS%gradLx, inform%status, inform%alloc_status ) - CALL SPACE_resize_array( n, data%BFGS%gradLx_new, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( n, data%BFGS%d, & + inform%status, inform%alloc_status ) + CALL SPACE_resize_array( n, data%BFGS%Bs, & + inform%status, inform%alloc_status ) + CALL SPACE_resize_array( n, data%BFGS%gradLx, & + inform%status, inform%alloc_status ) + CALL SPACE_resize_array( n, data%BFGS%gradLx_new, & + inform%status, inform%alloc_status ) if ( data%control%NM_steps > 0 ) then ! non-monotone CALL SPACE_resize_array( len, data%revert%Bval_revert, inform%status, inform%alloc_status ) @@ -4737,21 +4925,26 @@ SUBROUTINE build_QPpred( nlp, QPpred, inform, data ) len = n + 2*m if ( B_type == 2 ) then len = len + 2*L - CALL SPACE_resize_array( n, data%L_BFGS%gradLx, inform%status, inform%alloc_status ) - CALL SPACE_resize_array( n, data%L_BFGS%gradLx_new, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( n, data%L_BFGS%gradLx, & + inform%status, inform%alloc_status ) + CALL SPACE_resize_array( n, data%L_BFGS%gradLx_new, & + inform%status, inform%alloc_status ) end if call SMT_put( data%B%type, 'DIAGONAL', inform%status ) - call SPACE_resize_array( n, data%B%val, inform%status, inform%alloc_status ) + call SPACE_resize_array( n, data%B%val, & + inform%status, inform%alloc_status ) data%B%m = n data%B%n = n if ( data%control%NM_steps > 0 ) then ! non-monotone - CALL SPACE_resize_array( n, data%revert%Bval_revert, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( n, data%revert%Bval_revert, & + inform%status, inform%alloc_status ) end if call SMT_put( QPpred%H%type, 'DIAGONAL', inform%status ) - call SPACE_resize_array( len, QPpred%H%val, inform%status, inform%alloc_status ) + call SPACE_resize_array( len, QPpred%H%val, & + inform%status, inform%alloc_status ) QPpred%H%m = len QPpred%H%n = len QPpred%H%ne = len @@ -4789,7 +4982,8 @@ SUBROUTINE build_QPpred( nlp, QPpred, inform, data ) ! Format statements -1000 FORMAT(1X, '** ERROR trimsqp : unrecognized storage type in subroutine build_QPpred.') +1000 FORMAT(1X, '** ERROR trimsqp : unrecognized storage type', & + ' in subroutine build_QPpred.') 1001 FORMAT(1X, '** ERROR trimsqp : allocation error in subroutine', & ' build_QPpred : error= ', I0, ' status= ', I0, '.' ) @@ -4846,37 +5040,48 @@ SUBROUTINE build_QPsiqp( nlp, QPsiqp, inform, data ) ! Allocate components independent of storage type. - CALL SPACE_resize_array( QPsiqp%n, QPsiqp%G, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( QPsiqp%n, QPsiqp%G, & + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 - CALL SPACE_resize_array( QPsiqp%n, QPsiqp%X_l, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( QPsiqp%n, QPsiqp%X_l, & + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 - CALL SPACE_resize_array( QPsiqp%n, QPsiqp%X, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( QPsiqp%n, QPsiqp%X, & + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 - CALL SPACE_resize_array( QPsiqp%n, QPsiqp%X_u, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( QPsiqp%n, QPsiqp%X_u, & + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 - CALL SPACE_resize_array( QPsiqp%n, QPsiqp%Z, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( QPsiqp%n, QPsiqp%Z, & + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 - CALL SPACE_resize_array( QPsiqp%n, QPsiqp%X_status, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( QPsiqp%n, QPsiqp%X_status, & + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 - CALL SPACE_resize_array( QPsiqp%m, QPsiqp%C_l, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( QPsiqp%m, QPsiqp%C_l, & + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 - CALL SPACE_resize_array( QPsiqp%m, QPsiqp%C, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( QPsiqp%m, QPsiqp%C, & + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 - CALL SPACE_resize_array( QPsiqp%m, QPsiqp%C_u, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( QPsiqp%m, QPsiqp%C_u, & + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 - CALL SPACE_resize_array( QPsiqp%m, QPsiqp%C_status, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( QPsiqp%m, QPsiqp%C_status, & + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 - CALL SPACE_resize_array( QPsiqp%m, QPsiqp%Y, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( QPsiqp%m, QPsiqp%Y, & + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 ! Prepare for hot starts. @@ -4910,7 +5115,8 @@ SUBROUTINE build_QPsiqp( nlp, QPsiqp, inform, data ) len = (nlp%m + nlp%m_a + 1) * nlp%n - CALL SPACE_resize_array( len, QPsiqp%A%val, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( len, QPsiqp%A%val, & + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 ! fill needed componenents dependent on sparsity @@ -4936,11 +5142,14 @@ SUBROUTINE build_QPsiqp( nlp, QPsiqp, inform, data ) end if end if - CALL SPACE_resize_array( len, QPsiqp%A%val, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( len, QPsiqp%A%val, & + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 - CALL SPACE_resize_array( len, QPsiqp%A%col, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( len, QPsiqp%A%col, & + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 - CALL SPACE_resize_array( len, QPsiqp%A%row, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( len, QPsiqp%A%row, & + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 QPsiqp%A%ne = len @@ -4986,11 +5195,14 @@ SUBROUTINE build_QPsiqp( nlp, QPsiqp, inform, data ) len = nlp%J%ptr( nlp%m + 1 ) + nlp%A%ptr( nlp%m_a + 1 ) - 2 + nlp%n - CALL SPACE_resize_array( len, QPsiqp%A%val, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( len, QPsiqp%A%val, & + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 - CALL SPACE_resize_array( len, QPsiqp%A%col, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( len, QPsiqp%A%col, & + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 - CALL SPACE_resize_array( nlp%m + nlp%m_a + 2, QPsiqp%A%ptr, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( nlp%m + nlp%m_a + 2, QPsiqp%A%ptr, & + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 ! fill needed componenents dependent on sparsity @@ -5035,11 +5247,14 @@ SUBROUTINE build_QPsiqp( nlp, QPsiqp, inform, data ) len = nlp%J%ptr( nlp%n + 1 ) + nlp%A%ptr( nlp%n + 1 ) - 2 + nlp%n - CALL SPACE_resize_array( len, QPsiqp%A%val, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( len, QPsiqp%A%val, & + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 - CALL SPACE_resize_array( len, QPsiqp%A%row, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( len, QPsiqp%A%row, & + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 - CALL SPACE_resize_array( nlp%n + 1, QPsiqp%A%ptr, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( nlp%n + 1, QPsiqp%A%ptr, & + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 ! fill needed componenents dependent on sparsity @@ -5097,7 +5312,8 @@ SUBROUTINE build_QPsiqp( nlp, QPsiqp, inform, data ) len = size( nlp%H%val ) - CALL SPACE_resize_array( len, QPsiqp%H%val, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( len, QPsiqp%H%val, & + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 ! fill needed componenents dependent on sparsity @@ -5112,11 +5328,14 @@ SUBROUTINE build_QPsiqp( nlp, QPsiqp, inform, data ) len = nlp%H%ne - CALL SPACE_resize_array( len, QPsiqp%H%val, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( len, QPsiqp%H%val, & + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 - CALL SPACE_resize_array( len, QPsiqp%H%col, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( len, QPsiqp%H%col, & + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 - CALL SPACE_resize_array( len, QPsiqp%H%row, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( len, QPsiqp%H%row, & + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 ! fill needed componenents dependent on sparsity @@ -5136,11 +5355,14 @@ SUBROUTINE build_QPsiqp( nlp, QPsiqp, inform, data ) len = nlp%H%ptr(nlp%n+1) - 1 - CALL SPACE_resize_array( len, QPsiqp%H%val, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( len, QPsiqp%H%val, & + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 - CALL SPACE_resize_array( len, QPsiqp%H%col, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( len, QPsiqp%H%col, & + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 - CALL SPACE_resize_array( nlp%n + 1, QPsiqp%H%ptr, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( nlp%n + 1, QPsiqp%H%ptr, & + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 ! fill needed componenents dependent on sparsity @@ -5158,11 +5380,14 @@ SUBROUTINE build_QPsiqp( nlp, QPsiqp, inform, data ) len = nlp%H%ptr(nlp%n+1) - 1 - CALL SPACE_resize_array( len, QPsiqp%H%val, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( len, QPsiqp%H%val, & + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 - CALL SPACE_resize_array( len, QPsiqp%H%row, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( len, QPsiqp%H%row, & + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 - CALL SPACE_resize_array( nlp%n + 1, QPsiqp%H%ptr, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( nlp%n + 1, QPsiqp%H%ptr, & + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 ! fill needed componenents dependent on sparsity @@ -5180,7 +5405,8 @@ SUBROUTINE build_QPsiqp( nlp, QPsiqp, inform, data ) len = nlp%n - CALL SPACE_resize_array( len, QPsiqp%H%val, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( len, QPsiqp%H%val, & + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 ! fill needed componenents dependent on sparsity @@ -5207,8 +5433,10 @@ SUBROUTINE build_QPsiqp( nlp, QPsiqp, inform, data ) ! Format statements -1000 FORMAT(1X, '** ERROR trimsqp : unrecognized storage type in subroutine build_QPsiqp.') -1001 FORMAT(1X, '** ERROR trimsqp : allocation error in subroutine build_QPsiqp.', & +1000 FORMAT(1X, '** ERROR trimsqp : unrecognized storage type in', & + ' subroutine build_QPsiqp.') +1001 FORMAT(1X, '** ERROR trimsqp : allocation error in subroutine', & + ' build_QPsiqp.', & ' error= ', I0, ' status= ', I0, '.') END SUBROUTINE build_QPsiqp @@ -5261,56 +5489,73 @@ SUBROUTINE build_QPseqp( nlp, QPseqp, inform, data ) ! Allocate components independent of storage type. - CALL SPACE_resize_array( QPseqp%n, QPseqp%G, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( QPseqp%n, QPseqp%G, & + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 - !CALL SPACE_resize_array( QPsiqp%n, QPsiqp%X_l, inform%status, inform%alloc_status ) + !CALL SPACE_resize_array( QPsiqp%n, QPsiqp%X_l, & + ! inform%status, inform%alloc_status ) !IF ( inform%status /= GALAHAD_ok ) GO TO 990 - CALL SPACE_resize_array( QPseqp%n, QPseqp%X, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( QPseqp%n, QPseqp%X, & + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 - !CALL SPACE_resize_array( QPsiqp%n, QPsiqp%X_u, inform%status, inform%alloc_status ) + !CALL SPACE_resize_array( QPsiqp%n, QPsiqp%X_u, & + ! inform%status, inform%alloc_status ) !IF ( inform%status /= GALAHAD_ok ) GO TO 990 - CALL SPACE_resize_array( QPseqp%n, QPseqp%Z, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( QPseqp%n, QPseqp%Z, & + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 - CALL SPACE_resize_array( QPseqp%n, QPseqp%X_status, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( QPseqp%n, QPseqp%X_status, & + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 - !CALL SPACE_resize_array( QPsiqp%m, QPsiqp%C_l, inform%status, inform%alloc_status ) + !CALL SPACE_resize_array( QPsiqp%m, QPsiqp%C_l, & + ! inform%status, inform%alloc_status ) !IF ( inform%status /= GALAHAD_ok ) GO TO 990 ! This is the constant term, NOT the constraints! - CALL SPACE_resize_array( QPseqp%m, QPseqp%C, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( QPseqp%m, QPseqp%C, & + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 - !CALL SPACE_resize_array( QPsiqp%m, QPsiqp%C_u, inform%status, inform%alloc_status ) + !CALL SPACE_resize_array( QPsiqp%m, QPsiqp%C_u, & + ! inform%status, inform%alloc_status ) !IF ( inform%status /= GALAHAD_ok ) GO TO 990 - !CALL SPACE_resize_array( QPsiqp%m, QPsiqp%C_status, inform%status, inform%alloc_status ) + !CALL SPACE_resize_array( QPsiqp%m, QPsiqp%C_status, & + ! inform%status, inform%alloc_status ) !IF ( inform%status /= GALAHAD_ok ) GO TO 990 - CALL SPACE_resize_array( QPseqp%n, data%fr, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( QPseqp%n, data%fr, & + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 - CALL SPACE_resize_array( QPseqp%n, data%fx, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( QPseqp%n, data%fx, & + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 - CALL SPACE_resize_array( nlp%m_a, data%wA, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( nlp%m_a, data%wA, & + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 - CALL SPACE_resize_array( nlp%m_a, data%wA_comp, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( nlp%m_a, data%wA_comp, & + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 - CALL SPACE_resize_array( nlp%m, data%wJ, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( nlp%m, data%wJ, & + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 - CALL SPACE_resize_array( nlp%m, data%wJ_comp, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( nlp%m, data%wJ_comp, & + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 - CALL SPACE_resize_array( QPseqp%m, QPseqp%Y, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( QPseqp%m, QPseqp%Y, & + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 ! Set constant in constraint to zero. @@ -5364,11 +5609,14 @@ SUBROUTINE build_QPseqp( nlp, QPseqp, inform, data ) end if end if - CALL SPACE_resize_array( len, QPseqp%A%val, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( len, QPseqp%A%val, & + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 - CALL SPACE_resize_array( len, QPseqp%A%col, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( len, QPseqp%A%col, & + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 - CALL SPACE_resize_array( len, QPseqp%A%row, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( len, QPseqp%A%row, & + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 QPseqp%A%ne = len @@ -5439,11 +5687,14 @@ SUBROUTINE build_QPseqp( nlp, QPseqp, inform, data ) len = nlp%H%ne - CALL SPACE_resize_array( len, QPseqp%H%val, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( len, QPseqp%H%val, & + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 - CALL SPACE_resize_array( len, QPseqp%H%col, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( len, QPseqp%H%col, & + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 - CALL SPACE_resize_array( len, QPseqp%H%row, inform%status, inform%alloc_status ) + CALL SPACE_resize_array( len, QPseqp%H%row, & + inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 990 ! fill needed componenents dependent on sparsity @@ -5491,9 +5742,10 @@ SUBROUTINE build_QPseqp( nlp, QPseqp, inform, data ) ! Format statements -1000 FORMAT(1X, '** ERROR trimsqp : unrecognized storage type in subroutine build_QPseqp.') -1001 FORMAT(1X, '** ERROR trimsqp : allocation error in subroutine build_QPseqp.', & - ' error= ', I0, ' status= ', I0, '.') +1000 FORMAT(1X, '** ERROR trimsqp : unrecognized storage type in', & + ' subroutine build_QPseqp.') +1001 FORMAT(1X, '** ERROR trimsqp : allocation error in subroutine', & + ' build_QPseqp. error= ', I0, ' status= ', I0, '.') END SUBROUTINE build_QPseqp @@ -5553,7 +5805,8 @@ SUBROUTINE fill_QPfeas( nlp, QPfeas, inform, control ) CASE ('DENSE') do i = 1, nlp%m_a - QPfeas%A%val( 1+(i-1)*nlp%n : i*nlp%n ) = nlp%A%val( 1+(i-1)*nlp%n : i*nlp%n ) + QPfeas%A%val( 1+(i-1)*nlp%n : i*nlp%n ) & + = nlp%A%val( 1+(i-1)*nlp%n : i*nlp%n ) QPfeas%A%row( 1+(i-1)*nlp%n : i*nlp%n ) = i do j = 1, nlp%n QPfeas%A%col( (i-1)*nlp%n + j ) = j @@ -5604,7 +5857,8 @@ SUBROUTINE fill_QPfeas( nlp, QPfeas, inform, control ) ! Format statements -1000 FORMAT(1X, '** ERROR : unrecognized storage type in subroutine fill_QPfeas.') +1000 FORMAT(1X, '** ERROR : unrecognized storage type in subroutine', & + ' fill_QPfeas.') END SUBROUTINE fill_QPfeas @@ -5651,8 +5905,10 @@ SUBROUTINE fill_QPsteer( nlp, QPsteer, inform, control, data ) QPsteer%G = zero QPsteer%G( n+1 : ) = one - QPsteer%C_l( : m ) = nlp%C_l-nlp%C; QPsteer%C_l( m+1 : m + m_a ) = nlp%A_l-nlp%Ax - QPsteer%C_u( : m ) = nlp%C_u-nlp%C; QPsteer%C_u( m+1 : m + m_a ) = nlp%A_u-nlp%Ax + QPsteer%C_l( : m ) = nlp%C_l-nlp%C + QPsteer%C_l( m+1 : m + m_a ) = nlp%A_l-nlp%Ax + QPsteer%C_u( : m ) = nlp%C_u-nlp%C + QPsteer%C_u( m+1 : m + m_a ) = nlp%A_u-nlp%Ax QPsteer%C_status = 0 @@ -5702,7 +5958,8 @@ SUBROUTINE fill_QPsteer( nlp, QPsteer, inform, control, data ) CASE ('DENSE') do i = 1, nlp%m_a - QPsteer%A%val( 1+(i-1)*nlp%n : i*nlp%n ) = nlp%A%val( 1+(i-1)*nlp%n : i*nlp%n ) + QPsteer%A%val( 1+(i-1)*nlp%n : i*nlp%n ) & + = nlp%A%val( 1+(i-1)*nlp%n : i*nlp%n ) QPsteer%A%row( 1+(i-1)*nlp%n : i*nlp%n ) = i do j = 1, nlp%n QPsteer%A%col( (i-1)*nlp%n + j ) = j @@ -5823,8 +6080,10 @@ SUBROUTINE fill_QPsteer( nlp, QPsteer, inform, control, data ) ! Format statements -1000 FORMAT(1X, '** ERROR : unrecognized storage type nlp%J%type in subroutine fill_QPsteer.') -1001 FORMAT(1X, '** ERROR : unrecognized storage type nlp%A%type in subroutine fill_QPsteer.') +1000 FORMAT(1X, '** ERROR : unrecognized storage type nlp%J%type', & + ' in subroutine fill_QPsteer.') +1001 FORMAT(1X, '** ERROR : unrecognized storage type nlp%A%type', & + ' in subroutine fill_QPsteer.') END SUBROUTINE fill_QPsteer @@ -5855,8 +6114,8 @@ SUBROUTINE fill_QPpred( nlp, QPpred, inform, data ) ! L o c a l V a r i a b l e s !------------------------------------------------------------------------- - integer ( kind = ip_ ) :: tally, i, j, l, Ane, m, n, m_a, np2m, B_type, error, out - integer ( kind = ip_ ) :: Ltn, A_ind, B_ind, iterate + integer ( kind = ip_ ) :: tally, i, j, l, Ane, m, n, m_a, np2m, B_type + integer ( kind = ip_ ) :: Ltn, A_ind, B_ind, iterate, error, out real( kind = rp_ ) :: Bij, di, Bsi, theta, stBs, damp_factor real( kind = rp_ ) :: B_lammin, B_lammax, dummy_real @@ -6375,7 +6634,8 @@ SUBROUTINE fill_QPpred( nlp, QPpred, inform, data ) if ( data%control%print_level >= GALAHAD_DEBUG ) then write( out, 1015 ) write( out, '(4(2x, ES15.8))') & - ( data%BFGS%d(i), data%BFGS%BS(i), data%BFGS%gradLx(i), data%BFGS%gradLx_new(i), i = 1, n ) + ( data%BFGS%d(i), data%BFGS%BS(i), data%BFGS%gradLx(i), & + data%BFGS%gradLx_new(i), i = 1, n ) write( out, 1016 ) data%BFGS%std, stBs end if @@ -6478,18 +6738,24 @@ SUBROUTINE fill_QPpred( nlp, QPpred, inform, data ) return ! Format statements -1000 FORMAT(1X, '** ERROR : unrecognized storage type in subroutine fill_QPpred.') +1000 FORMAT(1X, '** ERROR : unrecognized storage type in subroutine', & + ' fill_QPpred.') 1001 format(1x, 'BFGS : Damping used with theta = ', ES12.5 ) -1015 format( /, '---------------------------------------------------------------',/,& +1015 format( /, '---------------------------------', & + '------------------------------',/,& 1x,'Initial data needed for BFGS has been computed to be:',/ & - 10x, 'd', 15x, 'Bs', 11x, 'gradLxnew', 10x, 'gradLx', / & - 6x, '---------', 7x, '---------', 8x, '---------', 8x, '----------' ) + 10x, 'd', 15x, 'Bs', 11x, 'gradLxnew', 10x, 'gradLx', / & + 6x, '---------', 7x, '---------', 8x, & + '---------', 8x, '----------' ) 1016 format( /, 's^Td = ', ES16.9, 5x, 's^TBs = ', ES16.9, /, & - '--------------------------------------------------------------') -1017 format( /, '---------------------------------------------------------------',/,& + '---------------------------------', & + '-----------------------------') +1017 format( /, '---------------------------------', & + '------------------------------', /, & 1x,'BFGS has been formed with the following data:',/ & 10x, 'd', 15x, 'Bs', 11x, 'gradLxnew', 10x, 'gradLx', / & - 6x, '---------', 7x, '---------', 8x, '---------', 8x, '----------' ) + 6x, '---------', 7x, '---------', 8x, & + '---------', 8x, '----------' ) 1018 format(1x, 'stBs = ', ES16.9, 3x, 'skipping BFGS update.' ) END SUBROUTINE fill_QPpred @@ -6525,7 +6791,8 @@ SUBROUTINE fill_QPsiqp( nlp, QPsiqp, inform, data ) ! L o c a l V a r i a b l e s !------------------------------------------------------------------------- - integer ( kind = ip_ ) :: tally, tally2, i, j, Ane, correction_type, m, m_a, n + integer ( kind = ip_ ) :: tally, tally2, i, j, Ane, correction_type + integer ( kind = ip_ ) :: m, m_a, n correction_type = data%control%correction_type @@ -6565,13 +6832,15 @@ SUBROUTINE fill_QPsiqp( nlp, QPsiqp, inform, data ) !QPsiqp%C_u( tally + 1 : tally + m_a ) = nlp%A_u - ( nlp%Ax + data%Av ) QPsiqp%C_l( tally + 1 : tally + m_a ) = nlp%A_l - data%AXplusSc QPsiqp%C_u( tally + 1 : tally + m_a ) = nlp%A_u - data%AXplusSc - QPsiqp%Y( tally + 1 : tally + m_a ) = nlp%Y_a ! DPR: cauchy multipliers? + QPsiqp%Y( tally + 1 : tally + m_a ) = nlp%Y_a + ! DPR: cauchy multipliers? tally = m + m_a end if ! Descent condition C and Y. QPsiqp%C_l( tally + 1 ) = - data%control%infinity - QPsiqp%C_u( tally + 1 ) = zero + tenm5 !two*epsmch**(0.1_wp) ! DPR: added for experiment + QPsiqp%C_u( tally + 1 ) = zero + tenm5 + !two*epsmch**(0.1_wp) ! DPR: added for experiment QPsiqp%Y ( tally + 1 ) = zero ! G @@ -6582,13 +6851,17 @@ SUBROUTINE fill_QPsiqp( nlp, QPsiqp, inform, data ) ! X_l and X_u do i = 1, n - QPsiqp%X_l( i ) = nlp%X_l(i) - ( nlp%X(i) + data%s_c(i) ) ! Suppose to be negative - !QPsiqp%X_l( i ) = min( nlp%X_l(i), data%min_TRsqp ) ! ensure feasible region. + QPsiqp%X_l( i ) = nlp%X_l(i) - ( nlp%X(i) + data%s_c(i) ) + ! Suppose to be negative + !QPsiqp%X_l( i ) = min( nlp%X_l(i), data%min_TRsqp ) + ! ensure feasible region. QPsiqp%X_l( i ) = max( QPsiqp%X_l(i), - data%TRsqp ) QPsiqp%X_l( i ) = min( QPsiqp%X_l(i), zero ) ! Do I want this? - QPsiqp%X_u( i ) = nlp%X_u(i) - ( nlp%X(i) + data%s_c(i) ) ! Suppose to be positive. - !QPsiqp%X_u( i ) = max( QPsiqp%X_u( i ), - data%min_TRsqp ) ! Ensure feasible region. + QPsiqp%X_u( i ) = nlp%X_u(i) - ( nlp%X(i) + data%s_c(i) ) + ! Suppose to be positive. + !QPsiqp%X_u( i ) = max( QPsiqp%X_u( i ), - data%min_TRsqp ) + ! Ensure feasible region. QPsiqp%X_u( i ) = min( QPsiqp%X_u(i), data%TRsqp ) QPsiqp%X_u( i ) = max( QPsiqp%X_u(i), zero ) ! Do I want this? @@ -6598,7 +6871,8 @@ SUBROUTINE fill_QPsiqp( nlp, QPsiqp, inform, data ) !QPsiqp%X_u( n + 1 : n + 2*m ) = data%control%infinity ! (u,v) QPsiqp%X_u( n + 1 : n + 2*m ) = data%control%QPsiqp_control%infinity - QPsiqp%X_u( n + data%sat(:data%num_sat) ) = zero ! DPR : might want to do more here. + QPsiqp%X_u( n + data%sat(:data%num_sat) ) = zero + ! DPR : might want to do more here. QPsiqp%X_u( n + m + data%sat(:data%num_sat) ) = zero ! X @@ -6636,10 +6910,13 @@ SUBROUTINE fill_QPsiqp( nlp, QPsiqp, inform, data ) ! Linear constraints C and Y if ( m_a > 0 ) then - QPsiqp%C_l( tally + 1 : tally + m_a ) = nlp%A_l - ( nlp%Ax + data%AxSp ) - QPsiqp%C_u( tally + 1 : tally + m_a ) = nlp%A_u - ( nlp%Ax + data%AxSp ) + QPsiqp%C_l( tally + 1 : tally + m_a ) & + = nlp%A_l - ( nlp%Ax + data%AxSp ) + QPsiqp%C_u( tally + 1 : tally + m_a ) & + = nlp%A_u - ( nlp%Ax + data%AxSp ) - QPsiqp%Y( tally + 1 : tally + m_a ) = nlp%Y_a ! DPR: again use predictor multipliers. + QPsiqp%Y( tally + 1 : tally + m_a ) = nlp%Y_a + ! DPR: again use predictor multipliers. tally = m + m_a @@ -6647,7 +6924,8 @@ SUBROUTINE fill_QPsiqp( nlp, QPsiqp, inform, data ) ! Descent condition C and Y. QPsiqp%C_l( tally + 1 ) = - data%control%infinity - QPsiqp%C_u( tally + 1 ) = zero + 0.0005_rp_ !two*epsmch**(0.1_wp) ! DPR: added for experiemnt + QPsiqp%C_u( tally + 1 ) = zero + 0.0005_rp_ + !two*epsmch**(0.1_wp) ! DPR: added for experiemnt QPsiqp%Y ( tally + 1 ) = zero ! G @@ -6677,9 +6955,10 @@ SUBROUTINE fill_QPsiqp( nlp, QPsiqp, inform, data ) QPsiqp%X_l( i ) = min( QPsiqp%X_l(i), zero ) ! Do I want this? QPsiqp%X_u( i ) = nlp%X_u(i) - ( nlp%X(i) + data%s_c(i) ) - QPsiqp%X_u( i ) = min( QPsiqp%X_u(i), data%TRsqp ) ! DPR: probably want to ensure that the initial - !point is feasible by perturbing either - ! the bound or the intial point. + QPsiqp%X_u( i ) = min( QPsiqp%X_u(i), data%TRsqp ) + ! DPR: probably want to ensure that the initial + !point is feasible by perturbing either + ! the bound or the intial point. QPsiqp%X_u( i ) = max( QPsiqp%X_u(i), zero ) ! Do I want this? end do @@ -6710,10 +6989,13 @@ SUBROUTINE fill_QPsiqp( nlp, QPsiqp, inform, data ) ! Linear constraints C and Y if ( m_a > 0 ) then - QPsiqp%C_l( tally + 1 : tally + m_a ) = nlp%A_l - ( nlp%Ax + data%AxSp ) - QPsiqp%C_u( tally + 1 : tally + m_a ) = nlp%A_u - ( nlp%Ax + data%AxSp ) + QPsiqp%C_l( tally + 1 : tally + m_a ) & + = nlp%A_l - ( nlp%Ax + data%AxSp ) + QPsiqp%C_u( tally + 1 : tally + m_a ) & + = nlp%A_u - ( nlp%Ax + data%AxSp ) - QPsiqp%Y( tally + 1 : tally + m_a ) = nlp%Y_a ! DPR: again use predictor multipliers. + QPsiqp%Y( tally + 1 : tally + m_a ) = nlp%Y_a + ! DPR: again use predictor multipliers. tally = m + m_a @@ -6721,7 +7003,8 @@ SUBROUTINE fill_QPsiqp( nlp, QPsiqp, inform, data ) ! Descent condition C and Y. QPsiqp%C_l( tally + 1 ) = - data%control%infinity - QPsiqp%C_u( tally + 1 ) = zero + 0.0005_rp_ !two*epsmch**(0.1_wp) ! DPR: added for experiemnt + QPsiqp%C_u( tally + 1 ) = zero + 0.0005_rp_ + !two*epsmch**(0.1_wp) ! DPR: added for experiemnt QPsiqp%Y ( tally + 1 ) = zero ! G @@ -6750,9 +7033,10 @@ SUBROUTINE fill_QPsiqp( nlp, QPsiqp, inform, data ) QPsiqp%X_l( i ) = min( QPsiqp%X_l(i), zero ) ! Do I want this? QPsiqp%X_u( i ) = nlp%X_u(i) - ( nlp%X(i) + data%s_c(i) ) - QPsiqp%X_u( i ) = min( QPsiqp%X_u(i), data%TRsqp ) ! DPR: probably want to ensure that the initial - !point is feasible by perturbing either - ! the bound or the intial point. + QPsiqp%X_u( i ) = min( QPsiqp%X_u(i), data%TRsqp ) + ! DPR: probably want to ensure that the initial + !point is feasible by perturbing either + ! the bound or the intial point. QPsiqp%X_u( i ) = max( QPsiqp%X_u(i), zero ) ! Do I want this? end do @@ -6775,10 +7059,10 @@ SUBROUTINE fill_QPsiqp( nlp, QPsiqp, inform, data ) QPsiqp%C_status( 1 : nlp%m + nlp%m_a ) = data%QPpred%C_status QPsiqp%X_status(1:nlp%n) = data%QPpred%X_status(1:nlp%n) - !--------------------------------------------------------------------- - ! Load QPsiqp%A with the portion from J, I, -I, A, and the descent condition. ! - ! NB: Assumes that nlp%A and nlp%J have the same storage format. ! - !---------------------------------------------------------------------- + !--------------------------------------------------------------------- + ! Load QPsiqp%A with the portion from J, I, -I, A, and the descent condition. ! + ! NB: Assumes that nlp%A and nlp%J have the same storage format. ! + !---------------------------------------------------------------------- SELECT CASE ( SMT_get( QPsiqp%A%type ) ) @@ -6966,7 +7250,8 @@ SUBROUTINE fill_QPseqp( nlp, QPseqp, inform, data ) ! L o c a l V a r i a b l e s !------------------------------------------------------------------------- - integer ( kind = ip_ ) :: nfr, nfx, nwA, nwA_comp, nwJ, nwJ_comp, i, j, tally, out, nvl + integer ( kind = ip_ ) :: nfr, nfx, nwA, nwA_comp + integer ( kind = ip_ ) :: nwJ, nwJ_comp, i, j, tally, out, nvl integer ( kind = ip_ ), dimension( max(max(nlp%m, nlp%n), nlp%m_a ) ) :: vl out = data%control%out @@ -6996,7 +7281,8 @@ SUBROUTINE fill_QPseqp( nlp, QPseqp, inform, data ) if ( data%QPpred%X_status(i) /= 0 ) then select case ( data%X_type(i) ) case ('LB') - if ( abs(nlp%X(i) + data%s_p(i) - nlp%X_l(i))/(one + abs(nlp%X_l(i))) < data%control%stop_p ) then + if ( abs(nlp%X(i) + data%s_p(i) - nlp%X_l(i))& + /(one + abs(nlp%X_l(i))) < data%control%stop_p ) then nfx = nfx + 1 data%fx( nfx ) = i else @@ -7004,7 +7290,8 @@ SUBROUTINE fill_QPseqp( nlp, QPseqp, inform, data ) data%fr( nfr ) = i end if case ('UB') - if ( abs(nlp%X(i) + data%s_p(i) - nlp%X_u(i))/(one + abs(nlp%X_u(i))) < data%control%stop_p ) then + if ( abs(nlp%X(i) + data%s_p(i) - nlp%X_u(i))& + /(one + abs(nlp%X_u(i))) < data%control%stop_p ) then nfx = nfx + 1 data%fx( nfx ) = i else @@ -7018,10 +7305,12 @@ SUBROUTINE fill_QPseqp( nlp, QPseqp, inform, data ) nfx = nfx + 1 data%fx( nfx ) = i case ('RB') - if ( abs(nlp%X(i) + data%s_p(i) - nlp%X_u(i))/(one + abs(nlp%X_u(i))) < data%control%stop_p ) then + if ( abs(nlp%X(i) + data%s_p(i) - nlp%X_u(i))& + /(one + abs(nlp%X_u(i))) < data%control%stop_p ) then nfx = nfx + 1 data%fx( nfx ) = i - elseif ( abs(nlp%X(i) + data%s_p(i) - nlp%X_l(i))/(one + abs(nlp%X_l(i))) < data%control%stop_p ) then + elseif ( abs(nlp%X(i) + data%s_p(i) - nlp%X_l(i))& + /(one + abs(nlp%X_l(i))) < data%control%stop_p ) then nfx = nfx + 1 data%fx( nfx ) = i else @@ -7070,10 +7359,10 @@ SUBROUTINE fill_QPseqp( nlp, QPseqp, inform, data ) end if end do else - call get_active( -data%A_RES_l, data%A_RES_u, & + call get_active( -data%A_RES_l, data%A_RES_u, & data%AxSac + data%A_RES_l, data%A_RES_u - data%AxSac, & - data%A_type, nwA, data%wA, nwA_comp, data%wA_comp, nvl, vl,& - point1*data%control%stop_p, out ) + data%A_type, nwA, data%wA, nwA_comp, data%wA_comp, nvl, & + vl, point1*data%control%stop_p, out ) data%wA( nwA+1 : nwA+nvl ) = vl( : nvl ) nwA = nwA + nvl @@ -7098,10 +7387,10 @@ SUBROUTINE fill_QPseqp( nlp, QPseqp, inform, data ) end if end do else - call get_active( -data%C_RES_l, data%C_RES_u, & + call get_active( -data%C_RES_l, data%C_RES_u, & data%JxSac + data%C_RES_l, data%C_RES_u - data%JxSac, & - data%C_type, nwJ, data%wJ, nwJ_comp, data%wJ_comp, nvl, vl,& - point1*data%control%stop_p, out ) + data%C_type, nwJ, data%wJ, nwJ_comp, data%wJ_comp, nvl, & + vl, point1*data%control%stop_p, out ) data%wJ( nwJ+1 : nwJ+nvl ) = vl( : nvl ) nwJ = nwJ + nvl @@ -7962,10 +8251,12 @@ SUBROUTINE print_SMT( A, name, error, out, status ) ! Format statements -1000 FORMAT(3X, '** ERROR : unrecognized storage type in subroutine build_QPsiqp.') +1000 FORMAT(3X, '** ERROR : unrecognized storage type in subroutine', & + ' build_QPsiqp.') 2000 FORMAT( /, & - 1X, ' STATISTICS FOR MATRIX ', A, ' ',/, & + 1X, ' STATISTICS FOR MATRIX ', & + A, ' ',/, & 1X, ' ----------------------- ' ) 3000 FORMAT(/, T16, 'm = ', I10, 7X, 'type = ', 60A ) @@ -8424,7 +8715,7 @@ SUBROUTINE get_cauchy_step( m, C_type, f, g_s, s_hs, s_norm, rho_g, & BREAKP, exact, out, print_1line, print_detail, & print_debug, t_min, too_small, inform ) - ! =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- + ! =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- ! ! Find the global minimizer of the function ! @@ -8436,7 +8727,7 @@ SUBROUTINE get_cauchy_step( m, C_type, f, g_s, s_hs, s_norm, rho_g, & ! where x is a vector of n components ( x_1, .... , x_n ), ! H is a symmetric matrix, and A is an m by n matrix. ! - ! =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- + ! =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- ! ! Arguments: ! @@ -8483,15 +8774,15 @@ SUBROUTINE get_cauchy_step( m, C_type, f, g_s, s_hs, s_norm, rho_g, & ! inform is an INTEGER variable, which gives the exit status. Possible ! values are: ! - ! 0 the minimizer given in t_min occurs between breakpoints after first - ! 1 the minimizer given in t_min occurs at the breakpoint indicated by + ! 0 the minimizer given in t_min occurs between breakpoints after first + ! 1 the minimizer given in t_min occurs at the breakpoint indicated by ! the variable active - ! 2 the minimizer occurs at t_min = 1. - ! -1 the minimizer given in t_min occurs before the first breakpoint - ! -2 the function is unbounded from below. Ignore the value in t_min - ! -3 the value m is negative. Ignore the value in t_min + ! 2 the minimizer occurs at t_min = 1. + ! -1 the minimizer given in t_min occurs before the first breakpoint + ! -2 the function is unbounded from below. Ignore the value in t_min + ! -3 the value m is negative. Ignore the value in t_min ! - ! =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- + ! =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- ! Dummy arguments @@ -8571,18 +8862,18 @@ SUBROUTINE get_cauchy_step( m, C_type, f, g_s, s_hs, s_norm, rho_g, & t_break = - res / as - IF ( ( as > zero .AND. res > zero ) .OR. & + IF ( ( as > zero .AND. res > zero ) .OR. & ( as < zero .AND. res < zero ) ) CYCLE cosine = ABS( as ) / ( s_norm * A_norms( i ) ) IF ( print_debug .AND. cosine < tiny_cosine ) THEN - WRITE( out, "( 'rconst ', i5, 4ES12.4 )" ) & + WRITE( out, "( 'rconst ', i5, 4ES12.4 )" ) & i, res, as, t_break, cosine END IF ! Find the breakpoint IF ( print_debug ) THEN - WRITE( out, "( ' const EQ ', i5, 4ES18.10 )" ) & + WRITE( out, "( ' const EQ ', i5, 4ES18.10 )" ) & i, res, as, t_break, cosine END IF @@ -8614,18 +8905,18 @@ SUBROUTINE get_cauchy_step( m, C_type, f, g_s, s_hs, s_norm, rho_g, & t_break = - res / as - IF ( ( as > zero .AND. res >= zero ) .OR. & + IF ( ( as > zero .AND. res >= zero ) .OR. & ( as < zero .AND. res < zero ) ) CYCLE cosine = ABS( as ) / ( s_norm * A_norms( i ) ) IF ( print_debug .AND. cosine < tiny_cosine ) THEN - WRITE( out, "( 'rconst ', i5, 4ES12.4 )" ) & + WRITE( out, "( 'rconst ', i5, 4ES12.4 )" ) & i, res, as, t_break, cosine END IF ! Find the breakpoint IF ( print_debug ) THEN - WRITE( out, "( ' const LB ', i5, 4ES18.10 )" ) & + WRITE( out, "( ' const LB ', i5, 4ES18.10 )" ) & i, res, as, t_break, cosine END IF @@ -8654,18 +8945,18 @@ SUBROUTINE get_cauchy_step( m, C_type, f, g_s, s_hs, s_norm, rho_g, & t_break = - res / as - IF ( ( as > zero .AND. res >= zero ) .OR. & + IF ( ( as > zero .AND. res >= zero ) .OR. & ( as < zero .AND. res < zero ) ) CYCLE cosine = ABS( as ) / ( s_norm * A_norms( i ) ) IF ( print_debug .AND. cosine < tiny_cosine ) THEN - WRITE( out, "( 'rconst ', i5, 4ES12.4 )" ) & + WRITE( out, "( 'rconst ', i5, 4ES12.4 )" ) & i, res, as, t_break, cosine END IF ! Find the breakpoint IF ( print_debug ) THEN - WRITE( out, "( ' const UB ', i5, 4ES18.10 )" ) & + WRITE( out, "( ' const UB ', i5, 4ES18.10 )" ) & i, res, as, t_break, cosine END IF @@ -8699,24 +8990,25 @@ SUBROUTINE get_cauchy_step( m, C_type, f, g_s, s_hs, s_norm, rho_g, & !!$ end if IF ( ABS( as ) < too_small ) CYCLE - IF ( res + t_pert * as < zero ) slope_infeas_g = slope_infeas_g - as + IF ( res + t_pert * as < zero ) & + slope_infeas_g = slope_infeas_g - as ! Find if the step will change the status of the constraint t_break = - res / as - IF ( ( as > zero .AND. res >= zero ) .OR. & + IF ( ( as > zero .AND. res >= zero ) .OR. & ( as < zero .AND. res < zero ) ) CYCLE cosine = ABS( as ) / ( s_norm * A_norms( i ) ) IF ( print_debug .AND. cosine < tiny_cosine ) THEN - WRITE( out, "( 'rconst ', i5, 4ES12.4 )" ) & + WRITE( out, "( 'rconst ', i5, 4ES12.4 )" ) & i, res, as, t_break, cosine END IF ! Find the breakpoint IF ( print_debug ) THEN - WRITE( out, "( ' const RB ', i5, 4ES18.10 )" ) & + WRITE( out, "( ' const RB ', i5, 4ES18.10 )" ) & i, res, as, t_break, cosine END IF if ( t_break <= one ) then @@ -8927,7 +9219,7 @@ SUBROUTINE get_cauchy_step( m, C_type, f, g_s, s_hs, s_norm, rho_g, & "( 3X, I7, ES12.4, A14, 3ES12.4 )" ) & iter, t_min, ' - -', fun, slope, curv IF ( print_debug ) THEN - exact_val = cauchy_get_val( m, C_type, f, g_s, s_hs, rho_g, & + exact_val = cauchy_get_val( m, C_type, f, g_s, s_hs, rho_g, & RES_l, RES_u, A_s, t_min, too_small ) write( out, 2010 ) ' val', fun, exact_val END IF @@ -9119,14 +9411,14 @@ SUBROUTINE get_cauchy_step( m, C_type, f, g_s, s_hs, s_norm, rho_g, & IF ( print_detail ) WRITE( out, & "( ' *** predicted vs actual function values =', /, 2ES22.14, & - & /, ' .... being more careful ... ' )" ) & + & /, ' .... being more careful ... ' )" ) & f + rho_g * infeas_g, val - ! ========================================================================== - ! This part of the code is to cope with the possibility that rounding errors - ! have so dominated the search that a descent point has not been found. A - ! more cautious search will be performed. - ! ========================================================================== + ! ========================================================================= + ! This part of the code is to cope with the possibility that rounding + ! errors have so dominated the search that a descent point has not been + ! found. A more cautious search will be performed. + ! ========================================================================= iter = 0 ; t_break = zero ; t_min = zero @@ -9204,16 +9496,16 @@ SUBROUTINE get_cauchy_step( m, C_type, f, g_s, s_hs, s_norm, rho_g, & t_break = one !biginf END IF - ! If the gradient of the univariate function is nonzero and its curvature is - ! positive, compute the line minimum + ! If the gradient of the univariate function is nonzero and its + ! curvature is positive, compute the line minimum IF ( curv > zero ) THEN IF ( print_detail ) WRITE( out, "( ' slope, curv ', 2ES12.4 )" ) & slope, curv t_star = - slope / curv - ! If the line minimum occurs before the breakpoint, the line minimum gives - ! the required minimizer. Exit + ! If the line minimum occurs before the breakpoint, the + ! line minimum gives the required minimizer. Exit IF ( nbreak == 0 .OR. t_star < t_break ) THEN t_min = t_star @@ -9221,18 +9513,18 @@ SUBROUTINE get_cauchy_step( m, C_type, f, g_s, s_hs, s_norm, rho_g, & ! Calculate the function value for the piecewise quadratic - val = cauchy_get_val( m, C_type, f, g_s, s_hs, rho_g, & + val = cauchy_get_val( m, C_type, f, g_s, s_hs, rho_g, & RES_l, RES_u, A_s, t_break, too_small ) - ! If the function value has risen in the current interval, search the - ! interval for a better value, and exit + ! If the function value has risen in the current interval, + ! search the interval for a better value, and exit IF ( val_old < val ) THEN -!!$ CALL QPA_linesearch_interval( dims, n, m, & -!!$ f, g_s, s_hs, rho_g, rho_b, & -!!$ X, X_l, X_u, RES_l, RES_u, S, A_s, & -!!$ t_old, val_old, t_min, val, & +!!$ CALL QPA_linesearch_interval( dims, n, m, & +!!$ f, g_s, s_hs, rho_g, rho_b, & +!!$ X, X_l, X_u, RES_l, RES_u,S A_s,& +!!$ t_old, val_old, t_min, val, & !!$ too_small, out, print_detail ) END IF @@ -9241,7 +9533,7 @@ SUBROUTINE get_cauchy_step( m, C_type, f, g_s, s_hs, s_norm, rho_g, & "( 3X, I7, ES12.4, A14, 3ES12.4 )" ) & iter, t_min, ' - -', fun, zero, curv IF ( print_debug ) THEN - exact_val = cauchy_get_val( m, C_type, f, g_s, s_hs, rho_g, & + exact_val = cauchy_get_val( m, C_type, f, g_s, s_hs, rho_g, & RES_l, RES_u, A_s, t_min, too_small ) WRITE( out, 2010 ) ' val', fun, exact_val @@ -9289,10 +9581,10 @@ SUBROUTINE get_cauchy_step( m, C_type, f, g_s, s_hs, s_norm, rho_g, & ! Update the slope IF ( ibreakp <= m ) THEN - IF ( print_detail ) WRITE( out, 2020 ) & + IF ( print_detail ) WRITE( out, 2020 ) & 'C', IBREAK( nbreak ), BREAKP( nbreak ) ELSE - IF ( print_detail ) WRITE( out, 2020 ) & + IF ( print_detail ) WRITE( out, 2020 ) & 'B', IBREAK( nbreak ) - m, BREAKP( nbreak ) END IF @@ -9328,10 +9620,10 @@ SUBROUTINE get_cauchy_step( m, C_type, f, g_s, s_hs, s_norm, rho_g, & WRITE( out, "( ' val_old, val ', 2ES22.14 )" ) val_old, val IF ( val_old < val ) THEN t_min = t_break -!!$ CALL QPA_linesearch_interval( dims, n, m, & -!!$ f, g_s, s_hs, rho_g, rho_b, X, & -!!$ X_l, X_u, RES_l, RES_u, S, A_s, & -!!$ t_old, val_old, t_min, val, & +!!$ CALL QPA_linesearch_interval( dims, n, m, & +!!$ f, g_s, s_hs, rho_g, rho_b, X, & +!!$ X_l, X_u, RES_l, RES_u, S, A_s, & +!!$ t_old, val_old, t_min, val, & !!$ too_small, out, print_detail ) EXIT END IF @@ -9355,7 +9647,7 @@ SUBROUTINE get_cauchy_step( m, C_type, f, g_s, s_hs, s_norm, rho_g, & ' fun slope curv ', / ) 2010 FORMAT( 1X, A5, '(est,true) = ', 2ES22.14 ) 2020 FORMAT( ' breakpoint for ', A1, '-term ', I7, ' reached, step = ', ES12.4) - !2030 FORMAT( ' breakpoint for ', A1, '-term ', I7, ' is acceptable,', & + !2030 FORMAT( ' breakpoint for ', A1, '-term ', I7, ' is acceptable,', & ! ' cosine = ', ES12.4 ) 2040 FORMAT( /, ' Interval = [', ES12.4, ',', ES12.4, ']' ) 2050 FORMAT( /, ' Interval = [', ES12.4, ',', ES12.4, & @@ -9402,9 +9694,9 @@ FUNCTION cauchy_get_val( m, C_type, f, g_s, s_hs, rho_g, & REAL ( KIND = rp_ ), INTENT( IN ), DIMENSION( m ) :: A_s !REAL ( KIND = rp_ ), INTENT( IN ), DIMENSION( n ) :: S CHARACTER ( Len = 2 ), INTENT( IN ), DIMENSION( m ) :: C_type - REAL ( KIND = rp_ ), INTENT( IN ), & + REAL ( KIND = rp_ ), INTENT( IN ), & DIMENSION( m ) :: RES_l - REAL ( KIND = rp_ ), INTENT( IN ), & + REAL ( KIND = rp_ ), INTENT( IN ), & DIMENSION( m ) :: RES_u ! Local variables @@ -9482,7 +9774,7 @@ FUNCTION cauchy_get_val( m, C_type, f, g_s, s_hs, rho_g, & END FUNCTION cauchy_get_val -!-* C A U C H Y _ G E T _ V A L _ A N D _ S L O P E S U B R O U T I N E -*-* +!- C A U C H Y _ G E T _ V A L _ A N D _ S L O P E S U B R O U T I N E -*- SUBROUTINE cauchy_get_val_and_slope( m, C_type, f, g_s, s_hs, rho_g, & RES_l, RES_u, A_s, t, & @@ -9510,9 +9802,9 @@ SUBROUTINE cauchy_get_val_and_slope( m, C_type, f, g_s, s_hs, rho_g, & REAL ( KIND = rp_ ), INTENT( OUT ) :: val, slope REAL ( KIND = rp_ ), INTENT( IN ), DIMENSION( m ) :: A_s ! REAL ( KIND = rp_ ), INTENT( IN ), DIMENSION( n ) :: S - REAL ( KIND = rp_ ), INTENT( IN ), & + REAL ( KIND = rp_ ), INTENT( IN ), & DIMENSION( m ) :: RES_l - REAL ( KIND = rp_ ), INTENT( IN ), & + REAL ( KIND = rp_ ), INTENT( IN ), & DIMENSION( m ) :: RES_u ! Local variables @@ -9613,7 +9905,7 @@ END SUBROUTINE cauchy_get_val_and_slope -!-* C H E C K _ S U B P R O B L E M _ O P T I M A L S U B R O U T I N E -*-* +!- C H E C K _ S U B P R O B L E M _ O P T I M A L S U B R O U T I N E -*- SUBROUTINE check_sub_optimal( nlp, Y, JtY, Y_a, AtY_a, Z, & C_RES_l, C_RES_u, & @@ -9883,7 +10175,8 @@ SUBROUTINE check_sub_optimal( nlp, Y, JtY, Y_a, AtY_a, Z, & ! comp_vl = max( comp_vl, abs( Y(i) ) ) case default - write( out, * ) 'ERROR: check_subproblem_optimal : unrecognized C_type value' + write( out, * ) & + 'ERROR: check_subproblem_optimal : unrecognized C_type value' end select @@ -10032,8 +10325,8 @@ END SUBROUTINE check_sub_optimal !-* C O N S T R A I N T_ V I O L A T I O N S U B R O U T I N E -*-* - SUBROUTINE constraint_violation( nlp, v, data, viol, status, & - sat, vl_l, vl_u, num_sat, num_vl_l, num_vl_u ) + SUBROUTINE constraint_violation( nlp, v, data, viol, status, sat, & + vl_l, vl_u, num_sat, num_vl_l, num_vl_u ) ! =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- ! @@ -10050,8 +10343,10 @@ SUBROUTINE constraint_violation( nlp, v, data, viol, status, & type( NLPT_problem_type ), intent( in ) :: nlp type( TRIMSQP_data_type ), intent( in ) :: data integer ( kind = ip_ ), intent( out ) :: status - integer ( kind = ip_ ), intent( inout ), optional :: num_sat, num_vl_l, num_vl_u - integer ( kind = ip_ ), intent( inout ), dimension( nlp%m ), optional :: sat, vl_l, vl_u + integer ( kind = ip_ ), intent( inout ), optional :: num_sat + integer ( kind = ip_ ), intent( inout ), optional :: num_vl_l, num_vl_u + integer ( kind = ip_ ), intent( inout ), & + dimension( nlp%m ), optional :: sat, vl_l, vl_u real( kind = rp_ ), intent( out ) :: viol real( kind = rp_ ), intent( in ), dimension( nlp%m ) :: v @@ -10434,45 +10729,57 @@ function max_feas_step( nlp, data, X_type, A_type, C_type ) !!$ write(*,*) 'Jss = ', data%JxSs do i = 1, nspos - if ( X_type( data%spos(i) ) == 'RB' .or. X_type( data%spos(i) ) == 'UB' ) then - dummy = nlp%X_u( data%spos(i) ) - ( nlp%X( data%spos(i) ) + data%s_ac( data%spos(i) ) ) + if ( X_type( data%spos(i) ) == 'RB' .or. & + X_type( data%spos(i) ) == 'UB' ) then + dummy = nlp%X_u( data%spos(i) ) & + - ( nlp%X( data%spos(i) ) + data%s_ac( data%spos(i) ) ) dummy = dummy / data%s_s( data%spos(i) ) alpha_x = min( alpha_x, dummy ) end if end do do i = 1, nsneg - if ( X_type( data%sneg(i) ) == 'RB' .or. X_type( data%sneg(i) ) == 'LB' ) then - dummy = nlp%X_l( data%sneg(i) ) - ( nlp%X( data%sneg(i) ) + data%s_ac( data%sneg(i) ) ); + if ( X_type( data%sneg(i) ) == 'RB' .or. & + X_type( data%sneg(i) ) == 'LB' ) then + dummy = nlp%X_l( data%sneg(i) ) & + - ( nlp%X( data%sneg(i) ) + data%s_ac( data%sneg(i) ) ) dummy = dummy / data%s_s( data%sneg(i) ) alpha_x = min( alpha_x, dummy ) end if end do do i = 1, nApos - if ( A_type( data%Apos(i) ) == 'RB' .or. A_type( data%Apos(i) ) == 'UB' ) then - dummy = nlp%A_u( data%Apos(i) ) - ( nlp%Ax( data%Apos(i) ) + data%AxSac( data%Apos(i) ) ) + if ( A_type( data%Apos(i) ) == 'RB' .or. & + A_type( data%Apos(i) ) == 'UB' ) then + dummy = nlp%A_u( data%Apos(i) ) & + - ( nlp%Ax( data%Apos(i) ) + data%AxSac( data%Apos(i) ) ) dummy = dummy / data%AxSs( data%Apos(i) ) alpha_A = min( alpha_A, dummy ) end if end do do i = 1, nAneg - if ( A_type( data%Aneg(i) ) == 'RB' .or. A_type( data%Aneg(i) ) == 'LB' ) then - dummy = nlp%A_l( data%Aneg(i) ) - ( nlp%Ax( data%Aneg(i) ) + data%AxSac( data%Aneg(i) ) ) + if ( A_type( data%Aneg(i) ) == 'RB' .or. & + A_type( data%Aneg(i) ) == 'LB' ) then + dummy = nlp%A_l( data%Aneg(i) ) & + - ( nlp%Ax( data%Aneg(i) ) + data%AxSac( data%Aneg(i) ) ) dummy = dummy / data%AxSs( data%Aneg(i) ) alpha_A = min( alpha_A, dummy ) end if end do do i = 1, nJpos - if ( C_type( data%Jpos(i)) == 'RB' .or. C_type( data%Jpos(i)) == 'UB' ) then - dummy = nlp%C_u( data%Jpos(i) ) - ( nlp%C( data%Jpos(i) ) + data%JxSac( data%Jpos(i) ) ) + if ( C_type( data%Jpos(i)) == 'RB' .or. & + C_type( data%Jpos(i)) == 'UB' ) then + dummy = nlp%C_u( data%Jpos(i) ) & + - ( nlp%C( data%Jpos(i) ) + data%JxSac( data%Jpos(i) ) ) dummy = dummy / data%JxSs( data%Jpos(i) ) alpha_C = min( alpha_C, dummy ) end if end do do i = 1, nJneg - if ( C_type( data%Jneg(i) ) == 'RB' .or. C_type( data%Jneg(i) ) == 'LB' ) then - dummy = nlp%C_l( data%Jneg(i) ) - ( nlp%C( data%Jneg(i) ) + data%JxSac( data%Jneg(i) ) ) + if ( C_type( data%Jneg(i) ) == 'RB' .or. & + C_type( data%Jneg(i) ) == 'LB' ) then + dummy = nlp%C_l( data%Jneg(i) ) & + - ( nlp%C( data%Jneg(i) ) + data%JxSac( data%Jneg(i) ) ) dummy = dummy / data%JxSs( data%Jneg(i) ) alpha_C = min( alpha_C, dummy ) end if @@ -10496,8 +10803,8 @@ function max_feas_step( nlp, data, X_type, A_type, C_type ) !!$ 1x, 'norm_c = ', ES11.5, T30, 'norm_lin_pred = ', ES11.5, & !!$ T62, 'dec_lin_s_p = ', ES12.5 ) !!$3001 format(1x, (30('*-*')) ) -!!$3002 format(1x, 'norm_c = ', ES11.5, T30, 'norm_lin_steer = ', ES11.5, & -!!$ T62, 'dec_c_lin_steer = ', ES12.5,/,& +!!$3002 format(1x, 'norm_c = ', ES11.5, T30, 'norm_lin_steer = ', ES11.5, & +!!$ T62, 'dec_c_lin_steer = ', ES12.5,/,& !!$ 1x, 'norm_steer = ', ES11.5, T30, 'norm_Y_steer = ', ES11.5 ) end function max_feas_step @@ -10528,7 +10835,8 @@ SUBROUTINE get_residuals( vl, v, vu, v_type, res_vl, res_vu ) n = size(vl) do i = 1, n - if ( v_type( i ) == 'EQ' .or. v_type( i ) == 'LB' .or. v_type( i ) == 'RB' ) then + if ( v_type( i ) == 'EQ' .or. v_type( i ) == 'LB' .or. & + v_type( i ) == 'RB' ) then res_vl( i ) = v( i ) - vl( i ) end if if ( v_type( i ) == 'UB' .or. v_type( i ) == 'RB' ) then @@ -10540,7 +10848,8 @@ END SUBROUTINE get_residuals !-* g e t _ a c t i v e S U B R O U T I N E -*-* - SUBROUTINE get_active( xl, xu, res_xl, res_xu, x_type, nfx, fx, nfr, fr, nvl, vl, tol, out ) + SUBROUTINE get_active( xl, xu, res_xl, res_xu, x_type, & + nfx, fx, nfr, fr, nvl, vl, tol, out ) ! =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- ! @@ -10633,7 +10942,8 @@ SUBROUTINE get_active( xl, xu, res_xl, res_xu, x_type, nfx, fx, nfr, fr, nvl, vl end if end if case default - write( out, * ) ' ERROR:trimsqp:get_active: Unrecognized value x_type(i).' + write( out, * ) & + ' ERROR:trimsqp:get_active: Unrecognized value x_type(i).' return end select @@ -10691,16 +11001,19 @@ SUBROUTINE get_L_BFGS( iterate, Bzero, A, B, S, Y, s_f, gradLx_new, gradLx, & do i = 1, last if ( i == last ) then - B(:,ind(last)) = Y(:,ind(last)) / dot_product( Y(:,ind(last)), S(:,ind(last)) )**half + B(:,ind(last)) = & + Y(:,ind(last)) / dot_product( Y(:,ind(last)), S(:,ind(last)) )**half do j = 1, last-1 - SBinner( ind(last), ind(j) ) = dot_product( S(:,ind(last)), B(:,ind(j)) ) + SBinner( ind(last), ind(j) ) & + = dot_product( S(:,ind(last)), B(:,ind(j)) ) end do end if A(:,ind(i)) = zero call mop_Ax( one, Bzero, S(:,ind(i)), one, A(:,ind(i)), & out, error, transpose=.false. ) do k = 1, i-1 - A(:,ind(i)) = A(:,ind(i)) - dot_product( A(:,ind(k)), S(:,ind(i)) ) * A(:,ind(k)) + A(:,ind(i)) = A(:,ind(i)) & + - dot_product( A(:,ind(k)), S(:,ind(i)) ) * A(:,ind(k)) A(:,ind(i)) = A(:,ind(i)) + SBinner(ind(i),ind(k)) * B(:,ind(k)) end do Bs = A(:,ind(i)) @@ -10722,20 +11035,25 @@ SUBROUTINE get_L_BFGS( iterate, Bzero, A, B, S, Y, s_f, gradLx_new, gradLx, & write(error, *)' ERROR:get_L_BFGS: disallowed value curve_mod.' end if - B(:,ind(last)) = Y(:,ind(last)) / ( dot_product( Y(:,ind(last)), S(:,ind(last)) ) )**half + B(:,ind(last)) = Y(:,ind(last)) & + / ( dot_product( Y(:,ind(last)), S(:,ind(last)) ) )**half do j= 1, last-1 - SBinner(ind(last),ind(j)) = dot_product( S(:,ind(last)), B(:,ind(j)) ) + SBinner(ind(last),ind(j)) & + = dot_product( S(:,ind(last)), B(:,ind(j)) ) end do ! Double check if sufficiently positive definite. yts = dot_product( Y(:,ind(last)), S(:,ind(last)) ) sta = dot_product( S(:,ind(last)), A(:,ind(last)) ) ! s_k^T B_k s_k if ( yts < 0.5*eta*sta ) then - write(error,*) 'ERROR:get_L_BFGS: curvature MAY be wrong after modification!' + write(error,*) & + 'ERROR:get_L_BFGS: curvature MAY be wrong after modification!' if ( yts < tenm8 ) then - write(error,*) 'ERROR:get_L_BFGS: curvature PROBABLY wrong after modification!' + write(error,*) & + 'ERROR:get_L_BFGS: curvature PROBABLY wrong after modification!' if ( yts <= zero ) then - write(error,*) 'ERROR:get_L_BFGS: curvature DEFINITELY wrong after modification!' + write(error,*) & + 'ERROR:get_L_BFGS: curvature DEFINITELY wrong after modification!' end if end if end if diff --git a/src/presolve/presolve.F90 b/src/presolve/presolve.F90 index a49dd2ab0e..ef94facb1c 100644 --- a/src/presolve/presolve.F90 +++ b/src/presolve/presolve.F90 @@ -1461,7 +1461,7 @@ MODULE GALAHAD_PRESOLVE_precision ! incompatible value of prob%H_ne - INTEGER ( KIND = ip_ ) :: nbr_transforms = 0 ! INTENT( OUT ) + INTEGER ( KIND = ip_ ) :: nbr_transforms = 0 ! INTENT( OUT ) ! The final number of problem transformations, as reported ! to the user at exit. @@ -1820,7 +1820,8 @@ MODULE GALAHAD_PRESOLVE_precision TYPE, PUBLIC :: PRESOLVE_full_data_type LOGICAL :: f_indexing = .TRUE. - INTEGER ( KIND = ip_ ) :: n_orig, m_orig, n_trans, m_trans, h_ne_trans, a_ne_trans + INTEGER ( KIND = ip_ ) :: n_orig, m_orig, n_trans + INTEGER ( KIND = ip_ ) :: m_trans, h_ne_trans, a_ne_trans TYPE ( PRESOLVE_data_type ) :: PRESOLVE_data TYPE ( PRESOLVE_control_type ) :: PRESOLVE_control TYPE ( PRESOLVE_inform_type ) :: PRESOLVE_inform @@ -2047,7 +2048,7 @@ MODULE GALAHAD_PRESOLVE_precision ! SPECIAL_LINEAR_COLUMNS, because of the possible occurence of ! empty or singleton rows that modify the bounds. - INTEGER ( KIND = ip_ ), PRIVATE, DIMENSION( N_HEURISTICS ), PARAMETER :: & + INTEGER ( KIND = ip_ ), PRIVATE, DIMENSION( N_HEURISTICS ), PARAMETER :: & ! PRESOLVING_SEQUENCE = (/ & EMPTY_AND_SINGLETON_ROWS, & @@ -6692,7 +6693,7 @@ SUBROUTINE PRESOLVE_dual_constraints ! Update the bounds on y(i). - IF ( s%level >= DEBUG ) WRITE( s%out, * ) & + IF ( s%level >= DEBUG ) WRITE( s%out, * ) & ' y(', i, ') must lie in [', nli, ',', nui, ']' IF ( PRESOLVE_is_zero( nui - nli ) ) THEN @@ -11910,7 +11911,7 @@ SUBROUTINE PRESOLVE_linear_singleton( j, split_ok ) IF ( a_val /= ZERO ) THEN jj = prob%A%col( k ) IF ( prob%X_status( jj ) <= ELIMINATED .OR. j == jj ) CYCLE - IF ( PRESOLVE_is_too_big( prob%G( jj ) - a_val * yi ) ) THEN + IF ( PRESOLVE_is_too_big( prob%G( jj ) - a_val * yi )) THEN IF ( s%level >= DEBUG ) WRITE( s%out, * ) & ' elimination of linear singleton column', & ' prevented by unacceptable growth' @@ -13121,7 +13122,7 @@ SUBROUTINE PRESOLVE_merge_x( j, k, alpha ) ! Local variables INTEGER ( KIND = ip_ ) :: l - REAL ( KIND = rp_ ) :: nxl, nxu, nzl, nzu, xlj, xlk, xuj, xuk, & + REAL ( KIND = rp_ ) :: nxl, nxu, nzl, nzu, xlj, xlk, xuj, xuk, & zlj, zuj, zlk, zuk ! Get the involved variables' bounds. @@ -13531,7 +13532,7 @@ SUBROUTINE PRESOLVE_shift_x_bounds( i, j, kij ) INTEGER ( KIND = ip_ ) :: k, jj, ic, l, kik LOGICAL :: lower_active, upper_active - REAL ( KIND = rp_ ) :: aij, aik, xlj, xuj, cli, xlk, xuk, & + REAL ( KIND = rp_ ) :: aij, aik, xlj, xuj, cli, xlk, xuk, & nxlk, nxuk, zlk, zuk, yli, yui, nyli, nyui ! Find the other active nonzero in row i. @@ -14938,7 +14939,8 @@ SUBROUTINE PRESOLVE_check_active_sizes ! Local variables - INTEGER ( KIND = ip_ ) :: i, ic, j, k, ie, nactx, nactc, nacta, nacte, nacth + INTEGER ( KIND = ip_ ) :: i, ic, j, k, ie + INTEGER ( KIND = ip_ ) :: nactx, nactc, nacta, nacte, nacth LOGICAL :: error error = .FALSE. @@ -18232,7 +18234,7 @@ END SUBROUTINE PRESOLVE_correct_z_for_dy !============================================================================== !============================================================================== - REAL( KIND = rp_ ) FUNCTION & + REAL( KIND = rp_ ) FUNCTION & PRESOLVE_max_dual_correction( low, val, upp, yz, dyz ) ! see how much of the correction dyz to yz, the dual associated to the @@ -18429,7 +18431,7 @@ SUBROUTINE PRESOLVE_correct_yz_for_z( j, get_y, get_z ) IF ( get_z ) prob%Z( j ) = ZERO RETURN END IF - IF ( s%level >= DEBUG ) WRITE( s%out, * ) & + IF ( s%level >= DEBUG ) WRITE( s%out, * ) & ' remaining correction =', czj END DO sli END IF diff --git a/src/presolve/presolveti.F90 b/src/presolve/presolveti.F90 index b690a43979..46ff4623de 100644 --- a/src/presolve/presolveti.F90 +++ b/src/presolve/presolveti.F90 @@ -51,7 +51,8 @@ PROGRAM GALAHAD_PRESOLVE_interface_test H_col = (/ 1 /) H_ptr = (/ 1, 2, 2, 2, 2, 2, 2 /) ALLOCATE( A_val( A_ne ), A_row( A_ne ), A_col( A_ne ), A_ptr( m + 1 ) ) - A_val = (/ 1.0_rp_, 1.0_rp_, 1.0_rp_, 1.0_rp_, 1.0_rp_, 1.0_rp_, 1.0_rp_, 1.0_rp_ /) + A_val = (/ 1.0_rp_, 1.0_rp_, 1.0_rp_, 1.0_rp_, & + 1.0_rp_, 1.0_rp_, 1.0_rp_, 1.0_rp_ /) A_row = (/ 3, 3, 3, 4, 4, 5, 5, 5 /) A_col = (/ 3, 4, 5, 3, 6, 4, 5, 6 /) A_ptr = (/ 1, 1, 1, 4, 6, 9 /) diff --git a/src/presolve/usepresolve.F90 b/src/presolve/usepresolve.F90 index 349e94a296..7c4b3c1aeb 100644 --- a/src/presolve/usepresolve.F90 +++ b/src/presolve/usepresolve.F90 @@ -96,8 +96,9 @@ SUBROUTINE USE_PRESOLVE( input ) ! Scalars - INTEGER ( KIND = ip_ ) :: n, m, la, lh, liw, i, j, l, neh, nea, alloc_stat - INTEGER ( KIND = ip_ ) :: A_ne, H_ne, A_ne_red, H_ne_red, smt_stat, cutest_status + INTEGER ( KIND = ip_ ) :: n, m, la, lh, liw, i, j, l, neh, nea + INTEGER ( KIND = ip_ ) :: A_ne, H_ne, A_ne_red, H_ne_red + INTEGER ( KIND = ip_ ) :: smt_stat, cutest_status, alloc_stat INTEGER ( KIND = ip_ ) :: errout = 6 REAL :: time1, time2, time3, time4 CHARACTER ( LEN = 10 ) :: pname diff --git a/src/psls/psls.F90 b/src/psls/psls.F90 index f7b6005fb6..3df7584466 100644 --- a/src/psls/psls.F90 +++ b/src/psls/psls.F90 @@ -5050,7 +5050,8 @@ FUNCTION PSLS_name( preconditioner, semi_bandwidth, icfs_vectors ) ! provide character descriptions of the preconditioners provided CHARACTER ( LEN = 80 ) :: PSLS_name - INTEGER ( KIND = ip_ ), INTENT( IN ) :: preconditioner, semi_bandwidth, icfs_vectors + INTEGER ( KIND = ip_ ), INTENT( IN ) :: preconditioner + INTEGER ( KIND = ip_ ), INTENT( IN ) :: semi_bandwidth, icfs_vectors PSLS_name = REPEAT( ' ', 80 ) SELECT CASE ( preconditioner ) CASE ( : - 1 ) diff --git a/src/qp/inqp.F90 b/src/qp/inqp.F90 index 28a94ef08c..98007d846f 100644 --- a/src/qp/inqp.F90 +++ b/src/qp/inqp.F90 @@ -118,11 +118,10 @@ PROGRAM RUNQP_DATA_precision ! Scalars - INTEGER ( KIND = ip_ ) :: n, m, ir, ic, liw, iores, smt_stat + INTEGER ( KIND = ip_ ) :: i, j, l, n, m, ir, ic, liw, iores, smt_stat ! INTEGER ( KIND = ip_ ) :: np1, npm - INTEGER ( KIND = ip_ ) :: i, j, l - INTEGER ( KIND = ip_ ) :: status, mfixed, mdegen, nfixed, ndegen, mequal, mredun - INTEGER ( KIND = ip_ ) :: alloc_stat, A_ne, H_ne, iter + INTEGER ( KIND = ip_ ) :: status, mfixed, mdegen, nfixed, ndegen + INTEGER ( KIND = ip_ ) :: alloc_stat, A_ne, H_ne, iter, mequal, mredun REAL :: time, timeo, times, timet REAL ( KIND = rp_ ) :: stopr, dummy, objf, res_c, res_k, max_cs LOGICAL :: filexx, printo diff --git a/src/qp/qpt.F90 b/src/qp/qpt.F90 index 5b91410775..036147e047 100644 --- a/src/qp/qpt.F90 +++ b/src/qp/qpt.F90 @@ -885,8 +885,10 @@ SUBROUTINE WHICH_sls( control ) control%QPB_control%LSQP_control%SBLS_control%definite_linear_solver & = definite_linear_solver control%QPC_control%FDC_control%use_sls = use_sls - control%QPC_control%FDC_control%symmetric_linear_solver = symmetric_linear_solver - control%QPC_control%QPA_control%symmetric_linear_solver = symmetric_linear_solver + control%QPC_control%FDC_control%symmetric_linear_solver & + = symmetric_linear_solver + control%QPC_control%QPA_control%symmetric_linear_solver & + = symmetric_linear_solver control%QPC_control%QPB_control%FDC_control%use_sls = use_sls control%QPC_control%QPB_control%FDC_control%symmetric_linear_solver & = symmetric_linear_solver @@ -895,12 +897,12 @@ SUBROUTINE WHICH_sls( control ) control%QPC_control%QPB_control%SBLS_control%definite_linear_solver & = definite_linear_solver control%QPC_control%QPB_control%LSQP_control%FDC_control%use_sls = use_sls - control%QPC_control%QPB_control%LSQP_control%FDC_control%symmetric_linear_solver & - = symmetric_linear_solver - control%QPC_control%QPB_control%LSQP_control%SBLS_control%symmetric_linear_solver & - = symmetric_linear_solver - control%QPC_control%QPB_control%LSQP_control%SBLS_control%definite_linear_solver & - = definite_linear_solver + control%QPC_control%QPB_control%LSQP_control& + &%FDC_control%symmetric_linear_solver = symmetric_linear_solver + control%QPC_control%QPB_control%LSQP_control& + &%SBLS_control%symmetric_linear_solver = symmetric_linear_solver + control%QPC_control%QPB_control%LSQP_control& + &%SBLS_control%definite_linear_solver = definite_linear_solver control%QPC_control%CQP_control%FDC_control%use_sls = use_sls control%QPC_control%CQP_control%FDC_control%symmetric_linear_solver & = symmetric_linear_solver diff --git a/src/qpa/qpa.F90 b/src/qpa/qpa.F90 index c62d7f8bf7..0fcfa4505a 100644 --- a/src/qpa/qpa.F90 +++ b/src/qpa/qpa.F90 @@ -6852,7 +6852,7 @@ SUBROUTINE QPA_linesearch( dims, n, m, & IF ( print_detail ) THEN CALL QPA_p_val_and_slope( dims, n, m, & f, g_s, s_hs, rho_g, rho_b, X, X_l, & - X_u, RES_l, RES_u, S, A_s, 0.0_rp_, t_pert, & + X_u, RES_l, RES_u, S, A_s, 0.0_rp_, t_pert, & too_small, REF, m_link, C_stat, B_stat, & eval, eslope ) write( out, 2010 ) ' val', val, eval diff --git a/src/qpb/qpb.F90 b/src/qpb/qpb.F90 index 3530490728..11e03200f2 100644 --- a/src/qpb/qpb.F90 +++ b/src/qpb/qpb.F90 @@ -5332,11 +5332,11 @@ SUBROUTINE QPB_solve_main( dims, n, m, & norm_cd = norm_c + norm_d IF ( ( norm_c <= theta_c .AND. norm_d <= theta_d .AND. .NOT. & - inform%GLTR_inform%negative_curvature .AND. .NOT. & - ( control%extrapolate > 1 .AND. inner_iteration == 0 ) ) .OR. & - ( control%extrapolate > 0 .AND. inner_iteration > 2 .AND. & - mu < 1.01_rp_ * control%mu_min .AND. successful_iteration .AND.& - norm_cd > 0.9_rp_ * old_norm_cd ) ) THEN + inform%GLTR_inform%negative_curvature .AND. .NOT. & + ( control%extrapolate > 1 .AND. inner_iteration == 0 ) ) .OR. & + ( control%extrapolate > 0 .AND. inner_iteration > 2 .AND. & + mu < 1.01_rp_ * control%mu_min .AND. successful_iteration .AND.& + norm_cd > 0.9_rp_ * old_norm_cd ) ) THEN inform%status = GALAHAD_ok inform%GLTR_inform%status = 1 start_major = .TRUE. @@ -7312,7 +7312,7 @@ SUBROUTINE QPB_solve_main( dims, n, m, & ! Update convergence tolerances, theta_c, theta_d and theta_e - IF ( mu < 1.01_rp_ * control%mu_min .AND. & + IF ( mu < 1.01_rp_ * control%mu_min .AND. & control%extrapolate > 0 .AND. allow_extrapolate) THEN ! theta_c = ten * epsmch ! theta_d = ten * epsmch diff --git a/src/qpc/inqpc.F90 b/src/qpc/inqpc.F90 index c42c760a7b..704208d67a 100644 --- a/src/qpc/inqpc.F90 +++ b/src/qpc/inqpc.F90 @@ -343,7 +343,7 @@ PROGRAM RUNQPC_DATA_precision DEALLOCATE( IW ) ALLOCATE( prob%A%row( 0 ), prob%H%row( 0 ), STAT = alloc_stat ) IF ( alloc_stat /= 0 ) THEN - WRITE( out, "( ' whoa there - allocate error ', i6 )" ) alloc_stat ; STOP + WRITE( out, "( ' stop - allocate error ', i6 )" ) alloc_stat ; STOP END IF prob%new_problem_structure = .TRUE. diff --git a/src/qpp/qpps.f90 b/src/qpp/qpps.f90 index 861c91f7de..a6c071f166 100644 --- a/src/qpp/qpps.f90 +++ b/src/qpp/qpps.f90 @@ -66,22 +66,27 @@ PROGRAM GALAHAD_QPP_EXAMPLE WRITE( 6, "( /, 5X, 'i', 6x, 'v', 11X, 'l', 11X, 'u', 11X, 'z', 11X, & & 'g', 6X, 'type' )" ) DO i = 1, d%x_free ! free variables - WRITE( 6, 10 ) i, p%X( i ), p%X_l( i ), p%X_u( i ), p%Z( i ), p%G( i ), ' ' + WRITE( 6, 10 ) i, p%X( i ), p%X_l( i ), p%X_u( i ), p%Z( i ), p%G( i ), & + ' ' END DO DO i = d%x_free + 1, d%x_l_start - 1 ! non-negativities - WRITE( 6, 10 ) i, p%X( i ), p%X_l( i ), p%X_u( i ), p%Z( i ), p%G( i ), '0< ' + WRITE( 6, 10 ) i, p%X( i ), p%X_l( i ), p%X_u( i ), p%Z( i ), p%G( i ), & + '0< ' END DO DO i = d%x_l_start, d%x_u_start - 1 ! lower-bounded variables - WRITE( 6, 10 ) i, p%X( i ), p%X_l( i ), p%X_u( i ), p%Z( i ), p%G( i ), 'l< ' + WRITE( 6, 10 ) i, p%X( i ), p%X_l( i ), p%X_u( i ), p%Z( i ), p%G( i ), & + 'l< ' END DO DO i = d%x_u_start, d%x_l_end ! range-bounded variables - WRITE( 6, 10 ) i, p%X( i ), p%X_l( i ), p%X_u( i ), p%Z( i ), p%G( i ), 'l a ) & smallest_root_in_interval = MIN( & - REAL( data%CROOTS( j ), KIND = rp_ ), & + REAL( data%CROOTS( j ), KIND = rp_ ), & smallest_root_in_interval ) END DO GO TO 990 diff --git a/src/rqs/rqss.f90 b/src/rqs/rqss.f90 index 79ea6c5c18..c8f8f70cae 100644 --- a/src/rqs/rqss.f90 +++ b/src/rqs/rqss.f90 @@ -25,10 +25,12 @@ PROGRAM GALAHAD_RQS_EXAMPLE ! GALAHAD 2.4 - 14/05/2010 AT 14:30 GMT. CALL SMT_put( M%type, 'DIAGONAL', s ) ! Specify diagonal for M ALLOCATE( M%val( n ) ) ; M%val = 2.0_wp CALL RQS_initialize( data, control, inform ) ! Initialize control parameters - CALL RQS_solve( n, p, sigma, f, C, H, X, data, control, inform, M = M ) ! Solve + CALL RQS_solve( n, p, sigma, f, C, H, X, data, & + control, inform, M = M ) ! Solve IF ( inform%status == 0 ) THEN ! Successful return - WRITE( 6, "( 1X, I0, ' factorizations. Objective and Lagrange multiplier =',& - & 2ES12.4 )" ) inform%factorizations, inform%obj, inform%multiplier + WRITE( 6, "( 1X, I0, & + ' factorizations. Objective and Lagrange multiplier =', 2ES12.4 )" ) & + inform%factorizations, inform%obj, inform%multiplier ELSE ! Error returns WRITE( 6, "( ' RQS_solve exit status = ', I0 ) " ) inform%status END IF diff --git a/src/sbls/old_sbls.F90 b/src/sbls/old_sbls.F90 deleted file mode 100644 index 165a763032..0000000000 --- a/src/sbls/old_sbls.F90 +++ /dev/null @@ -1,6414 +0,0 @@ -! THIS VERSION: GALAHAD 4.1 - 2023-01-24 AT 09:30 GMT. - -#include "galahad_modules.h" - -!-*-*-*-*-*-*-*-*-*- G A L A H A D _ S B L S M O D U L E -*-*-*-*-*-*-*-*- - -! Copyright reserved, Gould/Orban/Toint, for GALAHAD productions -! Principal author: Nick Gould - -! History - -! development started May 12th 2004 -! originally released GALAHAD Version 2.0. February 16th 2005 - -! For full documentation, see -! http://galahad.rl.ac.uk/galahad-www/specs.html - - MODULE GALAHAD_SBLS_precision - - USE GALAHAD_KINDS_precision - -! --------------------------------------------------------------- -! | | -! | Given matrices A and (symmetric) H and C, provide and apply | -! | preconditioners for the symmetric block linear system | -! | | -! | ( H A^T ) ( x ) = ( a ) | -! | ( A -C ) ( y ) ( b ) | -! | | -! | of the form | -! | | -! | K = ( G A^T ) | -! | ( A -C ) | -! | | -! | involving some suitable symmetric, second-order sufficient G | -! | | -! --------------------------------------------------------------- - - USE GALAHAD_SYMBOLS - USE GALAHAD_SPACE_precision - USE GALAHAD_SMT_precision - USE GALAHAD_SMT_precision, ONLY: GLS_type => SMT_type - USE GALAHAD_QPT_precision, ONLY: QPT_keyword_H, QPT_keyword_A - USE GALAHAD_SORT_precision, ONLY: SORT_reorder_by_rows - USE GALAHAD_SILS_precision - USE GALAHAD_GLS_precision - USE GALAHAD_SPECFILE_precision - - IMPLICIT NONE - - PRIVATE - PUBLIC :: SBLS_initialize, SBLS_read_specfile, SBLS_basis_solve, & - SBLS_form_and_factorize, SBLS_solve, SBLS_solve_explicit, & - SBLS_solve_implicit, SBLS_solve_null_space, SBLS_terminate, & - SMT_type, SMT_put, SMT_get - -!-------------------- - - -!------------------------------------------------- -! D e r i v e d t y p e d e f i n i t i o n s -!------------------------------------------------- - - TYPE, PUBLIC :: SBLS_control_type - INTEGER ( KIND = ip_ ) :: error, out, print_level - INTEGER ( KIND = ip_ ) :: indmin, valmin, len_glsmin, itref_max, scaling - INTEGER ( KIND = ip_ ) :: ordering, preconditioner, factorization, max_col - INTEGER ( KIND = ip_ ) :: new_a, new_h, new_c, semi_bandwidth - REAL ( KIND = rp_ ) :: pivot_tol, pivot_tol_for_basis, zero_pivot - REAL ( KIND = rp_ ) :: static_tolerance, static_level, min_diagonal - LOGICAL :: remove_dependencies, find_basis_by_transpose, affine - LOGICAL :: perturb_to_make_definite, get_norm_residual, check_basis - LOGICAL :: space_critical, deallocate_error_fatal - CHARACTER ( LEN = 30 ) :: prefix - END TYPE - - TYPE, PUBLIC :: SBLS_explicit_factors_type - PRIVATE - INTEGER ( KIND = ip_ ) :: rank_a, len_sol_workspace, g_ne, k_g, k_c, k_pert - TYPE ( SMT_type ) :: K - TYPE ( GLS_type ) :: B - TYPE ( SILS_factors ) :: K_factors - TYPE ( GLS_factors ) :: B_factors - TYPE ( SILS_control ) :: K_control - TYPE ( GLS_control ) :: B_control - INTEGER ( KIND = ip_ ), ALLOCATABLE, DIMENSION( : ) :: B_ROWS - INTEGER ( KIND = ip_ ), ALLOCATABLE, DIMENSION( : ) :: B_COLS - INTEGER ( KIND = ip_ ), ALLOCATABLE, DIMENSION( : ) :: B_COLS_basic - INTEGER ( KIND = ip_ ), ALLOCATABLE, DIMENSION( : ) :: A_col_ptr - INTEGER ( KIND = ip_ ), ALLOCATABLE, DIMENSION( : ) :: A_by_rows - INTEGER ( KIND = ip_ ), ALLOCATABLE, DIMENSION( : ) :: A_row - INTEGER ( KIND = ip_ ), ALLOCATABLE, DIMENSION( : ) :: IW - INTEGER ( KIND = ip_ ), ALLOCATABLE, DIMENSION( : ) :: A_row_ptr - INTEGER ( KIND = ip_ ), ALLOCATABLE, DIMENSION( : ) :: A_by_cols - INTEGER ( KIND = ip_ ), ALLOCATABLE, DIMENSION( : ) :: IW2 - REAL ( KIND = rp_ ), ALLOCATABLE, DIMENSION( : ) :: W - REAL ( KIND = rp_ ), ALLOCATABLE, DIMENSION( : ) :: G_diag - REAL ( KIND = rp_ ), ALLOCATABLE, DIMENSION( : ) :: RHS - REAL ( KIND = rp_ ), ALLOCATABLE, DIMENSION( : ) :: RHS_orig - END TYPE - - TYPE, PUBLIC :: SBLS_implicit_factors_type - PRIVATE - INTEGER ( KIND = ip_ ) :: rank_a, m, n, k_n, len_sol_workspace, n_r - LOGICAL :: unitb22, unitb31, unitp22, zerob32, zerob33, zerop11, zerop21 - TYPE ( SMT_type ) :: A2, P11, P21, B22, B32, B33 - TYPE ( GLS_type ) :: A1, B31, P22 - TYPE ( GLS_factors ) :: A1_factors, B31_factors, P22_factors - TYPE ( GLS_control ) :: A1_control, B31_control, P22_control - TYPE ( SILS_factors ) :: B22_factors - TYPE ( SILS_control ) :: B22_control - INTEGER ( KIND = ip_ ), ALLOCATABLE, DIMENSION( : ) :: A_ROWS_order - INTEGER ( KIND = ip_ ), ALLOCATABLE, DIMENSION( : ) :: A_COLS_order - INTEGER ( KIND = ip_ ), ALLOCATABLE, DIMENSION( : ) :: A_ROWS_basic - INTEGER ( KIND = ip_ ), ALLOCATABLE, DIMENSION( : ) :: A_COLS_basic - REAL ( KIND = rp_ ), ALLOCATABLE, DIMENSION( : ) :: RHS_orig - REAL ( KIND = rp_ ), ALLOCATABLE, DIMENSION( : ) :: SOL_perm - REAL ( KIND = rp_ ), ALLOCATABLE, DIMENSION( : ) :: SOL_current - REAL ( KIND = rp_ ), ALLOCATABLE, DIMENSION( : ) :: PERT - END TYPE - - TYPE, PUBLIC :: SBLS_null_space_factors_type - PRIVATE - INTEGER ( KIND = ip_ ) :: rank_a, m, n, k_n, len_sol_workspace, n_r - TYPE ( SMT_type ) :: A2, H11, H21, H22, R_sparse - TYPE ( GLS_type ) :: A1 - TYPE ( GLS_factors ) :: A1_factors - TYPE ( GLS_control ) :: A1_control - TYPE ( SILS_factors ) :: R_sparse_factors - TYPE ( SILS_control ) :: R_sparse_control - INTEGER ( KIND = ip_ ), ALLOCATABLE, DIMENSION( : ) :: A_ROWS_order - INTEGER ( KIND = ip_ ), ALLOCATABLE, DIMENSION( : ) :: A_COLS_order - INTEGER ( KIND = ip_ ), ALLOCATABLE, DIMENSION( : ) :: A_ROWS_basic - INTEGER ( KIND = ip_ ), ALLOCATABLE, DIMENSION( : ) :: A_COLS_basic - INTEGER ( KIND = ip_ ), ALLOCATABLE, DIMENSION( : ) :: IW - REAL ( KIND = rp_ ), ALLOCATABLE, DIMENSION( : ) :: V - REAL ( KIND = rp_ ), ALLOCATABLE, DIMENSION( : ) :: W - REAL ( KIND = rp_ ), ALLOCATABLE, DIMENSION( : ) :: RHS - REAL ( KIND = rp_ ), ALLOCATABLE, DIMENSION( : ) :: RHS_orig - REAL ( KIND = rp_ ), ALLOCATABLE, DIMENSION( : ) :: SOL_current - REAL ( KIND = rp_ ), ALLOCATABLE, DIMENSION( : ) :: PERT - REAL ( KIND = rp_ ), ALLOCATABLE, DIMENSION( : , : ) :: R - REAL ( KIND = rp_ ), ALLOCATABLE, DIMENSION( : , : ) :: R_factors - REAL ( KIND = rp_ ), ALLOCATABLE, DIMENSION( : , : ) :: SOL_perm - END TYPE - - TYPE, PUBLIC :: SBLS_data_type - INTEGER ( KIND = ip_ ) :: last_preconditioner, last_factorization, len_sol - TYPE ( SBLS_explicit_factors_type ) :: efactors - TYPE ( SBLS_implicit_factors_type ) :: ifactors - TYPE ( SBLS_null_space_factors_type ) :: nfactors - END TYPE - - TYPE, PUBLIC :: SBLS_inform_type - INTEGER ( KIND = ip_ ) :: status, alloc_status - INTEGER ( KIND = ip_ ) :: sils_analyse_status, sils_factorize_status - INTEGER ( KIND = ip_ ) :: sils_solve_status - INTEGER ( KIND = ip_ ) :: gls_analyse_status, gls_solve_status, sort_status - INTEGER ( KIND = ip_ ) :: factorization_integer, factorization_real - INTEGER ( KIND = ip_ ) :: preconditioner, factorization, rank - LOGICAL :: rank_def, perturbed - REAL ( KIND = rp_ ) :: norm_residual - CHARACTER ( LEN = 80 ) :: bad_alloc - END TYPE - -!---------------------- -! P a r a m e t e r s -!---------------------- - - INTEGER ( KIND = ip_ ), PARAMETER :: max_sc = 200 - INTEGER ( KIND = ip_ ), PARAMETER :: no_last = - 1000 - REAL ( KIND = rp_ ), PARAMETER :: zero = 0.0_rp_ - REAL ( KIND = rp_ ), PARAMETER :: half = 0.5_rp_ - REAL ( KIND = rp_ ), PARAMETER :: one = 1.0_rp_ - REAL ( KIND = rp_ ), PARAMETER :: epsmch = EPSILON( one ) - -!--------------------------------- -! I n t e r f a c e B l o c k s -!--------------------------------- - - INTERFACE POTRF - - SUBROUTINE SPOTRF( uplo, n, A, lda, info ) - CHARACTER, INTENT( IN ) :: uplo - INTEGER ( KIND = ip_ ), INTENT( IN ) :: n, lda - INTEGER ( KIND = ip_ ), INTENT( OUT ) :: info - REAL, INTENT( INOUT ), DIMENSION( lda, n ) :: A - END SUBROUTINE SPOTRF - - SUBROUTINE DPOTRF( uplo, n, A, lda, info ) - CHARACTER, INTENT( IN ) :: uplo - INTEGER ( KIND = ip_ ), INTENT( IN ) :: n, lda - INTEGER ( KIND = ip_ ), INTENT( OUT ) :: info - DOUBLE PRECISION, INTENT( INOUT ), DIMENSION( lda, n ) :: A - END SUBROUTINE DPOTRF - - END INTERFACE - - INTERFACE POTRS - - SUBROUTINE SPOTRS( uplo, n, nrhs, A, lda, B, ldb, info ) - CHARACTER, INTENT( IN ) :: uplo - INTEGER ( KIND = ip_ ), INTENT( IN ) :: n, nrhs, lda, ldb - INTEGER ( KIND = ip_ ), INTENT( OUT ) :: info - REAL, INTENT( IN ), DIMENSION( lda, n ) :: A - REAL, INTENT( INOUT ), DIMENSION( ldb, n ) :: B - END SUBROUTINE SPOTRS - - SUBROUTINE DPOTRS( uplo, n, nrhs, A, lda, B, ldb, info ) - CHARACTER, INTENT( IN ) :: uplo - INTEGER ( KIND = ip_ ), INTENT( IN ) :: n, nrhs, lda, ldb - INTEGER ( KIND = ip_ ), INTENT( OUT ) :: info - DOUBLE PRECISION, INTENT( IN ), DIMENSION( lda, n ) :: A - DOUBLE PRECISION, INTENT( INOUT ), DIMENSION( ldb, n ) :: B - END SUBROUTINE DPOTRS - - END INTERFACE - - CONTAINS - -!-*-*-*-*-*- S B L S _ I N I T I A L I Z E S U B R O U T I N E -*-*-*-*-* - - SUBROUTINE SBLS_initialize( data, control ) - -! =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- -! -! Default control data for SBLS. This routine should be called before -! SBLS_solve -! -! -------------------------------------------------------------------- -! -! Arguments: -! -! control a structure containing control information. Components are - -! -! INTEGER control parameters: -! -! error. Error and warning diagnostics occur on stream error -! -! out. General output occurs on stream out -! -! print_level. The level of output required is specified by print_level -! -! indmin. An initial guess as to the integer workspace required by SILS -! -! valmin. An initial guess as to the real workspace required by SILS -! -! len_glsmin. An initial guess as to the workspace required by GLS -! -! itref_max. The maximum number of iterative refinements allowed -! -! preconditioner. The preconditioner to be used for the CG is defined by -! preconditioner. Possible values are -! -! variable: -! 0 automatic -! -! explicit factorization: -! -! 1 no preconditioner, G = I -! 2 full factorization, G = H -! 3 diagonal, G = diag( max( H, %min_diagonal ) ) -! 4 banded, G = band( H ) with semi-bandwidth %semi_bandwidth -! 11 G_11 = 0, G_21 = 0, G_22 = H_22 -! 12 G_11 = 0, G_21 = H_21, G_22 = H_22 -! -! implicit factorization: -! -! -1 G_11 = 0, G_21 = 0, G_22 = I -! -2 G_11 = 0, G_21 = 0, G_22 = H_22 -! -! semi_bandwidth. The semi-bandwidth of a band preconditioner, if appropriate -! -! factorization. The factorization to be used. -! Possible values are -! -! 0 automatic -! 1 Schur-complement factorization -! 2 augmented-system factorization -! 3 null-space factorization -! -! max_col. The maximum number of nonzeros in a column of A which is permitted -! with the Schur-complement factorization -! -! new_h. How much of H has changed since the previous factorization. -! Possible values are -! -! 0 unchanged -! 1 values but not indices have changed -! 2 values and indices have changed -! -! new_a. How much of A has changed since the previous factorization. -! Possible values are -! -! 0 unchanged -! 1 values but not indices have changed -! 2 values and indices have changed -! -! new_c. How much of C has changed since the previous factorization. -! Possible values are -! -! 0 unchanged -! 1 values but not indices have changed -! 2 values and indices have changed -! -! REAL control parameters: -! -! pivot_tol. The threshold pivot used by the matrix factorization. -! See the documentation for SILS for details -! -! pivot_tol_for_basis. The threshold pivot used by the matrix -! factorization when attempting to construct the basis. -! See the documentation for GLS for details -! -! zero_pivot. Any pivots smaller than zero_pivot in absolute value will -! be regarded to be zero when attempting to detect linearly dependent -! constraints -! -! static_tolerance & static_level (may be) used by SILS -! -! min_diagonal. Diagonal preconditioners will have diagonals no smaller -! than min_diagonal -! -! LOGICAL control parameters: -! -! find_basis_by_transpose. If true, implicit factorization preconditioners -! will be based on a basis of A found by examining A's transpose -! -! remove_dependencies. If true, the equality constraints will be preprocessed -! to remove any linear dependencies -! -! check_basis. If true and an implicit or null-space preconditioner is -! used, the computed basis matrix will be assessed for ill conditioning -! and, if necessary an attempt will be made to correct for this -! -! affine. If true, the second block component of the right-hand side c -! will be assumed to be zero. This can lead to some efficiencies -! in the solve stage -! -! perturb_to_make_definite. If true and the initial attempt at finding -! a preconditioner is unsuccessful, the diagonal will be perturbed so -! that a second attempt succeeds -! -! get_norm_residual. If true, the residual when applying the preconditioner -! will be calculated -! -! space_critical. If true, every effort will be made to use as little -! space as possible. This may result in longer computation times -! -! deallocate_error_fatal. If true, any array/pointer deallocation error -! will terminate execution. Otherwise, computation will continue -! -! CHARACTER control parameters: -! -! prefix (len=30). All output lines will be prefixed by -! %prefix(2:LEN(TRIM(%prefix))-1) -! where %prefix contains the required string enclosed in -! quotes, e.g. "string" or 'string' -! -! =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- - - TYPE ( SBLS_data_type ), INTENT( INOUT ) :: data - TYPE ( SBLS_control_type ), INTENT( OUT ) :: control - -! Set control parameters - -! Integer parameters - - control%error = 6 - control%out = 6 - control%print_level = 0 - control%indmin = 1000 - control%valmin = 1000 - control%len_glsmin = 1000 - control%itref_max = 1 - control%preconditioner = 0 - control%semi_bandwidth = 5 - control%factorization = 0 - control%max_col = 35 - control%ordering = 5 - control%scaling = 0 - control%new_h = 2 - control%new_a = 2 - control%new_c = 2 - -! Real parameters - - control%pivot_tol = 0.01_rp_ -! control%pivot_tol = epsmch ** 0.75 - control%pivot_tol_for_basis = half - control%zero_pivot = epsmch ** 0.75 - control%static_tolerance = 0.0_rp_ - control%static_level = 0.0_rp_ - control%min_diagonal = 0.00001_rp_ - -! Logical parameters - - control%remove_dependencies = .TRUE. - control%find_basis_by_transpose = .TRUE. - control%perturb_to_make_definite = .TRUE. - control%check_basis = .TRUE. - control%affine = .FALSE. - control%space_critical = .FALSE. - control%get_norm_residual = .FALSE. - control%deallocate_error_fatal = .FALSE. - -! Character parameters - - control%prefix = '"" ' - -! Ensure that the private data arrays have the correct initial status - - data%last_preconditioner = no_last - data%last_factorization = no_last - data%efactors%len_sol_workspace = - 1 - data%ifactors%len_sol_workspace = - 1 - -! Initialize control parameters and arrays used within SILS and M48 - - CALL GLS_INITIALIZE( data%efactors%B_factors, & - data%efactors%B_control ) - CALL GLS_INITIALIZE( data%ifactors%A1_factors, & - data%ifactors%A1_control ) - CALL GLS_INITIALIZE( data%nfactors%A1_factors, & - data%nfactors%A1_control ) - CALL SILS_INITIALIZE( data%efactors%K_factors, & - data%efactors%K_control ) - CALL SILS_INITIALIZE( data%ifactors%B22_factors, & - data%ifactors%B22_control ) - CALL SILS_INITIALIZE( data%nfactors%R_sparse_factors, & - data%nfactors%R_sparse_control ) - - RETURN - -! End of SBLS_initialize - - END SUBROUTINE SBLS_initialize - -!-*-*-*- S B L S _ R E A D _ S P E C F I L E S U B R O U T I N E -*-*-*- - - SUBROUTINE SBLS_read_specfile( control, device, alt_specname ) - -! Reads the content of a specification file, and performs the assignment of -! values associated with given keywords to the corresponding control parameters - -! The defauly values as given by SBLS_initialize could (roughly) -! have been set as: - -! BEGIN SBLS SPECIFICATIONS (DEFAULT) -! error-printout-device 6 -! printout-device 6 -! print-level 0 -! initial-workspace-for-unsymmetric-solver 1000 -! initial-integer-workspace 1000 -! initial-real-workspace 1000 -! maximum-refinements 1 -! preconditioner-used 0 -! semi-bandwidth-for-band-preconditioner 5 -! factorization-used 0 -! maximum-column-nonzeros-in-schur-complement 35 -! ordering-used 3 -! scaling-used 0 -! has-a-changed 2 -! has-h-changed 2 -! has-c-changed 2 -! minimum-diagonal 1.0D-5 -! pivot-tolerance-used 1.0D-12 -! pivot-tolerance-used-for-basis 0.5 -! zero-pivot-tolerance 1.0D-12 -! static-pivoting-diagonal-perturbation 0.0D+0 -! level-at-which-to-switch-to-static 0.0D+0 -! find-basis-by-transpose T -! check-for-reliable-basis T -! remove-linear-dependencies T -! perturb-to-make-+ve-definite T -! space-critical F -! deallocate-error-fatal F -! output-line-prefix "" -! END SBLS SPECIFICATIONS - -! Dummy arguments - - TYPE ( SBLS_control_type ), INTENT( INOUT ) :: control - INTEGER ( KIND = ip_ ), INTENT( IN ) :: device - CHARACTER( LEN = 16 ), OPTIONAL :: alt_specname - -! Programming: Nick Gould and Ph. Toint, January 2002. - -! Local variables - - INTEGER ( KIND = ip_ ), PARAMETER :: lspec = 36 - CHARACTER( LEN = 16 ), PARAMETER :: specname = 'SBLS' - TYPE ( SPECFILE_item_type ), DIMENSION( lspec ) :: spec - -! Define the keywords - - spec%keyword = '' - -! Integer key-words - - spec( 1 )%keyword = 'error-printout-device' - spec( 2 )%keyword = 'printout-device' - spec( 3 )%keyword = 'print-level' - spec( 8 )%keyword = 'initial-workspace-for-unsymmetric-solver' - spec( 9 )%keyword = 'initial-integer-workspace' - spec( 10 )%keyword = 'initial-real-workspace' - spec( 11 )%keyword = 'maximum-refinements' - spec( 14 )%keyword = 'preconditioner-used' - spec( 15 )%keyword = 'semi-bandwidth-for-band-preconditioner' - spec( 16 )%keyword = 'factorization-used' - spec( 17 )%keyword = 'maximum-column-nonzeros-in-schur-complement' - spec( 18 )%keyword = 'ordering-used' - spec( 20 )%keyword = 'scaling-used' - spec( 21 )%keyword = 'has-a-changed' - spec( 22 )%keyword = 'has-h-changed' - spec( 23 )%keyword = 'has-c-changed' - -! Real key-words - - spec( 25 )%keyword = 'minimum-diagonal' - spec( 26 )%keyword = 'pivot-tolerance-used' - spec( 27 )%keyword = 'pivot-tolerance-used-for-basis' - spec( 28 )%keyword = 'zero-pivot-tolerance' - spec( 29 )%keyword = 'static-pivoting-diagonal-perturbation' - spec( 30 )%keyword = 'level-at-which-to-switch-to-static' - -! Logical key-words - - spec( 31 )%keyword = 'perturb-to-make-+ve-definite' - spec( 32 )%keyword = 'space-critical' - spec( 33 )%keyword = 'find-basis-by-transpose' - spec( 24 )%keyword = 'check-for-reliable-basis' - spec( 34 )%keyword = 'remove-linear-dependencies' - spec( 35 )%keyword = 'deallocate-error-fatal' - -! Character key-words - -! spec( 36 )%keyword = 'output-line-prefix' - -! Read the specfile - - IF ( PRESENT( alt_specname ) ) THEN - CALL SPECFILE_read( device, alt_specname, spec, lspec, control%error ) - ELSE - CALL SPECFILE_read( device, specname, spec, lspec, control%error ) - END IF - -! Interpret the result - -! Set integer values - - CALL SPECFILE_assign_value( spec( 1 ), control%error, & - control%error ) - CALL SPECFILE_assign_value( spec( 2 ), control%out, & - control%error ) - CALL SPECFILE_assign_value( spec( 3 ), control%print_level, & - control%error ) - CALL SPECFILE_assign_value( spec( 8 ), control%len_glsmin, & - control%error ) - CALL SPECFILE_assign_value( spec( 9 ), control%indmin, & - control%error ) - CALL SPECFILE_assign_value( spec( 10 ), control%valmin, & - control%error ) - CALL SPECFILE_assign_value( spec( 11 ), control%itref_max, & - control%error ) - CALL SPECFILE_assign_value( spec( 14 ), control%preconditioner, & - control%error ) - CALL SPECFILE_assign_value( spec( 15 ), control%semi_bandwidth, & - control%error ) - CALL SPECFILE_assign_value( spec( 16 ), control%factorization, & - control%error ) - CALL SPECFILE_assign_value( spec( 17 ), control%max_col, & - control%error ) - CALL SPECFILE_assign_value( spec( 18 ), control%ordering, & - control%error ) - CALL SPECFILE_assign_value( spec( 20 ), control%scaling, & - control%error ) - CALL SPECFILE_assign_value( spec( 21 ), control%new_a, & - control%error ) - CALL SPECFILE_assign_value( spec( 22 ), control%new_h, & - control%error ) - CALL SPECFILE_assign_value( spec( 23 ), control%new_c, & - control%error ) - -! Set real values - - CALL SPECFILE_assign_value( spec( 25 ), control%min_diagonal, & - control%error ) - CALL SPECFILE_assign_value( spec( 26 ), control%pivot_tol, & - control%error ) - CALL SPECFILE_assign_value( spec( 27 ), & - control%pivot_tol_for_basis, & - control%error ) - CALL SPECFILE_assign_value( spec( 28 ), control%zero_pivot, & - control%error ) - CALL SPECFILE_assign_value( spec( 29 ), control%static_tolerance, & - control%error ) - CALL SPECFILE_assign_value( spec( 30 ), control%static_level, & - control%error ) - -! Set logical values - - CALL SPECFILE_assign_value( spec( 31 ), & - control%perturb_to_make_definite, & - control%error ) - CALL SPECFILE_assign_value( spec( 32 ), control%space_critical, & - control%error ) - CALL SPECFILE_assign_value( spec( 33 ), & - control%find_basis_by_transpose, & - control%error ) - CALL SPECFILE_assign_value( spec( 24 ), control%check_basis, & - control%error ) - CALL SPECFILE_assign_value( spec( 34 ), control%remove_dependencies, & - control%error ) - CALL SPECFILE_assign_value( spec( 35 ), & - control%deallocate_error_fatal, & - control%error ) - -! Set charcter values - -! CALL SPECFILE_assign_value( spec( 36 ), control%prefix, & -! control%error ) - - RETURN - - END SUBROUTINE SBLS_read_specfile - -!-*-*-*-*-*- S B L S _ T E R M I N A T E S U B R O U T I N E -*-*-*-*-* - - SUBROUTINE SBLS_terminate( data, control, inform ) - -! =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- - -! .............................................. -! . . -! . Deallocate internal arrays at the end . -! . of the computation . -! . . -! .............................................. - -! Arguments: -! ========= -! -! data see Subroutine SBLS_initialize -! control see Subroutine SBLS_initialize -! inform see Subroutine SBLS_solve - -! =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- - -! Dummy arguments - - TYPE ( SBLS_control_type ), INTENT( IN ) :: control - TYPE ( SBLS_inform_type ), INTENT( INOUT ) :: inform - TYPE ( SBLS_data_type ), INTENT( INOUT ) :: data - -! Local variables - - CHARACTER ( LEN = 80 ) :: array_name - -! Deallocate all arrays allocated within SILS and GLS - - CALL SILS_finalize( data%efactors%K_factors, & - data%efactors%K_control, inform%alloc_status ) - IF ( control%deallocate_error_fatal .AND. inform%alloc_status /= 0 ) THEN - inform%status = GALAHAD_error_deallocate ; RETURN - END IF - - CALL GLS_finalize( data%efactors%B_factors, & - data%efactors%B_control, inform%alloc_status ) - IF ( control%deallocate_error_fatal .AND. inform%alloc_status /= 0 ) THEN - inform%status = GALAHAD_error_deallocate ; RETURN - END IF - - CALL GLS_finalize( data%ifactors%A1_factors, & - data%ifactors%A1_control, inform%alloc_status ) - IF ( control%deallocate_error_fatal .AND. inform%alloc_status /= 0 ) THEN - inform%status = GALAHAD_error_deallocate ; RETURN - END IF - -! CALL GLS_finalize( data%ifactors%B31_factors, & -! data%ifactors%B31_control, inform%alloc_status ) -! IF ( control%deallocate_error_fatal .AND. inform%alloc_status /= 0 ) THEN -! inform%status = GALAHAD_error_deallocate ; RETURN -! END IF - -! CALL GLS_finalize( data%ifactors%P22_factors, & -! data%ifactors%P22_control, inform%alloc_status ) -! IF ( control%deallocate_error_fatal .AND. inform%alloc_status /= 0 ) THEN -! inform%status = GALAHAD_error_deallocate ; RETURN -! END IF - - CALL SILS_finalize( data%ifactors%B22_factors, & - data%ifactors%B22_control, inform%alloc_status ) - IF ( control%deallocate_error_fatal .AND. inform%alloc_status /= 0 ) THEN - inform%status = GALAHAD_error_deallocate ; RETURN - END IF - - CALL GLS_finalize( data%nfactors%A1_factors, & - data%nfactors%A1_control, inform%alloc_status ) - IF ( control%deallocate_error_fatal .AND. inform%alloc_status /= 0 ) THEN - inform%status = GALAHAD_error_deallocate ; RETURN - END IF - - CALL SILS_finalize( data%nfactors%R_sparse_factors, & - data%nfactors%R_sparse_control, inform%alloc_status ) - IF ( control%deallocate_error_fatal .AND. inform%alloc_status /= 0 ) THEN - inform%status = GALAHAD_error_deallocate ; RETURN - END IF - -! Deallocate all remaining allocated arrays - - array_name = 'sbls: efactors%IW' - CALL SPACE_dealloc_array( data%efactors%IW, & - inform%status, inform%alloc_status, array_name = array_name, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( control%deallocate_error_fatal .AND. & - inform%status /= GALAHAD_ok ) RETURN - - array_name = 'sbls: efactors%A_col_ptr' - CALL SPACE_dealloc_array( data%efactors%A_col_ptr, & - inform%status, inform%alloc_status, array_name = array_name, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( control%deallocate_error_fatal .AND. & - inform%status /= GALAHAD_ok ) RETURN - - array_name = 'sbls: efactors%A_row_ptr' - CALL SPACE_dealloc_array( data%efactors%A_row_ptr, & - inform%status, inform%alloc_status, array_name = array_name, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( control%deallocate_error_fatal .AND. & - inform%status /= GALAHAD_ok ) RETURN - - array_name = 'sbls: efactors%A_by_rows' - CALL SPACE_dealloc_array( data%efactors%A_by_rows, & - inform%status, inform%alloc_status, array_name = array_name, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( control%deallocate_error_fatal .AND. & - inform%status /= GALAHAD_ok ) RETURN - - array_name = 'sbls: efactors%A_by_cols' - CALL SPACE_dealloc_array( data%efactors%A_by_cols, & - inform%status, inform%alloc_status, array_name = array_name, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( control%deallocate_error_fatal .AND. & - inform%status /= GALAHAD_ok ) RETURN - - array_name = 'sbls: efactors%A_row' - CALL SPACE_dealloc_array( data%efactors%A_row, & - inform%status, inform%alloc_status, array_name = array_name, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( control%deallocate_error_fatal .AND. & - inform%status /= GALAHAD_ok ) RETURN - - array_name = 'sbls: efactors%W' - CALL SPACE_dealloc_array( data%efactors%W, & - inform%status, inform%alloc_status, array_name = array_name, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( control%deallocate_error_fatal .AND. & - inform%status /= GALAHAD_ok ) RETURN - - array_name = 'sbls: efactors%IW' - CALL SPACE_dealloc_array( data%efactors%IW, & - inform%status, inform%alloc_status, array_name = array_name, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( control%deallocate_error_fatal .AND. & - inform%status /= GALAHAD_ok ) RETURN - - array_name = 'sbls: efactors%IW2' - CALL SPACE_dealloc_array( data%efactors%IW2, & - inform%status, inform%alloc_status, array_name = array_name, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( control%deallocate_error_fatal .AND. & - inform%status /= GALAHAD_ok ) RETURN - - array_name = 'sbls: efactors%K%row' - CALL SPACE_dealloc_array( data%efactors%K%row, & - inform%status, inform%alloc_status, array_name = array_name, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( control%deallocate_error_fatal .AND. & - inform%status /= GALAHAD_ok ) RETURN - - array_name = 'sbls: efactors%K%col' - CALL SPACE_dealloc_array( data%efactors%K%col, & - inform%status, inform%alloc_status, array_name = array_name, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( control%deallocate_error_fatal .AND. & - inform%status /= GALAHAD_ok ) RETURN - - array_name = 'sbls: efactors%K%val' - CALL SPACE_dealloc_array( data%efactors%K%val, & - inform%status, inform%alloc_status, array_name = array_name, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( control%deallocate_error_fatal .AND. & - inform%status /= GALAHAD_ok ) RETURN - - array_name = 'sbls: efactors%G_diag' - CALL SPACE_dealloc_array( data%efactors%G_diag, & - inform%status, inform%alloc_status, array_name = array_name, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( control%deallocate_error_fatal .AND. & - inform%status /= GALAHAD_ok ) RETURN - - array_name = 'sbls: efactors%B%row' - CALL SPACE_dealloc_array( data%efactors%B%row, & - inform%status, inform%alloc_status, array_name = array_name, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( control%deallocate_error_fatal .AND. & - inform%status /= GALAHAD_ok ) RETURN - - array_name = 'sbls: efactors%B%col' - CALL SPACE_dealloc_array( data%efactors%B%col, & - inform%status, inform%alloc_status, array_name = array_name, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( control%deallocate_error_fatal .AND. & - inform%status /= GALAHAD_ok ) RETURN - - array_name = 'sbls: efactors%B%val' - CALL SPACE_dealloc_array( data%efactors%B%val, & - inform%status, inform%alloc_status, array_name = array_name, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( control%deallocate_error_fatal .AND. & - inform%status /= GALAHAD_ok ) RETURN - - array_name = 'sbls: efactors%B_ROWS' - CALL SPACE_dealloc_array( data%efactors%B_ROWS, & - inform%status, inform%alloc_status, array_name = array_name, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( control%deallocate_error_fatal .AND. & - inform%status /= GALAHAD_ok ) RETURN - - array_name = 'sbls: efactors%B_COLS' - CALL SPACE_dealloc_array( data%efactors%B_COLS, & - inform%status, inform%alloc_status, array_name = array_name, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( control%deallocate_error_fatal .AND. & - inform%status /= GALAHAD_ok ) RETURN - - array_name = 'sbls: efactors%B_COLS_basic' - CALL SPACE_dealloc_array( data%efactors%B_COLS_basic, & - inform%status, inform%alloc_status, array_name = array_name, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( control%deallocate_error_fatal .AND. & - inform%status /= GALAHAD_ok ) RETURN - - array_name = 'sbls: ifactors%A1%row' - CALL SPACE_dealloc_array( data%ifactors%A1%row, & - inform%status, inform%alloc_status, array_name = array_name, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( control%deallocate_error_fatal .AND. & - inform%status /= GALAHAD_ok ) RETURN - - array_name = 'sbls: ifactors%A1%col' - CALL SPACE_dealloc_array( data%ifactors%A1%col, & - inform%status, inform%alloc_status, array_name = array_name, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( control%deallocate_error_fatal .AND. & - inform%status /= GALAHAD_ok ) RETURN - - array_name = 'sbls: ifactors%A1%val' - CALL SPACE_dealloc_array( data%ifactors%A1%val, & - inform%status, inform%alloc_status, array_name = array_name, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( control%deallocate_error_fatal .AND. & - inform%status /= GALAHAD_ok ) RETURN - - array_name = 'sbls: ifactors%A_ROWS_basic' - CALL SPACE_dealloc_array( data%ifactors%A_ROWS_basic, & - inform%status, inform%alloc_status, array_name = array_name, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( control%deallocate_error_fatal .AND. & - inform%status /= GALAHAD_ok ) RETURN - - array_name = 'sbls: ifactors%A_COLS_basic' - CALL SPACE_dealloc_array( data%ifactors%A_COLS_basic, & - inform%status, inform%alloc_status, array_name = array_name, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( control%deallocate_error_fatal .AND. & - inform%status /= GALAHAD_ok ) RETURN - - array_name = 'sbls: ifactors%A_ROWS_order' - CALL SPACE_dealloc_array( data%ifactors%A_ROWS_order, & - inform%status, inform%alloc_status, array_name = array_name, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( control%deallocate_error_fatal .AND. & - inform%status /= GALAHAD_ok ) RETURN - - array_name = 'sbls: ifactors%A_COLS_order' - CALL SPACE_dealloc_array( data%ifactors%A_COLS_order, & - inform%status, inform%alloc_status, array_name = array_name, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( control%deallocate_error_fatal .AND. & - inform%status /= GALAHAD_ok ) RETURN - - array_name = 'sbls: ifactors%A1%row' - CALL SPACE_dealloc_array( data%ifactors%A1%row, & - inform%status, inform%alloc_status, array_name = array_name, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( control%deallocate_error_fatal .AND. & - inform%status /= GALAHAD_ok ) RETURN - - array_name = 'sbls: ifactors%A1%col' - CALL SPACE_dealloc_array( data%ifactors%A1%col, & - inform%status, inform%alloc_status, array_name = array_name, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( control%deallocate_error_fatal .AND. & - inform%status /= GALAHAD_ok ) RETURN - - array_name = 'sbls: ifactors%A1%val' - CALL SPACE_dealloc_array( data%ifactors%A1%val, & - inform%status, inform%alloc_status, array_name = array_name, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( control%deallocate_error_fatal .AND. & - inform%status /= GALAHAD_ok ) RETURN - - array_name = 'sbls: ifactors%A2%row' - CALL SPACE_dealloc_array( data%ifactors%A2%row, & - inform%status, inform%alloc_status, array_name = array_name, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( control%deallocate_error_fatal .AND. & - inform%status /= GALAHAD_ok ) RETURN - - array_name = 'sbls: ifactors%A2%col' - CALL SPACE_dealloc_array( data%ifactors%A2%col, & - inform%status, inform%alloc_status, array_name = array_name, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( control%deallocate_error_fatal .AND. & - inform%status /= GALAHAD_ok ) RETURN - - array_name = 'sbls: ifactors%A2%val' - CALL SPACE_dealloc_array( data%ifactors%A2%val, & - inform%status, inform%alloc_status, array_name = array_name, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( control%deallocate_error_fatal .AND. & - inform%status /= GALAHAD_ok ) RETURN - - array_name = 'sbls: ifactors%B22%row' - CALL SPACE_dealloc_array( data%ifactors%B22%row, & - inform%status, inform%alloc_status, array_name = array_name, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( control%deallocate_error_fatal .AND. & - inform%status /= GALAHAD_ok ) RETURN - - array_name = 'sbls: ifactors%B22%col' - CALL SPACE_dealloc_array( data%ifactors%B22%col, & - inform%status, inform%alloc_status, array_name = array_name, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( control%deallocate_error_fatal .AND. & - inform%status /= GALAHAD_ok ) RETURN - - array_name = 'sbls: ifactors%B22%val' - CALL SPACE_dealloc_array( data%ifactors%B22%val, & - inform%status, inform%alloc_status, array_name = array_name, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( control%deallocate_error_fatal .AND. & - inform%status /= GALAHAD_ok ) RETURN - - array_name = 'sbls: ifactors%RHS_orig' - CALL SPACE_dealloc_array( data%ifactors%RHS_orig, & - inform%status, inform%alloc_status, array_name = array_name, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( control%deallocate_error_fatal .AND. & - inform%status /= GALAHAD_ok ) RETURN - - array_name = 'sbls: ifactors%SOL_perm' - CALL SPACE_dealloc_array( data%ifactors%SOL_perm, & - inform%status, inform%alloc_status, array_name = array_name, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( control%deallocate_error_fatal .AND. & - inform%status /= GALAHAD_ok ) RETURN - - array_name = 'sbls: ifactors%SOL_current' - CALL SPACE_dealloc_array( data%ifactors%SOL_current, & - inform%status, inform%alloc_status, array_name = array_name, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( control%deallocate_error_fatal .AND. & - inform%status /= GALAHAD_ok ) RETURN - - array_name = 'sbls: ifactors%PERT' - CALL SPACE_dealloc_array( data%ifactors%PERT, & - inform%status, inform%alloc_status, array_name = array_name, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( control%deallocate_error_fatal .AND. & - inform%status /= GALAHAD_ok ) RETURN - - - array_name = 'sbls: nfactors%A1%row' - CALL SPACE_dealloc_array( data%nfactors%A1%row, & - inform%status, inform%alloc_status, array_name = array_name, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( control%deallocate_error_fatal .AND. & - inform%status /= GALAHAD_ok ) RETURN - - array_name = 'sbls: nfactors%A1%col' - CALL SPACE_dealloc_array( data%nfactors%A1%col, & - inform%status, inform%alloc_status, array_name = array_name, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( control%deallocate_error_fatal .AND. & - inform%status /= GALAHAD_ok ) RETURN - - array_name = 'sbls: nfactors%A1%val' - CALL SPACE_dealloc_array( data%nfactors%A1%val, & - inform%status, inform%alloc_status, array_name = array_name, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( control%deallocate_error_fatal .AND. & - inform%status /= GALAHAD_ok ) RETURN - - array_name = 'sbls: nfactors%A_ROWS_basic' - CALL SPACE_dealloc_array( data%nfactors%A_ROWS_basic, & - inform%status, inform%alloc_status, array_name = array_name, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( control%deallocate_error_fatal .AND. & - inform%status /= GALAHAD_ok ) RETURN - - array_name = 'sbls: nfactors%A_COLS_basic' - CALL SPACE_dealloc_array( data%nfactors%A_COLS_basic, & - inform%status, inform%alloc_status, array_name = array_name, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( control%deallocate_error_fatal .AND. & - inform%status /= GALAHAD_ok ) RETURN - - array_name = 'sbls: nfactors%A_ROWS_order' - CALL SPACE_dealloc_array( data%nfactors%A_ROWS_order, & - inform%status, inform%alloc_status, array_name = array_name, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( control%deallocate_error_fatal .AND. & - inform%status /= GALAHAD_ok ) RETURN - - array_name = 'sbls: nfactors%A_COLS_order' - CALL SPACE_dealloc_array( data%nfactors%A_COLS_order, & - inform%status, inform%alloc_status, array_name = array_name, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( control%deallocate_error_fatal .AND. & - inform%status /= GALAHAD_ok ) RETURN - - array_name = 'sbls: nfactors%IW' - CALL SPACE_dealloc_array( data%nfactors%IW, & - inform%status, inform%alloc_status, array_name = array_name, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( control%deallocate_error_fatal .AND. & - inform%status /= GALAHAD_ok ) RETURN - - array_name = 'sbls: nfactors%A2%row' - CALL SPACE_dealloc_array( data%nfactors%A2%row, & - inform%status, inform%alloc_status, array_name = array_name, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( control%deallocate_error_fatal .AND. & - inform%status /= GALAHAD_ok ) RETURN - - array_name = 'sbls: nfactors%A2%col' - CALL SPACE_dealloc_array( data%nfactors%A2%col, & - inform%status, inform%alloc_status, array_name = array_name, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( control%deallocate_error_fatal .AND. & - inform%status /= GALAHAD_ok ) RETURN - - array_name = 'sbls: nfactors%A2%val' - CALL SPACE_dealloc_array( data%nfactors%A2%val, & - inform%status, inform%alloc_status, array_name = array_name, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( control%deallocate_error_fatal .AND. & - inform%status /= GALAHAD_ok ) RETURN - - array_name = 'sbls: nfactors%H11%row' - CALL SPACE_dealloc_array( data%nfactors%H11%row, & - inform%status, inform%alloc_status, array_name = array_name, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( control%deallocate_error_fatal .AND. & - inform%status /= GALAHAD_ok ) RETURN - - array_name = 'sbls: nfactors%H11%col' - CALL SPACE_dealloc_array( data%nfactors%H11%col, & - inform%status, inform%alloc_status, array_name = array_name, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( control%deallocate_error_fatal .AND. & - inform%status /= GALAHAD_ok ) RETURN - - array_name = 'sbls: nfactors%H11%val' - CALL SPACE_dealloc_array( data%nfactors%H11%val, & - inform%status, inform%alloc_status, array_name = array_name, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( control%deallocate_error_fatal .AND. & - inform%status /= GALAHAD_ok ) RETURN - - array_name = 'sbls: nfactors%H21%row' - CALL SPACE_dealloc_array( data%nfactors%H21%row, & - inform%status, inform%alloc_status, array_name = array_name, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( control%deallocate_error_fatal .AND. & - inform%status /= GALAHAD_ok ) RETURN - - array_name = 'sbls: nfactors%H21%col' - CALL SPACE_dealloc_array( data%nfactors%H21%col, & - inform%status, inform%alloc_status, array_name = array_name, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( control%deallocate_error_fatal .AND. & - inform%status /= GALAHAD_ok ) RETURN - - array_name = 'sbls: nfactors%H21%val' - CALL SPACE_dealloc_array( data%nfactors%H21%val, & - inform%status, inform%alloc_status, array_name = array_name, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( control%deallocate_error_fatal .AND. & - inform%status /= GALAHAD_ok ) RETURN - - array_name = 'sbls: nfactors%H22%row' - CALL SPACE_dealloc_array( data%nfactors%H22%row, & - inform%status, inform%alloc_status, array_name = array_name, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( control%deallocate_error_fatal .AND. & - inform%status /= GALAHAD_ok ) RETURN - - array_name = 'sbls: nfactors%H22%col' - CALL SPACE_dealloc_array( data%nfactors%H22%col, & - inform%status, inform%alloc_status, array_name = array_name, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( control%deallocate_error_fatal .AND. & - inform%status /= GALAHAD_ok ) RETURN - - array_name = 'sbls: nfactors%H22%ptr' - CALL SPACE_dealloc_array( data%nfactors%H22%ptr, & - inform%status, inform%alloc_status, array_name = array_name, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( control%deallocate_error_fatal .AND. & - inform%status /= GALAHAD_ok ) RETURN - - array_name = 'sbls: nfactors%H22%val' - CALL SPACE_dealloc_array( data%nfactors%H22%val, & - inform%status, inform%alloc_status, array_name = array_name, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( control%deallocate_error_fatal .AND. & - inform%status /= GALAHAD_ok ) RETURN - - array_name = 'sbls: nfactors%R_sparse%row' - CALL SPACE_dealloc_array( data%nfactors%R_sparse%row, & - inform%status, inform%alloc_status, array_name = array_name, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( control%deallocate_error_fatal .AND. & - inform%status /= GALAHAD_ok ) RETURN - - array_name = 'sbls: nfactors%R_sparse%col' - CALL SPACE_dealloc_array( data%nfactors%R_sparse%col, & - inform%status, inform%alloc_status, array_name = array_name, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( control%deallocate_error_fatal .AND. & - inform%status /= GALAHAD_ok ) RETURN - - array_name = 'sbls: nfactors%R_sparse%val' - CALL SPACE_dealloc_array( data%nfactors%R_sparse%val, & - inform%status, inform%alloc_status, array_name = array_name, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( control%deallocate_error_fatal .AND. & - inform%status /= GALAHAD_ok ) RETURN - - array_name = 'sbls: nfactors%V' - CALL SPACE_dealloc_array( data%nfactors%V, & - inform%status, inform%alloc_status, array_name = array_name, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( control%deallocate_error_fatal .AND. & - inform%status /= GALAHAD_ok ) RETURN - - array_name = 'sbls: nfactors%W' - CALL SPACE_dealloc_array( data%nfactors%W, & - inform%status, inform%alloc_status, array_name = array_name, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( control%deallocate_error_fatal .AND. & - inform%status /= GALAHAD_ok ) RETURN - - array_name = 'sbls: efactors%RHS' - CALL SPACE_dealloc_array( data%efactors%RHS, & - inform%status, inform%alloc_status, array_name = array_name, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( control%deallocate_error_fatal .AND. & - inform%status /= GALAHAD_ok ) RETURN - - array_name = 'sbls: efactors%RHS_orig' - CALL SPACE_dealloc_array( data%efactors%RHS_orig, & - inform%status, inform%alloc_status, array_name = array_name, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( control%deallocate_error_fatal .AND. & - inform%status /= GALAHAD_ok ) RETURN - - array_name = 'sbls: nfactors%SOL_current' - CALL SPACE_dealloc_array( data%nfactors%SOL_current, & - inform%status, inform%alloc_status, array_name = array_name, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( control%deallocate_error_fatal .AND. & - inform%status /= GALAHAD_ok ) RETURN - - array_name = 'sbls: nfactors%PERT' - CALL SPACE_dealloc_array( data%nfactors%PERT, & - inform%status, inform%alloc_status, array_name = array_name, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( control%deallocate_error_fatal .AND. & - inform%status /= GALAHAD_ok ) RETURN - - array_name = 'sbls: nfactors%R' - CALL SPACE_dealloc_array( data%nfactors%R, & - inform%status, inform%alloc_status, array_name = array_name, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( control%deallocate_error_fatal .AND. & - inform%status /= GALAHAD_ok ) RETURN - - array_name = 'sbls: nfactors%R_factors' - CALL SPACE_dealloc_array( data%nfactors%R_factors, & - inform%status, inform%alloc_status, array_name = array_name, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( control%deallocate_error_fatal .AND. & - inform%status /= GALAHAD_ok ) RETURN - - array_name = 'sbls: nfactors%SOL_perm' - CALL SPACE_dealloc_array( data%nfactors%SOL_perm, & - inform%status, inform%alloc_status, array_name = array_name, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( control%deallocate_error_fatal .AND. & - inform%status /= GALAHAD_ok ) RETURN - - RETURN - -! End of subroutine SBLS_terminate - - END SUBROUTINE SBLS_terminate - -!-*- S B L S _ F O R M _ A N D _ F A C T O R I Z E S U B R O U T I N E -*- - - SUBROUTINE SBLS_form_and_factorize( n, m, H, A, C, data, control, inform ) - -! Form and factorize -! -! K = ( G A^T ) -! ( A -C ) -! -! for various approximations G of H - -! inform%status: -! -! 0 successful termination -! +1 A is rank defficient -! -1 allocation error -! -2 deallocation error -! -3 input parameter out of range -! -4 SILS analyse error -! -5 SILS factorize error -! -6 SILS solve error -! -7 GLS analyse error -! -8 GLS solve error -! -9 insufficient preconditioner - -! Dummy arguments - - INTEGER ( KIND = ip_ ), INTENT( IN ) :: n, m - TYPE ( SMT_type ), INTENT( IN ) :: H, A, C - TYPE ( SBLS_data_type ), INTENT( INOUT ) :: data - TYPE ( SBLS_control_type ), INTENT( IN ) :: control - TYPE ( SBLS_inform_type ), INTENT( INOUT ) :: inform - -! Local variables - - INTEGER ( KIND = ip_ ) :: c_ne - -! prefix for all output - - CHARACTER ( LEN = LEN( TRIM( control%prefix ) ) - 2 ) :: prefix - prefix = control%prefix( 2 : LEN( TRIM( control%prefix ) ) - 1 ) - -! Set default information values - - inform%status = GALAHAD_ok - inform%alloc_status = 0 ; inform%bad_alloc = '' - inform%sils_analyse_status = 0 ; inform%sils_factorize_status = 0 - inform%sils_solve_status = 0 - inform%gls_analyse_status = 0 ; inform%gls_solve_status = 0 - inform%sort_status = 0 - inform%factorization_integer = - 1 ; inform%factorization_real = - 1 - inform%rank = m ; inform%rank_def = .FALSE. - inform%perturbed = .FALSE. - inform%norm_residual = - one - -! Check for faulty dimensions - - IF ( n <= 0 .OR. m < 0 .OR. & - .NOT. QPT_keyword_H( H%type ) .OR. & - .NOT. QPT_keyword_A( A%type ) ) THEN - inform%status = GALAHAD_error_restrictions - IF ( control%error > 0 .AND. control%print_level > 0 ) & - WRITE( control%error, 2010 ) prefix, inform%status - RETURN - END IF - - IF ( control%out >= 0 .AND. control%print_level >= 1 ) THEN - WRITE( control%out, & - "( /, A, ' n = ', I0, ', m = ', I0 )" ) prefix, n, m - END IF - -! Ensure automatic choices for the preconditioner/factorization have been made - - IF ( data%last_preconditioner /= control%preconditioner ) THEN - IF ( control%preconditioner == 0 ) THEN - IF ( data%last_preconditioner == no_last ) THEN - inform%preconditioner = 1 - ELSE - inform%preconditioner = data%last_preconditioner - END IF - ELSE - inform%preconditioner = control%preconditioner - END IF - END IF - - IF ( data%last_factorization /= control%factorization ) THEN - IF ( control%factorization == 0 ) THEN - IF ( data%last_factorization == no_last ) THEN - inform%factorization = 1 - ELSE - inform%factorization = data%last_factorization - END IF - ELSE - inform%factorization = control%factorization - END IF - END IF - -! Only allow the null-space method if C = 0 - - IF ( inform%factorization == 3 ) THEN - IF ( SMT_get( C%type ) == 'ZERO' ) THEN - c_ne = 0 - ELSE IF ( SMT_get( C%type ) == 'DIAGONAL' ) THEN - c_ne = m - ELSE IF ( SMT_get( C%type ) == 'DENSE' ) THEN - c_ne = ( m * ( m + 1 ) ) / 2 - ELSE IF ( SMT_get( C%type ) == 'SPARSE_BY_ROWS' ) THEN - c_ne = C%ptr( m + 1 ) - 1 - ELSE - c_ne = C%ne - END IF - IF ( c_ne /= 0 ) inform%factorization = 1 - END IF - - inform%rank_def = .FALSE. - - IF ( control%out >= 0 .AND. control%print_level >= 1 ) THEN - WRITE( control%out, & - "( A, ' preconditioner = ', I0, ', factorization = ', I0 )" ) & - prefix, inform%preconditioner, inform%factorization - END IF - -! Form and factorize the preconditioner - - IF ( inform%factorization == 3 ) THEN - CALL SBLS_form_n_factorize_nullspace( n, m, H, A, data%nfactors, & - data%last_factorization, & - control, inform ) - data%len_sol = data%nfactors%k_n - ELSE IF ( inform%preconditioner >= 0 ) THEN - CALL SBLS_form_n_factorize_explicit( n, m, H, A, C, data%efactors, & - data%last_factorization, & - control, inform ) - data%len_sol = data%efactors%K%n - ELSE - CALL SBLS_form_n_factorize_implicit( n, m, H, A, C, data%ifactors, & - data%last_factorization, & - control, inform ) - data%len_sol = data%ifactors%k_n - END IF - - data%last_preconditioner = inform%preconditioner - data%last_factorization = inform%factorization - - RETURN - -! Non-executable statements - - 2010 FORMAT( ' ', /, A, ' ** Error return ',I3,' from SBLS ' ) - -! End of subroutine SBLS_form_and_factorize - - END SUBROUTINE SBLS_form_and_factorize - -!-*-*- S B L S _ FORM _ N _ FACTORIZE _ EXPLICIT S U B R O U T I N E -*- - - SUBROUTINE SBLS_form_n_factorize_explicit( n, m, H, A, C, efactors, & - last_factorization, & - control, inform ) - -! Form and explicitly factorize -! -! K = ( G A^T ) -! ( A -C ) -! -! for various approximations G of H - -! G is chosen according to the parameter control%proconditioner as follows: - -! 1 no preconditioner, G = I -! 2 full factorization, G = H -! 3 diagonal, G = diag( H ) with minimum diagonal control%min_diagonal -! 4 banded, G = band(H) with semi-bandwidth control%semi_bandwidth - -! 11 G_11 = 0, G_21 = 0, G_22 = H_22 (**) -! 12 G_11 = 0, G_21 = H_21, G_22 = H_22 (**) - -! (**) Here the columns of A and H are reordered so that A = (A_1 : A:2) P -! for some P for which A_1 is non-singular and reasonably conditioned - -! Dummy arguments - - INTEGER ( KIND = ip_ ), INTENT( IN ) :: n, m, last_factorization - TYPE ( SMT_type ), INTENT( IN ) :: H, A, C - TYPE ( SBLS_explicit_factors_type ), INTENT( INOUT ) :: efactors - TYPE ( SBLS_control_type ), INTENT( IN ) :: control - TYPE ( SBLS_inform_type ), INTENT( INOUT ) :: inform - -! Local variables - - INTEGER ( KIND = ip_ ) :: i, ii, j, k, kk, l, g_ne, kzero, kminus, nb, out, c_ne - INTEGER ( KIND = ip_ ) :: nnz_col_j, nnz_aat_old, nnz_aat, max_len, new_pos, a_ne, h_ne - INTEGER ( KIND = ip_ ) :: new_h, new_a, new_c, k_c, k_ne - REAL ( KIND = rp_ ) :: al, val - LOGICAL :: printi, resize, use_schur_complement - CHARACTER ( LEN = 80 ) :: array_name - TYPE ( SILS_AINFO ) :: AINFO_SILS - TYPE ( SILS_FINFO ) :: FINFO_SILS - TYPE ( GLS_AINFO ) :: AINFO_GLS - TYPE ( GLS_FINFO ) :: FINFO_GLS - - REAL :: time_start, time_end - -! prefix for all output - - CHARACTER ( LEN = LEN( TRIM( control%prefix ) ) - 2 ) :: prefix - prefix = control%prefix( 2 : LEN( TRIM( control%prefix ) ) - 1 ) - - out = control%out - printi = control%print_level >= 1 .AND. out >= 0 - inform%perturbed = .FALSE. - - IF ( inform%preconditioner <= 0 ) THEN - IF ( printi ) WRITE( out, & - "( A, ' Use SBLS_form_n_factorize_implicit subroutine instead' )" ) & - prefix - - inform%status = - 31 ; RETURN - END IF - - IF ( SMT_get( A%type ) == 'DENSE' ) THEN - a_ne = m * n - ELSE IF ( SMT_get( A%type ) == 'SPARSE_BY_ROWS' ) THEN - a_ne = A%ptr( m + 1 ) - 1 - ELSE - a_ne = A%ne - END IF - - IF ( SMT_get( H%type ) == 'DIAGONAL' ) THEN - h_ne = n - ELSE IF ( SMT_get( H%type ) == 'DENSE' ) THEN - h_ne = ( n * ( n + 1 ) ) / 2 - ELSE IF ( SMT_get( H%type ) == 'SPARSE_BY_ROWS' ) THEN - h_ne = H%ptr( n + 1 ) - 1 - ELSE - h_ne = H%ne - END IF - - IF ( SMT_get( C%type ) == 'ZERO' ) THEN - c_ne = 0 - ELSE IF ( SMT_get( C%type ) == 'DIAGONAL' ) THEN - c_ne = m - ELSE IF ( SMT_get( C%type ) == 'DENSE' ) THEN - c_ne = ( m * ( m + 1 ) ) / 2 - ELSE IF ( SMT_get( C%type ) == 'SPARSE_BY_ROWS' ) THEN - c_ne = C%ptr( m + 1 ) - 1 - ELSE - c_ne = C%ne - END IF - - IF ( last_factorization /= inform%factorization ) THEN - new_h = 2 - new_a = 2 - new_c = 2 - ELSE - new_h = control%new_h - new_a = control%new_a - new_c = control%new_c - END IF - -! Form the preconditioner - - CALL CPU_TIME( time_start ) - -! First, see if we can get away with a factorization of the Schur complement. - -! ======================= -! USE SCHUR COMPLEMENT -! ======================= - - IF ( inform%factorization == 0 .OR. inform%factorization == 1 ) THEN - array_name = 'sbls: efactors%IW' - CALL SPACE_resize_array( n, efactors%IW, & - inform%status, inform%alloc_status, array_name = array_name, & - deallocate_error_fatal = control%deallocate_error_fatal, & - exact_size = control%space_critical, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( inform%status /= GALAHAD_ok ) RETURN - - IF ( new_h > 0 ) THEN - IF ( inform%preconditioner > 4 ) THEN - inform%factorization = 2 - ELSE IF ( inform%preconditioner == 2 .OR. & - inform%preconditioner == 4 ) THEN - -! Check to see if there are off-diagonal entries, and that the diagonal -! is present - - efactors%IW = 0 - SELECT CASE ( SMT_get( H%type ) ) - CASE ( 'DIAGONAL' ) - IF ( COUNT( H%val( : n ) == zero ) > 0 ) inform%factorization = 2 - CASE ( 'DENSE' ) - inform%factorization = 2 - CASE ( 'SPARSE_BY_ROWS' ) - DO i = 1, n - DO l = H%ptr( i ), H%ptr( i + 1 ) - 1 - IF ( i /= H%col( l ) .OR. & - ( i == H%col( l ) .AND. H%val( l ) == zero ) ) THEN - IF ( inform%preconditioner == 2 .OR. & - ( inform%preconditioner == 4 & - .AND. control%semi_bandwidth /= 0 ) ) THEN - inform%factorization = 2 - EXIT - END IF - ELSE - efactors%IW( i ) = efactors%IW( i ) + 1 - END IF - END DO - END DO - IF ( COUNT( efactors%IW > 0 ) /= n ) inform%factorization = 2 - CASE ( 'COORDINATE' ) - DO l = 1, H%ne - i = H%row( l ) - IF ( i /= H%col( l ) .OR. & - ( i == H%col( l ) .AND. H%val( l ) == zero ) ) THEN - IF ( inform%preconditioner == 2 .OR. & - ( inform%preconditioner == 4 & - .AND. control%semi_bandwidth /= 0 ) ) THEN - inform%factorization = 2 - EXIT - END IF - ELSE - efactors%IW( i ) = efactors%IW( i ) + 1 - END IF - END DO - IF ( COUNT( efactors%IW > 0 ) /= n ) inform%factorization = 2 - END SELECT - END IF - -! If G is not non-singular and diagonal, use a factorization of the -! augmented matrix instead - - IF ( inform%factorization == 2 ) THEN - - array_name = 'sbls: efactors%IW' - CALL SPACE_dealloc_array( efactors%IW, & - inform%status, inform%alloc_status, array_name = array_name, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( control%deallocate_error_fatal .AND. & - inform%status /= GALAHAD_ok ) RETURN - - IF ( last_factorization /= inform%factorization ) THEN - new_h = 2 - new_a = 2 - new_c = 2 - END IF - GO TO 100 - END IF - -! G is diagonal. Now check to see if there are not too many entries in -! any column of A. Find the number of entries in each column -! (Only do this for sparse_by_row and coordinate storage) - - IF ( SMT_get( A%type ) /= ' DENSE' ) THEN - array_name = 'sbls: efactors%A_col_ptr' - CALL SPACE_resize_array( n + 1, efactors%A_col_ptr, & - inform%status, inform%alloc_status, array_name = array_name, & - deallocate_error_fatal = control%deallocate_error_fatal, & - exact_size = control%space_critical, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( inform%status /= GALAHAD_ok ) RETURN - END IF - END IF - - IF ( new_a == 2 ) THEN - SELECT CASE ( SMT_get( A%type ) ) - CASE ( 'DENSE' ) - max_len = m - CASE ( 'SPARSE_BY_ROWS' ) - efactors%A_col_ptr( 2 : ) = 0 - DO i = 1, m - DO l = A%ptr( i ), A%ptr( i + 1 ) - 1 - j = A%col( l ) + 1 - efactors%A_col_ptr( j ) = efactors%A_col_ptr( j ) + 1 - END DO - END DO - max_len = MAXVAL( efactors%A_col_ptr( 2 : ) ) - CASE ( 'COORDINATE' ) - efactors%A_col_ptr( 2 : ) = 0 - DO l = 1, A%ne - j = A%col( l ) + 1 - efactors%A_col_ptr( j ) = efactors%A_col_ptr( j ) + 1 - END DO - max_len = MAXVAL( efactors%A_col_ptr( 2 : ) ) - END SELECT - -! If the column with the largest number of entries exceeds max_col, -! use a factorization of the augmented matrix instead - - IF ( printi ) WRITE( out, "( A, & - & ' maximum, average column lengths of A = ', I0, ', ', F0.1, /, & - & A, ' number of columns of A longer than maxcol = ', I0, & - & ' is ', I0 )" ) prefix, & - max_len, float( SUM( efactors%A_col_ptr( 2 : ) ) ) / float( n ), & - prefix, & - control%max_col, COUNT( efactors%A_col_ptr( 2 : ) > control%max_col ) - - IF ( control%factorization == 0 .AND. max_len > control%max_col .AND.& - m > max_sc ) THEN - IF ( printi ) WRITE( out, "( & - & A, ' - abandon the Schur-complement factorization', /, A, & - & ' in favour of one of the augmented matrix')") prefix, prefix - inform%factorization = 2 - - array_name = 'sbls: efactors%IW' - CALL SPACE_dealloc_array( efactors%IW, & - inform%status, inform%alloc_status, array_name = array_name, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( control%deallocate_error_fatal .AND. & - inform%status /= GALAHAD_ok ) RETURN - - array_name = 'sbls: efactors%A_col_ptr' - CALL SPACE_dealloc_array( efactors%A_col_ptr, & - inform%status, inform%alloc_status, array_name = array_name, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( control%deallocate_error_fatal .AND. & - inform%status /= GALAHAD_ok ) RETURN - - IF ( last_factorization /= inform%factorization ) THEN - new_h = 2 - new_a = 2 - new_c = 2 - END IF - GO TO 100 - END IF - -! Now store A by rows. First find the number of entries in each row -! (Only do this for coordinate storage, as it is already available -! for storage by rows!) - - IF ( SMT_get( A%type ) == 'COORDINATE' ) THEN - array_name = 'sbls: efactors%A_row_ptr' - CALL SPACE_resize_array( m + 1, efactors%A_row_ptr, & - inform%status, inform%alloc_status, array_name = array_name, & - deallocate_error_fatal = control%deallocate_error_fatal, & - exact_size = control%space_critical, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( inform%status /= GALAHAD_ok ) RETURN - - array_name = 'sbls: efactors%A_by_rows' - CALL SPACE_resize_array( a_ne, efactors%A_by_rows, & - inform%status, inform%alloc_status, array_name = array_name, & - deallocate_error_fatal = control%deallocate_error_fatal, & - exact_size = control%space_critical, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( inform%status /= GALAHAD_ok ) RETURN - - efactors%A_row_ptr( 2 : ) = 0 - DO l = 1, A%ne - i = A%row( l ) + 1 - efactors%A_row_ptr( i ) = efactors%A_row_ptr( i ) + 1 - END DO - -! Next assign row pointers - - efactors%A_row_ptr( 1 ) = 1 - DO i = 2, m + 1 - efactors%A_row_ptr( i ) & - = efactors%A_row_ptr( i ) + efactors%A_row_ptr( i - 1 ) - END DO - -! Now record where the entries in each row occur in the original matrix - - DO l = 1, A%ne - i = A%row( l ) - new_pos = efactors%A_row_ptr( i ) - efactors%A_by_rows( new_pos ) = l - efactors%A_row_ptr( i ) = new_pos + 1 - END DO - -! Finally readjust the row pointers - - DO i = m + 1, 2, - 1 - efactors%A_row_ptr( i ) = efactors%A_row_ptr( i - 1 ) - END DO - efactors%A_row_ptr( 1 ) = 1 - END IF - -! Also store A by columns, but with the entries sorted in increasing -! row order within each column. First assign column pointers - - IF ( SMT_get( A%type ) /= 'DENSE' ) THEN - efactors%A_col_ptr( 1 ) = 1 - DO j = 2, n + 1 - efactors%A_col_ptr( j ) & - = efactors%A_col_ptr( j ) + efactors%A_col_ptr( j - 1 ) - END DO - -! Now record where the entries in each colum occur in the original matrix - - array_name = 'sbls: efactors%A_by_cols' - CALL SPACE_resize_array( a_ne, efactors%A_by_cols, & - inform%status, inform%alloc_status, array_name = array_name, & - deallocate_error_fatal = control%deallocate_error_fatal, & - exact_size = control%space_critical, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( inform%status /= GALAHAD_ok ) RETURN - - SELECT CASE ( SMT_get( A%type ) ) - CASE ( 'SPARSE_BY_ROWS' ) - - array_name = 'sbls: efactors%A_row' - CALL SPACE_resize_array( a_ne, efactors%A_row, & - inform%status, inform%alloc_status, array_name = array_name, & - deallocate_error_fatal = control%deallocate_error_fatal, & - exact_size = control%space_critical, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( inform%status /= GALAHAD_ok ) RETURN - - DO i = 1, m - DO l = A%ptr( i ), A%ptr( i + 1 ) - 1 - j = A%col( l ) - new_pos = efactors%A_col_ptr( j ) - efactors%A_row( new_pos ) = i - efactors%A_by_cols( new_pos ) = l - efactors%A_col_ptr( j ) = new_pos + 1 - END DO - END DO - CASE ( 'COORDINATE' ) - DO i = 1, m - DO k = efactors%A_row_ptr( i ), efactors%A_row_ptr( i + 1 ) - 1 - l = efactors%A_by_rows( k ) - j = A%col( l ) - new_pos = efactors%A_col_ptr( j ) - efactors%A_by_cols( new_pos ) = l - efactors%A_col_ptr( j ) = new_pos + 1 - END DO - END DO - END SELECT - -! Finally readjust the column pointers - - DO j = n + 1, 2, - 1 - efactors%A_col_ptr( j ) = efactors%A_col_ptr( j - 1 ) - END DO - efactors%A_col_ptr( 1 ) = 1 - END IF - -! Now build the sparsity structure of A diag(G)(inverse) A(trans) - - IF ( SMT_get( A%type ) == 'DENSE' ) THEN - array_name = 'sbls: efactors%W' - CALL SPACE_resize_array( n, efactors%W, & - inform%status, inform%alloc_status, array_name = array_name, & - deallocate_error_fatal = control%deallocate_error_fatal, & - exact_size = .FALSE., & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( inform%status /= GALAHAD_ok ) RETURN - ELSE - array_name = 'sbls: efactors%IW' - CALL SPACE_resize_array( m, efactors%IW, & - inform%status, inform%alloc_status, array_name = array_name, & - deallocate_error_fatal = control%deallocate_error_fatal, & - exact_size = .FALSE., & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( inform%status /= GALAHAD_ok ) RETURN - - array_name = 'sbls: efactors%IW2' - CALL SPACE_resize_array( m, efactors%IW2, & - inform%status, inform%alloc_status, array_name = array_name, & - deallocate_error_fatal = control%deallocate_error_fatal, & - exact_size = control%space_critical, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( inform%status /= GALAHAD_ok ) RETURN - END IF - -! Compute the total storage for the (lower triangle) of -! A diag(G)(inverse) A(transpose) - - SELECT CASE ( SMT_get( A%type ) ) - CASE ( 'DENSE' ) - nnz_aat = m * ( m + 1 ) / 2 - CASE ( 'SPARSE_BY_ROWS' ) - nnz_aat = 0 - efactors%IW2 = 0 - -! For the j-th column of A diag(G)(inverse) A(trans) ... - - DO j = 1, m - nnz_col_j = 0 - DO k = A%ptr( j ), A%ptr( j + 1 ) - 1 - -! ... include the contributions from column l of A - - l = A%col( k ) - DO kk = efactors%A_col_ptr( l ), efactors%A_col_ptr( l + 1 ) - 1 - -! ... which have nonzeros in rows i - - i = efactors%A_row( kk ) - IF ( efactors%IW2( i ) < j .AND. i >= j ) THEN - nnz_col_j = nnz_col_j + 1 - efactors%IW2( i ) = j - END IF - END DO - END DO - nnz_aat = nnz_aat + nnz_col_j - END DO - CASE ( 'COORDINATE' ) - nnz_aat = 0 - efactors%IW2 = 0 - -! For the j-th column of A diag(G)(inverse) A(trans) ... - - DO j = 1, m - nnz_col_j = 0 - DO k = efactors%A_row_ptr( j ), efactors%A_row_ptr( j + 1 ) - 1 - -! ... include the contributions from column l of A - - l = A%col( efactors%A_by_rows( k ) ) - DO kk = efactors%A_col_ptr( l ), efactors%A_col_ptr( l + 1 ) - 1 - -! ... which have nonzeros in rows i - - i = A%row( efactors%A_by_cols( kk ) ) - IF ( efactors%IW2( i ) < j .AND. i >= j ) THEN - nnz_col_j = nnz_col_j + 1 - efactors%IW2( i ) = j - END IF - END DO - END DO - nnz_aat = nnz_aat + nnz_col_j - END DO - END SELECT - -! Allocate space to hold C + A diag(G)(inverse) A(transpose) in K - - efactors%K%n = m - efactors%K%ne = nnz_aat + c_ne - - array_name = 'sbls: efactors%K%row' - CALL SPACE_resize_array( efactors%K%ne, efactors%K%row, & - inform%status, inform%alloc_status, array_name = array_name, & - deallocate_error_fatal = control%deallocate_error_fatal, & - exact_size = control%space_critical, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( inform%status /= GALAHAD_ok ) RETURN - - array_name = 'sbls: efactors%K%col' - CALL SPACE_resize_array( efactors%K%ne, efactors%K%col, & - inform%status, inform%alloc_status, array_name = array_name, & - deallocate_error_fatal = control%deallocate_error_fatal, & - exact_size = control%space_critical, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( inform%status /= GALAHAD_ok ) RETURN - - array_name = 'sbls: efactors%K%val' - CALL SPACE_resize_array( efactors%K%ne, efactors%K%val, & - inform%status, inform%alloc_status, array_name = array_name, & - deallocate_error_fatal = control%deallocate_error_fatal, & - exact_size = control%space_critical, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( inform%status /= GALAHAD_ok ) RETURN - - END IF - -! Allocate space to store diag(G) - - IF ( new_h == 2 ) THEN - array_name = 'sbls: efactors%G_diag' - CALL SPACE_resize_array( n, efactors%G_diag, & - inform%status, inform%alloc_status, array_name = array_name, & - deallocate_error_fatal = control%deallocate_error_fatal, & - exact_size = control%space_critical, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( inform%status /= GALAHAD_ok ) RETURN - END IF - - use_schur_complement = .TRUE. - IF ( printi ) WRITE( out, "( A, ' Schur complement used ' )" ) prefix - -! Now store diag(G) - - SELECT CASE( inform%preconditioner ) - -! The identity matrix - - CASE( 1 ) - IF ( printi ) WRITE( out, "( A, ' preconditioner: G = I ' )" ) prefix - efactors%G_diag = one - -! The diagonal from the full matrix - - CASE( 2, 4 ) - IF ( printi ) THEN - IF ( inform%preconditioner == 2 ) THEN - WRITE( out, "( A, ' preconditioner: G = H ' )" ) prefix - ELSE - WRITE( out, "( A, ' preconditioner: G = diag(H) ' )" ) prefix - END IF - END IF - SELECT CASE ( SMT_get( H%type ) ) - CASE ( 'DIAGONAL' ) - efactors%G_diag = H%val( : n ) - CASE ( 'DENSE' ) - write(6,*) prefix, " shouldn't be here ... " - CASE ( 'SPARSE_BY_ROWS' ) - efactors%G_diag = zero - DO i = 1, n - DO l = H%ptr( i ), H%ptr( i + 1 ) - 1 - efactors%G_diag( i ) = efactors%G_diag( i ) + H%val( l ) - END DO - END DO - CASE ( 'COORDINATE' ) - efactors%G_diag = zero - DO l = 1, H%ne - i = H%row( l ) - efactors%G_diag( i ) = efactors%G_diag( i ) + H%val( l ) - END DO - END SELECT - -! The (possibly modified) diagonal of the full matrix - - CASE( 3 ) - IF ( printi ) WRITE( out, "( A, ' preconditioner: G = diag(H) ' )" ) & - prefix - efactors%G_diag = zero - SELECT CASE ( SMT_get( H%type ) ) - CASE ( 'DIAGONAL' ) - efactors%G_diag = H%val( : n ) - CASE ( 'DENSE' ) - l = 0 - DO i = 1, n - l = l + i - efactors%G_diag( i ) = efactors%G_diag( i ) + H%val( l ) - END DO - CASE ( 'SPARSE_BY_ROWS' ) - DO i = 1, n - DO l = H%ptr( i ), H%ptr( i + 1 ) - 1 - IF ( H%col( l ) == i ) & - efactors%G_diag( i ) = efactors%G_diag( i ) + H%val( l ) - END DO - END DO - CASE ( 'COORDINATE' ) - DO l = 1, H%ne - i = H%row( l ) - IF ( H%col( l ) == i ) & - efactors%G_diag( i ) = efactors%G_diag( i ) + H%val( l ) - END DO - END SELECT - - efactors%G_diag = MAX( efactors%G_diag, control%min_diagonal ) - END SELECT - - IF ( new_a == 2 ) THEN - -! Now insert the (row/col/val) entries of -! A diag(G)(inverse) A(transpose) into K - - SELECT CASE ( SMT_get( A%type ) ) - CASE ( 'DENSE' ) - nnz_aat = 0 - l = 0 - DO i = 1, m - efactors%W = A%val( l + 1 : l + n ) / efactors%G_diag - k = 0 - DO j = 1, i - nnz_aat = nnz_aat + 1 - efactors%K%row( nnz_aat ) = i - efactors%K%col( nnz_aat ) = j - efactors%K%val( nnz_aat ) = & - DOT_PRODUCT( efactors%W, A%val( k + 1 : k + n ) ) - k = k + n - END DO - l = l + n - END DO - CASE ( 'SPARSE_BY_ROWS' ) - nnz_aat_old = 0 - nnz_aat = 0 - efactors%IW( : n ) = efactors%A_col_ptr( : n ) - efactors%IW2 = 0 - -! For the j-th column of A diag(G)(inverse) A(transpose) ... - - DO j = 1, m - DO k = A%ptr( j ), A%ptr( j + 1 ) - 1 - -! ... include the contributions from column l of A - - l = A%col( k ) - al = A%val( k ) / efactors%G_diag( l ) - DO kk = efactors%IW( l ), efactors%A_col_ptr( l + 1 ) - 1 - -! ... which have nonzeros in rows i - - i = efactors%A_row( kk ) - -! ... and which are in lower-triangular part - - IF ( i >= j ) THEN - -! The first entry in this position ... - - IF ( efactors%IW2( i ) < j .AND. i >= j ) THEN - nnz_aat = nnz_aat + 1 - efactors%IW2( i ) = j + nnz_aat - efactors%K%row( nnz_aat ) = i - efactors%K%col( nnz_aat ) = j - efactors%K%val( nnz_aat ) = & - al * A%val( efactors%A_by_cols( kk ) ) - -! ... or a subsequent one - - ELSE - ii = efactors%IW2( i ) - j - efactors%K%val( ii ) = efactors%K%val( ii ) + & - al * A%val( efactors%A_by_cols( kk ) ) - END IF - -! IW is incremented since all entries above lie in the upper triangle - - ELSE - efactors%IW( l ) = efactors%IW( l ) + 1 - END IF - END DO - END DO - DO l = nnz_aat_old + 1, nnz_aat - efactors%IW2( efactors%K%row( l ) ) = j - END DO - nnz_aat_old = nnz_aat - END DO - CASE ( 'COORDINATE' ) - nnz_aat_old = 0 - nnz_aat = 0 - efactors%IW( : n ) = efactors%A_col_ptr( : n ) - efactors%IW2 = 0 - -! For the j-th column of A diag(G)(inverse) A(transpose) ... - - DO j = 1, m - DO k = efactors%A_row_ptr( j ), efactors%A_row_ptr( j + 1 ) - 1 - -! ... include the contributions from column l of A - - l = A%col( efactors%A_by_rows( k ) ) - al = A%val( efactors%A_by_rows( k ) ) / efactors%G_diag( l ) - DO kk = efactors%IW( l ), efactors%A_col_ptr( l + 1 ) - 1 - -! ... which have nonzeros in rows i - - i = A%row( efactors%A_by_cols( kk ) ) - -! ... and which are in lower-triangular part - - IF ( i >= j ) THEN - -! The first entry in this position ... - - IF ( efactors%IW2( i ) < j .AND. i >= j ) THEN - nnz_aat = nnz_aat + 1 - efactors%IW2( i ) = j + nnz_aat - efactors%K%row( nnz_aat ) = i - efactors%K%col( nnz_aat ) = j - efactors%K%val( nnz_aat ) = & - al * A%val( efactors%A_by_cols( kk ) ) - -! ... or a subsequent one - - ELSE - ii = efactors%IW2( i ) - j - efactors%K%val( ii ) = efactors%K%val( ii ) + & - al * A%val( efactors%A_by_cols( kk ) ) - END IF - -! IW is incremented since all entries above lie in the upper triangle - - ELSE - efactors%IW( l ) = efactors%IW( l ) + 1 - END IF - END DO - END DO - DO l = nnz_aat_old + 1, nnz_aat - efactors%IW2( efactors%K%row( l ) ) = j - END DO - nnz_aat_old = nnz_aat - END DO - END SELECT - - ELSE - -! Now insert the (val) entries of A diag(G)(inverse) A(transpose) into K - - SELECT CASE ( SMT_get( A%type ) ) - CASE ( 'DENSE' ) - nnz_aat = 0 - l = 0 - DO i = 1, m - efactors%W = A%val( l + 1 : l + n ) / efactors%G_diag - k = 0 - DO j = 1, i - nnz_aat = nnz_aat + 1 - efactors%K%val( nnz_aat ) = & - DOT_PRODUCT( efactors%W, A%val( k + 1 : k + n ) ) - k = k + n - END DO - l = l + n - END DO - CASE ( 'SPARSE_BY_ROWS' ) - nnz_aat_old = 0 - nnz_aat = 0 - efactors%IW( : n ) = efactors%A_col_ptr( : n ) - efactors%IW2 = 0 - -! For the j-th column of A diag(G)(inverse) A(transpose) ... - - DO j = 1, m - DO k = A%ptr( j ), A%ptr( j + 1 ) - 1 - -! ... include the contributions from column l of A - - l = A%col( k ) - al = A%val( k ) / efactors%G_diag( l ) - DO kk = efactors%IW( l ), efactors%A_col_ptr( l + 1 ) - 1 - -! ... which have nonzeros in rows i - - i = efactors%A_row( kk ) - -! ... and which are in lower-triangular part - - IF ( i >= j ) THEN - -! The first entry in this position ... - - IF ( efactors%IW2( i ) < j .AND. i >= j ) THEN - nnz_aat = nnz_aat + 1 - efactors%IW2( i ) = j + nnz_aat - efactors%K%val( nnz_aat ) = & - al * A%val( efactors%A_by_cols( kk ) ) - -! ... or a subsequent one - - ELSE - ii = efactors%IW2( i ) - j - efactors%K%val( ii ) = efactors%K%val( ii ) + & - al * A%val( efactors%A_by_cols( kk ) ) - END IF - -! IW is incremented since all entries above lie in the upper triangle - - ELSE - efactors%IW( l ) = efactors%IW( l ) + 1 - END IF - END DO - END DO - DO l = nnz_aat_old + 1, nnz_aat - efactors%IW2( efactors%K%row( l ) ) = j - END DO - nnz_aat_old = nnz_aat - END DO - CASE ( 'COORDINATE' ) - nnz_aat_old = 0 - nnz_aat = 0 - efactors%IW( : n ) = efactors%A_col_ptr( : n ) - efactors%IW2 = 0 - -! For the j-th column of A diag(G)(inverse) A(transpose) ... - - DO j = 1, m - DO k = efactors%A_row_ptr( j ), efactors%A_row_ptr( j + 1 ) - 1 - -! ... include the contributions from column l of A - - l = A%col( efactors%A_by_rows( k ) ) - al = A%val( efactors%A_by_rows( k ) ) / efactors%G_diag( l ) - DO kk = efactors%IW( l ), efactors%A_col_ptr( l + 1 ) - 1 - -! ... which have nonzeros in rows i - - i = A%row( efactors%A_by_cols( kk ) ) - -! ... and which are in lower-triangular part - - IF ( i >= j ) THEN - -! The first entry in this position ... - - IF ( efactors%IW2( i ) < j .AND. i >= j ) THEN - nnz_aat = nnz_aat + 1 - efactors%IW2( i ) = j + nnz_aat - efactors%K%val( nnz_aat ) = & - al * A%val( efactors%A_by_cols( kk ) ) - -! ... or a subsequent one - - ELSE - ii = efactors%IW2( i ) - j - efactors%K%val( ii ) = efactors%K%val( ii ) + & - al * A%val( efactors%A_by_cols( kk ) ) - END IF - -! IW is incremented since all entries above lie in the upper triangle - - ELSE - efactors%IW( l ) = efactors%IW( l ) + 1 - END IF - END DO - END DO - DO l = nnz_aat_old + 1, nnz_aat - efactors%IW2( efactors%K%row( l ) ) = j - END DO - nnz_aat_old = nnz_aat - END DO - END SELECT - - END IF - -! Now insert the (val) entries of C into K ... - - IF ( new_a /= 2 .AND. new_c /= 2 ) THEN - IF ( new_c > 0 .AND. c_ne > 0 ) & - efactors%K%val( nnz_aat + 1 : ) = C%val - -! ... or the (row/col/val) entries of C into K - - ELSE - IF ( c_ne > 0 ) THEN - SELECT CASE ( SMT_get( C%type ) ) - CASE ( 'DIAGONAL' ) - DO i = 1, m - efactors%K%row( nnz_aat + i ) = i - efactors%K%col( nnz_aat + i ) = i - END DO - CASE ( 'DENSE' ) - l = 0 - DO i = 1, m - DO j = 1, i - l = l + 1 - efactors%K%row( nnz_aat + l ) = i - efactors%K%col( nnz_aat + l ) = j - END DO - END DO - CASE ( 'SPARSE_BY_ROWS' ) - DO i = 1, m - DO l = C%ptr( i ), C%ptr( i + 1 ) - 1 - efactors%K%row( nnz_aat + l ) = i - efactors%K%col( nnz_aat + l ) = C%col( l ) - END DO - END DO - CASE ( 'COORDINATE' ) - efactors%K%row( nnz_aat + 1 : ) = C%row - efactors%K%col( nnz_aat + 1 : ) = C%col - END SELECT - efactors%K%val( nnz_aat + 1 : ) = C%val - END IF - END IF - -! WRITE( out, "( ' K: m, nnz ', 2I4 )" ) efactors%K%n, efactors%K%ne -! WRITE( out, "( A, /, ( 10I7) )" ) ' rows =', ( efactors%K%row ) -! WRITE( out, "( A, /, ( 10I7) )" ) ' cols =', ( efactors%K%col ) -! WRITE( out, "( A, /, ( F7.2) )" ) ' vals =', ( efactors%K%val ) - - GO TO 200 - - END IF - -! ====================== -! USE AUGMENTED SYSTEM -! ====================== - - 100 CONTINUE - - use_schur_complement = .FALSE. - IF ( printi ) WRITE( out, "( A, ' augmented matrix used ' )" ) prefix - -! Find the space required to store G and K - - IF ( new_a > 0 .OR. new_h > 0 ) THEN - - SELECT CASE( inform%preconditioner ) - - CASE( 1 ) - -! The identity matrix - - IF ( printi ) WRITE( out, "( A, ' preconditioner: G = I ' )" ) prefix - g_ne = n - efactors%K%n = n + m - efactors%K%ne = g_ne + a_ne + c_ne - - CASE( 2 ) - -! The full matrix - - IF ( printi ) WRITE( out, "( A, ' preconditioner: G = H ' )" ) prefix - g_ne = h_ne - efactors%K%n = n + m - efactors%K%ne = h_ne + a_ne + c_ne - - CASE( 3 ) - -! The (possibly modified) diagonal of the full matrix - - IF ( printi ) WRITE( out, "( A, ' preconditioner: G = diag(H) ' )" ) & - prefix - g_ne = n - efactors%K%n = n + m - efactors%K%ne = g_ne + a_ne + c_ne - - CASE( 4 ) - -! A band (or semi-bandwith control%semibadwith) from the full matrix - - IF ( printi ) WRITE( out, "( A, ' preconditioner G = band(H) ' )" ) & - prefix - SELECT CASE ( SMT_get( H%type ) ) - CASE ( 'DIAGONAL' ) - g_ne = n - CASE ( 'DENSE' ) - g_ne = 0 - DO i = 1, n - DO j = 1, i - IF ( ABS( i - j ) <= control%semi_bandwidth ) g_ne = g_ne + 1 - END DO - END DO - CASE ( 'SPARSE_BY_ROWS' ) - g_ne = 0 - DO i = 1, n - DO l = H%ptr( i ), H%ptr( i + 1 ) - 1 - j = H%col( l ) - IF ( ABS( i - j ) <= control%semi_bandwidth ) g_ne = g_ne + 1 - END DO - END DO - CASE ( 'COORDINATE' ) - g_ne = COUNT( ABS( H%row - H%col ) <= control%semi_bandwidth ) - END SELECT - efactors%K%n = n + m - efactors%K%ne = g_ne + a_ne + c_ne - - CASE( 11 : 12 ) - -! Non-basic submatrices of H - - IF ( new_a > 0 ) THEN - -! Find sets of basic rows and columns - - CALL SBLS_find_basis( m, n, a_ne, A, efactors%B, & - efactors%B_factors, efactors%B_control, & - efactors%B_ROWS, efactors%B_COLS, & - efactors%rank_a, & - control%find_basis_by_transpose, & - prefix, 'sbls: efactors%', out, printi, & - control, inform, AINFO_GLS, FINFO_GLS ) - -! Make a copy of the "basis" matrix - - array_name = 'sbls: efactors%B_COLS_basic' - CALL SPACE_resize_array( n, efactors%B_COLS_basic, & - inform%status, inform%alloc_status, array_name = array_name, & - deallocate_error_fatal = control%deallocate_error_fatal, & - exact_size = control%space_critical, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( inform%status /= 0 ) RETURN - - efactors%B_COLS_basic = 0 - DO i = 1, efactors%rank_a - efactors%B_COLS_basic( efactors%B_COLS( i ) ) = i - END DO - -! Mark the non-basic columns - - nb = 0 - DO i = 1, n - IF ( efactors%B_COLS_basic( i ) <= 0 ) THEN - nb = nb + 1 - efactors%B_COLS_basic( i ) = - nb - END IF - END DO - END IF - - g_ne = 0 - IF ( inform%preconditioner == 11 ) THEN - IF ( printi ) & - WRITE( out, "( A, ' preconditioner: G = H_22 ' )" ) prefix - SELECT CASE ( SMT_get( H%type ) ) - CASE ( 'DIAGONAL' ) - DO i = 1, n - IF ( efactors%B_COLS_basic( i ) < 0 ) g_ne = g_ne + 1 - END DO - CASE ( 'DENSE' ) - DO i = 1, n - DO j = 1, i - IF ( efactors%B_COLS_basic( i ) < 0 .AND. & - efactors%B_COLS_basic( j ) < 0 ) g_ne = g_ne + 1 - END DO - END DO - CASE ( 'SPARSE_BY_ROWS' ) - DO i = 1, n - DO l = H%ptr( i ), H%ptr( i + 1 ) - 1 - IF ( efactors%B_COLS_basic( i ) < 0 .AND. & - efactors%B_COLS_basic( H%col( l ) ) < 0 ) g_ne = g_ne + 1 - END DO - END DO - CASE ( 'COORDINATE' ) - DO l = 1, H%ne - IF ( efactors%B_COLS_basic( H%row( l ) ) < 0 .AND. & - efactors%B_COLS_basic( H%col( l ) ) < 0 ) g_ne = g_ne + 1 - END DO - END SELECT - ELSE IF ( inform%preconditioner == 12 ) THEN - IF ( printi ) & - WRITE( out, "( A, ' preconditioner: G = H_22 & H_21' )" ) prefix - SELECT CASE ( SMT_get( H%type ) ) - CASE ( 'DIAGONAL' ) - DO i = 1, n - IF ( efactors%B_COLS_basic( i ) < 0 ) g_ne = g_ne + 1 - END DO - CASE ( 'DENSE' ) - DO i = 1, n - DO j = 1, i - IF ( .NOT. ( efactors%B_COLS_basic( i ) > 0 .AND. & - efactors%B_COLS_basic( j ) > 0 ) ) g_ne = g_ne + 1 - END DO - END DO - CASE ( 'SPARSE_BY_ROWS' ) - DO i = 1, n - DO l = H%ptr( i ), H%ptr( i + 1 ) - 1 - IF ( .NOT. ( efactors%B_COLS_basic( i ) > 0 .AND. & - efactors%B_COLS_basic( h%col( l ) ) > 0 ) ) g_ne = g_ne + 1 - END DO - END DO - CASE ( 'COORDINATE' ) - DO l = 1, H%ne - IF ( .NOT. ( efactors%B_COLS_basic( H%row( l ) ) > 0 .AND. & - efactors%B_COLS_basic( h%col( l ) ) > 0 ) ) g_ne = g_ne + 1 - END DO - END SELECT - END IF - - efactors%K%n = n + m - efactors%K%ne = g_ne + a_ne + c_ne - - CASE DEFAULT - -! Anything else - - IF ( printi ) WRITE( out, & - "( A, ' no option control%preconditioner = ', I8, ' at present')") & - prefix, inform%preconditioner - inform%status = - 32 ; RETURN - - END SELECT - efactors%g_ne = g_ne - ELSE - g_ne = efactors%g_ne - IF ( c_ne == 2 ) efactors%K%ne = g_ne + a_ne + c_ne - END IF - - IF ( control%perturb_to_make_definite ) THEN - k_ne = efactors%K%ne + n - ELSE - k_ne = efactors%K%ne - END IF - -! Check to see if we need to reallocate the space to hold K - - resize = .FALSE. - IF ( ALLOCATED( efactors%K%row ) ) THEN - IF ( SIZE( efactors%K%row ) < k_ne .OR. ( control%space_critical & - .AND. SIZE( efactors%K%row ) /= k_ne ) ) resize = .TRUE. - ELSE - resize = .TRUE. - END IF - IF ( ALLOCATED( efactors%K%col ) ) THEN - IF ( SIZE( efactors%K%col ) < k_ne .OR. ( control%space_critical & - .AND. SIZE( efactors%K%col ) /= k_ne ) ) resize = .TRUE. - ELSE - resize = .TRUE. - END IF - IF ( ALLOCATED( efactors%K%val ) ) THEN - IF ( SIZE( efactors%K%val ) < k_ne .OR. ( control%space_critical & - .AND. SIZE( efactors%K%val ) /= k_ne ) ) resize = .TRUE. - ELSE - resize = .TRUE. - END IF - -! Allocate sufficient space to hold K - - IF ( resize ) THEN - array_name = 'sbls: efactors%K%row' - CALL SPACE_resize_array( k_ne, efactors%K%row, & - inform%status, inform%alloc_status, array_name = array_name, & - deallocate_error_fatal = control%deallocate_error_fatal, & - exact_size = control%space_critical, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( inform%status /= GALAHAD_ok ) RETURN - - array_name = 'sbls: efactors%K%col' - CALL SPACE_resize_array( k_ne, efactors%K%col, & - inform%status, inform%alloc_status, array_name = array_name, & - deallocate_error_fatal = control%deallocate_error_fatal, & - exact_size = control%space_critical, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( inform%status /= GALAHAD_ok ) RETURN - - array_name = 'sbls: efactors%K%val' - CALL SPACE_resize_array( k_ne, efactors%K%val, & - inform%status, inform%alloc_status, array_name = array_name, & - deallocate_error_fatal = control%deallocate_error_fatal, & - exact_size = control%space_critical, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( inform%status /= GALAHAD_ok ) RETURN - END IF - -! Now insert A, G and C into K - - k_c = g_ne + a_ne - efactors%k_g = a_ne - efactors%k_c = efactors%k_g + g_ne - efactors%k_pert = efactors%k_c + c_ne - -! Start by storing A - - IF ( resize .OR. new_a > 1 ) THEN - SELECT CASE ( SMT_get( A%type ) ) - CASE ( 'DENSE' ) - l = 0 - DO i = 1, m - DO j = 1, n - l = l + 1 - efactors%K%row( l ) = i + n - efactors%K%col( l ) = j - END DO - END DO - CASE ( 'SPARSE_BY_ROWS' ) - DO i = 1, m - DO l = A%ptr( i ), A%ptr( i + 1 ) - 1 - efactors%K%row( l ) = i + n - efactors%K%col( l ) = A%col( l ) - END DO - END DO - CASE ( 'COORDINATE' ) - efactors%K%row( : a_ne ) = A%row( : a_ne ) + n - efactors%K%col( : a_ne ) = A%col( : a_ne ) - END SELECT - END IF - IF ( resize .OR. new_a > 0 ) efactors%K%val( : a_ne ) = A%val( : a_ne ) - -! Now store G - - SELECT CASE( inform%preconditioner ) - - CASE( 1 ) - -! The identity matrix - - IF ( resize .OR. new_a > 1 ) THEN - DO i = 1, g_ne - efactors%K%row( a_ne + i ) = i - efactors%K%col( a_ne + i ) = i - efactors%K%val( a_ne + i ) = one - END DO - END IF - - CASE( 2 ) - -! The full matrix - - IF ( resize .OR. new_a > 1 .OR. new_h > 1 ) THEN - SELECT CASE ( SMT_get( H%type ) ) - CASE ( 'DIAGONAL' ) - DO i = 1, n - efactors%K%row( a_ne + i ) = i - efactors%K%col( a_ne + i ) = i - END DO - CASE ( 'DENSE' ) - l = 0 - DO i = 1, n - DO j = 1, i - l = l + 1 - efactors%K%row( a_ne + l ) = i - efactors%K%col( a_ne + l ) = j - END DO - END DO - CASE ( 'SPARSE_BY_ROWS' ) - DO i = 1, n - DO l = H%ptr( i ), H%ptr( i + 1 ) - 1 - efactors%K%row( a_ne + l ) = i - efactors%K%col( a_ne + l ) = H%col( l ) - END DO - END DO - CASE ( 'COORDINATE' ) - efactors%K%row( a_ne + 1 : a_ne + h_ne ) = H%row( : h_ne ) - efactors%K%col( a_ne + 1 : a_ne + h_ne ) = H%col( : h_ne ) - END SELECT - END IF - IF ( resize .OR. new_a > 1 .OR. new_h > 0 ) & - efactors%K%val( a_ne + 1 : a_ne + h_ne ) = H%val( : h_ne ) - - CASE( 3 ) - -! The (possibly modified) diagonal of the full matrix - - IF ( resize .OR. new_a > 1 .OR. new_h > 1 ) THEN - DO i = 1, g_ne - efactors%K%row( a_ne + i ) = i - efactors%K%col( a_ne + i ) = i - END DO - END IF - - IF ( resize .OR. new_a > 1 .OR. new_h > 0 ) THEN - efactors%K%val( a_ne + 1 : a_ne + g_ne ) = zero - SELECT CASE ( SMT_get( H%type ) ) - CASE ( 'DIAGONAL' ) - efactors%K%val( a_ne + 1 : a_ne + n ) = H%val( : n ) - CASE ( 'DENSE' ) - l = 0 - DO i = 1, n - DO j = 1, i - l = l + 1 - IF ( j == i ) efactors%K%val( a_ne + i ) = & - efactors%K%val( a_ne + i ) + H%val( l ) - END DO - END DO - CASE ( 'SPARSE_BY_ROWS' ) - DO i = 1, n - DO l = H%ptr( i ), H%ptr( i + 1 ) - 1 - IF ( H%col( l ) == i ) efactors%K%val( a_ne + i ) = & - efactors%K%val( a_ne + i ) + H%val( l ) - END DO - END DO - CASE ( 'COORDINATE' ) - DO l = 1, H%ne - i = H%row( l ) - IF ( H%col( l ) == i ) efactors%K%val( a_ne + i ) = & - efactors%K%val( a_ne + i ) + H%val( l ) - END DO - END SELECT - efactors%K%val( a_ne + 1 : a_ne + g_ne ) = & - MAX( efactors%K%val( a_ne + 1 : a_ne + g_ne ), control%min_diagonal ) - END IF - - CASE( 4 ) - -! A band (or semi-bandwith control%semibadwith) from the full matrix - - g_ne = a_ne - IF ( resize .OR. new_a > 1 .OR. new_h > 1 ) THEN - SELECT CASE ( SMT_get( H%type ) ) - CASE ( 'DIAGONAL' ) - DO i = 1, n - g_ne = g_ne + 1 - efactors%K%row( g_ne ) = i - efactors%K%col( g_ne ) = i - efactors%K%val( g_ne ) = H%val( i ) - END DO - CASE ( 'DENSE' ) - l = 0 - DO i = 1, n - DO j = 1, i - l = l + 1 - IF ( ABS( i - j ) <= control%semi_bandwidth ) THEN - g_ne = g_ne + 1 - efactors%K%row( g_ne ) = i - efactors%K%col( g_ne ) = j - efactors%K%val( g_ne ) = H%val( l ) - END IF - END DO - END DO - CASE ( 'SPARSE_BY_ROWS' ) - DO i = 1, n - DO l = H%ptr( i ), H%ptr( i + 1 ) - 1 - j = H%col( l ) - IF ( ABS( i - j ) <= control%semi_bandwidth ) THEN - g_ne = g_ne + 1 - efactors%K%row( g_ne ) = i - efactors%K%col( g_ne ) = j - efactors%K%val( g_ne ) = H%val( l ) - END IF - END DO - END DO - CASE ( 'COORDINATE' ) - DO l = 1, H%ne - i = H%row( l ) ; j = H%col( l ) - IF ( ABS( i - j ) <= control%semi_bandwidth ) THEN - g_ne = g_ne + 1 - efactors%K%row( g_ne ) = i - efactors%K%col( g_ne ) = j - efactors%K%val( g_ne ) = H%val( l ) - END IF - END DO - END SELECT - ELSE IF ( new_h > 0 ) THEN - SELECT CASE ( SMT_get( H%type ) ) - CASE ( 'DIAGONAL' ) - DO i = 1, n - g_ne = g_ne + 1 - efactors%K%val( g_ne ) = H%val( i ) - END DO - CASE ( 'DENSE' ) - l = 0 - DO i = 1, n - DO j = 1, i - l = l + 1 - IF ( ABS( i - j ) <= control%semi_bandwidth ) THEN - g_ne = g_ne + 1 - efactors%K%val( g_ne ) = H%val( l ) - END IF - END DO - END DO - CASE ( 'SPARSE_BY_ROWS' ) - DO i = 1, n - DO l = H%ptr( i ), H%ptr( i + 1 ) - 1 - IF ( ABS( i - H%col( l ) ) <= control%semi_bandwidth ) THEN - g_ne = g_ne + 1 - efactors%K%val( g_ne ) = H%val( l ) - END IF - END DO - END DO - CASE ( 'COORDINATE' ) - DO l = 1, H%ne - IF ( ABS( H%col( l ) - H%row( l ) ) & - <= control%semi_bandwidth ) THEN - g_ne = g_ne + 1 - efactors%K%val( g_ne ) = H%val( l ) - END IF - END DO - END SELECT - END IF - - CASE( 11 ) - -! Non-basic submatrices of H - - g_ne = a_ne - IF ( resize.OR. new_a > 1 .OR. new_h > 1 ) THEN - SELECT CASE ( SMT_get( H%type ) ) - CASE ( 'DIAGONAL' ) - DO i = 1, n - IF ( efactors%B_COLS_basic( i ) < 0 ) THEN - g_ne = g_ne + 1 - efactors%K%row( g_ne ) = i - efactors%K%col( g_ne ) = i - efactors%K%val( g_ne ) = H%val( i ) - END IF - END DO - CASE ( 'DENSE' ) - l = 0 - DO i = 1, n - DO j = 1, i - l = l + 1 - IF ( efactors%B_COLS_basic( i ) < 0 .AND. & - efactors%B_COLS_basic( j ) < 0 ) THEN - g_ne = g_ne + 1 - efactors%K%row( g_ne ) = i - efactors%K%col( g_ne ) = j - efactors%K%val( g_ne ) = H%val( l ) - END IF - END DO - END DO - CASE ( 'SPARSE_BY_ROWS' ) - DO i = 1, n - DO l = H%ptr( i ), H%ptr( i + 1 ) - 1 - j = H%col( l ) - IF ( efactors%B_COLS_basic( i ) < 0 .AND. & - efactors%B_COLS_basic( j ) < 0 ) THEN - g_ne = g_ne + 1 - efactors%K%row( g_ne ) = i - efactors%K%col( g_ne ) = j - efactors%K%val( g_ne ) = H%val( l ) - END IF - END DO - END DO - CASE ( 'COORDINATE' ) - DO l = 1, H%ne - i = H%row( l ) ; j = H%col( l ) - IF ( efactors%B_COLS_basic( i ) < 0 .AND. & - efactors%B_COLS_basic( j ) < 0 ) THEN - g_ne = g_ne + 1 - efactors%K%row( g_ne ) = i - efactors%K%col( g_ne ) = j - efactors%K%val( g_ne ) = H%val( l ) - END IF - END DO - END SELECT - ELSE IF ( new_h > 0 ) THEN - SELECT CASE ( SMT_get( H%type ) ) - CASE ( 'DIAGONAL' ) - DO i = 1, n - IF ( efactors%B_COLS_basic( i ) < 0 ) THEN - g_ne = g_ne + 1 - efactors%K%val( g_ne ) = H%val( i ) - END IF - END DO - CASE ( 'DENSE' ) - l = 0 - DO i = 1, n - DO j = 1, i - l = l + 1 - IF ( efactors%B_COLS_basic( i ) < 0 .AND. & - efactors%B_COLS_basic( j ) < 0 ) THEN - g_ne = g_ne + 1 - efactors%K%val( g_ne ) = H%val( l ) - END IF - END DO - END DO - CASE ( 'SPARSE_BY_ROWS' ) - DO i = 1, n - DO l = H%ptr( i ), H%ptr( i + 1 ) - 1 - IF ( efactors%B_COLS_basic( i ) < 0 .AND. & - efactors%B_COLS_basic( H%col( l ) ) < 0 ) THEN - g_ne = g_ne + 1 - efactors%K%val( g_ne ) = H%val( l ) - END IF - END DO - END DO - CASE ( 'COORDINATE' ) - DO l = 1, H%ne - IF ( efactors%B_COLS_basic( H%row( l ) ) < 0 .AND. & - efactors%B_COLS_basic( H%col( l ) ) < 0 ) THEN - g_ne = g_ne + 1 - efactors%K%val( g_ne ) = H%val( l ) - END IF - END DO - END SELECT - END IF - - CASE( 12 ) - - g_ne = a_ne - IF ( resize.OR. new_a > 1 .OR. new_h > 1 ) THEN - SELECT CASE ( SMT_get( H%type ) ) - CASE ( 'DIAGONAL' ) - DO i = 1, n - IF ( efactors%B_COLS_basic( i ) < 0 ) THEN - g_ne = g_ne + 1 - efactors%K%row( g_ne ) = i - efactors%K%col( g_ne ) = i - efactors%K%val( g_ne ) = H%val( i ) - END IF - END DO - CASE ( 'DENSE' ) - l = 0 - DO i = 1, n - DO j = 1, i - l = l + 1 - IF ( .NOT. ( efactors%B_COLS_basic( i ) > 0 .AND. & - efactors%B_COLS_basic( j ) > 0 ) ) THEN - g_ne = g_ne + 1 - efactors%K%row( g_ne ) = i - efactors%K%col( g_ne ) = j - efactors%K%val( g_ne ) = H%val( l ) - END IF - END DO - END DO - CASE ( 'SPARSE_BY_ROWS' ) - DO i = 1, n - DO l = H%ptr( i ), H%ptr( i + 1 ) - 1 - j = H%col( l ) - IF ( .NOT. ( efactors%B_COLS_basic( i ) > 0 .AND. & - efactors%B_COLS_basic( j ) > 0 ) ) THEN - g_ne = g_ne + 1 - efactors%K%row( g_ne ) = i - efactors%K%col( g_ne ) = j - efactors%K%val( g_ne ) = H%val( l ) - END IF - END DO - END DO - CASE ( 'COORDINATE' ) - DO l = 1, H%ne - i = H%row( l ) ; j = H%col( l ) - IF ( .NOT. ( efactors%B_COLS_basic( i ) > 0 .AND. & - efactors%B_COLS_basic( j ) > 0 ) ) THEN - g_ne = g_ne + 1 - efactors%K%row( g_ne ) = i - efactors%K%col( g_ne ) = j - efactors%K%val( g_ne ) = H%val( l ) - END IF - END DO - END SELECT - ELSE IF ( new_h > 0 ) THEN - SELECT CASE ( SMT_get( H%type ) ) - CASE ( 'DIAGONAL' ) - DO i = 1, n - IF ( efactors%B_COLS_basic( i ) < 0 ) THEN - g_ne = g_ne + 1 - efactors%K%val( g_ne ) = H%val( i ) - END IF - END DO - CASE ( 'DENSE' ) - l = 0 - DO i = 1, n - DO j = 1, i - l = l + 1 - IF ( .NOT. ( efactors%B_COLS_basic( i ) > 0 .AND. & - efactors%B_COLS_basic( j ) > 0 ) ) THEN - g_ne = g_ne + 1 - efactors%K%val( g_ne ) = H%val( l ) - END IF - END DO - END DO - CASE ( 'SPARSE_BY_ROWS' ) - DO i = 1, n - DO l = H%ptr( i ), H%ptr( i + 1 ) - 1 - IF ( .NOT. ( efactors%B_COLS_basic( i ) > 0 .AND. & - efactors%B_COLS_basic( H%col( l ) ) > 0 ) ) THEN - g_ne = g_ne + 1 - efactors%K%val( g_ne ) = H%val( l ) - END IF - END DO - END DO - CASE ( 'COORDINATE' ) - DO l = 1, H%ne - IF ( .NOT. ( efactors%B_COLS_basic( H%row( l ) ) > 0 .AND. & - efactors%B_COLS_basic( H%col( l ) ) > 0 ) ) THEN - g_ne = g_ne + 1 - efactors%K%val( g_ne ) = H%val( l ) - END IF - END DO - END SELECT - END IF - - END SELECT - -! Finally store -C in K - - IF ( c_ne > 0 ) THEN - IF ( new_a == 2 .OR. new_a == 2 .OR. new_c == 2 ) THEN - SELECT CASE ( SMT_get( C%type ) ) - CASE ( 'DIAGONAL' ) - DO i = 1, m - efactors%K%row( k_c + i ) = n + i - efactors%K%col( k_c + i ) = n + i - END DO - CASE ( 'DENSE' ) - l = 0 - DO i = 1, m - DO j = 1, i - l = l + 1 - efactors%K%row( k_c + l ) = n + i - efactors%K%col( k_c + l ) = n + j - END DO - END DO - CASE ( 'SPARSE_BY_ROWS' ) - DO i = 1, m - DO l = C%ptr( i ), C%ptr( i + 1 ) - 1 - efactors%K%row( k_c + l ) = n + i - efactors%K%col( k_c + l ) = n + C%col( l ) - END DO - END DO - CASE ( 'COORDINATE' ) - efactors%K%row( k_c + 1 : efactors%K%ne ) = n + C%row - efactors%K%col( k_c + 1 : efactors%K%ne ) = n + C%col - END SELECT - efactors%K%val( k_c + 1 : efactors%K%ne ) = - C%val - ELSE - IF ( new_c > 0 ) efactors%K%val( k_c + 1 : efactors%K%ne ) = - C%val - END IF - END IF - -! =========== -! FACTORIZE -! =========== - - 200 CONTINUE - - IF ( printi ) THEN - IF ( inform%factorization == 1 ) THEN - WRITE( out, & - "( /, A, ' Using SILS to factorize the Schur complement' )" ) prefix - ELSE - WRITE( out, & - "( /, A, ' Using SILS to factorize the augmented matrix' )" ) prefix - END IF - END IF - -! A diagonal perturbation is to be added to the matrix to be factored -! to make the resultant diaginally dominant - - IF ( inform%perturbed .AND. .NOT. use_schur_complement ) THEN - efactors%K%val( efactors%K%ne : k_ne ) = zero - DO l = a_ne + 1, k_c - i = efactors%K%row( l ) - IF ( i > n ) CYCLE - j = efactors%K%col( l ) - IF ( j > n ) CYCLE - val = efactors%K%val( l ) - IF ( i == j ) THEN - efactors%K%val( efactors%K%ne + i ) = & - efactors%K%val( efactors%K%ne + i ) + val - ELSE - efactors%K%val( efactors%K%ne + i ) = & - efactors%K%val( efactors%K%ne + i ) - ABS( val ) - efactors%K%val( efactors%K%ne + j ) = & - efactors%K%val( efactors%K%ne + j ) - ABS( val ) - END IF - END DO - DO i = 1, n - j = efactors%K%ne + i - efactors%K%row( j ) = i - efactors%K%col( j ) = i - IF ( efactors%K%val( j ) > zero ) THEN - efactors%K%val( j ) = zero - ELSE - efactors%K%val( j ) = control%min_diagonal - efactors%K%val( j ) - END IF - END DO - efactors%K%ne = k_ne - END IF - -! WRITE( 77, "( ' n, nnz ', I7, I10 )" ) efactors%K%n, efactors%K%ne -! WRITE( 77, "( A, /, ( 10I7) )" ) ' rows =', ( efactors%K%row ) -! WRITE( 77, "( A, /, ( 10I7) )" ) ' cols =', ( efactors%K%col ) -! WRITE( 77, "( A, /, ( 10F7.2) )" ) ' vals =', ( efactors%K%val ) - -! WRITE( 25, "( ' K: row, col, val ', /, 3( 2I6, ES24.16 ) )" ) & -! ( efactors%K%row( i ), efactors%K%col( i ), efactors%K%val( i ), & -! i = 1, efactors%K%ne ) - - IF ( new_a > 1 .OR. new_h > 1 .OR. inform%perturbed ) THEN - -! Initialize the factorization data - -! WRITE( out, "( ' n, nnz ', I7, I10 )" ) efactors%K%n, efactors%K%ne - IF ( control%print_level <= 0 ) THEN - efactors%K_control%ldiag = 0 - efactors%K_control%lp = - 1 - efactors%K_control%mp = - 1 - efactors%K_control%wp = - 1 - efactors%K_control%sp = - 1 - ELSE - efactors%K_control%ldiag = control%print_level - 1 - efactors%K_control%lp = control%error - efactors%K_control%mp = control%out - efactors%K_control%wp = control%out - efactors%K_control%sp = control%out - END IF - -! write(6,*) control%ordering, control%scaling -! write(6,*) control%static_tolerance, control%static_level - -! Analyse the preconditioner - - IF ( efactors%K%n > 0 ) THEN - CALL SILS_ANALYSE( efactors%K, efactors%K_factors, & - efactors%K_control, AINFO_SILS ) - inform%sils_analyse_status = AINFO_SILS%flag - IF ( printi ) WRITE( out, & - "( A, ' SILS: analysis complete: status = ', I0 )" ) & - prefix, inform%sils_analyse_status - IF ( inform%sils_analyse_status < 0 ) THEN - inform%status = GALAHAD_error_analysis ; RETURN - END IF - ELSE - IF ( printi ) WRITE( out, & - "( A, ' no analysis need for matrix of order 0 ')" ) prefix - inform%sils_analyse_status = 0 - END IF - END IF - -! Factorize the preconditioner - - IF ( efactors%K%n > 0 ) THEN - efactors%K_control%U = control%pivot_tol - CALL SILS_FACTORIZE( efactors%K, efactors%K_factors, & - efactors%K_control, FINFO_SILS ) - inform%sils_factorize_status = FINFO_SILS%FLAG - IF ( printi ) WRITE( out, & - "( A, ' SILS: factorization complete: status = ', I0 )" ) prefix, & - inform%sils_factorize_status - IF ( inform%sils_factorize_status < 0 ) THEN - inform%status = GALAHAD_error_factorization ; RETURN - END IF - IF ( inform%sils_factorize_status == 4 ) THEN - inform%rank_def = .TRUE. - inform%rank = FINFO_SILS%rank - END IF - - IF ( printi ) WRITE( out, "( A, ' K nnz(prec,factors)', 2( 1X, I0 ) )")& - prefix, efactors%K%ne, FINFO_SILS%NEBDU - - kzero = efactors%K%n - FINFO_SILS%rank - kminus = FINFO_SILS%NEIG - IF ( use_schur_complement ) THEN - IF ( kzero + kminus > 0 ) THEN - IF ( control%out > 0 .AND. control%print_level > 0 ) & - WRITE( control%out, "( A, 1X, I0, ' -ve and ' , I0, & - & ' zero eigevalues > 0 required ones ' )" ) & - prefix, kminus, kzero - IF ( control%perturb_to_make_definite .AND. & - .NOT. inform%perturbed ) THEN - IF ( control%out > 0 .AND. control%print_level > 0 ) & - WRITE( control%out, & - "( A, ' Perturbing G to try to correct this ' )" ) prefix - inform%factorization = 2 - inform%perturbed = .TRUE. - GO TO 100 - ELSE - inform%status = GALAHAD_error_preconditioner - RETURN - END IF - END IF - ELSE - IF ( kzero + kminus > m ) THEN - IF ( control%out > 0 .AND. control%print_level > 0 ) & - WRITE( control%out, "( A, 1X, I0, ' -ve and ' , I0, & - & ' zero eigevalues > ', I0, ' required ones ' )" ) & - prefix, kminus, kzero, m - IF ( control%perturb_to_make_definite .AND. & - .NOT. inform%perturbed ) THEN - IF ( control%out > 0 .AND. control%print_level > 0 ) & - WRITE( control%out, & - "( A, ' Perturbing G to try to correct this ' )" ) prefix - inform%perturbed = .TRUE. - GO TO 200 - ELSE - inform%status = GALAHAD_error_preconditioner - RETURN - END IF - END IF - END IF - ELSE - IF ( printi ) WRITE( out, & - "( A, ' no factorization need for matrix of order 0 ')" ) prefix - inform%sils_factorize_status = 0 - END IF - - CALL CPU_TIME( time_end ) - IF ( printi ) WRITE( out, & - "( A, ' time to form and factorize explicit preconditioner ', F6.2 )")& - prefix, time_end - time_start - - inform%status = GALAHAD_ok - RETURN - -! End of subroutine SBLS_form_n_factorize_explicit - - END SUBROUTINE SBLS_form_n_factorize_explicit - -!-*-*- S B L S _ FORM _ AD _ FACTORIZE _ IMPLICIT S U B R O U T I N E -*-*- - - SUBROUTINE SBLS_form_n_factorize_implicit( n, m, H, A, C, ifactors, & - last_factorization, & - control, inform ) - -! Form an implicit factorization of -! -! K = ( G A^T ) -! ( A -C ) -! -! for various approximations G of H - -! Dummy arguments - - INTEGER ( KIND = ip_ ), INTENT( IN ) :: n, m, last_factorization - TYPE ( SMT_type ), INTENT( IN ) :: H, A, C - TYPE ( SBLS_implicit_factors_type ), INTENT( INOUT ) :: ifactors - TYPE ( SBLS_control_type ), INTENT( IN ) :: control - TYPE ( SBLS_inform_type ), INTENT( INOUT ) :: inform - -! Local variables - - INTEGER ( KIND = ip_ ) :: i, ii, j, jj, l, out, a_ne - INTEGER ( KIND = ip_ ) :: new_h, new_a, new_c - LOGICAL :: printi - CHARACTER ( LEN = 80 ) :: array_name - TYPE ( SILS_AINFO ) :: AINFO_SILS - TYPE ( SILS_FINFO ) :: FINFO_SILS - TYPE ( GLS_AINFO ) AINFO_GLS - TYPE ( GLS_FINFO ) FINFO_GLS - - REAL :: time_start, time_end -! REAL :: t1, t2, t3 - -! prefix for all output - - CHARACTER ( LEN = LEN( TRIM( control%prefix ) ) - 2 ) :: prefix - prefix = control%prefix( 2 : LEN( TRIM( control%prefix ) ) - 1 ) - - CALL CPU_TIME( time_start ) - - out = control%out - printi = control%print_level >= 1 - - IF ( SMT_get( A%type ) == 'DENSE' ) THEN - a_ne = m * n - ELSE IF ( SMT_get( A%type ) == 'SPARSE_BY_ROWS' ) THEN - a_ne = A%ptr( m + 1 ) - 1 - ELSE - a_ne = A%ne - END IF - - IF ( inform%preconditioner >= 0 ) THEN - IF ( printi ) WRITE( out, & - "( A, ' Use SBLS_form_n_factorize_explicit subroutine instead' )" ) & - prefix - inform%status = - 31 ; RETURN - END IF - inform%status = GALAHAD_ok - - IF ( last_factorization /= inform%factorization ) THEN - new_h = 2 - new_a = 2 - new_c = 2 - ELSE - new_h = control%new_h - new_a = control%new_a - new_c = control%new_c - END IF - -! Find a permutation of A = IR ( A1 A2 ) IC^T for which the "basis" -! ( 0 0 ) -! matrix A1 is nonsingular - -! This induces a re-ordering IC^T P IC of P - -! ---------- -! Find basis -! ---------- - -! CALL CPU_TIME( t1 ) - -! Find a "basic" set of rows and colums, that is a non-singular submatrix A1 of -! maximal rank. Also set up the complement matrix A2 of columns of A not in A1 - - IF ( new_a > 0 ) THEN - ifactors%m = m ; ifactors%n = n - CALL SBLS_find_A1_and_A2( m, n, a_ne, A, ifactors%A1, & - ifactors%A1_factors, & - ifactors%A1_control, ifactors%A2, & - ifactors%A_ROWS_basic, & - ifactors%A_COLS_basic, & - ifactors%A_ROWS_order, ifactors%A_COLS_order,& - ifactors%rank_a, ifactors%k_n, ifactors%n_r, & - prefix, 'sbls: ifactors%', out, printi, & - control, inform, AINFO_GLS, FINFO_GLS, & - ifactors%RHS_orig, ifactors%SOL_current ) - END IF - -! Form the preconditioner - - ifactors%unitb31 = .TRUE. - ifactors%unitp22 = .TRUE. - - SELECT CASE( inform%preconditioner ) - - CASE( - 1 ) - - IF ( printi ) WRITE( out, "( /, A, ' Preconditioner G_22 = I' )" ) & - prefix - -! G_11 = 0, G_21 = 0, G_22 = I - - ifactors%unitb22 = .TRUE. - ifactors%zerob32 = .TRUE. - ifactors%zerob33 = .TRUE. - ifactors%zerop11 = .TRUE. - ifactors%zerop21 = .TRUE. - - CASE( - 2 ) - - IF ( printi ) WRITE( out, "( /, A, ' Preconditioner G_22 = H_22' )" ) & - prefix - -! G_11 = 0, G_21 = 0, G_22 = H_22 - - ifactors%unitb22 = .FALSE.! 3 diagonal, G = diag( H ) -! 4 G_11 = 0, G_21 = 0, ! 3 diagonal, G = diag( H ) -! 4 G_11 = 0, G_21 = 0, ! 3 diagonal, G = diag( H ) -! 4 G_11 = 0, G_21 = 0, -! 5 G_11 = 0, G_21 = H_21, G_22 = H_22 -! -! 5 G_11 = 0, G_21 = H_21, G_22 = H_22 -! -! 5 G_11 = 0, G_21 = H_21, G_22 = H_22 -! - ifactors%zerob32 = .TRUE. - ifactors%zerob33 = .TRUE. - ifactors%zerop11 = .TRUE. - ifactors%zerop21 = .TRUE. -! 3 diagonal, G = diag( H ) -! 4 G_11 = 0, G_21 = 0, -! 5 G_11 = 0, G_21 = H_21, G_22 = H_22 -! -! Store H_22 in B22; see how much space is required - - IF ( new_h > 1 ) THEN - ifactors%B22%n = ifactors%n_r - ifactors%B22%ne = 0 - SELECT CASE ( SMT_get( H%type ) ) - CASE ( 'DIAGONAL' ) - DO i = 1, n - IF ( ifactors%A_COLS_order( i ) > ifactors%rank_a ) & - ifactors%B22%ne = ifactors%B22%ne + 1 - END DO - CASE ( 'DENSE' ) - DO i = 1, n - DO j = 1, i - IF ( ifactors%A_COLS_order( i ) > ifactors%rank_a .AND. & - ifactors%A_COLS_order( j ) > ifactors%rank_a ) & - ifactors%B22%ne = ifactors%B22%ne + 1 - END DO - END DO - CASE ( 'SPARSE_BY_ROWS' ) - DO i = 1, n - DO l = H%ptr( i ), H%ptr( i + 1 ) - 1 - IF ( ifactors%A_COLS_order( i ) > ifactors%rank_a .AND. & - ifactors%A_COLS_order( H%col( l ) ) > ifactors%rank_a ) & - ifactors%B22%ne = ifactors%B22%ne + 1 - END DO - END DO - CASE ( 'COORDINATE' ) - DO l = 1, H%ne - IF ( ifactors%A_COLS_order( H%row( l ) ) > ifactors%rank_a .AND. & - ifactors%A_COLS_order( H%col( l ) ) > ifactors%rank_a ) & - ifactors%B22%ne = ifactors%B22%ne + 1 - END DO - END SELECT - -! Allocate sufficient space ... - - array_name = 'sbls: ifactors%B22%row' - CALL SPACE_resize_array( ifactors%B22%ne, ifactors%B22%row, & - inform%status, inform%alloc_status, array_name = array_name, & - deallocate_error_fatal = control%deallocate_error_fatal, & - exact_size = control%space_critical, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( inform%status /= GALAHAD_ok ) RETURN - - array_name = 'sbls: ifactors%B22%col' - CALL SPACE_resize_array( ifactors%B22%ne, ifactors%B22%col, & - inform%status, inform%alloc_status, array_name = array_name, & - deallocate_error_fatal = control%deallocate_error_fatal, & - exact_size = control%space_critical, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( inform%status /= GALAHAD_ok ) RETURN - - array_name = 'sbls: ifactors%B22_VAL' - CALL SPACE_resize_array( ifactors%B22%ne, ifactors%B22%val, & - inform%status, inform%alloc_status, array_name = array_name, & - deallocate_error_fatal = control%deallocate_error_fatal, & - exact_size = control%space_critical, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( inform%status /= GALAHAD_ok ) RETURN - END IF - -! ... and store H_22 - - ifactors%B22%ne = 0 - IF ( new_a > 0 .OR. new_h > 1 ) THEN - SELECT CASE ( SMT_get( H%type ) ) - CASE ( 'DIAGONAL' ) - DO i = 1, n - ii = ifactors%A_COLS_order( i ) - ifactors%rank_a - IF ( ii > 0 ) THEN - ifactors%B22%ne = ifactors%B22%ne + 1 - ifactors%B22%row( ifactors%B22%ne ) = ii - ifactors%B22%col( ifactors%B22%ne ) = ii - ifactors%B22%val( ifactors%B22%ne ) = H%val( i ) - END IF - END DO - CASE ( 'DENSE' ) - l = 0 - DO i = 1, n - DO j = 1, i - l = l + 1 - ii = ifactors%A_COLS_order( i ) - ifactors%rank_a - jj = ifactors%A_COLS_order( j ) - ifactors%rank_a - IF ( ii > 0.AND. jj > 0 ) THEN - ifactors%B22%ne = ifactors%B22%ne + 1 - ifactors%B22%row( ifactors%B22%ne ) = ii - ifactors%B22%col( ifactors%B22%ne ) = jj - ifactors%B22%val( ifactors%B22%ne ) = H%val( l ) - END IF - END DO - END DO - CASE ( 'SPARSE_BY_ROWS' ) - DO i = 1, n - DO l = H%ptr( i ), H%ptr( i + 1 ) - 1 - ii = ifactors%A_COLS_order( i ) - ifactors%rank_a - jj = ifactors%A_COLS_order( H%col( l ) ) - ifactors%rank_a - IF ( ii > 0 .AND. jj > 0 ) THEN - ifactors%B22%ne = ifactors%B22%ne + 1 - ifactors%B22%row( ifactors%B22%ne ) = ii - ifactors%B22%col( ifactors%B22%ne ) = jj - ifactors%B22%val( ifactors%B22%ne ) = H%val( l ) - END IF - END DO - END DO - CASE ( 'COORDINATE' ) - DO l = 1, H%ne - ii = ifactors%A_COLS_order( H%row( l ) ) - ifactors%rank_a - jj = ifactors%A_COLS_order( H%col( l ) ) - ifactors%rank_a - IF ( ii > 0 .AND. jj > 0 ) THEN - ifactors%B22%ne = ifactors%B22%ne + 1 - ifactors%B22%row( ifactors%B22%ne ) = ii - ifactors%B22%col( ifactors%B22%ne ) = jj - ifactors%B22%val( ifactors%B22%ne ) = H%val( l ) - END IF - END DO - END SELECT - ELSE - ifactors%B22%row = ifactors%B22%row - ifactors%rank_a - ifactors%B22%col = ifactors%B22%col - ifactors%rank_a - SELECT CASE ( SMT_get( H%type ) ) - CASE ( 'DIAGONAL' ) - DO i = 1, n - IF ( ifactors%A_COLS_order( i ) > ifactors%rank_a ) THEN - ifactors%B22%ne = ifactors%B22%ne + 1 - ifactors%B22%val( ifactors%B22%ne ) = H%val( i ) - END IF - END DO - CASE ( 'DENSE' ) - l = 0 - DO i = 1, n - DO j = 1, i - l = l + 1 - IF ( ifactors%A_COLS_order( i ) > ifactors%rank_a .AND. & - ifactors%A_COLS_order( j ) > ifactors%rank_a ) THEN - ifactors%B22%ne = ifactors%B22%ne + 1 - ifactors%B22%val( ifactors%B22%ne ) = H%val( l ) - END IF - END DO - END DO - CASE ( 'SPARSE_BY_ROWS' ) - DO i = 1, n - DO l = H%ptr( i ), H%ptr( i + 1 ) - 1 - IF ( ifactors%A_COLS_order( i ) > ifactors%rank_a .AND. & - ifactors%A_COLS_order( H%col( l ) ) > ifactors%rank_a ) THEN - ifactors%B22%ne = ifactors%B22%ne + 1 - ifactors%B22%val( ifactors%B22%ne ) = H%val( l ) - END IF - END DO - END DO - CASE ( 'COORDINATE' ) - DO l = 1, H%ne - IF ( ifactors%A_COLS_order( H%row( l ) ) > ifactors%rank_a .AND. & - ifactors%A_COLS_order( H%col( l ) ) > ifactors%rank_a ) THEN - ifactors%B22%ne = ifactors%B22%ne + 1 - ifactors%B22%val( ifactors%B22%ne ) = H%val( l ) - END IF - END DO - END SELECT - END IF - -! WRITE( out, "( ' m, nnz ', 2I4 )" ) ifactors%B22%n, ifactors%B22%ne -! WRITE( out, "( A, /, ( 10I7) )" ) ' rows =', ( ifactors%B22%row ) -! WRITE( out, "( A, /, ( 10I7) )" ) ' cols =', ( ifactors%B22%col ) -! WRITE( out, "( A, /, ( 10F7.2) )" ) ' vals =', ( ifactors%B22%val ) - -! Now factorize H_22 - - IF ( printi ) WRITE( out, "( A, ' Using SILS' )" ) prefix - IF ( control%print_level <= 0 ) THEN - ifactors%B22_control%ldiag = 0 - ifactors%B22_control%lp = - 1 - ifactors%B22_control%mp = - 1 - ifactors%B22_control%wp = - 1 - ifactors%B22_control%sp = - 1 - ELSE - ifactors%B22_control%ldiag = control%print_level - 1 - ifactors%B22_control%lp = control%error - ifactors%B22_control%mp = control%out - ifactors%B22_control%wp = control%out - ifactors%B22_control%sp = control%out - END IF - - IF ( control%perturb_to_make_definite ) ifactors%B22_control%pivoting = 4 - CALL SILS_ANALYSE( ifactors%B22, ifactors%B22_factors, & - ifactors%B22_control, AINFO_SILS ) - inform%sils_analyse_status = AINFO_SILS%FLAG - IF ( printi ) WRITE( out, & - "( A, ' Analysis complete: status = ', I0 )" ) prefix, & - inform%sils_analyse_status - IF ( inform%sils_analyse_status < 0 ) THEN - inform%status = GALAHAD_error_analysis - RETURN - END IF - - CALL SILS_FACTORIZE( ifactors%B22, ifactors%B22_factors, & - ifactors%B22_control, FINFO_SILS ) - inform%sils_factorize_status = FINFO_SILS%FLAG - IF ( printi ) WRITE( out, & - "( A, ' Factorization complete: status = ', I0 )" ) & - prefix, inform%sils_factorize_status - IF ( inform%sils_factorize_status < 0 ) THEN - inform%status = GALAHAD_error_factorization - RETURN - END IF - IF ( inform%sils_factorize_status == 4 ) THEN - inform%rank_def = .TRUE. - inform%rank = FINFO_SILS%rank - END IF - -! Check to ensure that the preconditioner is definite - - IF ( FINFO_SILS%modstep /= 0 ) THEN - inform%perturbed = .TRUE. - array_name = 'sbls: ifactors%PERT' - CALL SPACE_resize_array( ifactors%B22%n, ifactors%PERT, & - inform%status, inform%alloc_status, array_name = array_name, & - deallocate_error_fatal = control%deallocate_error_fatal, & - exact_size = control%space_critical, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( inform%status /= GALAHAD_ok ) RETURN - - CALL SILS_ENQUIRE( ifactors%B22_factors, PERTURBATION = ifactors%PERT ) - IF ( printi ) WRITE( out, "( A, ' H_22 perturbed by', ES11.4 )" ) & - prefix, MAXVAL( ABS( ifactors%PERT ) ) - ELSE - inform%perturbed = .FALSE. - END IF - - IF ( FINFO_SILS%NEIG + ifactors%B22%n - FINFO_SILS%rank > 0 ) THEN - WRITE( out, "( A, ' SILS_FACTORIZE reports B22 is indefinite ' )" ) & - prefix - inform%status = GALAHAD_error_preconditioner ; RETURN - END IF - IF ( printi ) WRITE( out, "( A, ' B22 nnz(prec,factors)', 2( 1X, I0))")& - prefix, ifactors%B22%ne, FINFO_SILS%nrlbdu - -! Restore the row and colum indices to make matrix-vector products efficient - - ifactors%B22%row = ifactors%B22%row + ifactors%rank_a - ifactors%B22%col = ifactors%B22%col + ifactors%rank_a - - CASE( - 3 ) - -! G_11 = 0, G_21 = H_21, G_22 = H_22 - - IF ( printi ) WRITE( out, & - "( /, A, ' Preconditioner G_22 = H_22 and G_21 = H_21 ' )" ) prefix - - ifactors%unitb22 = .FALSE. - ifactors%zerob32 = .TRUE. - ifactors%zerob33 = .TRUE. - ifactors%zerop11 = .TRUE. - ifactors%zerop21 = .FALSE. - - CASE DEFAULT - -! Anything else - - IF ( printi ) WRITE( out, & - "( A, ' No option control%preconditioner = ', I8, ' at present' )" ) & - prefix, inform%preconditioner - inform%status = - 32 ; RETURN - - END SELECT - - CALL CPU_TIME( time_end ) - IF ( printi ) WRITE( out, & - "( A, ' time to form and factorize implicit preconditioner ', F6.2 )" )& - prefix, time_end - time_start - - RETURN - -! End of subroutine SBLS_form_n_factorize_implicit - - END SUBROUTINE SBLS_form_n_factorize_implicit - -!-*-*-*-*-*-*-*-*- S B L S _ S O L V E S U B R O U T I N E -*-*-*-*-*-*-*- - - SUBROUTINE SBLS_solve( n, m, A, C, data, control, inform, SOL ) - -! Solve - -! ( G A^T ) ( x ) = ( a ) -! ( A -C ) ( y ) ( b ) - -! Dummy arguments - - INTEGER ( KIND = ip_ ), INTENT( IN ) :: n, m - TYPE ( SMT_type ), INTENT( IN ) :: A, C - TYPE ( SBLS_data_type ), INTENT( INOUT ) :: data - TYPE ( SBLS_control_type ), INTENT( IN ) :: control - TYPE ( SBLS_inform_type ), INTENT( INOUT ) :: inform - REAL ( KIND = rp_ ), INTENT( INOUT ), DIMENSION( n + m ) :: SOL - -! Solve the preconditioned system - - IF ( inform%factorization == 3 ) THEN - CALL SBLS_solve_null_space( data%nfactors, control, inform, SOL ) - ELSE IF ( inform%preconditioner >= 0 ) THEN - CALL SBLS_solve_explicit( n, m, A, C, data%efactors, control, inform, & - SOL ) - ELSE - CALL SBLS_solve_implicit( data%ifactors, control, inform, SOL ) - END IF - - RETURN - -! End of subroutine SBLS_solve - - END SUBROUTINE SBLS_solve - -!-*-*-*- S B L S _ S O L V E _ E X P L I C I T S U B R O U T I N E -*-*-*- - - SUBROUTINE SBLS_solve_explicit( n, m, A, C, efactors, control, inform, & - SOL ) - -! Solve - -! ( G A^T ) ( x ) = ( a ) -! ( A -C ) ( y ) ( b ) - -! using an explicit factorization of K or C + A G(inv) A(transpose) - -! Dummy arguments - - INTEGER ( KIND = ip_ ), INTENT( IN ) :: n, m - TYPE ( SMT_type ), INTENT( IN ) :: A, C - TYPE ( SBLS_explicit_factors_type ), INTENT( INOUT ) :: efactors - TYPE ( SBLS_control_type ), INTENT( IN ) :: control - TYPE ( SBLS_inform_type ), INTENT( INOUT ) :: inform - REAL ( KIND = rp_ ), INTENT( INOUT ), DIMENSION( n + m ) :: SOL - -! Local variables - - INTEGER ( KIND = ip_ ) :: iter, i, ii, j, l, np1, npm - REAL ( KIND = rp_ ) :: val - CHARACTER ( LEN = 80 ) :: array_name - TYPE ( SILS_SINFO ) :: SINFO_SILS - -! prefix for all output - - CHARACTER ( LEN = LEN( TRIM( control%prefix ) ) - 2 ) :: prefix - prefix = control%prefix( 2 : LEN( TRIM( control%prefix ) ) - 1 ) - -! Allocate workspace arrays - - npm = n + m - IF ( inform%factorization == 1 ) np1 = n + 1 - IF ( efactors%K%n /= efactors%len_sol_workspace ) THEN -! write(6,*) ' resize ' - array_name = 'sbls: efactors%RHS' - CALL SPACE_resize_array( npm, efactors%RHS, & - inform%status, inform%alloc_status, array_name = array_name, & - deallocate_error_fatal = control%deallocate_error_fatal, & - exact_size = .TRUE., & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( inform%status /= GALAHAD_ok ) RETURN - - array_name = 'sbls: efactors%RHS_orig' - CALL SPACE_resize_array( npm, efactors%RHS_orig, & - inform%status, inform%alloc_status, array_name = array_name, & - deallocate_error_fatal = control%deallocate_error_fatal, & - exact_size = .TRUE., & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( inform%status /= GALAHAD_ok ) RETURN - efactors%len_sol_workspace = efactors%K%n - END IF - -! Compute the original residual - -! WRITE( 25,"( ' sol ', /, ( 5ES24.16 ) )" ) SOL - efactors%RHS_orig( : npm ) = SOL( : npm ) - efactors%RHS( : npm ) = SOL( : npm ) - SOL( : npm ) = zero - -! Solve the system with iterative refinement - - IF ( control%print_level > 1 .AND. control%out > 0 ) & - WRITE( control%out, "( A, ' maximum residual ', ES12.4 )" ) & - prefix, MAXVAL( ABS( efactors%RHS( : npm ) ) ) - - DO iter = 0, control%itref_max - -! Use factors of the Schur complement - - IF ( inform%factorization == 1 ) THEN - -! Form a <- diag(G)(inverse) a - - efactors%RHS( : n ) = efactors%RHS( : n ) / efactors%G_diag( : n ) - - IF ( m > 0 ) THEN - -! Form b <- A a - b - - efactors%RHS( np1 : npm ) = - efactors%RHS( np1 : npm ) - SELECT CASE ( SMT_get( A%type ) ) - CASE ( 'DENSE' ) - l = 0 - DO i = 1, m - ii = n + i - efactors%RHS( ii ) = efactors%RHS( ii ) + & - DOT_PRODUCT( A%val( l + 1 : l + n ), efactors%RHS( : n ) ) - l = l + n - END DO - CASE ( 'SPARSE_BY_ROWS' ) - DO i = 1, m - ii = n + i - DO l = A%ptr( i ), A%ptr( i + 1 ) - 1 - efactors%RHS( ii ) = efactors%RHS( ii ) + & - A%val( l ) * efactors%RHS( A%col( l ) ) - END DO - END DO - CASE ( 'COORDINATE' ) - DO l = 1, A%ne - ii = n + A%row( l ) -! write(6,*) ' ii, size( efactors%RHS ) ', ii, size( efactors%RHS ) - efactors%RHS( ii ) = efactors%RHS( ii ) + & - A%val( l ) * efactors%RHS( A%col( l ) ) - END DO - END SELECT - -! Solve ( C + A G(inv) A(transpose) ) y = A diag(G)(inverse) a - b -! and place the result in a - -! WRITE(6,*) efactors%RHS( np1 : npm ) - CALL SILS_SOLVE( efactors%K, efactors%K_factors, & - efactors%RHS( np1 : npm ), efactors%K_control, SINFO_SILS ) - inform%sils_solve_status = SINFO_SILS%flag - IF ( inform%sils_solve_status < 0 ) THEN - IF ( control%out > 0 .AND. control%print_level > 0 ) & - WRITE( control%out, "( A, ' solve exit status = ', I3 )" ) & - prefix, inform%sils_solve_status - inform%status = GALAHAD_error_solve - RETURN - END IF -! WRITE(6,*) efactors%RHS( np1 : npm ) - -! Form a <- diag(G)(inverse) ( a - A(trans) y ) - - SELECT CASE ( SMT_get( A%type ) ) - CASE ( 'DENSE' ) - l = 0 - DO i = 1, m - DO j = 1, n - l = l + 1 - efactors%RHS( j ) = efactors%RHS( j ) - A%val( l ) * & - efactors%RHS( n + i ) / efactors%G_diag( j ) - END DO - END DO - CASE ( 'SPARSE_BY_ROWS' ) - DO i = 1, m - DO l = A%ptr( i ), A%ptr( i + 1 ) - 1 - j = A%col( l ) - efactors%RHS( j ) = efactors%RHS( j ) - A%val( l ) * & - efactors%RHS( n + i ) / efactors%G_diag( j ) - END DO - END DO - CASE ( 'COORDINATE' ) - DO l = 1, A%ne - j = A%col( l ) - efactors%RHS( j ) = efactors%RHS( j ) - A%val( l ) * & - efactors%RHS( n + A%row( l ) ) / efactors%G_diag( j ) - END DO - END SELECT -! WRITE(6,*) ' sol ', efactors%RHS - END IF - - ELSE - -! Use factors of the augmented system - - CALL SILS_SOLVE( efactors%K, efactors%K_factors, efactors%RHS, & - efactors%K_control, SINFO_SILS ) - inform%sils_solve_status = SINFO_SILS%flag - IF ( inform%sils_solve_status < 0 ) THEN - IF ( control%out > 0 .AND. control%print_level > 0 ) & - WRITE( control%out, "( A, ' solve exit status = ', I3 )" ) & - prefix, inform%sils_solve_status - inform%status = GALAHAD_error_solve - RETURN - END IF - END IF - -! Update the estimate of the solution - - SOL( : npm ) = SOL( : npm ) + efactors%RHS( : npm ) - -! Form the residuals - - IF ( iter < control%itref_max .OR. control%get_norm_residual ) THEN - -! ... for the case where G is diagonal ... - - IF ( inform%factorization == 1 ) THEN - - efactors%RHS( : n ) = & - efactors%RHS_orig( : n ) - efactors%G_diag( : n ) * SOL( : n ) - - SELECT CASE ( SMT_get( C%type ) ) - CASE ( 'ZERO' ) - efactors%RHS( np1 : npm ) = efactors%RHS_orig( np1 : npm ) - CASE ( 'DIAGONAL' ) - efactors%RHS( np1 : npm ) = & - efactors%RHS_orig( np1 : npm ) + C%val( : m ) * SOL( np1 : npm ) - CASE ( 'DENSE' ) - efactors%RHS( np1 : npm ) = efactors%RHS_orig( np1 : npm ) - l = 0 - DO i = 1, m - DO j = 1, i - l = l + 1 - efactors%RHS( n + i ) = & - efactors%RHS( n + i ) + C%val( l ) * SOL( n + j ) - IF ( i /= j ) efactors%RHS( n + j ) = & - efactors%RHS( n + j ) + C%val( l ) * SOL( n + i ) - END DO - END DO - CASE ( 'SPARSE_BY_ROWS' ) - efactors%RHS( np1 : npm ) = efactors%RHS_orig( np1 : npm ) - DO i = 1, m - DO l = C%ptr( i ), C%ptr( i + 1 ) - 1 - j = C%col( l ) - efactors%RHS( n + i ) = & - efactors%RHS( n + i ) + C%val( l ) * SOL( n + j ) - IF ( i /= j ) efactors%RHS( n + j ) = & - efactors%RHS( n + j ) + C%val( l ) * SOL( n + i ) - END DO - END DO - CASE ( 'COORDINATE' ) - efactors%RHS( np1 : npm ) = efactors%RHS_orig( np1 : npm ) - DO l = 1, C%ne - i = C%row( l ) ; j = C%col( l ) - efactors%RHS( n + i ) = & - efactors%RHS( n + i ) + C%val( l ) * SOL( n + j ) - IF ( i /= j ) efactors%RHS( n + j ) = & - efactors%RHS( n + j ) + C%val( l ) * SOL( n + i ) - END DO - END SELECT - - SELECT CASE ( SMT_get( A%type ) ) - CASE ( 'DENSE' ) - l = 0 - DO i = 1, m - ii = n + i - DO j = 1, n - l = l + 1 - val = A%val( l ) - efactors%RHS( j ) = efactors%RHS( j ) - val * SOL( ii ) - efactors%RHS( ii ) = efactors%RHS( ii ) - val * SOL( j ) - END DO - END DO - CASE ( 'SPARSE_BY_ROWS' ) - DO i = 1, m - ii = n + i - DO l = A%ptr( i ), A%ptr( i + 1 ) - 1 - j = A%col( l ) ; val = A%val( l ) - efactors%RHS( j ) = efactors%RHS( j ) - val * SOL( ii ) - efactors%RHS( ii ) = efactors%RHS( ii ) - val * SOL( j ) - END DO - END DO - CASE ( 'COORDINATE' ) - DO l = 1, A%ne - ii = n + A%row( l ) ; j = A%col( l ) ; val = A%val( l ) - efactors%RHS( j ) = efactors%RHS( j ) - val * SOL( ii ) - efactors%RHS( ii ) = efactors%RHS( ii ) - val * SOL( j ) - END DO - END SELECT - - ELSE - -! WRITE( 25, "( ' kg, kpert, kne ', 3I10 )" ) & -! efactors%k_g, efactors%k_pert, efactors%K%ne -! WRITE( 25, "( ' K: row, col, val ', /, 3( 2I6, ES24.16 ) )" ) & -! ( efactors%K%row( i ), efactors%K%col( i ), efactors%K%val( i ), & -! i = 1, efactors%K%ne ) - -! ... or the case of general G - - efactors%RHS = efactors%RHS_orig - -! include terms from A and A^T - - DO l = 1, efactors%k_g - i = efactors%K%row( l ) ; j = efactors%K%col( l ) - val = efactors%K%val( l ) - efactors%RHS( i ) = efactors%RHS( i ) - val * SOL( j ) - efactors%RHS( j ) = efactors%RHS( j ) - val * SOL( i ) - END DO - -! include terms from G and C - - DO l = efactors%k_g + 1, efactors%k_pert - i = efactors%K%row( l ) ; j = efactors%K%col( l ) - val = efactors%K%val( l ) - efactors%RHS( i ) = efactors%RHS( i ) - val * SOL( j ) - IF ( i /= j ) & - efactors%RHS( j ) = efactors%RHS( j ) - val * SOL( i ) - END DO - -! include terms from any diagonal perturbation to G - - DO l = efactors%k_pert + 1, efactors%K%ne - i = efactors%K%row( l ) - efactors%RHS( i ) = & - efactors%RHS( i ) - efactors%K%val( l ) * SOL( i ) - END DO - END IF - - IF ( control%print_level > 1 .AND. control%out > 0 ) & - WRITE( control%out, "( A, ' maximum residual ', ES12.4 )" ) & - prefix, MAXVAL( ABS( efactors%RHS( : npm ) ) ) - END IF - END DO - - IF ( control%get_norm_residual ) & - inform%norm_residual = MAXVAL( ABS( efactors%RHS( : npm ) ) ) - - RETURN - -! End of subroutine SBLS_solve_explicit - - END SUBROUTINE SBLS_solve_explicit - -!-*-*-*- S B L S _ S O L V E _ I M P L I C I T S U B R O U T I N E -*-*-*- - - SUBROUTINE SBLS_solve_implicit( ifactors, control, inform, SOL ) - -! To solve - -! Kz = ( P A^T ) z = b -! ( A -C ) - -! (i) transform b to c = IP b -! (ii) solve perm(K) w = c -! (iii) recover z = IP^T w - -! where IP = (IC 0 ) -! ( 0 IR ) - -! and the permutations IR and IC are such that -! A = IR ( A1 A2 ) IC^T and the "basis" matrix A1 is nonsingular -! ( 0 0 ) -! This induces a re-ordering IC^T P IC of P - -! Iterative refinement may be used - -! Dummy arguments - - TYPE ( SBLS_implicit_factors_type ), INTENT( INOUT ) :: ifactors - TYPE ( SBLS_control_type ), INTENT( IN ) :: control - TYPE ( SBLS_inform_type ), INTENT( INOUT ) :: inform - REAL ( KIND = rp_ ), INTENT( INOUT ), & - DIMENSION( ifactors%n + ifactors%m ) :: SOL - -! Local variables - - INTEGER ( KIND = ip_ ) :: i, iter, j, l, rank_a, n, k_n, trans - INTEGER ( KIND = ip_ ) :: start_1, end_1, start_2, end_2, start_3, end_3 - REAL ( KIND = rp_ ) :: val - CHARACTER ( LEN = 80 ) :: array_name - TYPE ( SILS_SINFO ) :: SINFO_SILS - TYPE ( GLS_SINFO ) :: SINFO_GLS - -! prefix for all output - - CHARACTER ( LEN = LEN( TRIM( control%prefix ) ) - 2 ) :: prefix - prefix = control%prefix( 2 : LEN( TRIM( control%prefix ) ) - 1 ) - - k_n = ifactors%k_n - -! Allocate workspace arrays - - IF ( k_n /= ifactors%len_sol_workspace ) THEN - array_name = 'sbls: ifactors%SOL_current' - CALL SPACE_resize_array( k_n, ifactors%SOL_current, & - inform%status, inform%alloc_status, array_name = array_name, & - deallocate_error_fatal = control%deallocate_error_fatal, & - exact_size = .TRUE., & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( inform%status /= GALAHAD_ok ) RETURN - - array_name = 'sbls: ifactors%SOL_perm' - CALL SPACE_resize_array( k_n, ifactors%SOL_perm, & - inform%status, inform%alloc_status, array_name = array_name, & - deallocate_error_fatal = control%deallocate_error_fatal, & - exact_size = .TRUE., & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( inform%status /= GALAHAD_ok ) RETURN - - array_name = 'sbls: ifactors%RHS_orig' - CALL SPACE_resize_array( k_n, ifactors%RHS_orig, & - inform%status, inform%alloc_status, array_name = array_name, & - deallocate_error_fatal = control%deallocate_error_fatal, & - exact_size = .TRUE., & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( inform%status /= GALAHAD_ok ) RETURN - ifactors%len_sol_workspace = k_n - END IF - - n = ifactors%n ; rank_a = ifactors%rank_a - -! Partition the variables r and v - - start_1 = 1 ; end_1 = rank_a - start_2 = rank_a + 1 ; end_2 = n - start_3 = n + 1 ; end_3 = n + rank_a - -! Permute the variables - - DO i = 1, n - ifactors%RHS_orig( i ) = SOL( ifactors%A_COLS_basic( i ) ) - END DO - - DO i = 1, rank_a - ifactors%RHS_orig( n + i ) = SOL( n + ifactors%A_ROWS_basic( i ) ) - END DO - -! Solve the system with iterative refinement - - DO iter = 0, control%itref_max - -! ******************** -! * RESIDUAL STAGE * -! ******************** - -! Compute the current residual - - IF ( iter > 0 ) THEN - - SOL( : k_n ) = ifactors%RHS_orig - ifactors%SOL_perm = zero - -! 1. First, form -! =========== - -! ( r_1 ) ( P_11^T P_21^T P_31^T ) ( v_1 ), where P_31^T = B_31^-1 -! ( r_2 ) = ( 0 P_22^T 0 ) ( v_2 ) -! ( r_3 ) ( A_1 A_2 0 ) ( v_3 ) - -! with v in ifactors%SOL_current and r in SOL - -! r_1 = P_31^T v_3 - - IF ( ifactors%unitb31 ) THEN - SOL( start_1 : end_1 ) = ifactors%SOL_current( start_3 : end_3 ) - ELSE - SOL( start_1 : end_1 ) = zero - WRITE( 6, "( ' not unitb31 not written yet ' )" ) - END IF - -! r_1 <- r_1 + P_11^T v_1 - - IF ( .NOT. ifactors%zerop11 ) THEN - DO l = 1, ifactors%P11%ne - j = ifactors%P11%col( l ) - SOL( j ) = SOL( j ) + ifactors%P11%val( l ) & - * ifactors%SOL_perm( ifactors%P11%row( l ) ) - END DO - END IF - -! r_1 <- r_1 + P_21^T v_2 - - IF ( .NOT. ifactors%zerop21 ) THEN - DO l = 1, ifactors%P21%ne - j = ifactors%P21%col( l ) - SOL( j ) = SOL( j ) + ifactors%P21%val( l ) & - * ifactors%SOL_perm( ifactors%P21%row( l ) ) - END DO - END IF - -! r_2 = P_22^T v_2 - - IF ( ifactors%unitp22 ) THEN - SOL( start_2 : end_2 ) = ifactors%SOL_current( start_2 : end_2 ) - ELSE - SOL( start_2 : end_2 ) = zero - WRITE( 6, "( ' not unitp22 not written yet ' )" ) - END IF - -! r_3 = A_1 v_1 - - SOL( start_3 : end_3 ) = zero - DO l = 1, ifactors%A1%ne - i = n + ifactors%A1%row( l ) - SOL( i ) = SOL( i ) + ifactors%A1%val( l ) & - * ifactors%SOL_current( ifactors%A1%col( l ) ) - END DO - -! r_3 r3 + A_2 v_2 - - DO l = 1, ifactors%A2%ne - i = n + ifactors%A2%row( l ) - SOL( i ) = SOL( i ) + ifactors%A2%val( l ) & - * ifactors%SOL_current( ifactors%A2%col( l ) ) - END DO - -! 2. Next form -! ========= - -! ( v_1 ) ( 0 0 B_31^T ) ( r_1 ) -! ( v_2 ) = ( 0 B_22 B_32^T ) ( r_2 ) -! ( v_3 ) ( B_31 B_32 B_33 ) ( r_3 ) - -! with r in SOL and v in ifactors%SOL_perm - -! v_1 = B_31^T r_3 - - IF ( ifactors%unitb31 ) THEN - ifactors%SOL_perm( start_1 : end_1 ) = SOL( start_3 : end_3 ) - ELSE - WRITE( 6, "( ' not unitb31 not written yet ' )" ) - END IF - -! v_2 = B_22 r_2 - - IF ( ifactors%unitb22 ) THEN - ifactors%SOL_perm( start_2 : end_2 ) = SOL( start_2 : end_2 ) - ELSE - ifactors%SOL_perm( start_2 : end_2 ) = zero - DO l = 1, ifactors%B22%ne - i = ifactors%B22%row( l ) - j = ifactors%B22%col( l ) - val = ifactors%B22%val( l ) - ifactors%SOL_perm( j ) = ifactors%SOL_perm( j ) + val * SOL( i ) - IF ( i /= j ) & - ifactors%SOL_perm( i ) = ifactors%SOL_perm( i ) + val * SOL( j ) - END DO - IF ( ALLOCATED( ifactors%PERT ) ) & - ifactors%SOL_perm( start_2 : end_2 ) = & - ifactors%SOL_perm( start_2 : end_2 )+ & - ifactors%PERT * SOL( start_2 : end_2 ) - END IF - -! v_2 <- v_2 + B_32^T r_3 - - IF ( .NOT. ifactors%zerob32 ) THEN - DO l = 1, ifactors%B32%ne - j = ifactors%B32%col( l ) - ifactors%SOL_perm( j ) = ifactors%SOL_perm( j ) + & - ifactors%B32%val( l ) * SOL( ifactors%B32%row( l ) ) - END DO - END IF - -! v_3 = B_31 r_1 - - IF ( ifactors%unitb31 ) THEN - ifactors%SOL_perm( start_3 : end_3 ) = SOL( start_1 : end_1 ) - ELSE - WRITE( 6, "( ' not unitb31 not written yet ' )" ) - END IF - -! v_3 <- v_3 + B_32 r_2 - - IF ( .NOT. ifactors%zerob32 ) THEN - DO l = 1, ifactors%B32%ne - i = ifactors%B32%row( l ) - ifactors%SOL_perm( i ) = ifactors%SOL_perm( i ) + & - ifactors%B32%val( l ) * SOL( ifactors%B32%col( l ) ) - END DO - END IF - -! v_3 <- v_3 + B_33 r_3 - - IF ( .NOT. ifactors%zerob33 ) THEN - DO l = 1, ifactors%B33%ne - i = ifactors%B33%row( l ) - ifactors%SOL_perm( i ) = ifactors%SOL_perm( i ) + & - ifactors%B33%val( l ) * SOL( ifactors%B33%col( l ) ) - END DO - END IF - -! 3. Last, form -! ========== - -! ( r_1 ) ( b_1 ) ( P_11 0 A_1^T ) ( v_1 ), where P_31 = B_31^-T -! ( r_2 ) = ( b_2 ) - ( P_21 P_22 A_2^T ) ( v_2 ) -! ( r_3 ) ( b_3 ) ( P_31 0 0 ) ( v_3 ) - -! with v in ifactors%SOL_perm and r in SOL - - SOL( : k_n ) = ifactors%RHS_orig - -! r_1 <- r_1 - P_11 v_1 - - IF ( .NOT. ifactors%zerop11 ) THEN - DO l = 1, ifactors%P11%ne - i = ifactors%P11%row( l ) - SOL( i ) = SOL( i ) - ifactors%P11%val( l ) & - * ifactors%SOL_perm( ifactors%P11%col( l ) ) - END DO - END IF - -! r_1 <- r_1 - A_1^T v_3 - - DO l = 1, ifactors%A1%ne - j = ifactors%A1%col( l ) - SOL( j ) = SOL( j ) - ifactors%A1%val( l ) & - * ifactors%SOL_perm( n + ifactors%A1%row( l ) ) - END DO - -! r_2 <- r_2 - P_21 v_1 - - IF ( .NOT. ifactors%zerop21 ) THEN - DO l = 1, ifactors%P21%ne - i = ifactors%P21%row( l ) - SOL( i ) = SOL( i ) - ifactors%P21%val( l ) & - * ifactors%SOL_perm( ifactors%P21%col( l ) ) - END DO - END IF - -! r_2 <- r_2 - P_22 v_2 - - IF ( ifactors%unitp22 ) THEN - SOL( start_2 : end_2 ) = SOL( start_2 : end_2 ) - & - ifactors%SOL_perm( start_2 : end_2 ) - ELSE - WRITE( 6, "( ' not unitp22 not written yet ' )" ) - END IF - -! r_2 <- r_2 - A_2^T v_3 - - DO l = 1, ifactors%A2%ne - j = ifactors%A2%col( l ) - SOL( j ) = SOL( j ) - ifactors%A2%val( l ) & - * ifactors%SOL_perm( n + ifactors%A2%row( l ) ) - END DO - -! r_3 <- r_3 - P_31 v_1 - - IF ( ifactors%unitb31 ) THEN - SOL( start_3 : end_3 ) = SOL( start_3 : end_3 ) - & - ifactors%SOL_perm( start_1 : end_1 ) - ELSE - WRITE( 6, "( ' not unitb31 not written yet ' )" ) - END IF - - IF ( control%get_norm_residual ) & - inform%norm_residual = MAXVAL( ABS( SOL( : k_n ) ) ) - -! No residual required - - ELSE - SOL( : k_n ) = ifactors%RHS_orig - END IF - -! ***************** -! * SOLVE STAGE * -! ***************** - -! 1. First solve -! =========== - -! ( P_11 0 A_1^T ) ( v_1 ) ( r_1 ), where P_31 = B_31^-T -! ( P_21 P_22 A_2^T ) ( v_2 ) = ( r_2 ) -! ( P_31 0 0 ) ( v_3 ) ( r_3 ) - - IF ( control%affine ) THEN - ifactors%SOL_perm( start_1 : end_1 ) = zero - ELSE - -! 1a. Solve P_31 v_1 = r_3 - - IF ( ifactors%unitb31 ) THEN - ifactors%SOL_perm( start_1 : end_1 ) = SOL( start_3 : end_3 ) - ELSE - WRITE( 6, "( ' not unitb31 not written yet ' )" ) - END IF - -! 1b. Replace r_1 <- r_1 - P_11 v_1 ... - - IF ( .NOT. ifactors%zerop11 ) THEN - DO l = 1, ifactors%P11%ne - i = ifactors%P11%row( l ) - SOL( i ) = SOL( i ) - ifactors%P11%val( l ) & - * ifactors%SOL_perm( ifactors%P11%col( l ) ) - END DO - END IF - -! ... and r_2 <- r_2 - P_21 v_1 - - IF ( .NOT. ifactors%zerop21 ) THEN - DO l = 1, ifactors%P21%ne - i = ifactors%P21%row( l ) - SOL( i ) = SOL( i ) - ifactors%P21%val( l ) & - * ifactors%SOL_perm( ifactors%P21%col( l ) ) - END DO - END IF - END IF - -! 1c. Solve A^1^T v_3 = r_1 - - trans = 1 - CALL GLS_SOLVE( ifactors%A1, ifactors%A1_factors, & - SOL( start_1 : end_1 ), & - ifactors%SOL_perm( start_3 : end_3 ), & - ifactors%A1_control, SINFO_GLS, TRANS = trans ) - inform%gls_solve_status = SINFO_GLS%flag - IF ( inform%gls_solve_status < 0 ) THEN - inform%status = GALAHAD_error_gls_solve ; RETURN - END IF - -! 1d. Replace r_2 <- r_2 - A_2^T v_3 - - DO l = 1, ifactors%A2%ne - j = ifactors%A2%col( l ) - SOL( j ) = SOL( j ) - ifactors%A2%val( l ) & - * ifactors%SOL_perm( n + ifactors%A2%row( l ) ) - END DO - -! 1e. Solve P_22 v_2 = r_2 - - IF ( ifactors%unitp22 ) THEN - ifactors%SOL_perm( start_2 : end_2 ) = SOL( start_2 : end_2 ) - ELSE - WRITE( 6, "( ' not unitp22 not written yet ' )" ) - END IF - -! 2. Next solve -! ========== - -! ( 0 0 B_31^T ) ( r_1 ) ( v_1 ) -! ( 0 B_22 B_32^T ) ( r_2 ) = ( v_2 ) -! ( B_31 B_32 B_33 ) ( r_3 ) ( v_3 ) - -! 2a. Solve B_31^T v_3 = r_1 - - IF ( ifactors%unitb31 ) THEN - SOL( start_3 : end_3 ) = ifactors%SOL_perm( start_1 : end_1 ) - ELSE - WRITE( 6, "( ' not unitb31 not written yet ' )" ) - END IF - -! 2b. Replace r_2 <- r_2 - B_32^T v_3 and r_3 <- r_3 - B_33 v_3 - - IF ( .NOT. ifactors%zerob32 ) THEN - DO l = 1, ifactors%B32%ne - j = ifactors%B32%col( l ) - ifactors%SOL_perm( j ) = ifactors%SOL_perm( j ) - & - ifactors%B32%val( l ) * SOL( ifactors%B32%row( l ) ) - END DO - END IF - - IF ( .NOT. ifactors%zerob33 ) THEN - DO l = 1, ifactors%B33%ne - i = ifactors%B33%row( l ) - ifactors%SOL_perm( i ) = ifactors%SOL_perm( i ) - & - ifactors%B33%val( l ) * SOL( ifactors%B33%col( l ) ) - END DO - END IF - -! 2c. Solve B_22 v_2 = r_2 - - SOL( start_2 : end_2 ) = ifactors%SOL_perm( start_2 : end_2 ) - IF ( .NOT. ifactors%unitb22 ) THEN - CALL SILS_SOLVE( ifactors%B22, ifactors%B22_factors, & - SOL( start_2 : end_2 ), ifactors%B22_control, SINFO_SILS ) - inform%sils_solve_status = SINFO_SILS%flag - IF ( inform%sils_solve_status < 0 ) THEN - IF ( control%out > 0 .AND. control%print_level > 0 ) & - WRITE( control%out, "( A, ' solve exit status = ', I3 )" ) & - prefix, inform%sils_solve_status - inform%status = GALAHAD_error_solve - RETURN - END IF - END IF - -! 2d. Replace r_3 <- r_3 - B_32 v_2 - - IF ( .NOT. ifactors%zerob32 ) THEN - DO l = 1, ifactors%B32%ne - i = ifactors%B32%row( l ) - ifactors%SOL_perm( i ) = ifactors%SOL_perm( i ) - & - ifactors%B32%val( l ) * SOL( ifactors%B32%col( l ) ) - END DO - END IF - -! 2e. Solve B_31 v_1 = r3 - - IF ( ifactors%unitb31 ) THEN - SOL( start_1 : end_1 ) = ifactors%SOL_perm( start_3 : end_3 ) - ELSE - WRITE( 6, "( ' not unitpb31 not written yet ' )" ) - END IF - -! 3. Finally solve -! ============= - -! ( P_11^T P_21^T P_31^T ) ( v_1 ) ( r_1 ), where P_31^T = B_31^-1 -! ( 0 P_22^T 0 ) ( v_2 ) = ( r_2 ) -! ( A_1 A_2 0 ) ( v_3 ) ( r_3 ) - -! 3a. Solve P_22^T v_2 = r_2 - - IF ( ifactors%unitp22 ) THEN - ifactors%SOL_perm( start_2 : end_2 ) = SOL( start_2 : end_2 ) - ELSE - WRITE( 6, "( ' not unitp22 not written yet ' )" ) - END IF - -! 3b. Replace r_1 <- r_1 - P_21^T v_2 ... - - IF ( .NOT. ifactors%zerop21 ) THEN - DO l = 1, ifactors%P21%ne - j = ifactors%P21%col( l ) - SOL( j ) = SOL( j ) - ifactors%P21%val( l ) & - * ifactors%SOL_perm( ifactors%P21%row( l ) ) - END DO - END IF - -! ... and r_3 <- r_3 - A_2 v_2 - - DO l = 1, ifactors%A2%ne - i = n + ifactors%A2%row( l ) - SOL( i ) = SOL( i ) - ifactors%A2%val( l ) & - * ifactors%SOL_perm( ifactors%A2%col( l ) ) - END DO - -! 3c. Solve A_1 v_1 = r_3 - - CALL GLS_SOLVE( ifactors%A1, ifactors%A1_factors, & - SOL( start_3 : end_3 ), & - ifactors%SOL_perm( start_1 : end_1 ), & - ifactors%A1_control, SINFO_GLS ) - inform%gls_solve_status = SINFO_GLS%flag - IF ( inform%gls_solve_status < 0 ) THEN - inform%status = GALAHAD_error_gls_solve ; RETURN - END IF - -! 3d. Replace r_1 <- r_1 - P_11^T v_1 - - IF ( .NOT. ifactors%zerop11 ) THEN - DO l = 1, ifactors%P11%ne - j = ifactors%P11%col( l ) - SOL( j ) = SOL( j ) - ifactors%P11%val( l ) & - * ifactors%SOL_perm( ifactors%P11%row( l ) ) - END DO - END IF - -! 3e. Solve P_31^T v_3 = r_1 - - IF ( ifactors%unitb31 ) THEN - ifactors%SOL_perm( start_3 : end_3 ) = SOL( start_1 : end_1 ) - ELSE - WRITE( 6, "( ' not unitb31 not written yet ' )" ) - END IF - -! ****************** -! * UPDATE STAGE * -! ****************** - -! Update the solution - - IF ( iter > 0 ) ifactors%SOL_perm = & - ifactors%SOL_current + ifactors%SOL_perm - IF ( iter < control%itref_max ) & - ifactors%SOL_current = ifactors%SOL_perm - END DO - -! Unpermute the variables - - DO i = 1, n - SOL( ifactors%A_COLS_basic( i ) ) = ifactors%SOL_perm( i ) - END DO - - IF ( rank_a < ifactors%m ) SOL( n + 1 : n + ifactors%m ) = zero - DO i = 1, rank_a - SOL( n + ifactors%A_ROWS_basic( i ) ) = ifactors%SOL_perm( n + i ) - END DO - - RETURN - -! End of subroutine SBLS_solve_implicit - - END SUBROUTINE SBLS_solve_implicit - -!-*-*-*-*- S B L S _ B A S I S _ S O L V E S U B R O U T I N E -*-*-*-*- - - SUBROUTINE SBLS_basis_solve( ifactors, control, inform, SOL ) - -! To find a solution to A x = b - -! (i) transform b to c = IR b -! (ii) solve A1 w1 = c and set w = (w1 0) -! (iii) recover x = IC^T w - -! and the permutations IR and IC are such that -! A = IR ( A1 A2 ) IC^T and the "basis" matrix A1 is nonsingular -! ( 0 0 ) - -! Iterative refinement may be used - -! Dummy arguments - - TYPE ( SBLS_implicit_factors_type ), INTENT( INOUT ) :: ifactors - TYPE ( SBLS_control_type ), INTENT( IN ) :: control - TYPE ( SBLS_inform_type ), INTENT( INOUT ) :: inform - REAL ( KIND = rp_ ), INTENT( INOUT ), & - DIMENSION( ifactors%n + ifactors%m ) :: SOL - -! Local variables - - INTEGER ( KIND = ip_ ) :: i, iter, l, rank_a, n, k_n - INTEGER ( KIND = ip_ ) :: start_1, end_1, start_2, end_2, start_3, end_3 - CHARACTER ( LEN = 80 ) :: array_name - TYPE ( GLS_SINFO ) :: SINFO_GLS - - k_n = ifactors%k_n - -! Allocate workspace arrays - - IF ( k_n /= ifactors%len_sol_workspace ) THEN - array_name = 'sbls: ifactors%SOL_current' - CALL SPACE_resize_array( k_n, ifactors%SOL_current, & - inform%status, inform%alloc_status, array_name = array_name, & - deallocate_error_fatal = control%deallocate_error_fatal, & - exact_size = .TRUE., & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( inform%status /= GALAHAD_ok ) RETURN - - array_name = 'sbls: ifactors%SOL_perm' - CALL SPACE_resize_array( k_n, ifactors%SOL_perm, & - inform%status, inform%alloc_status, array_name = array_name, & - deallocate_error_fatal = control%deallocate_error_fatal, & - exact_size = .TRUE., & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( inform%status /= GALAHAD_ok ) RETURN - - array_name = 'sbls: ifactors%RHS_orig' - CALL SPACE_resize_array( k_n, ifactors%RHS_orig, & - inform%status, inform%alloc_status, array_name = array_name, & - deallocate_error_fatal = control%deallocate_error_fatal, & - exact_size = .TRUE., & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( inform%status /= GALAHAD_ok ) RETURN - ifactors%len_sol_workspace = k_n - END IF - - n = ifactors%n ; rank_a = ifactors%rank_a - -! Partition the variables x - - start_1 = 1 ; end_1 = rank_a - start_2 = rank_a + 1 ; end_2 = n - start_3 = n + 1 ; end_3 = n + rank_a - -! Permute the RHS - - DO i = 1, rank_a - ifactors%RHS_orig( n + i ) = SOL( n + ifactors%A_ROWS_basic( i ) ) - END DO - -! Solve the system with iterative refinement - - DO iter = 0, control%itref_max - -! Store c in SOL and w in SOL_perm - - SOL( start_3 : end_3 ) = ifactors%RHS_orig( start_3 : end_3 ) - -! Compute the current residual - - IF ( iter > 0 ) THEN - DO l = 1, ifactors%A1%ne - i = n + ifactors%A1%row( l ) - SOL( i ) = SOL( i ) - ifactors%A1%val( l ) & - * ifactors%SOL_current( ifactors%A1%col( l ) ) - END DO -! WRITE(6,*) ' residual = ', MAXVAL( ABS( SOL( start_3 : end_3 ) ) ), & -! ' x ', MAXVAL( ABS( ifactors%SOL_current( start_1 : end_1 ) ) ) - END IF - -! 1. Solve A_1 w_1 = c ... - - CALL GLS_SOLVE( ifactors%A1, ifactors%A1_factors, & - SOL( start_3 : end_3 ), & - ifactors%SOL_perm( start_1 : end_1 ), & - ifactors%A1_control, SINFO_GLS ) - inform%gls_solve_status = SINFO_GLS%flag - IF ( inform%gls_solve_status < 0 ) THEN - inform%status = GALAHAD_error_gls_solve ; RETURN - END IF - -! Update the solution - - IF ( iter > 0 ) ifactors%SOL_perm( start_1 : end_1 ) = & - ifactors%SOL_current( start_1 : end_1 ) + & - ifactors%SOL_perm( start_1 : end_1 ) - IF ( iter < control%itref_max ) & - ifactors%SOL_current( start_1 : end_1 ) = & - ifactors%SOL_perm( start_1 : end_1 ) - END DO - -! .. and set w_2 = 0 - - ifactors%SOL_perm( start_2 : end_2 ) = zero - -! Unpermute the variables - - DO i = 1, n - SOL( ifactors%A_COLS_basic( i ) ) = ifactors%SOL_perm( i ) - END DO - - RETURN - -! End of subroutine SBLS_basis_solve - - END SUBROUTINE SBLS_basis_solve - -!-*-*- S B L S _ FORM _ A _ FACTORIZE _ NULLSPACE S U B R O U T I N E -*-*- - - SUBROUTINE SBLS_form_n_factorize_nullspace( n, m, H, A, nfactors, & - last_factorization, & - control, inform ) - -! Form a null-space factorization of -! -! K = ( G A^T ) -! ( A -C ) -! -! for various approximations G of H - -! Dummy arguments - - INTEGER ( KIND = ip_ ), INTENT( IN ) :: n, m, last_factorization - TYPE ( SMT_type ), INTENT( IN ) :: H, A - TYPE ( SBLS_null_space_factors_type ), INTENT( INOUT ) :: nfactors - TYPE ( SBLS_control_type ), INTENT( IN ) :: control - TYPE ( SBLS_inform_type ), INTENT( INOUT ) :: inform - -! Local variables - - INTEGER ( KIND = ip_ ) :: i, ii, j, jj, k, l, out, a_ne, potrf_info - INTEGER ( KIND = ip_ ) :: liw, lptr, trans, new_h, new_a, error - LOGICAL :: printi, printe - CHARACTER ( LEN = 80 ) :: array_name -! TYPE ( SILS_AINFO ) :: AINFO_SILS -! TYPE ( SILS_FINFO ) :: FINFO_SILS - TYPE ( GLS_AINFO ) AINFO_GLS - TYPE ( GLS_FINFO ) FINFO_GLS - TYPE ( GLS_SINFO ) :: SINFO_GLS - - REAL ( KIND = rp_ ) :: val - REAL :: time_start, time_end -! REAL :: t1, t2, t3 - - LOGICAL :: dense = .TRUE. -! LOGICAL :: printd = .TRUE. - LOGICAL :: printd = .FALSE. - -! prefix for all output - - CHARACTER ( LEN = LEN( TRIM( control%prefix ) ) - 2 ) :: prefix - prefix = control%prefix( 2 : LEN( TRIM( control%prefix ) ) - 1 ) - - CALL CPU_TIME( time_start ) - - out = control%out - printi = out >= 0 .AND. control%print_level >= 1 - error = control%error - printe = error >= 0 .AND. control%print_level >= 0 - - IF ( SMT_get( A%type ) == 'DENSE' ) THEN - a_ne = m * n - ELSE IF ( SMT_get( A%type ) == 'SPARSE_BY_ROWS' ) THEN - a_ne = A%ptr( m + 1 ) - 1 - ELSE - a_ne = A%ne - END IF - -! IF ( inform%preconditioner >= 0 ) THEN -! IF ( printi ) WRITE( out, & -! "( A, ' Use SBLS_form_n_factorize_explicit subroutine instead' )" )& -! prefix -! inform%status = - 31 ; RETURN -! END IF - inform%status = GALAHAD_ok - - IF ( last_factorization /= inform%factorization ) THEN - new_h = 2 - new_a = 2 - ELSE - new_h = control%new_h - new_a = control%new_a - END IF - -! Find a permutation of A = IR ( A1 A2 ) IC^T for which the "basis" -! ( 0 0 ) -! matrix A1 is nonsingular - -! This induces a re-ordering IC^T P IC of P - -! ---------- -! Find basis -! ---------- - -! CALL CPU_TIME( t1 ) - - IF ( new_a > 0 ) THEN - -! Find a "basic" set of rows and colums, that is a non-singular submatrix A1 of -! maximal rank. Also set up the complement matrix A2 of columns of A not in A1 - - nfactors%m = m ; nfactors%n = n - CALL SBLS_find_A1_and_A2( m, n, a_ne, A, nfactors%A1, & - nfactors%A1_factors, & - nfactors%A1_control, nfactors%A2, & - nfactors%A_ROWS_basic, & - nfactors%A_COLS_basic, & - nfactors%A_ROWS_order, nfactors%A_COLS_order,& - nfactors%rank_a, nfactors%k_n, nfactors%n_r, & - prefix, 'sbls: nfactors%', out, printi, & - control, inform, AINFO_GLS, FINFO_GLS, & - nfactors%RHS_orig, nfactors%SOL_current ) - -! Reorder A2 so that the matrix is stored by columns (its transpose by rows) - - IF ( nfactors%A2%ne > 0 ) THEN - lptr = nfactors%n_r + 1 - array_name = 'sbls: nfactors%A2%ptr' - CALL SPACE_resize_array( lptr, nfactors%A2%ptr, & - inform%status, inform%alloc_status, array_name = array_name, & - deallocate_error_fatal = control%deallocate_error_fatal, & - exact_size = control%space_critical, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( inform%status /= GALAHAD_ok ) RETURN - - liw = MAX( nfactors%n_r, nfactors%rank_a ) + 1 - array_name = 'sbls: nfactors%IW' - CALL SPACE_resize_array( liw, nfactors%IW, & - inform%status, inform%alloc_status, array_name = array_name, & - deallocate_error_fatal = control%deallocate_error_fatal, & - exact_size = control%space_critical, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( inform%status /= GALAHAD_ok ) RETURN - - nfactors%A2%col( : nfactors%A2%ne ) = & - nfactors%A2%col( : nfactors%A2%ne ) - nfactors%rank_a - - CALL SORT_reorder_by_rows( & - nfactors%n_r, nfactors%rank_a, nfactors%A2%ne, nfactors%A2%col, & - nfactors%A2%row, nfactors%A2%ne, nfactors%A2%val, nfactors%A2%ptr, & - lptr, nfactors%IW, liw, control%error, control%out, & - inform%sort_status ) - IF ( inform%sort_status /= GALAHAD_ok ) THEN - IF ( printe ) WRITE( error, & - "( A, ' GLS: sort of A2, info = ', I0 )" ) prefix, inform%sort_status - IF ( inform%sort_status > 0 ) THEN - inform%status = GALAHAD_error_sort ; RETURN - END IF - END IF - - nfactors%A2%ne = nfactors%A2%ptr( nfactors%n_r + 1 ) - 1 - nfactors%A2%col( : nfactors%A2%ne ) = & - nfactors%A2%col( : nfactors%A2%ne ) + nfactors%rank_a - END IF - END IF - -! Reorder H according to the partitions induced by A_1 - - IF ( new_a > 0 .OR. new_h > 0 ) THEN - -! Calculate the space needed for H_11, H_21 and H_22 - note that both -! triangles of H22 will be stored so that it may be accessed by columns - - nfactors%H11%ne = 0 - nfactors%H21%ne = 0 - nfactors%H22%ne = 0 - SELECT CASE ( SMT_get( H%type ) ) - CASE ( 'DIAGONAL' ) - DO l = 1, n - i = nfactors%A_COLS_order( l ) - j = nfactors%A_COLS_order( l ) - IF ( i > nfactors%rank_a ) THEN - nfactors%H22%ne = nfactors%H22%ne + 1 - ELSE - nfactors%H11%ne = nfactors%H11%ne + 1 - END IF - END DO - CASE ( 'DENSE' ) - l = 0 - DO ii = 1, n - i = nfactors%A_COLS_order( ii ) - DO jj = 1, ii - j = nfactors%A_COLS_order( jj ) - IF ( i > nfactors%rank_a .AND. j > nfactors%rank_a ) THEN - IF ( i == j ) THEN - nfactors%H22%ne = nfactors%H22%ne + 1 - ELSE - nfactors%H22%ne = nfactors%H22%ne + 2 - END IF - ELSE IF ( i <= nfactors%rank_a .AND. j <= nfactors%rank_a ) THEN - nfactors%H11%ne = nfactors%H11%ne + 1 - ELSE - nfactors%H21%ne = nfactors%H21%ne + 1 - END IF - END DO - END DO - CASE ( 'SPARSE_BY_ROWS' ) - DO ii = 1, n - i = nfactors%A_COLS_order( ii ) - DO l = H%ptr( ii ), H%ptr( ii + 1 ) - 1 - j = nfactors%A_COLS_order( H%col( l ) ) - IF ( i > nfactors%rank_a .AND. j > nfactors%rank_a ) THEN - IF ( i == j ) THEN - nfactors%H22%ne = nfactors%H22%ne + 1 - ELSE - nfactors%H22%ne = nfactors%H22%ne + 2 - END IF - ELSE IF ( i <= nfactors%rank_a .AND. j <= nfactors%rank_a ) THEN - nfactors%H11%ne = nfactors%H11%ne + 1 - ELSE - nfactors%H21%ne = nfactors%H21%ne + 1 - END IF - END DO - END DO - CASE ( 'COORDINATE' ) - DO l = 1, H%ne - i = nfactors%A_COLS_order( H%row( l ) ) - j = nfactors%A_COLS_order( H%col( l ) ) - IF ( i > nfactors%rank_a .AND. j > nfactors%rank_a ) THEN - IF ( i == j ) THEN - nfactors%H22%ne = nfactors%H22%ne + 1 - ELSE - nfactors%H22%ne = nfactors%H22%ne + 2 - END IF - ELSE IF ( i <= nfactors%rank_a .AND. j <= nfactors%rank_a ) THEN - nfactors%H11%ne = nfactors%H11%ne + 1 - ELSE - nfactors%H21%ne = nfactors%H21%ne + 1 - END IF - END DO - END SELECT - -! Allocate the space to store the reordered partitions H_11, H_21 and H_22 - - array_name = 'sbls: nfactors%H11%row' - CALL SPACE_resize_array( nfactors%H11%ne, nfactors%H11%row, & - inform%status, inform%alloc_status, array_name = array_name, & - deallocate_error_fatal = control%deallocate_error_fatal, & - exact_size = control%space_critical, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( inform%status /= GALAHAD_ok ) RETURN - - array_name = 'sbls: nfactors%H11%col' - CALL SPACE_resize_array( nfactors%H11%ne, nfactors%H11%col, & - inform%status, inform%alloc_status, array_name = array_name, & - deallocate_error_fatal = control%deallocate_error_fatal, & - exact_size = control%space_critical, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( inform%status /= GALAHAD_ok ) RETURN - - array_name = 'sbls: nfactors%H11%val' - CALL SPACE_resize_array( nfactors%H11%ne, nfactors%H11%val, & - inform%status, inform%alloc_status, array_name = array_name, & - deallocate_error_fatal = control%deallocate_error_fatal, & - exact_size = control%space_critical, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( inform%status /= GALAHAD_ok ) RETURN - - array_name = 'sbls: nfactors%H21%row' - CALL SPACE_resize_array( nfactors%H21%ne, nfactors%H21%row, & - inform%status, inform%alloc_status, array_name = array_name, & - deallocate_error_fatal = control%deallocate_error_fatal, & - exact_size = control%space_critical, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( inform%status /= GALAHAD_ok ) RETURN - - array_name = 'sbls: nfactors%H21%col' - CALL SPACE_resize_array( nfactors%H21%ne, nfactors%H21%col, & - inform%status, inform%alloc_status, array_name = array_name, & - deallocate_error_fatal = control%deallocate_error_fatal, & - exact_size = control%space_critical, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( inform%status /= GALAHAD_ok ) RETURN - - array_name = 'sbls: nfactors%H21%val' - CALL SPACE_resize_array( nfactors%H21%ne, nfactors%H21%val, & - inform%status, inform%alloc_status, array_name = array_name, & - deallocate_error_fatal = control%deallocate_error_fatal, & - exact_size = control%space_critical, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( inform%status /= GALAHAD_ok ) RETURN - - lptr = nfactors%n_r + 1 - array_name = 'sbls: nfactors%H21%ptr' - CALL SPACE_resize_array( lptr, nfactors%H21%ptr, & - inform%status, inform%alloc_status, array_name = array_name, & - deallocate_error_fatal = control%deallocate_error_fatal, & - exact_size = control%space_critical, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( inform%status /= GALAHAD_ok ) RETURN - - array_name = 'sbls: nfactors%H22%row' - CALL SPACE_resize_array( nfactors%H22%ne, nfactors%H22%row, & - inform%status, inform%alloc_status, array_name = array_name, & - deallocate_error_fatal = control%deallocate_error_fatal, & - exact_size = control%space_critical, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( inform%status /= GALAHAD_ok ) RETURN - - array_name = 'sbls: nfactors%H22%col' - CALL SPACE_resize_array( nfactors%H22%ne, nfactors%H22%col, & - inform%status, inform%alloc_status, array_name = array_name, & - deallocate_error_fatal = control%deallocate_error_fatal, & - exact_size = control%space_critical, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( inform%status /= GALAHAD_ok ) RETURN - - array_name = 'sbls: nfactors%H22%val' - CALL SPACE_resize_array( nfactors%H22%ne, nfactors%H22%val, & - inform%status, inform%alloc_status, array_name = array_name, & - deallocate_error_fatal = control%deallocate_error_fatal, & - exact_size = control%space_critical, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( inform%status /= GALAHAD_ok ) RETURN - - lptr = nfactors%n_r + 1 - array_name = 'sbls: nfactors%H22%ptr' - CALL SPACE_resize_array( lptr, nfactors%H22%ptr, & - inform%status, inform%alloc_status, array_name = array_name, & - deallocate_error_fatal = control%deallocate_error_fatal, & - exact_size = control%space_critical, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( inform%status /= GALAHAD_ok ) RETURN - -! Now fill H_11, H_21 and H_22 - - nfactors%H11%ne = 0 - nfactors%H21%ne = 0 - nfactors%H22%ne = 0 - SELECT CASE ( SMT_get( H%type ) ) - CASE ( 'DIAGONAL' ) - DO l = 1, n - i = nfactors%A_COLS_order( l ) - j = nfactors%A_COLS_order( l ) - IF ( i > nfactors%rank_a ) THEN - nfactors%H22%ne = nfactors%H22%ne + 1 - nfactors%H22%row( nfactors%H22%ne ) = i - nfactors%rank_a - nfactors%H22%col( nfactors%H22%ne ) = j - nfactors%rank_a - nfactors%H22%val( nfactors%H22%ne ) = H%val( l ) - ELSE - nfactors%H11%ne = nfactors%H11%ne + 1 - nfactors%H21%row( nfactors%H21%ne ) = i - nfactors%H21%col( nfactors%H21%ne ) = j - nfactors%H21%val( nfactors%H21%ne ) = H%val( l ) - END IF - END DO - CASE ( 'DENSE' ) - l = 0 - DO ii = 1, n - i = nfactors%A_COLS_order( ii ) - DO jj = 1, ii - j = nfactors%A_COLS_order( jj ) - l = l + 1 - END DO - END DO - CASE ( 'SPARSE_BY_ROWS' ) - DO ii = 1, n - i = nfactors%A_COLS_order( ii ) - DO l = H%ptr( ii ), H%ptr( ii + 1 ) - 1 - j = nfactors%A_COLS_order( H%col( l ) ) - END DO - END DO - CASE ( 'COORDINATE' ) - DO l = 1, H%ne - i = nfactors%A_COLS_order( H%row( l ) ) - j = nfactors%A_COLS_order( H%col( l ) ) - IF ( i > nfactors%rank_a .AND. j > nfactors%rank_a ) THEN - nfactors%H22%ne = nfactors%H22%ne + 1 - nfactors%H22%row( nfactors%H22%ne ) = i - nfactors%rank_a - nfactors%H22%col( nfactors%H22%ne ) = j - nfactors%rank_a - nfactors%H22%val( nfactors%H22%ne ) = H%val( l ) - IF ( i /= j ) THEN - nfactors%H22%ne = nfactors%H22%ne + 1 - nfactors%H22%row( nfactors%H22%ne ) = j - nfactors%rank_a - nfactors%H22%col( nfactors%H22%ne ) = i - nfactors%rank_a - nfactors%H22%val( nfactors%H22%ne ) = H%val( l ) - END IF - ELSE IF ( i <= nfactors%rank_a .AND. j <= nfactors%rank_a ) THEN - nfactors%H11%ne = nfactors%H11%ne + 1 - nfactors%H11%row( nfactors%H11%ne ) = i - nfactors%H11%col( nfactors%H11%ne ) = j - nfactors%H11%val( nfactors%H11%ne ) = H%val( l ) - ELSE - nfactors%H21%ne = nfactors%H21%ne + 1 - IF ( i > nfactors%rank_a ) THEN - nfactors%H21%row( nfactors%H21%ne ) = i - nfactors%rank_a - nfactors%H21%col( nfactors%H21%ne ) = j - ELSE - nfactors%H21%row( nfactors%H21%ne ) = j - nfactors%rank_a - nfactors%H21%col( nfactors%H21%ne ) = i - END IF - nfactors%H21%val( nfactors%H21%ne ) = H%val( l ) - END IF - END DO - END SELECT - - IF ( printd ) THEN - WRITE( 6, "( ' H11: m, n, nnz ', 3I4 )" ) & - nfactors%rank_a, nfactors%rank_a, nfactors%H11%ne - WRITE( 6, "( 3 ( 2I7, ES12.4 ) )" ) & - ( nfactors%H11%row( i ), nfactors%H11%col( i ), & - nfactors%H11%val( i ), i = 1, nfactors%H11%ne ) - END IF - -! Finally. reorder H21 and H22 so that they are stored by rows - - IF ( nfactors%H21%ne > 0 ) THEN - CALL SORT_reorder_by_rows( & - nfactors%n_r, nfactors%rank_a, nfactors%H21%ne, nfactors%H21%row, & - nfactors%H21%col, nfactors%H21%ne, nfactors%H21%val, & - nfactors%H21%ptr, lptr, nfactors%IW, liw, control%error, & - control%out, inform%sort_status ) - IF ( inform%sort_status /= 0 ) THEN - IF ( printe ) WRITE( error, & - "( A, ' GLS: sort of H21, info = ', I0 )" ) prefix, inform%sort_status - IF ( inform%sort_status > 0 ) THEN - inform%status = GALAHAD_error_sort ; RETURN - END IF - END IF - - nfactors%H21%ne = nfactors%H21%ptr( nfactors%n_r + 1 ) - 1 - nfactors%H21%row( : nfactors%H21%ne ) = & - nfactors%H21%row( : nfactors%H21%ne ) + nfactors%rank_a - - IF ( printd ) THEN - WRITE( 6, "( ' H21: m, n, nnz ', 3I4 )" ) & - nfactors%n_r, nfactors%rank_a, nfactors%H21%ne - WRITE( 6, "( 3 ( 2I7, ES12.4 ) )" ) & - ( nfactors%H21%row( i ), nfactors%H21%col( i ), & - nfactors%H21%val( i ), i = 1, nfactors%H21%ne ) - END IF - - END IF - - IF ( nfactors%H22%ne > 0 ) THEN - CALL SORT_reorder_by_rows( & - nfactors%n_r, nfactors%n_r, nfactors%H22%ne, nfactors%H22%row, & - nfactors%H22%col, nfactors%H22%ne, nfactors%H22%val, & - nfactors%H22%ptr, lptr, nfactors%IW, liw, control%error, & - control%out, inform%sort_status ) - IF ( inform%sort_status /= 0 ) THEN - IF ( printe ) WRITE( error, & - "( A, ' GLS: sort of H22, info = ', I0 )" ) prefix, inform%sort_status - IF ( inform%sort_status > 0 ) THEN - inform%status = GALAHAD_error_sort ; RETURN - END IF - END IF - - nfactors%H22%ne = nfactors%H22%ptr( nfactors%n_r + 1 ) - 1 - nfactors%H22%row( : nfactors%H22%ne ) = & - nfactors%H22%row( : nfactors%H22%ne ) + nfactors%rank_a - nfactors%H22%col( : nfactors%H22%ne ) = & - nfactors%H22%col( : nfactors%H22%ne ) + nfactors%rank_a - - IF ( printd ) THEN - WRITE( 6, "( ' H22: m, n, nnz ', 3I4 )" ) & - nfactors%n_r, nfactors%n_r, nfactors%H22%ne - WRITE( 6, "( 3 ( 2I7, ES12.4 ) )" ) & - ( nfactors%H22%row( i ), nfactors%H22%col( i ), & - nfactors%H22%val( i ), i = 1, nfactors%H22%ne ) - END IF - END IF - END IF - -! Factorize the preconditioner - - SELECT CASE( inform%preconditioner ) - - CASE( 2 ) - -! Form the reduced Hessian -! R = ( - A_2^T A_1^-T I ) ( H_11 H_21^T ) ( - A_1^-1 A_2 ) -! ( H_21 H_22 ) ( I ) -! column by column - -! Allocate the space to store workspace arrays v and w - - array_name = 'sbls: nfactors%V' - CALL SPACE_resize_array( nfactors%rank_a, nfactors%V, & - inform%status, inform%alloc_status, array_name = array_name, & - deallocate_error_fatal = control%deallocate_error_fatal, & - exact_size = control%space_critical, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( inform%status /= GALAHAD_ok ) RETURN - - array_name = 'sbls: nfactors%W' - CALL SPACE_resize_array( nfactors%rank_a, nfactors%W, & - inform%status, inform%alloc_status, array_name = array_name, & - deallocate_error_fatal = control%deallocate_error_fatal, & - exact_size = control%space_critical, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( inform%status /= GALAHAD_ok ) RETURN - - array_name = 'sbls: nfactors%R' - CALL SPACE_resize_array( nfactors%n_r, nfactors%n_r, nfactors%R, & - inform%status, inform%alloc_status, array_name = array_name, & - deallocate_error_fatal = control%deallocate_error_fatal, & - exact_size = control%space_critical, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( inform%status /= GALAHAD_ok ) RETURN - - array_name = 'sbls: nfactors%R_factors' - CALL SPACE_resize_array( nfactors%n_r, nfactors%n_r, & - nfactors%R_factors, & - inform%status, inform%alloc_status, array_name = array_name, & - deallocate_error_fatal = control%deallocate_error_fatal, & - exact_size = control%space_critical, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( inform%status /= GALAHAD_ok ) RETURN - -! Loop over the columns - - DO k = 1, nfactors%n_r - IF ( printd ) WRITE( 6, "( /, ' column ', I0 )" ) k - -! 1. First form - A_2 e_k - > v - - nfactors%V = zero - DO l = nfactors%A2%ptr( k ), nfactors%A2%ptr( k + 1 ) - 1 - i = nfactors%A2%row( l ) - nfactors%V( i ) = nfactors%V( i ) - nfactors%A2%val( l ) - END DO - IF ( printd ) WRITE( 6, "( ' v ', ( 4ES12.4 ) )" ) nfactors%V - -! 2. Now form A_1^-1 v -> w - - CALL GLS_SOLVE( nfactors%A1, nfactors%A1_factors, & - nfactors%V( : nfactors%rank_a ), & - nfactors%W( : nfactors%rank_a ), & - nfactors%A1_control, SINFO_GLS ) - inform%gls_solve_status = SINFO_GLS%flag - IF ( inform%gls_solve_status < 0 ) THEN - IF ( printi ) WRITE( out, "( A, ' column ', I0, ' phase 2 ' )" ) & - prefix, k - inform%status = GALAHAD_error_gls_solve ; RETURN - END IF - IF ( printd ) WRITE( 6, "( ' w ', ( 4ES12.4 ) )" ) nfactors%W - -! 3. Next form H_21 w + H_22 e_k -> r - - nfactors%R( : , k ) = zero - - DO l = nfactors%H22%ptr( k ), nfactors%H22%ptr( k + 1 ) - 1 - i = nfactors%H22%col( l ) - nfactors%rank_a - nfactors%R( i, k ) = nfactors%R( i, k ) + nfactors%H22%val( l ) - END DO - IF ( printd ) WRITE( 6, "( ' r ', ( 4ES12.4 ) )" ) nfactors%R( : , k ) - - DO l = 1, nfactors%H21%ne - i = nfactors%H21%row( l ) - nfactors%rank_a - nfactors%R( i, k ) = nfactors%R( i, k ) + & - nfactors%H21%val( l ) * nfactors%W( nfactors%H21%col( l ) ) - END DO - IF ( printd ) WRITE( 6, "( ' r ', ( 4ES12.4 ) )" ) nfactors%R( : , k ) - -! 4. Now form the product H_11 w + H_21^T e_k -> v - - DO l = nfactors%A2%ptr( k ), nfactors%A2%ptr( k + 1 ) - 1 - nfactors%V( nfactors%A2%row( l ) ) = zero - END DO - IF ( printd ) WRITE( 6, "( ' v ', ( 4ES12.4 ) )" ) nfactors%V - - DO l = nfactors%H21%ptr( k ), nfactors%H21%ptr( k + 1 ) - 1 - i = nfactors%H21%col( l ) - nfactors%V( i ) = nfactors%V( i ) + nfactors%H21%val( l ) - END DO - IF ( printd ) WRITE( 6, "( ' v ', ( 4ES12.4 ) )" ) nfactors%V - - DO l = 1, nfactors%H11%ne - i = nfactors%H11%row( l ) - j = nfactors%H11%col( l ) - nfactors%V( i ) = & - nfactors%V( i ) + nfactors%H11%val( l ) * nfactors%W( j ) - IF ( i /= j ) nfactors%V( j ) = & - nfactors%V( j ) + nfactors%H11%val( l ) * nfactors%W( i ) - END DO - IF ( printd ) WRITE( 6, "( ' v ', ( 4ES12.4 ) )" ) nfactors%V - -! 5. Next form w = A_1^-T v - - trans = 1 - CALL GLS_SOLVE( nfactors%A1, nfactors%A1_factors, & - nfactors%V( : nfactors%rank_a ), & - nfactors%W( : nfactors%rank_a ), & - nfactors%A1_control, SINFO_GLS, TRANS = trans ) - inform%gls_solve_status = SINFO_GLS%flag - IF ( inform%gls_solve_status < 0 ) THEN - IF ( printi ) WRITE( out, "( A, ' column ', I0, ' phase 5 ' )" ) & - prefix, k - inform%status = GALAHAD_error_gls_solve ; RETURN - END IF - IF ( printd ) WRITE( 6, "( ' w ', ( 4ES12.4 ) )" ) nfactors%W - -! 6. Finally form r - A_2^T w -> r - - DO l = 1, nfactors%A2%ne - i = nfactors%A2%col( l ) - nfactors%rank_a - nfactors%R( i, k ) = nfactors%R( i, k ) - & - nfactors%A2%val( l ) * nfactors%W( nfactors%A2%row( l ) ) - END DO - IF ( printd ) WRITE( 6, "( ' r ', ( 4ES12.4 ) )" ) nfactors%R( : , k ) - - END DO - - IF ( printd ) THEN - WRITE( 6, "( ' R: ' )" ) - DO k = 1, nfactors%n_r - WRITE( 6, "( I6, 6X, 5ES12.4, /, ( 6ES12.4 ) )" ) & - k, nfactors%R( : , k ) - END DO - END IF - - val = zero - DO i = 1, nfactors%n_r - DO j = i, nfactors%n_r - val = MAX( val, ABS( nfactors%R( i, j ) - nfactors%R( j, i ) ) ) - END DO - END DO - IF ( printi ) WRITE(6,"(A,' max asymmetry of R ', ES12.4)" ) prefix, val - - CASE DEFAULT - -! Anything else - - IF ( printi ) WRITE( out, & - "( A, ' No option control%preconditioner = ', I8, ' at present' )" ) & - prefix, inform%preconditioner - inform%status = - 32 ; RETURN - - END SELECT - -! Now factorize R - - IF ( dense ) THEN -! write(6,*) maxval( nfactors%R( : nfactors%n_r, : nfactors%n_r ) ) - nfactors%R_factors = nfactors%R - CALL POTRF( 'L', nfactors%n_r, nfactors%R_factors, nfactors%n_r, & - potrf_info ) - ELSE - IF ( printi ) WRITE( out, & - "( A, ' Sparse reduced Hessian option not implemented at present' )")& - prefix - inform%status = - 32 ; RETURN - END IF - - CALL CPU_TIME( time_end ) - IF ( printi ) WRITE( out, & - "( A, ' time to form and factorize null-space preconditioner ', F6.2)")& - prefix, time_end - time_start - - RETURN - -! End of subroutine SBLS_form_n_factorize_nullspace - - END SUBROUTINE SBLS_form_n_factorize_nullspace - -!-*-*- S B L S _ S O L V E _ N U L L _ S P A C E S U B R O U T I N E -*-*- - - SUBROUTINE SBLS_solve_null_space( nfactors, control, inform, SOL ) - -! To solve - -! Kz = ( P A^T ) z = b -! ( A 0 ) - -! (i) transform b to c = IP b -! (ii) solve perm(K) w = c -! (iii) recover z = IP^T w - -! where IP = (IC 0 ) -! ( 0 IR ) - -! and the permutations IR and IC are such that -! A = IR ( A1 A2 ) IC^T and the "basis" matrix A1 is nonsingular -! ( 0 0 ) -! This induces a re-ordering IC^T P IC of P - -! Iterative refinement may be used - -! Dummy arguments - - TYPE ( SBLS_null_space_factors_type ), INTENT( INOUT ) :: nfactors - TYPE ( SBLS_control_type ), INTENT( IN ) :: control - TYPE ( SBLS_inform_type ), INTENT( INOUT ) :: inform - REAL ( KIND = rp_ ), INTENT( INOUT ), & - DIMENSION( nfactors%n + nfactors%m ) :: SOL - -! Local variables - - INTEGER ( KIND = ip_ ) :: i, iter, j, l, rank_a, k_n, n, out, trans, potrs_info - INTEGER ( KIND = ip_ ) :: start_1, end_1, start_2, end_2, start_3, end_3 - LOGICAL :: printi - CHARACTER ( LEN = 80 ) :: array_name -! TYPE ( SILS_SINFO ) :: SINFO_SILS - TYPE ( GLS_SINFO ) :: SINFO_GLS - -! prefix for all output - - CHARACTER ( LEN = LEN( TRIM( control%prefix ) ) - 2 ) :: prefix - prefix = control%prefix( 2 : LEN( TRIM( control%prefix ) ) - 1 ) - - out = control%out - printi = control%print_level >= 1 - - n = nfactors%n - k_n = nfactors%k_n - -! Allocate workspace arrays - - IF ( k_n /= nfactors%len_sol_workspace ) THEN - array_name = 'sbls: nfactors%RHS' - CALL SPACE_resize_array( k_n, nfactors%RHS, & - inform%status, inform%alloc_status, array_name = array_name, & - deallocate_error_fatal = control%deallocate_error_fatal, & - exact_size = .TRUE., & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( inform%status /= GALAHAD_ok ) RETURN - - array_name = 'sbls: nfactors%SOL_current' - CALL SPACE_resize_array( k_n, nfactors%SOL_current, & - inform%status, inform%alloc_status, array_name = array_name, & - deallocate_error_fatal = control%deallocate_error_fatal, & - exact_size = .TRUE., & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( inform%status /= GALAHAD_ok ) RETURN - - array_name = 'sbls: nfactors%SOL_perm' - CALL SPACE_resize_array( k_n, 1, nfactors%SOL_perm, & - inform%status, inform%alloc_status, array_name = array_name, & - deallocate_error_fatal = control%deallocate_error_fatal, & - exact_size = .TRUE., & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( inform%status /= GALAHAD_ok ) RETURN - - array_name = 'sbls: nfactors%RHS_orig' - CALL SPACE_resize_array( k_n, nfactors%RHS_orig, & - inform%status, inform%alloc_status, array_name = array_name, & - deallocate_error_fatal = control%deallocate_error_fatal, & - exact_size = .TRUE., & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( inform%status /= GALAHAD_ok ) RETURN - nfactors%len_sol_workspace = k_n - END IF - - rank_a = nfactors%rank_a - -! Partition the variables r and v - - start_1 = 1 ; end_1 = rank_a - start_2 = rank_a + 1 ; end_2 = n - start_3 = n + 1 ; end_3 = n + rank_a - -! Permute the variables - - DO i = 1, n - nfactors%RHS_orig( i ) = SOL( nfactors%A_COLS_basic( i ) ) - END DO - - DO i = 1, rank_a - nfactors%RHS_orig( n + i ) = SOL( n + nfactors%A_ROWS_basic( i ) ) - END DO - - - - -! ***** testing remove **** - -!write(6,*) ' ***** testing remove **** ' - - - - - -! nfactors%RHS( : k_n ) = zero -! nfactors%SOL_current( : rank_a ) = one -! nfactors%SOL_current( rank_a + 1 : n ) = one -! nfactors%SOL_current( n + 1: k_n ) = one - -! DO l = 1, nfactors%A1%ne -! i = nfactors%A1%row( l ) -! j = nfactors%A1%col( l ) -! nfactors%RHS( n + i ) = nfactors%RHS( n + i ) + & -! nfactors%A1%val( l ) * nfactors%SOL_current( j ) -! nfactors%RHS( j ) = nfactors%RHS( j ) + & -! nfactors%A1%val( l ) * nfactors%SOL_current( n + i ) -! END DO - -! DO l = 1, nfactors%A2%ne -! i = nfactors%A2%row( l ) -! j = nfactors%A2%col( l ) -! nfactors%RHS( n + i ) = nfactors%RHS( n + i ) + & -! nfactors%A2%val( l ) * nfactors%SOL_current( j ) -! nfactors%RHS( j ) = nfactors%RHS( j ) + & -! nfactors%A2%val( l ) * nfactors%SOL_current( n + i ) -! END DO - -! DO l = 1, nfactors%H11%ne -! i = nfactors%H11%row( l ) -! j = nfactors%H11%col( l ) -! nfactors%RHS( i ) = nfactors%RHS( i ) + & -! nfactors%H11%val( l ) * nfactors%SOL_current( j ) -! IF ( i /= j ) nfactors%RHS( j ) = nfactors%RHS( j ) + & -! nfactors%H11%val( l ) * nfactors%SOL_current( i ) -! END DO -! DO l = 1, nfactors%H21%ne -! i = nfactors%H21%row( l ) -! j = nfactors%H21%col( l ) -! nfactors%RHS( i ) = nfactors%RHS( i ) + & -! nfactors%H21%val( l ) * nfactors%SOL_current( j ) -! nfactors%RHS( j ) = nfactors%RHS( j ) + & -! nfactors%H21%val( l ) * nfactors%SOL_current( i ) -! END DO -! DO l = 1, nfactors%H22%ne -! i = nfactors%H22%row( l ) -! j = nfactors%H22%col( l ) -! nfactors%RHS( i ) = nfactors%RHS( i ) + & -! nfactors%H22%val( l ) * nfactors%SOL_current( j ) -! END DO - -! nfactors%RHS_orig = nfactors%RHS( : k_n ) - -! ***** end of testing **** - - -! ------------------------------------------ -! Solve the system with iterative refinement -! ------------------------------------------ - - DO iter = 0, control%itref_max - -! ******************** -! * RESIDUAL STAGE * -! ******************** - -! Compute the current residual - - IF ( iter > 0 ) THEN - - nfactors%RHS( : k_n ) = nfactors%RHS_orig - nfactors%SOL_perm = zero - -! Residuals are - -! ( r_1 ) - ( H_11 H_21^T A_1^T ) ( s_1 ) -! ( r_2 ) ( H_21 W A_2^T ) ( s_2 ) -! ( r_3 ) ( A_1 A_2 0 ) ( s_3 ) -! -! for given W - -! Terms involving A_1 and A_1^T - - DO l = 1, nfactors%A1%ne - i = nfactors%A1%row( l ) - j = nfactors%A1%col( l ) - nfactors%RHS( n + i ) = nfactors%RHS( n + i ) - & - nfactors%A1%val( l ) * nfactors%SOL_current( j ) - nfactors%RHS( j ) = nfactors%RHS( j ) - & - nfactors%A1%val( l ) * nfactors%SOL_current( n + i ) - END DO - -! Terms involving A_2 and A_2^T - - DO l = 1, nfactors%A2%ne - i = nfactors%A2%row( l ) - j = nfactors%A2%col( l ) - nfactors%RHS( n + i ) = nfactors%RHS( n + i ) - & - nfactors%A2%val( l ) * nfactors%SOL_current( j ) - nfactors%RHS( j ) = nfactors%RHS( j ) - & - nfactors%A2%val( l ) * nfactors%SOL_current( n + i ) - END DO - -! Case: W = H_22 - - IF ( inform%preconditioner == 2 ) THEN - - DO l = 1, nfactors%H11%ne - i = nfactors%H11%row( l ) - j = nfactors%H11%col( l ) - nfactors%RHS( i ) = nfactors%RHS( i ) - & - nfactors%H11%val( l ) * nfactors%SOL_current( j ) - IF ( i /= j ) nfactors%RHS( j ) = nfactors%RHS( j ) - & - nfactors%H11%val( l ) * nfactors%SOL_current( i ) - END DO - DO l = 1, nfactors%H21%ne - i = nfactors%H21%row( l ) - j = nfactors%H21%col( l ) - nfactors%RHS( i ) = nfactors%RHS( i ) - & - nfactors%H21%val( l ) * nfactors%SOL_current( j ) - nfactors%RHS( j ) = nfactors%RHS( j ) - & - nfactors%H21%val( l ) * nfactors%SOL_current( i ) - END DO - DO l = 1, nfactors%H22%ne - i = nfactors%H22%row( l ) - j = nfactors%H22%col( l ) - nfactors%RHS( i ) = nfactors%RHS( i ) - & - nfactors%H22%val( l ) * nfactors%SOL_current( j ) - END DO - -! Terms involving H - - ELSE - -! Case: W = R + ( - A_2^T A_1^-T I ) ( H_11 H_21^T ) ( - A_1^-1 A_2 ) -! ( H_21 H_22 ) ( I ) - -! Terms involving H_11 and H_12 - - DO l = 1, nfactors%H11%ne - i = nfactors%H11%row( l ) - j = nfactors%H11%col( l ) - nfactors%RHS( i ) = nfactors%RHS( i ) - & - nfactors%H11%val( l ) * nfactors%SOL_current( j ) - IF ( i /= j ) nfactors%RHS( j ) = nfactors%RHS( j ) - & - nfactors%H11%val( l ) * nfactors%SOL_current( i ) - END DO - DO l = 1, nfactors%H21%ne - i = nfactors%H21%row( l ) - j = nfactors%H21%col( l ) - nfactors%RHS( i ) = nfactors%RHS( i ) - & - nfactors%H21%val( l ) * nfactors%SOL_current( j ) - nfactors%RHS( j ) = nfactors%RHS( j ) - & - nfactors%H21%val( l ) * nfactors%SOL_current( i ) - END DO - -! Terms involving W = R + ( H_21 A_2^T ) ( H_11 A_1 )^-1 ( H_21^T ) -! ( A_1 0 ) ( A_2 ) - - IF ( printi ) WRITE( out, & - "( A, ' general residuals not implemented at present' )") & - prefix - inform%status = - 33 ; RETURN - END IF - -! No residual required - -! WRITE( 6, "( A, /, ( 5ES12.4 ) )" ) ' solution ', & -! nfactors%SOL_current( : k_n ) - ELSE - nfactors%RHS( : k_n ) = nfactors%RHS_orig - END IF -! WRITE( 6, "( A, /, ( 5ES12.4 ) )" ) ' residuals ', nfactors%RHS( : k_n ) - IF ( printi ) WRITE( out, "( A, ' maximum residual = ', ES12.4 )" ) & - prefix, MAXVAL( ABS( nfactors%RHS( : k_n ) ) ) - -! ***************** -! * SOLVE STAGE * -! ***************** - -! write(6,*) nfactors%RHS( start_1 : end_1 ) -! write(6,*) nfactors%RHS( start_2 : end_2 ) -! write(6,*) nfactors%RHS( start_3 : end_3 ) - -! 1. Solve A_1 y_1 = r_3 (store y_1 in v) - - IF ( .NOT. control%affine ) THEN - CALL GLS_SOLVE( nfactors%A1, nfactors%A1_factors, & - nfactors%RHS( start_3 : end_3 ), & - nfactors%V, & - nfactors%A1_control, SINFO_GLS ) - inform%gls_solve_status = SINFO_GLS%flag - IF ( inform%gls_solve_status < 0 ) THEN - inform%status = GALAHAD_error_gls_solve ; RETURN - END IF - END IF - -! 2. Solve A_1^T y_3 = r_1 - H_11 y_1 -! and -! 3. form r_2 - H_21 y_1 - A_2^T y_3 - -! 2a. Form r_1 - H_11 y_1 -> w - - nfactors%W( start_1 : end_1 ) = nfactors%RHS( start_1 : end_1 ) - IF ( .NOT. control%affine ) THEN - DO l = 1, nfactors%H11%ne - i = nfactors%H11%row( l ) - j = nfactors%H11%col( l ) - nfactors%W( i ) = nfactors%W( i ) - & - nfactors%H11%val( l ) * nfactors%V( j ) - IF ( i /= j ) nfactors%W( j ) = nfactors%W( j ) - & - nfactors%H11%val( l ) * nfactors%V( i ) - END DO - -! 3a. Form r_2 - H_21 y_1 -> r_2 - - DO l = 1, nfactors%H21%ne - i = nfactors%H21%row( l ) - j = nfactors%H21%col( l ) - nfactors%RHS( i ) = nfactors%RHS( i ) - & - nfactors%H21%val( l ) * nfactors%V( j ) - END DO - END IF - -! 2b. Solve A_1^T y_3 = w (store y_3 in v) - - trans = 1 - CALL GLS_SOLVE( nfactors%A1, nfactors%A1_factors, & - nfactors%W, & - nfactors%V, & - nfactors%A1_control, SINFO_GLS, TRANS = trans ) - inform%gls_solve_status = SINFO_GLS%flag - IF ( inform%gls_solve_status < 0 ) THEN - inform%status = GALAHAD_error_gls_solve ; RETURN - END IF - -! 3b. Form r_2 - A_2^T y_3 -> r_2 - - DO l = 1, nfactors%A2%ne - j = nfactors%A2%col( l ) - nfactors%RHS( j ) = nfactors%RHS( j ) - & - nfactors%A2%val( l ) * nfactors%V( nfactors%A2%row( l ) ) -! write(6,*) ' 2 ', j, nfactors%RHS( j ), nfactors%A2%row( l ) - END DO - -! 4. Find S^-1 r_2 -> x_2 - - nfactors%SOL_perm( start_2 : end_2, 1 ) = & - nfactors%RHS( start_2 : end_2 ) -! write(6,*) maxval( nfactors%R_factors( : nfactors%n_r, : nfactors%n_r ) ) - CALL POTRS( 'L', nfactors%n_r, 1, nfactors%R_factors, nfactors%n_r, & - nfactors%SOL_perm( start_2 : end_2, : ), nfactors%n_r, & - potrs_info ) - -! 5. Solve A_1 x_1 = r_3 - A^2 x_2 - -! 5a. Form r_3 - A^2 x_2 -> r_3 - - DO l = 1, nfactors%A2%ne - i = n + nfactors%A2%row( l ) - nfactors%RHS( i ) = nfactors%RHS( i ) - & - nfactors%A2%val( l ) * nfactors%SOL_perm( nfactors%A2%col( l ), 1 ) - END DO - -! 5b. Solve A_1 x_1 = r_3 - - CALL GLS_SOLVE( nfactors%A1, nfactors%A1_factors, & - nfactors%RHS( start_3 : end_3 ), & - nfactors%SOL_perm( start_1 : end_1, 1 ), & - nfactors%A1_control, SINFO_GLS ) - inform%gls_solve_status = SINFO_GLS%flag - IF ( inform%gls_solve_status < 0 ) THEN - inform%status = GALAHAD_error_gls_solve ; RETURN - END IF - -! 6. Solve A_1^T x_3 = r_1 - H_11 x_1 - H_21^T x_2 - -! 6a. Form r_1 - H_11 x_1 - H_21^T x_2 -> r_1 - - DO l = 1, nfactors%H11%ne - i = nfactors%H11%row( l ) - j = nfactors%H11%col( l ) - nfactors%RHS( i ) = nfactors%RHS( i ) - & - nfactors%H11%val( l ) * nfactors%SOL_perm( j, 1 ) - IF ( i /= j ) nfactors%RHS( j ) = nfactors%RHS( j ) - & - nfactors%H11%val( l ) * nfactors%SOL_perm( i, 1 ) - END DO - DO l = 1, nfactors%H21%ne - i = nfactors%H21%row( l ) - j = nfactors%H21%col( l ) - nfactors%RHS( j ) = nfactors%RHS( j ) - & - nfactors%H21%val( l ) * nfactors%SOL_perm( i, 1 ) - END DO - -! 6b. Solve A_1^T x_3 = r_1 - - trans = 1 - CALL GLS_SOLVE( nfactors%A1, nfactors%A1_factors, & - nfactors%RHS( start_1 : end_1 ), & - nfactors%SOL_perm( start_3 : end_3, 1 ), & - nfactors%A1_control, SINFO_GLS, TRANS = trans ) - inform%gls_solve_status = SINFO_GLS%flag - IF ( inform%gls_solve_status < 0 ) THEN - inform%status = GALAHAD_error_gls_solve ; RETURN - END IF - -! ****************** -! * UPDATE STAGE * -! ****************** - -! Update the solution - - IF ( iter > 0 ) nfactors%SOL_perm( : , 1 ) = & - nfactors%SOL_current + nfactors%SOL_perm( : , 1 ) - IF ( iter < control%itref_max ) & - nfactors%SOL_current = nfactors%SOL_perm( : , 1 ) -! WRITE( 6, "( A, ( 5ES12.4 ) )" ) ' solution ', nfactors%SOL_current - -! --------------------------- -! End of iterative refinement -! --------------------------- - - END DO - -! Unpermute the variables - - DO i = 1, n - SOL( nfactors%A_COLS_basic( i ) ) = nfactors%SOL_perm( i, 1 ) - END DO - - IF ( rank_a < nfactors%m ) SOL( n + 1 : n + nfactors%m ) = zero - DO i = 1, rank_a - SOL( n + nfactors%A_ROWS_basic( i ) ) = nfactors%SOL_perm( n + i, 1 ) - END DO - - RETURN - -! End of subroutine SBLS_solve_null_space - - END SUBROUTINE SBLS_solve_null_space - -!-*-*-*- S B L S _ F I N D _ A 1 _ A N D _ A 2 S U B R O U T I N E -*-*-*- - - SUBROUTINE SBLS_find_A1_and_A2( m, n, a_ne, A, A1, A1_factors, & - A1_control, A2, A_ROWS_basic, & - A_COLS_basic, A_ROWS_order, A_COLS_order, & - rank_a, k_n, n_r, prefix, resize_prefix, & - out, printi, control, inform, & - AINFO_GLS, FINFO_GLS, RHS, SOL ) - -! Given a rectangular matrix A, find a "basic" set of rows and colums, that is -! a non-singular submatrix A1 of maximal rank. Also set up the complement -! matrix A2 of columns of A not in A1 - -! Dummy arguments - - INTEGER ( KIND = ip_ ), INTENT( IN ) :: m, n, a_ne, out - INTEGER ( KIND = ip_ ), INTENT( OUT ) :: rank_a, n_r, k_n - LOGICAL, INTENT( IN ) :: printi - TYPE ( SMT_type ), INTENT( IN ) :: A - TYPE ( GLS_type ), INTENT( inout ) :: A1 - TYPE ( SMT_type ), INTENT( INOUT ) :: A2 - TYPE ( GLS_factors ), INTENT( INOUT ) :: A1_factors - TYPE ( GLS_control ), INTENT( INOUT ) :: A1_control - INTEGER ( KIND = ip_ ), ALLOCATABLE, DIMENSION( : ) :: A_ROWS_basic, A_COLS_basic - INTEGER ( KIND = ip_ ), ALLOCATABLE, DIMENSION( : ) :: A_ROWS_order, A_COLS_order - REAL ( KIND = rp_ ), ALLOCATABLE, DIMENSION( : ) :: RHS, SOL - CHARACTER ( LEN = * ), INTENT( IN ) :: prefix - CHARACTER ( LEN = * ), INTENT( IN ) :: resize_prefix - TYPE ( SBLS_control_type ), INTENT( IN ) :: control - TYPE ( SBLS_inform_type ), INTENT( INOUT ) :: inform - TYPE ( GLS_AINFO ), INTENT( INOUT ) :: AINFO_GLS - TYPE ( GLS_FINFO ), INTENT( INOUT ) :: FINFO_GLS - -! Local variables - - INTEGER ( KIND = ip_ ) :: i, ii, j, jj, l, info, dependent, nb - LOGICAL :: find_basis_by_transpose - CHARACTER ( LEN = 80 ) :: array_name - TYPE ( GLS_SINFO ) :: SINFO_GLS - -! LOGICAL :: printd = .TRUE. - LOGICAL :: printd = .FALSE. - - find_basis_by_transpose = control%find_basis_by_transpose - - 100 CONTINUE - -! Find sets of basic rows and columns - - CALL SBLS_find_basis( m, n, a_ne, A, A1, A1_factors, A1_control, & - A_ROWS_basic, A_COLS_basic, rank_a, & - find_basis_by_transpose, & - prefix, resize_prefix, out, printi, control, & - inform, AINFO_GLS, FINFO_GLS ) - -! CALL CPU_TIME( t2 ) -! WRITE(6,"(' time to find basis ',F6.2)") t2 - t1 - IF ( inform%status /= GALAHAD_ok ) RETURN - - k_n = n + rank_a ; n_r = n - rank_a - -! Print out rank and identifying vectors - - IF ( out > 0 .AND. control%print_level >= 2 ) THEN - WRITE( out, "( /, A, ' First-pass factorization ' )" ) prefix - WRITE( out, "( A, A, 3I0 )" ) prefix, ' m, rank, n = ', & - m, rank_a, n - WRITE( out, "( A, A, 2I0 )" ) prefix, ' A_ne, factors_ne = ', & - a_ne, FINFO_GLS%SIZE_FACTOR -! WRITE( out, "( A, A, /, ( 10I7 ) )" ) prefix, & -! ' rows =', ( A_ROWS_basic( : rank_a ) ) -! WRITE( out, "( A, A, /, ( 10I7) )" ) prefix, & -! ' cols =', ( A_COLS_basic( : rank_a ) ) - END IF - -! --------------- -! factorize basis -! --------------- - -! Make a copy of the "basis" matrix - - array_name = resize_prefix // 'A_ROWS_order' - CALL SPACE_resize_array( m, A_ROWS_order, & - inform%status, inform%alloc_status, array_name = array_name, & - deallocate_error_fatal = control%deallocate_error_fatal, & - exact_size = control%space_critical, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( inform%status /= GALAHAD_ok ) RETURN - - array_name = resize_prefix // 'A_COLS_order' - CALL SPACE_resize_array( n, A_COLS_order, & - inform%status, inform%alloc_status, array_name = array_name, & - deallocate_error_fatal = control%deallocate_error_fatal, & - exact_size = control%space_critical, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( inform%status /= GALAHAD_ok ) RETURN - - A_COLS_order = 0 - DO i = 1, rank_a - A_COLS_order( A_COLS_basic( i ) ) = i - END DO - - A_ROWS_order = 0 - DO i = 1, rank_a - A_ROWS_order( A_ROWS_basic( i ) ) = i - END DO - -! Ensure that the full-rank rows appear before the dependent ones - - rank_a = 0 - dependent = m + 1 - DO i = 1, m - IF ( A_ROWS_order( i ) > 0 ) THEN - rank_a = rank_a + 1 - A_ROWS_order( i ) = rank_a - A_ROWS_basic( rank_a ) = i - ELSE - dependent = dependent - 1 - A_ROWS_order( i ) = dependent - A_ROWS_basic( dependent ) = i - END IF - END DO - -! Mark the non-basic columns - - nb = 0 - DO i = 1, n - IF ( A_COLS_order( i ) <= 0 ) THEN - nb = nb + 1 - A_COLS_order( i ) = rank_a + nb - A_COLS_basic( rank_a + nb ) = i - END IF - END DO - -! WRITE( 6, "( A, /, (10I7) )" ) ' rbasics =', A_ROWS_basic( : m ) -! WRITE( 6, "( A, /, (10I7) )" ) ' cbasics =', A_COLS_basic( : n ) -! WRITE( 6, "( A, /, (10I7) )" ) ' order =', A_COLS_order( : n ) - -! Determine the space required for A1 and A2 - - A1%ne = 0 - A2%ne = 0 - - SELECT CASE ( SMT_get( A%type ) ) - CASE ( 'DENSE' ) - DO i = 1, m - IF ( A_ROWS_order( i ) > rank_a ) CYCLE - DO j = 1, n - IF ( A_COLS_order( j ) <= rank_a ) THEN - A1%ne = A1%ne + 1 - ELSE - A2%ne = A2%ne + 1 - END IF - END DO - END DO - CASE ( 'SPARSE_BY_ROWS' ) - DO i = 1, m - IF ( A_ROWS_order( i ) > rank_a ) CYCLE - DO l = A%ptr( i ), A%ptr( i + 1 ) - 1 - IF ( A_COLS_order( A%col( l ) ) <= rank_a ) THEN - A1%ne = A1%ne + 1 - ELSE - A2%ne = A2%ne + 1 - END IF - END DO - END DO - CASE ( 'COORDINATE' ) - DO l = 1, A%ne - IF ( A_ROWS_order( A%row( l ) ) > rank_a ) CYCLE - IF ( A_COLS_order( A%col( l ) ) <= rank_a ) THEN - A1%ne = A1%ne + 1 - ELSE - A2%ne = A2%ne + 1 - END IF - END DO - END SELECT - -! Reallocate the space to store the basis matrix, A1, if necessary - - array_name = resize_prefix // 'A1%row' - CALL SPACE_resize_array( A1%ne, A1%row, & - inform%status, inform%alloc_status, array_name = array_name, & - deallocate_error_fatal = control%deallocate_error_fatal, & - exact_size = control%space_critical, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( inform%status /= GALAHAD_ok ) RETURN - - array_name = resize_prefix // 'A1%col' - CALL SPACE_resize_array( A1%ne, A1%col, & - inform%status, inform%alloc_status, array_name = array_name, & - deallocate_error_fatal = control%deallocate_error_fatal, & - exact_size = control%space_critical, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( inform%status /= GALAHAD_ok ) RETURN - - array_name = resize_prefix // 'A1%val' - CALL SPACE_resize_array( A1%ne, A1%val, & - inform%status, inform%alloc_status, array_name = array_name, & - deallocate_error_fatal = control%deallocate_error_fatal, & - exact_size = control%space_critical, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( inform%status /= GALAHAD_ok ) RETURN - -! Assemble A1 - - A1%m = rank_a ; A1%n = rank_a ; A1%ne = 0 - - SELECT CASE ( SMT_get( A%type ) ) - CASE ( 'DENSE' ) - l = 0 - DO i = 1, m - ii = A_ROWS_order( i ) - IF ( ii > rank_a ) THEN - l = l + n - CYCLE - END IF - DO j = 1, n - l = l + 1 - jj = A_COLS_order( j ) - IF ( jj > rank_a ) CYCLE - A1%ne = A1%ne + 1 - A1%row( A1%ne ) = ii - A1%col( A1%ne ) = jj - A1%val( A1%ne ) = A%val( l ) - END DO - END DO - CASE ( 'SPARSE_BY_ROWS' ) - DO i = 1, m - ii = A_ROWS_order( i ) - IF ( ii > rank_a ) CYCLE - DO l = A%ptr( i ), A%ptr( i + 1 ) - 1 - jj = A_COLS_order( A%col( l ) ) - IF ( jj > rank_a ) CYCLE - A1%ne = A1%ne + 1 - A1%row( A1%ne ) = ii - A1%col( A1%ne ) = jj - A1%val( A1%ne ) = A%val( l ) - END DO - END DO - CASE ( 'COORDINATE' ) - DO l = 1, A%ne - ii = A_ROWS_order( A%row( l ) ) - IF ( ii > rank_a ) CYCLE - jj = A_COLS_order( A%col( l ) ) - IF ( jj > rank_a ) CYCLE - A1%ne = A1%ne + 1 - A1%row( A1%ne ) = ii - A1%col( A1%ne ) = jj - A1%val( A1%ne ) = A%val( l ) - END DO - END SELECT - - IF ( printd ) THEN - WRITE( 6, "( ' A1: m, n, nnz ', 3I4 )" ) A1%m, A1%n, A1%ne - WRITE( 6, "( 3 ( 2I7, ES12.4 ) )" ) & - ( A1%row( i ), A1%col( i ), A1%val( i ), i = 1, A1%ne ) - END IF - -! WRITE( 29, "( 3( 2I4, ES12.4 ) ) " ) ( A1%row( i ), & -! A1%col( i ), A1%val( i ), i = 1, A1%ne ) - -! Factorize A1 - - CALL GLS_finalize( A1_factors, A1_control, info ) - IF ( control%deallocate_error_fatal .AND. & - inform%status /= GALAHAD_ok ) RETURN - CALL GLS_INITIALIZE( A1_factors, A1_control ) - IF ( control%print_level <= 0 ) THEN - A1_control%ldiag = 0 - A1_control%lp = - 1 ; A1_control%mp = - 1 ; A1_control%wp = - 1 - ELSE - A1_control%ldiag = control%print_level - 1 - A1_control%lp = control%error - A1_control%mp = control%out ; A1_control%wp = control%out - END IF - A1_control%la = control%len_glsmin - A1_control%fill_in = 3 - - CALL GLS_ANALYSE( A1, A1_factors, A1_control, AINFO_GLS, FINFO_GLS ) - inform%gls_analyse_status = AINFO_GLS%flag - IF ( printi ) WRITE( out, & - "( A, ' GLS: analysis of A1 complete: status = ', I0 )" ) & - prefix, inform%gls_analyse_status - IF ( inform%gls_analyse_status < 0 ) THEN - inform%status = GALAHAD_error_gls_analysis ; RETURN - END IF - IF ( inform%gls_analyse_status == 4 ) THEN - inform%rank_def = .TRUE. - inform%rank = AINFO_GLS%rank - END IF - - IF ( printi ) WRITE( out, "( A, ' A1 nnz(prec,factors)', 2( 1X, I0 ))") & - prefix, A1%ne, FINFO_GLS%size_factor - -! If required, check to see if the basis found is reasobale. Do this -! by solving the equations A_1 x = A_1 e to check that x is a reasoble -! approximation to e - - IF ( control%check_basis ) THEN - array_name = resize_prefix // 'RHS' - CALL SPACE_resize_array( k_n, RHS, & - inform%status, inform%alloc_status, array_name = array_name, & - deallocate_error_fatal = control%deallocate_error_fatal, & - exact_size = control%space_critical, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( inform%status /= GALAHAD_ok ) RETURN - - array_name = resize_prefix // 'SOL' - CALL SPACE_resize_array( k_n, SOL, & - inform%status, inform%alloc_status, array_name = array_name, & - deallocate_error_fatal = control%deallocate_error_fatal, & - exact_size = control%space_critical, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( inform%status /= GALAHAD_ok ) RETURN - - RHS( : rank_a ) = zero - DO l = 1, A1%ne - RHS( A1%row( l ) ) = RHS( A1%row( l ) ) + A1%val( l ) - END DO - - CALL GLS_SOLVE( A1, A1_factors, RHS( : rank_a ), SOL( : rank_a ), & - A1_control, SINFO_GLS ) - inform%gls_solve_status = SINFO_GLS%flag -! write(6,*) ' gls solve ', inform%gls_solve_status -! write(6,"( A, /, ( 5ES12.4 ) )" ) ' gls solve - solution ', SOL( : 5 ) - IF ( inform%gls_solve_status < 0 ) THEN - IF ( find_basis_by_transpose .EQV. & - control%find_basis_by_transpose ) THEN - find_basis_by_transpose = .NOT. control%find_basis_by_transpose - IF ( printi ) & - WRITE( out, "( A, ' basis unstable - recomputing ' )" ) prefix - GO TO 100 - ELSE - IF ( printi ) & - WRITE( out, "( A, ' error return - basis unstable ' )" ) prefix - inform%status = GALAHAD_error_gls_solve ; RETURN - END IF - END IF - END IF - -! Allocate the space to store the non-basic matrix, A2 - - array_name = resize_prefix // 'A2%row' - CALL SPACE_resize_array( A2%ne, A2%row, & - inform%status, inform%alloc_status, array_name = array_name, & - deallocate_error_fatal = control%deallocate_error_fatal, & - exact_size = control%space_critical, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( inform%status /= GALAHAD_ok ) RETURN - - array_name = resize_prefix // 'A2%col' - CALL SPACE_resize_array( A2%ne, A2%col, & - inform%status, inform%alloc_status, array_name = array_name, & - deallocate_error_fatal = control%deallocate_error_fatal, & - exact_size = control%space_critical, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( inform%status /= GALAHAD_ok ) RETURN - - array_name = resize_prefix // 'A2%val' - CALL SPACE_resize_array( A2%ne, A2%val, & - inform%status, inform%alloc_status, array_name = array_name, & - deallocate_error_fatal = control%deallocate_error_fatal, & - exact_size = control%space_critical, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( inform%status /= GALAHAD_ok ) RETURN - -! Assemble A2 - - A2%m = rank_a ; A2%n = rank_a ; A2%ne = 0 - - SELECT CASE ( SMT_get( A%type ) ) - CASE ( 'DENSE' ) - l = 0 - DO i = 1, m - ii = A_ROWS_order( i ) - IF ( ii > rank_a ) THEN - l = l + n - CYCLE - END IF - DO j = 1, n - l = l + 1 - jj = A_COLS_order( j ) - IF ( jj <= rank_a ) CYCLE - A2%ne = A2%ne + 1 - A2%row( A2%ne ) = ii - A2%col( A2%ne ) = jj - A2%val( A2%ne ) = A%val( l ) - END DO - END DO - CASE ( 'SPARSE_BY_ROWS' ) - DO i = 1, m - ii = A_ROWS_order( i ) - IF ( ii > rank_a ) CYCLE - DO l = A%ptr( i ), A%ptr( i + 1 ) - 1 - jj = A_COLS_order( A%col( l ) ) - IF ( jj <= rank_a ) CYCLE - A2%ne = A2%ne + 1 - A2%row( A2%ne ) = ii - A2%col( A2%ne ) = jj - A2%val( A2%ne ) = A%val( l ) - END DO - END DO - CASE ( 'COORDINATE' ) - DO l = 1, A%ne - ii = A_ROWS_order( A%row( l ) ) - IF ( ii > rank_a ) CYCLE - jj = A_COLS_order( A%col( l ) ) - IF ( jj <= rank_a ) CYCLE - A2%ne = A2%ne + 1 - A2%row( A2%ne ) = ii - A2%col( A2%ne ) = jj - A2%val( A2%ne ) = A%val( l ) - END DO - END SELECT - - IF ( printd ) THEN - WRITE( 6, "( ' A2: m, n, nnz ', 3I4 )" ) A2%m, A2%n, A2%ne - WRITE( 6, "( 3 ( 2I7, ES12.4 ) )" ) & - ( A2%row( i ), A2%col( i ), A2%val( i ), i = 1, A2%ne ) - END IF - - RETURN - -! End of subroutine SBLS_find_A1_and_A2 - - END SUBROUTINE SBLS_find_A1_and_A2 - -!-*-*-*-*-*- S B L S _ F I N D _ B A S I S S U B R O U T I N E -*-*-*-*-*- - - SUBROUTINE SBLS_find_basis( m, n, a_ne, A, A1, A1_factors, A1_control, & - A_ROWS_basic, A_COLS_basic, rank_a, & - find_basis_by_transpose, & - prefix, resize_prefix, out, printi, control, & - inform, AINFO_GLS, FINFO_GLS ) - -! Given a rectangular matrix A, find a "basic" set of rows and colums, that is -! those that give a non-singular submatrix A1 of maximal rank - -! Dummy arguments - - INTEGER ( KIND = ip_ ), INTENT( IN ) :: m, n, a_ne, out - INTEGER ( KIND = ip_ ), INTENT( OUT ) :: rank_a - LOGICAL, INTENT( IN ) :: printi, find_basis_by_transpose - TYPE ( SMT_type ), INTENT( IN ) :: A - TYPE ( GLS_type ), INTENT( inout ) :: A1 - TYPE ( GLS_factors ), INTENT( INOUT ) :: A1_factors - TYPE ( GLS_control ), INTENT( INOUT ) :: A1_control - INTEGER ( KIND = ip_ ), ALLOCATABLE, DIMENSION( : ) :: A_ROWS_basic, A_COLS_basic - CHARACTER ( LEN = * ), INTENT( IN ) :: prefix - CHARACTER ( LEN = * ), INTENT( IN ) :: resize_prefix - TYPE ( SBLS_control_type ), INTENT( IN ) :: control - TYPE ( SBLS_inform_type ), INTENT( INOUT ) :: inform - TYPE ( GLS_AINFO ), INTENT( INOUT ) :: AINFO_GLS - TYPE ( GLS_FINFO ), INTENT( INOUT ) :: FINFO_GLS - -! Local variables - - INTEGER ( KIND = ip_ ) :: i, j, l, info - CHARACTER ( LEN = 80 ) :: array_name - -! Set up storage for A1. Initially A1 will be used to hold A - - A1%ne = a_ne - - array_name = resize_prefix // 'A1%row' - CALL SPACE_resize_array( a_ne, A1%row, & - inform%status, inform%alloc_status, array_name = array_name, & - deallocate_error_fatal = control%deallocate_error_fatal, & - exact_size = control%space_critical, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( inform%status /= GALAHAD_ok ) RETURN - - array_name = resize_prefix // 'A1%col' - CALL SPACE_resize_array( a_ne, A1%col, & - inform%status, inform%alloc_status, array_name = array_name, & - deallocate_error_fatal = control%deallocate_error_fatal, & - exact_size = control%space_critical, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( inform%status /= GALAHAD_ok ) RETURN - - array_name = resize_prefix // 'A1%val' - CALL SPACE_resize_array( a_ne, A1%val, & - inform%status, inform%alloc_status, array_name = array_name, & - deallocate_error_fatal = control%deallocate_error_fatal, & - exact_size = control%space_critical, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( inform%status /= GALAHAD_ok ) RETURN - -! ===================== -! Investigate using A^T -! ===================== - - IF ( find_basis_by_transpose ) THEN - A1%m = n ; A1%n = m - - SELECT CASE ( SMT_get( A%type ) ) - CASE ( 'DENSE' ) - l = 0 - DO i = 1, m - DO j = 1, n - l = l + 1 - A1%row( l ) = j - A1%col( l ) = i - END DO - END DO - CASE ( 'SPARSE_BY_ROWS' ) - DO i = 1, m - DO l = A%ptr( i ), A%ptr( i + 1 ) - 1 - A1%row( l ) = A%col( l ) - A1%col( l ) = i - END DO - END DO - CASE ( 'COORDINATE' ) - A1%row( : a_ne ) = A%col( : A%ne ) - A1%col( : a_ne ) = A%row( : A%ne ) - END SELECT - A1%val( : a_ne ) = A%val( : a_ne ) - -! Initialize the structures - - IF ( control%print_level <= 0 ) THEN - A1_control%ldiag = 0 - A1_control%lp = - 1 - A1_control%mp = - 1 - A1_control%wp = - 1 - ELSE - A1_control%ldiag = control%print_level - 1 - A1_control%lp = control%error - A1_control%mp = control%out - A1_control%wp = control%out - END IF - A1_control%u = control%pivot_tol_for_basis - A1_control%la = control%len_glsmin - A1_control%fill_in = 3 - A1_control%pivoting = MAX( A1%m, A1%n ) + 1 - -! out = 6 -! WRITE( out, "( ' A: m, n, nnz ', 3I4 )" ) & -! A1%m, A1%n, A1%ne -! WRITE( out, "( A, /, ( 10I7) )" ) ' rows =', ( A1%row ) -! WRITE( out, "( A, /, ( 10I7) )" ) ' cols =', ( A1%col ) -! WRITE( out, "( A, /, ( F7.2) )" ) ' vals =', ( A1%val ) - -! Analyse and factorize - -! A1_control%ldiag = 3 -! A1_control%lp = 6 ; A1_control%mp = 6 ; A1_control%wp = 6 -! CALL CPU_TIME( t3 ) - CALL GLS_ANALYSE( A1, A1_factors, & - A1_control, AINFO_GLS, FINFO_GLS ) -! CALL CPU_TIME( t2 ) - - inform%gls_analyse_status = AINFO_GLS%flag - IF ( printi ) WRITE( out, & - "( /, A, ' GLS: analysis of A complete: status = ', I0 )" ) & - prefix, inform%gls_analyse_status - IF ( printi ) WRITE( out, "( A, ' A nnz(prec,factors)', 2( 1X, I0))" ) & - prefix, A1%ne, FINFO_GLS%size_factor - - IF ( inform%gls_analyse_status < 0 ) THEN - inform%status = GALAHAD_error_gls_analysis ; RETURN - END IF - IF ( inform%gls_analyse_status == 4 ) THEN - inform%rank_def = .TRUE. - inform%rank = AINFO_GLS%rank - END IF - - array_name = resize_prefix // 'A_ROWS_basic' - CALL SPACE_resize_array( m, A_ROWS_basic, & - inform%status, inform%alloc_status, array_name = array_name, & - deallocate_error_fatal = control%deallocate_error_fatal, & - exact_size = control%space_critical, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( inform%status /= GALAHAD_ok ) RETURN - - array_name = resize_prefix // 'A_COLS_basic' - CALL SPACE_resize_array( n, A_COLS_basic, & - inform%status, inform%alloc_status, array_name = array_name, & - deallocate_error_fatal = control%deallocate_error_fatal, & - exact_size = control%space_critical, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( inform%status /= GALAHAD_ok ) RETURN - -! Determine the nonsingular submatrix of the factorization - -! CALL CPU_TIME( t3 ) - CALL GLS_SPECIAL_ROWS_AND_COLS( A1_factors, rank_a, A_COLS_basic, & - A_ROWS_basic, info ) -! CALL CPU_TIME( t2 ) -! WRITE(6,"(' time to find nonsingular submatrix ',F6.2)") t2 - t3 - - -! =================== -! Investigate using A -! =================== - - ELSE - A1%m = m ; A1%n = n - - SELECT CASE ( SMT_get( A%type ) ) - CASE ( 'DENSE' ) - l = 0 - DO i = 1, m - DO j = 1, n - l = l + 1 - A1%row( l ) = i - A1%col( l ) = j - END DO - END DO - CASE ( 'SPARSE_BY_ROWS' ) - DO i = 1, m - DO l = A%ptr( i ), A%ptr( i + 1 ) - 1 - A1%row( l ) = i - A1%col( l ) = A%col( l ) - END DO - END DO - CASE ( 'COORDINATE' ) - A1%row( : a_ne ) = A%row( : A%ne ) - A1%col( : a_ne ) = A%col( : A%ne ) - END SELECT - A1%val( : a_ne ) = A%val( : a_ne ) - -! Initialize the structures - - IF ( control%print_level <= 0 ) THEN - A1_control%ldiag = 0 - A1_control%lp = - 1 - A1_control%mp = - 1 - A1_control%wp = - 1 - ELSE - A1_control%ldiag = control%print_level - 1 - A1_control%lp = control%error - A1_control%mp = control%out - A1_control%wp = control%out - END IF - A1_control%u = control%pivot_tol_for_basis - A1_control%la = control%len_glsmin - A1_control%fill_in = 3 - -! Analyse and factorize - -! A1_control%ldiag = 3 -! A1_control%lp = 6 ; A1_control%mp = 6 ; A1_control%wp = 6 -! CALL CPU_TIME( t3 ) - CALL GLS_ANALYSE( A1, A1_factors, A1_control, AINFO_GLS, FINFO_GLS ) -! CALL CPU_TIME( t2 ) - - IF ( printi ) WRITE( out, "( A, ' A nnz(prec,factors)', 2( 1X, I0 ))") & - prefix, A1%ne, FINFO_GLS%size_factor - - inform%gls_analyse_status = AINFO_GLS%flag - IF ( printi ) WRITE( out, & - "( /, A, ' GLS: analysis of A complete: status = ', I0 )" ) & - prefix, inform%gls_analyse_status - IF ( inform%gls_analyse_status < 0 ) THEN - inform%status = GALAHAD_error_gls_analysis ; RETURN - END IF - IF ( inform%gls_analyse_status == 4 ) THEN - inform%rank_def = .TRUE. - inform%rank = AINFO_GLS%rank - END IF - - array_name = resize_prefix // 'A_ROWS_basic' - CALL SPACE_resize_array( m, A_ROWS_basic, & - inform%status, inform%alloc_status, array_name = array_name, & - deallocate_error_fatal = control%deallocate_error_fatal, & - exact_size = control%space_critical, & - bad_alloc = inform%bad_alloc, out = control%error ) - - IF ( inform%status /= GALAHAD_ok ) RETURN - array_name = resize_prefix // 'A_COLS_basic' - CALL SPACE_resize_array( n, A_COLS_basic, & - inform%status, inform%alloc_status, array_name = array_name, & - deallocate_error_fatal = control%deallocate_error_fatal, & - exact_size = control%space_critical, & - bad_alloc = inform%bad_alloc, out = control%error ) - IF ( inform%status /= GALAHAD_ok ) RETURN - -! Determine the nonsingular submatrix of the factorization - - CALL GLS_SPECIAL_ROWS_AND_COLS( A1_factors, rank_a, A_ROWS_basic, & - A_COLS_basic, info ) - END IF - -! CALL CPU_TIME( t2 ) -! WRITE(6,"(' time to find basis ',F6.2)") t2 - t1 - -! Record rank-defficient problems - - IF ( rank_a < MIN( m, n ) ) THEN - inform%rank_def = .TRUE. - IF ( out > 0 .AND. control%print_level >= 1 ) WRITE( out, & - "( /, A, ' ** WARNING nullity A = ', I10 )" ) prefix, & - MIN( m, n ) - rank_a - END IF - - RETURN - -! End of subroutine SBLS_find_basis - - END SUBROUTINE SBLS_find_basis - -! End of module SBLS - - END MODULE GALAHAD_SBLS_precision diff --git a/src/sbls/sbls.F90 b/src/sbls/sbls.F90 index c31d34e84d..37f68e87cd 100644 --- a/src/sbls/sbls.F90 +++ b/src/sbls/sbls.F90 @@ -4414,7 +4414,7 @@ SUBROUTINE SBLS_form_n_factorize_explicit( n, m, H, A, C, efactors, & ! set up space for the Bunch-Kaufman factorization of S np1 = H_lm%n_restriction + 1 ; npm = n + m - nb = LAENV( 1_ip_, 'DSYTRF', 'L', efactors%len_s_max, & + nb = LAENV( 1_ip_, 'DSYTRF', 'L', efactors%len_s_max, & - 1_ip_, - 1_ip_, - 1_ip_ ) array_name = 'sbls: efactors%IPIV' diff --git a/src/scu/scut.F90 b/src/scu/scut.F90 index da152a9220..a8ae6a6499 100644 --- a/src/scu/scut.F90 +++ b/src/scu/scut.F90 @@ -205,9 +205,11 @@ PROGRAM GALAHAD_SCU_testdeck IF ( class == 0 ) mat%class = 1 WRITE ( 6, 2200 ) mat%class IF ( class == 0 ) & - RHS3 = (/ 1.0_rp_, 3.0_rp_, 3.0_rp_, 4.0_rp_, 6.0_rp_, 8.0_rp_, 13.0_rp_/) + RHS3 = (/ 1.0_rp_, 3.0_rp_, 3.0_rp_, 4.0_rp_, & + 6.0_rp_, 8.0_rp_, 13.0_rp_/) IF ( class == 1 ) & - RHS3 = (/ 2.0_rp_, 4.0_rp_, 4.0_rp_, 5.0_rp_, 6.0_rp_, 5.0_rp_, 13.0_rp_/) + RHS3 = (/ 2.0_rp_, 4.0_rp_, 4.0_rp_, 5.0_rp_, & + 6.0_rp_, 5.0_rp_, 13.0_rp_/) IF ( mat%class == 2 ) THEN mat%BD_val( 8 ) = 2.0_rp_ RHS1( 6 ) = 15.0_rp_ diff --git a/src/sils/fa04a.f b/src/sils/fa04a.f index aa4a29c88a..271ddf238c 100644 --- a/src/sils/fa04a.f +++ b/src/sils/fa04a.f @@ -20,10 +20,11 @@ * conditions, which will include financial conditions. * 2. All information on the Package is provided to the Licensee on the * understanding that the details thereof are confidential. -* 3. All publications issued by the Licensee that include results obtained -* with the help of one or more of the Packages shall acknowledge the -* use of the Packages. The Licensee will notify the Numerical Analysis -* Group at Rutherford Appleton Laboratory of any such publication. +* 3. All publications issued by the Licensee that include results +* obtained with the help of one or more of the Packages shall +* acknowledge the use of the Packages. The Licensee will notify the +* Numerical Analysis Group at Rutherford Appleton Laboratory of any +* such publication. * 4. The Packages may be modified by or on behalf of the Licensee * for such use in research applications but at no time shall such * Packages or modifications thereof become the property of the diff --git a/src/sils/fa04ad.f b/src/sils/fa04ad.f index cd0edecfe6..65e448e7da 100644 --- a/src/sils/fa04ad.f +++ b/src/sils/fa04ad.f @@ -20,10 +20,11 @@ * conditions, which will include financial conditions. * 2. All information on the Package is provided to the Licensee on the * understanding that the details thereof are confidential. -* 3. All publications issued by the Licensee that include results obtained -* with the help of one or more of the Packages shall acknowledge the -* use of the Packages. The Licensee will notify the Numerical Analysis -* Group at Rutherford Appleton Laboratory of any such publication. +* 3. All publications issued by the Licensee that include results +* obtained with the help of one or more of the Packages shall +* acknowledge the use of the Packages. The Licensee will notify the +* Numerical Analysis Group at Rutherford Appleton Laboratory of any +* such publication. * 4. The Packages may be modified by or on behalf of the Licensee * for such use in research applications but at no time shall such * Packages or modifications thereof become the property of the diff --git a/src/sils/old_sils.F90 b/src/sils/old_sils.F90 deleted file mode 100644 index 7fc39fcae8..0000000000 --- a/src/sils/old_sils.F90 +++ /dev/null @@ -1,2565 +0,0 @@ -! THIS VERSION: GALAHAD 4.1 - 2023-01-24 AT 09:30 GMT. - -#include "galahad_modules.h" - -!-*-*-*-*-*-*-*-*- G A L A H A D _ S I L S M O D U L E -*-*-*-*-*-*-*-*-*- - -! Copyright reserved, Gould/Orban/Toint, for GALAHAD productions -! Principal author: Nick Gould - -! History - -! originally released pre GALAHAD Version 1.0. October 3rd 2000 -! update released with GALAHAD Version 2.0. March 28th 2005 - -! For full documentation, see -! http://galahad.rl.ac.uk/galahad-www/specs.html - - MODULE GALAHAD_SILS_precision - - USE GALAHAD_KINDS_precision - -! --------------------------------------------- -! | | -! | Provide a MA57-style interface for MA27 | -! | to allow the solution of | -! | | -! | Symmetric Indefinite Linear Systems | -! | | -! | * Version for threadsafe MA27 * | -! | | -! --------------------------------------------- - - USE GALAHAD_SMT_precision - - IMPLICIT NONE - - PRIVATE - PUBLIC :: SILS_initialize, SILS_analyse, SILS_factorize, SILS_solve, & - SILS_finalize, SILS_enquire, SILS_alter_d, SILS_part_solve, & - SMT_type - -!-------------------- - - -! Set other parameters - - REAL ( KIND = rp_ ), PRIVATE, PARAMETER :: zero = 0.0_rp_ - REAL ( KIND = rp_ ), PRIVATE, PARAMETER :: half = 0.5_rp_ - REAL ( KIND = rp_ ), PRIVATE, PARAMETER :: one = 1.0_rp_ - -!------------------------------------------------- -! D e r i v e d t y p e d e f i n i t i o n s -!------------------------------------------------- - - TYPE, PUBLIC :: SILS_factors - PRIVATE - INTEGER ( KIND = ip_ ) ( KIND = ip_ ), ALLOCATABLE, DIMENSION( : ) :: keep - INTEGER ( KIND = ip_ ) ( KIND = ip_ ), ALLOCATABLE, DIMENSION( : ) :: iw - INTEGER ( KIND = ip_ ) ( KIND = ip_ ), ALLOCATABLE, DIMENSION( : ) :: iw1 - REAL ( KIND = rp_ ), ALLOCATABLE, DIMENSION( : ) :: val - REAL ( KIND = rp_ ), ALLOCATABLE, DIMENSION( : ) :: w ! len maxfrt - REAL ( KIND = rp_ ), ALLOCATABLE, DIMENSION( : ) :: r ! length n - INTEGER ( KIND = ip_ ) :: n ! Matrix order - INTEGER ( KIND = ip_ ) :: nrltot ! Size for val without compression - INTEGER ( KIND = ip_ ) :: nirtot ! Size for iw without compression - INTEGER ( KIND = ip_ ) :: nrlnec ! Size for val with compression - INTEGER ( KIND = ip_ ) :: nirnec ! Size for iw with compression - INTEGER ( KIND = ip_ ) :: nsteps ! Number of elimination steps - INTEGER ( KIND = ip_ ) :: maxfrt ! Largest front size - INTEGER ( KIND = ip_ ) :: latop ! Position of final entry of val - INTEGER ( KIND = ip_ ) :: dim_iw1 ! Size of iw1 for solves - INTEGER ( KIND = ip_ ) :: pivoting ! type of pivoting used - REAL ( KIND = rp_ ) :: ops - END TYPE SILS_factors - - TYPE, PUBLIC :: SILS_control - REAL ( KIND = rp_ ) :: CNTL( 5 ) ! MA27 internal real controls - REAL ( KIND = rp_ ) :: multiplier ! Factor by which arrays sizes are to - ! be increased if they are too small - REAL ( KIND = rp_ ) :: reduce ! If previously allocated internal - ! workspace arrays are greater than reduce times - ! the currently required sizes, they are reset to - ! current requirments - REAL ( KIND = rp_ ) :: u ! Pivot threshold - REAL ( KIND = rp_ ) :: static_tolerance ! used for setting static - ! pivot level NEW - REAL ( KIND = rp_ ) :: static_level ! used for switch to static NEW - REAL ( KIND = rp_ ) :: tolerance ! Anything less than this is - ! considered zero - INTEGER ( KIND = ip_ ) :: ICNTL( 30 ) ! MA27 internal integer controls - INTEGER ( KIND = ip_ ) :: lp ! Unit for error messages - INTEGER ( KIND = ip_ ) :: rp_ ! Unit for warning messages - INTEGER ( KIND = ip_ ) :: mp ! Unit for monitor output NEW - INTEGER ( KIND = ip_ ) :: sp ! Unit for statistical output NEW - INTEGER ( KIND = ip_ ) :: ldiag ! Controls level of diagnostic output - INTEGER ( KIND = ip_ ) :: factorblocking ! Level 3 blocking in factorize NEW - INTEGER ( KIND = ip_ ) :: solveblocking ! Level 2 and 3 blocking in solve NEW - INTEGER ( KIND = ip_ ) :: la ! Initial size for real array for the factors. - ! If less than nrlnec, default size used. - INTEGER ( KIND = ip_ ) :: liw ! Initial size for integer array for the factors. - ! If less than nirnec, default size used. - INTEGER ( KIND = ip_ ) :: maxla ! Max. size for real array for the factors. - INTEGER ( KIND = ip_ ) :: maxliw ! Max. size for integer array for the factors. - INTEGER ( KIND = ip_ ) :: pivoting ! Controls pivoting: - ! 1 Numerical pivoting will be performed. - ! 2 No pivoting will be performed and an error exit will - ! occur immediately a pivot sign change is detected. - ! 3 No pivoting will be performed and an error exit will - ! occur if a zero pivot is detected. - ! 4 No pivoting is performed but pivots are changed to - ! all be positive. - INTEGER ( KIND = ip_ ) :: thresh ! Controls threshold for detecting full rows in - ! analyse, registered as percentage of N - ! 100 Only fully dense rows detected (default) NEW - INTEGER ( KIND = ip_ ) :: ordering ! Controls ordering: NEW - ! 0 AMD using MC47 - ! 1 User defined - ! 2 AMD using MC50 - ! 3 Min deg as in MA57 - ! 4 Metis_nodend ordering - ! 5 Ordering chosen depending on matrix characteristics. - ! At the moment choices are MC50 or Metis_nodend - ! >5 Presently equivalent to 5 but may chnage - INTEGER ( KIND = ip_ ) :: scaling ! Controls scaling: NEW - ! 0 No scaling - ! >0 Scaling using MC64 but may change for > 1 - END TYPE SILS_control - - TYPE, PUBLIC :: SILS_ainfo - REAL ( KIND = rp_ ) :: opsa ! Anticipated number of ops. in assembly NEW - REAL ( KIND = rp_ ) :: opse ! Anticipated number of ops. in elimin. NEW - INTEGER ( KIND = ip_ ) :: flag ! Flags success or failure case - INTEGER ( KIND = ip_ ) :: more ! More information on failure NEW - INTEGER ( KIND = ip_ ) :: nsteps ! Number of elimination steps - INTEGER ( KIND = ip_ ) :: nrltot ! Size for a without compression - INTEGER ( KIND = ip_ ) :: nirtot ! Size for iw without compression - INTEGER ( KIND = ip_ ) :: nrlnec ! Size for a with compression - INTEGER ( KIND = ip_ ) :: nirnec ! Size for iw with compression - INTEGER ( KIND = ip_ ) :: nrladu ! Number of reals to hold factors - INTEGER ( KIND = ip_ ) :: niradu ! Number of integers to hold factors - INTEGER ( KIND = ip_ ) :: ncmpa ! Number of compresses - INTEGER ( KIND = ip_ ) :: nfaulty ! Number of faulty entries OLD - INTEGER ( KIND = ip_ ) :: oor ! Number of indices out-of-range NEW - INTEGER ( KIND = ip_ ) :: dup ! Number of duplicates NEW - INTEGER ( KIND = ip_ ) :: maxfrt ! Forecast maximum front size NEW - INTEGER ( KIND = ip_ ) :: stat ! STAT value after allocate failure NEW - END TYPE SILS_ainfo - - TYPE, PUBLIC :: SILS_finfo - REAL ( KIND = rp_ ) :: opsa ! Number of operations in assembly NEW - REAL ( KIND = rp_ ) :: opse ! Number of operations in elimination NEW - REAL ( KIND = rp_ ) :: opsb ! Additional number of ops. for BLAS NEW - REAL ( KIND = rp_ ) :: maxchange ! Largest pivot mod. when pivoting=4 NEW - INTEGER ( KIND = ip_ ) :: flag ! Flags success or failure case - INTEGER ( KIND = ip_ ) :: more ! More information on failure NEW - INTEGER ( KIND = ip_ ) :: maxfrt ! Largest front size - INTEGER ( KIND = ip_ ) :: nebdu ! Number of entries in factors NEW - INTEGER ( KIND = ip_ ) :: nrlbdu ! Number of reals that hold factors - INTEGER ( KIND = ip_ ) :: nirbdu ! Number of integers that hold factors - INTEGER ( KIND = ip_ ) :: nrltot ! Size for a without compression - INTEGER ( KIND = ip_ ) :: nirtot ! Size for iw without compression - INTEGER ( KIND = ip_ ) :: nrlnec ! Size for a with compression - INTEGER ( KIND = ip_ ) :: nirnec ! Size for iw with compression - INTEGER ( KIND = ip_ ) :: ncmpbr ! Number of compresses of real data - INTEGER ( KIND = ip_ ) :: ncmpbi ! Number of compresses of integer data - INTEGER ( KIND = ip_ ) :: ntwo ! Number of 2x2 pivots - INTEGER ( KIND = ip_ ) :: neig ! Number of negative eigenvalues - INTEGER ( KIND = ip_ ) :: nfaulty ! Number of faulty entries - INTEGER ( KIND = ip_ ) :: delay ! Number of delayed pivots (total) NEW - INTEGER ( KIND = ip_ ) :: signc ! Number of pivot sign changes (pivoting=3 ) NEW - INTEGER ( KIND = ip_ ) :: modstep ! First pivot modification when pivoting=4 NEW - INTEGER ( KIND = ip_ ) :: rank ! Rank of original factorization - INTEGER ( KIND = ip_ ) :: stat ! STAT value after allocate failure - INTEGER ( KIND = ip_ ) :: step ! Pivot step at which failure occurred OLD - END TYPE SILS_finfo - - TYPE, PUBLIC :: SILS_sinfo - INTEGER ( KIND = ip_ ) :: flag ! Flags success or failure case - INTEGER ( KIND = ip_ ) :: more ! More information on failure - INTEGER ( KIND = ip_ ) :: stat ! STAT value after allocate failure - END TYPE SILS_sinfo - -!-------------------------------- -! I n t e r f a c e B l o c k -!-------------------------------- - - INTERFACE SILS_solve - MODULE PROCEDURE SILS_solve, SILS_solve_multiple, & - - USE GALAHAD_KINDS_precision - SILS_solve_refine, SILS_solve_refine_multiple - END INTERFACE - - INTERFACE - - SUBROUTINE MA27ID( ICNTL, CNTL ) - INTEGER ( KIND = ip_ ) ( KIND = ip_ ), INTENT( OUT ) :: ICNTL( 30 ) - REAL( KIND = rp_ ), INTENT( OUT ) :: CNTL( 5 ) - END SUBROUTINE MA27ID - - SUBROUTINE MA27AD( n, nz, IRN, ICN, IW, liw, IKEEP, IW1, nsteps, & - iflag, ICNTL, CNTL, INFO, ops ) - INTEGER ( KIND = ip_ ) ( KIND = ip_ ), INTENT( IN ) :: n, nz, liw - INTEGER ( KIND = ip_ ) ( KIND = ip_ ), INTENT( OUT ) :: nsteps - INTEGER ( KIND = ip_ ) ( KIND = ip_ ), INTENT( INOUT ) :: iflag - INTEGER ( KIND = ip_ ) ( KIND = ip_ ), INTENT( IN ), DIMENSION( nz ) :: IRN, ICN - INTEGER ( KIND = ip_ ) ( KIND = ip_ ), INTENT( OUT ), DIMENSION( liw ) :: IW - INTEGER ( KIND = ip_ ) ( KIND = ip_ ), INTENT( INOUT ), DIMENSION( 3 * n ) :: IKEEP - INTEGER ( KIND = ip_ ) ( KIND = ip_ ), INTENT( OUT ), DIMENSION( 2 * n ) :: IW1 - INTEGER ( KIND = ip_ ) ( KIND = ip_ ), INTENT( IN ), DIMENSION( 30 ) :: ICNTL - INTEGER ( KIND = ip_ ) ( KIND = ip_ ), INTENT( OUT ), DIMENSION( 20 ) :: INFO - REAL( KIND = rp_ ), INTENT( IN ), DIMENSION( 5 ) :: CNTL - REAL( KIND = rp_ ), INTENT( OUT ) :: ops - END SUBROUTINE MA27AD - - SUBROUTINE MA27BD( n, nz, IRN, ICN, A, la, IW, liw, IKEEP, nsteps, & - maxfrt, IW1, ICNTL, CNTL, INFO ) - INTEGER ( KIND = ip_ ) ( KIND = ip_ ), INTENT( IN ) :: n, nz, la, liw, nsteps - INTEGER ( KIND = ip_ ) ( KIND = ip_ ), INTENT( OUT ) :: maxfrt - INTEGER ( KIND = ip_ ) ( KIND = ip_ ), INTENT( IN ), DIMENSION( nz ) :: IRN, ICN - INTEGER ( KIND = ip_ ) ( KIND = ip_ ), INTENT( OUT ), DIMENSION( liw ) :: IW - INTEGER ( KIND = ip_ ) ( KIND = ip_ ), INTENT( IN ), DIMENSION( 3 * n ) :: IKEEP - INTEGER ( KIND = ip_ ) ( KIND = ip_ ), INTENT( OUT ), DIMENSION( n ) :: IW1 - REAL( KIND = rp_ ), INTENT( INOUT ), DIMENSION( la ) :: A - INTEGER ( KIND = ip_ ) ( KIND = ip_ ), INTENT( IN ), DIMENSION( 30 ) :: ICNTL - INTEGER ( KIND = ip_ ) ( KIND = ip_ ), INTENT( OUT ), DIMENSION( 20 ) :: INFO - REAL( KIND = rp_ ), INTENT( IN ), DIMENSION( 5 ) :: CNTL - END SUBROUTINE MA27BD - - SUBROUTINE MA27CD( n, A, la, IW, liw, W, maxfrt, RHS, IW1, nsteps, & - ICNTL, INFO ) - INTEGER ( KIND = ip_ ) ( KIND = ip_ ), INTENT( IN ) :: n, la, liw, maxfrt, nsteps - INTEGER ( KIND = ip_ ) ( KIND = ip_ ), INTENT( IN ), DIMENSION( liw ) :: IW - INTEGER ( KIND = ip_ ) ( KIND = ip_ ), INTENT( OUT ), DIMENSION( nsteps ) :: IW1 - REAL( KIND = rp_ ), INTENT( IN ), DIMENSION( la ) :: A - REAL( KIND = rp_ ), INTENT( OUT ), DIMENSION( maxfrt ) :: W - REAL( KIND = rp_ ), INTENT( INOUT ), DIMENSION( n ) :: RHS - INTEGER ( KIND = ip_ ) ( KIND = ip_ ), INTENT( IN ), DIMENSION( 30 ) :: ICNTL - INTEGER ( KIND = ip_ ) ( KIND = ip_ ), INTENT( OUT ), DIMENSION( 20 ) :: INFO - END SUBROUTINE MA27CD - - END INTERFACE - - CONTAINS - -!-*-*-*-*-*- S I L S _ I N I T I A L I Z E S U B R O U T I N E -*-*-*-*-* - - SUBROUTINE SILS_initialize( FACTORS, CONTROL ) - -! =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- -! -! Default control data for SILS. This routine should be called before -! first call to SILS_analyse -! -! =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- - - TYPE( SILS_factors ), INTENT( OUT ), OPTIONAL :: FACTORS - TYPE( SILS_control ), INTENT( OUT ), OPTIONAL :: CONTROL - - IF ( PRESENT( FACTORS ) ) THEN - FACTORS%n = 0 - END IF - - IF ( present( CONTROL ) ) THEN - CALL MA27ID( CONTROL%ICNTL, CONTROL%CNTL ) - CONTROL%multiplier = 2.0_rp_ - CONTROL%reduce = 2.0_rp_ - CONTROL%u = 0.1_rp_ ; CONTROL%CNTL( 1 ) = CONTROL%u - CONTROL%static_tolerance = 0.0_rp_ - CONTROL%static_level = 0.0_rp_ - CONTROL%tolerance = 0.0_rp_ ; CONTROL%CNTL( 3 ) = CONTROL%tolerance - CONTROL%lp = 6 ; CONTROL%ICNTL( 1 ) = CONTROL%lp - CONTROL%wp = 6 - CONTROL%mp = 6 ; CONTROL%ICNTL( 2 ) = CONTROL%mp - CONTROL%sp = - 1 - CONTROL%ldiag = 0 ; CONTROL%ICNTL( 3 ) = CONTROL%ldiag - CONTROL%factorblocking = 16 - CONTROL%solveblocking = 16 - CONTROL%la = 0 - CONTROL%liw = 0 - CONTROL%maxla = huge( 0 ) - CONTROL%maxliw = huge( 0 ) - CONTROL%pivoting = 1 - CONTROL%thresh = 50 ; CONTROL%CNTL( 2 ) = CONTROL%thresh / 100.0_rp_ - CONTROL%ordering = 3 - CONTROL%scaling = 0 - END IF - - RETURN - -! End of SILS_initialize - - END SUBROUTINE SILS_initialize - -!-*-*-*-*-*-*-*- S I L S _ A N A L Y S E S U B R O U T I N E -*-*-*-*-*-*- - - SUBROUTINE SILS_analyse( MATRIX, FACTORS, CONTROL, AINFO, PERM ) - -! =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- -! Analyse the sparsity pattern to obtain a good potential ordering -! for any subsequent factorization -! =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- - -! Dummy arguments - - TYPE( SMT_type ), INTENT( IN ) :: MATRIX - TYPE( SILS_factors ), INTENT( INOUT ) :: FACTORS - TYPE( SILS_control ), INTENT( IN ) :: CONTROL - TYPE( SILS_ainfo ), INTENT( OUT ) :: AINFO - INTEGER ( KIND = ip_ ) ( KIND = ip_ ), INTENT( IN ), OPTIONAL :: PERM( MATRIX%n ) ! Pivot sequence - -! Local variables - - INTEGER ( KIND = ip_ ) :: liw, n, ne, stat - INTEGER ( KIND = ip_ ) :: ICNTL( 30 ), INFO( 20 ) - REAL ( KIND = rp_ ) :: CNTL( 5 ) - -! Transfer CONTROL parameters - - CNTL( 1 ) = CONTROL%u - CNTL( 2 ) = CONTROL%thresh / 100.0_rp_ - CNTL( 3 ) = CONTROL%tolerance - CNTL( 4 : 5 ) = CONTROL%CNTL( 4 : 5 ) - ICNTL( 1 ) = CONTROL%lp - ICNTL( 2 ) = CONTROL%mp - ICNTL( 3 ) = CONTROL%ldiag - ICNTL( 4 : 30 ) = CONTROL%ICNTL( 4 : 30 ) - - n = MATRIX%n ; ne = MATRIX%ne ; stat = 0 - -! Allocate workspace - - IF ( ALLOCATED( FACTORS%keep ) ) THEN - IF ( SIZE( FACTORS%keep ) /= 3 * n ) THEN - DEALLOCATE( FACTORS%keep, STAT = stat ) - IF ( stat /= 0 ) GO TO 100 - ALLOCATE( FACTORS%keep( 3 * n ), STAT = stat ) - IF ( stat /= 0 ) GO TO 100 - END IF - ELSE - ALLOCATE( FACTORS%keep( 3 * n ), STAT = stat ) - IF ( stat /= 0 ) GO TO 100 - END IF - - IF ( ALLOCATED( FACTORS%iw1 ) ) THEN - IF ( SIZE( FACTORS%iw1 ) /= 2 * n ) THEN - DEALLOCATE( FACTORS%iw1, STAT = stat ) - IF ( stat /= 0 ) GO TO 100 - ALLOCATE( FACTORS%iw1( 2 * n ), STAT = stat ) - IF ( stat /= 0 ) GO TO 100 - END IF - ELSE - ALLOCATE( FACTORS%iw1( 2 * n ), STAT = stat ) - IF ( stat /= 0 ) GO TO 100 - END IF - - IF ( present( PERM ) ) THEN - FACTORS%keep( 1 : n ) = PERM( 1 : n ) - liw = 1.2 * ( ne + 3 * n + 1 ) - AINFO%flag = 1 - ELSE - liw = 1.2 * ( 2 * ne + 3 * n + 1 ) - AINFO%flag = 0 - END IF - - IF ( ALLOCATED( FACTORS%iw ) ) THEN - IF ( SIZE( FACTORS%iw ) /= liw ) THEN - DEALLOCATE( FACTORS%iw, STAT = stat ) - IF ( stat /= 0 ) GO TO 100 - ALLOCATE( FACTORS%iw( liw ), STAT = stat ) - IF ( stat /= 0 ) GO TO 100 - END IF - ELSE - ALLOCATE( FACTORS%iw( liw ), STAT = stat ) - IF ( stat /= 0 ) GO TO 100 - END IF - -! Analyse the matrix - - CALL MA27AD( n, ne, MATRIX%row, MATRIX%col, FACTORS%iw, liw, & - FACTORS%keep, FACTORS%iw1, FACTORS%nsteps, AINFO%flag, & - ICNTL, CNTL, INFO, FACTORS%ops ) - -! Record return information - - FACTORS%nrltot = INFO( 3 ) - FACTORS%nirtot = INFO( 4 ) - FACTORS%nrlnec = INFO( 5 ) - FACTORS%nirnec = INFO( 6 ) - FACTORS%n = n - - AINFO%flag = INFO( 1 ) - AINFO%nfaulty = INFO( 2 ) - AINFO%nsteps = FACTORS%nsteps - AINFO%opsa = FACTORS%ops / 2.0 - AINFO%opse = FACTORS%ops / 2.0 - AINFO%nrltot = INFO( 3 ) - AINFO%nirtot = INFO( 4 ) - AINFO%nrlnec = INFO( 5 ) - AINFO%nirnec = INFO( 6 ) - AINFO%nrladu = INFO( 7 ) - AINFO%niradu = INFO( 8 ) - AINFO%ncmpa = INFO( 11 ) - - IF ( stat == 0 ) RETURN - - 100 CONTINUE - IF ( CONTROL%ldiag > 0 .AND. CONTROL%lp > 0 ) & - WRITE( CONTROL%lp, '( A, /, A, I0 )') & - ' Error return from SILS_analyze:', & - ' allocate or deallocate failed with STAT = ', stat - AINFO%flag = - 3 - AINFO%stat = stat - - RETURN - -! End of SILS_analyse - - END SUBROUTINE SILS_analyse - -!-*-*-*-*-*-*- S I L S _ F A C T O R I Z E S U B R O U T I N E -*-*-*-*-*- - - SUBROUTINE SILS_factorize( MATRIX, FACTORS, CONTROL, FINFO ) - -! =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- -! Factorize the matrix using the ordering suggested from the analysis -! =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- - -! Dummy arguments - - TYPE( SMT_type ), INTENT( IN ) :: MATRIX - TYPE( SILS_factors ), INTENT( INOUT ) :: FACTORS - TYPE( SILS_control ), INTENT( IN ) :: CONTROL - TYPE( SILS_finfo ), INTENT( OUT ) :: FINFO - -! Local variables - - INTEGER ( KIND = ip_ ) :: i, kw, nblks, ncols, nrows, stat, la, liw, block, la_extra - INTEGER ( KIND = ip_ ) :: ICNTL( 30 ), INFO( 20 ) - REAL ( KIND = rp_ ) :: CNTL( 5 ) - INTEGER ( KIND = ip_ ) ( KIND = ip_ ), ALLOCATABLE :: flag( : ) ! Workarray for completing the - ! permutation in the rank-deficient case - INTEGER ( KIND = ip_ ) :: FACTORS_iw1( MATRIX%n ) - INTEGER ( KIND = ip_ ) ( KIND = ip_ ), ALLOCATABLE, DIMENSION( : ) :: FACTORS_iw - REAL ( KIND = rp_ ), ALLOCATABLE, DIMENSION( : ) :: FACTORS_val, DIAG - - IF ( FACTORS%n /= MATRIX%n ) THEN - IF ( CONTROL%ldiag > 0 .AND. CONTROL%lp > 0 ) & - WRITE( CONTROL%lp, '( A, I7, A, I7 )') & - ' Error return from SILS_FACTORIZE: MATRIX%n and the value', & - MATRIX%n, ' instead of', FACTORS%n - FINFO%flag = - 1 - FINFO%more = FACTORS%n - END IF - -! Transfer CONTROL parameters - - SELECT CASE ( CONTROL%pivoting ) - CASE default ; CNTL( 1 ) = CONTROL%u - CASE ( 2 ) ; CNTL( 1 ) = - CONTROL%u - CASE ( 3 ) ; CNTL( 1 ) = 0.0_rp_ - END SELECT - CNTL( 2 ) = CONTROL%thresh / 100.0_rp_ - CNTL( 3 ) = CONTROL%tolerance - CNTL( 4 : 5 ) = CONTROL%CNTL( 4 : 5 ) - ICNTL( 1 ) = CONTROL%lp - ICNTL( 2 ) = CONTROL%mp - ICNTL( 3 ) = CONTROL%ldiag - ICNTL( 4 : 30 ) = CONTROL%ICNTL( 4 : 30 ) - FACTORS%pivoting = CONTROL%pivoting - - stat = 0 - -! Allocate workspace - - IF ( CONTROL%pivoting == 4 ) THEN - la_extra = MATRIX%n - ELSE - la_extra = 0 - END IF - la = CONTROL%la - IF ( la < FACTORS%nrlnec ) THEN - la = CONTROL%reduce * FACTORS%nrltot - IF ( ALLOCATED( FACTORS%val ) ) & - la = MIN( SIZE( FACTORS%val ) - la_extra, la ) - IF ( la < FACTORS%nrlnec ) la = FACTORS%nrltot - END IF - - IF ( ALLOCATED( FACTORS%val ) ) THEN - IF ( la + la_extra /= SIZE( FACTORS%val ) ) THEN - DEALLOCATE( FACTORS%val, STAT = stat ) - IF ( stat /= 0 ) GO TO 100 - ALLOCATE( FACTORS%val( la + la_extra ), STAT = stat ) - IF ( stat /= 0 ) GO TO 100 - END IF - ELSE - ALLOCATE( FACTORS%val( la + la_extra ), STAT = stat ) - IF ( stat /= 0 ) GO TO 100 - END IF - - liw = CONTROL%liw - IF ( liw < FACTORS%nirnec ) THEN - liw = CONTROL%reduce * FACTORS%nirtot - IF ( ALLOCATED( FACTORS%iw ) ) & - liw = MIN( SIZE( FACTORS%iw ), liw ) - IF ( liw < FACTORS%nirnec ) liw = FACTORS%nirtot - END IF - - IF ( ALLOCATED( FACTORS%iw ) ) THEN - IF ( liw /= SIZE( FACTORS%iw ) ) THEN - DEALLOCATE( FACTORS%iw, STAT = stat ) - IF ( stat /= 0 ) GO TO 100 - ALLOCATE( FACTORS%iw( liw ), STAT = stat ) - IF ( stat /= 0 ) GO TO 100 - END IF - ELSE - ALLOCATE( FACTORS%iw( liw ), STAT = stat ) - IF ( stat /= 0 ) GO TO 100 - END IF - -! Factorize the matrix - - DO - FACTORS%val( 1 : MATRIX%ne ) = MATRIX%val( 1 : MATRIX%ne ) - FACTORS_iw => FACTORS%iw - -! Schnabel-Eskow modified Cholesky factorization - - FINFO%modstep = 0 - IF ( CONTROL%pivoting == 4 ) THEN - FACTORS_val => FACTORS%val( : la ) - DIAG => FACTORS%val( la + 1 : ) - CALL SILS_schnabel_eskow( MATRIX%n, MATRIX%ne, MATRIX%row, & - MATRIX%col, FACTORS_val, la, FACTORS_iw, liw, & - FACTORS%keep, FACTORS%nsteps, FINFO%maxfrt, FACTORS_iw1, & - ICNTL, CNTL, INFO, DIAG, FINFO%maxchange, FINFO%modstep ) - -! Multifrontal factorization - - ELSE - FACTORS_val => FACTORS%val - CALL MA27BD( MATRIX%n, MATRIX%ne, MATRIX%row, MATRIX%col, & - FACTORS_val, la, FACTORS_iw, liw, FACTORS%keep, & - FACTORS%nsteps, FINFO%maxfrt, FACTORS_iw1, & - ICNTL, CNTL, INFO ) - FINFO%maxchange = zero - END IF - - FINFO%flag = INFO( 1 ) - -! Check to see if there was sufficient workspace. If not, allocate -! more and retry - - IF ( FINFO%flag == - 3 ) THEN - IF ( ALLOCATED( FACTORS%iw ) ) THEN - DEALLOCATE( FACTORS%iw, STAT = stat ) - IF ( stat /= 0 ) GO TO 100 - END IF - liw = CONTROL%multiplier * liw - IF ( liw > CONTROL%maxliw ) THEN - IF ( CONTROL%ldiag > 0 .AND. CONTROL%lp > 0 ) & - WRITE( CONTROL%lp, 2000 ) 'integer', CONTROL%maxliw - FINFO%flag = - 8 - return - END IF - ALLOCATE( FACTORS%iw( liw ), STAT = stat ) - IF ( stat /= 0 ) GO TO 100 - ELSE IF ( FINFO%flag == - 4 ) THEN - IF ( ALLOCATED( FACTORS%iw ) ) THEN - DEALLOCATE( FACTORS%val, STAT = stat ) - IF ( stat /= 0 ) GO TO 100 - END IF - la = CONTROL%multiplier * la - IF ( la > CONTROL%maxla ) THEN - IF ( CONTROL%ldiag > 0 .AND. CONTROL%lp > 0 ) & - WRITE( CONTROL%lp, 2000 ) 'real', CONTROL%maxla - FINFO%flag = - 7 - RETURN - END IF - ALLOCATE( FACTORS%val( la + la_extra ), STAT = stat ) - IF ( stat /= 0 ) GO TO 100 - ELSE - EXIT - END IF - END DO - - IF ( FINFO%flag >= 0 ) THEN - kw = 2 - nblks = ABS( FACTORS%iw( 1 ) ) - DO block = 1, nblks - FACTORS%iw1( block ) = kw - 1 - ncols = FACTORS%iw( kw ) - IF ( ncols > 0 ) THEN - kw = kw + 1 - ELSE - ncols = - ncols - END IF - kw = kw + ncols + 1 - END DO - - FACTORS%latop = INFO( 9 ) - FACTORS%maxfrt = FINFO%maxfrt - - IF ( FINFO%flag == 3 ) THEN - -! Supplement the arrays in the singular case - - kw = 2 - ALLOCATE( flag( FACTORS%n ), STAT = stat ) - IF ( stat /= 0 ) GO TO 100 - flag = 0 - DO block = 1, nblks - ncols = FACTORS%iw( kw ) - IF ( ncols > 0 ) THEN - kw = kw + 1 - nrows = FACTORS%iw( kw ) - flag ( ABS( FACTORS%iw( kw + 1 : kw + nrows ) ) ) = 1 - ELSE - ncols = - ncols - flag( FACTORS%iw( kw + 1 ) ) = 1 - END IF - kw = kw + ncols + 1 - END DO - DO i = 1, FACTORS%n - IF ( flag( i ) == 0 ) THEN - nblks = nblks + 1 - FACTORS%iw1( nblks ) = INFO( 10 ) - INFO( 9 ) = INFO( 9 ) + 1 - FACTORS%val( INFO( 9 ) ) = 1.0_rp_ - FACTORS%iw( INFO( 10 ) + 1 ) = - 1 - FACTORS%iw( INFO( 10 ) + 2 ) = i - INFO( 10 ) = INFO( 10 ) + 2 - END IF - END DO - DEALLOCATE( flag, STAT = stat ) - IF ( stat /= 0 ) GO TO 100 - FACTORS%iw( 1 ) = sign ( nblks, FACTORS%iw( 1 ) ) - END IF - END IF - FACTORS%dim_iw1 = ABS( FACTORS%iw( 1 ) ) - -! Record return information - - IF ( FINFO%flag <= - 5 ) FINFO%step = INFO( 2 ) - IF ( FINFO%flag == 1 ) FINFO%nfaulty = INFO( 2 ) - FINFO%rank = MATRIX%n - FINFO%nrlbdu = INFO( 9 ) - FINFO%nebdu = INFO( 9 ) - FINFO%nirbdu = INFO( 10 ) - FINFO%ncmpbr = INFO( 12 ) - FINFO%ncmpbi = INFO( 13 ) - FINFO%ntwo = INFO( 14 ) - FINFO%neig = INFO( 15 ) - FINFO%opsa = FACTORS%ops / 2.0 - FINFO%opse = FACTORS%ops / 2.0 - FINFO%opsb = 0.0 - -! Reset FINFO%flag to MA57-style return values - - IF ( FINFO%flag == 2 ) FINFO%flag = 5 - IF ( FINFO%flag == 3 ) THEN - FINFO%flag = 4 - FINFO%rank = INFO( 2 ) - END IF - - IF ( ALLOCATED( FACTORS%w ) ) THEN - IF ( SIZE( FACTORS%w ) < FACTORS%maxfrt ) THEN - DEALLOCATE( FACTORS%w, STAT = FINFO%flag ) - IF ( FINFO%flag /= 0 ) THEN - IF ( CONTROL%ldiag > 0 .AND. CONTROL%lp > 0 ) & - WRITE( CONTROL%lp, 2010 ) 'deallocate', FINFO%flag - RETURN - END IF - ALLOCATE( FACTORS%w( FACTORS%maxfrt ), STAT = FINFO%flag ) - IF ( FINFO%flag /= 0 ) THEN - IF ( CONTROL%ldiag > 0 .AND. CONTROL%lp > 0 ) & - WRITE( CONTROL%lp, 2010 ) 'allocate', FINFO%flag - RETURN - END IF - END IF - ELSE - ALLOCATE( FACTORS%w( FACTORS%maxfrt ), STAT = FINFO%flag ) - IF ( FINFO%flag /= 0 ) THEN - IF ( CONTROL%ldiag > 0 .AND. CONTROL%lp > 0 ) & - WRITE( CONTROL%lp, 2010 ) 'allocate', FINFO%flag - RETURN - END IF - END IF - - RETURN - - 100 CONTINUE - IF ( CONTROL%ldiag > 0 .AND. CONTROL%lp > 0 ) & - WRITE( CONTROL%lp, '( A / A, I0 )') & - ' Error return from SILS_FACTORIZE:', & - ' allocate or DEALLOCATE failed with STAT=', stat - FINFO%flag = - 3 - FINFO%stat = stat - - RETURN - -! Non-executable statement - - 2000 FORMAT( ' Error return from SILS_FACTORIZE: ', ' main ', A, & - ' array needs to be bigger than', I0 ) - 2010 FORMAT( ' Error return from SILS_part_solve: ', A, ' failed', & - ' with STAT = ', I0 ) - - - CONTAINS - -!-*-*-*- S I L S _ S C H N A B E L _ E S K O W S U B R O U T I N E -*-*-*- - - SUBROUTINE SILS_schnabel_eskow( n, nz, IRN, ICN, A, la, IW, liw, IKEEP, & - nsteps, maxfrt, IW1, ICNTL, CNTL, INFO, & - DIAG, maxchange, modstep ) - -! Given an elimination ordering, factorize a symmetric matrix A -! (modified version of MA27B from LANCELOT A) - -!----------------------------------------------- -! D u m m y A r g u m e n t s -!----------------------------------------------- - - INTEGER n, nz, la, liw, nsteps, maxfrt, modstep - REAL ( KIND = rp_ ) :: maxchange - INTEGER ( KIND = ip_ ) ( KIND = ip_ ), DIMENSION( * ) :: IRN, ICN - INTEGER ( KIND = ip_ ) ( KIND = ip_ ), DIMENSION( liw ) :: IW - INTEGER ( KIND = ip_ ) ( KIND = ip_ ), DIMENSION( n, 3 ) :: IKEEP - INTEGER ( KIND = ip_ ) ( KIND = ip_ ), DIMENSION( n ) :: IW1 - INTEGER ( KIND = ip_ ) ( KIND = ip_ ), DIMENSION( 30 ) :: ICNTL - INTEGER ( KIND = ip_ ) ( KIND = ip_ ), DIMENSION( 20 ) :: INFO - REAL ( KIND = rp_ ), DIMENSION( 5 ) :: CNTL - REAL ( KIND = rp_ ), DIMENSION( la ) :: A - REAL ( KIND = rp_ ), DIMENSION( n ) :: DIAG - -!----------------------------------------------- -! L o c a l V a r i a b l e s -!----------------------------------------------- - - INTEGER ( KIND = ip_ ) :: k, kz, nz1, iphase, j2, j1, irows - INTEGER ( KIND = ip_ ) :: len, nrows, ipos, kblk, iapos, ncols, iblk - REAL ( KIND = rp_ ) :: addon - - INFO( 1 ) = 0 - maxchange = zero - IF ( ICNTL( 3 ) > 0 .AND. ICNTL( 2 ) > 0 ) THEN - -! Print input parameters - - WRITE( ICNTL( 2 ), 2010 ) n, nz, la, liw, nsteps, CNTL( 1 ) - kz = MIN( 6, nz ) ; IF ( ICNTL( 3 ) > 1 ) kz = nz - IF ( nz > 0 ) WRITE( ICNTL( 2 ), 2020 ) & - ( A( k ), IRN( k ), ICN( k ), k = 1, kz ) - k = MIN( 9, n ) ; IF ( ICNTL( 3 ) > 1 ) k = n - IF ( k > 0 ) WRITE( ICNTL( 2 ), 2030 ) IKEEP( : k, 1 ) - k = MIN( k, nsteps ) - IF ( k > 0 ) THEN - WRITE( ICNTL( 2 ), 2040 ) IKEEP( : k, 2 ) - WRITE( ICNTL( 2 ), 2050 ) IKEEP( : k, 3 ) - END IF - END IF - IF ( n >= 1 .AND. n <= ICNTL( 4 ) ) THEN - IF ( nz < 0 ) THEN - INFO( 1 ) = - 2 - IF ( ICNTL( 1 ) > 0 ) WRITE( ICNTL( 1 ), 2080 ) INFO( 1 ) - IF ( ICNTL( 1 ) > 0 ) WRITE( ICNTL( 1 ), 2110 ) nz - GO TO 130 - END IF - IF ( liw < nz ) THEN - INFO( 1 ) = - 3 ; INFO( 2 ) = nz - GO TO 130 - END IF - IF ( la < nz + n ) THEN - INFO( 1 ) = - 4 ; INFO( 2 ) = nz + n - GO TO 130 - END IF - -! Set phase of Cholesky modification - - iphase = 1 - -! Sort - - CALL SILS_sort_entries( n, nz, nz1, A, la, IRN, ICN, IW, liw, IKEEP, & - IW1, ICNTL, INFO, DIAG, addon ) - IF ( ICNTL( 2 ) > 0 .AND. ICNTL( 3 ) >= 2 ) & - WRITE( ICNTL( 2 ), 2000 ) addon - IF ( INFO( 1 ) == - 3 .OR. INFO( 1 ) == - 4 ) GO TO 130 - -! Factorize - - CALL SILS_schnabel_eskow_main( & - n, nz1, A, la, IW, liw, IKEEP, IKEEP( 1, 3 ), nsteps, maxfrt, & - IKEEP( 1, 2 ), IW1, ICNTL, CNTL, INFO, DIAG, addon, iphase, & - maxchange, modstep ) - - IF ( INFO( 1 ) == - 3 .OR. INFO( 1 ) == - 4 ) GO TO 130 - IF ( INFO( 1 ) == - 5 ) THEN - IF ( ICNTL( 1 ) > 0 ) WRITE( ICNTL( 1 ), 2080 ) INFO( 1 ) - IF ( ICNTL( 1 ) > 0 ) WRITE( ICNTL( 1 ), 2190 ) INFO( 2 ) - END IF - IF ( INFO( 1 ) == - 6 ) THEN - IF ( ICNTL( 1 ) > 0 ) WRITE( ICNTL( 1 ), 2080 ) INFO( 1 ) - IF ( ICNTL( 1 ) > 0 ) WRITE( ICNTL( 1 ), 2210 ) - END IF - -! **** Warning message **** - - IF ( INFO( 1 ) == 3 .AND. ICNTL( 2 ) > 0 ) & - WRITE( ICNTL( 2 ), 2060 ) INFO( 1 ), INFO( 2 ) - -! **** Error returns **** - - ELSE - INFO( 1 ) = - 1 - IF ( ICNTL( 1 ) > 0 ) WRITE( ICNTL( 1 ), 2080 ) INFO( 1 ) - IF ( ICNTL( 1 ) > 0 ) WRITE( ICNTL( 1 ), 2090 ) n - END IF - - 130 CONTINUE - IF ( INFO( 1 ) == - 3 ) THEN - IF ( ICNTL( 1 ) > 0 ) WRITE( ICNTL( 1 ), 2080 ) INFO( 1 ) - IF ( ICNTL( 1 ) > 0 ) WRITE( ICNTL( 1 ), 2140 ) liw, INFO( 2 ) - ELSE IF ( INFO( 1 ) == - 4 ) THEN - IF ( ICNTL( 1 ) > 0 ) WRITE( ICNTL( 1 ), 2080 ) INFO( 1 ) - IF ( ICNTL( 1 ) > 0 ) WRITE( ICNTL( 1 ), 2170 ) la, INFO( 2 ) - END IF - IF ( ICNTL( 3 ) > 0 .AND. ICNTL( 2 ) > 0 ) THEN - -! Print output parameters - - WRITE( ICNTL( 2 ), 2230 ) maxfrt, INFO( 1 ),INFO( 9 ), INFO( 10 ), & - INFO( 12 ), INFO( 13 ),INFO( 14 ), INFO( 2 ) - IF ( INFO( 1 ) >= 0 ) THEN - -! Print out matrix factors from SILS_schnabel_eskow - - kblk = ABS( IW( 1 ) + 0 ) - IF ( kblk /= 0 ) THEN - IF ( ICNTL( 3 ) == 1 ) kblk = 1 - ipos = 2 ; iapos = 1 - DO iblk = 1, kblk - ncols = IW( ipos ) ; nrows = IW( ipos + 1 ) - j1 = ipos + 2 - IF ( ncols <= 0 ) THEN - ncols = - ncols ; nrows = 1 - j1 = j1 - 1 - END IF - WRITE( ICNTL( 2 ), 2250 ) iblk, nrows, ncols - j2 = j1 + ncols - 1 - ipos = j2 + 1 - WRITE( ICNTL( 2 ), 2260 ) IW( j1 : j2 ) - WRITE( ICNTL( 2 ), 2270 ) - len = ncols - DO irows = 1, nrows - j1 = iapos ; j2 = iapos + len - 1 - WRITE( ICNTL( 2 ), 2280 ) A( j1 : j2 ) - len = len - 1 - iapos = j2 + 1 - END DO - END DO - END IF - END IF - END IF - - RETURN - -! Non executable statements - - 2000 FORMAT( ' addon = ', ES12.4 ) - 2010 FORMAT( //, ' entering SILS_schnabel_eskow with n nz la ', & - ' liw nsteps u', / , 38X, 5I7, F7.2 ) - 2020 FORMAT( ' Matrix non-zeros', 2( ES16.4, 2I6 ), /, & - ( 17X, ES16.4, 2I6, ES16.4, 2I6 ) ) - 2030 FORMAT( ' IKEEP( ., 1 )=', 10I6, /, ( 12X, 10I6 ) ) - 2040 FORMAT( ' IKEEP( ., 2 )=', 10I6, /, ( 12X, 10I6 ) ) - 2050 FORMAT( ' IKEEP( ., 3 )=', 10I6, /, ( 12X, 10I6 ) ) - 2060 FORMAT( ' *** Warning message from subroutine SILS_schnabel_eskow ***', & - ' info(1) = ', I0, /, 5X, 'matrix is singular. Rank=', I0 ) - 2080 FORMAT( ' **** Error return from SILS_schnabel_eskow **** info(1) =', I0) - 2090 FORMAT( ' Value of n out of range ... =', I0 ) - 2110 FORMAT( ' Value of nz out of range .. =', I0 ) - 2140 FORMAT( ' liw too small, must be increased from', I0, & - ' to at least', I0 ) - 2170 FORMAT( ' la too small, must be increased from ', I0, & - ' to at least', I0 ) - 2190 FORMAT( ' Zero pivot at stage', I0, & - ' when input matrix declared definite' ) - 2210 FORMAT( ' Change in sign of pivot encountered ', & - ' when factoring allegedly definite matrix' ) - 2230 FORMAT( /' Leaving SILS_schnabel_eskow with maxfrt info(1) nrlbdu', & - ' nirbdu ncmpbr ncmpbi ntwo ierror', /, 37X, 8I7 ) - 2250 FORMAT( ' Block pivot =', I8,' nrows =', I8,' ncols =', I0 ) - 2260 FORMAT( ' Column indices =', 10I6, /, ( 17X, 10I6 ) ) - 2270 FORMAT( ' Real entries .. each row starts on a new line' ) - 2280 FORMAT( 5ES16.8 ) - -! End of subroutine SILS_schnabel_eskow - - END SUBROUTINE SILS_schnabel_eskow - -!-*-*-*-*- S I L S _ S O R T _ E N T R I E S S U B R O U T I N E -*-*-*-*- - - SUBROUTINE SILS_sort_entries( n, nz, nz1, A, la, IRN, ICN, IW, liw, & - PERM, IW2, ICNTL, INFO, DIAG, addon ) - -! Sort the entries of A prior to the factorization -! (modified version of MA27N from LANCELOT A) - -!----------------------------------------------- -! D u m m y A r g u m e n t s -!----------------------------------------------- - - INTEGER n, nz, nz1, la, liw - REAL ( KIND = rp_ ) addon - INTEGER ( KIND = ip_ ) ( KIND = ip_ ), DIMENSION( * ) :: IRN, ICN - INTEGER ( KIND = ip_ ) ( KIND = ip_ ), DIMENSION( liw ) :: IW - INTEGER ( KIND = ip_ ) ( KIND = ip_ ), DIMENSION( n ) :: PERM, IW2 - INTEGER ( KIND = ip_ ) ( KIND = ip_ ), DIMENSION( 30 ) :: ICNTL - INTEGER ( KIND = ip_ ) ( KIND = ip_ ), DIMENSION( 20 ) :: INFO - REAL ( KIND = rp_ ), DIMENSION( la ) :: A - REAL ( KIND = rp_ ), DIMENSION( n ) :: DIAG - -!----------------------------------------------- -! L o c a l V a r i a b l e s -!----------------------------------------------- - - INTEGER ( KIND = ip_ ) :: k, iold, inew, jold, ia, jnew, j2, j1, iiw, jj, ii - INTEGER ( KIND = ip_ ) :: ich, i, ipos, jpos - REAL ( KIND = rp_ ) :: anext, anow, machep, maxdag - -! ** Obtain machep - - machep = EPSILON( one ) - INFO( 1 ) = 0 - -! Initialize work array (IW2) in preparation for counting numbers of -! non-zeros in the rows and initialize last n entries in A which will -! hold the diagonal entries - - ia = la - IW2 = 1 - A( ia - n + 1 : ia ) = zero - -! Scan input copying row indices from IRN to the first nz positions -! in IW. The negative of the index is held to flag entries for -! the in-place sort. Entries in IW corresponding to diagonals and -! entries with out-of-range indices are set to zero. For diagonal entries, -! reals are accumulated in the last n locations OF A. -! The number of entries in each row of the permuted matrix is -! accumulated in IW2. Indices out of range are ignored after being counted -! and after appropriate messages have been printed. - - INFO( 2 ) = 0 - -! nz1 is the number of non-zeros held after indices out of range have -! been ignored and diagonal entries accumulated. - - nz1 = n - IF ( nz /= 0 ) THEN - DO k = 1, nz - iold = IRN( k ) - IF ( iold <= n .AND. iold > 0 ) THEN - jold = ICN( k ) - IF ( jold <= n .AND. jold > 0 ) THEN - inew = PERM( iold ) - jnew = PERM( jold ) - IF ( inew == jnew ) THEN - ia = la - n + iold - A( ia ) = A( ia ) + A( k ) - IW( k ) = 0 - CYCLE - END IF - inew = MIN( inew, jnew ) - -! Increment number of entries in row inew. - - IW2( inew ) = IW2( inew ) + 1 - IW( k ) = - iold - nz1 = nz1 + 1 - CYCLE - -! Entry out of range. It will be ignored and a flag set. - - END IF - END IF - INFO( 1 ) = 1 - INFO( 2 ) = INFO( 2 ) + 1 - IF ( INFO( 2 ) <= 1 .AND. ICNTL( 2 ) > 0 ) & - WRITE( ICNTL( 2 ), 2040 ) INFO( 1 ) - IF ( INFO( 2 ) <= 10 .AND. ICNTL( 2 ) > 0 ) & - WRITE( ICNTL( 2 ), 2050 ) k, IRN( k ), ICN( k ) - IW( k ) = 0 - END DO - -! Calculate pointers (in IW2) to the position immediately after the end -! of each row. - - END IF - -! Room is included for the diagonals. - - IF ( nz >= nz1 .OR. nz1 == n ) THEN - k = 1 - DO i = 1, n - k = k + IW2( i ) - IW2( i ) = k - END DO - ELSE - -! Room is not included for the diagonals. - - k = 1 - DO i = 1, n - k = k + IW2( i ) - 1 - IW2( i ) = k - END DO - -! Fail if insufficient space in arrays A or IW. - - END IF - -! **** Error return **** - - IF ( nz1 > liw ) THEN - INFO( 1 ) = - 3 ; INFO( 2 ) = nz1 - RETURN - END IF - - IF ( nz1 + n > la ) THEN - INFO( 1 ) = - 4 ; INFO( 2 ) = nz1 + n - RETURN - END IF - -! Now run through non-zeros in order placing them in their new -! position and decrementing appropriate IW2 entry. If we are -! about to overwrite an entry not yet moved, we must deal with -! this at this time. - - IF ( nz1 /= n ) THEN - L140: DO k = 1, nz - iold = - IW( k ) - IF ( iold <= 0 ) CYCLE L140 - jold = ICN( k ) - anow = A( k ) - IW( k ) = 0 - DO ich = 1, nz - inew = PERM( iold ) ; jnew = PERM( jold ) - inew = MIN( inew, jnew ) - IF ( inew == PERM( jold ) ) jold = iold - jpos = IW2( inew ) - 1 - iold = -IW( jpos ) - anext = A( jpos ) - A( jpos ) = anow - IW( jpos ) = jold - IW2( inew ) = jpos - IF ( iold == 0 ) CYCLE L140 - anow = anext - jold = ICN( jpos ) - END DO - END DO L140 - IF ( nz < nz1 ) THEN - -! Move up entries to allow for diagonals. - - ipos = nz1 ; jpos = nz1 - n - DO ii = 1, n - i = n - ii + 1 - j1 = IW2( i ) ; j2 = jpos - IF ( j1 <= jpos ) THEN - DO jj = j1, j2 - IW( ipos ) = IW( jpos ) - A( ipos ) = A( jpos ) - ipos = ipos - 1 - jpos = jpos - 1 - END DO - END IF - IW2( i ) = ipos + 1 - ipos = ipos - 1 - END DO - -! Run through rows inserting diagonal entries and flagging beginning -! of each row by negating first column index. - - END IF - END IF - maxdag = machep - DO iold = 1, n - inew = PERM( iold ) - jpos = IW2( inew ) - 1 - ia = la - n + iold - A( jpos ) = A( ia ) - -! Set diag to value of diagonal entry (original numbering) - - DIAG( iold ) = A( ia ) - maxdag = MAX( maxdag, ABS( A( ia ) ) ) - IW( jpos ) = - iold - END DO - -! Compute addition to off-diagonal 1-norm - - addon = maxdag * machep ** 0.75 - -! Move sorted matrix to the end of the arrays - - ipos = nz1 - ia = la - iiw = liw - DO i = 1, nz1 - A( ia ) = A( ipos ) - IW( iiw ) = IW( ipos ) - ipos = ipos - 1 - ia = ia - 1 - iiw = iiw - 1 - END DO - - RETURN - -! Non executable statements - - 2040 FORMAT( ' *** Warning message from subroutine SILS_sort_entries ***', & - ' iflag =', I2 ) - 2050 FORMAT( I6, 'th non-zero (in row', I6, ' and column ', I6, ') ignored' ) - -! End of subroutine SILS_sort_entries - - END SUBROUTINE SILS_sort_entries - -!-*- S I L S _ S C H N A B E L _ E S K O W _ M A I N S U B R O U T I N E -*- - - SUBROUTINE SILS_schnabel_eskow_main( & - n, nz, A, la, IW, liw, PERM, NSTK, nsteps, maxfrt, NELIM, IW2, & - ICNTL, CNTL, INFO, DIAG, addon, iphase, maxchange, modstep ) - -! Perform the multifrontal factorization -! (modified version of MA27O from LANCELOT A) - -!----------------------------------------------- -! D u m m y A r g u m e n t s -!----------------------------------------------- - - INTEGER n, nz, la, liw, nsteps, maxfrt, iphase, modstep - REAL ( KIND = rp_ ) addon, maxchange - INTEGER ( KIND = ip_ ) ( KIND = ip_ ), DIMENSION( liw ) :: IW - INTEGER ( KIND = ip_ ) ( KIND = ip_ ), DIMENSION( n ) :: PERM - INTEGER ( KIND = ip_ ) ( KIND = ip_ ), DIMENSION( nsteps ) :: NSTK, NELIM - INTEGER ( KIND = ip_ ) ( KIND = ip_ ), DIMENSION( n ) :: IW2 - INTEGER ( KIND = ip_ ) ( KIND = ip_ ), DIMENSION( 30 ) :: ICNTL - INTEGER ( KIND = ip_ ) ( KIND = ip_ ), DIMENSION( 20 ) :: INFO - REAL ( KIND = rp_ ), DIMENSION( 5 ) :: CNTL - REAL ( KIND = rp_ ), DIMENSION( la ) :: A - REAL ( KIND = rp_ ), DIMENSION( n ) :: DIAG - -!----------------------------------------------- -! L o c a l V a r i a b l e s -!----------------------------------------------- - - INTEGER ( KIND = ip_ ) :: idummy, numorg, jnew, jj, j, laell, lapos2, ifr, iorg - INTEGER ( KIND = ip_ ) :: jdummy, j2, iell, jcol, npiv, newel, istk, i, azero - INTEGER ( KIND = ip_ ) :: ltopst, lnass, numstk, jfirst, nfront, jlast, j1, jnext - INTEGER ( KIND = ip_ ) :: iswap, ibeg, iexch, krow, ipos, liell, kmax, ioldps, iend - INTEGER ( KIND = ip_ ) :: kdummy, lnpiv, irow, jjj, jay, kk, ipiv, npivp1, jpiv - INTEGER ( KIND = ip_ ) :: istk2, iwpos, k, nblk, iass, nass, numass, iinput, ntotpv - INTEGER ( KIND = ip_ ) :: posfac, astk, astk2, apos, apos1, apos2, ainput, pivsiz - INTEGER ( KIND = ip_ ) :: ntwo, neig, ncmpbi, ncmpbr, nrlbdu, nirbdu - REAL ( KIND = rp_ ) :: amax, rmax, swap, amult, w1, onenrm, uu - - IF ( ICNTL( 2 ) > 0 .AND. ICNTL( 3 ) >= 2 ) THEN - WRITE( ICNTL( 2 ), 2000 ) DIAG( : MIN( n, 4 ) ) - WRITE( ICNTL( 2 ), 2100 ) iphase - END IF - -! Initialization. -! nblk is the number of block pivots used. - - nblk = 0 ; ntwo = 0 ; neig = 0 - ncmpbi = 0 ; ncmpbr = 0 ; maxfrt = 0 - nrlbdu = 0 ; nirbdu = 0 - -! A private variable uu is set to u, so that u will remain unaltered. - - uu = MIN( CNTL( 1 ), half ) - uu = MAX( uu, - half ) - - IW2 = 0 - -! iwpos is pointer to first free position for factors in IW. -! posfac is pointer for factors in A. At each pass through the -! major loop posfac initially points to the first free location -! in A and then is set to the position of the current pivot in A. -! istk is pointer to top of stack in IW. -! istk2 is pointer to bottom of stack in IW (needed by compress). -! astk is pointer to top of stack in A. -! astk2 is pointer to bottom of stack in A (needed by compress). -! iinput is pointer to current position in original rows in IW. -! ainput is pointer to current position in original rows in A. -! azero is pointer to last position zeroed in A. -! ntotpv is the total number of pivots selected. This is used -! to determine whether the matrix is singular. - - iwpos = 2 - posfac = 1 - istk = liw - nz + 1 ; istk2 = istk - 1 - astk = la - nz + 1 ; astk2 = astk - 1 - iinput = istk ; ainput = astk - azero = 0 - ntotpv = 0 - -! numass is the accumulated number of rows assembled so far. - - numass = 0 - -! Each pass through this main loop performs all the operations -! associated with one set of assembly/eliminations. - - DO iass = 1, nsteps - -! nass will be set to the number of fully assembled variables in -! current newly created element. - - nass = NELIM( iass ) - -! newel is a pointer into IW to control output of integer information -! for newly created element. - - newel = iwpos + 1 - -! Symbolically assemble incoming rows and generated stack elements -! ordering the resultant element according to permutation PERM. We -! assemble the stack elements first because these will already be ordered. - -! Set header pointer for merge of index lists. - - jfirst = n + 1 - -! Initialize number of variables in current front. - - nfront = 0 - numstk = NSTK( iass ) - ltopst = 1 - lnass = 0 - -! Jump if no stack elements are being assembled at this stage. - - IF ( numstk /= 0 ) THEN - j2 = istk - 1 - lnass = nass - ltopst = ( ( IW( istk ) + 1 ) * IW( istk ) ) / 2 - DO iell = 1, numstk - -! Assemble element iell placing the indices into a linked list in IW2 -! ordered according to PERM. - - jnext = jfirst - jlast = n + 1 - j1 = j2 + 2 - j2 = j1 - 1 + IW( j1 - 1 ) - -! Run through index list of stack element iell. - - DO jj = j1, j2 - j = IW( jj ) - IF ( IW2( j ) > 0 ) CYCLE - jnew = PERM( j ) - -! If variable was previously fully summed but was not pivoted on earlier -! because of numerical test, increment number of fully summed rows/columns -! in front. - - IF ( jnew <= numass ) nass = nass + 1 - -! Find position in linked list for new variable. Note that we start -! from where we left off after assembly of previous variable. - - DO idummy = 1, n - IF ( jnext == n + 1 ) EXIT - IF ( PERM( jnext ) > jnew ) EXIT - jlast = jnext - jnext = IW2( jlast ) - END DO - - IF ( jlast == n + 1 ) THEN - jfirst = j - ELSE - IW2( jlast ) = j - END IF - - IW2( j ) = jnext - jlast = j - -! Increment number of variables in the front. - - nfront = nfront + 1 - END DO - END DO - lnass = nass - lnass - END IF - -! Now incorporate original rows. Note that the columns in these rows need not -! be in order. We also perform a swap so that the diagonal entry is the first -! in its row. This allows us to avoid storing the inverse of array PERM. - - numorg = NELIM( iass ) - j1 = iinput - L150: DO iorg = 1, numorg - j = - IW( j1 ) - DO idummy = 1, liw - jnew = PERM( j ) - -! Jump if variable already included. - - IF ( IW2( j ) <= 0 ) THEN - -! Here we must always start our search at the beginning. - - jlast = n + 1 - jnext = jfirst - DO jdummy = 1, n - IF ( jnext == n + 1 ) EXIT - IF ( PERM( jnext ) > jnew ) EXIT - jlast = jnext - jnext = IW2( jlast ) - END DO - IF ( jlast == n + 1 ) THEN - jfirst = j - ELSE - IW2( jlast ) = j - END IF - IW2( j ) = jnext - -! Increment number of variables in front. - - nfront = nfront + 1 - END IF - - j1 = j1 + 1 - IF ( j1 > liw ) CYCLE L150 - j = IW( j1 ) - IF ( j < 0 ) CYCLE L150 - END DO - END DO L150 - -! Now run through linked list IW2 putting indices of variables in new -! element into IW and setting IW2 entry to point to the relative -! position of the variable in the new element. - - IF ( newel + nfront >= istk ) THEN - -! Compress IW. - - CALL SILS_compress( A, IW, istk, istk2, iinput, 2, ncmpbr, ncmpbi ) - IF ( newel + nfront >= istk ) THEN - INFO( 2 ) = liw + 1 + newel + nfront - istk - INFO( 1 ) = - 3 - RETURN - END IF - END IF - - j = jfirst - DO ifr = 1, nfront - newel = newel + 1 - IW( newel ) = j - jnext = IW2( j ) - IW2( j ) = newel - iwpos - 1 - j = jnext - END DO - -! Assemble reals into frontal matrix. - - maxfrt = MAX( maxfrt, nfront ) - IW( iwpos ) = nfront - -! First zero out frontal matrix as appropriate first checking to see -! if there is sufficient space. - - laell = ( ( nfront + 1 ) * nfront )/2 - apos2 = posfac + laell - 1 - IF ( numstk /= 0 ) lnass = lnass * ( 2 * nfront - lnass + 1 ) / 2 - IF ( posfac + lnass - 1 < astk ) THEN - IF ( apos2 < astk + ltopst - 1 ) GO TO 190 - END IF - -! Compress A. - - CALL SILS_compress( A, IW, astk, astk2, ainput, 1, ncmpbr, ncmpbi ) - -! Error returns - - IF ( posfac + lnass - 1 >= astk ) THEN - INFO( 1 ) = - 4 - INFO( 2 ) = la + MAX( posfac + lnass, apos2 - ltopst + 2 ) - astk - RETURN - END IF - IF ( apos2 >= astk + ltopst - 1 ) THEN - INFO( 1 ) = - 4 - INFO( 2 ) = la + MAX( posfac + lnass, apos2 - ltopst + 2 ) - astk - RETURN - END IF - - 190 CONTINUE - IF ( apos2 > azero ) THEN - apos = azero + 1 - lapos2 = MIN( apos2, astk - 1 ) - IF ( lapos2 >= apos ) THEN - A( apos : lapos2 ) = zero - END IF - azero = apos2 - END IF - -! Jump if there are no stack elements to assemble. - - IF ( numstk /= 0 ) THEN - -! Place reals corresponding to stack elements in correct positions in A. - - DO iell = 1, numstk - j1 = istk + 1 ; j2 = istk + IW( istk ) - DO jj = j1, j2 - irow = IW2( IW( jj ) ) - apos = posfac + SILS_idiag( nfront, irow ) - DO jjj = jj, j2 - j = IW( jjj ) - apos2 = apos + IW2( j ) - irow - A( apos2 ) = A( apos2 ) + A( astk ) - A( astk ) = zero - astk = astk + 1 - END DO - END DO - -! Increment stack pointer. - - istk = j2 + 1 - END DO - END IF - -! Incorporate reals from original rows. - - L280: DO iorg = 1, numorg - j = - IW( iinput ) - -! We can do this because the diagonal is now the first entry. - - irow = IW2( j ) - apos = posfac + SILS_idiag( nfront, irow ) - -! The following loop goes from 1 to nz because there may be duplicates. - - DO idummy = 1, nz - apos2 = apos + IW2( j ) - irow - A( apos2 ) = A( apos2 ) + A( ainput ) - ainput = ainput + 1 ; iinput = iinput + 1 - IF ( iinput > liw ) CYCLE L280 - j = IW( iinput ) - IF ( j < 0 ) CYCLE L280 - END DO - END DO L280 - -! Reset IW2 and numass. - - numass = numass + numorg - j1 = iwpos + 2 ; j2 = iwpos + nfront + 1 - IW2( IW( j1: j2 ) ) = 0 - -! Perform pivoting on assembled element. -! npiv is the number of pivots so far selected. -! lnpiv is the number of pivots selected after the last pass through -! the the following loop. - - lnpiv = - 1 ; npiv = 0 - - DO kdummy = 1, nass - IF ( npiv == nass ) EXIT - IF ( npiv == lnpiv ) EXIT - lnpiv = npiv ; npivp1 = npiv + 1 - -! jpiv is used as a flag to indicate when 2 by 2 pivoting has occurred -! so that ipiv is incremented correctly. - - jpiv = 1 - -! nass is maximum possible number of pivots. We either take the diagonal -! entry or the 2 by 2 pivot with the largest off-diagonal at each stage. -! Each pass through this loop tries to choose one pivot. - - DO ipiv = npivp1, nass - jpiv = jpiv - 1 - IF ( jpiv == 1 ) CYCLE - apos = posfac + SILS_idiag( nfront - npiv, ipiv - npiv ) - -! If the user has indicated that the matrix is definite, we do not need to -! test for stability but we do check to see if the pivot is non-zero or has -! changed sign. If it is zero, we exit with an error. If it has changed sign -! and u was set negative, then we again exit immediately. If the pivot changes -! sign and u was zero, we continue with the factorization but print a warning -! message - -! First check if pivot is positive. - - IF ( A( apos ) <= zero ) THEN - IF ( ICNTL( 2 ) > 0 .AND. ICNTL( 3 ) >= 2 ) & - WRITE( ICNTL( 2 ), 2050 ) npiv - iphase = 2 - END IF - amax = zero - rmax = amax - -! i is pivot row. - - i = IW( iwpos + ipiv + 1 ) - IF ( ICNTL( 2 ) > 0 .AND. ICNTL( 3 ) >= 2 ) THEN - WRITE( ICNTL( 2 ), 2060 ) npiv, i - WRITE( ICNTL( 2 ), 2010 ) A( apos ) - END IF - -! Find largest entry to right of diagonal in row of prospective pivot -! in the fully-summed part. Also record column of this largest entry. -! onenrm is set to 1-norm of off-diagonals in row. - - onenrm = 0.0 - j1 = apos + 1 ; j2 = apos + nfront - ipiv - DO jj = j1, j2 - jay = jj - j1 + 1 - IF ( iphase == 1 ) THEN - j = IW( iwpos + ipiv + jay + 1 ) - w1 = DIAG( j ) - A( jj ) * A( jj ) / A( apos ) - IF ( w1 <= addon ) THEN - IF ( ICNTL( 2 ) > 0 .AND. ICNTL( 3 ) >= 2 ) & - WRITE( ICNTL( 2 ), 2020 ) j, w1 - iphase = 2 - END IF - END IF - onenrm = onenrm + ABS( A( jj ) ) - rmax = MAX( ABS( A( jj ) ),rmax ) - IF ( jay <= nass - ipiv ) THEN - IF ( ABS( A( jj ) ) > amax ) amax = ABS( A( jj ) ) - END IF - END DO - -! Now calculate largest entry in other part of row. - - apos1 = apos - kk = nfront - ipiv - IF ( ICNTL( 2 ) > 0 .AND. ICNTL( 3 ) >= 2 ) & - WRITE( ICNTL( 2 ), 2070 ) npiv, i, onenrm - -! Jump if still in phase 1. - - IF ( iphase /= 1 ) THEN - -! Check to see if pivot must be increased - - IF ( A( apos ) < addon + onenrm ) THEN - - IF ( modstep == 0 ) modstep = ipiv - -! Adjust diagonal entry and record change in DIAG - - DIAG( i ) = addon + onenrm - A( apos ) - maxchange = MAX( maxchange, ABS( DIAG( i ) ) ) - IF ( ICNTL( 2 ) > 0 .AND. ICNTL( 3 ) >= 2 ) & - WRITE( ICNTL( 3 ), 2080 ) i, DIAG( i ) - A( apos ) = onenrm + addon - ELSE - DIAG( i ) = zero - END IF - ELSE - DIAG( i ) = zero - END IF - pivsiz = 1 ; irow = ipiv - npiv - -! Pivot has been chosen. If block pivot of order 2, pivsiz is equal to 2, -! otherwise pivsiz is 1. The following loop moves the pivot block to the top -! left hand corner of the frontal matrix. - - DO krow = 1, pivsiz - IF ( irow == 1 ) CYCLE - j1 = posfac + irow - j2 = posfac + nfront - npiv - 1 - IF ( j2 >= j1 ) THEN - apos2 = apos + 1 - -! Swap portion of rows whose column indices are greater than later row. - - DO jj = j1, j2 - swap = A( apos2 ) - A( apos2 ) = A( jj ) - A( jj ) = swap - apos2 = apos2 + 1 - END DO - END IF - j1 = posfac + 1 ; j2 = posfac + irow - 2 - apos2 = apos - kk = nfront - irow - npiv - -! Swap portion of rows/columns whose indices lie between the two rows. - - DO jj = j2, j1, - 1 - kk = kk + 1 - apos2 = apos2 - kk - swap = A( apos2 ) - A( apos2 ) = A( jj ) - A( jj ) = swap - END DO - IF ( npiv /= 0 ) THEN - apos1 = posfac - kk = kk + 1 - apos2 = apos2 - kk - -! Swap portion of columns whose indices are less than earlier row. - - DO jj = 1, npiv - kk = kk + 1 - apos1 = apos1 - kk ; apos2 = apos2 - kk - swap = A( apos2 ) - A( apos2 ) = A( apos1 ) - A( apos1 ) = swap - END DO - END IF - -! Swap diagonals and integer indexing information - - swap = A( apos ) - A( apos ) = A( posfac ) - A( posfac ) = swap - ipos = iwpos + npiv + 2 - iexch = iwpos + irow + npiv + 1 - iswap = IW( ipos ) - IW( ipos ) = IW( iexch ) - IW( iexch ) = iswap - END DO - -! Perform the elimination using entry (ipiv,ipiv) as pivot. -! We store u and D(inverse). - - A( posfac ) = one / A( posfac ) - IF ( A( posfac ) < zero ) neig = neig + 1 - j1 = posfac + 1 ; j2 = posfac + nfront - npiv - 1 - IF ( j2 >= j1 ) THEN - ibeg = j2 + 1 - DO jj = j1, j2 - amult = - A( jj ) * A( posfac ) - -! Update diag array. - - j = IW( iwpos + npiv + jj - j1 + 3 ) - DIAG( j ) = DIAG( j ) + amult * A( jj ) - IF ( ICNTL( 2 ) > 0 .AND. ICNTL( 3 ) >= 2 ) & - WRITE( ICNTL( 2 ), 2090 ) j, DIAG( j ) - iend = ibeg + nfront - ( npiv + jj - j1 + 2 ) - -!DIR$ IVDEP - DO irow = ibeg, iend - jcol = jj + irow - ibeg - A( irow ) = A( irow ) + amult * A( jcol ) - END DO - ibeg = iend + 1 - A( jj ) = amult - END DO - END IF - npiv = npiv + 1 - ntotpv = ntotpv + 1 - jpiv = 1 - posfac = posfac + nfront - npiv + 1 - END DO - END DO - IF ( npiv /= 0 ) nblk = nblk + 1 - ioldps = iwpos ; iwpos = iwpos + nfront + 2 - IF ( npiv /= 0 ) THEN - IF ( npiv <= 1 ) THEN - IW( ioldps ) = - IW( ioldps ) - DO k = 1, nfront - j1 = ioldps + k - IW( j1 ) = IW( j1 + 1 ) - END DO - iwpos = iwpos - 1 - ELSE - IW( ioldps + 1 ) = npiv - -! Copy remainder of element to top of stack - - END IF - END IF - liell = nfront - npiv - IF ( liell /= 0 .AND. iass /= nsteps ) THEN - - IF ( iwpos + liell >= istk ) & - CALL SILS_compress( A, IW, istk, istk2, iinput, 2, ncmpbr, ncmpbi ) - istk = istk - liell - 1 - IW( istk ) = liell - j1 = istk ; kk = iwpos - liell - 1 - -! DIR$ IVDEP - DO k = 1, liell - j1 = j1 + 1 - kk = kk + 1 - IW( j1 ) = IW( kk ) - END DO - -! We copy in reverse direction to avoid overwrite problems. - - laell = ( ( liell + 1 ) * liell ) / 2 - kk = posfac + laell - IF ( kk == astk ) THEN - astk = astk - laell - ELSE - -! The move and zeroing of array A is performed with two loops so -! that they may be vectorized - - kmax = kk - 1 - -!DIR$ IVDEP - DO k = 1, laell - kk = kk - 1 - astk = astk - 1 - A( astk ) = A( kk ) - END DO - kmax = MIN( kmax, astk - 1 ) - A( kk : kmax ) = zero - END IF - azero = MIN( azero, astk - 1 ) - END IF - IF ( npiv == 0 ) iwpos = ioldps - END DO - -! End of loop on tree nodes. - - IW( 1 ) = nblk - IF ( ntwo > 0 ) IW( 1 ) = - nblk - nrlbdu = posfac - 1 ; nirbdu = iwpos - 1 - - IF ( ntotpv /= n ) THEN - INFO( 1 ) = 3 - INFO( 2 ) = ntotpv - END IF - INFO( 9 ) = nrlbdu - INFO( 10 ) = nirbdu - INFO( 12 ) = ncmpbr - INFO( 13 ) = ncmpbi - INFO( 14 ) = ntwo - INFO( 15 ) = neig - - RETURN - - 2000 FORMAT( ' Diag ', 2ES24.16, /, ' ', 2ES24.16 ) - 2010 FORMAT( ' Pivot has value ', ES24.16 ) - 2020 FORMAT( ' Phase 2, j, w1 ', I6, ES24.16 ) - 2050 FORMAT( ' Negative pivot encountered at stage', I8 ) - 2060 FORMAT( ' Pivot, pivot row', 2I6 ) - 2070 FORMAT( ' npiv, i, onenrm ', 3I6 ) - 2080 FORMAT( ' i, Perturbation ', I6, ES12.4 ) - 2090 FORMAT( ' j, DIAG ', I6, ES12.4 ) - 2100 FORMAT( ' Phase = ', I1 ) - -! End of subroutine SILS_schnabel_eskow_main - - END SUBROUTINE SILS_schnabel_eskow_main - -!-*-*-*-*-*-*- S I L S _ C O M P R E S S S U B R O U T I N E -*-*-*-*-*-*- - - SUBROUTINE SILS_compress( A, IW, j1, j2, itop, ireal, ncmpbr, ncmpbi ) - -! Compress the data structures (modified version of MA27P from LANCELOT A) - -!----------------------------------------------- -! D u m m y A r g u m e n t s -!----------------------------------------------- - - INTEGER j1, j2, itop, ireal, ncmpbr, ncmpbi - INTEGER ( KIND = ip_ ) ( KIND = ip_ ), DIMENSION( * ) :: IW - REAL ( KIND = rp_ ), DIMENSION( * ) :: A - -!----------------------------------------------- -! L o c a l V a r i a b l e s -!----------------------------------------------- - - INTEGER ( KIND = ip_ ) :: jj, ipos - - ipos = itop - 1 - IF ( j2 /= ipos ) THEN - IF ( ireal /= 2 ) THEN - ncmpbr = ncmpbr + 1 - DO jj = j2, j1, - 1 - A( ipos ) = A( jj ) - ipos = ipos - 1 - END DO - ELSE - ncmpbi = ncmpbi + 1 - DO jj = j2, j1, - 1 - IW( ipos ) = IW( jj ) - ipos = ipos - 1 - END DO - END IF - j2 = itop - 1 ; j1 = ipos + 1 - END IF - RETURN - -! End of subroutine SILS_compress - - END SUBROUTINE SILS_compress - -!-*-*-*-*-*-*-*- S I L S _ C O M P R E S S F U N C T I O N -*-*-*-*-*-*-*- - - FUNCTION SILS_idiag( ix, iy ) - -! Obtain the displacement from the start of the assembled matrix (of order IX) -! of the diagonal entry in its row IY - -!----------------------------------------------- -! D u m m y A r g u m e n t s -!----------------------------------------------- - - INTEGER ( KIND = ip_ ) :: SILS_idiag - INTEGER ( KIND = ip_ ) ( KIND = ip_ ), INTENT( in ) :: ix, iy - - SILS_idiag = ( ( iy - 1 ) * ( 2 * ix - iy + 2 ) ) / 2 - RETURN - -! End of function SILS_idiag - - END FUNCTION SILS_idiag - -! End of SILS_factorize - - END SUBROUTINE SILS_factorize - -!-*-*-*-*-*-*-*-*-*- S I L S _ S O L V E S U B R O U T I N E -*-*-*-*-*-*-* - - SUBROUTINE SILS_solve( MATRIX, FACTORS, X, CONTROL, SINFO ) - -! =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- -! Solve the linear system using the factors obtained in the factorization -! =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- - -! Dummy arguments - - TYPE( SMT_type ), INTENT( IN ) :: MATRIX - TYPE( SILS_factors ), INTENT( IN ) :: FACTORS - REAL ( KIND = rp_ ), INTENT( INOUT ) :: X( FACTORS%n ) - TYPE( SILS_control ), INTENT( IN ) :: CONTROL - TYPE( SILS_sinfo ), INTENT( OUT ) :: SINFO - -! Local variables - - INTEGER ( KIND = ip_ ) :: la - INTEGER ( KIND = ip_ ) :: ICNTL( 30 ), INFO( 20 ) - -! Transfer CONTROL parameters - - INTEGER ( KIND = ip_ ) :: FACTORS_iw1( FACTORS%dim_iw1 ) - REAL ( KIND = rp_ ) :: FACTORS_w( FACTORS%maxfrt ) - - INTEGER ( KIND = ip_ ) ( KIND = ip_ ), ALLOCATABLE, DIMENSION( : ) :: FACTORS_iw - REAL ( KIND = rp_ ), ALLOCATABLE, DIMENSION( : ) :: FACTORS_val - - ICNTL( 1 ) = CONTROL%lp - ICNTL( 2 ) = CONTROL%mp - ICNTL( 3 ) = CONTROL%ldiag - ICNTL( 4 : 30 ) = CONTROL%ICNTL( 4 : 30 ) - - IF ( CONTROL%pivoting == 4 ) THEN - la = SIZE( FACTORS%val ) - MATRIX%n - ELSE - la = SIZE( FACTORS%val ) - END IF - FACTORS_iw => FACTORS%iw - FACTORS_val => FACTORS%val( : la ) - - CALL MA27CD( FACTORS%n, FACTORS_val, la, FACTORS_iw, & - SIZE( FACTORS%iw ), FACTORS_w, FACTORS%maxfrt, X, & - FACTORS_iw1, FACTORS%dim_iw1, ICNTL, INFO ) - SINFO%flag = INFO( 1 ) - - RETURN - -! End of SILS_solve - - END SUBROUTINE SILS_solve - -!-*-**-*- S I L S _ S O L V E _ M U L T I P L E S U B R O U T I N E -*-*-*- - - SUBROUTINE SILS_solve_multiple( MATRIX, FACTORS, X, CONTROL, SINFO ) - -! =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- -! Solve the linear system using the factors obtained in the factorization -! =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- - -! Dummy arguments - - TYPE( SMT_type ), INTENT( IN ) :: MATRIX - TYPE( SILS_factors ), INTENT( IN ) :: FACTORS - REAL ( KIND = rp_ ), INTENT( INOUT ), DIMENSION( : , : ) :: X - TYPE( SILS_control ), INTENT( IN ) :: CONTROL - TYPE( SILS_sinfo ), INTENT( OUT ) :: SINFO - -! Local variables - - INTEGER ( KIND = ip_ ) :: la, i - INTEGER ( KIND = ip_ ) :: ICNTL( 30 ), INFO( 20 ) - -! Transfer CONTROL parameters - - INTEGER ( KIND = ip_ ) :: FACTORS_iw1( FACTORS%dim_iw1 ) - REAL ( KIND = rp_ ) :: FACTORS_w( FACTORS%maxfrt ) - - INTEGER ( KIND = ip_ ) ( KIND = ip_ ), ALLOCATABLE, DIMENSION( : ) :: FACTORS_iw - REAL ( KIND = rp_ ), ALLOCATABLE, DIMENSION( : ) :: FACTORS_val - - ICNTL( 1 ) = CONTROL%lp - ICNTL( 2 ) = CONTROL%mp - ICNTL( 3 ) = CONTROL%ldiag - ICNTL( 4 : 30 ) = CONTROL%ICNTL( 4 : 30 ) - - IF ( CONTROL%pivoting == 4 ) THEN - la = SIZE( FACTORS%val ) - MATRIX%n - ELSE - la = SIZE( FACTORS%val ) - END IF - FACTORS_iw => FACTORS%iw - FACTORS_val => FACTORS%val( : la ) - - DO i = 1, SIZE( X, 2 ) - CALL MA27CD( FACTORS%n, FACTORS_val, la, FACTORS_iw, & - SIZE( FACTORS%iw ), FACTORS_w, FACTORS%maxfrt, X( : , i ), & - FACTORS_iw1, FACTORS%dim_iw1, ICNTL, INFO ) - END DO - SINFO%flag = INFO( 1 ) - - - RETURN - -! End of SILS_solve_multiple - - END SUBROUTINE SILS_solve_multiple - -!-*-*-*-*- S I L S _ S O L V E _ R E F I N E S U B R O U T I N E -*-*-*- - - SUBROUTINE SILS_solve_refine( MATRIX, FACTORS, X, CONTROL, SINFO, RHS ) - -! =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- -! Solve the linear system using the factors obtained in the factorization -! =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- - -! Dummy arguments - - TYPE( SMT_type ), INTENT( IN ) :: MATRIX - TYPE( SILS_factors ), INTENT( IN ) :: FACTORS - REAL ( KIND = rp_ ), INTENT( INOUT ) :: X( FACTORS%n ) - TYPE( SILS_control ), INTENT( IN ) :: CONTROL - TYPE( SILS_sinfo ), INTENT( OUT ) :: SINFO - REAL ( KIND = rp_ ), INTENT( IN ) :: RHS( FACTORS%n ) - -! Local variables - - INTEGER ( KIND = ip_ ) :: la - INTEGER ( KIND = ip_ ) :: ICNTL( 30 ), INFO( 20 ) - INTEGER ( KIND = ip_ ) ( KIND = ip_ ), ALLOCATABLE, DIMENSION( : ) :: FACTORS_iw - REAL ( KIND = rp_ ), ALLOCATABLE, DIMENSION( : ) :: FACTORS_val, DIAG - - INTEGER ( KIND = ip_ ) ( KIND = ip_ ), ALLOCATABLE, DIMENSION( : ) :: FACTORS_iw1 - REAL ( KIND = rp_ ), ALLOCATABLE, DIMENSION( : ) :: FACTORS_w -! REAL ( KIND = rp_ ), ALLOCATABLE, DIMENSION( : ) :: FACTORS_r - -! INTEGER ( KIND = ip_ ) :: FACTORS_iw1( FACTORS%dim_iw1 ) -! REAL ( KIND = rp_ ) :: FACTORS_w( FACTORS%maxfrt ) - REAL ( KIND = rp_ ) :: FACTORS_r( FACTORS%n ) - -! Transfer CONTROL parameters - - ICNTL( 1 ) = CONTROL%lp - ICNTL( 2 ) = CONTROL%mp - ICNTL( 3 ) = CONTROL%ldiag - ICNTL( 4 : 30 ) = CONTROL%ICNTL( 4 : 30 ) - - FACTORS_iw => FACTORS%iw - FACTORS_iw1 => FACTORS%iw1 - FACTORS_w => FACTORS%w -! FACTORS_r => FACTORS%r - - IF ( CONTROL%pivoting == 4 ) THEN - la = SIZE( FACTORS%val ) - MATRIX%n - FACTORS_val => FACTORS%val( : la ) - DIAG => FACTORS%val( la + 1 : ) - CALL SILS_residual( MATRIX%val, MATRIX%row, MATRIX%col, FACTORS_r, & - DIAG = DIAG ) - ELSE - la = SIZE( FACTORS%val ) - FACTORS_val => FACTORS%val - CALL SILS_residual( MATRIX%val, MATRIX%row, MATRIX%col, FACTORS_r ) - END IF - - CALL MA27CD( FACTORS%n, FACTORS_val, la, FACTORS_iw, & - SIZE( FACTORS%iw ), FACTORS_w, FACTORS%maxfrt, FACTORS_r, & - FACTORS_iw1, FACTORS%dim_iw1, ICNTL, INFO ) - SINFO%flag = INFO( 1 ) - X = X - FACTORS_r - - RETURN - - CONTAINS - - SUBROUTINE SILS_residual( A, IRN, ICN, R, DIAG ) - -! ==================== -! Calculate r = Ax - b -! ==================== - -! Dummy arguments - - INTEGER ( KIND = ip_ ) ( KIND = ip_ ), DIMENSION( : ) :: IRN, ICN - REAL ( KIND = rp_ ), DIMENSION( : ) :: A, R - REAL ( KIND = rp_ ), OPTIONAL, DIMENSION( : ) :: DIAG - -! Local variables - - INTEGER ( KIND = ip_ ) :: i, j, k - - R( : MATRIX%n ) = - RHS( : MATRIX%n ) - DO k = 1, MATRIX%ne - i = IRN( k ) - j = ICN( k ) - IF ( MIN( i, j ) >= 1 .AND. MAX( i, j ) <= MATRIX%n ) THEN - R( i ) = R( i ) + A( k ) * X( j ) - IF ( i /= j ) R( j ) = R( j ) + A( k ) * X( i ) - END IF - END DO - IF ( PRESENT( DIAG ) ) THEN - R = R + DIAG * X - END IF - - RETURN - -! End of SILS_residual - - END SUBROUTINE SILS_residual - - END SUBROUTINE SILS_solve_refine - -!- S I L S _ S O L V E _ R E F I N E _ M U T I P L E S U B R O U T I N E - - - SUBROUTINE SILS_solve_refine_multiple( MATRIX, FACTORS, X, CONTROL, & - SINFO, RHS ) - -! =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- -! Solve the linear system using the factors obtained in the factorization -! =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- - -! Dummy arguments - - TYPE( SMT_type ), INTENT( IN ) :: MATRIX - TYPE( SILS_factors ), INTENT( IN ) :: FACTORS - REAL ( KIND = rp_ ), INTENT( INOUT ), DIMENSION( : , : ) :: X - TYPE( SILS_control ), INTENT( IN ) :: CONTROL - TYPE( SILS_sinfo ), INTENT( OUT ) :: SINFO - REAL ( KIND = rp_ ), INTENT( IN ), DIMENSION( : , : ) :: RHS - -! Local variables - - INTEGER ( KIND = ip_ ) :: i - - DO i = 1, SIZE( X, 2 ) - CALL SILS_solve_refine( MATRIX, FACTORS, X( : , i ), CONTROL, SINFO, & - RHS( : , i ) ) - END DO - - RETURN - - END SUBROUTINE SILS_solve_refine_multiple - -!-*-*-*-*-*-*-*- S I L S _ F I N A L I Z E S U B R O U T I N E -*-*-*-*-*- - - SUBROUTINE SILS_finalize( FACTORS, CONTROL, info ) - -! =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- -! Deallocate all currently allocated arrays -! =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- - -! Dummy arguments - - TYPE( SILS_factors ), INTENT( INOUT ) :: FACTORS - TYPE( SILS_control ), INTENT( IN ) :: CONTROL - INTEGER ( KIND = ip_ ) ( KIND = ip_ ), INTENT( OUT ) :: info - - INTEGER ( KIND = ip_ ) :: dealloc_stat - - info = 0 - - IF ( ALLOCATED( FACTORS%keep ) ) THEN - DEALLOCATE( FACTORS%keep, STAT = dealloc_stat ) - IF ( dealloc_stat /= 0 ) info = dealloc_stat - END IF - - IF ( ALLOCATED( FACTORS%iw ) ) THEN - DEALLOCATE( FACTORS%iw, STAT = dealloc_stat ) - IF ( dealloc_stat /= 0 ) info = dealloc_stat - END IF - - IF ( ALLOCATED( FACTORS%val ) ) THEN - DEALLOCATE( FACTORS%val, STAT = dealloc_stat ) - IF ( dealloc_stat /= 0 ) info = dealloc_stat - END IF - - IF ( ALLOCATED( FACTORS%w ) ) THEN - DEALLOCATE( FACTORS%w, STAT = dealloc_stat ) - IF ( dealloc_stat /= 0 ) info = dealloc_stat - END IF - - IF ( ALLOCATED( FACTORS%r ) ) THEN - DEALLOCATE( FACTORS%r, STAT = dealloc_stat ) - IF ( dealloc_stat /= 0 ) info = dealloc_stat - END IF - - IF ( ALLOCATED( FACTORS%iw1 ) ) THEN - DEALLOCATE( FACTORS%iw1, STAT = dealloc_stat ) - IF ( dealloc_stat /= 0 ) info = dealloc_stat - END IF - - IF ( info /= 0 ) THEN - IF ( CONTROL%ldiag > 0 .AND. CONTROL%lp > 0 ) & - WRITE( CONTROL%lp, '( A, I0 )') & - ' Error return from SILS_finalize: deallocate failed with STAT=', info - END IF - - RETURN - -! End of SILS_finalize - - END SUBROUTINE SILS_finalize - -!-*-*-*-*-*-*-*- S I L S _ E N Q U I R E S U B R O U T I N E -*-*-*-*-*-*- - - SUBROUTINE SILS_enquire( FACTORS, PERM, PIVOTS, D, PERTURBATION ) - -! =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- -! Interogate the factorization to obtain additional information -! =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- - -! Dummy arguments - - TYPE( SILS_factors ), INTENT( IN ) :: FACTORS - INTEGER ( KIND = ip_ ) ( KIND = ip_ ), INTENT( OUT ), OPTIONAL, DIMENSION( FACTORS%n ) :: PIVOTS - INTEGER ( KIND = ip_ ) ( KIND = ip_ ), INTENT( OUT ), OPTIONAL, DIMENSION( FACTORS%n ) :: PERM - REAL ( KIND = rp_ ), INTENT( OUT ), OPTIONAL, DIMENSION( 2, FACTORS%n ) :: D - REAL ( KIND = rp_ ), INTENT( OUT ), OPTIONAL, & - DIMENSION( FACTORS%n ) :: PERTURBATION - -! Local variables - - INTEGER ( KIND = ip_ ) :: block, i, ka, kd, kp, kw, ncols, nrows - - IF ( present( PERM ) ) THEN - PERM = FACTORS%keep( 1 : FACTORS%n ) - ENDIF - - IF ( present( PERTURBATION ) ) THEN - IF ( FACTORS%pivoting == 4 ) THEN - PERTURBATION = FACTORS%val( SIZE( FACTORS%val ) - FACTORS%n + 1 : ) - ELSE - PERTURBATION = zero - END IF - ENDIF - - ka = 1 ; kd = 0 ; kp = 0 ; kw = 2 - IF ( PRESENT( D ) ) D = 0 - DO block = 1, abs( FACTORS%iw( 1 ) ) - ncols = FACTORS%iw( kw ) - IF ( ncols > 0 ) THEN - kw = kw + 1 - nrows = FACTORS%iw( kw ) - ELSE - ncols = - ncols - nrows = 1 - END IF - IF ( PRESENT( PIVOTS ) ) THEN - PIVOTS( kp + 1 : kp + nrows ) = FACTORS%iw( kw + 1 : kw + nrows ) - kp = kp + nrows - END IF - IF ( PRESENT( d ) ) THEN - DO i = 1, nrows - kd = kd + 1 - D( 1, kd ) = FACTORS%val( ka ) - IF ( FACTORS%iw( kw + i ) < 0 ) D( 2, kd ) = FACTORS%val( ka + 1 ) - ka = ka + ncols + 1 - i - END DO - END IF - kw = kw + ncols + 1 - END DO - - RETURN - -! End of SILS_enquire - - END SUBROUTINE SILS_enquire - -!-*-*-*-*-*-*-*- S I L S _ A L T E R _ D S U B R O U T I N E -*-*-*-*-*-*- - - SUBROUTINE SILS_alter_d( FACTORS, D, info ) - -! =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- -! Alter the diagonal blocks -! =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- - -! Dummy arguments - - TYPE( SILS_factors ), INTENT( INOUT ) :: FACTORS - REAL ( KIND = rp_ ), INTENT( IN ) :: D( 2, FACTORS%n ) - INTEGER ( KIND = ip_ ) ( KIND = ip_ ), INTENT( OUT ) :: info - -! Local variables - - INTEGER ( KIND = ip_ ) :: block, i, ka, kd, kw, ncols, nrows - - info = 0 - ka = 1 ; kd = 0 ; kw = 2 - DO block = 1, abs( FACTORS%iw( 1 ) ) - ncols = FACTORS%iw( kw ) - IF ( ncols > 0 ) THEN - kw = kw +1 - nrows = FACTORS%iw( kw ) - ELSE - ncols = - ncols - nrows = 1 - END IF - DO i = 1, nrows - kd = kd + 1 - FACTORS%val( ka ) = D( 1, kd ) - IF ( FACTORS%iw( kw + i ) < 0 ) THEN - FACTORS%val( ka + 1 ) = D( 2, kd ) - ELSE - IF ( D( 2, kd ) /= 0 ) info = kd - END IF - ka = ka + ncols + 1 - i - END DO - kw = kw + ncols + 1 - END DO - - RETURN - -! End of SILS_alter_d - - END SUBROUTINE SILS_alter_d - -!-*-*-*-*-*-*- S I L S _ P A R T _ S O L V E S U B R O U T I N E -*-*-*-*- - - SUBROUTINE SILS_part_solve( FACTORS, CONTROL, part, X, info ) - -! =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- -! Solve a system involving individual factors -! =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- - -! Dummy arguments - - TYPE( SILS_factors ), INTENT( INOUT ) :: FACTORS - TYPE( SILS_control ), INTENT( IN ) :: CONTROL - CHARACTER, INTENT( IN ) :: part - REAL ( KIND = rp_ ), INTENT( INOUT ), DIMENSION( FACTORS%n ) :: X - INTEGER ( KIND = ip_ ) ( KIND = ip_ ), INTENT( OUT ) :: info - -! Local variables - - INTEGER ( KIND = ip_ ) :: ICNTL( 30 ) - -! Transfer CONTROL parameters - - ICNTL( 1 ) = CONTROL%lp - ICNTL( 2 ) = CONTROL%mp - ICNTL( 3 ) = CONTROL%ldiag - ICNTL( 4 : 30 ) = CONTROL%ICNTL( 4 : 30 ) - - info = 0 - - IF ( ALLOCATED( FACTORS%w ) ) THEN - IF ( SIZE( FACTORS%w ) 0 .AND. CONTROL%lp > 0 ) & - WRITE( CONTROL%lp, 2000 ) 'deallocate', info - RETURN - END IF - ALLOCATE( FACTORS%w( FACTORS%maxfrt ), STAT = info ) - IF ( info /= 0 ) THEN - IF ( CONTROL%ldiag > 0 .AND. CONTROL%lp > 0 ) & - WRITE( CONTROL%lp, 2000 ) 'allocate', info - RETURN - END IF - END IF - ELSE - ALLOCATE( FACTORS%w( FACTORS%maxfrt ), STAT = info ) - IF ( info /= 0 ) THEN - IF ( CONTROL%ldiag > 0 .AND. CONTROL%lp > 0 ) & - WRITE( CONTROL%lp, 2000 ) 'allocate', info - RETURN - END IF - END IF - -! Solution involving the lower-triangular factor - - IF ( part=='L') THEN - CALL MA27QD( FACTORS%n, FACTORS%val, SIZE( FACTORS%val ), & - FACTORS%iw( 2 : ), SIZE( FACTORS%iw ) - 1, & - FACTORS%w, FACTORS%maxfrt, X, FACTORS%iw1, & - ABS( FACTORS%iw( 1 ) ), FACTORS%latop, ICNTL ) - -! Solution involving the block-diagonal factor - - ELSE IF ( part=='D') THEN - CALL SILS_solve_d( FACTORS%val, SIZE( FACTORS%val ), & - FACTORS%iw, SIZE( FACTORS%iw ) ) - -! Solution involving the upper-triangular factor - - ELSE IF ( part=='U') THEN - CALL SILS_solve_u( FACTORS%n, FACTORS%val, SIZE( FACTORS%val ), & - FACTORS%iw, SIZE( FACTORS%iw ), FACTORS%iw1, & - FACTORS%w, FACTORS%maxfrt, FACTORS%latop, & - ICNTL ) - END IF - - RETURN - -! Non-executable statement - - 2000 FORMAT( ' Error return from SILS_part_solve: ', A, ' failed', & - ' with STAT = ', I0 ) - - CONTAINS - -!-*-*-*-*-*-*-*- S I L S _ S O L V E _ d S U B R O U T I N E -*-*-*-*-*-*- - - SUBROUTINE SILS_solve_d( a, la, iw, liw ) - -! =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- -! Solve a system involving the block-diagonal factors -! =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- - -! Dummy arguments - - INTEGER ( KIND = ip_ ) :: la, liw - REAL ( KIND = rp_ ), INTENT( IN ), DIMENSION( la ) :: A - INTEGER ( KIND = ip_ ) ( KIND = ip_ ), INTENT( IN ), DIMENSION( liw ) :: IW - -! Local variables - - INTEGER ( KIND = ip_ ) :: block, i, j, j1, ka, kw, ncols, nrows - REAL ( KIND = rp_ ) :: xj - - ka = 1 ; kw = 2 - DO block = 1, ABS( IW( 1 ) ) - ncols = IW( kw ) - IF ( ncols > 0 ) THEN - kw = kw + 1 - nrows = IW( kw ) - ELSE - ncols = - ncols - nrows = 1 - END IF - i = 1 - DO - IF ( i > nrows ) EXIT - j = IW( kw + i ) - IF ( j > 0 ) THEN - X( j ) = A( ka ) * X( j ) - ELSE - j = - j - j1 = IW( kw + i + 1 ) - xj = X( j ) - X( j ) = A( ka ) * xj + A( ka + 1 ) * X( j1 ) - X( j1 ) = A( ka + 1 ) * xj + A( ka + ncols + 1 - i ) * X( j1 ) - ka = ka + ncols + 1 - i - i = i + 1 - END IF - ka = ka + ncols + 1 - i - i = i + 1 - END DO - kw = kw + ncols + 1 - END DO - - RETURN - -! End of SILS_solve_d - - END SUBROUTINE SILS_solve_d - -!-*-*-*-*-*-*-*- S I L S _ S O L V E _ u S U B R O U T I N E -*-*-*-*-*-*- - - SUBROUTINE SILS_solve_u( n, A, la, IW, liw, IW2, W, lw, latop, ICNTL ) - -! =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- -! Solve a system involving the upper triangular factors -! =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- - -! Dummy arguments - - INTEGER ( KIND = ip_ ) ( KIND = ip_ ), INTENT( IN ) :: n, la, liw, lw, latop - INTEGER ( KIND = ip_ ) ( KIND = ip_ ), DIMENSION( liw ), INTENT( IN ) :: IW - INTEGER ( KIND = ip_ ) ( KIND = ip_ ), DIMENSION( ABS( IW( 1 ) ) ), INTENT( IN ) :: IW2 - REAL ( KIND = rp_ ), DIMENSION( la ), INTENT( IN ) :: A - REAL ( KIND = rp_ ), DIMENSION( lw ), INTENT( OUT ) :: W - INTEGER ( KIND = ip_ ) ( KIND = ip_ ), INTENT( IN ) :: ICNTL( 30 ) - -! Local variables - - INTEGER ( KIND = ip_ ) :: apos, apos2, i1x, i2x, iblk, ifr, iipiv, iix, ilvl, ipiv - INTEGER ( KIND = ip_ ) :: ipos, ix, ist, j, j1, j2, jj, jj1, jj2, jpiv, jpos, k - INTEGER ( KIND = ip_ ) :: liell, loop, npiv - REAL ( KIND = rp_ ) :: x1, x2 - INTEGER ( KIND = ip_ ) ( KIND = ip_ ), PARAMETER :: ifrlvl = 5 - - apos = latop + 1 - npiv = 0 - iblk = ABS( IW( 1 ) ) + 1 - -! Run through block pivot rows in the reverse order - - DO loop = 1, n - IF ( npiv > 0 ) GO TO 10 - iblk = iblk - 1 - IF ( iblk < 1 ) EXIT - ipos = IW2( iblk ) - liell = - IW( ipos + 1 ) - npiv = 1 - IF ( liell <= 0 ) THEN - liell = - liell - ipos = ipos + 1 - npiv = IW( ipos + 1 ) - END IF - jpos = ipos + npiv - j2 = ipos + liell - ilvl = MIN( 10, npiv ) + 10 - IF ( liell < ICNTL( ifrlvl + ilvl ) ) GO TO 10 - -! Perform operations using direct addressing - - j1 = ipos + 1 - -! Load appropriate components of X into W - - ifr = 0 - DO jj = j1, j2 - j = AB( IW( jj + 1 ) ) - ifr = ifr + 1 - W( ifr ) = X( j ) - END DO - -! Perform eliminations - - jpiv = 1 - DO iipiv = 1, npiv - jpiv = jpiv - 1 - IF ( jpiv == 1 ) CYCLE - ipiv = npiv - iipiv + 1 - - IF ( ipiv /= 1 ) THEN - -! Perform back-substitution operations with 2 by 2 pivot - - IF ( IW( jpos ) < 0 ) THEN - jpiv = 2 - apos2 = apos - ( liell + 1 - ipiv ) - apos = apos2 - ( liell + 2 - ipiv ) - ist = ipiv + 1 - x1 = W( ipiv - 1 ) - x2 = W( ipiv ) - jj1 = apos + 2 - jj2 = apos2 + 1 - DO j = ist, liell - x1 = x1 + W( j ) * A( jj1 ) - x2 = x2 + W( j ) * A( jj2 ) - jj1 = jj1 + 1 - jj2 = jj2 + 1 - END DO - W( ipiv - 1 ) = x1 - W( ipiv ) = x2 - jpos = jpos - 2 - CYCLE - END IF - END IF - -! Perform back-substitution using 1 by 1 pivot - - jpiv = 1 - apos = apos - ( liell + 1 - ipiv ) - ist = ipiv + 1 - x1 = W( ipiv ) - jj1 = apos + 1 - DO j = ist, liell - x1 = x1 + A( jj1 ) * W( j ) - jj1 = jj1 + 1 - END DO - W( ipiv ) = x1 - jpos = jpos - 1 - END DO - -! Reload working vector into solution vector - - ifr = 0 - DO jj = j1, j2 - j = ABS( IW( jj + 1 ) ) - ifr = ifr + 1 - X( j ) = W( ifr ) - END DO - npiv = 0 - CYCLE - -! Perform operations using indirect addressing - - 10 CONTINUE - IF ( npiv /= 1 ) THEN - -! Perform operations with 2 by 2 pivot - - IF ( IW( jpos ) < 0 ) THEN - npiv = npiv - 2 - apos2 = apos - ( j2 - jpos + 1 ) - apos = apos2 - ( j2 - jpos + 2 ) - i1x = - IW( jpos ) - i2x = IW( jpos + 1 ) - x1 = X( i1x ) - x2 = X( i2x ) - j1 = jpos + 1 - jj1 = apos + 2 - jj2 = apos2 + 1 - DO j = j1, j2 - ix = ABS( IW( j + 1 ) ) - x1 = x1 + X( ix ) * A( jj1 ) - x2 = x2 + X( ix ) * A( jj2 ) - jj1 = jj1 + 1 - jj2 = jj2 + 1 - END DO - X( i1x ) = x1 - X( i2x ) = x2 - jpos = jpos - 2 - CYCLE - END IF - END IF - -! Perform back-substitution using 1 by 1 pivot - - npiv = npiv - 1 - apos = apos - ( j2 - jpos + 1 ) - iix = IW( jpos + 1 ) - x1 = X( iix ) - j1 = jpos + 1 - k = apos + 1 - DO j = j1, j2 - ix = ABS( IW( j + 1 ) ) - x1 = x1 + A( k ) * X( ix ) - k = k + 1 - END DO - X( iix ) = x1 - jpos = jpos - 1 - END DO - - RETURN - -! End of SILS_solve_u - - END SUBROUTINE SILS_solve_u - -! End of SILS_part_solve - - END SUBROUTINE SILS_part_solve - - END MODULE GALAHAD_SILS_precision diff --git a/src/sils/sils.F90 b/src/sils/sils.F90 index e43236c9d4..2a1a709f54 100644 --- a/src/sils/sils.F90 +++ b/src/sils/sils.F90 @@ -532,7 +532,8 @@ SUBROUTINE SILS_analyse( MATRIX, FACTORS, CONTROL, AINFO, PERM ) TYPE( SILS_factors ), INTENT( INOUT ) :: FACTORS TYPE( SILS_control ), INTENT( IN ) :: CONTROL TYPE( SILS_ainfo ), INTENT( INOUT ) :: AINFO - INTEGER ( KIND = ip_ ), INTENT( IN ), OPTIONAL :: PERM( MATRIX%n ) ! Pivot sequence + INTEGER ( KIND = ip_ ), INTENT( IN ), & + OPTIONAL :: PERM( MATRIX%n ) ! Pivot sequence ! Local variables diff --git a/src/sils/ym01a.f b/src/sils/ym01a.f index 87fd4bf810..23b7973e9e 100644 --- a/src/sils/ym01a.f +++ b/src/sils/ym01a.f @@ -20,10 +20,11 @@ * conditions, which will include financial conditions. * 2. All information on the Package is provided to the Licensee on the * understanding that the details thereof are confidential. -* 3. All publications issued by the Licensee that include results obtained -* with the help of one or more of the Packages shall acknowledge the -* use of the Packages. The Licensee will notify the Numerical Analysis -* Group at Rutherford Appleton Laboratory of any such publication. +* 3. All publications issued by the Licensee that include results +* obtained with the help of one or more of the Packages shall +* acknowledge the use of the Packages. The Licensee will notify the +* Numerical Analysis Group at Rutherford Appleton Laboratory of any +* such publication. * 4. The Packages may be modified by or on behalf of the Licensee * for such use in research applications but at no time shall such * Packages or modifications thereof become the property of the diff --git a/src/sils/ym01ad.f b/src/sils/ym01ad.f index 755eb4ee17..0bae9e8a8d 100644 --- a/src/sils/ym01ad.f +++ b/src/sils/ym01ad.f @@ -20,10 +20,11 @@ * conditions, which will include financial conditions. * 2. All information on the Package is provided to the Licensee on the * understanding that the details thereof are confidential. -* 3. All publications issued by the Licensee that include results obtained -* with the help of one or more of the Packages shall acknowledge the -* use of the Packages. The Licensee will notify the Numerical Analysis -* Group at Rutherford Appleton Laboratory of any such publication. +* 3. All publications issued by the Licensee that include results +* obtained with the help of one or more of the Packages shall +* acknowledge the use of the Packages. The Licensee will notify the +* Numerical Analysis Group at Rutherford Appleton Laboratory of any +* such publication. * 4. The Packages may be modified by or on behalf of the Licensee * for such use in research applications but at no time shall such * Packages or modifications thereof become the property of the diff --git a/src/slls/slls.F90 b/src/slls/slls.F90 index 800d553114..713703584d 100644 --- a/src/slls/slls.F90 +++ b/src/slls/slls.F90 @@ -2306,8 +2306,8 @@ END SUBROUTINE eval_PREC data%segment, data%n_free, data%FREE, & data%search_data, userdata, & data%f_new, data%alpha_new, & - Ao_ptr = data%Ao%ptr, & - Ao_row = data%Ao%row, & + Ao_ptr = data%Ao%ptr, & + Ao_row = data%Ao%row, & Ao_val = data%Ao%val ) ! ... or products via the user's subroutine or reverse communication ... @@ -2380,8 +2380,8 @@ END SUBROUTINE eval_PREC data%n_free, data%FREE, & data%search_data, userdata, & data%f_new, data%alpha_new, & - Ao_ptr = data%Ao%ptr, & - Ao_row = data%Ao%row, & + Ao_ptr = data%Ao%ptr, & + Ao_row = data%Ao%row, & Ao_val = data%Ao%val ) ! ... or products via the user's subroutine or reverse communication @@ -2572,21 +2572,21 @@ SUBROUTINE SLLS_terminate( data, control, inform, reverse ) ! Deallocate all remaining allocated arrays array_name = 'slls: data%Ao%ptr' - CALL SPACE_dealloc_array( data%Ao%ptr, & + CALL SPACE_dealloc_array( data%Ao%ptr, & inform%status, inform%alloc_status, array_name = array_name, & bad_alloc = inform%bad_alloc, out = control%error ) IF ( control%deallocate_error_fatal .AND. & inform%status /= GALAHAD_ok ) RETURN array_name = 'slls: data%Ao%col' - CALL SPACE_dealloc_array( data%Ao%col, & + CALL SPACE_dealloc_array( data%Ao%col, & inform%status, inform%alloc_status, array_name = array_name, & bad_alloc = inform%bad_alloc, out = control%error ) IF ( control%deallocate_error_fatal .AND. & inform%status /= GALAHAD_ok ) RETURN array_name = 'slls: data%Ao%val' - CALL SPACE_dealloc_array( data%Ao%val, & + CALL SPACE_dealloc_array( data%Ao%val, & inform%status, inform%alloc_status, array_name = array_name, & bad_alloc = inform%bad_alloc, out = control%error ) IF ( control%deallocate_error_fatal .AND. & @@ -3818,7 +3818,8 @@ END SUBROUTINE eval_APROD ! check to see if A has been provided - IF ( PRESENT( Ao_ptr ) .AND. PRESENT( Ao_row ) .AND. PRESENT( Ao_val ) ) THEN + IF ( PRESENT( Ao_ptr ) .AND. PRESENT( Ao_row ) .AND. & + PRESENT( Ao_val ) ) THEN data%present_a = .TRUE. ; data%reverse = .FALSE. ELSE data%present_a = .FALSE. @@ -4182,7 +4183,7 @@ END SUBROUTINE eval_PREC ! check that it is possible to access A in some way - data%present_a = PRESENT( Ao_ptr ) .AND. PRESENT( Ao_row ) .AND. & + data%present_a = PRESENT( Ao_ptr ) .AND. PRESENT( Ao_row ) .AND. & PRESENT( Ao_val ) data%present_afprod = PRESENT( eval_AFPROD ) data%reverse_afprod = .NOT. ( data%present_a .OR. data%present_afprod ) diff --git a/src/sls/sls.F90 b/src/sls/sls.F90 index 8a3ddc5508..76ae971122 100644 --- a/src/sls/sls.F90 +++ b/src/sls/sls.F90 @@ -4170,7 +4170,7 @@ SUBROUTINE SLS_analyse( matrix, data, control, inform, PERM ) inform%status, inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) GO TO 900 data%sytr_lwork = & - data%n * LAENV( 1_ip_, 'DSYTRF', 'L', data%n, & + data%n * LAENV( 1_ip_, 'DSYTRF', 'L', data%n, & - 1_ip_, - 1_ip_, - 1_ip_ ) CALL SPACE_resize_array( data%sytr_lwork, data%WORK, & inform%status, inform%alloc_status ) @@ -8385,11 +8385,11 @@ SUBROUTINE SLS_part_solve( part, X, data, control, inform ) inform%status = 0 GO TO 900 END IF - CALL SPACE_resize_array( data%n, 1_ip_, data%X2, inform%status, & + CALL SPACE_resize_array( data%n, 1_ip_, data%X2, inform%status, & inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) THEN inform%bad_alloc = 'sls: data%X2' ; GO TO 900 ; END IF - CALL SPACE_resize_array( data%n, 1_ip_, data%B2, inform%status, & + CALL SPACE_resize_array( data%n, 1_ip_, data%B2, inform%status, & inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) THEN inform%bad_alloc = 'sls: data%B2' ; GO TO 900 ; END IF @@ -8453,11 +8453,11 @@ SUBROUTINE SLS_part_solve( part, X, data, control, inform ) data%mkl_pardiso_IPARM = inform%mkl_pardiso_IPARM CALL CPU_time( time ) ; CALL CLOCK_time( clock ) CALL MKL_PARDISO_SOLVE( & - data%mkl_pardiso_PT, 1_ip_, 1_ip_, data%pardiso_mtype, & + data%mkl_pardiso_PT, 1_ip_, 1_ip_, data%pardiso_mtype, & phase, data%matrix%n, data%matrix%VAL( 1 : data%ne ), & data%matrix%PTR( 1 : data%matrix%n + 1 ), & data%matrix%COL( 1 : data%ne ), & - data%ORDER( 1 : data%matrix%n ), 1_ip_, & + data%ORDER( 1 : data%matrix%n ), 1_ip_, & data%mkl_pardiso_IPARM, control%print_level_solver, & data%B1( 1 : data%n ), X( 1 : data%n ), & inform%pardiso_error ) @@ -9063,11 +9063,11 @@ SUBROUTINE SLS_sparse_forward_solve( nnz_b, INDEX_b, B, nnz_x, INDEX_x, & data%mkl_pardiso_IPARM = inform%mkl_pardiso_IPARM CALL CPU_time( time ) ; CALL CLOCK_time( clock ) CALL MKL_PARDISO_SOLVE( & - data%mkl_pardiso_PT, 1_ip_, 1_ip_, data%pardiso_mtype, & - 331_ip_, data%matrix%n, data%matrix%VAL( 1 : data%ne ), & + data%mkl_pardiso_PT, 1_ip_, 1_ip_, data%pardiso_mtype, & + 331_ip_, data%matrix%n, data%matrix%VAL( 1 : data%ne ), & data%matrix%PTR( 1 : data%matrix%n + 1 ), & data%matrix%COL( 1 : data%ne ), & - data%ORDER( 1 : data%matrix%n ), 1_ip_, & + data%ORDER( 1 : data%matrix%n ), 1_ip_, & data%mkl_pardiso_IPARM, control%print_level_solver, & data%B1( 1 : data%n ), X( 1 : data%n ), & inform%pardiso_error ) @@ -9111,7 +9111,8 @@ SUBROUTINE SLS_sparse_forward_solve( nnz_b, INDEX_b, B, nnz_x, INDEX_x, & data%wsmp_IPARM( 2 ) = 4 data%wsmp_IPARM( 3 ) = 4 - CALL SPACE_resize_array( data%n, 1_ip_, data%B2, inform%status, & + CALL SPACE_resize_array( data%n, 1_ip_, data%B2, inform%status, & + inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) THEN inform%bad_alloc = 'sls: data%B2' ; GO TO 900 ; END IF @@ -9503,7 +9504,7 @@ SUBROUTINE SLS_fredholm_alternative( matrix, X, data, control, inform ) CASE ( 'potr', 'sytr', 'pbtr' ) - CALL SPACE_resize_array( data%n, 1_ip_, data%X2, inform%status, & + CALL SPACE_resize_array( data%n, 1_ip_, data%X2, inform%status, & inform%alloc_status ) IF ( inform%status /= GALAHAD_ok ) THEN inform%bad_alloc = 'sls: data%B2' ; GO TO 900 ; END IF diff --git a/src/spral/cuda.F90 b/src/spral/cuda.F90 index 1fba0bc424..21be81b4e8 100644 --- a/src/spral/cuda.F90 +++ b/src/spral/cuda.F90 @@ -175,7 +175,8 @@ integer(C_IP_) function cudaMemcpyAsync(dst, src, count, kind, & type(C_PTR), value :: stream end function cudaMemcpyAsync integer(C_IP_) function cudaMemcpy2DAsync(dst, dpitch, src, spitch, & - width, height, kind, stream) bind(C, name="spral_cuda_precisionMemcpy2DAsync") + width, height, kind, stream) bind(C, & + name="spral_cuda_precisionMemcpy2DAsync") use spral_kinds type(C_PTR), value :: dst integer(C_SIZE_T), value :: dpitch diff --git a/src/spral/matrix_util.F90 b/src/spral/matrix_util.F90 index ecd8972a2c..db8cb130c1 100644 --- a/src/spral/matrix_util.F90 +++ b/src/spral/matrix_util.F90 @@ -2497,8 +2497,8 @@ end subroutine convert_coord_to_cscl_ptr64_precision ! ! This subroutine will use map to translate the values of val to val_out ! -subroutine apply_conversion_map_ptr32_precision(matrix_type, lmap, map, val, ne, & - val_out) +subroutine apply_conversion_map_ptr32_precision(matrix_type, lmap, map, & + val, ne, val_out) integer(ip_), intent(in) :: matrix_type integer(i4_), intent(in) :: lmap integer(i4_), dimension(lmap), intent(in) :: map diff --git a/src/spral/rutherford_boeing.F90 b/src/spral/rutherford_boeing.F90 index 7cff73b9ea..915990b868 100644 --- a/src/spral/rutherford_boeing.F90 +++ b/src/spral/rutherford_boeing.F90 @@ -150,7 +150,7 @@ subroutine rb_peek_unit(iunit, info, m, n, nelt, nvar, nval, & ! Other local variables character(len=80) :: buffer1, buffer2 ! Buffers for reading char data - integer(ip_) :: t1, t2, t3, t4 ! Temporary variables for reading integer data + integer(ip_) :: t1, t2, t3, t4 ! Temporary variables for reading int data integer(ip_) :: iost ! stat parameter for io ops info = SUCCESS @@ -425,7 +425,8 @@ subroutine rb_read_precision_int64(filename, m, n, ptr, row, val, & if (r_type_code(1:1) .eq. "q") info = WARN_AUX_FILE ! Determine whether we are reading values from file or not - read_val = ((options%values .ge. 0) .and. (options%values .ne. VALUES_PATTERN)) + read_val = ((options%values .ge. 0) .and. & + (options%values .ne. VALUES_PATTERN)) read_val = read_val .and. (r_type_code(1:1) .ne. "p") read_val = read_val .and. (r_type_code(1:1) .ne. "q") diff --git a/src/spral/spral_scaling.F90 b/src/spral/spral_scaling.F90 index 20ec1ec83d..8b4abd29b4 100644 --- a/src/spral/spral_scaling.F90 +++ b/src/spral/spral_scaling.F90 @@ -680,8 +680,8 @@ subroutine hungarian_wrapper(sym, m, n, ptr, row, val, match, rscaling, & end if end if - if ((.not. sym) .or. (inform%matched .eq. n)) then ! Unsymmetric or symmetric and full rank - ! Note that in this case m=n + if ((.not. sym) .or. (inform%matched .eq. n)) then + ! Unsymmetric or symmetric and full rank. Note that in this case m=n rscaling(1:m) = dualu(1:m) cscaling(1:n) = dualv(1:n) - cmax(1:n) call match_postproc(m, n, ptr, row, val, rscaling, cscaling, & diff --git a/src/ssids/akeep.F90 b/src/ssids/akeep.F90 index a791f2c355..2228d06b8e 100644 --- a/src/ssids/akeep.F90 +++ b/src/ssids/akeep.F90 @@ -47,7 +47,8 @@ module spral_ssids_akeep_precision ! nodes(node)%lcol( nlist(2,j) ) = val( nlist(1,j) ) integer(long_), dimension(:), allocatable :: nptr ! Entries into nlist for ! nodes of the assembly tree. Has length nnodes+1 - integer(ip_), dimension(:), allocatable :: rlist ! rlist(rptr(i):rptr(i+1)-1) + integer(ip_), dimension(:), allocatable :: rlist + ! rlist(rptr(i):rptr(i+1)-1) ! contains the row indices for node i of the assembly tree. ! At each node, the list ! is in elimination order. Allocated within mc78_analyse. diff --git a/src/ssids/anal.F90 b/src/ssids/anal.F90 index d9b86041db..96a26407d3 100644 --- a/src/ssids/anal.F90 +++ b/src/ssids/anal.F90 @@ -927,7 +927,8 @@ subroutine print_atree_part(nnodes, sptr, sparent, rptr, topology, nparts, & do node = part(i), part(i+1)-1 weight = real(flops(node)) / tot_weight if (weight .lt. small) cycle ! Prune smallest nodes - if(sparent(node) .ne. -1) write(2, '(i10, "--", i10)')sparent(node), node + if(sparent(node) .ne. -1) & + write(2, '(i10, "--", i10)')sparent(node), node end do end do diff --git a/src/ssids/cpu_solve.F90 b/src/ssids/cpu_solve.F90 index 2d4bf21b69..314148a169 100644 --- a/src/ssids/cpu_solve.F90 +++ b/src/ssids/cpu_solve.F90 @@ -151,17 +151,17 @@ subroutine fwd_diag_solve(pos_def, job, nnodes, nodes, sptr, rptr, rlist, & if (nrhs .eq. 1) then call solve_fwd_one(pos_def, rlist(rptr(node)), invp, x, & blkm, blkn, nelim, nd, & - !nodes(node)%rsmptr%rmem(nodes(node)%rsmsa), & ! nodes(node)%lcol + !nodes(node)%rsmptr%rmem(nodes(node)%rsmsa), & ! nodes(node)%lcol nodes(node)%lcol, & - !nodes(node)%ismptr%imem(nodes(node)%ismsa), & ! nodes(node)%perm + !nodes(node)%ismptr%imem(nodes(node)%ismsa), & ! nodes(node)%perm nodes(node)%perm, & xlocal, map) else - call solve_fwd_mult(pos_def, rlist(rptr(node)), invp, nrhs, x, ldx,& - blkm, blkn, nelim, nd, & - !nodes(node)%rsmptr%rmem(nodes(node)%rsmsa), & ! nodes(node)%lcol + call solve_fwd_mult(pos_def, rlist(rptr(node)), invp, & + nrhs, x, ldx, blkm, blkn, nelim, nd, & + !nodes(node)%rsmptr%rmem(nodes(node)%rsmsa), & ! nodes(node)%lcol nodes(node)%lcol, & - !nodes(node)%ismptr%imem(nodes(node)%ismsa), & ! nodes(node)%perm + !nodes(node)%ismptr%imem(nodes(node)%ismsa), & ! nodes(node)%perm nodes(node)%perm, & xlocal, map) end if @@ -179,11 +179,13 @@ subroutine fwd_diag_solve(pos_def, job, nnodes, nodes, sptr, rptr, rlist, & if (nrhs .eq. 1) then call solve_diag_one(invp, x, nelim, & - nodes(node)%rsmptr%rmem(nodes(node)%rsmsa+blkm*blkn), & ! node%d + nodes(node)%rsmptr%rmem(nodes(node)%rsmsa+blkm*blkn), & + ! node%d nodes(node)%ismptr%imem(nodes(node)%ismsa)) ! node%perm else call solve_diag_mult(invp, nrhs, x, ldx, nelim, & - nodes(node)%rsmptr%rmem(nodes(node)%rsmsa+blkm*blkn), & ! node%d + nodes(node)%rsmptr%rmem(nodes(node)%rsmsa+blkm*blkn), & + ! node%d nodes(node)%ismptr%imem(nodes(node)%ismsa)) ! node%perm end if end do diff --git a/src/ssids/fkeep.F90 b/src/ssids/fkeep.F90 index 08c601fe69..11f89a72fe 100644 --- a/src/ssids/fkeep.F90 +++ b/src/ssids/fkeep.F90 @@ -19,7 +19,8 @@ module spral_ssids_fkeep_precision use spral_ssids_subtree_precision, only : numeric_subtree_base use spral_ssids_cpu_subtree_precision, only : cpu_numeric_subtree #ifdef PROFILE - use spral_ssids_profile_precision, only : profile_begin, profile_end, profile_add_event + use spral_ssids_profile_precision, only : profile_begin, profile_end, & + profile_add_event #endif implicit none @@ -47,8 +48,10 @@ module spral_ssids_fkeep_precision type(ssids_inform) :: inform contains - procedure, pass(fkeep) :: inner_factor => inner_factor_cpu ! Do actual factorization - procedure, pass(fkeep) :: inner_solve => inner_solve_cpu ! Do actual solve + procedure, pass(fkeep) :: inner_factor => inner_factor_cpu + ! Do actual factorization + procedure, pass(fkeep) :: inner_solve => inner_solve_cpu + ! Do actual solve procedure, pass(fkeep) :: enquire_posdef => enquire_posdef_cpu procedure, pass(fkeep) :: enquire_indef => enquire_indef_cpu procedure, pass(fkeep) :: alter => alter_cpu ! Alter D values @@ -185,7 +188,8 @@ subroutine inner_factor_cpu(fkeep, akeep, val, options, inform) #ifdef PROFILE ! At least some all region subtrees exist - call profile_add_event("EV_ALL_REGIONS", "Starting processing root subtree", 0) + call profile_add_event("EV_ALL_REGIONS", & + "Starting processing root subtree", 0) #endif !$omp parallel num_threads(total_threads) default(shared) @@ -439,7 +443,7 @@ end subroutine alter_cpu subroutine free_fkeep(fkeep, flag) class(ssids_fkeep), intent(inout) :: fkeep - integer(ip_), intent(out) :: flag ! not actually used for cpu version, set to 0 + integer(ip_), intent(out) :: flag ! not used for cpu version, set to 0 integer(ip_) :: i integer(ip_) :: st diff --git a/src/ssids/gpu_datatypes.F90 b/src/ssids/gpu_datatypes.F90 index 823162cfa4..03d087d0a1 100644 --- a/src/ssids/gpu_datatypes.F90 +++ b/src/ssids/gpu_datatypes.F90 @@ -235,12 +235,17 @@ module spral_ssids_gpu_datatypes_precision integer(ip_) :: num_levels = 0 ! number of levels integer(ip_) :: presolve = 0 integer(ip_), dimension(:), allocatable :: lvlptr ! pointers into lvllist - integer(ip_), dimension(:), allocatable :: lvllist ! list of nodes at level - integer(C_INT64_T), dimension(:), allocatable :: off_L ! offsets for each node + integer(ip_), dimension(:), allocatable :: lvllist + ! list of nodes at level + integer(C_INT64_T), dimension(:), allocatable :: off_L + ! offsets for each node ! the following three are row offsets for independence from nrhs - integer(ip_), dimension(:), allocatable :: off_lx ! node offsets for fwd solve - integer(ip_), dimension(:), allocatable :: off_lc ! offsets for node contrib. - integer(ip_), dimension(:), allocatable :: off_ln ! node offsets for bwd solve + integer(ip_), dimension(:), allocatable :: off_lx + ! node offsets for fwd solve + integer(ip_), dimension(:), allocatable :: off_lc + ! offsets for node contrib. + integer(ip_), dimension(:), allocatable :: off_ln + ! node offsets for bwd solve integer(C_INT64_T) :: rd_size = 0 integer(ip_) :: max_lx_size = 0 integer(ip_) :: max_lc_size = 0 diff --git a/src/ssids/gpu_factor.F90 b/src/ssids/gpu_factor.F90 index ec6a7f1dd8..baeaf24293 100644 --- a/src/ssids/gpu_factor.F90 +++ b/src/ssids/gpu_factor.F90 @@ -336,7 +336,8 @@ subroutine subtree_factor_gpu(stream, pos_def, child_ptr, child_list, n, & delta = 0.01_rp_ eps = tiny(1.0_rp_) - if (gpu%num_levels .eq. 0) return ! Shortcut empty streams (v. small matrices) + ! Shortcut empty streams (v. small matrices) + if (gpu%num_levels .eq. 0) return gpu%n = n gpu%nnodes = nnodes @@ -2187,8 +2188,9 @@ subroutine spral_ssids_assemble_contrib(stream, nnodes, total_nch, c_lev, & end subroutine spral_ssids_assemble_contrib !> @brief Form contribution block - subroutine spral_ssids_form_contrib(stream, nnodes, c_lev, c_lvlptr, c_lvllist, & - c_nodes, c_rptr, c_sptr, off_LDLT, ptr_levLDLT, c_gwork) bind(C) + subroutine spral_ssids_form_contrib(stream, nnodes, c_lev, c_lvlptr, & + c_lvllist, c_nodes, c_rptr, c_sptr, & + off_LDLT, ptr_levLDLT, c_gwork) bind(C) use, intrinsic :: iso_c_binding implicit none @@ -2390,7 +2392,8 @@ subroutine spral_ssids_factor_posdef(stream, nnodes, c_lev, c_lvlptr, & 1000 continue return 400 continue - print *, "[Error][spral_ssids_factor_posdef] CUDA error: ", cudaGetErrorString(stats%cuda_error) + print *, "[Error][spral_ssids_factor_posdef] CUDA error: ", & + cudaGetErrorString(stats%cuda_error) goto 1000 300 continue print *, "[Error][spral_ssids_factor_posdef] Matrix not posdef" @@ -2959,8 +2962,8 @@ subroutine spral_ssids_level_custack_init(c_lev, nnodes, c_lvlptr, c_lvllist,& goto 200 end subroutine spral_ssids_level_custack_init - subroutine spral_ssids_assign_nodes_to_levels(nnodes, c_sparent, c_gpu_contribs, c_num_levels, & - c_lvlptr, c_lvllist) bind (C) + subroutine spral_ssids_assign_nodes_to_levels(nnodes, c_sparent, & + c_gpu_contribs, c_num_levels, c_lvlptr, c_lvllist) bind (C) use, intrinsic :: iso_c_binding implicit none diff --git a/src/ssids/gpu_interfaces.F90 b/src/ssids/gpu_interfaces.F90 index c4faad773e..b3f2a55c87 100644 --- a/src/ssids/gpu_interfaces.F90 +++ b/src/ssids/gpu_interfaces.F90 @@ -19,7 +19,7 @@ module spral_ssids_gpu_ifaces_precision ! assemble_kernels.cu ! public :: & - add_delays_precision, & ! Copies/expands any delayed pivots into node + add_delays_precision, & ! Copies/expands delayed pivots -> node assemble_precision, & ! Performs assembly of non-delayed part load_nodes_precision, & ! Copies A into L (no scaling) load_nodes_sc_precision, & ! Copies A into L (with scaling) @@ -89,9 +89,9 @@ end subroutine max_abs_precision ! ! syrk_kernels.cu ! - public :: cuda_dsyrk_precision, & ! Form Schur complement, single block - cuda_multidsyrk_precision, & ! Form Schur complement, multiple blks - cuda_multidsyrk_low_col_precision ! As above, high aspect ratio version + public :: cuda_dsyrk_precision, & ! Form Schur complement, single block + cuda_multidsyrk_precision, & ! Form Schur complement, multiple blks + cuda_multidsyrk_low_col_precision ! High aspect ratio version interface ! syrk_kernels.cu subroutine cuda_dsyrk_precision(stream, n, m, k, alpha, a, lda, b, ldb, & beta, c, ldc) bind(C, name="spral_ssids_dsyrk_precision") @@ -129,14 +129,22 @@ end subroutine cuda_multidsyrk_low_col_precision ! ! dense_factor_kernels.cu ! - public :: block_ldlt_precision, & ! LDL^T kernel for single block - block_llt_precision, & ! LL^T kernel for single block - cuda_collect_stats_precision, & ! Accumulates statistics for a level - multiblock_ldlt_precision, & ! LDL^T kernel for multiple blocks - multiblock_ldlt_setup_precision, & ! Sets up data for next multiblock_ldlt - multiblock_llt_precision, & ! LL^T kernel for multiple blocks - multiblock_llt_setup_precision, & ! Sets up data for next multiblock_llt - square_ldlt_precision ! LDL^T kernel for root delays block + public :: block_ldlt_precision, & + ! LDL^T kernel for single block + block_llt_precision, & + ! LL^T kernel for single block + cuda_collect_stats_precision, & + ! Accumulates statistics for a level + multiblock_ldlt_precision, & + ! LDL^T kernel for multiple blocks + multiblock_ldlt_setup_precision, & + ! Sets up data for next multiblock_ldlt + multiblock_llt_precision, & + ! LL^T kernel for multiple blocks + multiblock_llt_setup_precision, & + ! Sets up data for next multiblock_llt + square_ldlt_precision + ! LDL^T kernel for root delays block interface subroutine block_ldlt_precision(stream, n, m, p, a, lda, f, ldf, fd, & ldfd, d, delta, eps, ind, stat) & @@ -243,17 +251,28 @@ end subroutine square_ldlt_precision ! ! reorder_kernels.cu ! - public :: copy_ic_precision, & ! 2D copy with column permutation - copy_mc_precision, & ! Straight forward 2d copy with mask on column - multisymm_precision, & ! symmetrically fill in upper triangle - multicopy_precision, & ! copies column blocks in multiple nodes - multireorder_precision, & ! copies L and LD about with permutation - reorder_cols2_precision, & ! in place col perm via workspace (2 arrays) - reorder_rows_precision, & ! in place row permutation via workspace - reorder_rows2_precision, & ! in place row perm via workspace (2 arrays) - swap_ni2Dm_precision, & ! 2D swap with row and col perm (non-intersect) - swap_ni2D_ic_precision, & ! 2D swap with column perm (non-intersecting) - swap_ni2D_ir_precision ! 2D swap with row perm (non-intersection) + public :: copy_ic_precision, & + ! 2D copy with column permutation + copy_mc_precision, & + ! Straight forward 2d copy with mask on column + multisymm_precision, & + ! symmetrically fill in upper triangle + multicopy_precision, & + ! copies column blocks in multiple nodes + multireorder_precision, & + ! copies L and LD about with permutation + reorder_cols2_precision, & + ! in place col perm via workspace (2 arrays) + reorder_rows_precision, & + ! in place row permutation via workspace + reorder_rows2_precision, & + ! in place row perm via workspace (2 arrays) + swap_ni2Dm_precision, & + ! 2D swap with row and col perm (non-intersect) + swap_ni2D_ic_precision, & + ! 2D swap with column perm (non-intersecting) + swap_ni2D_ir_precision + ! 2D swap with row perm (non-intersection) interface ! reorder_kernels.cu subroutine copy_ic_precision(stream, n, m, a, lda, b, ldb, mask) & bind(C, name="spral_ssids_copy_ic_precision") @@ -373,10 +392,10 @@ end subroutine swap_ni2D_ir_precision ! ! solve_kernels.cu ! - public :: run_bwd_solve_kernels_precision, & ! execute prepared bwd solve - run_d_solve_kernel_precision, & ! execute prepared d solve - run_fwd_solve_kernels_precision, & ! execute prepared fwd solve - run_slv_contrib_fwd_precision ! execute prepared scatter of contrib + public :: run_bwd_solve_kernels_precision, & ! execute prepared bwd solve + run_d_solve_kernel_precision, & ! execute prepared d solve + run_fwd_solve_kernels_precision, & ! execute prepared fwd solve + run_slv_contrib_fwd_precision ! execute prepared scatter of contrib interface ! solve_kernels.cu subroutine run_bwd_solve_kernels_precision(dsolve, unit_diagonal, x_gpu, & work_gpu, nsync, sync_gpu, gpu, stream) & diff --git a/src/ssids/gpu_solve.F90 b/src/ssids/gpu_solve.F90 index dcc6e2cc9d..1338eabb06 100644 --- a/src/ssids/gpu_solve.F90 +++ b/src/ssids/gpu_solve.F90 @@ -163,7 +163,8 @@ end subroutine d_solve_gpu ! ! This subroutine performs a D solve on the specified subtree ! - subroutine subtree_d_solve_gpu(num_levels, bwd_slv_lookup, gpu_x, gpu_y, stream) + subroutine subtree_d_solve_gpu(num_levels, bwd_slv_lookup, & + gpu_x, gpu_y, stream) implicit none integer(ip_), intent(in) :: num_levels type(lookups_gpu_bwd), dimension(:) :: bwd_slv_lookup @@ -449,8 +450,8 @@ subroutine create_gpu_lookup_fwd(nlvl, lvllist, nodes, child_ptr, child_list,& nscatter = nscatter + (nelim-1)/SLV_SCATTER_NB + 1 end do - allocate(assemble_lookup(nassemble), trsv_lookup(ntrsv), gemv_lookup(ngemv),& - reduce_lookup(nreduce), scatter_lookup(nscatter), & + allocate(assemble_lookup(nassemble), trsv_lookup(ntrsv), & + gemv_lookup(ngemv), reduce_lookup(nreduce), scatter_lookup(nscatter), & assemble_lookup2(nassemble2), asmblkdata(nasmblk), stat=st) if (st .ne. 0) return @@ -574,7 +575,8 @@ subroutine create_gpu_lookup_fwd(nlvl, lvllist, nodes, child_ptr, child_list,& end do do i = 0, nx-1 nreduce = nreduce + 1 - reduce_lookup(nreduce)%m = min(SLV_GEMV_NX,blkm-nelim-i*SLV_GEMV_NX) + reduce_lookup(nreduce)%m & + = min(SLV_GEMV_NX,blkm-nelim-i*SLV_GEMV_NX) reduce_lookup(nreduce)%n = ny reduce_lookup(nreduce)%src_offset = lwork + i*SLV_GEMV_NX reduce_lookup(nreduce)%ldsrc = blkm-nelim diff --git a/src/ssids/gpu_subtree.F90 b/src/ssids/gpu_subtree.F90 index 2a914c2143..6567202dc3 100644 --- a/src/ssids/gpu_subtree.F90 +++ b/src/ssids/gpu_subtree.F90 @@ -1089,7 +1089,8 @@ subroutine spral_ssids_build_rlist_direct(n, nnodes, c_sparent, c_rptr, & end if if (C_ASSOCIATED(c_rlist_direct)) then - call C_F_POINTER(c_rlist_direct, rlist_direct, shape=(/ rptr(nnodes+1)-1 /)) + call C_F_POINTER(c_rlist_direct, rlist_direct, & + shape=(/ rptr(nnodes+1)-1 /)) else print *, "Error c_rlist_direct is NULL" return diff --git a/src/ssids/ssids.F90 b/src/ssids/ssids.F90 index 68fe3cba67..ae84edfcbe 100644 --- a/src/ssids/ssids.F90 +++ b/src/ssids/ssids.F90 @@ -172,8 +172,8 @@ subroutine analyse_precision(check, n, ptr, row, akeep, options, inform, & integer(ip_) :: flag ! error flag for metis integer(ip_), dimension(:), allocatable :: order2 - integer(long_), dimension(:), allocatable :: ptr2 ! col ptrs for expanded mat - integer(ip_), dimension(:), allocatable :: row2 ! row indices for expanded matrix + integer(long_), dimension(:), allocatable :: ptr2 ! col ptrs and row indices + integer(ip_), dimension(:), allocatable :: row2 ! for the expanded matrix ! The following are only used for matching-based orderings real(rp_), dimension(:), allocatable :: val_clean ! cleaned values if @@ -200,7 +200,8 @@ subroutine analyse_precision(check, n, ptr, row, akeep, options, inform, & ! Print status on entry call options%print_summary_analyse(context) - if ((options%print_level .ge. 1) .and. (options%unit_diagnostics .ge. 0)) then + if ((options%print_level .ge. 1) .and. & + (options%unit_diagnostics .ge. 0)) then write (options%unit_diagnostics,'(a,i15)') & ' n = ',n end if @@ -530,8 +531,8 @@ subroutine ssids_analyse_coord_precision(n, ne, row, col, akeep, options, & type(numa_region), dimension(:), optional, intent(in) :: topology ! user specified topology - integer(long_), dimension(:), allocatable :: ptr2 ! col ptrs for expanded mat - integer(ip_), dimension(:), allocatable :: row2 ! row indices for expanded matrix + integer(long_), dimension(:), allocatable :: ptr2 ! col ptrs and row indices + integer(ip_), dimension(:), allocatable :: row2 ! for the expanded matrix integer(ip_), dimension(:), allocatable :: order2 ! pivot order integer(ip_) :: mo_flag @@ -563,7 +564,8 @@ subroutine ssids_analyse_coord_precision(n, ne, row, col, akeep, options, & ! Output status on entry call options%print_summary_analyse(context) - if ((options%print_level .ge. 1) .and. (options%unit_diagnostics .ge. 0)) then + if ((options%print_level .ge. 1) .and. & + (options%unit_diagnostics .ge. 0)) then write (options%unit_diagnostics,'(a,i15)') & ' n = ', n write (options%unit_diagnostics,'(a,i15)') & @@ -619,9 +621,9 @@ subroutine ssids_analyse_coord_precision(n, ne, row, col, akeep, options, & lmap=akeep%lmap, map=akeep%map, & noor=inform%matrix_outrange, ndup=inform%matrix_dup) else - call convert_coord_to_cscl(SPRAL_MATRIX_REAL_SYM_INDEF, n, n, ne, row, & - col, akeep%ptr, akeep%row, mu_flag, lmap=akeep%lmap, map=akeep%map, & - noor=inform%matrix_outrange, ndup=inform%matrix_dup) + call convert_coord_to_cscl(SPRAL_MATRIX_REAL_SYM_INDEF, n, n, ne, row, & + col, akeep%ptr, akeep%row, mu_flag, lmap=akeep%lmap, map=akeep%map,& + noor=inform%matrix_outrange, ndup=inform%matrix_dup) end if ! Check for errors @@ -848,7 +850,8 @@ subroutine ssids_factor_ptr64_precision(posdef, val, akeep, fkeep, options, & end if ! Immediate return if analyse detected singularity and options%action=false - if ((.not. options%action) .and. (akeep%n .ne. akeep%inform%matrix_rank)) then + if ((.not. options%action) .and. & + (akeep%n .ne. akeep%inform%matrix_rank)) then inform%flag = SSIDS_ERROR_SINGULAR goto 100 end if @@ -1077,26 +1080,26 @@ subroutine ssids_factor_ptr64_precision(posdef, val, akeep, fkeep, options, & write (options%unit_diagnostics,'(/a)') & ' Completed factorisation with:' write (options%unit_diagnostics, & - '(a,3(/a,i12),2(/a,es12.4),5(/a,i12))') & - ' information parameters (inform%) :', & - ' flag Error flag = ',& - inform%flag, & - ' maxfront Maximum frontsize = ',& - inform%maxfront, & - ' maxsupernode Maximum supernode size = ',& - inform%maxsupernode, & - ' num_factor Number of entries in L = ',& - real(inform%num_factor), & - ' num_flops Number of flops performed = ',& - real(inform%num_flops), & - ' num_two Number of 2x2 pivots used = ',& - inform%num_two, & - ' num_delay Number of delayed eliminations = ',& - inform%num_delay, & - ' rank Computed rank = ',& - inform%matrix_rank, & - ' num_neg Computed number of negative eigenvalues = ',& - inform%num_neg + '(a,3(/a,i12),2(/a,es12.4),5(/a,i12))') & + ' information parameters (inform%) :', & + ' flag Error flag = ',& + inform%flag, & + ' maxfront Maximum frontsize = ',& + inform%maxfront, & + ' maxsupernode Maximum supernode size = ',& + inform%maxsupernode, & + ' num_factor Number of entries in L = ',& + real(inform%num_factor), & + ' num_flops Number of flops performed = ',& + real(inform%num_flops), & + ' num_two Number of 2x2 pivots used = ',& + inform%num_two, & + ' num_delay Number of delayed eliminations = ',& + inform%num_delay, & + ' rank Computed rank = ',& + inform%matrix_rank, & + ' num_neg Computed number of negative eigenvalues = ',& + inform%num_neg end if ! Normal return just drops through @@ -1179,7 +1182,8 @@ subroutine ssids_solve_mult_precision(nrhs, x, ldx, akeep, fkeep, options, & inform%flag = SSIDS_SUCCESS ! Perform appropriate printing - if ((options%print_level .ge. 1) .and. (options%unit_diagnostics .ge. 0)) then + if ((options%print_level .ge. 1) .and. & + (options%unit_diagnostics .ge. 0)) then write (options%unit_diagnostics,'(//a)') & ' Entering ssids_solve with:' write (options%unit_diagnostics,'(a,4(/a,i12),(/a,i12))') & @@ -1243,7 +1247,8 @@ subroutine ssids_solve_mult_precision(nrhs, x, ldx, akeep, fkeep, options, & ! Set local_job local_job = 0 if (present(job)) then - if ((job .lt. SSIDS_SOLVE_JOB_FWD) .or. (job .gt. SSIDS_SOLVE_JOB_DIAG_BWD)) & + if ((job .lt. SSIDS_SOLVE_JOB_FWD) .or. & + (job .gt. SSIDS_SOLVE_JOB_DIAG_BWD)) & inform%flag = SSIDS_ERROR_JOB_OOR if (fkeep%pos_def .and. (job .eq. SSIDS_SOLVE_JOB_DIAG)) & inform%flag = SSIDS_ERROR_JOB_OOR diff --git a/src/trs/trs.F90 b/src/trs/trs.F90 index d24c385d82..e126323298 100644 --- a/src/trs/trs.F90 +++ b/src/trs/trs.F90 @@ -2358,7 +2358,7 @@ SUBROUTINE TRS_solve_main( n, radius, f, C, H, X, data, control, inform, & inform%x_norm = TWO_NORM( X ) x_norm2( 0 ) = inform%x_norm ** 2 ELSE - CALL mop_AX( one, M, X, zero, data%Y( : n ), 0_ip_, & + CALL mop_AX( one, M, X, zero, data%Y( : n ), 0_ip_, & symmetric = .TRUE. ) x_norm2( 0 ) = DOT_PRODUCT( X, data%Y( : n ) ) IF ( x_norm2( 0 ) < zero ) THEN @@ -2684,7 +2684,7 @@ SUBROUTINE TRS_solve_main( n, radius, f, C, H, X, data, control, inform, & IF ( unit_m ) THEN z_norm2 = DOT_PRODUCT( data%Z( : n ), data%Z( : n ) ) ELSE - CALL mop_AX( one, M, data%Z( : n ), zero, data%Y( : n ), 0_ip_, & + CALL mop_AX( one, M, data%Z( : n ), zero, data%Y( : n ), 0_ip_, & symmetric = .TRUE. ) z_norm2 = DOT_PRODUCT( data%Z( : n ), data%Y( : n ) ) END IF diff --git a/src/uls/uls.F90 b/src/uls/uls.F90 index 231fae28a8..1dbdec9d73 100644 --- a/src/uls/uls.F90 +++ b/src/uls/uls.F90 @@ -996,7 +996,8 @@ SUBROUTINE ULS_factorize( matrix, data, control, inform ) inform%status = GALAHAD_ok inform%alloc_status = data%gls_finfo%stat inform%more_info = data%gls_finfo%more - inform%entries_in_factors = INT( data%gls_finfo%size_factor, long_ ) + inform%entries_in_factors & + = INT( data%gls_finfo%size_factor, long_ ) inform%workspace_factors & = INT( data%gls_finfo%len_factorize, long_ ) inform%entries_dropped = data%gls_finfo%drop diff --git a/src/warm/usewarm.F90 b/src/warm/usewarm.F90 index 99138f56c4..cd46ac9475 100644 --- a/src/warm/usewarm.F90 +++ b/src/warm/usewarm.F90 @@ -208,7 +208,8 @@ SUBROUTINE USE_warm( input ) CHARACTER ( LEN = 10 ), ALLOCATABLE, DIMENSION( : ) :: X_names, C_names REAL ( KIND = rp_ ), ALLOCATABLE, DIMENSION( : ) :: C, AY, HX, D, O INTEGER ( KIND = ip_ ), ALLOCATABLE, DIMENSION( : ) :: C_status, X_status - INTEGER ( KIND = ip_ ), ALLOCATABLE, DIMENSION( : ) :: C_status_1, X_status_1 + INTEGER ( KIND = ip_ ), ALLOCATABLE, DIMENSION( : ) :: C_status_1 + INTEGER ( KIND = ip_ ), ALLOCATABLE, DIMENSION( : ) :: X_status_1 CALL CPU_TIME( time ) ; CALL CLOCK_time( clock ) diff --git a/src/wcp/wcp.F90 b/src/wcp/wcp.F90 index 394ff68a24..8f2d9062b8 100644 --- a/src/wcp/wcp.F90 +++ b/src/wcp/wcp.F90 @@ -7832,7 +7832,8 @@ SUBROUTINE WCP_min_piecewise_quartic( dims, n, m, nbnds, DIST_Z_l, & END IF IF ( debug ) THEN - WRITE( control%out, "( ' c0, c1, c3, c4 ', 4ES12.4 )" ) c0, c1, c3, c4 + WRITE( control%out, "( ' c0, c1, c3, c4 ', 4ES12.4 )" ) & + c0, c1, c3, c4 res_cs = ( 1 - alpha_u ) * res_prim_dual DO i = dims%x_free + 1, dims%x_u_start - 1 res_cs = res_cs + ABS( &