diff options
| author | Stanislaw Halik <sthalik@misaki.pl> | 2019-03-03 21:09:10 +0100 |
|---|---|---|
| committer | Stanislaw Halik <sthalik@misaki.pl> | 2019-03-03 21:10:13 +0100 |
| commit | f0238cfb6997c4acfc2bd200de7295f3fa36968f (patch) | |
| tree | b215183760e4f615b9c1dabc1f116383b72a1b55 /eigen/lapack | |
| parent | 543edd372a5193d04b3de9f23c176ab439e51b31 (diff) | |
don't index Eigen
Diffstat (limited to 'eigen/lapack')
48 files changed, 0 insertions, 9557 deletions
diff --git a/eigen/lapack/CMakeLists.txt b/eigen/lapack/CMakeLists.txt deleted file mode 100644 index 6df1fa9..0000000 --- a/eigen/lapack/CMakeLists.txt +++ /dev/null @@ -1,449 +0,0 @@ - -project(EigenLapack CXX) - -include("../cmake/language_support.cmake") - -workaround_9220(Fortran EIGEN_Fortran_COMPILER_WORKS) - -if(EIGEN_Fortran_COMPILER_WORKS) - enable_language(Fortran OPTIONAL) - if(NOT CMAKE_Fortran_COMPILER) - set(EIGEN_Fortran_COMPILER_WORKS OFF) - endif() -endif() - -add_custom_target(lapack) -include_directories(../blas) - -set(EigenLapack_SRCS -single.cpp double.cpp complex_single.cpp complex_double.cpp ../blas/xerbla.cpp -) - -if(EIGEN_Fortran_COMPILER_WORKS) - -set(EigenLapack_SRCS ${EigenLapack_SRCS} - slarft.f dlarft.f clarft.f zlarft.f - slarfb.f dlarfb.f clarfb.f zlarfb.f - slarfg.f dlarfg.f clarfg.f zlarfg.f - slarf.f dlarf.f clarf.f zlarf.f - sladiv.f dladiv.f cladiv.f zladiv.f - ilaslr.f iladlr.f ilaclr.f ilazlr.f - ilaslc.f iladlc.f ilaclc.f ilazlc.f - dlapy2.f dlapy3.f slapy2.f slapy3.f - clacgv.f zlacgv.f - slamch.f dlamch.f - second_NONE.f dsecnd_NONE.f -) - -option(EIGEN_ENABLE_LAPACK_TESTS OFF "Enbale the Lapack unit tests") - -if(EIGEN_ENABLE_LAPACK_TESTS) - - get_filename_component(eigen_full_path_to_reference_lapack "./reference/" ABSOLUTE) - if(NOT EXISTS ${eigen_full_path_to_reference_lapack}) - # Download lapack and install sources and testing at the right place - message(STATUS "Download lapack_addons_3.4.1.tgz...") - - file(DOWNLOAD "http://downloads.tuxfamily.org/eigen/lapack_addons_3.4.1.tgz" - "${CMAKE_CURRENT_SOURCE_DIR}/lapack_addons_3.4.1.tgz" - INACTIVITY_TIMEOUT 15 - TIMEOUT 240 - STATUS download_status - EXPECTED_MD5 ab5742640617e3221a873aba44bbdc93 - SHOW_PROGRESS) - - message(STATUS ${download_status}) - list(GET download_status 0 download_status_num) - set(download_status_num 0) - if(download_status_num EQUAL 0) - message(STATUS "Setup lapack reference and lapack unit tests") - execute_process(COMMAND tar xzf "lapack_addons_3.4.1.tgz" WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) - else() - message(STATUS "Download of lapack_addons_3.4.1.tgz failed, LAPACK unit tests wont be enabled") - set(EIGEN_ENABLE_LAPACK_TESTS false) - endif() - - endif() - - get_filename_component(eigen_full_path_to_reference_lapack "./reference/" ABSOLUTE) - if(EXISTS ${eigen_full_path_to_reference_lapack}) - set(EigenLapack_funcfilenames - ssyev.f dsyev.f csyev.f zsyev.f - spotrf.f dpotrf.f cpotrf.f zpotrf.f - spotrs.f dpotrs.f cpotrs.f zpotrs.f - sgetrf.f dgetrf.f cgetrf.f zgetrf.f - sgetrs.f dgetrs.f cgetrs.f zgetrs.f) - - FILE(GLOB ReferenceLapack_SRCS0 RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "reference/*.f") - foreach(filename1 IN LISTS ReferenceLapack_SRCS0) - string(REPLACE "reference/" "" filename ${filename1}) - list(FIND EigenLapack_SRCS ${filename} id1) - list(FIND EigenLapack_funcfilenames ${filename} id2) - if((id1 EQUAL -1) AND (id2 EQUAL -1)) - set(ReferenceLapack_SRCS ${ReferenceLapack_SRCS} reference/${filename}) - endif() - endforeach() - endif() - - -endif(EIGEN_ENABLE_LAPACK_TESTS) - -endif(EIGEN_Fortran_COMPILER_WORKS) - -add_library(eigen_lapack_static ${EigenLapack_SRCS} ${ReferenceLapack_SRCS}) -add_library(eigen_lapack SHARED ${EigenLapack_SRCS}) - -target_link_libraries(eigen_lapack eigen_blas) - -if(EIGEN_STANDARD_LIBRARIES_TO_LINK_TO) - target_link_libraries(eigen_lapack_static ${EIGEN_STANDARD_LIBRARIES_TO_LINK_TO}) - target_link_libraries(eigen_lapack ${EIGEN_STANDARD_LIBRARIES_TO_LINK_TO}) -endif() - -add_dependencies(lapack eigen_lapack eigen_lapack_static) - -install(TARGETS eigen_lapack eigen_lapack_static - RUNTIME DESTINATION bin - LIBRARY DESTINATION lib - ARCHIVE DESTINATION lib) - - - -get_filename_component(eigen_full_path_to_testing_lapack "./testing/" ABSOLUTE) -if(EXISTS ${eigen_full_path_to_testing_lapack}) - - # The following comes from lapack/TESTING/CMakeLists.txt - # Get Python - find_package(PythonInterp) - message(STATUS "Looking for Python found - ${PYTHONINTERP_FOUND}") - if (PYTHONINTERP_FOUND) - message(STATUS "Using Python version ${PYTHON_VERSION_STRING}") - endif() - - set(LAPACK_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}) - set(LAPACK_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}) - set(BUILD_SINGLE true) - set(BUILD_DOUBLE true) - set(BUILD_COMPLEX true) - set(BUILD_COMPLEX16E true) - - if(MSVC_VERSION) -# string(REPLACE "/STACK:10000000" "/STACK:900000000000000000" -# CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS}") - string(REGEX REPLACE "(.*)/STACK:(.*) (.*)" "\\1/STACK:900000000000000000 \\3" - CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS}") - endif() - add_subdirectory(testing/MATGEN) - add_subdirectory(testing/LIN) - add_subdirectory(testing/EIG) - macro(add_lapack_test output input target) - set(TEST_INPUT "${LAPACK_SOURCE_DIR}/testing/${input}") - set(TEST_OUTPUT "${LAPACK_BINARY_DIR}/testing/${output}") - get_target_property(TEST_LOC ${target} LOCATION) - string(REPLACE "." "_" input_name ${input}) - set(testName "${target}_${input_name}") - if(EXISTS "${TEST_INPUT}") - add_test(LAPACK-${testName} "${CMAKE_COMMAND}" - -DTEST=${TEST_LOC} - -DINPUT=${TEST_INPUT} - -DOUTPUT=${TEST_OUTPUT} - -DINTDIR=${CMAKE_CFG_INTDIR} - -P "${LAPACK_SOURCE_DIR}/testing/runtest.cmake") - endif() - endmacro(add_lapack_test) - - if (BUILD_SINGLE) - add_lapack_test(stest.out stest.in xlintsts) - # - # ======== SINGLE RFP LIN TESTS ======================== - add_lapack_test(stest_rfp.out stest_rfp.in xlintstrfs) - # - # - # ======== SINGLE EIG TESTS =========================== - # - - add_lapack_test(snep.out nep.in xeigtsts) - - - add_lapack_test(ssep.out sep.in xeigtsts) - - - add_lapack_test(ssvd.out svd.in xeigtsts) - - - add_lapack_test(sec.out sec.in xeigtsts) - - - add_lapack_test(sed.out sed.in xeigtsts) - - - add_lapack_test(sgg.out sgg.in xeigtsts) - - - add_lapack_test(sgd.out sgd.in xeigtsts) - - - add_lapack_test(ssb.out ssb.in xeigtsts) - - - add_lapack_test(ssg.out ssg.in xeigtsts) - - - add_lapack_test(sbal.out sbal.in xeigtsts) - - - add_lapack_test(sbak.out sbak.in xeigtsts) - - - add_lapack_test(sgbal.out sgbal.in xeigtsts) - - - add_lapack_test(sgbak.out sgbak.in xeigtsts) - - - add_lapack_test(sbb.out sbb.in xeigtsts) - - - add_lapack_test(sglm.out glm.in xeigtsts) - - - add_lapack_test(sgqr.out gqr.in xeigtsts) - - - add_lapack_test(sgsv.out gsv.in xeigtsts) - - - add_lapack_test(scsd.out csd.in xeigtsts) - - - add_lapack_test(slse.out lse.in xeigtsts) - endif() - - if (BUILD_DOUBLE) - # - # ======== DOUBLE LIN TESTS =========================== - add_lapack_test(dtest.out dtest.in xlintstd) - # - # ======== DOUBLE RFP LIN TESTS ======================== - add_lapack_test(dtest_rfp.out dtest_rfp.in xlintstrfd) - # - # ======== DOUBLE EIG TESTS =========================== - - add_lapack_test(dnep.out nep.in xeigtstd) - - - add_lapack_test(dsep.out sep.in xeigtstd) - - - add_lapack_test(dsvd.out svd.in xeigtstd) - - - add_lapack_test(dec.out dec.in xeigtstd) - - - add_lapack_test(ded.out ded.in xeigtstd) - - - add_lapack_test(dgg.out dgg.in xeigtstd) - - - add_lapack_test(dgd.out dgd.in xeigtstd) - - - add_lapack_test(dsb.out dsb.in xeigtstd) - - - add_lapack_test(dsg.out dsg.in xeigtstd) - - - add_lapack_test(dbal.out dbal.in xeigtstd) - - - add_lapack_test(dbak.out dbak.in xeigtstd) - - - add_lapack_test(dgbal.out dgbal.in xeigtstd) - - - add_lapack_test(dgbak.out dgbak.in xeigtstd) - - - add_lapack_test(dbb.out dbb.in xeigtstd) - - - add_lapack_test(dglm.out glm.in xeigtstd) - - - add_lapack_test(dgqr.out gqr.in xeigtstd) - - - add_lapack_test(dgsv.out gsv.in xeigtstd) - - - add_lapack_test(dcsd.out csd.in xeigtstd) - - - add_lapack_test(dlse.out lse.in xeigtstd) - endif() - - if (BUILD_COMPLEX) - add_lapack_test(ctest.out ctest.in xlintstc) - # - # ======== COMPLEX RFP LIN TESTS ======================== - add_lapack_test(ctest_rfp.out ctest_rfp.in xlintstrfc) - # - # ======== COMPLEX EIG TESTS =========================== - - add_lapack_test(cnep.out nep.in xeigtstc) - - - add_lapack_test(csep.out sep.in xeigtstc) - - - add_lapack_test(csvd.out svd.in xeigtstc) - - - add_lapack_test(cec.out cec.in xeigtstc) - - - add_lapack_test(ced.out ced.in xeigtstc) - - - add_lapack_test(cgg.out cgg.in xeigtstc) - - - add_lapack_test(cgd.out cgd.in xeigtstc) - - - add_lapack_test(csb.out csb.in xeigtstc) - - - add_lapack_test(csg.out csg.in xeigtstc) - - - add_lapack_test(cbal.out cbal.in xeigtstc) - - - add_lapack_test(cbak.out cbak.in xeigtstc) - - - add_lapack_test(cgbal.out cgbal.in xeigtstc) - - - add_lapack_test(cgbak.out cgbak.in xeigtstc) - - - add_lapack_test(cbb.out cbb.in xeigtstc) - - - add_lapack_test(cglm.out glm.in xeigtstc) - - - add_lapack_test(cgqr.out gqr.in xeigtstc) - - - add_lapack_test(cgsv.out gsv.in xeigtstc) - - - add_lapack_test(ccsd.out csd.in xeigtstc) - - - add_lapack_test(clse.out lse.in xeigtstc) - endif() - - if (BUILD_COMPLEX16) - # - # ======== COMPLEX16 LIN TESTS ======================== - add_lapack_test(ztest.out ztest.in xlintstz) - # - # ======== COMPLEX16 RFP LIN TESTS ======================== - add_lapack_test(ztest_rfp.out ztest_rfp.in xlintstrfz) - # - # ======== COMPLEX16 EIG TESTS =========================== - - add_lapack_test(znep.out nep.in xeigtstz) - - - add_lapack_test(zsep.out sep.in xeigtstz) - - - add_lapack_test(zsvd.out svd.in xeigtstz) - - - add_lapack_test(zec.out zec.in xeigtstz) - - - add_lapack_test(zed.out zed.in xeigtstz) - - - add_lapack_test(zgg.out zgg.in xeigtstz) - - - add_lapack_test(zgd.out zgd.in xeigtstz) - - - add_lapack_test(zsb.out zsb.in xeigtstz) - - - add_lapack_test(zsg.out zsg.in xeigtstz) - - - add_lapack_test(zbal.out zbal.in xeigtstz) - - - add_lapack_test(zbak.out zbak.in xeigtstz) - - - add_lapack_test(zgbal.out zgbal.in xeigtstz) - - - add_lapack_test(zgbak.out zgbak.in xeigtstz) - - - add_lapack_test(zbb.out zbb.in xeigtstz) - - - add_lapack_test(zglm.out glm.in xeigtstz) - - - add_lapack_test(zgqr.out gqr.in xeigtstz) - - - add_lapack_test(zgsv.out gsv.in xeigtstz) - - - add_lapack_test(zcsd.out csd.in xeigtstz) - - - add_lapack_test(zlse.out lse.in xeigtstz) - endif() - - - if (BUILD_SIMPLE) - if (BUILD_DOUBLE) - # - # ======== SINGLE-DOUBLE PROTO LIN TESTS ============== - add_lapack_test(dstest.out dstest.in xlintstds) - endif() - endif() - - - if (BUILD_COMPLEX) - if (BUILD_COMPLEX16) - # - # ======== COMPLEX-COMPLEX16 LIN TESTS ======================== - add_lapack_test(zctest.out zctest.in xlintstzc) - endif() - endif() - - # ============================================================================== - - execute_process(COMMAND ${CMAKE_COMMAND} -E copy ${LAPACK_SOURCE_DIR}/testing/lapack_testing.py ${LAPACK_BINARY_DIR}) - add_test( - NAME LAPACK_Test_Summary - WORKING_DIRECTORY ${LAPACK_BINARY_DIR} - COMMAND ${PYTHON_EXECUTABLE} "lapack_testing.py" - ) - -endif() - diff --git a/eigen/lapack/cholesky.cpp b/eigen/lapack/cholesky.cpp deleted file mode 100644 index ea3bc12..0000000 --- a/eigen/lapack/cholesky.cpp +++ /dev/null @@ -1,72 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2010-2011 Gael Guennebaud <gael.guennebaud@inria.fr> -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#include "lapack_common.h" -#include <Eigen/Cholesky> - -// POTRF computes the Cholesky factorization of a real symmetric positive definite matrix A. -EIGEN_LAPACK_FUNC(potrf,(char* uplo, int *n, RealScalar *pa, int *lda, int *info)) -{ - *info = 0; - if(UPLO(*uplo)==INVALID) *info = -1; - else if(*n<0) *info = -2; - else if(*lda<std::max(1,*n)) *info = -4; - if(*info!=0) - { - int e = -*info; - return xerbla_(SCALAR_SUFFIX_UP"POTRF", &e, 6); - } - - Scalar* a = reinterpret_cast<Scalar*>(pa); - MatrixType A(a,*n,*n,*lda); - int ret; - if(UPLO(*uplo)==UP) ret = int(internal::llt_inplace<Scalar, Upper>::blocked(A)); - else ret = int(internal::llt_inplace<Scalar, Lower>::blocked(A)); - - if(ret>=0) - *info = ret+1; - - return 0; -} - -// POTRS solves a system of linear equations A*X = B with a symmetric -// positive definite matrix A using the Cholesky factorization -// A = U**T*U or A = L*L**T computed by DPOTRF. -EIGEN_LAPACK_FUNC(potrs,(char* uplo, int *n, int *nrhs, RealScalar *pa, int *lda, RealScalar *pb, int *ldb, int *info)) -{ - *info = 0; - if(UPLO(*uplo)==INVALID) *info = -1; - else if(*n<0) *info = -2; - else if(*nrhs<0) *info = -3; - else if(*lda<std::max(1,*n)) *info = -5; - else if(*ldb<std::max(1,*n)) *info = -7; - if(*info!=0) - { - int e = -*info; - return xerbla_(SCALAR_SUFFIX_UP"POTRS", &e, 6); - } - - Scalar* a = reinterpret_cast<Scalar*>(pa); - Scalar* b = reinterpret_cast<Scalar*>(pb); - MatrixType A(a,*n,*n,*lda); - MatrixType B(b,*n,*nrhs,*ldb); - - if(UPLO(*uplo)==UP) - { - A.triangularView<Upper>().adjoint().solveInPlace(B); - A.triangularView<Upper>().solveInPlace(B); - } - else - { - A.triangularView<Lower>().solveInPlace(B); - A.triangularView<Lower>().adjoint().solveInPlace(B); - } - - return 0; -} diff --git a/eigen/lapack/clacgv.f b/eigen/lapack/clacgv.f deleted file mode 100644 index 359eb07..0000000 --- a/eigen/lapack/clacgv.f +++ /dev/null @@ -1,116 +0,0 @@ -*> \brief \b CLACGV -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download CLACGV + dependencies -*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/clacgv.f"> -*> [TGZ]</a> -*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/clacgv.f"> -*> [ZIP]</a> -*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/clacgv.f"> -*> [TXT]</a> -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE CLACGV( N, X, INCX ) -* -* .. Scalar Arguments .. -* INTEGER INCX, N -* .. -* .. Array Arguments .. -* COMPLEX X( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> CLACGV conjugates a complex vector of length N. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The length of the vector X. N >= 0. -*> \endverbatim -*> -*> \param[in,out] X -*> \verbatim -*> X is COMPLEX array, dimension -*> (1+(N-1)*abs(INCX)) -*> On entry, the vector of length N to be conjugated. -*> On exit, X is overwritten with conjg(X). -*> \endverbatim -*> -*> \param[in] INCX -*> \verbatim -*> INCX is INTEGER -*> The spacing between successive elements of X. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \date November 2011 -* -*> \ingroup complexOTHERauxiliary -* -* ===================================================================== - SUBROUTINE CLACGV( N, X, INCX ) -* -* -- LAPACK auxiliary routine (version 3.4.0) -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* November 2011 -* -* .. Scalar Arguments .. - INTEGER INCX, N -* .. -* .. Array Arguments .. - COMPLEX X( * ) -* .. -* -* ===================================================================== -* -* .. Local Scalars .. - INTEGER I, IOFF -* .. -* .. Intrinsic Functions .. - INTRINSIC CONJG -* .. -* .. Executable Statements .. -* - IF( INCX.EQ.1 ) THEN - DO 10 I = 1, N - X( I ) = CONJG( X( I ) ) - 10 CONTINUE - ELSE - IOFF = 1 - IF( INCX.LT.0 ) - $ IOFF = 1 - ( N-1 )*INCX - DO 20 I = 1, N - X( IOFF ) = CONJG( X( IOFF ) ) - IOFF = IOFF + INCX - 20 CONTINUE - END IF - RETURN -* -* End of CLACGV -* - END diff --git a/eigen/lapack/cladiv.f b/eigen/lapack/cladiv.f deleted file mode 100644 index 2807ac5..0000000 --- a/eigen/lapack/cladiv.f +++ /dev/null @@ -1,97 +0,0 @@ -*> \brief \b CLADIV -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download CLADIV + dependencies -*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/cladiv.f"> -*> [TGZ]</a> -*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/cladiv.f"> -*> [ZIP]</a> -*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/cladiv.f"> -*> [TXT]</a> -*> \endhtmlonly -* -* Definition: -* =========== -* -* COMPLEX FUNCTION CLADIV( X, Y ) -* -* .. Scalar Arguments .. -* COMPLEX X, Y -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> CLADIV := X / Y, where X and Y are complex. The computation of X / Y -*> will not overflow on an intermediary step unless the results -*> overflows. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] X -*> \verbatim -*> X is COMPLEX -*> \endverbatim -*> -*> \param[in] Y -*> \verbatim -*> Y is COMPLEX -*> The complex scalars X and Y. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \date November 2011 -* -*> \ingroup complexOTHERauxiliary -* -* ===================================================================== - COMPLEX FUNCTION CLADIV( X, Y ) -* -* -- LAPACK auxiliary routine (version 3.4.0) -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* November 2011 -* -* .. Scalar Arguments .. - COMPLEX X, Y -* .. -* -* ===================================================================== -* -* .. Local Scalars .. - REAL ZI, ZR -* .. -* .. External Subroutines .. - EXTERNAL SLADIV -* .. -* .. Intrinsic Functions .. - INTRINSIC AIMAG, CMPLX, REAL -* .. -* .. Executable Statements .. -* - CALL SLADIV( REAL( X ), AIMAG( X ), REAL( Y ), AIMAG( Y ), ZR, - $ ZI ) - CLADIV = CMPLX( ZR, ZI ) -* - RETURN -* -* End of CLADIV -* - END diff --git a/eigen/lapack/clarf.f b/eigen/lapack/clarf.f deleted file mode 100644 index ca0328f..0000000 --- a/eigen/lapack/clarf.f +++ /dev/null @@ -1,232 +0,0 @@ -*> \brief \b CLARF -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download CLARF + dependencies -*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/clarf.f"> -*> [TGZ]</a> -*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/clarf.f"> -*> [ZIP]</a> -*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/clarf.f"> -*> [TXT]</a> -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE CLARF( SIDE, M, N, V, INCV, TAU, C, LDC, WORK ) -* -* .. Scalar Arguments .. -* CHARACTER SIDE -* INTEGER INCV, LDC, M, N -* COMPLEX TAU -* .. -* .. Array Arguments .. -* COMPLEX C( LDC, * ), V( * ), WORK( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> CLARF applies a complex elementary reflector H to a complex M-by-N -*> matrix C, from either the left or the right. H is represented in the -*> form -*> -*> H = I - tau * v * v**H -*> -*> where tau is a complex scalar and v is a complex vector. -*> -*> If tau = 0, then H is taken to be the unit matrix. -*> -*> To apply H**H (the conjugate transpose of H), supply conjg(tau) instead -*> tau. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] SIDE -*> \verbatim -*> SIDE is CHARACTER*1 -*> = 'L': form H * C -*> = 'R': form C * H -*> \endverbatim -*> -*> \param[in] M -*> \verbatim -*> M is INTEGER -*> The number of rows of the matrix C. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The number of columns of the matrix C. -*> \endverbatim -*> -*> \param[in] V -*> \verbatim -*> V is COMPLEX array, dimension -*> (1 + (M-1)*abs(INCV)) if SIDE = 'L' -*> or (1 + (N-1)*abs(INCV)) if SIDE = 'R' -*> The vector v in the representation of H. V is not used if -*> TAU = 0. -*> \endverbatim -*> -*> \param[in] INCV -*> \verbatim -*> INCV is INTEGER -*> The increment between elements of v. INCV <> 0. -*> \endverbatim -*> -*> \param[in] TAU -*> \verbatim -*> TAU is COMPLEX -*> The value tau in the representation of H. -*> \endverbatim -*> -*> \param[in,out] C -*> \verbatim -*> C is COMPLEX array, dimension (LDC,N) -*> On entry, the M-by-N matrix C. -*> On exit, C is overwritten by the matrix H * C if SIDE = 'L', -*> or C * H if SIDE = 'R'. -*> \endverbatim -*> -*> \param[in] LDC -*> \verbatim -*> LDC is INTEGER -*> The leading dimension of the array C. LDC >= max(1,M). -*> \endverbatim -*> -*> \param[out] WORK -*> \verbatim -*> WORK is COMPLEX array, dimension -*> (N) if SIDE = 'L' -*> or (M) if SIDE = 'R' -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \date November 2011 -* -*> \ingroup complexOTHERauxiliary -* -* ===================================================================== - SUBROUTINE CLARF( SIDE, M, N, V, INCV, TAU, C, LDC, WORK ) -* -* -- LAPACK auxiliary routine (version 3.4.0) -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* November 2011 -* -* .. Scalar Arguments .. - CHARACTER SIDE - INTEGER INCV, LDC, M, N - COMPLEX TAU -* .. -* .. Array Arguments .. - COMPLEX C( LDC, * ), V( * ), WORK( * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - COMPLEX ONE, ZERO - PARAMETER ( ONE = ( 1.0E+0, 0.0E+0 ), - $ ZERO = ( 0.0E+0, 0.0E+0 ) ) -* .. -* .. Local Scalars .. - LOGICAL APPLYLEFT - INTEGER I, LASTV, LASTC -* .. -* .. External Subroutines .. - EXTERNAL CGEMV, CGERC -* .. -* .. External Functions .. - LOGICAL LSAME - INTEGER ILACLR, ILACLC - EXTERNAL LSAME, ILACLR, ILACLC -* .. -* .. Executable Statements .. -* - APPLYLEFT = LSAME( SIDE, 'L' ) - LASTV = 0 - LASTC = 0 - IF( TAU.NE.ZERO ) THEN -! Set up variables for scanning V. LASTV begins pointing to the end -! of V. - IF( APPLYLEFT ) THEN - LASTV = M - ELSE - LASTV = N - END IF - IF( INCV.GT.0 ) THEN - I = 1 + (LASTV-1) * INCV - ELSE - I = 1 - END IF -! Look for the last non-zero row in V. - DO WHILE( LASTV.GT.0 .AND. V( I ).EQ.ZERO ) - LASTV = LASTV - 1 - I = I - INCV - END DO - IF( APPLYLEFT ) THEN -! Scan for the last non-zero column in C(1:lastv,:). - LASTC = ILACLC(LASTV, N, C, LDC) - ELSE -! Scan for the last non-zero row in C(:,1:lastv). - LASTC = ILACLR(M, LASTV, C, LDC) - END IF - END IF -! Note that lastc.eq.0 renders the BLAS operations null; no special -! case is needed at this level. - IF( APPLYLEFT ) THEN -* -* Form H * C -* - IF( LASTV.GT.0 ) THEN -* -* w(1:lastc,1) := C(1:lastv,1:lastc)**H * v(1:lastv,1) -* - CALL CGEMV( 'Conjugate transpose', LASTV, LASTC, ONE, - $ C, LDC, V, INCV, ZERO, WORK, 1 ) -* -* C(1:lastv,1:lastc) := C(...) - v(1:lastv,1) * w(1:lastc,1)**H -* - CALL CGERC( LASTV, LASTC, -TAU, V, INCV, WORK, 1, C, LDC ) - END IF - ELSE -* -* Form C * H -* - IF( LASTV.GT.0 ) THEN -* -* w(1:lastc,1) := C(1:lastc,1:lastv) * v(1:lastv,1) -* - CALL CGEMV( 'No transpose', LASTC, LASTV, ONE, C, LDC, - $ V, INCV, ZERO, WORK, 1 ) -* -* C(1:lastc,1:lastv) := C(...) - w(1:lastc,1) * v(1:lastv,1)**H -* - CALL CGERC( LASTC, LASTV, -TAU, WORK, 1, V, INCV, C, LDC ) - END IF - END IF - RETURN -* -* End of CLARF -* - END diff --git a/eigen/lapack/clarfb.f b/eigen/lapack/clarfb.f deleted file mode 100644 index 40bbdf4..0000000 --- a/eigen/lapack/clarfb.f +++ /dev/null @@ -1,771 +0,0 @@ -*> \brief \b CLARFB -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download CLARFB + dependencies -*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/clarfb.f"> -*> [TGZ]</a> -*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/clarfb.f"> -*> [ZIP]</a> -*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/clarfb.f"> -*> [TXT]</a> -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE CLARFB( SIDE, TRANS, DIRECT, STOREV, M, N, K, V, LDV, -* T, LDT, C, LDC, WORK, LDWORK ) -* -* .. Scalar Arguments .. -* CHARACTER DIRECT, SIDE, STOREV, TRANS -* INTEGER K, LDC, LDT, LDV, LDWORK, M, N -* .. -* .. Array Arguments .. -* COMPLEX C( LDC, * ), T( LDT, * ), V( LDV, * ), -* $ WORK( LDWORK, * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> CLARFB applies a complex block reflector H or its transpose H**H to a -*> complex M-by-N matrix C, from either the left or the right. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] SIDE -*> \verbatim -*> SIDE is CHARACTER*1 -*> = 'L': apply H or H**H from the Left -*> = 'R': apply H or H**H from the Right -*> \endverbatim -*> -*> \param[in] TRANS -*> \verbatim -*> TRANS is CHARACTER*1 -*> = 'N': apply H (No transpose) -*> = 'C': apply H**H (Conjugate transpose) -*> \endverbatim -*> -*> \param[in] DIRECT -*> \verbatim -*> DIRECT is CHARACTER*1 -*> Indicates how H is formed from a product of elementary -*> reflectors -*> = 'F': H = H(1) H(2) . . . H(k) (Forward) -*> = 'B': H = H(k) . . . H(2) H(1) (Backward) -*> \endverbatim -*> -*> \param[in] STOREV -*> \verbatim -*> STOREV is CHARACTER*1 -*> Indicates how the vectors which define the elementary -*> reflectors are stored: -*> = 'C': Columnwise -*> = 'R': Rowwise -*> \endverbatim -*> -*> \param[in] M -*> \verbatim -*> M is INTEGER -*> The number of rows of the matrix C. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The number of columns of the matrix C. -*> \endverbatim -*> -*> \param[in] K -*> \verbatim -*> K is INTEGER -*> The order of the matrix T (= the number of elementary -*> reflectors whose product defines the block reflector). -*> \endverbatim -*> -*> \param[in] V -*> \verbatim -*> V is COMPLEX array, dimension -*> (LDV,K) if STOREV = 'C' -*> (LDV,M) if STOREV = 'R' and SIDE = 'L' -*> (LDV,N) if STOREV = 'R' and SIDE = 'R' -*> The matrix V. See Further Details. -*> \endverbatim -*> -*> \param[in] LDV -*> \verbatim -*> LDV is INTEGER -*> The leading dimension of the array V. -*> If STOREV = 'C' and SIDE = 'L', LDV >= max(1,M); -*> if STOREV = 'C' and SIDE = 'R', LDV >= max(1,N); -*> if STOREV = 'R', LDV >= K. -*> \endverbatim -*> -*> \param[in] T -*> \verbatim -*> T is COMPLEX array, dimension (LDT,K) -*> The triangular K-by-K matrix T in the representation of the -*> block reflector. -*> \endverbatim -*> -*> \param[in] LDT -*> \verbatim -*> LDT is INTEGER -*> The leading dimension of the array T. LDT >= K. -*> \endverbatim -*> -*> \param[in,out] C -*> \verbatim -*> C is COMPLEX array, dimension (LDC,N) -*> On entry, the M-by-N matrix C. -*> On exit, C is overwritten by H*C or H**H*C or C*H or C*H**H. -*> \endverbatim -*> -*> \param[in] LDC -*> \verbatim -*> LDC is INTEGER -*> The leading dimension of the array C. LDC >= max(1,M). -*> \endverbatim -*> -*> \param[out] WORK -*> \verbatim -*> WORK is COMPLEX array, dimension (LDWORK,K) -*> \endverbatim -*> -*> \param[in] LDWORK -*> \verbatim -*> LDWORK is INTEGER -*> The leading dimension of the array WORK. -*> If SIDE = 'L', LDWORK >= max(1,N); -*> if SIDE = 'R', LDWORK >= max(1,M). -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \date November 2011 -* -*> \ingroup complexOTHERauxiliary -* -*> \par Further Details: -* ===================== -*> -*> \verbatim -*> -*> The shape of the matrix V and the storage of the vectors which define -*> the H(i) is best illustrated by the following example with n = 5 and -*> k = 3. The elements equal to 1 are not stored; the corresponding -*> array elements are modified but restored on exit. The rest of the -*> array is not used. -*> -*> DIRECT = 'F' and STOREV = 'C': DIRECT = 'F' and STOREV = 'R': -*> -*> V = ( 1 ) V = ( 1 v1 v1 v1 v1 ) -*> ( v1 1 ) ( 1 v2 v2 v2 ) -*> ( v1 v2 1 ) ( 1 v3 v3 ) -*> ( v1 v2 v3 ) -*> ( v1 v2 v3 ) -*> -*> DIRECT = 'B' and STOREV = 'C': DIRECT = 'B' and STOREV = 'R': -*> -*> V = ( v1 v2 v3 ) V = ( v1 v1 1 ) -*> ( v1 v2 v3 ) ( v2 v2 v2 1 ) -*> ( 1 v2 v3 ) ( v3 v3 v3 v3 1 ) -*> ( 1 v3 ) -*> ( 1 ) -*> \endverbatim -*> -* ===================================================================== - SUBROUTINE CLARFB( SIDE, TRANS, DIRECT, STOREV, M, N, K, V, LDV, - $ T, LDT, C, LDC, WORK, LDWORK ) -* -* -- LAPACK auxiliary routine (version 3.4.0) -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* November 2011 -* -* .. Scalar Arguments .. - CHARACTER DIRECT, SIDE, STOREV, TRANS - INTEGER K, LDC, LDT, LDV, LDWORK, M, N -* .. -* .. Array Arguments .. - COMPLEX C( LDC, * ), T( LDT, * ), V( LDV, * ), - $ WORK( LDWORK, * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - COMPLEX ONE - PARAMETER ( ONE = ( 1.0E+0, 0.0E+0 ) ) -* .. -* .. Local Scalars .. - CHARACTER TRANST - INTEGER I, J, LASTV, LASTC -* .. -* .. External Functions .. - LOGICAL LSAME - INTEGER ILACLR, ILACLC - EXTERNAL LSAME, ILACLR, ILACLC -* .. -* .. External Subroutines .. - EXTERNAL CCOPY, CGEMM, CLACGV, CTRMM -* .. -* .. Intrinsic Functions .. - INTRINSIC CONJG -* .. -* .. Executable Statements .. -* -* Quick return if possible -* - IF( M.LE.0 .OR. N.LE.0 ) - $ RETURN -* - IF( LSAME( TRANS, 'N' ) ) THEN - TRANST = 'C' - ELSE - TRANST = 'N' - END IF -* - IF( LSAME( STOREV, 'C' ) ) THEN -* - IF( LSAME( DIRECT, 'F' ) ) THEN -* -* Let V = ( V1 ) (first K rows) -* ( V2 ) -* where V1 is unit lower triangular. -* - IF( LSAME( SIDE, 'L' ) ) THEN -* -* Form H * C or H**H * C where C = ( C1 ) -* ( C2 ) -* - LASTV = MAX( K, ILACLR( M, K, V, LDV ) ) - LASTC = ILACLC( LASTV, N, C, LDC ) -* -* W := C**H * V = (C1**H * V1 + C2**H * V2) (stored in WORK) -* -* W := C1**H -* - DO 10 J = 1, K - CALL CCOPY( LASTC, C( J, 1 ), LDC, WORK( 1, J ), 1 ) - CALL CLACGV( LASTC, WORK( 1, J ), 1 ) - 10 CONTINUE -* -* W := W * V1 -* - CALL CTRMM( 'Right', 'Lower', 'No transpose', 'Unit', - $ LASTC, K, ONE, V, LDV, WORK, LDWORK ) - IF( LASTV.GT.K ) THEN -* -* W := W + C2**H *V2 -* - CALL CGEMM( 'Conjugate transpose', 'No transpose', - $ LASTC, K, LASTV-K, ONE, C( K+1, 1 ), LDC, - $ V( K+1, 1 ), LDV, ONE, WORK, LDWORK ) - END IF -* -* W := W * T**H or W * T -* - CALL CTRMM( 'Right', 'Upper', TRANST, 'Non-unit', - $ LASTC, K, ONE, T, LDT, WORK, LDWORK ) -* -* C := C - V * W**H -* - IF( M.GT.K ) THEN -* -* C2 := C2 - V2 * W**H -* - CALL CGEMM( 'No transpose', 'Conjugate transpose', - $ LASTV-K, LASTC, K, -ONE, V( K+1, 1 ), LDV, - $ WORK, LDWORK, ONE, C( K+1, 1 ), LDC ) - END IF -* -* W := W * V1**H -* - CALL CTRMM( 'Right', 'Lower', 'Conjugate transpose', - $ 'Unit', LASTC, K, ONE, V, LDV, WORK, LDWORK ) -* -* C1 := C1 - W**H -* - DO 30 J = 1, K - DO 20 I = 1, LASTC - C( J, I ) = C( J, I ) - CONJG( WORK( I, J ) ) - 20 CONTINUE - 30 CONTINUE -* - ELSE IF( LSAME( SIDE, 'R' ) ) THEN -* -* Form C * H or C * H**H where C = ( C1 C2 ) -* - LASTV = MAX( K, ILACLR( N, K, V, LDV ) ) - LASTC = ILACLR( M, LASTV, C, LDC ) -* -* W := C * V = (C1*V1 + C2*V2) (stored in WORK) -* -* W := C1 -* - DO 40 J = 1, K - CALL CCOPY( LASTC, C( 1, J ), 1, WORK( 1, J ), 1 ) - 40 CONTINUE -* -* W := W * V1 -* - CALL CTRMM( 'Right', 'Lower', 'No transpose', 'Unit', - $ LASTC, K, ONE, V, LDV, WORK, LDWORK ) - IF( LASTV.GT.K ) THEN -* -* W := W + C2 * V2 -* - CALL CGEMM( 'No transpose', 'No transpose', - $ LASTC, K, LASTV-K, - $ ONE, C( 1, K+1 ), LDC, V( K+1, 1 ), LDV, - $ ONE, WORK, LDWORK ) - END IF -* -* W := W * T or W * T**H -* - CALL CTRMM( 'Right', 'Upper', TRANS, 'Non-unit', - $ LASTC, K, ONE, T, LDT, WORK, LDWORK ) -* -* C := C - W * V**H -* - IF( LASTV.GT.K ) THEN -* -* C2 := C2 - W * V2**H -* - CALL CGEMM( 'No transpose', 'Conjugate transpose', - $ LASTC, LASTV-K, K, - $ -ONE, WORK, LDWORK, V( K+1, 1 ), LDV, - $ ONE, C( 1, K+1 ), LDC ) - END IF -* -* W := W * V1**H -* - CALL CTRMM( 'Right', 'Lower', 'Conjugate transpose', - $ 'Unit', LASTC, K, ONE, V, LDV, WORK, LDWORK ) -* -* C1 := C1 - W -* - DO 60 J = 1, K - DO 50 I = 1, LASTC - C( I, J ) = C( I, J ) - WORK( I, J ) - 50 CONTINUE - 60 CONTINUE - END IF -* - ELSE -* -* Let V = ( V1 ) -* ( V2 ) (last K rows) -* where V2 is unit upper triangular. -* - IF( LSAME( SIDE, 'L' ) ) THEN -* -* Form H * C or H**H * C where C = ( C1 ) -* ( C2 ) -* - LASTV = MAX( K, ILACLR( M, K, V, LDV ) ) - LASTC = ILACLC( LASTV, N, C, LDC ) -* -* W := C**H * V = (C1**H * V1 + C2**H * V2) (stored in WORK) -* -* W := C2**H -* - DO 70 J = 1, K - CALL CCOPY( LASTC, C( LASTV-K+J, 1 ), LDC, - $ WORK( 1, J ), 1 ) - CALL CLACGV( LASTC, WORK( 1, J ), 1 ) - 70 CONTINUE -* -* W := W * V2 -* - CALL CTRMM( 'Right', 'Upper', 'No transpose', 'Unit', - $ LASTC, K, ONE, V( LASTV-K+1, 1 ), LDV, - $ WORK, LDWORK ) - IF( LASTV.GT.K ) THEN -* -* W := W + C1**H*V1 -* - CALL CGEMM( 'Conjugate transpose', 'No transpose', - $ LASTC, K, LASTV-K, ONE, C, LDC, V, LDV, - $ ONE, WORK, LDWORK ) - END IF -* -* W := W * T**H or W * T -* - CALL CTRMM( 'Right', 'Lower', TRANST, 'Non-unit', - $ LASTC, K, ONE, T, LDT, WORK, LDWORK ) -* -* C := C - V * W**H -* - IF( LASTV.GT.K ) THEN -* -* C1 := C1 - V1 * W**H -* - CALL CGEMM( 'No transpose', 'Conjugate transpose', - $ LASTV-K, LASTC, K, -ONE, V, LDV, WORK, LDWORK, - $ ONE, C, LDC ) - END IF -* -* W := W * V2**H -* - CALL CTRMM( 'Right', 'Upper', 'Conjugate transpose', - $ 'Unit', LASTC, K, ONE, V( LASTV-K+1, 1 ), LDV, - $ WORK, LDWORK ) -* -* C2 := C2 - W**H -* - DO 90 J = 1, K - DO 80 I = 1, LASTC - C( LASTV-K+J, I ) = C( LASTV-K+J, I ) - - $ CONJG( WORK( I, J ) ) - 80 CONTINUE - 90 CONTINUE -* - ELSE IF( LSAME( SIDE, 'R' ) ) THEN -* -* Form C * H or C * H**H where C = ( C1 C2 ) -* - LASTV = MAX( K, ILACLR( N, K, V, LDV ) ) - LASTC = ILACLR( M, LASTV, C, LDC ) -* -* W := C * V = (C1*V1 + C2*V2) (stored in WORK) -* -* W := C2 -* - DO 100 J = 1, K - CALL CCOPY( LASTC, C( 1, LASTV-K+J ), 1, - $ WORK( 1, J ), 1 ) - 100 CONTINUE -* -* W := W * V2 -* - CALL CTRMM( 'Right', 'Upper', 'No transpose', 'Unit', - $ LASTC, K, ONE, V( LASTV-K+1, 1 ), LDV, - $ WORK, LDWORK ) - IF( LASTV.GT.K ) THEN -* -* W := W + C1 * V1 -* - CALL CGEMM( 'No transpose', 'No transpose', - $ LASTC, K, LASTV-K, - $ ONE, C, LDC, V, LDV, ONE, WORK, LDWORK ) - END IF -* -* W := W * T or W * T**H -* - CALL CTRMM( 'Right', 'Lower', TRANS, 'Non-unit', - $ LASTC, K, ONE, T, LDT, WORK, LDWORK ) -* -* C := C - W * V**H -* - IF( LASTV.GT.K ) THEN -* -* C1 := C1 - W * V1**H -* - CALL CGEMM( 'No transpose', 'Conjugate transpose', - $ LASTC, LASTV-K, K, -ONE, WORK, LDWORK, V, LDV, - $ ONE, C, LDC ) - END IF -* -* W := W * V2**H -* - CALL CTRMM( 'Right', 'Upper', 'Conjugate transpose', - $ 'Unit', LASTC, K, ONE, V( LASTV-K+1, 1 ), LDV, - $ WORK, LDWORK ) -* -* C2 := C2 - W -* - DO 120 J = 1, K - DO 110 I = 1, LASTC - C( I, LASTV-K+J ) = C( I, LASTV-K+J ) - $ - WORK( I, J ) - 110 CONTINUE - 120 CONTINUE - END IF - END IF -* - ELSE IF( LSAME( STOREV, 'R' ) ) THEN -* - IF( LSAME( DIRECT, 'F' ) ) THEN -* -* Let V = ( V1 V2 ) (V1: first K columns) -* where V1 is unit upper triangular. -* - IF( LSAME( SIDE, 'L' ) ) THEN -* -* Form H * C or H**H * C where C = ( C1 ) -* ( C2 ) -* - LASTV = MAX( K, ILACLC( K, M, V, LDV ) ) - LASTC = ILACLC( LASTV, N, C, LDC ) -* -* W := C**H * V**H = (C1**H * V1**H + C2**H * V2**H) (stored in WORK) -* -* W := C1**H -* - DO 130 J = 1, K - CALL CCOPY( LASTC, C( J, 1 ), LDC, WORK( 1, J ), 1 ) - CALL CLACGV( LASTC, WORK( 1, J ), 1 ) - 130 CONTINUE -* -* W := W * V1**H -* - CALL CTRMM( 'Right', 'Upper', 'Conjugate transpose', - $ 'Unit', LASTC, K, ONE, V, LDV, WORK, LDWORK ) - IF( LASTV.GT.K ) THEN -* -* W := W + C2**H*V2**H -* - CALL CGEMM( 'Conjugate transpose', - $ 'Conjugate transpose', LASTC, K, LASTV-K, - $ ONE, C( K+1, 1 ), LDC, V( 1, K+1 ), LDV, - $ ONE, WORK, LDWORK ) - END IF -* -* W := W * T**H or W * T -* - CALL CTRMM( 'Right', 'Upper', TRANST, 'Non-unit', - $ LASTC, K, ONE, T, LDT, WORK, LDWORK ) -* -* C := C - V**H * W**H -* - IF( LASTV.GT.K ) THEN -* -* C2 := C2 - V2**H * W**H -* - CALL CGEMM( 'Conjugate transpose', - $ 'Conjugate transpose', LASTV-K, LASTC, K, - $ -ONE, V( 1, K+1 ), LDV, WORK, LDWORK, - $ ONE, C( K+1, 1 ), LDC ) - END IF -* -* W := W * V1 -* - CALL CTRMM( 'Right', 'Upper', 'No transpose', 'Unit', - $ LASTC, K, ONE, V, LDV, WORK, LDWORK ) -* -* C1 := C1 - W**H -* - DO 150 J = 1, K - DO 140 I = 1, LASTC - C( J, I ) = C( J, I ) - CONJG( WORK( I, J ) ) - 140 CONTINUE - 150 CONTINUE -* - ELSE IF( LSAME( SIDE, 'R' ) ) THEN -* -* Form C * H or C * H**H where C = ( C1 C2 ) -* - LASTV = MAX( K, ILACLC( K, N, V, LDV ) ) - LASTC = ILACLR( M, LASTV, C, LDC ) -* -* W := C * V**H = (C1*V1**H + C2*V2**H) (stored in WORK) -* -* W := C1 -* - DO 160 J = 1, K - CALL CCOPY( LASTC, C( 1, J ), 1, WORK( 1, J ), 1 ) - 160 CONTINUE -* -* W := W * V1**H -* - CALL CTRMM( 'Right', 'Upper', 'Conjugate transpose', - $ 'Unit', LASTC, K, ONE, V, LDV, WORK, LDWORK ) - IF( LASTV.GT.K ) THEN -* -* W := W + C2 * V2**H -* - CALL CGEMM( 'No transpose', 'Conjugate transpose', - $ LASTC, K, LASTV-K, ONE, C( 1, K+1 ), LDC, - $ V( 1, K+1 ), LDV, ONE, WORK, LDWORK ) - END IF -* -* W := W * T or W * T**H -* - CALL CTRMM( 'Right', 'Upper', TRANS, 'Non-unit', - $ LASTC, K, ONE, T, LDT, WORK, LDWORK ) -* -* C := C - W * V -* - IF( LASTV.GT.K ) THEN -* -* C2 := C2 - W * V2 -* - CALL CGEMM( 'No transpose', 'No transpose', - $ LASTC, LASTV-K, K, - $ -ONE, WORK, LDWORK, V( 1, K+1 ), LDV, - $ ONE, C( 1, K+1 ), LDC ) - END IF -* -* W := W * V1 -* - CALL CTRMM( 'Right', 'Upper', 'No transpose', 'Unit', - $ LASTC, K, ONE, V, LDV, WORK, LDWORK ) -* -* C1 := C1 - W -* - DO 180 J = 1, K - DO 170 I = 1, LASTC - C( I, J ) = C( I, J ) - WORK( I, J ) - 170 CONTINUE - 180 CONTINUE -* - END IF -* - ELSE -* -* Let V = ( V1 V2 ) (V2: last K columns) -* where V2 is unit lower triangular. -* - IF( LSAME( SIDE, 'L' ) ) THEN -* -* Form H * C or H**H * C where C = ( C1 ) -* ( C2 ) -* - LASTV = MAX( K, ILACLC( K, M, V, LDV ) ) - LASTC = ILACLC( LASTV, N, C, LDC ) -* -* W := C**H * V**H = (C1**H * V1**H + C2**H * V2**H) (stored in WORK) -* -* W := C2**H -* - DO 190 J = 1, K - CALL CCOPY( LASTC, C( LASTV-K+J, 1 ), LDC, - $ WORK( 1, J ), 1 ) - CALL CLACGV( LASTC, WORK( 1, J ), 1 ) - 190 CONTINUE -* -* W := W * V2**H -* - CALL CTRMM( 'Right', 'Lower', 'Conjugate transpose', - $ 'Unit', LASTC, K, ONE, V( 1, LASTV-K+1 ), LDV, - $ WORK, LDWORK ) - IF( LASTV.GT.K ) THEN -* -* W := W + C1**H * V1**H -* - CALL CGEMM( 'Conjugate transpose', - $ 'Conjugate transpose', LASTC, K, LASTV-K, - $ ONE, C, LDC, V, LDV, ONE, WORK, LDWORK ) - END IF -* -* W := W * T**H or W * T -* - CALL CTRMM( 'Right', 'Lower', TRANST, 'Non-unit', - $ LASTC, K, ONE, T, LDT, WORK, LDWORK ) -* -* C := C - V**H * W**H -* - IF( LASTV.GT.K ) THEN -* -* C1 := C1 - V1**H * W**H -* - CALL CGEMM( 'Conjugate transpose', - $ 'Conjugate transpose', LASTV-K, LASTC, K, - $ -ONE, V, LDV, WORK, LDWORK, ONE, C, LDC ) - END IF -* -* W := W * V2 -* - CALL CTRMM( 'Right', 'Lower', 'No transpose', 'Unit', - $ LASTC, K, ONE, V( 1, LASTV-K+1 ), LDV, - $ WORK, LDWORK ) -* -* C2 := C2 - W**H -* - DO 210 J = 1, K - DO 200 I = 1, LASTC - C( LASTV-K+J, I ) = C( LASTV-K+J, I ) - - $ CONJG( WORK( I, J ) ) - 200 CONTINUE - 210 CONTINUE -* - ELSE IF( LSAME( SIDE, 'R' ) ) THEN -* -* Form C * H or C * H**H where C = ( C1 C2 ) -* - LASTV = MAX( K, ILACLC( K, N, V, LDV ) ) - LASTC = ILACLR( M, LASTV, C, LDC ) -* -* W := C * V**H = (C1*V1**H + C2*V2**H) (stored in WORK) -* -* W := C2 -* - DO 220 J = 1, K - CALL CCOPY( LASTC, C( 1, LASTV-K+J ), 1, - $ WORK( 1, J ), 1 ) - 220 CONTINUE -* -* W := W * V2**H -* - CALL CTRMM( 'Right', 'Lower', 'Conjugate transpose', - $ 'Unit', LASTC, K, ONE, V( 1, LASTV-K+1 ), LDV, - $ WORK, LDWORK ) - IF( LASTV.GT.K ) THEN -* -* W := W + C1 * V1**H -* - CALL CGEMM( 'No transpose', 'Conjugate transpose', - $ LASTC, K, LASTV-K, ONE, C, LDC, V, LDV, ONE, - $ WORK, LDWORK ) - END IF -* -* W := W * T or W * T**H -* - CALL CTRMM( 'Right', 'Lower', TRANS, 'Non-unit', - $ LASTC, K, ONE, T, LDT, WORK, LDWORK ) -* -* C := C - W * V -* - IF( LASTV.GT.K ) THEN -* -* C1 := C1 - W * V1 -* - CALL CGEMM( 'No transpose', 'No transpose', - $ LASTC, LASTV-K, K, -ONE, WORK, LDWORK, V, LDV, - $ ONE, C, LDC ) - END IF -* -* W := W * V2 -* - CALL CTRMM( 'Right', 'Lower', 'No transpose', 'Unit', - $ LASTC, K, ONE, V( 1, LASTV-K+1 ), LDV, - $ WORK, LDWORK ) -* -* C1 := C1 - W -* - DO 240 J = 1, K - DO 230 I = 1, LASTC - C( I, LASTV-K+J ) = C( I, LASTV-K+J ) - $ - WORK( I, J ) - 230 CONTINUE - 240 CONTINUE -* - END IF -* - END IF - END IF -* - RETURN -* -* End of CLARFB -* - END diff --git a/eigen/lapack/clarfg.f b/eigen/lapack/clarfg.f deleted file mode 100644 index d64f396..0000000 --- a/eigen/lapack/clarfg.f +++ /dev/null @@ -1,203 +0,0 @@ -*> \brief \b CLARFG -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download CLARFG + dependencies -*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/clarfg.f"> -*> [TGZ]</a> -*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/clarfg.f"> -*> [ZIP]</a> -*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/clarfg.f"> -*> [TXT]</a> -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE CLARFG( N, ALPHA, X, INCX, TAU ) -* -* .. Scalar Arguments .. -* INTEGER INCX, N -* COMPLEX ALPHA, TAU -* .. -* .. Array Arguments .. -* COMPLEX X( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> CLARFG generates a complex elementary reflector H of order n, such -*> that -*> -*> H**H * ( alpha ) = ( beta ), H**H * H = I. -*> ( x ) ( 0 ) -*> -*> where alpha and beta are scalars, with beta real, and x is an -*> (n-1)-element complex vector. H is represented in the form -*> -*> H = I - tau * ( 1 ) * ( 1 v**H ) , -*> ( v ) -*> -*> where tau is a complex scalar and v is a complex (n-1)-element -*> vector. Note that H is not hermitian. -*> -*> If the elements of x are all zero and alpha is real, then tau = 0 -*> and H is taken to be the unit matrix. -*> -*> Otherwise 1 <= real(tau) <= 2 and abs(tau-1) <= 1 . -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The order of the elementary reflector. -*> \endverbatim -*> -*> \param[in,out] ALPHA -*> \verbatim -*> ALPHA is COMPLEX -*> On entry, the value alpha. -*> On exit, it is overwritten with the value beta. -*> \endverbatim -*> -*> \param[in,out] X -*> \verbatim -*> X is COMPLEX array, dimension -*> (1+(N-2)*abs(INCX)) -*> On entry, the vector x. -*> On exit, it is overwritten with the vector v. -*> \endverbatim -*> -*> \param[in] INCX -*> \verbatim -*> INCX is INTEGER -*> The increment between elements of X. INCX > 0. -*> \endverbatim -*> -*> \param[out] TAU -*> \verbatim -*> TAU is COMPLEX -*> The value tau. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \date November 2011 -* -*> \ingroup complexOTHERauxiliary -* -* ===================================================================== - SUBROUTINE CLARFG( N, ALPHA, X, INCX, TAU ) -* -* -- LAPACK auxiliary routine (version 3.4.0) -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* November 2011 -* -* .. Scalar Arguments .. - INTEGER INCX, N - COMPLEX ALPHA, TAU -* .. -* .. Array Arguments .. - COMPLEX X( * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - REAL ONE, ZERO - PARAMETER ( ONE = 1.0E+0, ZERO = 0.0E+0 ) -* .. -* .. Local Scalars .. - INTEGER J, KNT - REAL ALPHI, ALPHR, BETA, RSAFMN, SAFMIN, XNORM -* .. -* .. External Functions .. - REAL SCNRM2, SLAMCH, SLAPY3 - COMPLEX CLADIV - EXTERNAL SCNRM2, SLAMCH, SLAPY3, CLADIV -* .. -* .. Intrinsic Functions .. - INTRINSIC ABS, AIMAG, CMPLX, REAL, SIGN -* .. -* .. External Subroutines .. - EXTERNAL CSCAL, CSSCAL -* .. -* .. Executable Statements .. -* - IF( N.LE.0 ) THEN - TAU = ZERO - RETURN - END IF -* - XNORM = SCNRM2( N-1, X, INCX ) - ALPHR = REAL( ALPHA ) - ALPHI = AIMAG( ALPHA ) -* - IF( XNORM.EQ.ZERO .AND. ALPHI.EQ.ZERO ) THEN -* -* H = I -* - TAU = ZERO - ELSE -* -* general case -* - BETA = -SIGN( SLAPY3( ALPHR, ALPHI, XNORM ), ALPHR ) - SAFMIN = SLAMCH( 'S' ) / SLAMCH( 'E' ) - RSAFMN = ONE / SAFMIN -* - KNT = 0 - IF( ABS( BETA ).LT.SAFMIN ) THEN -* -* XNORM, BETA may be inaccurate; scale X and recompute them -* - 10 CONTINUE - KNT = KNT + 1 - CALL CSSCAL( N-1, RSAFMN, X, INCX ) - BETA = BETA*RSAFMN - ALPHI = ALPHI*RSAFMN - ALPHR = ALPHR*RSAFMN - IF( ABS( BETA ).LT.SAFMIN ) - $ GO TO 10 -* -* New BETA is at most 1, at least SAFMIN -* - XNORM = SCNRM2( N-1, X, INCX ) - ALPHA = CMPLX( ALPHR, ALPHI ) - BETA = -SIGN( SLAPY3( ALPHR, ALPHI, XNORM ), ALPHR ) - END IF - TAU = CMPLX( ( BETA-ALPHR ) / BETA, -ALPHI / BETA ) - ALPHA = CLADIV( CMPLX( ONE ), ALPHA-BETA ) - CALL CSCAL( N-1, ALPHA, X, INCX ) -* -* If ALPHA is subnormal, it may lose relative accuracy -* - DO 20 J = 1, KNT - BETA = BETA*SAFMIN - 20 CONTINUE - ALPHA = BETA - END IF -* - RETURN -* -* End of CLARFG -* - END diff --git a/eigen/lapack/clarft.f b/eigen/lapack/clarft.f deleted file mode 100644 index 981447f..0000000 --- a/eigen/lapack/clarft.f +++ /dev/null @@ -1,328 +0,0 @@ -*> \brief \b CLARFT -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download CLARFT + dependencies -*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/clarft.f"> -*> [TGZ]</a> -*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/clarft.f"> -*> [ZIP]</a> -*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/clarft.f"> -*> [TXT]</a> -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE CLARFT( DIRECT, STOREV, N, K, V, LDV, TAU, T, LDT ) -* -* .. Scalar Arguments .. -* CHARACTER DIRECT, STOREV -* INTEGER K, LDT, LDV, N -* .. -* .. Array Arguments .. -* COMPLEX T( LDT, * ), TAU( * ), V( LDV, * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> CLARFT forms the triangular factor T of a complex block reflector H -*> of order n, which is defined as a product of k elementary reflectors. -*> -*> If DIRECT = 'F', H = H(1) H(2) . . . H(k) and T is upper triangular; -*> -*> If DIRECT = 'B', H = H(k) . . . H(2) H(1) and T is lower triangular. -*> -*> If STOREV = 'C', the vector which defines the elementary reflector -*> H(i) is stored in the i-th column of the array V, and -*> -*> H = I - V * T * V**H -*> -*> If STOREV = 'R', the vector which defines the elementary reflector -*> H(i) is stored in the i-th row of the array V, and -*> -*> H = I - V**H * T * V -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] DIRECT -*> \verbatim -*> DIRECT is CHARACTER*1 -*> Specifies the order in which the elementary reflectors are -*> multiplied to form the block reflector: -*> = 'F': H = H(1) H(2) . . . H(k) (Forward) -*> = 'B': H = H(k) . . . H(2) H(1) (Backward) -*> \endverbatim -*> -*> \param[in] STOREV -*> \verbatim -*> STOREV is CHARACTER*1 -*> Specifies how the vectors which define the elementary -*> reflectors are stored (see also Further Details): -*> = 'C': columnwise -*> = 'R': rowwise -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The order of the block reflector H. N >= 0. -*> \endverbatim -*> -*> \param[in] K -*> \verbatim -*> K is INTEGER -*> The order of the triangular factor T (= the number of -*> elementary reflectors). K >= 1. -*> \endverbatim -*> -*> \param[in] V -*> \verbatim -*> V is COMPLEX array, dimension -*> (LDV,K) if STOREV = 'C' -*> (LDV,N) if STOREV = 'R' -*> The matrix V. See further details. -*> \endverbatim -*> -*> \param[in] LDV -*> \verbatim -*> LDV is INTEGER -*> The leading dimension of the array V. -*> If STOREV = 'C', LDV >= max(1,N); if STOREV = 'R', LDV >= K. -*> \endverbatim -*> -*> \param[in] TAU -*> \verbatim -*> TAU is COMPLEX array, dimension (K) -*> TAU(i) must contain the scalar factor of the elementary -*> reflector H(i). -*> \endverbatim -*> -*> \param[out] T -*> \verbatim -*> T is COMPLEX array, dimension (LDT,K) -*> The k by k triangular factor T of the block reflector. -*> If DIRECT = 'F', T is upper triangular; if DIRECT = 'B', T is -*> lower triangular. The rest of the array is not used. -*> \endverbatim -*> -*> \param[in] LDT -*> \verbatim -*> LDT is INTEGER -*> The leading dimension of the array T. LDT >= K. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \date April 2012 -* -*> \ingroup complexOTHERauxiliary -* -*> \par Further Details: -* ===================== -*> -*> \verbatim -*> -*> The shape of the matrix V and the storage of the vectors which define -*> the H(i) is best illustrated by the following example with n = 5 and -*> k = 3. The elements equal to 1 are not stored. -*> -*> DIRECT = 'F' and STOREV = 'C': DIRECT = 'F' and STOREV = 'R': -*> -*> V = ( 1 ) V = ( 1 v1 v1 v1 v1 ) -*> ( v1 1 ) ( 1 v2 v2 v2 ) -*> ( v1 v2 1 ) ( 1 v3 v3 ) -*> ( v1 v2 v3 ) -*> ( v1 v2 v3 ) -*> -*> DIRECT = 'B' and STOREV = 'C': DIRECT = 'B' and STOREV = 'R': -*> -*> V = ( v1 v2 v3 ) V = ( v1 v1 1 ) -*> ( v1 v2 v3 ) ( v2 v2 v2 1 ) -*> ( 1 v2 v3 ) ( v3 v3 v3 v3 1 ) -*> ( 1 v3 ) -*> ( 1 ) -*> \endverbatim -*> -* ===================================================================== - SUBROUTINE CLARFT( DIRECT, STOREV, N, K, V, LDV, TAU, T, LDT ) -* -* -- LAPACK auxiliary routine (version 3.4.1) -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* April 2012 -* -* .. Scalar Arguments .. - CHARACTER DIRECT, STOREV - INTEGER K, LDT, LDV, N -* .. -* .. Array Arguments .. - COMPLEX T( LDT, * ), TAU( * ), V( LDV, * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - COMPLEX ONE, ZERO - PARAMETER ( ONE = ( 1.0E+0, 0.0E+0 ), - $ ZERO = ( 0.0E+0, 0.0E+0 ) ) -* .. -* .. Local Scalars .. - INTEGER I, J, PREVLASTV, LASTV -* .. -* .. External Subroutines .. - EXTERNAL CGEMV, CLACGV, CTRMV -* .. -* .. External Functions .. - LOGICAL LSAME - EXTERNAL LSAME -* .. -* .. Executable Statements .. -* -* Quick return if possible -* - IF( N.EQ.0 ) - $ RETURN -* - IF( LSAME( DIRECT, 'F' ) ) THEN - PREVLASTV = N - DO I = 1, K - PREVLASTV = MAX( PREVLASTV, I ) - IF( TAU( I ).EQ.ZERO ) THEN -* -* H(i) = I -* - DO J = 1, I - T( J, I ) = ZERO - END DO - ELSE -* -* general case -* - IF( LSAME( STOREV, 'C' ) ) THEN -* Skip any trailing zeros. - DO LASTV = N, I+1, -1 - IF( V( LASTV, I ).NE.ZERO ) EXIT - END DO - DO J = 1, I-1 - T( J, I ) = -TAU( I ) * CONJG( V( I , J ) ) - END DO - J = MIN( LASTV, PREVLASTV ) -* -* T(1:i-1,i) := - tau(i) * V(i:j,1:i-1)**H * V(i:j,i) -* - CALL CGEMV( 'Conjugate transpose', J-I, I-1, - $ -TAU( I ), V( I+1, 1 ), LDV, - $ V( I+1, I ), 1, - $ ONE, T( 1, I ), 1 ) - ELSE -* Skip any trailing zeros. - DO LASTV = N, I+1, -1 - IF( V( I, LASTV ).NE.ZERO ) EXIT - END DO - DO J = 1, I-1 - T( J, I ) = -TAU( I ) * V( J , I ) - END DO - J = MIN( LASTV, PREVLASTV ) -* -* T(1:i-1,i) := - tau(i) * V(1:i-1,i:j) * V(i,i:j)**H -* - CALL CGEMM( 'N', 'C', I-1, 1, J-I, -TAU( I ), - $ V( 1, I+1 ), LDV, V( I, I+1 ), LDV, - $ ONE, T( 1, I ), LDT ) - END IF -* -* T(1:i-1,i) := T(1:i-1,1:i-1) * T(1:i-1,i) -* - CALL CTRMV( 'Upper', 'No transpose', 'Non-unit', I-1, T, - $ LDT, T( 1, I ), 1 ) - T( I, I ) = TAU( I ) - IF( I.GT.1 ) THEN - PREVLASTV = MAX( PREVLASTV, LASTV ) - ELSE - PREVLASTV = LASTV - END IF - END IF - END DO - ELSE - PREVLASTV = 1 - DO I = K, 1, -1 - IF( TAU( I ).EQ.ZERO ) THEN -* -* H(i) = I -* - DO J = I, K - T( J, I ) = ZERO - END DO - ELSE -* -* general case -* - IF( I.LT.K ) THEN - IF( LSAME( STOREV, 'C' ) ) THEN -* Skip any leading zeros. - DO LASTV = 1, I-1 - IF( V( LASTV, I ).NE.ZERO ) EXIT - END DO - DO J = I+1, K - T( J, I ) = -TAU( I ) * CONJG( V( N-K+I , J ) ) - END DO - J = MAX( LASTV, PREVLASTV ) -* -* T(i+1:k,i) = -tau(i) * V(j:n-k+i,i+1:k)**H * V(j:n-k+i,i) -* - CALL CGEMV( 'Conjugate transpose', N-K+I-J, K-I, - $ -TAU( I ), V( J, I+1 ), LDV, V( J, I ), - $ 1, ONE, T( I+1, I ), 1 ) - ELSE -* Skip any leading zeros. - DO LASTV = 1, I-1 - IF( V( I, LASTV ).NE.ZERO ) EXIT - END DO - DO J = I+1, K - T( J, I ) = -TAU( I ) * V( J, N-K+I ) - END DO - J = MAX( LASTV, PREVLASTV ) -* -* T(i+1:k,i) = -tau(i) * V(i+1:k,j:n-k+i) * V(i,j:n-k+i)**H -* - CALL CGEMM( 'N', 'C', K-I, 1, N-K+I-J, -TAU( I ), - $ V( I+1, J ), LDV, V( I, J ), LDV, - $ ONE, T( I+1, I ), LDT ) - END IF -* -* T(i+1:k,i) := T(i+1:k,i+1:k) * T(i+1:k,i) -* - CALL CTRMV( 'Lower', 'No transpose', 'Non-unit', K-I, - $ T( I+1, I+1 ), LDT, T( I+1, I ), 1 ) - IF( I.GT.1 ) THEN - PREVLASTV = MIN( PREVLASTV, LASTV ) - ELSE - PREVLASTV = LASTV - END IF - END IF - T( I, I ) = TAU( I ) - END IF - END DO - END IF - RETURN -* -* End of CLARFT -* - END diff --git a/eigen/lapack/complex_double.cpp b/eigen/lapack/complex_double.cpp deleted file mode 100644 index c9c5752..0000000 --- a/eigen/lapack/complex_double.cpp +++ /dev/null @@ -1,18 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2009-2014 Gael Guennebaud <gael.guennebaud@inria.fr> -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#define SCALAR std::complex<double> -#define SCALAR_SUFFIX z -#define SCALAR_SUFFIX_UP "Z" -#define REAL_SCALAR_SUFFIX d -#define ISCOMPLEX 1 - -#include "cholesky.cpp" -#include "lu.cpp" -#include "svd.cpp" diff --git a/eigen/lapack/complex_single.cpp b/eigen/lapack/complex_single.cpp deleted file mode 100644 index 6d11b26..0000000 --- a/eigen/lapack/complex_single.cpp +++ /dev/null @@ -1,18 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2009-2014 Gael Guennebaud <gael.guennebaud@inria.fr> -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#define SCALAR std::complex<float> -#define SCALAR_SUFFIX c -#define SCALAR_SUFFIX_UP "C" -#define REAL_SCALAR_SUFFIX s -#define ISCOMPLEX 1 - -#include "cholesky.cpp" -#include "lu.cpp" -#include "svd.cpp" diff --git a/eigen/lapack/dladiv.f b/eigen/lapack/dladiv.f deleted file mode 100644 index 090a906..0000000 --- a/eigen/lapack/dladiv.f +++ /dev/null @@ -1,128 +0,0 @@ -*> \brief \b DLADIV -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DLADIV + dependencies -*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/dladiv.f"> -*> [TGZ]</a> -*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/dladiv.f"> -*> [ZIP]</a> -*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/dladiv.f"> -*> [TXT]</a> -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DLADIV( A, B, C, D, P, Q ) -* -* .. Scalar Arguments .. -* DOUBLE PRECISION A, B, C, D, P, Q -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DLADIV performs complex division in real arithmetic -*> -*> a + i*b -*> p + i*q = --------- -*> c + i*d -*> -*> The algorithm is due to Robert L. Smith and can be found -*> in D. Knuth, The art of Computer Programming, Vol.2, p.195 -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] A -*> \verbatim -*> A is DOUBLE PRECISION -*> \endverbatim -*> -*> \param[in] B -*> \verbatim -*> B is DOUBLE PRECISION -*> \endverbatim -*> -*> \param[in] C -*> \verbatim -*> C is DOUBLE PRECISION -*> \endverbatim -*> -*> \param[in] D -*> \verbatim -*> D is DOUBLE PRECISION -*> The scalars a, b, c, and d in the above expression. -*> \endverbatim -*> -*> \param[out] P -*> \verbatim -*> P is DOUBLE PRECISION -*> \endverbatim -*> -*> \param[out] Q -*> \verbatim -*> Q is DOUBLE PRECISION -*> The scalars p and q in the above expression. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \date November 2011 -* -*> \ingroup auxOTHERauxiliary -* -* ===================================================================== - SUBROUTINE DLADIV( A, B, C, D, P, Q ) -* -* -- LAPACK auxiliary routine (version 3.4.0) -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* November 2011 -* -* .. Scalar Arguments .. - DOUBLE PRECISION A, B, C, D, P, Q -* .. -* -* ===================================================================== -* -* .. Local Scalars .. - DOUBLE PRECISION E, F -* .. -* .. Intrinsic Functions .. - INTRINSIC ABS -* .. -* .. Executable Statements .. -* - IF( ABS( D ).LT.ABS( C ) ) THEN - E = D / C - F = C + D*E - P = ( A+B*E ) / F - Q = ( B-A*E ) / F - ELSE - E = C / D - F = D + C*E - P = ( B+A*E ) / F - Q = ( -A+B*E ) / F - END IF -* - RETURN -* -* End of DLADIV -* - END diff --git a/eigen/lapack/dlamch.f b/eigen/lapack/dlamch.f deleted file mode 100644 index eb307e5..0000000 --- a/eigen/lapack/dlamch.f +++ /dev/null @@ -1,189 +0,0 @@ -*> \brief \b DLAMCH -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -* Definition: -* =========== -* -* DOUBLE PRECISION FUNCTION DLAMCH( CMACH ) -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DLAMCH determines double precision machine parameters. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] CMACH -*> \verbatim -*> Specifies the value to be returned by DLAMCH: -*> = 'E' or 'e', DLAMCH := eps -*> = 'S' or 's , DLAMCH := sfmin -*> = 'B' or 'b', DLAMCH := base -*> = 'P' or 'p', DLAMCH := eps*base -*> = 'N' or 'n', DLAMCH := t -*> = 'R' or 'r', DLAMCH := rnd -*> = 'M' or 'm', DLAMCH := emin -*> = 'U' or 'u', DLAMCH := rmin -*> = 'L' or 'l', DLAMCH := emax -*> = 'O' or 'o', DLAMCH := rmax -*> where -*> eps = relative machine precision -*> sfmin = safe minimum, such that 1/sfmin does not overflow -*> base = base of the machine -*> prec = eps*base -*> t = number of (base) digits in the mantissa -*> rnd = 1.0 when rounding occurs in addition, 0.0 otherwise -*> emin = minimum exponent before (gradual) underflow -*> rmin = underflow threshold - base**(emin-1) -*> emax = largest exponent before overflow -*> rmax = overflow threshold - (base**emax)*(1-eps) -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \date November 2011 -* -*> \ingroup auxOTHERauxiliary -* -* ===================================================================== - DOUBLE PRECISION FUNCTION DLAMCH( CMACH ) -* -* -- LAPACK auxiliary routine (version 3.4.0) -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* November 2011 -* -* .. Scalar Arguments .. - CHARACTER CMACH -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ONE, ZERO - PARAMETER ( ONE = 1.0D+0, ZERO = 0.0D+0 ) -* .. -* .. Local Scalars .. - DOUBLE PRECISION RND, EPS, SFMIN, SMALL, RMACH -* .. -* .. External Functions .. - LOGICAL LSAME - EXTERNAL LSAME -* .. -* .. Intrinsic Functions .. - INTRINSIC DIGITS, EPSILON, HUGE, MAXEXPONENT, - $ MINEXPONENT, RADIX, TINY -* .. -* .. Executable Statements .. -* -* -* Assume rounding, not chopping. Always. -* - RND = ONE -* - IF( ONE.EQ.RND ) THEN - EPS = EPSILON(ZERO) * 0.5 - ELSE - EPS = EPSILON(ZERO) - END IF -* - IF( LSAME( CMACH, 'E' ) ) THEN - RMACH = EPS - ELSE IF( LSAME( CMACH, 'S' ) ) THEN - SFMIN = TINY(ZERO) - SMALL = ONE / HUGE(ZERO) - IF( SMALL.GE.SFMIN ) THEN -* -* Use SMALL plus a bit, to avoid the possibility of rounding -* causing overflow when computing 1/sfmin. -* - SFMIN = SMALL*( ONE+EPS ) - END IF - RMACH = SFMIN - ELSE IF( LSAME( CMACH, 'B' ) ) THEN - RMACH = RADIX(ZERO) - ELSE IF( LSAME( CMACH, 'P' ) ) THEN - RMACH = EPS * RADIX(ZERO) - ELSE IF( LSAME( CMACH, 'N' ) ) THEN - RMACH = DIGITS(ZERO) - ELSE IF( LSAME( CMACH, 'R' ) ) THEN - RMACH = RND - ELSE IF( LSAME( CMACH, 'M' ) ) THEN - RMACH = MINEXPONENT(ZERO) - ELSE IF( LSAME( CMACH, 'U' ) ) THEN - RMACH = tiny(zero) - ELSE IF( LSAME( CMACH, 'L' ) ) THEN - RMACH = MAXEXPONENT(ZERO) - ELSE IF( LSAME( CMACH, 'O' ) ) THEN - RMACH = HUGE(ZERO) - ELSE - RMACH = ZERO - END IF -* - DLAMCH = RMACH - RETURN -* -* End of DLAMCH -* - END -************************************************************************ -*> \brief \b DLAMC3 -*> \details -*> \b Purpose: -*> \verbatim -*> DLAMC3 is intended to force A and B to be stored prior to doing -*> the addition of A and B , for use in situations where optimizers -*> might hold one of these in a register. -*> \endverbatim -*> \author LAPACK is a software package provided by Univ. of Tennessee, Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd.. -*> \date November 2011 -*> \ingroup auxOTHERauxiliary -*> -*> \param[in] A -*> \verbatim -*> A is a DOUBLE PRECISION -*> \endverbatim -*> -*> \param[in] B -*> \verbatim -*> B is a DOUBLE PRECISION -*> The values A and B. -*> \endverbatim -*> - DOUBLE PRECISION FUNCTION DLAMC3( A, B ) -* -* -- LAPACK auxiliary routine (version 3.4.0) -- -* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. -* November 2010 -* -* .. Scalar Arguments .. - DOUBLE PRECISION A, B -* .. -* ===================================================================== -* -* .. Executable Statements .. -* - DLAMC3 = A + B -* - RETURN -* -* End of DLAMC3 -* - END -* -************************************************************************ diff --git a/eigen/lapack/dlapy2.f b/eigen/lapack/dlapy2.f deleted file mode 100644 index e6a62bf..0000000 --- a/eigen/lapack/dlapy2.f +++ /dev/null @@ -1,104 +0,0 @@ -*> \brief \b DLAPY2 -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DLAPY2 + dependencies -*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/dlapy2.f"> -*> [TGZ]</a> -*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/dlapy2.f"> -*> [ZIP]</a> -*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/dlapy2.f"> -*> [TXT]</a> -*> \endhtmlonly -* -* Definition: -* =========== -* -* DOUBLE PRECISION FUNCTION DLAPY2( X, Y ) -* -* .. Scalar Arguments .. -* DOUBLE PRECISION X, Y -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DLAPY2 returns sqrt(x**2+y**2), taking care not to cause unnecessary -*> overflow. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] X -*> \verbatim -*> X is DOUBLE PRECISION -*> \endverbatim -*> -*> \param[in] Y -*> \verbatim -*> Y is DOUBLE PRECISION -*> X and Y specify the values x and y. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \date November 2011 -* -*> \ingroup auxOTHERauxiliary -* -* ===================================================================== - DOUBLE PRECISION FUNCTION DLAPY2( X, Y ) -* -* -- LAPACK auxiliary routine (version 3.4.0) -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* November 2011 -* -* .. Scalar Arguments .. - DOUBLE PRECISION X, Y -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ZERO - PARAMETER ( ZERO = 0.0D0 ) - DOUBLE PRECISION ONE - PARAMETER ( ONE = 1.0D0 ) -* .. -* .. Local Scalars .. - DOUBLE PRECISION W, XABS, YABS, Z -* .. -* .. Intrinsic Functions .. - INTRINSIC ABS, MAX, MIN, SQRT -* .. -* .. Executable Statements .. -* - XABS = ABS( X ) - YABS = ABS( Y ) - W = MAX( XABS, YABS ) - Z = MIN( XABS, YABS ) - IF( Z.EQ.ZERO ) THEN - DLAPY2 = W - ELSE - DLAPY2 = W*SQRT( ONE+( Z / W )**2 ) - END IF - RETURN -* -* End of DLAPY2 -* - END diff --git a/eigen/lapack/dlapy3.f b/eigen/lapack/dlapy3.f deleted file mode 100644 index ae9844f..0000000 --- a/eigen/lapack/dlapy3.f +++ /dev/null @@ -1,111 +0,0 @@ -*> \brief \b DLAPY3 -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DLAPY3 + dependencies -*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/dlapy3.f"> -*> [TGZ]</a> -*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/dlapy3.f"> -*> [ZIP]</a> -*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/dlapy3.f"> -*> [TXT]</a> -*> \endhtmlonly -* -* Definition: -* =========== -* -* DOUBLE PRECISION FUNCTION DLAPY3( X, Y, Z ) -* -* .. Scalar Arguments .. -* DOUBLE PRECISION X, Y, Z -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DLAPY3 returns sqrt(x**2+y**2+z**2), taking care not to cause -*> unnecessary overflow. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] X -*> \verbatim -*> X is DOUBLE PRECISION -*> \endverbatim -*> -*> \param[in] Y -*> \verbatim -*> Y is DOUBLE PRECISION -*> \endverbatim -*> -*> \param[in] Z -*> \verbatim -*> Z is DOUBLE PRECISION -*> X, Y and Z specify the values x, y and z. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \date November 2011 -* -*> \ingroup auxOTHERauxiliary -* -* ===================================================================== - DOUBLE PRECISION FUNCTION DLAPY3( X, Y, Z ) -* -* -- LAPACK auxiliary routine (version 3.4.0) -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* November 2011 -* -* .. Scalar Arguments .. - DOUBLE PRECISION X, Y, Z -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ZERO - PARAMETER ( ZERO = 0.0D0 ) -* .. -* .. Local Scalars .. - DOUBLE PRECISION W, XABS, YABS, ZABS -* .. -* .. Intrinsic Functions .. - INTRINSIC ABS, MAX, SQRT -* .. -* .. Executable Statements .. -* - XABS = ABS( X ) - YABS = ABS( Y ) - ZABS = ABS( Z ) - W = MAX( XABS, YABS, ZABS ) - IF( W.EQ.ZERO ) THEN -* W can be zero for max(0,nan,0) -* adding all three entries together will make sure -* NaN will not disappear. - DLAPY3 = XABS + YABS + ZABS - ELSE - DLAPY3 = W*SQRT( ( XABS / W )**2+( YABS / W )**2+ - $ ( ZABS / W )**2 ) - END IF - RETURN -* -* End of DLAPY3 -* - END diff --git a/eigen/lapack/dlarf.f b/eigen/lapack/dlarf.f deleted file mode 100644 index 2a82ff4..0000000 --- a/eigen/lapack/dlarf.f +++ /dev/null @@ -1,227 +0,0 @@ -*> \brief \b DLARF -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DLARF + dependencies -*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/dlarf.f"> -*> [TGZ]</a> -*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/dlarf.f"> -*> [ZIP]</a> -*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/dlarf.f"> -*> [TXT]</a> -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DLARF( SIDE, M, N, V, INCV, TAU, C, LDC, WORK ) -* -* .. Scalar Arguments .. -* CHARACTER SIDE -* INTEGER INCV, LDC, M, N -* DOUBLE PRECISION TAU -* .. -* .. Array Arguments .. -* DOUBLE PRECISION C( LDC, * ), V( * ), WORK( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DLARF applies a real elementary reflector H to a real m by n matrix -*> C, from either the left or the right. H is represented in the form -*> -*> H = I - tau * v * v**T -*> -*> where tau is a real scalar and v is a real vector. -*> -*> If tau = 0, then H is taken to be the unit matrix. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] SIDE -*> \verbatim -*> SIDE is CHARACTER*1 -*> = 'L': form H * C -*> = 'R': form C * H -*> \endverbatim -*> -*> \param[in] M -*> \verbatim -*> M is INTEGER -*> The number of rows of the matrix C. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The number of columns of the matrix C. -*> \endverbatim -*> -*> \param[in] V -*> \verbatim -*> V is DOUBLE PRECISION array, dimension -*> (1 + (M-1)*abs(INCV)) if SIDE = 'L' -*> or (1 + (N-1)*abs(INCV)) if SIDE = 'R' -*> The vector v in the representation of H. V is not used if -*> TAU = 0. -*> \endverbatim -*> -*> \param[in] INCV -*> \verbatim -*> INCV is INTEGER -*> The increment between elements of v. INCV <> 0. -*> \endverbatim -*> -*> \param[in] TAU -*> \verbatim -*> TAU is DOUBLE PRECISION -*> The value tau in the representation of H. -*> \endverbatim -*> -*> \param[in,out] C -*> \verbatim -*> C is DOUBLE PRECISION array, dimension (LDC,N) -*> On entry, the m by n matrix C. -*> On exit, C is overwritten by the matrix H * C if SIDE = 'L', -*> or C * H if SIDE = 'R'. -*> \endverbatim -*> -*> \param[in] LDC -*> \verbatim -*> LDC is INTEGER -*> The leading dimension of the array C. LDC >= max(1,M). -*> \endverbatim -*> -*> \param[out] WORK -*> \verbatim -*> WORK is DOUBLE PRECISION array, dimension -*> (N) if SIDE = 'L' -*> or (M) if SIDE = 'R' -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \date November 2011 -* -*> \ingroup doubleOTHERauxiliary -* -* ===================================================================== - SUBROUTINE DLARF( SIDE, M, N, V, INCV, TAU, C, LDC, WORK ) -* -* -- LAPACK auxiliary routine (version 3.4.0) -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* November 2011 -* -* .. Scalar Arguments .. - CHARACTER SIDE - INTEGER INCV, LDC, M, N - DOUBLE PRECISION TAU -* .. -* .. Array Arguments .. - DOUBLE PRECISION C( LDC, * ), V( * ), WORK( * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ONE, ZERO - PARAMETER ( ONE = 1.0D+0, ZERO = 0.0D+0 ) -* .. -* .. Local Scalars .. - LOGICAL APPLYLEFT - INTEGER I, LASTV, LASTC -* .. -* .. External Subroutines .. - EXTERNAL DGEMV, DGER -* .. -* .. External Functions .. - LOGICAL LSAME - INTEGER ILADLR, ILADLC - EXTERNAL LSAME, ILADLR, ILADLC -* .. -* .. Executable Statements .. -* - APPLYLEFT = LSAME( SIDE, 'L' ) - LASTV = 0 - LASTC = 0 - IF( TAU.NE.ZERO ) THEN -! Set up variables for scanning V. LASTV begins pointing to the end -! of V. - IF( APPLYLEFT ) THEN - LASTV = M - ELSE - LASTV = N - END IF - IF( INCV.GT.0 ) THEN - I = 1 + (LASTV-1) * INCV - ELSE - I = 1 - END IF -! Look for the last non-zero row in V. - DO WHILE( LASTV.GT.0 .AND. V( I ).EQ.ZERO ) - LASTV = LASTV - 1 - I = I - INCV - END DO - IF( APPLYLEFT ) THEN -! Scan for the last non-zero column in C(1:lastv,:). - LASTC = ILADLC(LASTV, N, C, LDC) - ELSE -! Scan for the last non-zero row in C(:,1:lastv). - LASTC = ILADLR(M, LASTV, C, LDC) - END IF - END IF -! Note that lastc.eq.0 renders the BLAS operations null; no special -! case is needed at this level. - IF( APPLYLEFT ) THEN -* -* Form H * C -* - IF( LASTV.GT.0 ) THEN -* -* w(1:lastc,1) := C(1:lastv,1:lastc)**T * v(1:lastv,1) -* - CALL DGEMV( 'Transpose', LASTV, LASTC, ONE, C, LDC, V, INCV, - $ ZERO, WORK, 1 ) -* -* C(1:lastv,1:lastc) := C(...) - v(1:lastv,1) * w(1:lastc,1)**T -* - CALL DGER( LASTV, LASTC, -TAU, V, INCV, WORK, 1, C, LDC ) - END IF - ELSE -* -* Form C * H -* - IF( LASTV.GT.0 ) THEN -* -* w(1:lastc,1) := C(1:lastc,1:lastv) * v(1:lastv,1) -* - CALL DGEMV( 'No transpose', LASTC, LASTV, ONE, C, LDC, - $ V, INCV, ZERO, WORK, 1 ) -* -* C(1:lastc,1:lastv) := C(...) - w(1:lastc,1) * v(1:lastv,1)**T -* - CALL DGER( LASTC, LASTV, -TAU, WORK, 1, V, INCV, C, LDC ) - END IF - END IF - RETURN -* -* End of DLARF -* - END diff --git a/eigen/lapack/dlarfb.f b/eigen/lapack/dlarfb.f deleted file mode 100644 index 206d3b2..0000000 --- a/eigen/lapack/dlarfb.f +++ /dev/null @@ -1,762 +0,0 @@ -*> \brief \b DLARFB -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DLARFB + dependencies -*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/dlarfb.f"> -*> [TGZ]</a> -*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/dlarfb.f"> -*> [ZIP]</a> -*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/dlarfb.f"> -*> [TXT]</a> -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DLARFB( SIDE, TRANS, DIRECT, STOREV, M, N, K, V, LDV, -* T, LDT, C, LDC, WORK, LDWORK ) -* -* .. Scalar Arguments .. -* CHARACTER DIRECT, SIDE, STOREV, TRANS -* INTEGER K, LDC, LDT, LDV, LDWORK, M, N -* .. -* .. Array Arguments .. -* DOUBLE PRECISION C( LDC, * ), T( LDT, * ), V( LDV, * ), -* $ WORK( LDWORK, * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DLARFB applies a real block reflector H or its transpose H**T to a -*> real m by n matrix C, from either the left or the right. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] SIDE -*> \verbatim -*> SIDE is CHARACTER*1 -*> = 'L': apply H or H**T from the Left -*> = 'R': apply H or H**T from the Right -*> \endverbatim -*> -*> \param[in] TRANS -*> \verbatim -*> TRANS is CHARACTER*1 -*> = 'N': apply H (No transpose) -*> = 'T': apply H**T (Transpose) -*> \endverbatim -*> -*> \param[in] DIRECT -*> \verbatim -*> DIRECT is CHARACTER*1 -*> Indicates how H is formed from a product of elementary -*> reflectors -*> = 'F': H = H(1) H(2) . . . H(k) (Forward) -*> = 'B': H = H(k) . . . H(2) H(1) (Backward) -*> \endverbatim -*> -*> \param[in] STOREV -*> \verbatim -*> STOREV is CHARACTER*1 -*> Indicates how the vectors which define the elementary -*> reflectors are stored: -*> = 'C': Columnwise -*> = 'R': Rowwise -*> \endverbatim -*> -*> \param[in] M -*> \verbatim -*> M is INTEGER -*> The number of rows of the matrix C. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The number of columns of the matrix C. -*> \endverbatim -*> -*> \param[in] K -*> \verbatim -*> K is INTEGER -*> The order of the matrix T (= the number of elementary -*> reflectors whose product defines the block reflector). -*> \endverbatim -*> -*> \param[in] V -*> \verbatim -*> V is DOUBLE PRECISION array, dimension -*> (LDV,K) if STOREV = 'C' -*> (LDV,M) if STOREV = 'R' and SIDE = 'L' -*> (LDV,N) if STOREV = 'R' and SIDE = 'R' -*> The matrix V. See Further Details. -*> \endverbatim -*> -*> \param[in] LDV -*> \verbatim -*> LDV is INTEGER -*> The leading dimension of the array V. -*> If STOREV = 'C' and SIDE = 'L', LDV >= max(1,M); -*> if STOREV = 'C' and SIDE = 'R', LDV >= max(1,N); -*> if STOREV = 'R', LDV >= K. -*> \endverbatim -*> -*> \param[in] T -*> \verbatim -*> T is DOUBLE PRECISION array, dimension (LDT,K) -*> The triangular k by k matrix T in the representation of the -*> block reflector. -*> \endverbatim -*> -*> \param[in] LDT -*> \verbatim -*> LDT is INTEGER -*> The leading dimension of the array T. LDT >= K. -*> \endverbatim -*> -*> \param[in,out] C -*> \verbatim -*> C is DOUBLE PRECISION array, dimension (LDC,N) -*> On entry, the m by n matrix C. -*> On exit, C is overwritten by H*C or H**T*C or C*H or C*H**T. -*> \endverbatim -*> -*> \param[in] LDC -*> \verbatim -*> LDC is INTEGER -*> The leading dimension of the array C. LDC >= max(1,M). -*> \endverbatim -*> -*> \param[out] WORK -*> \verbatim -*> WORK is DOUBLE PRECISION array, dimension (LDWORK,K) -*> \endverbatim -*> -*> \param[in] LDWORK -*> \verbatim -*> LDWORK is INTEGER -*> The leading dimension of the array WORK. -*> If SIDE = 'L', LDWORK >= max(1,N); -*> if SIDE = 'R', LDWORK >= max(1,M). -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \date November 2011 -* -*> \ingroup doubleOTHERauxiliary -* -*> \par Further Details: -* ===================== -*> -*> \verbatim -*> -*> The shape of the matrix V and the storage of the vectors which define -*> the H(i) is best illustrated by the following example with n = 5 and -*> k = 3. The elements equal to 1 are not stored; the corresponding -*> array elements are modified but restored on exit. The rest of the -*> array is not used. -*> -*> DIRECT = 'F' and STOREV = 'C': DIRECT = 'F' and STOREV = 'R': -*> -*> V = ( 1 ) V = ( 1 v1 v1 v1 v1 ) -*> ( v1 1 ) ( 1 v2 v2 v2 ) -*> ( v1 v2 1 ) ( 1 v3 v3 ) -*> ( v1 v2 v3 ) -*> ( v1 v2 v3 ) -*> -*> DIRECT = 'B' and STOREV = 'C': DIRECT = 'B' and STOREV = 'R': -*> -*> V = ( v1 v2 v3 ) V = ( v1 v1 1 ) -*> ( v1 v2 v3 ) ( v2 v2 v2 1 ) -*> ( 1 v2 v3 ) ( v3 v3 v3 v3 1 ) -*> ( 1 v3 ) -*> ( 1 ) -*> \endverbatim -*> -* ===================================================================== - SUBROUTINE DLARFB( SIDE, TRANS, DIRECT, STOREV, M, N, K, V, LDV, - $ T, LDT, C, LDC, WORK, LDWORK ) -* -* -- LAPACK auxiliary routine (version 3.4.0) -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* November 2011 -* -* .. Scalar Arguments .. - CHARACTER DIRECT, SIDE, STOREV, TRANS - INTEGER K, LDC, LDT, LDV, LDWORK, M, N -* .. -* .. Array Arguments .. - DOUBLE PRECISION C( LDC, * ), T( LDT, * ), V( LDV, * ), - $ WORK( LDWORK, * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ONE - PARAMETER ( ONE = 1.0D+0 ) -* .. -* .. Local Scalars .. - CHARACTER TRANST - INTEGER I, J, LASTV, LASTC -* .. -* .. External Functions .. - LOGICAL LSAME - INTEGER ILADLR, ILADLC - EXTERNAL LSAME, ILADLR, ILADLC -* .. -* .. External Subroutines .. - EXTERNAL DCOPY, DGEMM, DTRMM -* .. -* .. Executable Statements .. -* -* Quick return if possible -* - IF( M.LE.0 .OR. N.LE.0 ) - $ RETURN -* - IF( LSAME( TRANS, 'N' ) ) THEN - TRANST = 'T' - ELSE - TRANST = 'N' - END IF -* - IF( LSAME( STOREV, 'C' ) ) THEN -* - IF( LSAME( DIRECT, 'F' ) ) THEN -* -* Let V = ( V1 ) (first K rows) -* ( V2 ) -* where V1 is unit lower triangular. -* - IF( LSAME( SIDE, 'L' ) ) THEN -* -* Form H * C or H**T * C where C = ( C1 ) -* ( C2 ) -* - LASTV = MAX( K, ILADLR( M, K, V, LDV ) ) - LASTC = ILADLC( LASTV, N, C, LDC ) -* -* W := C**T * V = (C1**T * V1 + C2**T * V2) (stored in WORK) -* -* W := C1**T -* - DO 10 J = 1, K - CALL DCOPY( LASTC, C( J, 1 ), LDC, WORK( 1, J ), 1 ) - 10 CONTINUE -* -* W := W * V1 -* - CALL DTRMM( 'Right', 'Lower', 'No transpose', 'Unit', - $ LASTC, K, ONE, V, LDV, WORK, LDWORK ) - IF( LASTV.GT.K ) THEN -* -* W := W + C2**T *V2 -* - CALL DGEMM( 'Transpose', 'No transpose', - $ LASTC, K, LASTV-K, - $ ONE, C( K+1, 1 ), LDC, V( K+1, 1 ), LDV, - $ ONE, WORK, LDWORK ) - END IF -* -* W := W * T**T or W * T -* - CALL DTRMM( 'Right', 'Upper', TRANST, 'Non-unit', - $ LASTC, K, ONE, T, LDT, WORK, LDWORK ) -* -* C := C - V * W**T -* - IF( LASTV.GT.K ) THEN -* -* C2 := C2 - V2 * W**T -* - CALL DGEMM( 'No transpose', 'Transpose', - $ LASTV-K, LASTC, K, - $ -ONE, V( K+1, 1 ), LDV, WORK, LDWORK, ONE, - $ C( K+1, 1 ), LDC ) - END IF -* -* W := W * V1**T -* - CALL DTRMM( 'Right', 'Lower', 'Transpose', 'Unit', - $ LASTC, K, ONE, V, LDV, WORK, LDWORK ) -* -* C1 := C1 - W**T -* - DO 30 J = 1, K - DO 20 I = 1, LASTC - C( J, I ) = C( J, I ) - WORK( I, J ) - 20 CONTINUE - 30 CONTINUE -* - ELSE IF( LSAME( SIDE, 'R' ) ) THEN -* -* Form C * H or C * H**T where C = ( C1 C2 ) -* - LASTV = MAX( K, ILADLR( N, K, V, LDV ) ) - LASTC = ILADLR( M, LASTV, C, LDC ) -* -* W := C * V = (C1*V1 + C2*V2) (stored in WORK) -* -* W := C1 -* - DO 40 J = 1, K - CALL DCOPY( LASTC, C( 1, J ), 1, WORK( 1, J ), 1 ) - 40 CONTINUE -* -* W := W * V1 -* - CALL DTRMM( 'Right', 'Lower', 'No transpose', 'Unit', - $ LASTC, K, ONE, V, LDV, WORK, LDWORK ) - IF( LASTV.GT.K ) THEN -* -* W := W + C2 * V2 -* - CALL DGEMM( 'No transpose', 'No transpose', - $ LASTC, K, LASTV-K, - $ ONE, C( 1, K+1 ), LDC, V( K+1, 1 ), LDV, - $ ONE, WORK, LDWORK ) - END IF -* -* W := W * T or W * T**T -* - CALL DTRMM( 'Right', 'Upper', TRANS, 'Non-unit', - $ LASTC, K, ONE, T, LDT, WORK, LDWORK ) -* -* C := C - W * V**T -* - IF( LASTV.GT.K ) THEN -* -* C2 := C2 - W * V2**T -* - CALL DGEMM( 'No transpose', 'Transpose', - $ LASTC, LASTV-K, K, - $ -ONE, WORK, LDWORK, V( K+1, 1 ), LDV, ONE, - $ C( 1, K+1 ), LDC ) - END IF -* -* W := W * V1**T -* - CALL DTRMM( 'Right', 'Lower', 'Transpose', 'Unit', - $ LASTC, K, ONE, V, LDV, WORK, LDWORK ) -* -* C1 := C1 - W -* - DO 60 J = 1, K - DO 50 I = 1, LASTC - C( I, J ) = C( I, J ) - WORK( I, J ) - 50 CONTINUE - 60 CONTINUE - END IF -* - ELSE -* -* Let V = ( V1 ) -* ( V2 ) (last K rows) -* where V2 is unit upper triangular. -* - IF( LSAME( SIDE, 'L' ) ) THEN -* -* Form H * C or H**T * C where C = ( C1 ) -* ( C2 ) -* - LASTV = MAX( K, ILADLR( M, K, V, LDV ) ) - LASTC = ILADLC( LASTV, N, C, LDC ) -* -* W := C**T * V = (C1**T * V1 + C2**T * V2) (stored in WORK) -* -* W := C2**T -* - DO 70 J = 1, K - CALL DCOPY( LASTC, C( LASTV-K+J, 1 ), LDC, - $ WORK( 1, J ), 1 ) - 70 CONTINUE -* -* W := W * V2 -* - CALL DTRMM( 'Right', 'Upper', 'No transpose', 'Unit', - $ LASTC, K, ONE, V( LASTV-K+1, 1 ), LDV, - $ WORK, LDWORK ) - IF( LASTV.GT.K ) THEN -* -* W := W + C1**T*V1 -* - CALL DGEMM( 'Transpose', 'No transpose', - $ LASTC, K, LASTV-K, ONE, C, LDC, V, LDV, - $ ONE, WORK, LDWORK ) - END IF -* -* W := W * T**T or W * T -* - CALL DTRMM( 'Right', 'Lower', TRANST, 'Non-unit', - $ LASTC, K, ONE, T, LDT, WORK, LDWORK ) -* -* C := C - V * W**T -* - IF( LASTV.GT.K ) THEN -* -* C1 := C1 - V1 * W**T -* - CALL DGEMM( 'No transpose', 'Transpose', - $ LASTV-K, LASTC, K, -ONE, V, LDV, WORK, LDWORK, - $ ONE, C, LDC ) - END IF -* -* W := W * V2**T -* - CALL DTRMM( 'Right', 'Upper', 'Transpose', 'Unit', - $ LASTC, K, ONE, V( LASTV-K+1, 1 ), LDV, - $ WORK, LDWORK ) -* -* C2 := C2 - W**T -* - DO 90 J = 1, K - DO 80 I = 1, LASTC - C( LASTV-K+J, I ) = C( LASTV-K+J, I ) - WORK(I, J) - 80 CONTINUE - 90 CONTINUE -* - ELSE IF( LSAME( SIDE, 'R' ) ) THEN -* -* Form C * H or C * H**T where C = ( C1 C2 ) -* - LASTV = MAX( K, ILADLR( N, K, V, LDV ) ) - LASTC = ILADLR( M, LASTV, C, LDC ) -* -* W := C * V = (C1*V1 + C2*V2) (stored in WORK) -* -* W := C2 -* - DO 100 J = 1, K - CALL DCOPY( LASTC, C( 1, N-K+J ), 1, WORK( 1, J ), 1 ) - 100 CONTINUE -* -* W := W * V2 -* - CALL DTRMM( 'Right', 'Upper', 'No transpose', 'Unit', - $ LASTC, K, ONE, V( LASTV-K+1, 1 ), LDV, - $ WORK, LDWORK ) - IF( LASTV.GT.K ) THEN -* -* W := W + C1 * V1 -* - CALL DGEMM( 'No transpose', 'No transpose', - $ LASTC, K, LASTV-K, ONE, C, LDC, V, LDV, - $ ONE, WORK, LDWORK ) - END IF -* -* W := W * T or W * T**T -* - CALL DTRMM( 'Right', 'Lower', TRANS, 'Non-unit', - $ LASTC, K, ONE, T, LDT, WORK, LDWORK ) -* -* C := C - W * V**T -* - IF( LASTV.GT.K ) THEN -* -* C1 := C1 - W * V1**T -* - CALL DGEMM( 'No transpose', 'Transpose', - $ LASTC, LASTV-K, K, -ONE, WORK, LDWORK, V, LDV, - $ ONE, C, LDC ) - END IF -* -* W := W * V2**T -* - CALL DTRMM( 'Right', 'Upper', 'Transpose', 'Unit', - $ LASTC, K, ONE, V( LASTV-K+1, 1 ), LDV, - $ WORK, LDWORK ) -* -* C2 := C2 - W -* - DO 120 J = 1, K - DO 110 I = 1, LASTC - C( I, LASTV-K+J ) = C( I, LASTV-K+J ) - WORK(I, J) - 110 CONTINUE - 120 CONTINUE - END IF - END IF -* - ELSE IF( LSAME( STOREV, 'R' ) ) THEN -* - IF( LSAME( DIRECT, 'F' ) ) THEN -* -* Let V = ( V1 V2 ) (V1: first K columns) -* where V1 is unit upper triangular. -* - IF( LSAME( SIDE, 'L' ) ) THEN -* -* Form H * C or H**T * C where C = ( C1 ) -* ( C2 ) -* - LASTV = MAX( K, ILADLC( K, M, V, LDV ) ) - LASTC = ILADLC( LASTV, N, C, LDC ) -* -* W := C**T * V**T = (C1**T * V1**T + C2**T * V2**T) (stored in WORK) -* -* W := C1**T -* - DO 130 J = 1, K - CALL DCOPY( LASTC, C( J, 1 ), LDC, WORK( 1, J ), 1 ) - 130 CONTINUE -* -* W := W * V1**T -* - CALL DTRMM( 'Right', 'Upper', 'Transpose', 'Unit', - $ LASTC, K, ONE, V, LDV, WORK, LDWORK ) - IF( LASTV.GT.K ) THEN -* -* W := W + C2**T*V2**T -* - CALL DGEMM( 'Transpose', 'Transpose', - $ LASTC, K, LASTV-K, - $ ONE, C( K+1, 1 ), LDC, V( 1, K+1 ), LDV, - $ ONE, WORK, LDWORK ) - END IF -* -* W := W * T**T or W * T -* - CALL DTRMM( 'Right', 'Upper', TRANST, 'Non-unit', - $ LASTC, K, ONE, T, LDT, WORK, LDWORK ) -* -* C := C - V**T * W**T -* - IF( LASTV.GT.K ) THEN -* -* C2 := C2 - V2**T * W**T -* - CALL DGEMM( 'Transpose', 'Transpose', - $ LASTV-K, LASTC, K, - $ -ONE, V( 1, K+1 ), LDV, WORK, LDWORK, - $ ONE, C( K+1, 1 ), LDC ) - END IF -* -* W := W * V1 -* - CALL DTRMM( 'Right', 'Upper', 'No transpose', 'Unit', - $ LASTC, K, ONE, V, LDV, WORK, LDWORK ) -* -* C1 := C1 - W**T -* - DO 150 J = 1, K - DO 140 I = 1, LASTC - C( J, I ) = C( J, I ) - WORK( I, J ) - 140 CONTINUE - 150 CONTINUE -* - ELSE IF( LSAME( SIDE, 'R' ) ) THEN -* -* Form C * H or C * H**T where C = ( C1 C2 ) -* - LASTV = MAX( K, ILADLC( K, N, V, LDV ) ) - LASTC = ILADLR( M, LASTV, C, LDC ) -* -* W := C * V**T = (C1*V1**T + C2*V2**T) (stored in WORK) -* -* W := C1 -* - DO 160 J = 1, K - CALL DCOPY( LASTC, C( 1, J ), 1, WORK( 1, J ), 1 ) - 160 CONTINUE -* -* W := W * V1**T -* - CALL DTRMM( 'Right', 'Upper', 'Transpose', 'Unit', - $ LASTC, K, ONE, V, LDV, WORK, LDWORK ) - IF( LASTV.GT.K ) THEN -* -* W := W + C2 * V2**T -* - CALL DGEMM( 'No transpose', 'Transpose', - $ LASTC, K, LASTV-K, - $ ONE, C( 1, K+1 ), LDC, V( 1, K+1 ), LDV, - $ ONE, WORK, LDWORK ) - END IF -* -* W := W * T or W * T**T -* - CALL DTRMM( 'Right', 'Upper', TRANS, 'Non-unit', - $ LASTC, K, ONE, T, LDT, WORK, LDWORK ) -* -* C := C - W * V -* - IF( LASTV.GT.K ) THEN -* -* C2 := C2 - W * V2 -* - CALL DGEMM( 'No transpose', 'No transpose', - $ LASTC, LASTV-K, K, - $ -ONE, WORK, LDWORK, V( 1, K+1 ), LDV, - $ ONE, C( 1, K+1 ), LDC ) - END IF -* -* W := W * V1 -* - CALL DTRMM( 'Right', 'Upper', 'No transpose', 'Unit', - $ LASTC, K, ONE, V, LDV, WORK, LDWORK ) -* -* C1 := C1 - W -* - DO 180 J = 1, K - DO 170 I = 1, LASTC - C( I, J ) = C( I, J ) - WORK( I, J ) - 170 CONTINUE - 180 CONTINUE -* - END IF -* - ELSE -* -* Let V = ( V1 V2 ) (V2: last K columns) -* where V2 is unit lower triangular. -* - IF( LSAME( SIDE, 'L' ) ) THEN -* -* Form H * C or H**T * C where C = ( C1 ) -* ( C2 ) -* - LASTV = MAX( K, ILADLC( K, M, V, LDV ) ) - LASTC = ILADLC( LASTV, N, C, LDC ) -* -* W := C**T * V**T = (C1**T * V1**T + C2**T * V2**T) (stored in WORK) -* -* W := C2**T -* - DO 190 J = 1, K - CALL DCOPY( LASTC, C( LASTV-K+J, 1 ), LDC, - $ WORK( 1, J ), 1 ) - 190 CONTINUE -* -* W := W * V2**T -* - CALL DTRMM( 'Right', 'Lower', 'Transpose', 'Unit', - $ LASTC, K, ONE, V( 1, LASTV-K+1 ), LDV, - $ WORK, LDWORK ) - IF( LASTV.GT.K ) THEN -* -* W := W + C1**T * V1**T -* - CALL DGEMM( 'Transpose', 'Transpose', - $ LASTC, K, LASTV-K, ONE, C, LDC, V, LDV, - $ ONE, WORK, LDWORK ) - END IF -* -* W := W * T**T or W * T -* - CALL DTRMM( 'Right', 'Lower', TRANST, 'Non-unit', - $ LASTC, K, ONE, T, LDT, WORK, LDWORK ) -* -* C := C - V**T * W**T -* - IF( LASTV.GT.K ) THEN -* -* C1 := C1 - V1**T * W**T -* - CALL DGEMM( 'Transpose', 'Transpose', - $ LASTV-K, LASTC, K, -ONE, V, LDV, WORK, LDWORK, - $ ONE, C, LDC ) - END IF -* -* W := W * V2 -* - CALL DTRMM( 'Right', 'Lower', 'No transpose', 'Unit', - $ LASTC, K, ONE, V( 1, LASTV-K+1 ), LDV, - $ WORK, LDWORK ) -* -* C2 := C2 - W**T -* - DO 210 J = 1, K - DO 200 I = 1, LASTC - C( LASTV-K+J, I ) = C( LASTV-K+J, I ) - WORK(I, J) - 200 CONTINUE - 210 CONTINUE -* - ELSE IF( LSAME( SIDE, 'R' ) ) THEN -* -* Form C * H or C * H**T where C = ( C1 C2 ) -* - LASTV = MAX( K, ILADLC( K, N, V, LDV ) ) - LASTC = ILADLR( M, LASTV, C, LDC ) -* -* W := C * V**T = (C1*V1**T + C2*V2**T) (stored in WORK) -* -* W := C2 -* - DO 220 J = 1, K - CALL DCOPY( LASTC, C( 1, LASTV-K+J ), 1, - $ WORK( 1, J ), 1 ) - 220 CONTINUE -* -* W := W * V2**T -* - CALL DTRMM( 'Right', 'Lower', 'Transpose', 'Unit', - $ LASTC, K, ONE, V( 1, LASTV-K+1 ), LDV, - $ WORK, LDWORK ) - IF( LASTV.GT.K ) THEN -* -* W := W + C1 * V1**T -* - CALL DGEMM( 'No transpose', 'Transpose', - $ LASTC, K, LASTV-K, ONE, C, LDC, V, LDV, - $ ONE, WORK, LDWORK ) - END IF -* -* W := W * T or W * T**T -* - CALL DTRMM( 'Right', 'Lower', TRANS, 'Non-unit', - $ LASTC, K, ONE, T, LDT, WORK, LDWORK ) -* -* C := C - W * V -* - IF( LASTV.GT.K ) THEN -* -* C1 := C1 - W * V1 -* - CALL DGEMM( 'No transpose', 'No transpose', - $ LASTC, LASTV-K, K, -ONE, WORK, LDWORK, V, LDV, - $ ONE, C, LDC ) - END IF -* -* W := W * V2 -* - CALL DTRMM( 'Right', 'Lower', 'No transpose', 'Unit', - $ LASTC, K, ONE, V( 1, LASTV-K+1 ), LDV, - $ WORK, LDWORK ) -* -* C1 := C1 - W -* - DO 240 J = 1, K - DO 230 I = 1, LASTC - C( I, LASTV-K+J ) = C( I, LASTV-K+J ) - WORK(I, J) - 230 CONTINUE - 240 CONTINUE -* - END IF -* - END IF - END IF -* - RETURN -* -* End of DLARFB -* - END diff --git a/eigen/lapack/dlarfg.f b/eigen/lapack/dlarfg.f deleted file mode 100644 index 458ad2e..0000000 --- a/eigen/lapack/dlarfg.f +++ /dev/null @@ -1,196 +0,0 @@ -*> \brief \b DLARFG -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DLARFG + dependencies -*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/dlarfg.f"> -*> [TGZ]</a> -*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/dlarfg.f"> -*> [ZIP]</a> -*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/dlarfg.f"> -*> [TXT]</a> -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DLARFG( N, ALPHA, X, INCX, TAU ) -* -* .. Scalar Arguments .. -* INTEGER INCX, N -* DOUBLE PRECISION ALPHA, TAU -* .. -* .. Array Arguments .. -* DOUBLE PRECISION X( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DLARFG generates a real elementary reflector H of order n, such -*> that -*> -*> H * ( alpha ) = ( beta ), H**T * H = I. -*> ( x ) ( 0 ) -*> -*> where alpha and beta are scalars, and x is an (n-1)-element real -*> vector. H is represented in the form -*> -*> H = I - tau * ( 1 ) * ( 1 v**T ) , -*> ( v ) -*> -*> where tau is a real scalar and v is a real (n-1)-element -*> vector. -*> -*> If the elements of x are all zero, then tau = 0 and H is taken to be -*> the unit matrix. -*> -*> Otherwise 1 <= tau <= 2. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The order of the elementary reflector. -*> \endverbatim -*> -*> \param[in,out] ALPHA -*> \verbatim -*> ALPHA is DOUBLE PRECISION -*> On entry, the value alpha. -*> On exit, it is overwritten with the value beta. -*> \endverbatim -*> -*> \param[in,out] X -*> \verbatim -*> X is DOUBLE PRECISION array, dimension -*> (1+(N-2)*abs(INCX)) -*> On entry, the vector x. -*> On exit, it is overwritten with the vector v. -*> \endverbatim -*> -*> \param[in] INCX -*> \verbatim -*> INCX is INTEGER -*> The increment between elements of X. INCX > 0. -*> \endverbatim -*> -*> \param[out] TAU -*> \verbatim -*> TAU is DOUBLE PRECISION -*> The value tau. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \date November 2011 -* -*> \ingroup doubleOTHERauxiliary -* -* ===================================================================== - SUBROUTINE DLARFG( N, ALPHA, X, INCX, TAU ) -* -* -- LAPACK auxiliary routine (version 3.4.0) -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* November 2011 -* -* .. Scalar Arguments .. - INTEGER INCX, N - DOUBLE PRECISION ALPHA, TAU -* .. -* .. Array Arguments .. - DOUBLE PRECISION X( * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ONE, ZERO - PARAMETER ( ONE = 1.0D+0, ZERO = 0.0D+0 ) -* .. -* .. Local Scalars .. - INTEGER J, KNT - DOUBLE PRECISION BETA, RSAFMN, SAFMIN, XNORM -* .. -* .. External Functions .. - DOUBLE PRECISION DLAMCH, DLAPY2, DNRM2 - EXTERNAL DLAMCH, DLAPY2, DNRM2 -* .. -* .. Intrinsic Functions .. - INTRINSIC ABS, SIGN -* .. -* .. External Subroutines .. - EXTERNAL DSCAL -* .. -* .. Executable Statements .. -* - IF( N.LE.1 ) THEN - TAU = ZERO - RETURN - END IF -* - XNORM = DNRM2( N-1, X, INCX ) -* - IF( XNORM.EQ.ZERO ) THEN -* -* H = I -* - TAU = ZERO - ELSE -* -* general case -* - BETA = -SIGN( DLAPY2( ALPHA, XNORM ), ALPHA ) - SAFMIN = DLAMCH( 'S' ) / DLAMCH( 'E' ) - KNT = 0 - IF( ABS( BETA ).LT.SAFMIN ) THEN -* -* XNORM, BETA may be inaccurate; scale X and recompute them -* - RSAFMN = ONE / SAFMIN - 10 CONTINUE - KNT = KNT + 1 - CALL DSCAL( N-1, RSAFMN, X, INCX ) - BETA = BETA*RSAFMN - ALPHA = ALPHA*RSAFMN - IF( ABS( BETA ).LT.SAFMIN ) - $ GO TO 10 -* -* New BETA is at most 1, at least SAFMIN -* - XNORM = DNRM2( N-1, X, INCX ) - BETA = -SIGN( DLAPY2( ALPHA, XNORM ), ALPHA ) - END IF - TAU = ( BETA-ALPHA ) / BETA - CALL DSCAL( N-1, ONE / ( ALPHA-BETA ), X, INCX ) -* -* If ALPHA is subnormal, it may lose relative accuracy -* - DO 20 J = 1, KNT - BETA = BETA*SAFMIN - 20 CONTINUE - ALPHA = BETA - END IF -* - RETURN -* -* End of DLARFG -* - END diff --git a/eigen/lapack/dlarft.f b/eigen/lapack/dlarft.f deleted file mode 100644 index 4b75504..0000000 --- a/eigen/lapack/dlarft.f +++ /dev/null @@ -1,326 +0,0 @@ -*> \brief \b DLARFT -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DLARFT + dependencies -*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/dlarft.f"> -*> [TGZ]</a> -*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/dlarft.f"> -*> [ZIP]</a> -*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/dlarft.f"> -*> [TXT]</a> -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DLARFT( DIRECT, STOREV, N, K, V, LDV, TAU, T, LDT ) -* -* .. Scalar Arguments .. -* CHARACTER DIRECT, STOREV -* INTEGER K, LDT, LDV, N -* .. -* .. Array Arguments .. -* DOUBLE PRECISION T( LDT, * ), TAU( * ), V( LDV, * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DLARFT forms the triangular factor T of a real block reflector H -*> of order n, which is defined as a product of k elementary reflectors. -*> -*> If DIRECT = 'F', H = H(1) H(2) . . . H(k) and T is upper triangular; -*> -*> If DIRECT = 'B', H = H(k) . . . H(2) H(1) and T is lower triangular. -*> -*> If STOREV = 'C', the vector which defines the elementary reflector -*> H(i) is stored in the i-th column of the array V, and -*> -*> H = I - V * T * V**T -*> -*> If STOREV = 'R', the vector which defines the elementary reflector -*> H(i) is stored in the i-th row of the array V, and -*> -*> H = I - V**T * T * V -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] DIRECT -*> \verbatim -*> DIRECT is CHARACTER*1 -*> Specifies the order in which the elementary reflectors are -*> multiplied to form the block reflector: -*> = 'F': H = H(1) H(2) . . . H(k) (Forward) -*> = 'B': H = H(k) . . . H(2) H(1) (Backward) -*> \endverbatim -*> -*> \param[in] STOREV -*> \verbatim -*> STOREV is CHARACTER*1 -*> Specifies how the vectors which define the elementary -*> reflectors are stored (see also Further Details): -*> = 'C': columnwise -*> = 'R': rowwise -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The order of the block reflector H. N >= 0. -*> \endverbatim -*> -*> \param[in] K -*> \verbatim -*> K is INTEGER -*> The order of the triangular factor T (= the number of -*> elementary reflectors). K >= 1. -*> \endverbatim -*> -*> \param[in] V -*> \verbatim -*> V is DOUBLE PRECISION array, dimension -*> (LDV,K) if STOREV = 'C' -*> (LDV,N) if STOREV = 'R' -*> The matrix V. See further details. -*> \endverbatim -*> -*> \param[in] LDV -*> \verbatim -*> LDV is INTEGER -*> The leading dimension of the array V. -*> If STOREV = 'C', LDV >= max(1,N); if STOREV = 'R', LDV >= K. -*> \endverbatim -*> -*> \param[in] TAU -*> \verbatim -*> TAU is DOUBLE PRECISION array, dimension (K) -*> TAU(i) must contain the scalar factor of the elementary -*> reflector H(i). -*> \endverbatim -*> -*> \param[out] T -*> \verbatim -*> T is DOUBLE PRECISION array, dimension (LDT,K) -*> The k by k triangular factor T of the block reflector. -*> If DIRECT = 'F', T is upper triangular; if DIRECT = 'B', T is -*> lower triangular. The rest of the array is not used. -*> \endverbatim -*> -*> \param[in] LDT -*> \verbatim -*> LDT is INTEGER -*> The leading dimension of the array T. LDT >= K. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \date April 2012 -* -*> \ingroup doubleOTHERauxiliary -* -*> \par Further Details: -* ===================== -*> -*> \verbatim -*> -*> The shape of the matrix V and the storage of the vectors which define -*> the H(i) is best illustrated by the following example with n = 5 and -*> k = 3. The elements equal to 1 are not stored. -*> -*> DIRECT = 'F' and STOREV = 'C': DIRECT = 'F' and STOREV = 'R': -*> -*> V = ( 1 ) V = ( 1 v1 v1 v1 v1 ) -*> ( v1 1 ) ( 1 v2 v2 v2 ) -*> ( v1 v2 1 ) ( 1 v3 v3 ) -*> ( v1 v2 v3 ) -*> ( v1 v2 v3 ) -*> -*> DIRECT = 'B' and STOREV = 'C': DIRECT = 'B' and STOREV = 'R': -*> -*> V = ( v1 v2 v3 ) V = ( v1 v1 1 ) -*> ( v1 v2 v3 ) ( v2 v2 v2 1 ) -*> ( 1 v2 v3 ) ( v3 v3 v3 v3 1 ) -*> ( 1 v3 ) -*> ( 1 ) -*> \endverbatim -*> -* ===================================================================== - SUBROUTINE DLARFT( DIRECT, STOREV, N, K, V, LDV, TAU, T, LDT ) -* -* -- LAPACK auxiliary routine (version 3.4.1) -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* April 2012 -* -* .. Scalar Arguments .. - CHARACTER DIRECT, STOREV - INTEGER K, LDT, LDV, N -* .. -* .. Array Arguments .. - DOUBLE PRECISION T( LDT, * ), TAU( * ), V( LDV, * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ONE, ZERO - PARAMETER ( ONE = 1.0D+0, ZERO = 0.0D+0 ) -* .. -* .. Local Scalars .. - INTEGER I, J, PREVLASTV, LASTV -* .. -* .. External Subroutines .. - EXTERNAL DGEMV, DTRMV -* .. -* .. External Functions .. - LOGICAL LSAME - EXTERNAL LSAME -* .. -* .. Executable Statements .. -* -* Quick return if possible -* - IF( N.EQ.0 ) - $ RETURN -* - IF( LSAME( DIRECT, 'F' ) ) THEN - PREVLASTV = N - DO I = 1, K - PREVLASTV = MAX( I, PREVLASTV ) - IF( TAU( I ).EQ.ZERO ) THEN -* -* H(i) = I -* - DO J = 1, I - T( J, I ) = ZERO - END DO - ELSE -* -* general case -* - IF( LSAME( STOREV, 'C' ) ) THEN -* Skip any trailing zeros. - DO LASTV = N, I+1, -1 - IF( V( LASTV, I ).NE.ZERO ) EXIT - END DO - DO J = 1, I-1 - T( J, I ) = -TAU( I ) * V( I , J ) - END DO - J = MIN( LASTV, PREVLASTV ) -* -* T(1:i-1,i) := - tau(i) * V(i:j,1:i-1)**T * V(i:j,i) -* - CALL DGEMV( 'Transpose', J-I, I-1, -TAU( I ), - $ V( I+1, 1 ), LDV, V( I+1, I ), 1, ONE, - $ T( 1, I ), 1 ) - ELSE -* Skip any trailing zeros. - DO LASTV = N, I+1, -1 - IF( V( I, LASTV ).NE.ZERO ) EXIT - END DO - DO J = 1, I-1 - T( J, I ) = -TAU( I ) * V( J , I ) - END DO - J = MIN( LASTV, PREVLASTV ) -* -* T(1:i-1,i) := - tau(i) * V(1:i-1,i:j) * V(i,i:j)**T -* - 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 ) - END IF -* -* T(1:i-1,i) := T(1:i-1,1:i-1) * T(1:i-1,i) -* - CALL DTRMV( 'Upper', 'No transpose', 'Non-unit', I-1, T, - $ LDT, T( 1, I ), 1 ) - T( I, I ) = TAU( I ) - IF( I.GT.1 ) THEN - PREVLASTV = MAX( PREVLASTV, LASTV ) - ELSE - PREVLASTV = LASTV - END IF - END IF - END DO - ELSE - PREVLASTV = 1 - DO I = K, 1, -1 - IF( TAU( I ).EQ.ZERO ) THEN -* -* H(i) = I -* - DO J = I, K - T( J, I ) = ZERO - END DO - ELSE -* -* general case -* - IF( I.LT.K ) THEN - IF( LSAME( STOREV, 'C' ) ) THEN -* Skip any leading zeros. - DO LASTV = 1, I-1 - IF( V( LASTV, I ).NE.ZERO ) EXIT - END DO - DO J = I+1, K - T( J, I ) = -TAU( I ) * V( N-K+I , J ) - END DO - J = MAX( LASTV, PREVLASTV ) -* -* T(i+1:k,i) = -tau(i) * V(j:n-k+i,i+1:k)**T * V(j:n-k+i,i) -* - CALL DGEMV( 'Transpose', N-K+I-J, K-I, -TAU( I ), - $ V( J, I+1 ), LDV, V( J, I ), 1, ONE, - $ T( I+1, I ), 1 ) - ELSE -* Skip any leading zeros. - DO LASTV = 1, I-1 - IF( V( I, LASTV ).NE.ZERO ) EXIT - END DO - DO J = I+1, K - T( J, I ) = -TAU( I ) * V( J, N-K+I ) - END DO - J = MAX( LASTV, PREVLASTV ) -* -* T(i+1:k,i) = -tau(i) * V(i+1:k,j:n-k+i) * V(i,j:n-k+i)**T -* - 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 ) - END IF -* -* T(i+1:k,i) := T(i+1:k,i+1:k) * T(i+1:k,i) -* - CALL DTRMV( 'Lower', 'No transpose', 'Non-unit', K-I, - $ T( I+1, I+1 ), LDT, T( I+1, I ), 1 ) - IF( I.GT.1 ) THEN - PREVLASTV = MIN( PREVLASTV, LASTV ) - ELSE - PREVLASTV = LASTV - END IF - END IF - T( I, I ) = TAU( I ) - END IF - END DO - END IF - RETURN -* -* End of DLARFT -* - END diff --git a/eigen/lapack/double.cpp b/eigen/lapack/double.cpp deleted file mode 100644 index ea78bb6..0000000 --- a/eigen/lapack/double.cpp +++ /dev/null @@ -1,18 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2009-2014 Gael Guennebaud <gael.guennebaud@inria.fr> -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#define SCALAR double -#define SCALAR_SUFFIX d -#define SCALAR_SUFFIX_UP "D" -#define ISCOMPLEX 0 - -#include "cholesky.cpp" -#include "lu.cpp" -#include "eigenvalues.cpp" -#include "svd.cpp" diff --git a/eigen/lapack/dsecnd_NONE.f b/eigen/lapack/dsecnd_NONE.f deleted file mode 100644 index 61a8dff..0000000 --- a/eigen/lapack/dsecnd_NONE.f +++ /dev/null @@ -1,52 +0,0 @@ -*> \brief \b DSECND returns nothing -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -* Definition: -* =========== -* -* DOUBLE PRECISION FUNCTION DSECND( ) -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DSECND returns nothing instead of returning the user time for a process in seconds. -*> If you are using that routine, it means that neither EXTERNAL ETIME, -*> EXTERNAL ETIME_, INTERNAL ETIME, INTERNAL CPU_TIME is available on -*> your machine. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \date November 2011 -* -*> \ingroup auxOTHERauxiliary -* -* ===================================================================== - DOUBLE PRECISION FUNCTION DSECND( ) -* -* -- LAPACK auxiliary routine (version 3.4.0) -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* November 2011 -* -* ===================================================================== -* - DSECND = 0.0D+0 - RETURN -* -* End of DSECND -* - END diff --git a/eigen/lapack/eigenvalues.cpp b/eigen/lapack/eigenvalues.cpp deleted file mode 100644 index 921c515..0000000 --- a/eigen/lapack/eigenvalues.cpp +++ /dev/null @@ -1,62 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2011 Gael Guennebaud <gael.guennebaud@inria.fr> -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#include "lapack_common.h" -#include <Eigen/Eigenvalues> - -// computes eigen values and vectors of a general N-by-N matrix A -EIGEN_LAPACK_FUNC(syev,(char *jobz, char *uplo, int* n, Scalar* a, int *lda, Scalar* w, Scalar* /*work*/, int* lwork, int *info)) -{ - // TODO exploit the work buffer - bool query_size = *lwork==-1; - - *info = 0; - if(*jobz!='N' && *jobz!='V') *info = -1; - else if(UPLO(*uplo)==INVALID) *info = -2; - else if(*n<0) *info = -3; - else if(*lda<std::max(1,*n)) *info = -5; - else if((!query_size) && *lwork<std::max(1,3**n-1)) *info = -8; - - if(*info!=0) - { - int e = -*info; - return xerbla_(SCALAR_SUFFIX_UP"SYEV ", &e, 6); - } - - if(query_size) - { - *lwork = 0; - return 0; - } - - if(*n==0) - return 0; - - PlainMatrixType mat(*n,*n); - if(UPLO(*uplo)==UP) mat = matrix(a,*n,*n,*lda).adjoint(); - else mat = matrix(a,*n,*n,*lda); - - bool computeVectors = *jobz=='V' || *jobz=='v'; - SelfAdjointEigenSolver<PlainMatrixType> eig(mat,computeVectors?ComputeEigenvectors:EigenvaluesOnly); - - if(eig.info()==NoConvergence) - { - make_vector(w,*n).setZero(); - if(computeVectors) - matrix(a,*n,*n,*lda).setIdentity(); - //*info = 1; - return 0; - } - - make_vector(w,*n) = eig.eigenvalues(); - if(computeVectors) - matrix(a,*n,*n,*lda) = eig.eigenvectors(); - - return 0; -} diff --git a/eigen/lapack/ilaclc.f b/eigen/lapack/ilaclc.f deleted file mode 100644 index 4ceb61c..0000000 --- a/eigen/lapack/ilaclc.f +++ /dev/null @@ -1,118 +0,0 @@ -*> \brief \b ILACLC -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download ILACLC + dependencies -*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/ilaclc.f"> -*> [TGZ]</a> -*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/ilaclc.f"> -*> [ZIP]</a> -*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/ilaclc.f"> -*> [TXT]</a> -*> \endhtmlonly -* -* Definition: -* =========== -* -* INTEGER FUNCTION ILACLC( M, N, A, LDA ) -* -* .. Scalar Arguments .. -* INTEGER M, N, LDA -* .. -* .. Array Arguments .. -* COMPLEX A( LDA, * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> ILACLC scans A for its last non-zero column. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] M -*> \verbatim -*> M is INTEGER -*> The number of rows of the matrix A. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The number of columns of the matrix A. -*> \endverbatim -*> -*> \param[in] A -*> \verbatim -*> A is COMPLEX array, dimension (LDA,N) -*> The m by n matrix A. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> The leading dimension of the array A. LDA >= max(1,M). -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \date November 2011 -* -*> \ingroup complexOTHERauxiliary -* -* ===================================================================== - INTEGER FUNCTION ILACLC( M, N, A, LDA ) -* -* -- LAPACK auxiliary routine (version 3.4.0) -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* November 2011 -* -* .. Scalar Arguments .. - INTEGER M, N, LDA -* .. -* .. Array Arguments .. - COMPLEX A( LDA, * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - COMPLEX ZERO - PARAMETER ( ZERO = (0.0E+0, 0.0E+0) ) -* .. -* .. Local Scalars .. - INTEGER I -* .. -* .. Executable Statements .. -* -* Quick test for the common case where one corner is non-zero. - IF( N.EQ.0 ) THEN - ILACLC = N - ELSE IF( A(1, N).NE.ZERO .OR. A(M, N).NE.ZERO ) THEN - ILACLC = N - ELSE -* Now scan each column from the end, returning with the first non-zero. - DO ILACLC = N, 1, -1 - DO I = 1, M - IF( A(I, ILACLC).NE.ZERO ) RETURN - END DO - END DO - END IF - RETURN - END diff --git a/eigen/lapack/ilaclr.f b/eigen/lapack/ilaclr.f deleted file mode 100644 index d8ab09c..0000000 --- a/eigen/lapack/ilaclr.f +++ /dev/null @@ -1,121 +0,0 @@ -*> \brief \b ILACLR -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download ILACLR + dependencies -*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/ilaclr.f"> -*> [TGZ]</a> -*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/ilaclr.f"> -*> [ZIP]</a> -*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/ilaclr.f"> -*> [TXT]</a> -*> \endhtmlonly -* -* Definition: -* =========== -* -* INTEGER FUNCTION ILACLR( M, N, A, LDA ) -* -* .. Scalar Arguments .. -* INTEGER M, N, LDA -* .. -* .. Array Arguments .. -* COMPLEX A( LDA, * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> ILACLR scans A for its last non-zero row. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] M -*> \verbatim -*> M is INTEGER -*> The number of rows of the matrix A. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The number of columns of the matrix A. -*> \endverbatim -*> -*> \param[in] A -*> \verbatim -*> A is array, dimension (LDA,N) -*> The m by n matrix A. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> The leading dimension of the array A. LDA >= max(1,M). -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \date April 2012 -* -*> \ingroup complexOTHERauxiliary -* -* ===================================================================== - INTEGER FUNCTION ILACLR( M, N, A, LDA ) -* -* -- LAPACK auxiliary routine (version 3.4.1) -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* April 2012 -* -* .. Scalar Arguments .. - INTEGER M, N, LDA -* .. -* .. Array Arguments .. - COMPLEX A( LDA, * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - COMPLEX ZERO - PARAMETER ( ZERO = (0.0E+0, 0.0E+0) ) -* .. -* .. Local Scalars .. - INTEGER I, J -* .. -* .. Executable Statements .. -* -* Quick test for the common case where one corner is non-zero. - IF( M.EQ.0 ) THEN - ILACLR = M - ELSE IF( A(M, 1).NE.ZERO .OR. A(M, N).NE.ZERO ) THEN - ILACLR = M - ELSE -* Scan up each column tracking the last zero row seen. - ILACLR = 0 - DO J = 1, N - I=M - DO WHILE((A(MAX(I,1),J).EQ.ZERO).AND.(I.GE.1)) - I=I-1 - ENDDO - ILACLR = MAX( ILACLR, I ) - END DO - END IF - RETURN - END diff --git a/eigen/lapack/iladlc.f b/eigen/lapack/iladlc.f deleted file mode 100644 index f84bd83..0000000 --- a/eigen/lapack/iladlc.f +++ /dev/null @@ -1,118 +0,0 @@ -*> \brief \b ILADLC -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download ILADLC + dependencies -*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/iladlc.f"> -*> [TGZ]</a> -*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/iladlc.f"> -*> [ZIP]</a> -*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/iladlc.f"> -*> [TXT]</a> -*> \endhtmlonly -* -* Definition: -* =========== -* -* INTEGER FUNCTION ILADLC( M, N, A, LDA ) -* -* .. Scalar Arguments .. -* INTEGER M, N, LDA -* .. -* .. Array Arguments .. -* DOUBLE PRECISION A( LDA, * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> ILADLC scans A for its last non-zero column. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] M -*> \verbatim -*> M is INTEGER -*> The number of rows of the matrix A. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The number of columns of the matrix A. -*> \endverbatim -*> -*> \param[in] A -*> \verbatim -*> A is DOUBLE PRECISION array, dimension (LDA,N) -*> The m by n matrix A. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> The leading dimension of the array A. LDA >= max(1,M). -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \date November 2011 -* -*> \ingroup auxOTHERauxiliary -* -* ===================================================================== - INTEGER FUNCTION ILADLC( M, N, A, LDA ) -* -* -- LAPACK auxiliary routine (version 3.4.0) -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* November 2011 -* -* .. Scalar Arguments .. - INTEGER M, N, LDA -* .. -* .. Array Arguments .. - DOUBLE PRECISION A( LDA, * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ZERO - PARAMETER ( ZERO = 0.0D+0 ) -* .. -* .. Local Scalars .. - INTEGER I -* .. -* .. Executable Statements .. -* -* Quick test for the common case where one corner is non-zero. - IF( N.EQ.0 ) THEN - ILADLC = N - ELSE IF( A(1, N).NE.ZERO .OR. A(M, N).NE.ZERO ) THEN - ILADLC = N - ELSE -* Now scan each column from the end, returning with the first non-zero. - DO ILADLC = N, 1, -1 - DO I = 1, M - IF( A(I, ILADLC).NE.ZERO ) RETURN - END DO - END DO - END IF - RETURN - END diff --git a/eigen/lapack/iladlr.f b/eigen/lapack/iladlr.f deleted file mode 100644 index 2114c61..0000000 --- a/eigen/lapack/iladlr.f +++ /dev/null @@ -1,121 +0,0 @@ -*> \brief \b ILADLR -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download ILADLR + dependencies -*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/iladlr.f"> -*> [TGZ]</a> -*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/iladlr.f"> -*> [ZIP]</a> -*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/iladlr.f"> -*> [TXT]</a> -*> \endhtmlonly -* -* Definition: -* =========== -* -* INTEGER FUNCTION ILADLR( M, N, A, LDA ) -* -* .. Scalar Arguments .. -* INTEGER M, N, LDA -* .. -* .. Array Arguments .. -* DOUBLE PRECISION A( LDA, * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> ILADLR scans A for its last non-zero row. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] M -*> \verbatim -*> M is INTEGER -*> The number of rows of the matrix A. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The number of columns of the matrix A. -*> \endverbatim -*> -*> \param[in] A -*> \verbatim -*> A is DOUBLE PRECISION array, dimension (LDA,N) -*> The m by n matrix A. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> The leading dimension of the array A. LDA >= max(1,M). -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \date April 2012 -* -*> \ingroup auxOTHERauxiliary -* -* ===================================================================== - INTEGER FUNCTION ILADLR( M, N, A, LDA ) -* -* -- LAPACK auxiliary routine (version 3.4.1) -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* April 2012 -* -* .. Scalar Arguments .. - INTEGER M, N, LDA -* .. -* .. Array Arguments .. - DOUBLE PRECISION A( LDA, * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ZERO - PARAMETER ( ZERO = 0.0D+0 ) -* .. -* .. Local Scalars .. - INTEGER I, J -* .. -* .. Executable Statements .. -* -* Quick test for the common case where one corner is non-zero. - IF( M.EQ.0 ) THEN - ILADLR = M - ELSE IF( A(M, 1).NE.ZERO .OR. A(M, N).NE.ZERO ) THEN - ILADLR = M - ELSE -* Scan up each column tracking the last zero row seen. - ILADLR = 0 - DO J = 1, N - I=M - DO WHILE((A(MAX(I,1),J).EQ.ZERO).AND.(I.GE.1)) - I=I-1 - ENDDO - ILADLR = MAX( ILADLR, I ) - END DO - END IF - RETURN - END diff --git a/eigen/lapack/ilaslc.f b/eigen/lapack/ilaslc.f deleted file mode 100644 index e3db0f4..0000000 --- a/eigen/lapack/ilaslc.f +++ /dev/null @@ -1,118 +0,0 @@ -*> \brief \b ILASLC -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download ILASLC + dependencies -*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/ilaslc.f"> -*> [TGZ]</a> -*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/ilaslc.f"> -*> [ZIP]</a> -*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/ilaslc.f"> -*> [TXT]</a> -*> \endhtmlonly -* -* Definition: -* =========== -* -* INTEGER FUNCTION ILASLC( M, N, A, LDA ) -* -* .. Scalar Arguments .. -* INTEGER M, N, LDA -* .. -* .. Array Arguments .. -* REAL A( LDA, * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> ILASLC scans A for its last non-zero column. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] M -*> \verbatim -*> M is INTEGER -*> The number of rows of the matrix A. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The number of columns of the matrix A. -*> \endverbatim -*> -*> \param[in] A -*> \verbatim -*> A is REAL array, dimension (LDA,N) -*> The m by n matrix A. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> The leading dimension of the array A. LDA >= max(1,M). -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \date November 2011 -* -*> \ingroup realOTHERauxiliary -* -* ===================================================================== - INTEGER FUNCTION ILASLC( M, N, A, LDA ) -* -* -- LAPACK auxiliary routine (version 3.4.0) -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* November 2011 -* -* .. Scalar Arguments .. - INTEGER M, N, LDA -* .. -* .. Array Arguments .. - REAL A( LDA, * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - REAL ZERO - PARAMETER ( ZERO = 0.0D+0 ) -* .. -* .. Local Scalars .. - INTEGER I -* .. -* .. Executable Statements .. -* -* Quick test for the common case where one corner is non-zero. - IF( N.EQ.0 ) THEN - ILASLC = N - ELSE IF( A(1, N).NE.ZERO .OR. A(M, N).NE.ZERO ) THEN - ILASLC = N - ELSE -* Now scan each column from the end, returning with the first non-zero. - DO ILASLC = N, 1, -1 - DO I = 1, M - IF( A(I, ILASLC).NE.ZERO ) RETURN - END DO - END DO - END IF - RETURN - END diff --git a/eigen/lapack/ilaslr.f b/eigen/lapack/ilaslr.f deleted file mode 100644 index 48b73f4..0000000 --- a/eigen/lapack/ilaslr.f +++ /dev/null @@ -1,121 +0,0 @@ -*> \brief \b ILASLR -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download ILASLR + dependencies -*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/ilaslr.f"> -*> [TGZ]</a> -*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/ilaslr.f"> -*> [ZIP]</a> -*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/ilaslr.f"> -*> [TXT]</a> -*> \endhtmlonly -* -* Definition: -* =========== -* -* INTEGER FUNCTION ILASLR( M, N, A, LDA ) -* -* .. Scalar Arguments .. -* INTEGER M, N, LDA -* .. -* .. Array Arguments .. -* REAL A( LDA, * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> ILASLR scans A for its last non-zero row. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] M -*> \verbatim -*> M is INTEGER -*> The number of rows of the matrix A. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The number of columns of the matrix A. -*> \endverbatim -*> -*> \param[in] A -*> \verbatim -*> A is REAL array, dimension (LDA,N) -*> The m by n matrix A. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> The leading dimension of the array A. LDA >= max(1,M). -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \date April 2012 -* -*> \ingroup realOTHERauxiliary -* -* ===================================================================== - INTEGER FUNCTION ILASLR( M, N, A, LDA ) -* -* -- LAPACK auxiliary routine (version 3.4.1) -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* April 2012 -* -* .. Scalar Arguments .. - INTEGER M, N, LDA -* .. -* .. Array Arguments .. - REAL A( LDA, * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - REAL ZERO - PARAMETER ( ZERO = 0.0E+0 ) -* .. -* .. Local Scalars .. - INTEGER I, J -* .. -* .. Executable Statements .. -* -* Quick test for the common case where one corner is non-zero. - IF( M.EQ.0 ) THEN - ILASLR = M - ELSEIF( A(M, 1).NE.ZERO .OR. A(M, N).NE.ZERO ) THEN - ILASLR = M - ELSE -* Scan up each column tracking the last zero row seen. - ILASLR = 0 - DO J = 1, N - I=M - DO WHILE((A(MAX(I,1),J).EQ.ZERO).AND.(I.GE.1)) - I=I-1 - ENDDO - ILASLR = MAX( ILASLR, I ) - END DO - END IF - RETURN - END diff --git a/eigen/lapack/ilazlc.f b/eigen/lapack/ilazlc.f deleted file mode 100644 index 15b1490..0000000 --- a/eigen/lapack/ilazlc.f +++ /dev/null @@ -1,118 +0,0 @@ -*> \brief \b ILAZLC -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download ILAZLC + dependencies -*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/ilazlc.f"> -*> [TGZ]</a> -*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/ilazlc.f"> -*> [ZIP]</a> -*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/ilazlc.f"> -*> [TXT]</a> -*> \endhtmlonly -* -* Definition: -* =========== -* -* INTEGER FUNCTION ILAZLC( M, N, A, LDA ) -* -* .. Scalar Arguments .. -* INTEGER M, N, LDA -* .. -* .. Array Arguments .. -* COMPLEX*16 A( LDA, * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> ILAZLC scans A for its last non-zero column. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] M -*> \verbatim -*> M is INTEGER -*> The number of rows of the matrix A. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The number of columns of the matrix A. -*> \endverbatim -*> -*> \param[in] A -*> \verbatim -*> A is COMPLEX*16 array, dimension (LDA,N) -*> The m by n matrix A. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> The leading dimension of the array A. LDA >= max(1,M). -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \date November 2011 -* -*> \ingroup complex16OTHERauxiliary -* -* ===================================================================== - INTEGER FUNCTION ILAZLC( M, N, A, LDA ) -* -* -- LAPACK auxiliary routine (version 3.4.0) -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* November 2011 -* -* .. Scalar Arguments .. - INTEGER M, N, LDA -* .. -* .. Array Arguments .. - COMPLEX*16 A( LDA, * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - COMPLEX*16 ZERO - PARAMETER ( ZERO = (0.0D+0, 0.0D+0) ) -* .. -* .. Local Scalars .. - INTEGER I -* .. -* .. Executable Statements .. -* -* Quick test for the common case where one corner is non-zero. - IF( N.EQ.0 ) THEN - ILAZLC = N - ELSE IF( A(1, N).NE.ZERO .OR. A(M, N).NE.ZERO ) THEN - ILAZLC = N - ELSE -* Now scan each column from the end, returning with the first non-zero. - DO ILAZLC = N, 1, -1 - DO I = 1, M - IF( A(I, ILAZLC).NE.ZERO ) RETURN - END DO - END DO - END IF - RETURN - END diff --git a/eigen/lapack/ilazlr.f b/eigen/lapack/ilazlr.f deleted file mode 100644 index b2ab943..0000000 --- a/eigen/lapack/ilazlr.f +++ /dev/null @@ -1,121 +0,0 @@ -*> \brief \b ILAZLR -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download ILAZLR + dependencies -*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/ilazlr.f"> -*> [TGZ]</a> -*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/ilazlr.f"> -*> [ZIP]</a> -*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/ilazlr.f"> -*> [TXT]</a> -*> \endhtmlonly -* -* Definition: -* =========== -* -* INTEGER FUNCTION ILAZLR( M, N, A, LDA ) -* -* .. Scalar Arguments .. -* INTEGER M, N, LDA -* .. -* .. Array Arguments .. -* COMPLEX*16 A( LDA, * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> ILAZLR scans A for its last non-zero row. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] M -*> \verbatim -*> M is INTEGER -*> The number of rows of the matrix A. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The number of columns of the matrix A. -*> \endverbatim -*> -*> \param[in] A -*> \verbatim -*> A is COMPLEX*16 array, dimension (LDA,N) -*> The m by n matrix A. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> The leading dimension of the array A. LDA >= max(1,M). -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \date April 2012 -* -*> \ingroup complex16OTHERauxiliary -* -* ===================================================================== - INTEGER FUNCTION ILAZLR( M, N, A, LDA ) -* -* -- LAPACK auxiliary routine (version 3.4.1) -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* April 2012 -* -* .. Scalar Arguments .. - INTEGER M, N, LDA -* .. -* .. Array Arguments .. - COMPLEX*16 A( LDA, * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - COMPLEX*16 ZERO - PARAMETER ( ZERO = (0.0D+0, 0.0D+0) ) -* .. -* .. Local Scalars .. - INTEGER I, J -* .. -* .. Executable Statements .. -* -* Quick test for the common case where one corner is non-zero. - IF( M.EQ.0 ) THEN - ILAZLR = M - ELSE IF( A(M, 1).NE.ZERO .OR. A(M, N).NE.ZERO ) THEN - ILAZLR = M - ELSE -* Scan up each column tracking the last zero row seen. - ILAZLR = 0 - DO J = 1, N - I=M - DO WHILE((A(MAX(I,1),J).EQ.ZERO).AND.(I.GE.1)) - I=I-1 - ENDDO - ILAZLR = MAX( ILAZLR, I ) - END DO - END IF - RETURN - END diff --git a/eigen/lapack/lapack_common.h b/eigen/lapack/lapack_common.h deleted file mode 100644 index c872a81..0000000 --- a/eigen/lapack/lapack_common.h +++ /dev/null @@ -1,29 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2010-2014 Gael Guennebaud <gael.guennebaud@inria.fr> -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_LAPACK_COMMON_H -#define EIGEN_LAPACK_COMMON_H - -#include "../blas/common.h" -#include "../Eigen/src/misc/lapack.h" - -#define EIGEN_LAPACK_FUNC(FUNC,ARGLIST) \ - extern "C" { int EIGEN_BLAS_FUNC(FUNC) ARGLIST; } \ - int EIGEN_BLAS_FUNC(FUNC) ARGLIST - -typedef Eigen::Map<Eigen::Transpositions<Eigen::Dynamic,Eigen::Dynamic,int> > PivotsType; - -#if ISCOMPLEX -#define EIGEN_LAPACK_ARG_IF_COMPLEX(X) X, -#else -#define EIGEN_LAPACK_ARG_IF_COMPLEX(X) -#endif - - -#endif // EIGEN_LAPACK_COMMON_H diff --git a/eigen/lapack/lu.cpp b/eigen/lapack/lu.cpp deleted file mode 100644 index 90cebe0..0000000 --- a/eigen/lapack/lu.cpp +++ /dev/null @@ -1,89 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2010-2011 Gael Guennebaud <gael.guennebaud@inria.fr> -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#include "common.h" -#include <Eigen/LU> - -// computes an LU factorization of a general M-by-N matrix A using partial pivoting with row interchanges -EIGEN_LAPACK_FUNC(getrf,(int *m, int *n, RealScalar *pa, int *lda, int *ipiv, int *info)) -{ - *info = 0; - if(*m<0) *info = -1; - else if(*n<0) *info = -2; - else if(*lda<std::max(1,*m)) *info = -4; - if(*info!=0) - { - int e = -*info; - return xerbla_(SCALAR_SUFFIX_UP"GETRF", &e, 6); - } - - if(*m==0 || *n==0) - return 0; - - Scalar* a = reinterpret_cast<Scalar*>(pa); - int nb_transpositions; - int ret = int(Eigen::internal::partial_lu_impl<Scalar,ColMajor,int> - ::blocked_lu(*m, *n, a, *lda, ipiv, nb_transpositions)); - - for(int i=0; i<std::min(*m,*n); ++i) - ipiv[i]++; - - if(ret>=0) - *info = ret+1; - - return 0; -} - -//GETRS solves a system of linear equations -// A * X = B or A' * X = B -// with a general N-by-N matrix A using the LU factorization computed by GETRF -EIGEN_LAPACK_FUNC(getrs,(char *trans, int *n, int *nrhs, RealScalar *pa, int *lda, int *ipiv, RealScalar *pb, int *ldb, int *info)) -{ - *info = 0; - if(OP(*trans)==INVALID) *info = -1; - else if(*n<0) *info = -2; - else if(*nrhs<0) *info = -3; - else if(*lda<std::max(1,*n)) *info = -5; - else if(*ldb<std::max(1,*n)) *info = -8; - if(*info!=0) - { - int e = -*info; - return xerbla_(SCALAR_SUFFIX_UP"GETRS", &e, 6); - } - - Scalar* a = reinterpret_cast<Scalar*>(pa); - Scalar* b = reinterpret_cast<Scalar*>(pb); - MatrixType lu(a,*n,*n,*lda); - MatrixType B(b,*n,*nrhs,*ldb); - - for(int i=0; i<*n; ++i) - ipiv[i]--; - if(OP(*trans)==NOTR) - { - B = PivotsType(ipiv,*n) * B; - lu.triangularView<UnitLower>().solveInPlace(B); - lu.triangularView<Upper>().solveInPlace(B); - } - else if(OP(*trans)==TR) - { - lu.triangularView<Upper>().transpose().solveInPlace(B); - lu.triangularView<UnitLower>().transpose().solveInPlace(B); - B = PivotsType(ipiv,*n).transpose() * B; - } - else if(OP(*trans)==ADJ) - { - lu.triangularView<Upper>().adjoint().solveInPlace(B); - lu.triangularView<UnitLower>().adjoint().solveInPlace(B); - B = PivotsType(ipiv,*n).transpose() * B; - } - for(int i=0; i<*n; ++i) - ipiv[i]++; - - return 0; -} diff --git a/eigen/lapack/second_NONE.f b/eigen/lapack/second_NONE.f deleted file mode 100644 index d3e6d33..0000000 --- a/eigen/lapack/second_NONE.f +++ /dev/null @@ -1,52 +0,0 @@ -*> \brief \b SECOND returns nothing -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -* Definition: -* =========== -* -* REAL FUNCTION SECOND( ) -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> SECOND returns nothing instead of returning the user time for a process in seconds. -*> If you are using that routine, it means that neither EXTERNAL ETIME, -*> EXTERNAL ETIME_, INTERNAL ETIME, INTERNAL CPU_TIME is available on -*> your machine. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \date November 2011 -* -*> \ingroup auxOTHERauxiliary -* -* ===================================================================== - REAL FUNCTION SECOND( ) -* -* -- LAPACK auxiliary routine (version 3.4.0) -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* November 2011 -* -* ===================================================================== -* - SECOND = 0.0E+0 - RETURN -* -* End of SECOND -* - END diff --git a/eigen/lapack/single.cpp b/eigen/lapack/single.cpp deleted file mode 100644 index c7da3ef..0000000 --- a/eigen/lapack/single.cpp +++ /dev/null @@ -1,18 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2009-2014 Gael Guennebaud <gael.guennebaud@inria.fr> -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#define SCALAR float -#define SCALAR_SUFFIX s -#define SCALAR_SUFFIX_UP "S" -#define ISCOMPLEX 0 - -#include "cholesky.cpp" -#include "lu.cpp" -#include "eigenvalues.cpp" -#include "svd.cpp" diff --git a/eigen/lapack/sladiv.f b/eigen/lapack/sladiv.f deleted file mode 100644 index da3afa3..0000000 --- a/eigen/lapack/sladiv.f +++ /dev/null @@ -1,128 +0,0 @@ -*> \brief \b SLADIV -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download SLADIV + dependencies -*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/sladiv.f"> -*> [TGZ]</a> -*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/sladiv.f"> -*> [ZIP]</a> -*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/sladiv.f"> -*> [TXT]</a> -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE SLADIV( A, B, C, D, P, Q ) -* -* .. Scalar Arguments .. -* REAL A, B, C, D, P, Q -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> SLADIV performs complex division in real arithmetic -*> -*> a + i*b -*> p + i*q = --------- -*> c + i*d -*> -*> The algorithm is due to Robert L. Smith and can be found -*> in D. Knuth, The art of Computer Programming, Vol.2, p.195 -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] A -*> \verbatim -*> A is REAL -*> \endverbatim -*> -*> \param[in] B -*> \verbatim -*> B is REAL -*> \endverbatim -*> -*> \param[in] C -*> \verbatim -*> C is REAL -*> \endverbatim -*> -*> \param[in] D -*> \verbatim -*> D is REAL -*> The scalars a, b, c, and d in the above expression. -*> \endverbatim -*> -*> \param[out] P -*> \verbatim -*> P is REAL -*> \endverbatim -*> -*> \param[out] Q -*> \verbatim -*> Q is REAL -*> The scalars p and q in the above expression. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \date November 2011 -* -*> \ingroup auxOTHERauxiliary -* -* ===================================================================== - SUBROUTINE SLADIV( A, B, C, D, P, Q ) -* -* -- LAPACK auxiliary routine (version 3.4.0) -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* November 2011 -* -* .. Scalar Arguments .. - REAL A, B, C, D, P, Q -* .. -* -* ===================================================================== -* -* .. Local Scalars .. - REAL E, F -* .. -* .. Intrinsic Functions .. - INTRINSIC ABS -* .. -* .. Executable Statements .. -* - IF( ABS( D ).LT.ABS( C ) ) THEN - E = D / C - F = C + D*E - P = ( A+B*E ) / F - Q = ( B-A*E ) / F - ELSE - E = C / D - F = D + C*E - P = ( B+A*E ) / F - Q = ( -A+B*E ) / F - END IF -* - RETURN -* -* End of SLADIV -* - END diff --git a/eigen/lapack/slamch.f b/eigen/lapack/slamch.f deleted file mode 100644 index 4bffad0..0000000 --- a/eigen/lapack/slamch.f +++ /dev/null @@ -1,192 +0,0 @@ -*> \brief \b SLAMCH -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -* Definition: -* =========== -* -* REAL FUNCTION SLAMCH( CMACH ) -* -* .. Scalar Arguments .. -* CHARACTER CMACH -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> SLAMCH determines single precision machine parameters. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] CMACH -*> \verbatim -*> Specifies the value to be returned by SLAMCH: -*> = 'E' or 'e', SLAMCH := eps -*> = 'S' or 's , SLAMCH := sfmin -*> = 'B' or 'b', SLAMCH := base -*> = 'P' or 'p', SLAMCH := eps*base -*> = 'N' or 'n', SLAMCH := t -*> = 'R' or 'r', SLAMCH := rnd -*> = 'M' or 'm', SLAMCH := emin -*> = 'U' or 'u', SLAMCH := rmin -*> = 'L' or 'l', SLAMCH := emax -*> = 'O' or 'o', SLAMCH := rmax -*> where -*> eps = relative machine precision -*> sfmin = safe minimum, such that 1/sfmin does not overflow -*> base = base of the machine -*> prec = eps*base -*> t = number of (base) digits in the mantissa -*> rnd = 1.0 when rounding occurs in addition, 0.0 otherwise -*> emin = minimum exponent before (gradual) underflow -*> rmin = underflow threshold - base**(emin-1) -*> emax = largest exponent before overflow -*> rmax = overflow threshold - (base**emax)*(1-eps) -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \date November 2011 -* -*> \ingroup auxOTHERauxiliary -* -* ===================================================================== - REAL FUNCTION SLAMCH( CMACH ) -* -* -- LAPACK auxiliary routine (version 3.4.0) -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* November 2011 -* -* .. Scalar Arguments .. - CHARACTER CMACH -* .. -* -* ===================================================================== -* -* .. Parameters .. - REAL ONE, ZERO - PARAMETER ( ONE = 1.0E+0, ZERO = 0.0E+0 ) -* .. -* .. Local Scalars .. - REAL RND, EPS, SFMIN, SMALL, RMACH -* .. -* .. External Functions .. - LOGICAL LSAME - EXTERNAL LSAME -* .. -* .. Intrinsic Functions .. - INTRINSIC DIGITS, EPSILON, HUGE, MAXEXPONENT, - $ MINEXPONENT, RADIX, TINY -* .. -* .. Executable Statements .. -* -* -* Assume rounding, not chopping. Always. -* - RND = ONE -* - IF( ONE.EQ.RND ) THEN - EPS = EPSILON(ZERO) * 0.5 - ELSE - EPS = EPSILON(ZERO) - END IF -* - IF( LSAME( CMACH, 'E' ) ) THEN - RMACH = EPS - ELSE IF( LSAME( CMACH, 'S' ) ) THEN - SFMIN = TINY(ZERO) - SMALL = ONE / HUGE(ZERO) - IF( SMALL.GE.SFMIN ) THEN -* -* Use SMALL plus a bit, to avoid the possibility of rounding -* causing overflow when computing 1/sfmin. -* - SFMIN = SMALL*( ONE+EPS ) - END IF - RMACH = SFMIN - ELSE IF( LSAME( CMACH, 'B' ) ) THEN - RMACH = RADIX(ZERO) - ELSE IF( LSAME( CMACH, 'P' ) ) THEN - RMACH = EPS * RADIX(ZERO) - ELSE IF( LSAME( CMACH, 'N' ) ) THEN - RMACH = DIGITS(ZERO) - ELSE IF( LSAME( CMACH, 'R' ) ) THEN - RMACH = RND - ELSE IF( LSAME( CMACH, 'M' ) ) THEN - RMACH = MINEXPONENT(ZERO) - ELSE IF( LSAME( CMACH, 'U' ) ) THEN - RMACH = tiny(zero) - ELSE IF( LSAME( CMACH, 'L' ) ) THEN - RMACH = MAXEXPONENT(ZERO) - ELSE IF( LSAME( CMACH, 'O' ) ) THEN - RMACH = HUGE(ZERO) - ELSE - RMACH = ZERO - END IF -* - SLAMCH = RMACH - RETURN -* -* End of SLAMCH -* - END -************************************************************************ -*> \brief \b SLAMC3 -*> \details -*> \b Purpose: -*> \verbatim -*> SLAMC3 is intended to force A and B to be stored prior to doing -*> the addition of A and B , for use in situations where optimizers -*> might hold one of these in a register. -*> \endverbatim -*> \author LAPACK is a software package provided by Univ. of Tennessee, Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd.. -*> \date November 2011 -*> \ingroup auxOTHERauxiliary -*> -*> \param[in] A -*> \verbatim -*> \endverbatim -*> -*> \param[in] B -*> \verbatim -*> The values A and B. -*> \endverbatim -*> -* - REAL FUNCTION SLAMC3( A, B ) -* -* -- LAPACK auxiliary routine (version 3.4.0) -- -* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. -* November 2010 -* -* .. Scalar Arguments .. - REAL A, B -* .. -* ===================================================================== -* -* .. Executable Statements .. -* - SLAMC3 = A + B -* - RETURN -* -* End of SLAMC3 -* - END -* -************************************************************************ diff --git a/eigen/lapack/slapy2.f b/eigen/lapack/slapy2.f deleted file mode 100644 index 1f6b1ca..0000000 --- a/eigen/lapack/slapy2.f +++ /dev/null @@ -1,104 +0,0 @@ -*> \brief \b SLAPY2 -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download SLAPY2 + dependencies -*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/slapy2.f"> -*> [TGZ]</a> -*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/slapy2.f"> -*> [ZIP]</a> -*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/slapy2.f"> -*> [TXT]</a> -*> \endhtmlonly -* -* Definition: -* =========== -* -* REAL FUNCTION SLAPY2( X, Y ) -* -* .. Scalar Arguments .. -* REAL X, Y -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> SLAPY2 returns sqrt(x**2+y**2), taking care not to cause unnecessary -*> overflow. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] X -*> \verbatim -*> X is REAL -*> \endverbatim -*> -*> \param[in] Y -*> \verbatim -*> Y is REAL -*> X and Y specify the values x and y. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \date November 2011 -* -*> \ingroup auxOTHERauxiliary -* -* ===================================================================== - REAL FUNCTION SLAPY2( X, Y ) -* -* -- LAPACK auxiliary routine (version 3.4.0) -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* November 2011 -* -* .. Scalar Arguments .. - REAL X, Y -* .. -* -* ===================================================================== -* -* .. Parameters .. - REAL ZERO - PARAMETER ( ZERO = 0.0E0 ) - REAL ONE - PARAMETER ( ONE = 1.0E0 ) -* .. -* .. Local Scalars .. - REAL W, XABS, YABS, Z -* .. -* .. Intrinsic Functions .. - INTRINSIC ABS, MAX, MIN, SQRT -* .. -* .. Executable Statements .. -* - XABS = ABS( X ) - YABS = ABS( Y ) - W = MAX( XABS, YABS ) - Z = MIN( XABS, YABS ) - IF( Z.EQ.ZERO ) THEN - SLAPY2 = W - ELSE - SLAPY2 = W*SQRT( ONE+( Z / W )**2 ) - END IF - RETURN -* -* End of SLAPY2 -* - END diff --git a/eigen/lapack/slapy3.f b/eigen/lapack/slapy3.f deleted file mode 100644 index aa2f5bf..0000000 --- a/eigen/lapack/slapy3.f +++ /dev/null @@ -1,111 +0,0 @@ -*> \brief \b SLAPY3 -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download SLAPY3 + dependencies -*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/slapy3.f"> -*> [TGZ]</a> -*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/slapy3.f"> -*> [ZIP]</a> -*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/slapy3.f"> -*> [TXT]</a> -*> \endhtmlonly -* -* Definition: -* =========== -* -* REAL FUNCTION SLAPY3( X, Y, Z ) -* -* .. Scalar Arguments .. -* REAL X, Y, Z -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> SLAPY3 returns sqrt(x**2+y**2+z**2), taking care not to cause -*> unnecessary overflow. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] X -*> \verbatim -*> X is REAL -*> \endverbatim -*> -*> \param[in] Y -*> \verbatim -*> Y is REAL -*> \endverbatim -*> -*> \param[in] Z -*> \verbatim -*> Z is REAL -*> X, Y and Z specify the values x, y and z. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \date November 2011 -* -*> \ingroup auxOTHERauxiliary -* -* ===================================================================== - REAL FUNCTION SLAPY3( X, Y, Z ) -* -* -- LAPACK auxiliary routine (version 3.4.0) -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* November 2011 -* -* .. Scalar Arguments .. - REAL X, Y, Z -* .. -* -* ===================================================================== -* -* .. Parameters .. - REAL ZERO - PARAMETER ( ZERO = 0.0E0 ) -* .. -* .. Local Scalars .. - REAL W, XABS, YABS, ZABS -* .. -* .. Intrinsic Functions .. - INTRINSIC ABS, MAX, SQRT -* .. -* .. Executable Statements .. -* - XABS = ABS( X ) - YABS = ABS( Y ) - ZABS = ABS( Z ) - W = MAX( XABS, YABS, ZABS ) - IF( W.EQ.ZERO ) THEN -* W can be zero for max(0,nan,0) -* adding all three entries together will make sure -* NaN will not disappear. - SLAPY3 = XABS + YABS + ZABS - ELSE - SLAPY3 = W*SQRT( ( XABS / W )**2+( YABS / W )**2+ - $ ( ZABS / W )**2 ) - END IF - RETURN -* -* End of SLAPY3 -* - END diff --git a/eigen/lapack/slarf.f b/eigen/lapack/slarf.f deleted file mode 100644 index 8a8ff30..0000000 --- a/eigen/lapack/slarf.f +++ /dev/null @@ -1,227 +0,0 @@ -*> \brief \b SLARF -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download SLARF + dependencies -*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/slarf.f"> -*> [TGZ]</a> -*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/slarf.f"> -*> [ZIP]</a> -*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/slarf.f"> -*> [TXT]</a> -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE SLARF( SIDE, M, N, V, INCV, TAU, C, LDC, WORK ) -* -* .. Scalar Arguments .. -* CHARACTER SIDE -* INTEGER INCV, LDC, M, N -* REAL TAU -* .. -* .. Array Arguments .. -* REAL C( LDC, * ), V( * ), WORK( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> SLARF applies a real elementary reflector H to a real m by n matrix -*> C, from either the left or the right. H is represented in the form -*> -*> H = I - tau * v * v**T -*> -*> where tau is a real scalar and v is a real vector. -*> -*> If tau = 0, then H is taken to be the unit matrix. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] SIDE -*> \verbatim -*> SIDE is CHARACTER*1 -*> = 'L': form H * C -*> = 'R': form C * H -*> \endverbatim -*> -*> \param[in] M -*> \verbatim -*> M is INTEGER -*> The number of rows of the matrix C. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The number of columns of the matrix C. -*> \endverbatim -*> -*> \param[in] V -*> \verbatim -*> V is REAL array, dimension -*> (1 + (M-1)*abs(INCV)) if SIDE = 'L' -*> or (1 + (N-1)*abs(INCV)) if SIDE = 'R' -*> The vector v in the representation of H. V is not used if -*> TAU = 0. -*> \endverbatim -*> -*> \param[in] INCV -*> \verbatim -*> INCV is INTEGER -*> The increment between elements of v. INCV <> 0. -*> \endverbatim -*> -*> \param[in] TAU -*> \verbatim -*> TAU is REAL -*> The value tau in the representation of H. -*> \endverbatim -*> -*> \param[in,out] C -*> \verbatim -*> C is REAL array, dimension (LDC,N) -*> On entry, the m by n matrix C. -*> On exit, C is overwritten by the matrix H * C if SIDE = 'L', -*> or C * H if SIDE = 'R'. -*> \endverbatim -*> -*> \param[in] LDC -*> \verbatim -*> LDC is INTEGER -*> The leading dimension of the array C. LDC >= max(1,M). -*> \endverbatim -*> -*> \param[out] WORK -*> \verbatim -*> WORK is REAL array, dimension -*> (N) if SIDE = 'L' -*> or (M) if SIDE = 'R' -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \date November 2011 -* -*> \ingroup realOTHERauxiliary -* -* ===================================================================== - SUBROUTINE SLARF( SIDE, M, N, V, INCV, TAU, C, LDC, WORK ) -* -* -- LAPACK auxiliary routine (version 3.4.0) -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* November 2011 -* -* .. Scalar Arguments .. - CHARACTER SIDE - INTEGER INCV, LDC, M, N - REAL TAU -* .. -* .. Array Arguments .. - REAL C( LDC, * ), V( * ), WORK( * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - REAL ONE, ZERO - PARAMETER ( ONE = 1.0E+0, ZERO = 0.0E+0 ) -* .. -* .. Local Scalars .. - LOGICAL APPLYLEFT - INTEGER I, LASTV, LASTC -* .. -* .. External Subroutines .. - EXTERNAL SGEMV, SGER -* .. -* .. External Functions .. - LOGICAL LSAME - INTEGER ILASLR, ILASLC - EXTERNAL LSAME, ILASLR, ILASLC -* .. -* .. Executable Statements .. -* - APPLYLEFT = LSAME( SIDE, 'L' ) - LASTV = 0 - LASTC = 0 - IF( TAU.NE.ZERO ) THEN -! Set up variables for scanning V. LASTV begins pointing to the end -! of V. - IF( APPLYLEFT ) THEN - LASTV = M - ELSE - LASTV = N - END IF - IF( INCV.GT.0 ) THEN - I = 1 + (LASTV-1) * INCV - ELSE - I = 1 - END IF -! Look for the last non-zero row in V. - DO WHILE( LASTV.GT.0 .AND. V( I ).EQ.ZERO ) - LASTV = LASTV - 1 - I = I - INCV - END DO - IF( APPLYLEFT ) THEN -! Scan for the last non-zero column in C(1:lastv,:). - LASTC = ILASLC(LASTV, N, C, LDC) - ELSE -! Scan for the last non-zero row in C(:,1:lastv). - LASTC = ILASLR(M, LASTV, C, LDC) - END IF - END IF -! Note that lastc.eq.0 renders the BLAS operations null; no special -! case is needed at this level. - IF( APPLYLEFT ) THEN -* -* Form H * C -* - IF( LASTV.GT.0 ) THEN -* -* w(1:lastc,1) := C(1:lastv,1:lastc)**T * v(1:lastv,1) -* - CALL SGEMV( 'Transpose', LASTV, LASTC, ONE, C, LDC, V, INCV, - $ ZERO, WORK, 1 ) -* -* C(1:lastv,1:lastc) := C(...) - v(1:lastv,1) * w(1:lastc,1)**T -* - CALL SGER( LASTV, LASTC, -TAU, V, INCV, WORK, 1, C, LDC ) - END IF - ELSE -* -* Form C * H -* - IF( LASTV.GT.0 ) THEN -* -* w(1:lastc,1) := C(1:lastc,1:lastv) * v(1:lastv,1) -* - CALL SGEMV( 'No transpose', LASTC, LASTV, ONE, C, LDC, - $ V, INCV, ZERO, WORK, 1 ) -* -* C(1:lastc,1:lastv) := C(...) - w(1:lastc,1) * v(1:lastv,1)**T -* - CALL SGER( LASTC, LASTV, -TAU, WORK, 1, V, INCV, C, LDC ) - END IF - END IF - RETURN -* -* End of SLARF -* - END diff --git a/eigen/lapack/slarfb.f b/eigen/lapack/slarfb.f deleted file mode 100644 index eb95990..0000000 --- a/eigen/lapack/slarfb.f +++ /dev/null @@ -1,763 +0,0 @@ -*> \brief \b SLARFB -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download SLARFB + dependencies -*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/slarfb.f"> -*> [TGZ]</a> -*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/slarfb.f"> -*> [ZIP]</a> -*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/slarfb.f"> -*> [TXT]</a> -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE SLARFB( SIDE, TRANS, DIRECT, STOREV, M, N, K, V, LDV, -* T, LDT, C, LDC, WORK, LDWORK ) -* -* .. Scalar Arguments .. -* CHARACTER DIRECT, SIDE, STOREV, TRANS -* INTEGER K, LDC, LDT, LDV, LDWORK, M, N -* .. -* .. Array Arguments .. -* REAL C( LDC, * ), T( LDT, * ), V( LDV, * ), -* $ WORK( LDWORK, * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> SLARFB applies a real block reflector H or its transpose H**T to a -*> real m by n matrix C, from either the left or the right. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] SIDE -*> \verbatim -*> SIDE is CHARACTER*1 -*> = 'L': apply H or H**T from the Left -*> = 'R': apply H or H**T from the Right -*> \endverbatim -*> -*> \param[in] TRANS -*> \verbatim -*> TRANS is CHARACTER*1 -*> = 'N': apply H (No transpose) -*> = 'T': apply H**T (Transpose) -*> \endverbatim -*> -*> \param[in] DIRECT -*> \verbatim -*> DIRECT is CHARACTER*1 -*> Indicates how H is formed from a product of elementary -*> reflectors -*> = 'F': H = H(1) H(2) . . . H(k) (Forward) -*> = 'B': H = H(k) . . . H(2) H(1) (Backward) -*> \endverbatim -*> -*> \param[in] STOREV -*> \verbatim -*> STOREV is CHARACTER*1 -*> Indicates how the vectors which define the elementary -*> reflectors are stored: -*> = 'C': Columnwise -*> = 'R': Rowwise -*> \endverbatim -*> -*> \param[in] M -*> \verbatim -*> M is INTEGER -*> The number of rows of the matrix C. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The number of columns of the matrix C. -*> \endverbatim -*> -*> \param[in] K -*> \verbatim -*> K is INTEGER -*> The order of the matrix T (= the number of elementary -*> reflectors whose product defines the block reflector). -*> \endverbatim -*> -*> \param[in] V -*> \verbatim -*> V is REAL array, dimension -*> (LDV,K) if STOREV = 'C' -*> (LDV,M) if STOREV = 'R' and SIDE = 'L' -*> (LDV,N) if STOREV = 'R' and SIDE = 'R' -*> The matrix V. See Further Details. -*> \endverbatim -*> -*> \param[in] LDV -*> \verbatim -*> LDV is INTEGER -*> The leading dimension of the array V. -*> If STOREV = 'C' and SIDE = 'L', LDV >= max(1,M); -*> if STOREV = 'C' and SIDE = 'R', LDV >= max(1,N); -*> if STOREV = 'R', LDV >= K. -*> \endverbatim -*> -*> \param[in] T -*> \verbatim -*> T is REAL array, dimension (LDT,K) -*> The triangular k by k matrix T in the representation of the -*> block reflector. -*> \endverbatim -*> -*> \param[in] LDT -*> \verbatim -*> LDT is INTEGER -*> The leading dimension of the array T. LDT >= K. -*> \endverbatim -*> -*> \param[in,out] C -*> \verbatim -*> C is REAL array, dimension (LDC,N) -*> On entry, the m by n matrix C. -*> On exit, C is overwritten by H*C or H**T*C or C*H or C*H**T. -*> \endverbatim -*> -*> \param[in] LDC -*> \verbatim -*> LDC is INTEGER -*> The leading dimension of the array C. LDC >= max(1,M). -*> \endverbatim -*> -*> \param[out] WORK -*> \verbatim -*> WORK is REAL array, dimension (LDWORK,K) -*> \endverbatim -*> -*> \param[in] LDWORK -*> \verbatim -*> LDWORK is INTEGER -*> The leading dimension of the array WORK. -*> If SIDE = 'L', LDWORK >= max(1,N); -*> if SIDE = 'R', LDWORK >= max(1,M). -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \date November 2011 -* -*> \ingroup realOTHERauxiliary -* -*> \par Further Details: -* ===================== -*> -*> \verbatim -*> -*> The shape of the matrix V and the storage of the vectors which define -*> the H(i) is best illustrated by the following example with n = 5 and -*> k = 3. The elements equal to 1 are not stored; the corresponding -*> array elements are modified but restored on exit. The rest of the -*> array is not used. -*> -*> DIRECT = 'F' and STOREV = 'C': DIRECT = 'F' and STOREV = 'R': -*> -*> V = ( 1 ) V = ( 1 v1 v1 v1 v1 ) -*> ( v1 1 ) ( 1 v2 v2 v2 ) -*> ( v1 v2 1 ) ( 1 v3 v3 ) -*> ( v1 v2 v3 ) -*> ( v1 v2 v3 ) -*> -*> DIRECT = 'B' and STOREV = 'C': DIRECT = 'B' and STOREV = 'R': -*> -*> V = ( v1 v2 v3 ) V = ( v1 v1 1 ) -*> ( v1 v2 v3 ) ( v2 v2 v2 1 ) -*> ( 1 v2 v3 ) ( v3 v3 v3 v3 1 ) -*> ( 1 v3 ) -*> ( 1 ) -*> \endverbatim -*> -* ===================================================================== - SUBROUTINE SLARFB( SIDE, TRANS, DIRECT, STOREV, M, N, K, V, LDV, - $ T, LDT, C, LDC, WORK, LDWORK ) -* -* -- LAPACK auxiliary routine (version 3.4.0) -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* November 2011 -* -* .. Scalar Arguments .. - CHARACTER DIRECT, SIDE, STOREV, TRANS - INTEGER K, LDC, LDT, LDV, LDWORK, M, N -* .. -* .. Array Arguments .. - REAL C( LDC, * ), T( LDT, * ), V( LDV, * ), - $ WORK( LDWORK, * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - REAL ONE - PARAMETER ( ONE = 1.0E+0 ) -* .. -* .. Local Scalars .. - CHARACTER TRANST - INTEGER I, J, LASTV, LASTC -* .. -* .. External Functions .. - LOGICAL LSAME - INTEGER ILASLR, ILASLC - EXTERNAL LSAME, ILASLR, ILASLC -* .. -* .. External Subroutines .. - EXTERNAL SCOPY, SGEMM, STRMM -* .. -* .. Executable Statements .. -* -* Quick return if possible -* - IF( M.LE.0 .OR. N.LE.0 ) - $ RETURN -* - IF( LSAME( TRANS, 'N' ) ) THEN - TRANST = 'T' - ELSE - TRANST = 'N' - END IF -* - IF( LSAME( STOREV, 'C' ) ) THEN -* - IF( LSAME( DIRECT, 'F' ) ) THEN -* -* Let V = ( V1 ) (first K rows) -* ( V2 ) -* where V1 is unit lower triangular. -* - IF( LSAME( SIDE, 'L' ) ) THEN -* -* Form H * C or H**T * C where C = ( C1 ) -* ( C2 ) -* - LASTV = MAX( K, ILASLR( M, K, V, LDV ) ) - LASTC = ILASLC( LASTV, N, C, LDC ) -* -* W := C**T * V = (C1**T * V1 + C2**T * V2) (stored in WORK) -* -* W := C1**T -* - DO 10 J = 1, K - CALL SCOPY( LASTC, C( J, 1 ), LDC, WORK( 1, J ), 1 ) - 10 CONTINUE -* -* W := W * V1 -* - CALL STRMM( 'Right', 'Lower', 'No transpose', 'Unit', - $ LASTC, K, ONE, V, LDV, WORK, LDWORK ) - IF( LASTV.GT.K ) THEN -* -* W := W + C2**T *V2 -* - CALL SGEMM( 'Transpose', 'No transpose', - $ LASTC, K, LASTV-K, - $ ONE, C( K+1, 1 ), LDC, V( K+1, 1 ), LDV, - $ ONE, WORK, LDWORK ) - END IF -* -* W := W * T**T or W * T -* - CALL STRMM( 'Right', 'Upper', TRANST, 'Non-unit', - $ LASTC, K, ONE, T, LDT, WORK, LDWORK ) -* -* C := C - V * W**T -* - IF( LASTV.GT.K ) THEN -* -* C2 := C2 - V2 * W**T -* - CALL SGEMM( 'No transpose', 'Transpose', - $ LASTV-K, LASTC, K, - $ -ONE, V( K+1, 1 ), LDV, WORK, LDWORK, ONE, - $ C( K+1, 1 ), LDC ) - END IF -* -* W := W * V1**T -* - CALL STRMM( 'Right', 'Lower', 'Transpose', 'Unit', - $ LASTC, K, ONE, V, LDV, WORK, LDWORK ) -* -* C1 := C1 - W**T -* - DO 30 J = 1, K - DO 20 I = 1, LASTC - C( J, I ) = C( J, I ) - WORK( I, J ) - 20 CONTINUE - 30 CONTINUE -* - ELSE IF( LSAME( SIDE, 'R' ) ) THEN -* -* Form C * H or C * H**T where C = ( C1 C2 ) -* - LASTV = MAX( K, ILASLR( N, K, V, LDV ) ) - LASTC = ILASLR( M, LASTV, C, LDC ) -* -* W := C * V = (C1*V1 + C2*V2) (stored in WORK) -* -* W := C1 -* - DO 40 J = 1, K - CALL SCOPY( LASTC, C( 1, J ), 1, WORK( 1, J ), 1 ) - 40 CONTINUE -* -* W := W * V1 -* - CALL STRMM( 'Right', 'Lower', 'No transpose', 'Unit', - $ LASTC, K, ONE, V, LDV, WORK, LDWORK ) - IF( LASTV.GT.K ) THEN -* -* W := W + C2 * V2 -* - CALL SGEMM( 'No transpose', 'No transpose', - $ LASTC, K, LASTV-K, - $ ONE, C( 1, K+1 ), LDC, V( K+1, 1 ), LDV, - $ ONE, WORK, LDWORK ) - END IF -* -* W := W * T or W * T**T -* - CALL STRMM( 'Right', 'Upper', TRANS, 'Non-unit', - $ LASTC, K, ONE, T, LDT, WORK, LDWORK ) -* -* C := C - W * V**T -* - IF( LASTV.GT.K ) THEN -* -* C2 := C2 - W * V2**T -* - CALL SGEMM( 'No transpose', 'Transpose', - $ LASTC, LASTV-K, K, - $ -ONE, WORK, LDWORK, V( K+1, 1 ), LDV, ONE, - $ C( 1, K+1 ), LDC ) - END IF -* -* W := W * V1**T -* - CALL STRMM( 'Right', 'Lower', 'Transpose', 'Unit', - $ LASTC, K, ONE, V, LDV, WORK, LDWORK ) -* -* C1 := C1 - W -* - DO 60 J = 1, K - DO 50 I = 1, LASTC - C( I, J ) = C( I, J ) - WORK( I, J ) - 50 CONTINUE - 60 CONTINUE - END IF -* - ELSE -* -* Let V = ( V1 ) -* ( V2 ) (last K rows) -* where V2 is unit upper triangular. -* - IF( LSAME( SIDE, 'L' ) ) THEN -* -* Form H * C or H**T * C where C = ( C1 ) -* ( C2 ) -* - LASTV = MAX( K, ILASLR( M, K, V, LDV ) ) - LASTC = ILASLC( LASTV, N, C, LDC ) -* -* W := C**T * V = (C1**T * V1 + C2**T * V2) (stored in WORK) -* -* W := C2**T -* - DO 70 J = 1, K - CALL SCOPY( LASTC, C( LASTV-K+J, 1 ), LDC, - $ WORK( 1, J ), 1 ) - 70 CONTINUE -* -* W := W * V2 -* - CALL STRMM( 'Right', 'Upper', 'No transpose', 'Unit', - $ LASTC, K, ONE, V( LASTV-K+1, 1 ), LDV, - $ WORK, LDWORK ) - IF( LASTV.GT.K ) THEN -* -* W := W + C1**T*V1 -* - CALL SGEMM( 'Transpose', 'No transpose', - $ LASTC, K, LASTV-K, ONE, C, LDC, V, LDV, - $ ONE, WORK, LDWORK ) - END IF -* -* W := W * T**T or W * T -* - CALL STRMM( 'Right', 'Lower', TRANST, 'Non-unit', - $ LASTC, K, ONE, T, LDT, WORK, LDWORK ) -* -* C := C - V * W**T -* - IF( LASTV.GT.K ) THEN -* -* C1 := C1 - V1 * W**T -* - CALL SGEMM( 'No transpose', 'Transpose', - $ LASTV-K, LASTC, K, -ONE, V, LDV, WORK, LDWORK, - $ ONE, C, LDC ) - END IF -* -* W := W * V2**T -* - CALL STRMM( 'Right', 'Upper', 'Transpose', 'Unit', - $ LASTC, K, ONE, V( LASTV-K+1, 1 ), LDV, - $ WORK, LDWORK ) -* -* C2 := C2 - W**T -* - DO 90 J = 1, K - DO 80 I = 1, LASTC - C( LASTV-K+J, I ) = C( LASTV-K+J, I ) - WORK(I, J) - 80 CONTINUE - 90 CONTINUE -* - ELSE IF( LSAME( SIDE, 'R' ) ) THEN -* -* Form C * H or C * H**T where C = ( C1 C2 ) -* - LASTV = MAX( K, ILASLR( N, K, V, LDV ) ) - LASTC = ILASLR( M, LASTV, C, LDC ) -* -* W := C * V = (C1*V1 + C2*V2) (stored in WORK) -* -* W := C2 -* - DO 100 J = 1, K - CALL SCOPY( LASTC, C( 1, N-K+J ), 1, WORK( 1, J ), 1 ) - 100 CONTINUE -* -* W := W * V2 -* - CALL STRMM( 'Right', 'Upper', 'No transpose', 'Unit', - $ LASTC, K, ONE, V( LASTV-K+1, 1 ), LDV, - $ WORK, LDWORK ) - IF( LASTV.GT.K ) THEN -* -* W := W + C1 * V1 -* - CALL SGEMM( 'No transpose', 'No transpose', - $ LASTC, K, LASTV-K, ONE, C, LDC, V, LDV, - $ ONE, WORK, LDWORK ) - END IF -* -* W := W * T or W * T**T -* - CALL STRMM( 'Right', 'Lower', TRANS, 'Non-unit', - $ LASTC, K, ONE, T, LDT, WORK, LDWORK ) -* -* C := C - W * V**T -* - IF( LASTV.GT.K ) THEN -* -* C1 := C1 - W * V1**T -* - CALL SGEMM( 'No transpose', 'Transpose', - $ LASTC, LASTV-K, K, -ONE, WORK, LDWORK, V, LDV, - $ ONE, C, LDC ) - END IF -* -* W := W * V2**T -* - CALL STRMM( 'Right', 'Upper', 'Transpose', 'Unit', - $ LASTC, K, ONE, V( LASTV-K+1, 1 ), LDV, - $ WORK, LDWORK ) -* -* C2 := C2 - W -* - DO 120 J = 1, K - DO 110 I = 1, LASTC - C( I, LASTV-K+J ) = C( I, LASTV-K+J ) - WORK(I, J) - 110 CONTINUE - 120 CONTINUE - END IF - END IF -* - ELSE IF( LSAME( STOREV, 'R' ) ) THEN -* - IF( LSAME( DIRECT, 'F' ) ) THEN -* -* Let V = ( V1 V2 ) (V1: first K columns) -* where V1 is unit upper triangular. -* - IF( LSAME( SIDE, 'L' ) ) THEN -* -* Form H * C or H**T * C where C = ( C1 ) -* ( C2 ) -* - LASTV = MAX( K, ILASLC( K, M, V, LDV ) ) - LASTC = ILASLC( LASTV, N, C, LDC ) -* -* W := C**T * V**T = (C1**T * V1**T + C2**T * V2**T) (stored in WORK) -* -* W := C1**T -* - DO 130 J = 1, K - CALL SCOPY( LASTC, C( J, 1 ), LDC, WORK( 1, J ), 1 ) - 130 CONTINUE -* -* W := W * V1**T -* - CALL STRMM( 'Right', 'Upper', 'Transpose', 'Unit', - $ LASTC, K, ONE, V, LDV, WORK, LDWORK ) - IF( LASTV.GT.K ) THEN -* -* W := W + C2**T*V2**T -* - CALL SGEMM( 'Transpose', 'Transpose', - $ LASTC, K, LASTV-K, - $ ONE, C( K+1, 1 ), LDC, V( 1, K+1 ), LDV, - $ ONE, WORK, LDWORK ) - END IF -* -* W := W * T**T or W * T -* - CALL STRMM( 'Right', 'Upper', TRANST, 'Non-unit', - $ LASTC, K, ONE, T, LDT, WORK, LDWORK ) -* -* C := C - V**T * W**T -* - IF( LASTV.GT.K ) THEN -* -* C2 := C2 - V2**T * W**T -* - CALL SGEMM( 'Transpose', 'Transpose', - $ LASTV-K, LASTC, K, - $ -ONE, V( 1, K+1 ), LDV, WORK, LDWORK, - $ ONE, C( K+1, 1 ), LDC ) - END IF -* -* W := W * V1 -* - CALL STRMM( 'Right', 'Upper', 'No transpose', 'Unit', - $ LASTC, K, ONE, V, LDV, WORK, LDWORK ) -* -* C1 := C1 - W**T -* - DO 150 J = 1, K - DO 140 I = 1, LASTC - C( J, I ) = C( J, I ) - WORK( I, J ) - 140 CONTINUE - 150 CONTINUE -* - ELSE IF( LSAME( SIDE, 'R' ) ) THEN -* -* Form C * H or C * H**T where C = ( C1 C2 ) -* - LASTV = MAX( K, ILASLC( K, N, V, LDV ) ) - LASTC = ILASLR( M, LASTV, C, LDC ) -* -* W := C * V**T = (C1*V1**T + C2*V2**T) (stored in WORK) -* -* W := C1 -* - DO 160 J = 1, K - CALL SCOPY( LASTC, C( 1, J ), 1, WORK( 1, J ), 1 ) - 160 CONTINUE -* -* W := W * V1**T -* - CALL STRMM( 'Right', 'Upper', 'Transpose', 'Unit', - $ LASTC, K, ONE, V, LDV, WORK, LDWORK ) - IF( LASTV.GT.K ) THEN -* -* W := W + C2 * V2**T -* - CALL SGEMM( 'No transpose', 'Transpose', - $ LASTC, K, LASTV-K, - $ ONE, C( 1, K+1 ), LDC, V( 1, K+1 ), LDV, - $ ONE, WORK, LDWORK ) - END IF -* -* W := W * T or W * T**T -* - CALL STRMM( 'Right', 'Upper', TRANS, 'Non-unit', - $ LASTC, K, ONE, T, LDT, WORK, LDWORK ) -* -* C := C - W * V -* - IF( LASTV.GT.K ) THEN -* -* C2 := C2 - W * V2 -* - CALL SGEMM( 'No transpose', 'No transpose', - $ LASTC, LASTV-K, K, - $ -ONE, WORK, LDWORK, V( 1, K+1 ), LDV, - $ ONE, C( 1, K+1 ), LDC ) - END IF -* -* W := W * V1 -* - CALL STRMM( 'Right', 'Upper', 'No transpose', 'Unit', - $ LASTC, K, ONE, V, LDV, WORK, LDWORK ) -* -* C1 := C1 - W -* - DO 180 J = 1, K - DO 170 I = 1, LASTC - C( I, J ) = C( I, J ) - WORK( I, J ) - 170 CONTINUE - 180 CONTINUE -* - END IF -* - ELSE -* -* Let V = ( V1 V2 ) (V2: last K columns) -* where V2 is unit lower triangular. -* - IF( LSAME( SIDE, 'L' ) ) THEN -* -* Form H * C or H**T * C where C = ( C1 ) -* ( C2 ) -* - LASTV = MAX( K, ILASLC( K, M, V, LDV ) ) - LASTC = ILASLC( LASTV, N, C, LDC ) -* -* W := C**T * V**T = (C1**T * V1**T + C2**T * V2**T) (stored in WORK) -* -* W := C2**T -* - DO 190 J = 1, K - CALL SCOPY( LASTC, C( LASTV-K+J, 1 ), LDC, - $ WORK( 1, J ), 1 ) - 190 CONTINUE -* -* W := W * V2**T -* - CALL STRMM( 'Right', 'Lower', 'Transpose', 'Unit', - $ LASTC, K, ONE, V( 1, LASTV-K+1 ), LDV, - $ WORK, LDWORK ) - IF( LASTV.GT.K ) THEN -* -* W := W + C1**T * V1**T -* - CALL SGEMM( 'Transpose', 'Transpose', - $ LASTC, K, LASTV-K, ONE, C, LDC, V, LDV, - $ ONE, WORK, LDWORK ) - END IF -* -* W := W * T**T or W * T -* - CALL STRMM( 'Right', 'Lower', TRANST, 'Non-unit', - $ LASTC, K, ONE, T, LDT, WORK, LDWORK ) -* -* C := C - V**T * W**T -* - IF( LASTV.GT.K ) THEN -* -* C1 := C1 - V1**T * W**T -* - CALL SGEMM( 'Transpose', 'Transpose', - $ LASTV-K, LASTC, K, -ONE, V, LDV, WORK, LDWORK, - $ ONE, C, LDC ) - END IF -* -* W := W * V2 -* - CALL STRMM( 'Right', 'Lower', 'No transpose', 'Unit', - $ LASTC, K, ONE, V( 1, LASTV-K+1 ), LDV, - $ WORK, LDWORK ) -* -* C2 := C2 - W**T -* - DO 210 J = 1, K - DO 200 I = 1, LASTC - C( LASTV-K+J, I ) = C( LASTV-K+J, I ) - WORK(I, J) - 200 CONTINUE - 210 CONTINUE -* - ELSE IF( LSAME( SIDE, 'R' ) ) THEN -* -* Form C * H or C * H**T where C = ( C1 C2 ) -* - LASTV = MAX( K, ILASLC( K, N, V, LDV ) ) - LASTC = ILASLR( M, LASTV, C, LDC ) -* -* W := C * V**T = (C1*V1**T + C2*V2**T) (stored in WORK) -* -* W := C2 -* - DO 220 J = 1, K - CALL SCOPY( LASTC, C( 1, LASTV-K+J ), 1, - $ WORK( 1, J ), 1 ) - 220 CONTINUE -* -* W := W * V2**T -* - CALL STRMM( 'Right', 'Lower', 'Transpose', 'Unit', - $ LASTC, K, ONE, V( 1, LASTV-K+1 ), LDV, - $ WORK, LDWORK ) - IF( LASTV.GT.K ) THEN -* -* W := W + C1 * V1**T -* - CALL SGEMM( 'No transpose', 'Transpose', - $ LASTC, K, LASTV-K, ONE, C, LDC, V, LDV, - $ ONE, WORK, LDWORK ) - END IF -* -* W := W * T or W * T**T -* - CALL STRMM( 'Right', 'Lower', TRANS, 'Non-unit', - $ LASTC, K, ONE, T, LDT, WORK, LDWORK ) -* -* C := C - W * V -* - IF( LASTV.GT.K ) THEN -* -* C1 := C1 - W * V1 -* - CALL SGEMM( 'No transpose', 'No transpose', - $ LASTC, LASTV-K, K, -ONE, WORK, LDWORK, V, LDV, - $ ONE, C, LDC ) - END IF -* -* W := W * V2 -* - CALL STRMM( 'Right', 'Lower', 'No transpose', 'Unit', - $ LASTC, K, ONE, V( 1, LASTV-K+1 ), LDV, - $ WORK, LDWORK ) -* -* C1 := C1 - W -* - DO 240 J = 1, K - DO 230 I = 1, LASTC - C( I, LASTV-K+J ) = C( I, LASTV-K+J ) - $ - WORK( I, J ) - 230 CONTINUE - 240 CONTINUE -* - END IF -* - END IF - END IF -* - RETURN -* -* End of SLARFB -* - END diff --git a/eigen/lapack/slarfg.f b/eigen/lapack/slarfg.f deleted file mode 100644 index 4f10ffc..0000000 --- a/eigen/lapack/slarfg.f +++ /dev/null @@ -1,196 +0,0 @@ -*> \brief \b SLARFG -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download SLARFG + dependencies -*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/slarfg.f"> -*> [TGZ]</a> -*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/slarfg.f"> -*> [ZIP]</a> -*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/slarfg.f"> -*> [TXT]</a> -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE SLARFG( N, ALPHA, X, INCX, TAU ) -* -* .. Scalar Arguments .. -* INTEGER INCX, N -* REAL ALPHA, TAU -* .. -* .. Array Arguments .. -* REAL X( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> SLARFG generates a real elementary reflector H of order n, such -*> that -*> -*> H * ( alpha ) = ( beta ), H**T * H = I. -*> ( x ) ( 0 ) -*> -*> where alpha and beta are scalars, and x is an (n-1)-element real -*> vector. H is represented in the form -*> -*> H = I - tau * ( 1 ) * ( 1 v**T ) , -*> ( v ) -*> -*> where tau is a real scalar and v is a real (n-1)-element -*> vector. -*> -*> If the elements of x are all zero, then tau = 0 and H is taken to be -*> the unit matrix. -*> -*> Otherwise 1 <= tau <= 2. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The order of the elementary reflector. -*> \endverbatim -*> -*> \param[in,out] ALPHA -*> \verbatim -*> ALPHA is REAL -*> On entry, the value alpha. -*> On exit, it is overwritten with the value beta. -*> \endverbatim -*> -*> \param[in,out] X -*> \verbatim -*> X is REAL array, dimension -*> (1+(N-2)*abs(INCX)) -*> On entry, the vector x. -*> On exit, it is overwritten with the vector v. -*> \endverbatim -*> -*> \param[in] INCX -*> \verbatim -*> INCX is INTEGER -*> The increment between elements of X. INCX > 0. -*> \endverbatim -*> -*> \param[out] TAU -*> \verbatim -*> TAU is REAL -*> The value tau. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \date November 2011 -* -*> \ingroup realOTHERauxiliary -* -* ===================================================================== - SUBROUTINE SLARFG( N, ALPHA, X, INCX, TAU ) -* -* -- LAPACK auxiliary routine (version 3.4.0) -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* November 2011 -* -* .. Scalar Arguments .. - INTEGER INCX, N - REAL ALPHA, TAU -* .. -* .. Array Arguments .. - REAL X( * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - REAL ONE, ZERO - PARAMETER ( ONE = 1.0E+0, ZERO = 0.0E+0 ) -* .. -* .. Local Scalars .. - INTEGER J, KNT - REAL BETA, RSAFMN, SAFMIN, XNORM -* .. -* .. External Functions .. - REAL SLAMCH, SLAPY2, SNRM2 - EXTERNAL SLAMCH, SLAPY2, SNRM2 -* .. -* .. Intrinsic Functions .. - INTRINSIC ABS, SIGN -* .. -* .. External Subroutines .. - EXTERNAL SSCAL -* .. -* .. Executable Statements .. -* - IF( N.LE.1 ) THEN - TAU = ZERO - RETURN - END IF -* - XNORM = SNRM2( N-1, X, INCX ) -* - IF( XNORM.EQ.ZERO ) THEN -* -* H = I -* - TAU = ZERO - ELSE -* -* general case -* - BETA = -SIGN( SLAPY2( ALPHA, XNORM ), ALPHA ) - SAFMIN = SLAMCH( 'S' ) / SLAMCH( 'E' ) - KNT = 0 - IF( ABS( BETA ).LT.SAFMIN ) THEN -* -* XNORM, BETA may be inaccurate; scale X and recompute them -* - RSAFMN = ONE / SAFMIN - 10 CONTINUE - KNT = KNT + 1 - CALL SSCAL( N-1, RSAFMN, X, INCX ) - BETA = BETA*RSAFMN - ALPHA = ALPHA*RSAFMN - IF( ABS( BETA ).LT.SAFMIN ) - $ GO TO 10 -* -* New BETA is at most 1, at least SAFMIN -* - XNORM = SNRM2( N-1, X, INCX ) - BETA = -SIGN( SLAPY2( ALPHA, XNORM ), ALPHA ) - END IF - TAU = ( BETA-ALPHA ) / BETA - CALL SSCAL( N-1, ONE / ( ALPHA-BETA ), X, INCX ) -* -* If ALPHA is subnormal, it may lose relative accuracy -* - DO 20 J = 1, KNT - BETA = BETA*SAFMIN - 20 CONTINUE - ALPHA = BETA - END IF -* - RETURN -* -* End of SLARFG -* - END diff --git a/eigen/lapack/slarft.f b/eigen/lapack/slarft.f deleted file mode 100644 index 30b0668..0000000 --- a/eigen/lapack/slarft.f +++ /dev/null @@ -1,326 +0,0 @@ -*> \brief \b SLARFT -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download SLARFT + dependencies -*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/slarft.f"> -*> [TGZ]</a> -*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/slarft.f"> -*> [ZIP]</a> -*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/slarft.f"> -*> [TXT]</a> -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE SLARFT( DIRECT, STOREV, N, K, V, LDV, TAU, T, LDT ) -* -* .. Scalar Arguments .. -* CHARACTER DIRECT, STOREV -* INTEGER K, LDT, LDV, N -* .. -* .. Array Arguments .. -* REAL T( LDT, * ), TAU( * ), V( LDV, * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> SLARFT forms the triangular factor T of a real block reflector H -*> of order n, which is defined as a product of k elementary reflectors. -*> -*> If DIRECT = 'F', H = H(1) H(2) . . . H(k) and T is upper triangular; -*> -*> If DIRECT = 'B', H = H(k) . . . H(2) H(1) and T is lower triangular. -*> -*> If STOREV = 'C', the vector which defines the elementary reflector -*> H(i) is stored in the i-th column of the array V, and -*> -*> H = I - V * T * V**T -*> -*> If STOREV = 'R', the vector which defines the elementary reflector -*> H(i) is stored in the i-th row of the array V, and -*> -*> H = I - V**T * T * V -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] DIRECT -*> \verbatim -*> DIRECT is CHARACTER*1 -*> Specifies the order in which the elementary reflectors are -*> multiplied to form the block reflector: -*> = 'F': H = H(1) H(2) . . . H(k) (Forward) -*> = 'B': H = H(k) . . . H(2) H(1) (Backward) -*> \endverbatim -*> -*> \param[in] STOREV -*> \verbatim -*> STOREV is CHARACTER*1 -*> Specifies how the vectors which define the elementary -*> reflectors are stored (see also Further Details): -*> = 'C': columnwise -*> = 'R': rowwise -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The order of the block reflector H. N >= 0. -*> \endverbatim -*> -*> \param[in] K -*> \verbatim -*> K is INTEGER -*> The order of the triangular factor T (= the number of -*> elementary reflectors). K >= 1. -*> \endverbatim -*> -*> \param[in] V -*> \verbatim -*> V is REAL array, dimension -*> (LDV,K) if STOREV = 'C' -*> (LDV,N) if STOREV = 'R' -*> The matrix V. See further details. -*> \endverbatim -*> -*> \param[in] LDV -*> \verbatim -*> LDV is INTEGER -*> The leading dimension of the array V. -*> If STOREV = 'C', LDV >= max(1,N); if STOREV = 'R', LDV >= K. -*> \endverbatim -*> -*> \param[in] TAU -*> \verbatim -*> TAU is REAL array, dimension (K) -*> TAU(i) must contain the scalar factor of the elementary -*> reflector H(i). -*> \endverbatim -*> -*> \param[out] T -*> \verbatim -*> T is REAL array, dimension (LDT,K) -*> The k by k triangular factor T of the block reflector. -*> If DIRECT = 'F', T is upper triangular; if DIRECT = 'B', T is -*> lower triangular. The rest of the array is not used. -*> \endverbatim -*> -*> \param[in] LDT -*> \verbatim -*> LDT is INTEGER -*> The leading dimension of the array T. LDT >= K. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \date April 2012 -* -*> \ingroup realOTHERauxiliary -* -*> \par Further Details: -* ===================== -*> -*> \verbatim -*> -*> The shape of the matrix V and the storage of the vectors which define -*> the H(i) is best illustrated by the following example with n = 5 and -*> k = 3. The elements equal to 1 are not stored. -*> -*> DIRECT = 'F' and STOREV = 'C': DIRECT = 'F' and STOREV = 'R': -*> -*> V = ( 1 ) V = ( 1 v1 v1 v1 v1 ) -*> ( v1 1 ) ( 1 v2 v2 v2 ) -*> ( v1 v2 1 ) ( 1 v3 v3 ) -*> ( v1 v2 v3 ) -*> ( v1 v2 v3 ) -*> -*> DIRECT = 'B' and STOREV = 'C': DIRECT = 'B' and STOREV = 'R': -*> -*> V = ( v1 v2 v3 ) V = ( v1 v1 1 ) -*> ( v1 v2 v3 ) ( v2 v2 v2 1 ) -*> ( 1 v2 v3 ) ( v3 v3 v3 v3 1 ) -*> ( 1 v3 ) -*> ( 1 ) -*> \endverbatim -*> -* ===================================================================== - SUBROUTINE SLARFT( DIRECT, STOREV, N, K, V, LDV, TAU, T, LDT ) -* -* -- LAPACK auxiliary routine (version 3.4.1) -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* April 2012 -* -* .. Scalar Arguments .. - CHARACTER DIRECT, STOREV - INTEGER K, LDT, LDV, N -* .. -* .. Array Arguments .. - REAL T( LDT, * ), TAU( * ), V( LDV, * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - REAL ONE, ZERO - PARAMETER ( ONE = 1.0E+0, ZERO = 0.0E+0 ) -* .. -* .. Local Scalars .. - INTEGER I, J, PREVLASTV, LASTV -* .. -* .. External Subroutines .. - EXTERNAL SGEMV, STRMV -* .. -* .. External Functions .. - LOGICAL LSAME - EXTERNAL LSAME -* .. -* .. Executable Statements .. -* -* Quick return if possible -* - IF( N.EQ.0 ) - $ RETURN -* - IF( LSAME( DIRECT, 'F' ) ) THEN - PREVLASTV = N - DO I = 1, K - PREVLASTV = MAX( I, PREVLASTV ) - IF( TAU( I ).EQ.ZERO ) THEN -* -* H(i) = I -* - DO J = 1, I - T( J, I ) = ZERO - END DO - ELSE -* -* general case -* - IF( LSAME( STOREV, 'C' ) ) THEN -* Skip any trailing zeros. - DO LASTV = N, I+1, -1 - IF( V( LASTV, I ).NE.ZERO ) EXIT - END DO - DO J = 1, I-1 - T( J, I ) = -TAU( I ) * V( I , J ) - END DO - J = MIN( LASTV, PREVLASTV ) -* -* T(1:i-1,i) := - tau(i) * V(i:j,1:i-1)**T * V(i:j,i) -* - CALL SGEMV( 'Transpose', J-I, I-1, -TAU( I ), - $ V( I+1, 1 ), LDV, V( I+1, I ), 1, ONE, - $ T( 1, I ), 1 ) - ELSE -* Skip any trailing zeros. - DO LASTV = N, I+1, -1 - IF( V( I, LASTV ).NE.ZERO ) EXIT - END DO - DO J = 1, I-1 - T( J, I ) = -TAU( I ) * V( J , I ) - END DO - J = MIN( LASTV, PREVLASTV ) -* -* T(1:i-1,i) := - tau(i) * V(1:i-1,i:j) * V(i,i:j)**T -* - 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 ) - END IF -* -* T(1:i-1,i) := T(1:i-1,1:i-1) * T(1:i-1,i) -* - CALL STRMV( 'Upper', 'No transpose', 'Non-unit', I-1, T, - $ LDT, T( 1, I ), 1 ) - T( I, I ) = TAU( I ) - IF( I.GT.1 ) THEN - PREVLASTV = MAX( PREVLASTV, LASTV ) - ELSE - PREVLASTV = LASTV - END IF - END IF - END DO - ELSE - PREVLASTV = 1 - DO I = K, 1, -1 - IF( TAU( I ).EQ.ZERO ) THEN -* -* H(i) = I -* - DO J = I, K - T( J, I ) = ZERO - END DO - ELSE -* -* general case -* - IF( I.LT.K ) THEN - IF( LSAME( STOREV, 'C' ) ) THEN -* Skip any leading zeros. - DO LASTV = 1, I-1 - IF( V( LASTV, I ).NE.ZERO ) EXIT - END DO - DO J = I+1, K - T( J, I ) = -TAU( I ) * V( N-K+I , J ) - END DO - J = MAX( LASTV, PREVLASTV ) -* -* T(i+1:k,i) = -tau(i) * V(j:n-k+i,i+1:k)**T * V(j:n-k+i,i) -* - CALL SGEMV( 'Transpose', N-K+I-J, K-I, -TAU( I ), - $ V( J, I+1 ), LDV, V( J, I ), 1, ONE, - $ T( I+1, I ), 1 ) - ELSE -* Skip any leading zeros. - DO LASTV = 1, I-1 - IF( V( I, LASTV ).NE.ZERO ) EXIT - END DO - DO J = I+1, K - T( J, I ) = -TAU( I ) * V( J, N-K+I ) - END DO - J = MAX( LASTV, PREVLASTV ) -* -* T(i+1:k,i) = -tau(i) * V(i+1:k,j:n-k+i) * V(i,j:n-k+i)**T -* - 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 ) - END IF -* -* T(i+1:k,i) := T(i+1:k,i+1:k) * T(i+1:k,i) -* - CALL STRMV( 'Lower', 'No transpose', 'Non-unit', K-I, - $ T( I+1, I+1 ), LDT, T( I+1, I ), 1 ) - IF( I.GT.1 ) THEN - PREVLASTV = MIN( PREVLASTV, LASTV ) - ELSE - PREVLASTV = LASTV - END IF - END IF - T( I, I ) = TAU( I ) - END IF - END DO - END IF - RETURN -* -* End of SLARFT -* - END diff --git a/eigen/lapack/svd.cpp b/eigen/lapack/svd.cpp deleted file mode 100644 index 77b302b..0000000 --- a/eigen/lapack/svd.cpp +++ /dev/null @@ -1,138 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2014 Gael Guennebaud <gael.guennebaud@inria.fr> -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#include "lapack_common.h" -#include <Eigen/SVD> - -// computes the singular values/vectors a general M-by-N matrix A using divide-and-conquer -EIGEN_LAPACK_FUNC(gesdd,(char *jobz, int *m, int* n, Scalar* a, int *lda, RealScalar *s, Scalar *u, int *ldu, Scalar *vt, int *ldvt, Scalar* /*work*/, int* lwork, - EIGEN_LAPACK_ARG_IF_COMPLEX(RealScalar */*rwork*/) int * /*iwork*/, int *info)) -{ - // TODO exploit the work buffer - bool query_size = *lwork==-1; - int diag_size = (std::min)(*m,*n); - - *info = 0; - if(*jobz!='A' && *jobz!='S' && *jobz!='O' && *jobz!='N') *info = -1; - else if(*m<0) *info = -2; - else if(*n<0) *info = -3; - else if(*lda<std::max(1,*m)) *info = -5; - else if(*lda<std::max(1,*m)) *info = -8; - else if(*ldu <1 || (*jobz=='A' && *ldu <*m) - || (*jobz=='O' && *m<*n && *ldu<*m)) *info = -8; - else if(*ldvt<1 || (*jobz=='A' && *ldvt<*n) - || (*jobz=='S' && *ldvt<diag_size) - || (*jobz=='O' && *m>=*n && *ldvt<*n)) *info = -10; - - if(*info!=0) - { - int e = -*info; - return xerbla_(SCALAR_SUFFIX_UP"GESDD ", &e, 6); - } - - if(query_size) - { - *lwork = 0; - return 0; - } - - if(*n==0 || *m==0) - return 0; - - PlainMatrixType mat(*m,*n); - mat = matrix(a,*m,*n,*lda); - - int option = *jobz=='A' ? ComputeFullU|ComputeFullV - : *jobz=='S' ? ComputeThinU|ComputeThinV - : *jobz=='O' ? ComputeThinU|ComputeThinV - : 0; - - BDCSVD<PlainMatrixType> svd(mat,option); - - make_vector(s,diag_size) = svd.singularValues().head(diag_size); - - if(*jobz=='A') - { - matrix(u,*m,*m,*ldu) = svd.matrixU(); - matrix(vt,*n,*n,*ldvt) = svd.matrixV().adjoint(); - } - else if(*jobz=='S') - { - matrix(u,*m,diag_size,*ldu) = svd.matrixU(); - matrix(vt,diag_size,*n,*ldvt) = svd.matrixV().adjoint(); - } - else if(*jobz=='O' && *m>=*n) - { - matrix(a,*m,*n,*lda) = svd.matrixU(); - matrix(vt,*n,*n,*ldvt) = svd.matrixV().adjoint(); - } - else if(*jobz=='O') - { - matrix(u,*m,*m,*ldu) = svd.matrixU(); - matrix(a,diag_size,*n,*lda) = svd.matrixV().adjoint(); - } - - return 0; -} - -// computes the singular values/vectors a general M-by-N matrix A using two sided jacobi algorithm -EIGEN_LAPACK_FUNC(gesvd,(char *jobu, char *jobv, int *m, int* n, Scalar* a, int *lda, RealScalar *s, Scalar *u, int *ldu, Scalar *vt, int *ldvt, Scalar* /*work*/, int* lwork, - EIGEN_LAPACK_ARG_IF_COMPLEX(RealScalar */*rwork*/) int *info)) -{ - // TODO exploit the work buffer - bool query_size = *lwork==-1; - int diag_size = (std::min)(*m,*n); - - *info = 0; - if( *jobu!='A' && *jobu!='S' && *jobu!='O' && *jobu!='N') *info = -1; - else if((*jobv!='A' && *jobv!='S' && *jobv!='O' && *jobv!='N') - || (*jobu=='O' && *jobv=='O')) *info = -2; - else if(*m<0) *info = -3; - else if(*n<0) *info = -4; - else if(*lda<std::max(1,*m)) *info = -6; - else if(*ldu <1 || ((*jobu=='A' || *jobu=='S') && *ldu<*m)) *info = -9; - else if(*ldvt<1 || (*jobv=='A' && *ldvt<*n) - || (*jobv=='S' && *ldvt<diag_size)) *info = -11; - - if(*info!=0) - { - int e = -*info; - return xerbla_(SCALAR_SUFFIX_UP"GESVD ", &e, 6); - } - - if(query_size) - { - *lwork = 0; - return 0; - } - - if(*n==0 || *m==0) - return 0; - - PlainMatrixType mat(*m,*n); - mat = matrix(a,*m,*n,*lda); - - int option = (*jobu=='A' ? ComputeFullU : *jobu=='S' || *jobu=='O' ? ComputeThinU : 0) - | (*jobv=='A' ? ComputeFullV : *jobv=='S' || *jobv=='O' ? ComputeThinV : 0); - - JacobiSVD<PlainMatrixType> svd(mat,option); - - make_vector(s,diag_size) = svd.singularValues().head(diag_size); - { - if(*jobu=='A') matrix(u,*m,*m,*ldu) = svd.matrixU(); - else if(*jobu=='S') matrix(u,*m,diag_size,*ldu) = svd.matrixU(); - else if(*jobu=='O') matrix(a,*m,diag_size,*lda) = svd.matrixU(); - } - { - if(*jobv=='A') matrix(vt,*n,*n,*ldvt) = svd.matrixV().adjoint(); - else if(*jobv=='S') matrix(vt,diag_size,*n,*ldvt) = svd.matrixV().adjoint(); - else if(*jobv=='O') matrix(a,diag_size,*n,*lda) = svd.matrixV().adjoint(); - } - return 0; -} diff --git a/eigen/lapack/zlacgv.f b/eigen/lapack/zlacgv.f deleted file mode 100644 index 16c2e2e..0000000 --- a/eigen/lapack/zlacgv.f +++ /dev/null @@ -1,116 +0,0 @@ -*> \brief \b ZLACGV -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download ZLACGV + dependencies -*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/zlacgv.f"> -*> [TGZ]</a> -*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/zlacgv.f"> -*> [ZIP]</a> -*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/zlacgv.f"> -*> [TXT]</a> -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE ZLACGV( N, X, INCX ) -* -* .. Scalar Arguments .. -* INTEGER INCX, N -* .. -* .. Array Arguments .. -* COMPLEX*16 X( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> ZLACGV conjugates a complex vector of length N. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The length of the vector X. N >= 0. -*> \endverbatim -*> -*> \param[in,out] X -*> \verbatim -*> X is COMPLEX*16 array, dimension -*> (1+(N-1)*abs(INCX)) -*> On entry, the vector of length N to be conjugated. -*> On exit, X is overwritten with conjg(X). -*> \endverbatim -*> -*> \param[in] INCX -*> \verbatim -*> INCX is INTEGER -*> The spacing between successive elements of X. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \date November 2011 -* -*> \ingroup complex16OTHERauxiliary -* -* ===================================================================== - SUBROUTINE ZLACGV( N, X, INCX ) -* -* -- LAPACK auxiliary routine (version 3.4.0) -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* November 2011 -* -* .. Scalar Arguments .. - INTEGER INCX, N -* .. -* .. Array Arguments .. - COMPLEX*16 X( * ) -* .. -* -* ===================================================================== -* -* .. Local Scalars .. - INTEGER I, IOFF -* .. -* .. Intrinsic Functions .. - INTRINSIC DCONJG -* .. -* .. Executable Statements .. -* - IF( INCX.EQ.1 ) THEN - DO 10 I = 1, N - X( I ) = DCONJG( X( I ) ) - 10 CONTINUE - ELSE - IOFF = 1 - IF( INCX.LT.0 ) - $ IOFF = 1 - ( N-1 )*INCX - DO 20 I = 1, N - X( IOFF ) = DCONJG( X( IOFF ) ) - IOFF = IOFF + INCX - 20 CONTINUE - END IF - RETURN -* -* End of ZLACGV -* - END diff --git a/eigen/lapack/zladiv.f b/eigen/lapack/zladiv.f deleted file mode 100644 index aa71db1..0000000 --- a/eigen/lapack/zladiv.f +++ /dev/null @@ -1,97 +0,0 @@ -*> \brief \b ZLADIV -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download ZLADIV + dependencies -*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/zladiv.f"> -*> [TGZ]</a> -*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/zladiv.f"> -*> [ZIP]</a> -*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/zladiv.f"> -*> [TXT]</a> -*> \endhtmlonly -* -* Definition: -* =========== -* -* COMPLEX*16 FUNCTION ZLADIV( X, Y ) -* -* .. Scalar Arguments .. -* COMPLEX*16 X, Y -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> ZLADIV := X / Y, where X and Y are complex. The computation of X / Y -*> will not overflow on an intermediary step unless the results -*> overflows. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] X -*> \verbatim -*> X is COMPLEX*16 -*> \endverbatim -*> -*> \param[in] Y -*> \verbatim -*> Y is COMPLEX*16 -*> The complex scalars X and Y. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \date November 2011 -* -*> \ingroup complex16OTHERauxiliary -* -* ===================================================================== - COMPLEX*16 FUNCTION ZLADIV( X, Y ) -* -* -- LAPACK auxiliary routine (version 3.4.0) -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* November 2011 -* -* .. Scalar Arguments .. - COMPLEX*16 X, Y -* .. -* -* ===================================================================== -* -* .. Local Scalars .. - DOUBLE PRECISION ZI, ZR -* .. -* .. External Subroutines .. - EXTERNAL DLADIV -* .. -* .. Intrinsic Functions .. - INTRINSIC DBLE, DCMPLX, DIMAG -* .. -* .. Executable Statements .. -* - CALL DLADIV( DBLE( X ), DIMAG( X ), DBLE( Y ), DIMAG( Y ), ZR, - $ ZI ) - ZLADIV = DCMPLX( ZR, ZI ) -* - RETURN -* -* End of ZLADIV -* - END diff --git a/eigen/lapack/zlarf.f b/eigen/lapack/zlarf.f deleted file mode 100644 index 53f314d..0000000 --- a/eigen/lapack/zlarf.f +++ /dev/null @@ -1,232 +0,0 @@ -*> \brief \b ZLARF -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download ZLARF + dependencies -*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/zlarf.f"> -*> [TGZ]</a> -*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/zlarf.f"> -*> [ZIP]</a> -*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/zlarf.f"> -*> [TXT]</a> -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE ZLARF( SIDE, M, N, V, INCV, TAU, C, LDC, WORK ) -* -* .. Scalar Arguments .. -* CHARACTER SIDE -* INTEGER INCV, LDC, M, N -* COMPLEX*16 TAU -* .. -* .. Array Arguments .. -* COMPLEX*16 C( LDC, * ), V( * ), WORK( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> ZLARF applies a complex elementary reflector H to a complex M-by-N -*> matrix C, from either the left or the right. H is represented in the -*> form -*> -*> H = I - tau * v * v**H -*> -*> where tau is a complex scalar and v is a complex vector. -*> -*> If tau = 0, then H is taken to be the unit matrix. -*> -*> To apply H**H, supply conjg(tau) instead -*> tau. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] SIDE -*> \verbatim -*> SIDE is CHARACTER*1 -*> = 'L': form H * C -*> = 'R': form C * H -*> \endverbatim -*> -*> \param[in] M -*> \verbatim -*> M is INTEGER -*> The number of rows of the matrix C. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The number of columns of the matrix C. -*> \endverbatim -*> -*> \param[in] V -*> \verbatim -*> V is COMPLEX*16 array, dimension -*> (1 + (M-1)*abs(INCV)) if SIDE = 'L' -*> or (1 + (N-1)*abs(INCV)) if SIDE = 'R' -*> The vector v in the representation of H. V is not used if -*> TAU = 0. -*> \endverbatim -*> -*> \param[in] INCV -*> \verbatim -*> INCV is INTEGER -*> The increment between elements of v. INCV <> 0. -*> \endverbatim -*> -*> \param[in] TAU -*> \verbatim -*> TAU is COMPLEX*16 -*> The value tau in the representation of H. -*> \endverbatim -*> -*> \param[in,out] C -*> \verbatim -*> C is COMPLEX*16 array, dimension (LDC,N) -*> On entry, the M-by-N matrix C. -*> On exit, C is overwritten by the matrix H * C if SIDE = 'L', -*> or C * H if SIDE = 'R'. -*> \endverbatim -*> -*> \param[in] LDC -*> \verbatim -*> LDC is INTEGER -*> The leading dimension of the array C. LDC >= max(1,M). -*> \endverbatim -*> -*> \param[out] WORK -*> \verbatim -*> WORK is COMPLEX*16 array, dimension -*> (N) if SIDE = 'L' -*> or (M) if SIDE = 'R' -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \date November 2011 -* -*> \ingroup complex16OTHERauxiliary -* -* ===================================================================== - SUBROUTINE ZLARF( SIDE, M, N, V, INCV, TAU, C, LDC, WORK ) -* -* -- LAPACK auxiliary routine (version 3.4.0) -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* November 2011 -* -* .. Scalar Arguments .. - CHARACTER SIDE - INTEGER INCV, LDC, M, N - COMPLEX*16 TAU -* .. -* .. Array Arguments .. - COMPLEX*16 C( LDC, * ), V( * ), WORK( * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - COMPLEX*16 ONE, ZERO - PARAMETER ( ONE = ( 1.0D+0, 0.0D+0 ), - $ ZERO = ( 0.0D+0, 0.0D+0 ) ) -* .. -* .. Local Scalars .. - LOGICAL APPLYLEFT - INTEGER I, LASTV, LASTC -* .. -* .. External Subroutines .. - EXTERNAL ZGEMV, ZGERC -* .. -* .. External Functions .. - LOGICAL LSAME - INTEGER ILAZLR, ILAZLC - EXTERNAL LSAME, ILAZLR, ILAZLC -* .. -* .. Executable Statements .. -* - APPLYLEFT = LSAME( SIDE, 'L' ) - LASTV = 0 - LASTC = 0 - IF( TAU.NE.ZERO ) THEN -* Set up variables for scanning V. LASTV begins pointing to the end -* of V. - IF( APPLYLEFT ) THEN - LASTV = M - ELSE - LASTV = N - END IF - IF( INCV.GT.0 ) THEN - I = 1 + (LASTV-1) * INCV - ELSE - I = 1 - END IF -* Look for the last non-zero row in V. - DO WHILE( LASTV.GT.0 .AND. V( I ).EQ.ZERO ) - LASTV = LASTV - 1 - I = I - INCV - END DO - IF( APPLYLEFT ) THEN -* Scan for the last non-zero column in C(1:lastv,:). - LASTC = ILAZLC(LASTV, N, C, LDC) - ELSE -* Scan for the last non-zero row in C(:,1:lastv). - LASTC = ILAZLR(M, LASTV, C, LDC) - END IF - END IF -* Note that lastc.eq.0 renders the BLAS operations null; no special -* case is needed at this level. - IF( APPLYLEFT ) THEN -* -* Form H * C -* - IF( LASTV.GT.0 ) THEN -* -* w(1:lastc,1) := C(1:lastv,1:lastc)**H * v(1:lastv,1) -* - CALL ZGEMV( 'Conjugate transpose', LASTV, LASTC, ONE, - $ C, LDC, V, INCV, ZERO, WORK, 1 ) -* -* C(1:lastv,1:lastc) := C(...) - v(1:lastv,1) * w(1:lastc,1)**H -* - CALL ZGERC( LASTV, LASTC, -TAU, V, INCV, WORK, 1, C, LDC ) - END IF - ELSE -* -* Form C * H -* - IF( LASTV.GT.0 ) THEN -* -* w(1:lastc,1) := C(1:lastc,1:lastv) * v(1:lastv,1) -* - CALL ZGEMV( 'No transpose', LASTC, LASTV, ONE, C, LDC, - $ V, INCV, ZERO, WORK, 1 ) -* -* C(1:lastc,1:lastv) := C(...) - w(1:lastc,1) * v(1:lastv,1)**H -* - CALL ZGERC( LASTC, LASTV, -TAU, WORK, 1, V, INCV, C, LDC ) - END IF - END IF - RETURN -* -* End of ZLARF -* - END diff --git a/eigen/lapack/zlarfb.f b/eigen/lapack/zlarfb.f deleted file mode 100644 index 30fc4b9..0000000 --- a/eigen/lapack/zlarfb.f +++ /dev/null @@ -1,774 +0,0 @@ -*> \brief \b ZLARFB -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download ZLARFB + dependencies -*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/zlarfb.f"> -*> [TGZ]</a> -*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/zlarfb.f"> -*> [ZIP]</a> -*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/zlarfb.f"> -*> [TXT]</a> -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE ZLARFB( SIDE, TRANS, DIRECT, STOREV, M, N, K, V, LDV, -* T, LDT, C, LDC, WORK, LDWORK ) -* -* .. Scalar Arguments .. -* CHARACTER DIRECT, SIDE, STOREV, TRANS -* INTEGER K, LDC, LDT, LDV, LDWORK, M, N -* .. -* .. Array Arguments .. -* COMPLEX*16 C( LDC, * ), T( LDT, * ), V( LDV, * ), -* $ WORK( LDWORK, * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> ZLARFB applies a complex block reflector H or its transpose H**H to a -*> complex M-by-N matrix C, from either the left or the right. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] SIDE -*> \verbatim -*> SIDE is CHARACTER*1 -*> = 'L': apply H or H**H from the Left -*> = 'R': apply H or H**H from the Right -*> \endverbatim -*> -*> \param[in] TRANS -*> \verbatim -*> TRANS is CHARACTER*1 -*> = 'N': apply H (No transpose) -*> = 'C': apply H**H (Conjugate transpose) -*> \endverbatim -*> -*> \param[in] DIRECT -*> \verbatim -*> DIRECT is CHARACTER*1 -*> Indicates how H is formed from a product of elementary -*> reflectors -*> = 'F': H = H(1) H(2) . . . H(k) (Forward) -*> = 'B': H = H(k) . . . H(2) H(1) (Backward) -*> \endverbatim -*> -*> \param[in] STOREV -*> \verbatim -*> STOREV is CHARACTER*1 -*> Indicates how the vectors which define the elementary -*> reflectors are stored: -*> = 'C': Columnwise -*> = 'R': Rowwise -*> \endverbatim -*> -*> \param[in] M -*> \verbatim -*> M is INTEGER -*> The number of rows of the matrix C. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The number of columns of the matrix C. -*> \endverbatim -*> -*> \param[in] K -*> \verbatim -*> K is INTEGER -*> The order of the matrix T (= the number of elementary -*> reflectors whose product defines the block reflector). -*> \endverbatim -*> -*> \param[in] V -*> \verbatim -*> V is COMPLEX*16 array, dimension -*> (LDV,K) if STOREV = 'C' -*> (LDV,M) if STOREV = 'R' and SIDE = 'L' -*> (LDV,N) if STOREV = 'R' and SIDE = 'R' -*> See Further Details. -*> \endverbatim -*> -*> \param[in] LDV -*> \verbatim -*> LDV is INTEGER -*> The leading dimension of the array V. -*> If STOREV = 'C' and SIDE = 'L', LDV >= max(1,M); -*> if STOREV = 'C' and SIDE = 'R', LDV >= max(1,N); -*> if STOREV = 'R', LDV >= K. -*> \endverbatim -*> -*> \param[in] T -*> \verbatim -*> T is COMPLEX*16 array, dimension (LDT,K) -*> The triangular K-by-K matrix T in the representation of the -*> block reflector. -*> \endverbatim -*> -*> \param[in] LDT -*> \verbatim -*> LDT is INTEGER -*> The leading dimension of the array T. LDT >= K. -*> \endverbatim -*> -*> \param[in,out] C -*> \verbatim -*> C is COMPLEX*16 array, dimension (LDC,N) -*> On entry, the M-by-N matrix C. -*> On exit, C is overwritten by H*C or H**H*C or C*H or C*H**H. -*> \endverbatim -*> -*> \param[in] LDC -*> \verbatim -*> LDC is INTEGER -*> The leading dimension of the array C. LDC >= max(1,M). -*> \endverbatim -*> -*> \param[out] WORK -*> \verbatim -*> WORK is COMPLEX*16 array, dimension (LDWORK,K) -*> \endverbatim -*> -*> \param[in] LDWORK -*> \verbatim -*> LDWORK is INTEGER -*> The leading dimension of the array WORK. -*> If SIDE = 'L', LDWORK >= max(1,N); -*> if SIDE = 'R', LDWORK >= max(1,M). -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \date November 2011 -* -*> \ingroup complex16OTHERauxiliary -* -*> \par Further Details: -* ===================== -*> -*> \verbatim -*> -*> The shape of the matrix V and the storage of the vectors which define -*> the H(i) is best illustrated by the following example with n = 5 and -*> k = 3. The elements equal to 1 are not stored; the corresponding -*> array elements are modified but restored on exit. The rest of the -*> array is not used. -*> -*> DIRECT = 'F' and STOREV = 'C': DIRECT = 'F' and STOREV = 'R': -*> -*> V = ( 1 ) V = ( 1 v1 v1 v1 v1 ) -*> ( v1 1 ) ( 1 v2 v2 v2 ) -*> ( v1 v2 1 ) ( 1 v3 v3 ) -*> ( v1 v2 v3 ) -*> ( v1 v2 v3 ) -*> -*> DIRECT = 'B' and STOREV = 'C': DIRECT = 'B' and STOREV = 'R': -*> -*> V = ( v1 v2 v3 ) V = ( v1 v1 1 ) -*> ( v1 v2 v3 ) ( v2 v2 v2 1 ) -*> ( 1 v2 v3 ) ( v3 v3 v3 v3 1 ) -*> ( 1 v3 ) -*> ( 1 ) -*> \endverbatim -*> -* ===================================================================== - SUBROUTINE ZLARFB( SIDE, TRANS, DIRECT, STOREV, M, N, K, V, LDV, - $ T, LDT, C, LDC, WORK, LDWORK ) -* -* -- LAPACK auxiliary routine (version 3.4.0) -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* November 2011 -* -* .. Scalar Arguments .. - CHARACTER DIRECT, SIDE, STOREV, TRANS - INTEGER K, LDC, LDT, LDV, LDWORK, M, N -* .. -* .. Array Arguments .. - COMPLEX*16 C( LDC, * ), T( LDT, * ), V( LDV, * ), - $ WORK( LDWORK, * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - COMPLEX*16 ONE - PARAMETER ( ONE = ( 1.0D+0, 0.0D+0 ) ) -* .. -* .. Local Scalars .. - CHARACTER TRANST - INTEGER I, J, LASTV, LASTC -* .. -* .. External Functions .. - LOGICAL LSAME - INTEGER ILAZLR, ILAZLC - EXTERNAL LSAME, ILAZLR, ILAZLC -* .. -* .. External Subroutines .. - EXTERNAL ZCOPY, ZGEMM, ZLACGV, ZTRMM -* .. -* .. Intrinsic Functions .. - INTRINSIC DCONJG -* .. -* .. Executable Statements .. -* -* Quick return if possible -* - IF( M.LE.0 .OR. N.LE.0 ) - $ RETURN -* - IF( LSAME( TRANS, 'N' ) ) THEN - TRANST = 'C' - ELSE - TRANST = 'N' - END IF -* - IF( LSAME( STOREV, 'C' ) ) THEN -* - IF( LSAME( DIRECT, 'F' ) ) THEN -* -* Let V = ( V1 ) (first K rows) -* ( V2 ) -* where V1 is unit lower triangular. -* - IF( LSAME( SIDE, 'L' ) ) THEN -* -* Form H * C or H**H * C where C = ( C1 ) -* ( C2 ) -* - LASTV = MAX( K, ILAZLR( M, K, V, LDV ) ) - LASTC = ILAZLC( LASTV, N, C, LDC ) -* -* W := C**H * V = (C1**H * V1 + C2**H * V2) (stored in WORK) -* -* W := C1**H -* - DO 10 J = 1, K - CALL ZCOPY( LASTC, C( J, 1 ), LDC, WORK( 1, J ), 1 ) - CALL ZLACGV( LASTC, WORK( 1, J ), 1 ) - 10 CONTINUE -* -* W := W * V1 -* - CALL ZTRMM( 'Right', 'Lower', 'No transpose', 'Unit', - $ LASTC, K, ONE, V, LDV, WORK, LDWORK ) - IF( LASTV.GT.K ) THEN -* -* W := W + C2**H *V2 -* - CALL ZGEMM( 'Conjugate transpose', 'No transpose', - $ LASTC, K, LASTV-K, ONE, C( K+1, 1 ), LDC, - $ V( K+1, 1 ), LDV, ONE, WORK, LDWORK ) - END IF -* -* W := W * T**H or W * T -* - CALL ZTRMM( 'Right', 'Upper', TRANST, 'Non-unit', - $ LASTC, K, ONE, T, LDT, WORK, LDWORK ) -* -* C := C - V * W**H -* - IF( M.GT.K ) THEN -* -* C2 := C2 - V2 * W**H -* - CALL ZGEMM( 'No transpose', 'Conjugate transpose', - $ LASTV-K, LASTC, K, - $ -ONE, V( K+1, 1 ), LDV, WORK, LDWORK, - $ ONE, C( K+1, 1 ), LDC ) - END IF -* -* W := W * V1**H -* - CALL ZTRMM( 'Right', 'Lower', 'Conjugate transpose', - $ 'Unit', LASTC, K, ONE, V, LDV, WORK, LDWORK ) -* -* C1 := C1 - W**H -* - DO 30 J = 1, K - DO 20 I = 1, LASTC - C( J, I ) = C( J, I ) - DCONJG( WORK( I, J ) ) - 20 CONTINUE - 30 CONTINUE -* - ELSE IF( LSAME( SIDE, 'R' ) ) THEN -* -* Form C * H or C * H**H where C = ( C1 C2 ) -* - LASTV = MAX( K, ILAZLR( N, K, V, LDV ) ) - LASTC = ILAZLR( M, LASTV, C, LDC ) -* -* W := C * V = (C1*V1 + C2*V2) (stored in WORK) -* -* W := C1 -* - DO 40 J = 1, K - CALL ZCOPY( LASTC, C( 1, J ), 1, WORK( 1, J ), 1 ) - 40 CONTINUE -* -* W := W * V1 -* - CALL ZTRMM( 'Right', 'Lower', 'No transpose', 'Unit', - $ LASTC, K, ONE, V, LDV, WORK, LDWORK ) - IF( LASTV.GT.K ) THEN -* -* W := W + C2 * V2 -* - CALL ZGEMM( 'No transpose', 'No transpose', - $ LASTC, K, LASTV-K, - $ ONE, C( 1, K+1 ), LDC, V( K+1, 1 ), LDV, - $ ONE, WORK, LDWORK ) - END IF -* -* W := W * T or W * T**H -* - CALL ZTRMM( 'Right', 'Upper', TRANS, 'Non-unit', - $ LASTC, K, ONE, T, LDT, WORK, LDWORK ) -* -* C := C - W * V**H -* - IF( LASTV.GT.K ) THEN -* -* C2 := C2 - W * V2**H -* - CALL ZGEMM( 'No transpose', 'Conjugate transpose', - $ LASTC, LASTV-K, K, - $ -ONE, WORK, LDWORK, V( K+1, 1 ), LDV, - $ ONE, C( 1, K+1 ), LDC ) - END IF -* -* W := W * V1**H -* - CALL ZTRMM( 'Right', 'Lower', 'Conjugate transpose', - $ 'Unit', LASTC, K, ONE, V, LDV, WORK, LDWORK ) -* -* C1 := C1 - W -* - DO 60 J = 1, K - DO 50 I = 1, LASTC - C( I, J ) = C( I, J ) - WORK( I, J ) - 50 CONTINUE - 60 CONTINUE - END IF -* - ELSE -* -* Let V = ( V1 ) -* ( V2 ) (last K rows) -* where V2 is unit upper triangular. -* - IF( LSAME( SIDE, 'L' ) ) THEN -* -* Form H * C or H**H * C where C = ( C1 ) -* ( C2 ) -* - LASTV = MAX( K, ILAZLR( M, K, V, LDV ) ) - LASTC = ILAZLC( LASTV, N, C, LDC ) -* -* W := C**H * V = (C1**H * V1 + C2**H * V2) (stored in WORK) -* -* W := C2**H -* - DO 70 J = 1, K - CALL ZCOPY( LASTC, C( LASTV-K+J, 1 ), LDC, - $ WORK( 1, J ), 1 ) - CALL ZLACGV( LASTC, WORK( 1, J ), 1 ) - 70 CONTINUE -* -* W := W * V2 -* - CALL ZTRMM( 'Right', 'Upper', 'No transpose', 'Unit', - $ LASTC, K, ONE, V( LASTV-K+1, 1 ), LDV, - $ WORK, LDWORK ) - IF( LASTV.GT.K ) THEN -* -* W := W + C1**H*V1 -* - CALL ZGEMM( 'Conjugate transpose', 'No transpose', - $ LASTC, K, LASTV-K, - $ ONE, C, LDC, V, LDV, - $ ONE, WORK, LDWORK ) - END IF -* -* W := W * T**H or W * T -* - CALL ZTRMM( 'Right', 'Lower', TRANST, 'Non-unit', - $ LASTC, K, ONE, T, LDT, WORK, LDWORK ) -* -* C := C - V * W**H -* - IF( LASTV.GT.K ) THEN -* -* C1 := C1 - V1 * W**H -* - CALL ZGEMM( 'No transpose', 'Conjugate transpose', - $ LASTV-K, LASTC, K, - $ -ONE, V, LDV, WORK, LDWORK, - $ ONE, C, LDC ) - END IF -* -* W := W * V2**H -* - CALL ZTRMM( 'Right', 'Upper', 'Conjugate transpose', - $ 'Unit', LASTC, K, ONE, V( LASTV-K+1, 1 ), LDV, - $ WORK, LDWORK ) -* -* C2 := C2 - W**H -* - DO 90 J = 1, K - DO 80 I = 1, LASTC - C( LASTV-K+J, I ) = C( LASTV-K+J, I ) - - $ DCONJG( WORK( I, J ) ) - 80 CONTINUE - 90 CONTINUE -* - ELSE IF( LSAME( SIDE, 'R' ) ) THEN -* -* Form C * H or C * H**H where C = ( C1 C2 ) -* - LASTV = MAX( K, ILAZLR( N, K, V, LDV ) ) - LASTC = ILAZLR( M, LASTV, C, LDC ) -* -* W := C * V = (C1*V1 + C2*V2) (stored in WORK) -* -* W := C2 -* - DO 100 J = 1, K - CALL ZCOPY( LASTC, C( 1, LASTV-K+J ), 1, - $ WORK( 1, J ), 1 ) - 100 CONTINUE -* -* W := W * V2 -* - CALL ZTRMM( 'Right', 'Upper', 'No transpose', 'Unit', - $ LASTC, K, ONE, V( LASTV-K+1, 1 ), LDV, - $ WORK, LDWORK ) - IF( LASTV.GT.K ) THEN -* -* W := W + C1 * V1 -* - CALL ZGEMM( 'No transpose', 'No transpose', - $ LASTC, K, LASTV-K, - $ ONE, C, LDC, V, LDV, ONE, WORK, LDWORK ) - END IF -* -* W := W * T or W * T**H -* - CALL ZTRMM( 'Right', 'Lower', TRANS, 'Non-unit', - $ LASTC, K, ONE, T, LDT, WORK, LDWORK ) -* -* C := C - W * V**H -* - IF( LASTV.GT.K ) THEN -* -* C1 := C1 - W * V1**H -* - CALL ZGEMM( 'No transpose', 'Conjugate transpose', - $ LASTC, LASTV-K, K, -ONE, WORK, LDWORK, V, LDV, - $ ONE, C, LDC ) - END IF -* -* W := W * V2**H -* - CALL ZTRMM( 'Right', 'Upper', 'Conjugate transpose', - $ 'Unit', LASTC, K, ONE, V( LASTV-K+1, 1 ), LDV, - $ WORK, LDWORK ) -* -* C2 := C2 - W -* - DO 120 J = 1, K - DO 110 I = 1, LASTC - C( I, LASTV-K+J ) = C( I, LASTV-K+J ) - $ - WORK( I, J ) - 110 CONTINUE - 120 CONTINUE - END IF - END IF -* - ELSE IF( LSAME( STOREV, 'R' ) ) THEN -* - IF( LSAME( DIRECT, 'F' ) ) THEN -* -* Let V = ( V1 V2 ) (V1: first K columns) -* where V1 is unit upper triangular. -* - IF( LSAME( SIDE, 'L' ) ) THEN -* -* Form H * C or H**H * C where C = ( C1 ) -* ( C2 ) -* - LASTV = MAX( K, ILAZLC( K, M, V, LDV ) ) - LASTC = ILAZLC( LASTV, N, C, LDC ) -* -* W := C**H * V**H = (C1**H * V1**H + C2**H * V2**H) (stored in WORK) -* -* W := C1**H -* - DO 130 J = 1, K - CALL ZCOPY( LASTC, C( J, 1 ), LDC, WORK( 1, J ), 1 ) - CALL ZLACGV( LASTC, WORK( 1, J ), 1 ) - 130 CONTINUE -* -* W := W * V1**H -* - CALL ZTRMM( 'Right', 'Upper', 'Conjugate transpose', - $ 'Unit', LASTC, K, ONE, V, LDV, WORK, LDWORK ) - IF( LASTV.GT.K ) THEN -* -* W := W + C2**H*V2**H -* - CALL ZGEMM( 'Conjugate transpose', - $ 'Conjugate transpose', LASTC, K, LASTV-K, - $ ONE, C( K+1, 1 ), LDC, V( 1, K+1 ), LDV, - $ ONE, WORK, LDWORK ) - END IF -* -* W := W * T**H or W * T -* - CALL ZTRMM( 'Right', 'Upper', TRANST, 'Non-unit', - $ LASTC, K, ONE, T, LDT, WORK, LDWORK ) -* -* C := C - V**H * W**H -* - IF( LASTV.GT.K ) THEN -* -* C2 := C2 - V2**H * W**H -* - CALL ZGEMM( 'Conjugate transpose', - $ 'Conjugate transpose', LASTV-K, LASTC, K, - $ -ONE, V( 1, K+1 ), LDV, WORK, LDWORK, - $ ONE, C( K+1, 1 ), LDC ) - END IF -* -* W := W * V1 -* - CALL ZTRMM( 'Right', 'Upper', 'No transpose', 'Unit', - $ LASTC, K, ONE, V, LDV, WORK, LDWORK ) -* -* C1 := C1 - W**H -* - DO 150 J = 1, K - DO 140 I = 1, LASTC - C( J, I ) = C( J, I ) - DCONJG( WORK( I, J ) ) - 140 CONTINUE - 150 CONTINUE -* - ELSE IF( LSAME( SIDE, 'R' ) ) THEN -* -* Form C * H or C * H**H where C = ( C1 C2 ) -* - LASTV = MAX( K, ILAZLC( K, N, V, LDV ) ) - LASTC = ILAZLR( M, LASTV, C, LDC ) -* -* W := C * V**H = (C1*V1**H + C2*V2**H) (stored in WORK) -* -* W := C1 -* - DO 160 J = 1, K - CALL ZCOPY( LASTC, C( 1, J ), 1, WORK( 1, J ), 1 ) - 160 CONTINUE -* -* W := W * V1**H -* - CALL ZTRMM( 'Right', 'Upper', 'Conjugate transpose', - $ 'Unit', LASTC, K, ONE, V, LDV, WORK, LDWORK ) - IF( LASTV.GT.K ) THEN -* -* W := W + C2 * V2**H -* - CALL ZGEMM( 'No transpose', 'Conjugate transpose', - $ LASTC, K, LASTV-K, ONE, C( 1, K+1 ), LDC, - $ V( 1, K+1 ), LDV, ONE, WORK, LDWORK ) - END IF -* -* W := W * T or W * T**H -* - CALL ZTRMM( 'Right', 'Upper', TRANS, 'Non-unit', - $ LASTC, K, ONE, T, LDT, WORK, LDWORK ) -* -* C := C - W * V -* - IF( LASTV.GT.K ) THEN -* -* C2 := C2 - W * V2 -* - CALL ZGEMM( 'No transpose', 'No transpose', - $ LASTC, LASTV-K, K, - $ -ONE, WORK, LDWORK, V( 1, K+1 ), LDV, - $ ONE, C( 1, K+1 ), LDC ) - END IF -* -* W := W * V1 -* - CALL ZTRMM( 'Right', 'Upper', 'No transpose', 'Unit', - $ LASTC, K, ONE, V, LDV, WORK, LDWORK ) -* -* C1 := C1 - W -* - DO 180 J = 1, K - DO 170 I = 1, LASTC - C( I, J ) = C( I, J ) - WORK( I, J ) - 170 CONTINUE - 180 CONTINUE -* - END IF -* - ELSE -* -* Let V = ( V1 V2 ) (V2: last K columns) -* where V2 is unit lower triangular. -* - IF( LSAME( SIDE, 'L' ) ) THEN -* -* Form H * C or H**H * C where C = ( C1 ) -* ( C2 ) -* - LASTV = MAX( K, ILAZLC( K, M, V, LDV ) ) - LASTC = ILAZLC( LASTV, N, C, LDC ) -* -* W := C**H * V**H = (C1**H * V1**H + C2**H * V2**H) (stored in WORK) -* -* W := C2**H -* - DO 190 J = 1, K - CALL ZCOPY( LASTC, C( LASTV-K+J, 1 ), LDC, - $ WORK( 1, J ), 1 ) - CALL ZLACGV( LASTC, WORK( 1, J ), 1 ) - 190 CONTINUE -* -* W := W * V2**H -* - CALL ZTRMM( 'Right', 'Lower', 'Conjugate transpose', - $ 'Unit', LASTC, K, ONE, V( 1, LASTV-K+1 ), LDV, - $ WORK, LDWORK ) - IF( LASTV.GT.K ) THEN -* -* W := W + C1**H * V1**H -* - CALL ZGEMM( 'Conjugate transpose', - $ 'Conjugate transpose', LASTC, K, LASTV-K, - $ ONE, C, LDC, V, LDV, ONE, WORK, LDWORK ) - END IF -* -* W := W * T**H or W * T -* - CALL ZTRMM( 'Right', 'Lower', TRANST, 'Non-unit', - $ LASTC, K, ONE, T, LDT, WORK, LDWORK ) -* -* C := C - V**H * W**H -* - IF( LASTV.GT.K ) THEN -* -* C1 := C1 - V1**H * W**H -* - CALL ZGEMM( 'Conjugate transpose', - $ 'Conjugate transpose', LASTV-K, LASTC, K, - $ -ONE, V, LDV, WORK, LDWORK, ONE, C, LDC ) - END IF -* -* W := W * V2 -* - CALL ZTRMM( 'Right', 'Lower', 'No transpose', 'Unit', - $ LASTC, K, ONE, V( 1, LASTV-K+1 ), LDV, - $ WORK, LDWORK ) -* -* C2 := C2 - W**H -* - DO 210 J = 1, K - DO 200 I = 1, LASTC - C( LASTV-K+J, I ) = C( LASTV-K+J, I ) - - $ DCONJG( WORK( I, J ) ) - 200 CONTINUE - 210 CONTINUE -* - ELSE IF( LSAME( SIDE, 'R' ) ) THEN -* -* Form C * H or C * H**H where C = ( C1 C2 ) -* - LASTV = MAX( K, ILAZLC( K, N, V, LDV ) ) - LASTC = ILAZLR( M, LASTV, C, LDC ) -* -* W := C * V**H = (C1*V1**H + C2*V2**H) (stored in WORK) -* -* W := C2 -* - DO 220 J = 1, K - CALL ZCOPY( LASTC, C( 1, LASTV-K+J ), 1, - $ WORK( 1, J ), 1 ) - 220 CONTINUE -* -* W := W * V2**H -* - CALL ZTRMM( 'Right', 'Lower', 'Conjugate transpose', - $ 'Unit', LASTC, K, ONE, V( 1, LASTV-K+1 ), LDV, - $ WORK, LDWORK ) - IF( LASTV.GT.K ) THEN -* -* W := W + C1 * V1**H -* - CALL ZGEMM( 'No transpose', 'Conjugate transpose', - $ LASTC, K, LASTV-K, ONE, C, LDC, V, LDV, ONE, - $ WORK, LDWORK ) - END IF -* -* W := W * T or W * T**H -* - CALL ZTRMM( 'Right', 'Lower', TRANS, 'Non-unit', - $ LASTC, K, ONE, T, LDT, WORK, LDWORK ) -* -* C := C - W * V -* - IF( LASTV.GT.K ) THEN -* -* C1 := C1 - W * V1 -* - CALL ZGEMM( 'No transpose', 'No transpose', - $ LASTC, LASTV-K, K, -ONE, WORK, LDWORK, V, LDV, - $ ONE, C, LDC ) - END IF -* -* W := W * V2 -* - CALL ZTRMM( 'Right', 'Lower', 'No transpose', 'Unit', - $ LASTC, K, ONE, V( 1, LASTV-K+1 ), LDV, - $ WORK, LDWORK ) -* -* C1 := C1 - W -* - DO 240 J = 1, K - DO 230 I = 1, LASTC - C( I, LASTV-K+J ) = C( I, LASTV-K+J ) - $ - WORK( I, J ) - 230 CONTINUE - 240 CONTINUE -* - END IF -* - END IF - END IF -* - RETURN -* -* End of ZLARFB -* - END diff --git a/eigen/lapack/zlarfg.f b/eigen/lapack/zlarfg.f deleted file mode 100644 index a90ae9f..0000000 --- a/eigen/lapack/zlarfg.f +++ /dev/null @@ -1,203 +0,0 @@ -*> \brief \b ZLARFG -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download ZLARFG + dependencies -*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/zlarfg.f"> -*> [TGZ]</a> -*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/zlarfg.f"> -*> [ZIP]</a> -*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/zlarfg.f"> -*> [TXT]</a> -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE ZLARFG( N, ALPHA, X, INCX, TAU ) -* -* .. Scalar Arguments .. -* INTEGER INCX, N -* COMPLEX*16 ALPHA, TAU -* .. -* .. Array Arguments .. -* COMPLEX*16 X( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> ZLARFG generates a complex elementary reflector H of order n, such -*> that -*> -*> H**H * ( alpha ) = ( beta ), H**H * H = I. -*> ( x ) ( 0 ) -*> -*> where alpha and beta are scalars, with beta real, and x is an -*> (n-1)-element complex vector. H is represented in the form -*> -*> H = I - tau * ( 1 ) * ( 1 v**H ) , -*> ( v ) -*> -*> where tau is a complex scalar and v is a complex (n-1)-element -*> vector. Note that H is not hermitian. -*> -*> If the elements of x are all zero and alpha is real, then tau = 0 -*> and H is taken to be the unit matrix. -*> -*> Otherwise 1 <= real(tau) <= 2 and abs(tau-1) <= 1 . -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The order of the elementary reflector. -*> \endverbatim -*> -*> \param[in,out] ALPHA -*> \verbatim -*> ALPHA is COMPLEX*16 -*> On entry, the value alpha. -*> On exit, it is overwritten with the value beta. -*> \endverbatim -*> -*> \param[in,out] X -*> \verbatim -*> X is COMPLEX*16 array, dimension -*> (1+(N-2)*abs(INCX)) -*> On entry, the vector x. -*> On exit, it is overwritten with the vector v. -*> \endverbatim -*> -*> \param[in] INCX -*> \verbatim -*> INCX is INTEGER -*> The increment between elements of X. INCX > 0. -*> \endverbatim -*> -*> \param[out] TAU -*> \verbatim -*> TAU is COMPLEX*16 -*> The value tau. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \date November 2011 -* -*> \ingroup complex16OTHERauxiliary -* -* ===================================================================== - SUBROUTINE ZLARFG( N, ALPHA, X, INCX, TAU ) -* -* -- LAPACK auxiliary routine (version 3.4.0) -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* November 2011 -* -* .. Scalar Arguments .. - INTEGER INCX, N - COMPLEX*16 ALPHA, TAU -* .. -* .. Array Arguments .. - COMPLEX*16 X( * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ONE, ZERO - PARAMETER ( ONE = 1.0D+0, ZERO = 0.0D+0 ) -* .. -* .. Local Scalars .. - INTEGER J, KNT - DOUBLE PRECISION ALPHI, ALPHR, BETA, RSAFMN, SAFMIN, XNORM -* .. -* .. External Functions .. - DOUBLE PRECISION DLAMCH, DLAPY3, DZNRM2 - COMPLEX*16 ZLADIV - EXTERNAL DLAMCH, DLAPY3, DZNRM2, ZLADIV -* .. -* .. Intrinsic Functions .. - INTRINSIC ABS, DBLE, DCMPLX, DIMAG, SIGN -* .. -* .. External Subroutines .. - EXTERNAL ZDSCAL, ZSCAL -* .. -* .. Executable Statements .. -* - IF( N.LE.0 ) THEN - TAU = ZERO - RETURN - END IF -* - XNORM = DZNRM2( N-1, X, INCX ) - ALPHR = DBLE( ALPHA ) - ALPHI = DIMAG( ALPHA ) -* - IF( XNORM.EQ.ZERO .AND. ALPHI.EQ.ZERO ) THEN -* -* H = I -* - TAU = ZERO - ELSE -* -* general case -* - BETA = -SIGN( DLAPY3( ALPHR, ALPHI, XNORM ), ALPHR ) - SAFMIN = DLAMCH( 'S' ) / DLAMCH( 'E' ) - RSAFMN = ONE / SAFMIN -* - KNT = 0 - IF( ABS( BETA ).LT.SAFMIN ) THEN -* -* XNORM, BETA may be inaccurate; scale X and recompute them -* - 10 CONTINUE - KNT = KNT + 1 - CALL ZDSCAL( N-1, RSAFMN, X, INCX ) - BETA = BETA*RSAFMN - ALPHI = ALPHI*RSAFMN - ALPHR = ALPHR*RSAFMN - IF( ABS( BETA ).LT.SAFMIN ) - $ GO TO 10 -* -* New BETA is at most 1, at least SAFMIN -* - XNORM = DZNRM2( N-1, X, INCX ) - ALPHA = DCMPLX( ALPHR, ALPHI ) - BETA = -SIGN( DLAPY3( ALPHR, ALPHI, XNORM ), ALPHR ) - END IF - TAU = DCMPLX( ( BETA-ALPHR ) / BETA, -ALPHI / BETA ) - ALPHA = ZLADIV( DCMPLX( ONE ), ALPHA-BETA ) - CALL ZSCAL( N-1, ALPHA, X, INCX ) -* -* If ALPHA is subnormal, it may lose relative accuracy -* - DO 20 J = 1, KNT - BETA = BETA*SAFMIN - 20 CONTINUE - ALPHA = BETA - END IF -* - RETURN -* -* End of ZLARFG -* - END diff --git a/eigen/lapack/zlarft.f b/eigen/lapack/zlarft.f deleted file mode 100644 index 6a6151f..0000000 --- a/eigen/lapack/zlarft.f +++ /dev/null @@ -1,327 +0,0 @@ -*> \brief \b ZLARFT -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download ZLARFT + dependencies -*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/zlarft.f"> -*> [TGZ]</a> -*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/zlarft.f"> -*> [ZIP]</a> -*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/zlarft.f"> -*> [TXT]</a> -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE ZLARFT( DIRECT, STOREV, N, K, V, LDV, TAU, T, LDT ) -* -* .. Scalar Arguments .. -* CHARACTER DIRECT, STOREV -* INTEGER K, LDT, LDV, N -* .. -* .. Array Arguments .. -* COMPLEX*16 T( LDT, * ), TAU( * ), V( LDV, * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> ZLARFT forms the triangular factor T of a complex block reflector H -*> of order n, which is defined as a product of k elementary reflectors. -*> -*> If DIRECT = 'F', H = H(1) H(2) . . . H(k) and T is upper triangular; -*> -*> If DIRECT = 'B', H = H(k) . . . H(2) H(1) and T is lower triangular. -*> -*> If STOREV = 'C', the vector which defines the elementary reflector -*> H(i) is stored in the i-th column of the array V, and -*> -*> H = I - V * T * V**H -*> -*> If STOREV = 'R', the vector which defines the elementary reflector -*> H(i) is stored in the i-th row of the array V, and -*> -*> H = I - V**H * T * V -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] DIRECT -*> \verbatim -*> DIRECT is CHARACTER*1 -*> Specifies the order in which the elementary reflectors are -*> multiplied to form the block reflector: -*> = 'F': H = H(1) H(2) . . . H(k) (Forward) -*> = 'B': H = H(k) . . . H(2) H(1) (Backward) -*> \endverbatim -*> -*> \param[in] STOREV -*> \verbatim -*> STOREV is CHARACTER*1 -*> Specifies how the vectors which define the elementary -*> reflectors are stored (see also Further Details): -*> = 'C': columnwise -*> = 'R': rowwise -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The order of the block reflector H. N >= 0. -*> \endverbatim -*> -*> \param[in] K -*> \verbatim -*> K is INTEGER -*> The order of the triangular factor T (= the number of -*> elementary reflectors). K >= 1. -*> \endverbatim -*> -*> \param[in] V -*> \verbatim -*> V is COMPLEX*16 array, dimension -*> (LDV,K) if STOREV = 'C' -*> (LDV,N) if STOREV = 'R' -*> The matrix V. See further details. -*> \endverbatim -*> -*> \param[in] LDV -*> \verbatim -*> LDV is INTEGER -*> The leading dimension of the array V. -*> If STOREV = 'C', LDV >= max(1,N); if STOREV = 'R', LDV >= K. -*> \endverbatim -*> -*> \param[in] TAU -*> \verbatim -*> TAU is COMPLEX*16 array, dimension (K) -*> TAU(i) must contain the scalar factor of the elementary -*> reflector H(i). -*> \endverbatim -*> -*> \param[out] T -*> \verbatim -*> T is COMPLEX*16 array, dimension (LDT,K) -*> The k by k triangular factor T of the block reflector. -*> If DIRECT = 'F', T is upper triangular; if DIRECT = 'B', T is -*> lower triangular. The rest of the array is not used. -*> \endverbatim -*> -*> \param[in] LDT -*> \verbatim -*> LDT is INTEGER -*> The leading dimension of the array T. LDT >= K. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \date April 2012 -* -*> \ingroup complex16OTHERauxiliary -* -*> \par Further Details: -* ===================== -*> -*> \verbatim -*> -*> The shape of the matrix V and the storage of the vectors which define -*> the H(i) is best illustrated by the following example with n = 5 and -*> k = 3. The elements equal to 1 are not stored. -*> -*> DIRECT = 'F' and STOREV = 'C': DIRECT = 'F' and STOREV = 'R': -*> -*> V = ( 1 ) V = ( 1 v1 v1 v1 v1 ) -*> ( v1 1 ) ( 1 v2 v2 v2 ) -*> ( v1 v2 1 ) ( 1 v3 v3 ) -*> ( v1 v2 v3 ) -*> ( v1 v2 v3 ) -*> -*> DIRECT = 'B' and STOREV = 'C': DIRECT = 'B' and STOREV = 'R': -*> -*> V = ( v1 v2 v3 ) V = ( v1 v1 1 ) -*> ( v1 v2 v3 ) ( v2 v2 v2 1 ) -*> ( 1 v2 v3 ) ( v3 v3 v3 v3 1 ) -*> ( 1 v3 ) -*> ( 1 ) -*> \endverbatim -*> -* ===================================================================== - SUBROUTINE ZLARFT( DIRECT, STOREV, N, K, V, LDV, TAU, T, LDT ) -* -* -- LAPACK auxiliary routine (version 3.4.1) -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* April 2012 -* -* .. Scalar Arguments .. - CHARACTER DIRECT, STOREV - INTEGER K, LDT, LDV, N -* .. -* .. Array Arguments .. - COMPLEX*16 T( LDT, * ), TAU( * ), V( LDV, * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - COMPLEX*16 ONE, ZERO - PARAMETER ( ONE = ( 1.0D+0, 0.0D+0 ), - $ ZERO = ( 0.0D+0, 0.0D+0 ) ) -* .. -* .. Local Scalars .. - INTEGER I, J, PREVLASTV, LASTV -* .. -* .. External Subroutines .. - EXTERNAL ZGEMV, ZLACGV, ZTRMV -* .. -* .. External Functions .. - LOGICAL LSAME - EXTERNAL LSAME -* .. -* .. Executable Statements .. -* -* Quick return if possible -* - IF( N.EQ.0 ) - $ RETURN -* - IF( LSAME( DIRECT, 'F' ) ) THEN - PREVLASTV = N - DO I = 1, K - PREVLASTV = MAX( PREVLASTV, I ) - IF( TAU( I ).EQ.ZERO ) THEN -* -* H(i) = I -* - DO J = 1, I - T( J, I ) = ZERO - END DO - ELSE -* -* general case -* - IF( LSAME( STOREV, 'C' ) ) THEN -* Skip any trailing zeros. - DO LASTV = N, I+1, -1 - IF( V( LASTV, I ).NE.ZERO ) EXIT - END DO - DO J = 1, I-1 - T( J, I ) = -TAU( I ) * CONJG( V( I , J ) ) - END DO - J = MIN( LASTV, PREVLASTV ) -* -* T(1:i-1,i) := - tau(i) * V(i:j,1:i-1)**H * V(i:j,i) -* - CALL ZGEMV( 'Conjugate transpose', J-I, I-1, - $ -TAU( I ), V( I+1, 1 ), LDV, - $ V( I+1, I ), 1, ONE, T( 1, I ), 1 ) - ELSE -* Skip any trailing zeros. - DO LASTV = N, I+1, -1 - IF( V( I, LASTV ).NE.ZERO ) EXIT - END DO - DO J = 1, I-1 - T( J, I ) = -TAU( I ) * V( J , I ) - END DO - J = MIN( LASTV, PREVLASTV ) -* -* T(1:i-1,i) := - tau(i) * V(1:i-1,i:j) * V(i,i:j)**H -* - CALL ZGEMM( 'N', 'C', I-1, 1, J-I, -TAU( I ), - $ V( 1, I+1 ), LDV, V( I, I+1 ), LDV, - $ ONE, T( 1, I ), LDT ) - END IF -* -* T(1:i-1,i) := T(1:i-1,1:i-1) * T(1:i-1,i) -* - CALL ZTRMV( 'Upper', 'No transpose', 'Non-unit', I-1, T, - $ LDT, T( 1, I ), 1 ) - T( I, I ) = TAU( I ) - IF( I.GT.1 ) THEN - PREVLASTV = MAX( PREVLASTV, LASTV ) - ELSE - PREVLASTV = LASTV - END IF - END IF - END DO - ELSE - PREVLASTV = 1 - DO I = K, 1, -1 - IF( TAU( I ).EQ.ZERO ) THEN -* -* H(i) = I -* - DO J = I, K - T( J, I ) = ZERO - END DO - ELSE -* -* general case -* - IF( I.LT.K ) THEN - IF( LSAME( STOREV, 'C' ) ) THEN -* Skip any leading zeros. - DO LASTV = 1, I-1 - IF( V( LASTV, I ).NE.ZERO ) EXIT - END DO - DO J = I+1, K - T( J, I ) = -TAU( I ) * CONJG( V( N-K+I , J ) ) - END DO - J = MAX( LASTV, PREVLASTV ) -* -* T(i+1:k,i) = -tau(i) * V(j:n-k+i,i+1:k)**H * V(j:n-k+i,i) -* - CALL ZGEMV( 'Conjugate transpose', N-K+I-J, K-I, - $ -TAU( I ), V( J, I+1 ), LDV, V( J, I ), - $ 1, ONE, T( I+1, I ), 1 ) - ELSE -* Skip any leading zeros. - DO LASTV = 1, I-1 - IF( V( I, LASTV ).NE.ZERO ) EXIT - END DO - DO J = I+1, K - T( J, I ) = -TAU( I ) * V( J, N-K+I ) - END DO - J = MAX( LASTV, PREVLASTV ) -* -* T(i+1:k,i) = -tau(i) * V(i+1:k,j:n-k+i) * V(i,j:n-k+i)**H -* - CALL ZGEMM( 'N', 'C', K-I, 1, N-K+I-J, -TAU( I ), - $ V( I+1, J ), LDV, V( I, J ), LDV, - $ ONE, T( I+1, I ), LDT ) - END IF -* -* T(i+1:k,i) := T(i+1:k,i+1:k) * T(i+1:k,i) -* - CALL ZTRMV( 'Lower', 'No transpose', 'Non-unit', K-I, - $ T( I+1, I+1 ), LDT, T( I+1, I ), 1 ) - IF( I.GT.1 ) THEN - PREVLASTV = MIN( PREVLASTV, LASTV ) - ELSE - PREVLASTV = LASTV - END IF - END IF - T( I, I ) = TAU( I ) - END IF - END DO - END IF - RETURN -* -* End of ZLARFT -* - END |
