| @@ -39,7 +39,8 @@ set(SLINTST schkaa.f | |||||
| strt02.f strt03.f strt05.f strt06.f | strt02.f strt03.f strt05.f strt06.f | ||||
| sgennd.f sqrt04.f sqrt05.f schkqrt.f serrqrt.f schkqrtp.f serrqrtp.f | sgennd.f sqrt04.f sqrt05.f schkqrt.f serrqrt.f schkqrtp.f serrqrtp.f | ||||
| schklqt.f schklqtp.f schktsqr.f | schklqt.f schklqtp.f schktsqr.f | ||||
| serrlqt.f serrlqtp.f serrtsqr.f stsqr01.f slqt04.f slqt05.f) | |||||
| serrlqt.f serrlqtp.f serrtsqr.f stsqr01.f slqt04.f slqt05.f | |||||
| schkorhr_col.f serrorhr_col.f sorhr_col01.f) | |||||
| if(USE_XBLAS) | if(USE_XBLAS) | ||||
| list(APPEND SLINTST sdrvgbx.f sdrvgex.f sdrvsyx.f sdrvpox.f | list(APPEND SLINTST sdrvgbx.f sdrvgex.f sdrvsyx.f sdrvpox.f | ||||
| @@ -94,7 +95,8 @@ set(CLINTST cchkaa.f | |||||
| sget06.f cgennd.f | sget06.f cgennd.f | ||||
| cqrt04.f cqrt05.f cchkqrt.f cerrqrt.f cchkqrtp.f cerrqrtp.f | cqrt04.f cqrt05.f cchkqrt.f cerrqrt.f cchkqrtp.f cerrqrtp.f | ||||
| cchklqt.f cchklqtp.f cchktsqr.f | cchklqt.f cchklqtp.f cchktsqr.f | ||||
| cerrlqt.f cerrlqtp.f cerrtsqr.f ctsqr01.f clqt04.f clqt05.f) | |||||
| cerrlqt.f cerrlqtp.f cerrtsqr.f ctsqr01.f clqt04.f clqt05.f | |||||
| cchkunhr_col.f cerrunhr_col.f cunhr_col01.f) | |||||
| if(USE_XBLAS) | if(USE_XBLAS) | ||||
| list(APPEND CLINTST cdrvgbx.f cdrvgex.f cdrvhex.f cdrvsyx.f cdrvpox.f | list(APPEND CLINTST cdrvgbx.f cdrvgex.f cdrvhex.f cdrvsyx.f cdrvpox.f | ||||
| @@ -139,7 +141,8 @@ set(DLINTST dchkaa.f | |||||
| dgennd.f | dgennd.f | ||||
| dqrt04.f dqrt05.f dchkqrt.f derrqrt.f dchkqrtp.f derrqrtp.f | dqrt04.f dqrt05.f dchkqrt.f derrqrt.f dchkqrtp.f derrqrtp.f | ||||
| dchklq.f dchklqt.f dchklqtp.f dchktsqr.f | dchklq.f dchklqt.f dchklqtp.f dchktsqr.f | ||||
| derrlqt.f derrlqtp.f derrtsqr.f dtsqr01.f dlqt04.f dlqt05.f) | |||||
| derrlqt.f derrlqtp.f derrtsqr.f dtsqr01.f dlqt04.f dlqt05.f | |||||
| dchkorhr_col.f derrorhr_col.f dorhr_col01.f) | |||||
| if(USE_XBLAS) | if(USE_XBLAS) | ||||
| list(APPEND DLINTST ddrvgbx.f ddrvgex.f ddrvsyx.f ddrvpox.f | list(APPEND DLINTST ddrvgbx.f ddrvgex.f ddrvsyx.f ddrvpox.f | ||||
| @@ -194,7 +197,8 @@ set(ZLINTST zchkaa.f | |||||
| dget06.f zgennd.f | dget06.f zgennd.f | ||||
| zqrt04.f zqrt05.f zchkqrt.f zerrqrt.f zchkqrtp.f zerrqrtp.f | zqrt04.f zqrt05.f zchkqrt.f zerrqrt.f zchkqrtp.f zerrqrtp.f | ||||
| zchklqt.f zchklqtp.f zchktsqr.f | zchklqt.f zchklqtp.f zchktsqr.f | ||||
| zerrlqt.f zerrlqtp.f zerrtsqr.f ztsqr01.f zlqt04.f zlqt05.f) | |||||
| zerrlqt.f zerrlqtp.f zerrtsqr.f ztsqr01.f zlqt04.f zlqt05.f | |||||
| zchkunhr_col.f zerrunhr_col.f zunhr_col01.f) | |||||
| if(USE_XBLAS) | if(USE_XBLAS) | ||||
| list(APPEND ZLINTST zdrvgbx.f zdrvgex.f zdrvhex.f zdrvsyx.f zdrvpox.f | list(APPEND ZLINTST zdrvgbx.f zdrvgex.f zdrvhex.f zdrvsyx.f zdrvpox.f | ||||
| @@ -1,5 +1,3 @@ | |||||
| include ../../make.inc | |||||
| ####################################################################### | ####################################################################### | ||||
| # This makefile creates the test programs for the linear equation | # This makefile creates the test programs for the linear equation | ||||
| # routines in LAPACK. The test files are grouped as follows: | # routines in LAPACK. The test files are grouped as follows: | ||||
| @@ -33,10 +31,8 @@ include ../../make.inc | |||||
| # | # | ||||
| ####################################################################### | ####################################################################### | ||||
| ifneq ($(strip $(VARLIB)),) | |||||
| LAPACKLIB := $(VARLIB) ../../$(LAPACKLIB) | |||||
| endif | |||||
| TOPSRCDIR = ../.. | |||||
| include $(TOPSRCDIR)/make.inc | |||||
| ALINTST = \ | ALINTST = \ | ||||
| aladhd.o alaerh.o alaesm.o alahd.o alareq.o \ | aladhd.o alaerh.o alaesm.o alahd.o alareq.o \ | ||||
| @@ -77,7 +73,8 @@ SLINTST = schkaa.o \ | |||||
| strt02.o strt03.o strt05.o strt06.o \ | strt02.o strt03.o strt05.o strt06.o \ | ||||
| sgennd.o sqrt04.o sqrt05.o schkqrt.o serrqrt.o schkqrtp.o serrqrtp.o \ | sgennd.o sqrt04.o sqrt05.o schkqrt.o serrqrt.o schkqrtp.o serrqrtp.o \ | ||||
| schklqt.o schklqtp.o schktsqr.o \ | schklqt.o schklqtp.o schktsqr.o \ | ||||
| serrlqt.o serrlqtp.o serrtsqr.o stsqr01.o slqt04.o slqt05.o | |||||
| serrlqt.o serrlqtp.o serrtsqr.o stsqr01.o slqt04.o slqt05.o \ | |||||
| schkorhr_col.o serrorhr_col.o sorhr_col01.o | |||||
| ifdef USEXBLAS | ifdef USEXBLAS | ||||
| SLINTST += sdrvgbx.o sdrvgex.o sdrvsyx.o sdrvpox.o \ | SLINTST += sdrvgbx.o sdrvgex.o sdrvsyx.o sdrvpox.o \ | ||||
| @@ -125,7 +122,8 @@ CLINTST = cchkaa.o \ | |||||
| sget06.o cgennd.o \ | sget06.o cgennd.o \ | ||||
| cqrt04.o cqrt05.o cchkqrt.o cerrqrt.o cchkqrtp.o cerrqrtp.o \ | cqrt04.o cqrt05.o cchkqrt.o cerrqrt.o cchkqrtp.o cerrqrtp.o \ | ||||
| cchklqt.o cchklqtp.o cchktsqr.o \ | cchklqt.o cchklqtp.o cchktsqr.o \ | ||||
| cerrlqt.o cerrlqtp.o cerrtsqr.o ctsqr01.o clqt04.o clqt05.o | |||||
| cerrlqt.o cerrlqtp.o cerrtsqr.o ctsqr01.o clqt04.o clqt05.o \ | |||||
| cchkunhr_col.o cerrunhr_col.o cunhr_col01.o | |||||
| ifdef USEXBLAS | ifdef USEXBLAS | ||||
| CLINTST += cdrvgbx.o cdrvgex.o cdrvhex.o cdrvsyx.o cdrvpox.o \ | CLINTST += cdrvgbx.o cdrvgex.o cdrvhex.o cdrvsyx.o cdrvpox.o \ | ||||
| @@ -168,7 +166,8 @@ DLINTST = dchkaa.o \ | |||||
| dgennd.o \ | dgennd.o \ | ||||
| dqrt04.o dqrt05.o dchkqrt.o derrqrt.o dchkqrtp.o derrqrtp.o \ | dqrt04.o dqrt05.o dchkqrt.o derrqrt.o dchkqrtp.o derrqrtp.o \ | ||||
| dchklq.o dchklqt.o dchklqtp.o dchktsqr.o \ | dchklq.o dchklqt.o dchklqtp.o dchktsqr.o \ | ||||
| derrlqt.o derrlqtp.o derrtsqr.o dtsqr01.o dlqt04.o dlqt05.o | |||||
| derrlqt.o derrlqtp.o derrtsqr.o dtsqr01.o dlqt04.o dlqt05.o \ | |||||
| dchkorhr_col.o derrorhr_col.o dorhr_col01.o | |||||
| ifdef USEXBLAS | ifdef USEXBLAS | ||||
| DLINTST += ddrvgbx.o ddrvgex.o ddrvsyx.o ddrvpox.o \ | DLINTST += ddrvgbx.o ddrvgex.o ddrvsyx.o ddrvpox.o \ | ||||
| @@ -215,7 +214,8 @@ ZLINTST = zchkaa.o \ | |||||
| dget06.o zgennd.o \ | dget06.o zgennd.o \ | ||||
| zqrt04.o zqrt05.o zchkqrt.o zerrqrt.o zchkqrtp.o zerrqrtp.o \ | zqrt04.o zqrt05.o zchkqrt.o zerrqrt.o zchkqrtp.o zerrqrtp.o \ | ||||
| zchklqt.o zchklqtp.o zchktsqr.o \ | zchklqt.o zchklqtp.o zchktsqr.o \ | ||||
| zerrlqt.o zerrlqtp.o zerrtsqr.o ztsqr01.o zlqt04.o zlqt05.o | |||||
| zerrlqt.o zerrlqtp.o zerrtsqr.o ztsqr01.o zlqt04.o zlqt05.o \ | |||||
| zchkunhr_col.o zerrunhr_col.o zunhr_col01.o | |||||
| ifdef USEXBLAS | ifdef USEXBLAS | ||||
| ZLINTST += zdrvgbx.o zdrvgex.o zdrvhex.o zdrvsyx.o zdrvpox.o \ | ZLINTST += zdrvgbx.o zdrvgex.o zdrvhex.o zdrvsyx.o zdrvpox.o \ | ||||
| @@ -254,47 +254,50 @@ ZLINTSTRFP = zchkrfp.o zdrvrfp.o zdrvrf1.o zdrvrf2.o zdrvrf3.o zdrvrf4.o zerrrfp | |||||
| zlatb4.o zlaipd.o zlarhs.o zsbmv.o zget04.o zpot01.o zpot03.o zpot02.o \ | zlatb4.o zlaipd.o zlarhs.o zsbmv.o zget04.o zpot01.o zpot03.o zpot02.o \ | ||||
| chkxer.o xerbla.o alaerh.o aladhd.o alahd.o alasvm.o | chkxer.o xerbla.o alaerh.o aladhd.o alahd.o alasvm.o | ||||
| .PHONY: all | |||||
| all: single double complex complex16 proto-single proto-double proto-complex proto-complex16 | all: single double complex complex16 proto-single proto-double proto-complex proto-complex16 | ||||
| .PHONY: single double complex complex16 | |||||
| single: xlintsts | single: xlintsts | ||||
| double: xlintstd | double: xlintstd | ||||
| complex: xlintstc | complex: xlintstc | ||||
| complex16: xlintstz | complex16: xlintstz | ||||
| .PHONY: proto-single proto-double proto-complex proto-complex16 | |||||
| proto-single: xlintstrfs | proto-single: xlintstrfs | ||||
| proto-double: xlintstds xlintstrfd | proto-double: xlintstds xlintstrfd | ||||
| proto-complex: xlintstrfc | proto-complex: xlintstrfc | ||||
| proto-complex16: xlintstzc xlintstrfz | proto-complex16: xlintstzc xlintstrfz | ||||
| xlintsts: $(ALINTST) $(SLINTST) $(SCLNTST) ../../$(TMGLIB) ../../$(LAPACKLIB) $(XBLASLIB) $(BLASLIB) | |||||
| $(LOADER) $(LOADOPTS) -o $@ $^ | |||||
| xlintsts: $(ALINTST) $(SLINTST) $(SCLNTST) $(TMGLIB) $(VARLIB) $(LAPACKLIB) $(XBLASLIB) $(BLASLIB) | |||||
| $(FC) $(FFLAGS) $(LDFLAGS) -o $@ $^ | |||||
| xlintstc: $(ALINTST) $(CLINTST) $(SCLNTST) ../../$(TMGLIB) ../../$(LAPACKLIB) $(XBLASLIB) $(BLASLIB) | |||||
| $(LOADER) $(LOADOPTS) -o $@ $^ | |||||
| xlintstc: $(ALINTST) $(CLINTST) $(SCLNTST) $(TMGLIB) $(VARLIB) $(LAPACKLIB) $(XBLASLIB) $(BLASLIB) | |||||
| $(FC) $(FFLAGS) $(LDFLAGS) -o $@ $^ | |||||
| xlintstd: $(ALINTST) $(DLINTST) $(DZLNTST) ../../$(TMGLIB) ../../$(LAPACKLIB) $(XBLASLIB) $(BLASLIB) | |||||
| $(LOADER) $(LOADOPTS) -o $@ $^ | |||||
| xlintstd: $(ALINTST) $(DLINTST) $(DZLNTST) $(TMGLIB) $(VARLIB) $(LAPACKLIB) $(XBLASLIB) $(BLASLIB) | |||||
| $(FC) $(FFLAGS) $(LDFLAGS) -o $@ $^ | |||||
| xlintstz: $(ALINTST) $(ZLINTST) $(DZLNTST) ../../$(TMGLIB) ../../$(LAPACKLIB) $(XBLASLIB) $(BLASLIB) | |||||
| $(LOADER) $(LOADOPTS) -o $@ $^ | |||||
| xlintstz: $(ALINTST) $(ZLINTST) $(DZLNTST) $(TMGLIB) $(VARLIB) $(LAPACKLIB) $(XBLASLIB) $(BLASLIB) | |||||
| $(FC) $(FFLAGS) $(LDFLAGS) -o $@ $^ | |||||
| xlintstds: $(DSLINTST) ../../$(TMGLIB) ../../$(LAPACKLIB) $(BLASLIB) | |||||
| $(LOADER) $(LOADOPTS) -o $@ $^ | |||||
| xlintstds: $(DSLINTST) $(TMGLIB) $(VARLIB) $(LAPACKLIB) $(BLASLIB) | |||||
| $(FC) $(FFLAGS) $(LDFLAGS) -o $@ $^ | |||||
| xlintstzc: $(ZCLINTST) ../../$(TMGLIB) ../../$(LAPACKLIB) $(BLASLIB) | |||||
| $(LOADER) $(LOADOPTS) -o $@ $^ | |||||
| xlintstzc: $(ZCLINTST) $(TMGLIB) $(VARLIB) $(LAPACKLIB) $(BLASLIB) | |||||
| $(FC) $(FFLAGS) $(LDFLAGS) -o $@ $^ | |||||
| xlintstrfs: $(SLINTSTRFP) ../../$(TMGLIB) ../../$(LAPACKLIB) $(BLASLIB) | |||||
| $(LOADER) $(LOADOPTS) -o $@ $^ | |||||
| xlintstrfs: $(SLINTSTRFP) $(TMGLIB) $(VARLIB) $(LAPACKLIB) $(BLASLIB) | |||||
| $(FC) $(FFLAGS) $(LDFLAGS) -o $@ $^ | |||||
| xlintstrfd: $(DLINTSTRFP) ../../$(TMGLIB) ../../$(LAPACKLIB) $(BLASLIB) | |||||
| $(LOADER) $(LOADOPTS) -o $@ $^ | |||||
| xlintstrfd: $(DLINTSTRFP) $(TMGLIB) $(VARLIB) $(LAPACKLIB) $(BLASLIB) | |||||
| $(FC) $(FFLAGS) $(LDFLAGS) -o $@ $^ | |||||
| xlintstrfc: $(CLINTSTRFP) ../../$(TMGLIB) ../../$(LAPACKLIB) $(BLASLIB) | |||||
| $(LOADER) $(LOADOPTS) -o $@ $^ | |||||
| xlintstrfc: $(CLINTSTRFP) $(TMGLIB) $(VARLIB) $(LAPACKLIB) $(BLASLIB) | |||||
| $(FC) $(FFLAGS) $(LDFLAGS) -o $@ $^ | |||||
| xlintstrfz: $(ZLINTSTRFP) ../../$(TMGLIB) ../../$(LAPACKLIB) $(BLASLIB) | |||||
| $(LOADER) $(LOADOPTS) -o $@ $^ | |||||
| xlintstrfz: $(ZLINTSTRFP) $(TMGLIB) $(VARLIB) $(LAPACKLIB) $(BLASLIB) | |||||
| $(FC) $(FFLAGS) $(LDFLAGS) -o $@ $^ | |||||
| $(ALINTST): $(FRC) | $(ALINTST): $(FRC) | ||||
| $(SCLNTST): $(FRC) | $(SCLNTST): $(FRC) | ||||
| @@ -307,6 +310,7 @@ $(ZLINTST): $(FRC) | |||||
| FRC: | FRC: | ||||
| @FRC=$(FRC) | @FRC=$(FRC) | ||||
| .PHONY: clean cleanobj cleanexe | |||||
| clean: cleanobj cleanexe | clean: cleanobj cleanexe | ||||
| cleanobj: | cleanobj: | ||||
| rm -f *.o | rm -f *.o | ||||
| @@ -314,15 +318,12 @@ cleanexe: | |||||
| rm -f xlintst* | rm -f xlintst* | ||||
| schkaa.o: schkaa.f | schkaa.o: schkaa.f | ||||
| $(FORTRAN) $(DRVOPTS) -c -o $@ $< | |||||
| $(FC) $(FFLAGS_DRV) -c -o $@ $< | |||||
| dchkaa.o: dchkaa.f | dchkaa.o: dchkaa.f | ||||
| $(FORTRAN) $(DRVOPTS) -c -o $@ $< | |||||
| $(FC) $(FFLAGS_DRV) -c -o $@ $< | |||||
| cchkaa.o: cchkaa.f | cchkaa.o: cchkaa.f | ||||
| $(FORTRAN) $(DRVOPTS) -c -o $@ $< | |||||
| $(FC) $(FFLAGS_DRV) -c -o $@ $< | |||||
| zchkaa.o: zchkaa.f | zchkaa.o: zchkaa.f | ||||
| $(FORTRAN) $(DRVOPTS) -c -o $@ $< | |||||
| .f.o: | |||||
| $(FORTRAN) $(OPTS) -c -o $@ $< | |||||
| $(FC) $(FFLAGS_DRV) -c -o $@ $< | |||||
| .NOTPARALLEL: | .NOTPARALLEL: | ||||
| @@ -74,6 +74,8 @@ | |||||
| *> CEQ | *> CEQ | ||||
| *> CQT | *> CQT | ||||
| *> CQX | *> CQX | ||||
| *> CTS | |||||
| *> CHH | |||||
| *> \endverbatim | *> \endverbatim | ||||
| * | * | ||||
| * Parameters: | * Parameters: | ||||
| @@ -108,14 +110,14 @@ | |||||
| *> \author Univ. of Colorado Denver | *> \author Univ. of Colorado Denver | ||||
| *> \author NAG Ltd. | *> \author NAG Ltd. | ||||
| * | * | ||||
| *> \date November 2017 | |||||
| *> \date November 2019 | |||||
| * | * | ||||
| *> \ingroup complex_lin | *> \ingroup complex_lin | ||||
| * | * | ||||
| * ===================================================================== | * ===================================================================== | ||||
| PROGRAM CCHKAA | PROGRAM CCHKAA | ||||
| * | * | ||||
| * -- LAPACK test routine (version 3.8.0) -- | |||||
| * -- LAPACK test routine (version 3.9.0) -- | |||||
| * -- LAPACK is a software package provided by Univ. of Tennessee, -- | * -- LAPACK is a software package provided by Univ. of Tennessee, -- | ||||
| * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- | * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- | ||||
| * November 2017 | * November 2017 | ||||
| @@ -165,15 +167,16 @@ | |||||
| * .. | * .. | ||||
| * .. External Subroutines .. | * .. External Subroutines .. | ||||
| EXTERNAL ALAREQ, CCHKEQ, CCHKGB, CCHKGE, CCHKGT, CCHKHE, | EXTERNAL ALAREQ, CCHKEQ, CCHKGB, CCHKGE, CCHKGT, CCHKHE, | ||||
| $ CCHKHE_ROOK, CCHKHE_RK, CCHKHE_AA, CCHKLQ, | |||||
| $ CCHKPB,CCHKPO, CCHKPS, CCHKPP, CCHKPT, CCHKQ3, | |||||
| $ CCHKQL, CCHKQR, CCHKRQ, CCHKSP, CCHKSY, | |||||
| $ CCHKSY_ROOK, CCHKSY_RK, CCHKSY_AA, CCHKTB, | |||||
| $ CCHKTP, CCHKTR, CCHKTZ, CDRVGB, CDRVGE, CDRVGT, | |||||
| $ CDRVHE, CDRVHE_ROOK, CDRVHE_RK, CDRVHE_AA, | |||||
| $ CDRVHP, CDRVLS, CDRVPB, CDRVPO, CDRVPP, CDRVPT, | |||||
| $ CDRVSP, CDRVSY, CDRVSY_ROOK, CDRVSY_RK, | |||||
| $ CDRVSY_AA, ILAVER, CCHKQRT, CCHKQRTP | |||||
| $ CCHKHE_ROOK, CCHKHE_RK, CCHKHE_AA, CCHKHP, | |||||
| $ CCHKLQ, CCHKUNHR_COL, CCHKPB, CCHKPO, CCHKPS, | |||||
| $ CCHKPP, CCHKPT, CCHKQ3, CCHKQL, CCHKQR, CCHKRQ, | |||||
| $ CCHKSP, CCHKSY, CCHKSY_ROOK, CCHKSY_RK, | |||||
| $ CCHKSY_AA, CCHKTB, CCHKTP, CCHKTR, CCHKTZ, | |||||
| $ CDRVGB, CDRVGE, CDRVGT, CDRVHE, CDRVHE_ROOK, | |||||
| $ CDRVHE_RK, CDRVHE_AA, CDRVHP, CDRVLS, CDRVPB, | |||||
| $ CDRVPO, CDRVPP, CDRVPT, CDRVSP, CDRVSY, | |||||
| $ CDRVSY_ROOK, CDRVSY_RK, CDRVSY_AA, ILAVER, | |||||
| $ CCHKQRT, CCHKQRTP | |||||
| * .. | * .. | ||||
| * .. Scalars in Common .. | * .. Scalars in Common .. | ||||
| LOGICAL LERR, OK | LOGICAL LERR, OK | ||||
| @@ -678,7 +681,7 @@ | |||||
| * | * | ||||
| * HK: Hermitian indefinite matrices, | * HK: Hermitian indefinite matrices, | ||||
| * with bounded Bunch-Kaufman (rook) pivoting algorithm, | * with bounded Bunch-Kaufman (rook) pivoting algorithm, | ||||
| * differnet matrix storage format than HR path version. | |||||
| * different matrix storage format than HR path version. | |||||
| * | * | ||||
| NTYPES = 10 | NTYPES = 10 | ||||
| CALL ALAREQ( PATH, NMATS, DOTYPE, NTYPES, NIN, NOUT ) | CALL ALAREQ( PATH, NMATS, DOTYPE, NTYPES, NIN, NOUT ) | ||||
| @@ -838,7 +841,7 @@ | |||||
| * | * | ||||
| * SK: symmetric indefinite matrices, | * SK: symmetric indefinite matrices, | ||||
| * with bounded Bunch-Kaufman (rook) pivoting algorithm, | * with bounded Bunch-Kaufman (rook) pivoting algorithm, | ||||
| * differnet matrix storage format than SR path version. | |||||
| * different matrix storage format than SR path version. | |||||
| * | * | ||||
| NTYPES = 11 | NTYPES = 11 | ||||
| CALL ALAREQ( PATH, NMATS, DOTYPE, NTYPES, NIN, NOUT ) | CALL ALAREQ( PATH, NMATS, DOTYPE, NTYPES, NIN, NOUT ) | ||||
| @@ -1165,6 +1168,17 @@ | |||||
| ELSE | ELSE | ||||
| WRITE( NOUT, FMT = 9989 )PATH | WRITE( NOUT, FMT = 9989 )PATH | ||||
| END IF | END IF | ||||
| * | |||||
| ELSE IF( LSAMEN( 2, C2, 'HH' ) ) THEN | |||||
| * | |||||
| * HH: Householder reconstruction for tall-skinny matrices | |||||
| * | |||||
| IF( TSTCHK ) THEN | |||||
| CALL CCHKUNHR_COL( THRESH, TSTERR, NM, MVAL, NN, NVAL, NNB, | |||||
| $ NBVAL, NOUT ) | |||||
| ELSE | |||||
| WRITE( NOUT, FMT = 9989 ) PATH | |||||
| END IF | |||||
| * | * | ||||
| ELSE | ELSE | ||||
| * | * | ||||
| @@ -0,0 +1,239 @@ | |||||
| *> \brief \b CCHKUNHR_COL | |||||
| * | |||||
| * =========== DOCUMENTATION =========== | |||||
| * | |||||
| * Online html documentation available at | |||||
| * http://www.netlib.org/lapack/explore-html/ | |||||
| * | |||||
| * Definition: | |||||
| * =========== | |||||
| * | |||||
| * SUBROUTINE CCHKUNHR_COL( THRESH, TSTERR, NM, MVAL, NN, NVAL, NNB, | |||||
| * NBVAL, NOUT ) | |||||
| * | |||||
| * .. Scalar Arguments .. | |||||
| * LOGICAL TSTERR | |||||
| * INTEGER NM, NN, NNB, NOUT | |||||
| * REAL THRESH | |||||
| * .. | |||||
| * .. Array Arguments .. | |||||
| * INTEGER MVAL( * ), NBVAL( * ), NVAL( * ) | |||||
| * | |||||
| *> \par Purpose: | |||||
| * ============= | |||||
| *> | |||||
| *> \verbatim | |||||
| *> | |||||
| *> CCHKUNHR_COL tests CUNHR_COL using CLATSQR and CGEMQRT. Therefore, CLATSQR | |||||
| *> (used in CGEQR) and CGEMQRT (used in CGEMQR) have to be tested | |||||
| *> before this test. | |||||
| *> | |||||
| *> \endverbatim | |||||
| * | |||||
| * Arguments: | |||||
| * ========== | |||||
| * | |||||
| *> \param[in] THRESH | |||||
| *> \verbatim | |||||
| *> THRESH is REAL | |||||
| *> The threshold value for the test ratios. A result is | |||||
| *> included in the output file if RESULT >= THRESH. To have | |||||
| *> every test ratio printed, use THRESH = 0. | |||||
| *> \endverbatim | |||||
| *> | |||||
| *> \param[in] TSTERR | |||||
| *> \verbatim | |||||
| *> TSTERR is LOGICAL | |||||
| *> Flag that indicates whether error exits are to be tested. | |||||
| *> \endverbatim | |||||
| *> | |||||
| *> \param[in] NM | |||||
| *> \verbatim | |||||
| *> NM is INTEGER | |||||
| *> The number of values of M contained in the vector MVAL. | |||||
| *> \endverbatim | |||||
| *> | |||||
| *> \param[in] MVAL | |||||
| *> \verbatim | |||||
| *> MVAL is INTEGER array, dimension (NM) | |||||
| *> The values of the matrix row dimension M. | |||||
| *> \endverbatim | |||||
| *> | |||||
| *> \param[in] NN | |||||
| *> \verbatim | |||||
| *> NN is INTEGER | |||||
| *> The number of values of N contained in the vector NVAL. | |||||
| *> \endverbatim | |||||
| *> | |||||
| *> \param[in] NVAL | |||||
| *> \verbatim | |||||
| *> NVAL is INTEGER array, dimension (NN) | |||||
| *> The values of the matrix column dimension N. | |||||
| *> \endverbatim | |||||
| *> | |||||
| *> \param[in] NNB | |||||
| *> \verbatim | |||||
| *> NNB is INTEGER | |||||
| *> The number of values of NB contained in the vector NBVAL. | |||||
| *> \endverbatim | |||||
| *> | |||||
| *> \param[in] NBVAL | |||||
| *> \verbatim | |||||
| *> NBVAL is INTEGER array, dimension (NBVAL) | |||||
| *> The values of the blocksize NB. | |||||
| *> \endverbatim | |||||
| *> | |||||
| *> \param[in] NOUT | |||||
| *> \verbatim | |||||
| *> NOUT is INTEGER | |||||
| *> The unit number for output. | |||||
| *> \endverbatim | |||||
| * | |||||
| * Authors: | |||||
| * ======== | |||||
| * | |||||
| *> \author Univ. of Tennessee | |||||
| *> \author Univ. of California Berkeley | |||||
| *> \author Univ. of Colorado Denver | |||||
| *> \author NAG Ltd. | |||||
| * | |||||
| *> \date November 2019 | |||||
| * | |||||
| *> \ingroup complex_lin | |||||
| * | |||||
| * ===================================================================== | |||||
| SUBROUTINE CCHKUNHR_COL( THRESH, TSTERR, NM, MVAL, NN, NVAL, NNB, | |||||
| $ NBVAL, NOUT ) | |||||
| IMPLICIT NONE | |||||
| * | |||||
| * -- LAPACK test routine (version 3.7.0) -- | |||||
| * -- LAPACK is a software package provided by Univ. of Tennessee, -- | |||||
| * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- | |||||
| * December 2016 | |||||
| * | |||||
| * .. Scalar Arguments .. | |||||
| LOGICAL TSTERR | |||||
| INTEGER NM, NN, NNB, NOUT | |||||
| REAL THRESH | |||||
| * .. | |||||
| * .. Array Arguments .. | |||||
| INTEGER MVAL( * ), NBVAL( * ), NVAL( * ) | |||||
| * .. | |||||
| * | |||||
| * ===================================================================== | |||||
| * | |||||
| * .. Parameters .. | |||||
| INTEGER NTESTS | |||||
| PARAMETER ( NTESTS = 6 ) | |||||
| * .. | |||||
| * .. Local Scalars .. | |||||
| CHARACTER(LEN=3) PATH | |||||
| INTEGER I, IMB1, INB1, INB2, J, T, M, N, MB1, NB1, | |||||
| $ NB2, NFAIL, NERRS, NRUN | |||||
| * | |||||
| * .. Local Arrays .. | |||||
| REAL RESULT( NTESTS ) | |||||
| * .. | |||||
| * .. External Subroutines .. | |||||
| EXTERNAL ALAHD, ALASUM, CERRUNHR_COL, CUNHR_COL01 | |||||
| * .. | |||||
| * .. Intrinsic Functions .. | |||||
| INTRINSIC MAX, MIN | |||||
| * .. | |||||
| * .. Scalars in Common .. | |||||
| LOGICAL LERR, OK | |||||
| CHARACTER(LEN=32) SRNAMT | |||||
| INTEGER INFOT, NUNIT | |||||
| * .. | |||||
| * .. Common blocks .. | |||||
| COMMON / INFOC / INFOT, NUNIT, OK, LERR | |||||
| COMMON / SRNAMC / SRNAMT | |||||
| * .. | |||||
| * .. Executable Statements .. | |||||
| * | |||||
| * Initialize constants | |||||
| * | |||||
| PATH( 1: 1 ) = 'C' | |||||
| PATH( 2: 3 ) = 'HH' | |||||
| NRUN = 0 | |||||
| NFAIL = 0 | |||||
| NERRS = 0 | |||||
| * | |||||
| * Test the error exits | |||||
| * | |||||
| IF( TSTERR ) CALL CERRUNHR_COL( PATH, NOUT ) | |||||
| INFOT = 0 | |||||
| * | |||||
| * Do for each value of M in MVAL. | |||||
| * | |||||
| DO I = 1, NM | |||||
| M = MVAL( I ) | |||||
| * | |||||
| * Do for each value of N in NVAL. | |||||
| * | |||||
| DO J = 1, NN | |||||
| N = NVAL( J ) | |||||
| * | |||||
| * Only for M >= N | |||||
| * | |||||
| IF ( MIN( M, N ).GT.0 .AND. M.GE.N ) THEN | |||||
| * | |||||
| * Do for each possible value of MB1 | |||||
| * | |||||
| DO IMB1 = 1, NNB | |||||
| MB1 = NBVAL( IMB1 ) | |||||
| * | |||||
| * Only for MB1 > N | |||||
| * | |||||
| IF ( MB1.GT.N ) THEN | |||||
| * | |||||
| * Do for each possible value of NB1 | |||||
| * | |||||
| DO INB1 = 1, NNB | |||||
| NB1 = NBVAL( INB1 ) | |||||
| * | |||||
| * Do for each possible value of NB2 | |||||
| * | |||||
| DO INB2 = 1, NNB | |||||
| NB2 = NBVAL( INB2 ) | |||||
| * | |||||
| IF( NB1.GT.0 .AND. NB2.GT.0 ) THEN | |||||
| * | |||||
| * Test CUNHR_COL | |||||
| * | |||||
| CALL CUNHR_COL01( M, N, MB1, NB1, NB2, | |||||
| $ RESULT ) | |||||
| * | |||||
| * Print information about the tests that did | |||||
| * not pass the threshold. | |||||
| * | |||||
| DO T = 1, NTESTS | |||||
| IF( RESULT( T ).GE.THRESH ) THEN | |||||
| IF( NFAIL.EQ.0 .AND. NERRS.EQ.0 ) | |||||
| $ CALL ALAHD( NOUT, PATH ) | |||||
| WRITE( NOUT, FMT = 9999 ) M, N, MB1, | |||||
| $ NB1, NB2, T, RESULT( T ) | |||||
| NFAIL = NFAIL + 1 | |||||
| END IF | |||||
| END DO | |||||
| NRUN = NRUN + NTESTS | |||||
| END IF | |||||
| END DO | |||||
| END DO | |||||
| END IF | |||||
| END DO | |||||
| END IF | |||||
| END DO | |||||
| END DO | |||||
| * | |||||
| * Print a summary of the results. | |||||
| * | |||||
| CALL ALASUM( PATH, NOUT, NFAIL, NRUN, NERRS ) | |||||
| * | |||||
| 9999 FORMAT( 'M=', I5, ', N=', I5, ', MB1=', I5, | |||||
| $ ', NB1=', I5, ', NB2=', I5,' test(', I2, ')=', G12.5 ) | |||||
| RETURN | |||||
| * | |||||
| * End of CCHKUNHR_COL | |||||
| * | |||||
| END | |||||
| @@ -237,13 +237,13 @@ | |||||
| REAL EPS, NORMA, NORMB, RCOND | REAL EPS, NORMA, NORMB, RCOND | ||||
| * .. | * .. | ||||
| * .. Local Arrays .. | * .. Local Arrays .. | ||||
| INTEGER ISEED( 4 ), ISEEDY( 4 ), IWQ | |||||
| REAL RESULT( NTESTS ), RWQ | |||||
| COMPLEX WQ | |||||
| INTEGER ISEED( 4 ), ISEEDY( 4 ), IWQ( 1 ) | |||||
| REAL RESULT( NTESTS ), RWQ( 1 ) | |||||
| COMPLEX WQ( 1 ) | |||||
| * .. | * .. | ||||
| * .. Allocatable Arrays .. | * .. Allocatable Arrays .. | ||||
| COMPLEX, ALLOCATABLE :: WORK (:) | COMPLEX, ALLOCATABLE :: WORK (:) | ||||
| REAL, ALLOCATABLE :: RWORK (:) | |||||
| REAL, ALLOCATABLE :: RWORK (:), WORK2 (:) | |||||
| INTEGER, ALLOCATABLE :: IWORK (:) | INTEGER, ALLOCATABLE :: IWORK (:) | ||||
| * .. | * .. | ||||
| * .. External Functions .. | * .. External Functions .. | ||||
| @@ -363,32 +363,32 @@ | |||||
| * Compute workspace needed for CGELS | * Compute workspace needed for CGELS | ||||
| CALL CGELS( TRANS, M, N, NRHS, A, LDA, | CALL CGELS( TRANS, M, N, NRHS, A, LDA, | ||||
| $ B, LDB, WQ, -1, INFO ) | $ B, LDB, WQ, -1, INFO ) | ||||
| LWORK_CGELS = INT( WQ ) | |||||
| LWORK_CGELS = INT( WQ( 1 ) ) | |||||
| * Compute workspace needed for CGETSLS | * Compute workspace needed for CGETSLS | ||||
| CALL CGETSLS( TRANS, M, N, NRHS, A, LDA, | CALL CGETSLS( TRANS, M, N, NRHS, A, LDA, | ||||
| $ B, LDB, WQ, -1, INFO ) | $ B, LDB, WQ, -1, INFO ) | ||||
| LWORK_CGETSLS = INT( WQ ) | |||||
| LWORK_CGETSLS = INT( WQ( 1 ) ) | |||||
| ENDDO | ENDDO | ||||
| END IF | END IF | ||||
| * Compute workspace needed for CGELSY | * Compute workspace needed for CGELSY | ||||
| CALL CGELSY( M, N, NRHS, A, LDA, B, LDB, | CALL CGELSY( M, N, NRHS, A, LDA, B, LDB, | ||||
| $ IWQ, RCOND, CRANK, WQ, -1, RWORK, | $ IWQ, RCOND, CRANK, WQ, -1, RWORK, | ||||
| $ INFO ) | $ INFO ) | ||||
| LWORK_CGELSY = INT( WQ ) | |||||
| LWORK_CGELSY = INT( WQ( 1 ) ) | |||||
| LRWORK_CGELSY = 2*N | LRWORK_CGELSY = 2*N | ||||
| * Compute workspace needed for CGELSS | * Compute workspace needed for CGELSS | ||||
| CALL CGELSS( M, N, NRHS, A, LDA, B, LDB, S, | CALL CGELSS( M, N, NRHS, A, LDA, B, LDB, S, | ||||
| $ RCOND, CRANK, WQ, -1, RWORK, INFO ) | $ RCOND, CRANK, WQ, -1, RWORK, INFO ) | ||||
| LWORK_CGELSS = INT( WQ ) | |||||
| LWORK_CGELSS = INT( WQ( 1 ) ) | |||||
| LRWORK_CGELSS = 5*MNMIN | LRWORK_CGELSS = 5*MNMIN | ||||
| * Compute workspace needed for CGELSD | * Compute workspace needed for CGELSD | ||||
| CALL CGELSD( M, N, NRHS, A, LDA, B, LDB, S, | CALL CGELSD( M, N, NRHS, A, LDA, B, LDB, S, | ||||
| $ RCOND, CRANK, WQ, -1, RWQ, IWQ, | $ RCOND, CRANK, WQ, -1, RWQ, IWQ, | ||||
| $ INFO ) | $ INFO ) | ||||
| LWORK_CGELSD = INT( WQ ) | |||||
| LRWORK_CGELSD = INT( RWQ ) | |||||
| LWORK_CGELSD = INT( WQ( 1 ) ) | |||||
| LRWORK_CGELSD = INT( RWQ ( 1 ) ) | |||||
| * Compute LIWORK workspace needed for CGELSY and CGELSD | * Compute LIWORK workspace needed for CGELSY and CGELSD | ||||
| LIWORK = MAX( LIWORK, N, IWQ ) | |||||
| LIWORK = MAX( LIWORK, N, IWQ ( 1 ) ) | |||||
| * Compute LRWORK workspace needed for CGELSY, CGELSS and CGELSD | * Compute LRWORK workspace needed for CGELSY, CGELSS and CGELSD | ||||
| LRWORK = MAX( LRWORK, LRWORK_CGELSY, | LRWORK = MAX( LRWORK, LRWORK_CGELSY, | ||||
| $ LRWORK_CGELSS, LRWORK_CGELSD ) | $ LRWORK_CGELSS, LRWORK_CGELSD ) | ||||
| @@ -408,6 +408,7 @@ | |||||
| ALLOCATE( WORK( LWORK ) ) | ALLOCATE( WORK( LWORK ) ) | ||||
| ALLOCATE( IWORK( LIWORK ) ) | ALLOCATE( IWORK( LIWORK ) ) | ||||
| ALLOCATE( RWORK( LRWORK ) ) | ALLOCATE( RWORK( LRWORK ) ) | ||||
| ALLOCATE( WORK2( 2 * LWORK ) ) | |||||
| * | * | ||||
| DO 140 IM = 1, NM | DO 140 IM = 1, NM | ||||
| M = MVAL( IM ) | M = MVAL( IM ) | ||||
| @@ -596,7 +597,7 @@ | |||||
| $ CALL CLACPY( 'Full', NROWS, NRHS, | $ CALL CLACPY( 'Full', NROWS, NRHS, | ||||
| $ COPYB, LDB, C, LDB ) | $ COPYB, LDB, C, LDB ) | ||||
| CALL CQRT16( TRANS, M, N, NRHS, COPYA, | CALL CQRT16( TRANS, M, N, NRHS, COPYA, | ||||
| $ LDA, B, LDB, C, LDB, WORK, | |||||
| $ LDA, B, LDB, C, LDB, WORK2, | |||||
| $ RESULT( 15 ) ) | $ RESULT( 15 ) ) | ||||
| * | * | ||||
| IF( ( ITRAN.EQ.1 .AND. M.GE.N ) .OR. | IF( ( ITRAN.EQ.1 .AND. M.GE.N ) .OR. | ||||
| @@ -98,8 +98,9 @@ | |||||
| *> \param[out] E | *> \param[out] E | ||||
| *> \verbatim | *> \verbatim | ||||
| *> E is COMPLEX array, dimension (NMAX) | *> E is COMPLEX array, dimension (NMAX) | ||||
| *> \param[out] AINV | |||||
| *> \endverbatim | |||||
| *> | *> | ||||
| *> \param[out] AINV | |||||
| *> \verbatim | *> \verbatim | ||||
| *> AINV is COMPLEX array, dimension (NMAX*NMAX) | *> AINV is COMPLEX array, dimension (NMAX*NMAX) | ||||
| *> \endverbatim | *> \endverbatim | ||||
| @@ -0,0 +1,164 @@ | |||||
| *> \brief \b CERRUNHR_COL | |||||
| * | |||||
| * =========== DOCUMENTATION =========== | |||||
| * | |||||
| * Online html documentation available at | |||||
| * http://www.netlib.org/lapack/explore-html/ | |||||
| * | |||||
| * Definition: | |||||
| * =========== | |||||
| * | |||||
| * SUBROUTINE CERRUNHR_COL( PATH, NUNIT ) | |||||
| * | |||||
| * .. Scalar Arguments .. | |||||
| * CHARACTER*3 PATH | |||||
| * INTEGER NUNIT | |||||
| * .. | |||||
| * | |||||
| * | |||||
| *> \par Purpose: | |||||
| * ============= | |||||
| *> | |||||
| *> \verbatim | |||||
| *> | |||||
| *> CERRUNHR_COL tests the error exits for CUNHR_COL that does | |||||
| *> Householder reconstruction from the ouput of tall-skinny | |||||
| *> factorization CLATSQR. | |||||
| *> \endverbatim | |||||
| * | |||||
| * Arguments: | |||||
| * ========== | |||||
| * | |||||
| *> \param[in] PATH | |||||
| *> \verbatim | |||||
| *> PATH is CHARACTER*3 | |||||
| *> The LAPACK path name for the routines to be tested. | |||||
| *> \endverbatim | |||||
| *> | |||||
| *> \param[in] NUNIT | |||||
| *> \verbatim | |||||
| *> NUNIT is INTEGER | |||||
| *> The unit number for output. | |||||
| *> \endverbatim | |||||
| * | |||||
| * Authors: | |||||
| * ======== | |||||
| * | |||||
| *> \author Univ. of Tennessee | |||||
| *> \author Univ. of California Berkeley | |||||
| *> \author Univ. of Colorado Denver | |||||
| *> \author NAG Ltd. | |||||
| * | |||||
| *> \date November 2019 | |||||
| * | |||||
| *> \ingroup complex_lin | |||||
| * | |||||
| * ===================================================================== | |||||
| SUBROUTINE CERRUNHR_COL( PATH, NUNIT ) | |||||
| IMPLICIT NONE | |||||
| * | |||||
| * -- LAPACK test routine (version 3.9.0) -- | |||||
| * -- LAPACK is a software package provided by Univ. of Tennessee, -- | |||||
| * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- | |||||
| * November 2019 | |||||
| * | |||||
| * .. Scalar Arguments .. | |||||
| CHARACTER(LEN=3) PATH | |||||
| INTEGER NUNIT | |||||
| * .. | |||||
| * | |||||
| * ===================================================================== | |||||
| * | |||||
| * .. Parameters .. | |||||
| INTEGER NMAX | |||||
| PARAMETER ( NMAX = 2 ) | |||||
| * .. | |||||
| * .. Local Scalars .. | |||||
| INTEGER I, INFO, J | |||||
| * .. | |||||
| * .. Local Arrays .. | |||||
| COMPLEX A( NMAX, NMAX ), T( NMAX, NMAX ), D(NMAX) | |||||
| * .. | |||||
| * .. External Subroutines .. | |||||
| EXTERNAL ALAESM, CHKXER, CUNHR_COL | |||||
| * .. | |||||
| * .. Scalars in Common .. | |||||
| LOGICAL LERR, OK | |||||
| CHARACTER(LEN=32) SRNAMT | |||||
| INTEGER INFOT, NOUT | |||||
| * .. | |||||
| * .. Common blocks .. | |||||
| COMMON / INFOC / INFOT, NOUT, OK, LERR | |||||
| COMMON / SRNAMC / SRNAMT | |||||
| * .. | |||||
| * .. Intrinsic Functions .. | |||||
| INTRINSIC REAL, CMPLX | |||||
| * .. | |||||
| * .. Executable Statements .. | |||||
| * | |||||
| NOUT = NUNIT | |||||
| WRITE( NOUT, FMT = * ) | |||||
| * | |||||
| * Set the variables to innocuous values. | |||||
| * | |||||
| DO J = 1, NMAX | |||||
| DO I = 1, NMAX | |||||
| A( I, J ) = CMPLX( 1.E+0 / REAL( I+J ) ) | |||||
| T( I, J ) = CMPLX( 1.E+0 / REAL( I+J ) ) | |||||
| END DO | |||||
| D( J ) = ( 0.E+0, 0.E+0 ) | |||||
| END DO | |||||
| OK = .TRUE. | |||||
| * | |||||
| * Error exits for Householder reconstruction | |||||
| * | |||||
| * CUNHR_COL | |||||
| * | |||||
| SRNAMT = 'CUNHR_COL' | |||||
| * | |||||
| INFOT = 1 | |||||
| CALL CUNHR_COL( -1, 0, 1, A, 1, T, 1, D, INFO ) | |||||
| CALL CHKXER( 'CUNHR_COL', INFOT, NOUT, LERR, OK ) | |||||
| * | |||||
| INFOT = 2 | |||||
| CALL CUNHR_COL( 0, -1, 1, A, 1, T, 1, D, INFO ) | |||||
| CALL CHKXER( 'CUNHR_COL', INFOT, NOUT, LERR, OK ) | |||||
| CALL CUNHR_COL( 1, 2, 1, A, 1, T, 1, D, INFO ) | |||||
| CALL CHKXER( 'CUNHR_COL', INFOT, NOUT, LERR, OK ) | |||||
| * | |||||
| INFOT = 3 | |||||
| CALL CUNHR_COL( 0, 0, -1, A, 1, T, 1, D, INFO ) | |||||
| CALL CHKXER( 'CUNHR_COL', INFOT, NOUT, LERR, OK ) | |||||
| * | |||||
| CALL CUNHR_COL( 0, 0, 0, A, 1, T, 1, D, INFO ) | |||||
| CALL CHKXER( 'CUNHR_COL', INFOT, NOUT, LERR, OK ) | |||||
| * | |||||
| INFOT = 5 | |||||
| CALL CUNHR_COL( 0, 0, 1, A, -1, T, 1, D, INFO ) | |||||
| CALL CHKXER( 'CUNHR_COL', INFOT, NOUT, LERR, OK ) | |||||
| * | |||||
| CALL CUNHR_COL( 0, 0, 1, A, 0, T, 1, D, INFO ) | |||||
| CALL CHKXER( 'CUNHR_COL', INFOT, NOUT, LERR, OK ) | |||||
| * | |||||
| CALL CUNHR_COL( 2, 0, 1, A, 1, T, 1, D, INFO ) | |||||
| CALL CHKXER( 'CUNHR_COL', INFOT, NOUT, LERR, OK ) | |||||
| * | |||||
| INFOT = 7 | |||||
| CALL CUNHR_COL( 0, 0, 1, A, 1, T, -1, D, INFO ) | |||||
| CALL CHKXER( 'CUNHR_COL', INFOT, NOUT, LERR, OK ) | |||||
| * | |||||
| CALL CUNHR_COL( 0, 0, 1, A, 1, T, 0, D, INFO ) | |||||
| CALL CHKXER( 'CUNHR_COL', INFOT, NOUT, LERR, OK ) | |||||
| * | |||||
| CALL CUNHR_COL( 4, 3, 2, A, 4, T, 1, D, INFO ) | |||||
| CALL CHKXER( 'CUNHR_COL', INFOT, NOUT, LERR, OK ) | |||||
| * | |||||
| * Print a summary line. | |||||
| * | |||||
| CALL ALAESM( PATH, OK, NOUT ) | |||||
| * | |||||
| RETURN | |||||
| * | |||||
| * End of CERRUNHR_COL | |||||
| * | |||||
| END | |||||
| @@ -739,7 +739,7 @@ | |||||
| $ W, 1, INFO ) | $ W, 1, INFO ) | ||||
| CALL CHKXER( 'CHESV_AA_2STAGE', INFOT, NOUT, LERR, OK ) | CALL CHKXER( 'CHESV_AA_2STAGE', INFOT, NOUT, LERR, OK ) | ||||
| INFOT = 11 | INFOT = 11 | ||||
| CALL CHESV_AA_2STAGE( 'U', 2, 1, A, 2, A, 2, IP, IP, B, 1, | |||||
| CALL CHESV_AA_2STAGE( 'U', 2, 1, A, 2, A, 8, IP, IP, B, 1, | |||||
| $ W, 1, INFO ) | $ W, 1, INFO ) | ||||
| CALL CHKXER( 'CHESV_AA_2STAGE', INFOT, NOUT, LERR, OK ) | CALL CHKXER( 'CHESV_AA_2STAGE', INFOT, NOUT, LERR, OK ) | ||||
| INFOT = 7 | INFOT = 7 | ||||
| @@ -769,7 +769,7 @@ | |||||
| $ W, 1, INFO ) | $ W, 1, INFO ) | ||||
| CALL CHKXER( 'CSYSV_AA_2STAGE', INFOT, NOUT, LERR, OK ) | CALL CHKXER( 'CSYSV_AA_2STAGE', INFOT, NOUT, LERR, OK ) | ||||
| INFOT = 11 | INFOT = 11 | ||||
| CALL CSYSV_AA_2STAGE( 'U', 2, 1, A, 2, A, 2, IP, IP, B, 1, | |||||
| CALL CSYSV_AA_2STAGE( 'U', 2, 1, A, 2, A, 8, IP, IP, B, 1, | |||||
| $ W, 1, INFO ) | $ W, 1, INFO ) | ||||
| CALL CHKXER( 'CSYSV_AA_2STAGE', INFOT, NOUT, LERR, OK ) | CALL CHKXER( 'CSYSV_AA_2STAGE', INFOT, NOUT, LERR, OK ) | ||||
| INFOT = 7 | INFOT = 7 | ||||
| @@ -164,7 +164,7 @@ | |||||
| INTEGER NMAX_EXACT, NMAX_APPROX, SIZE_D | INTEGER NMAX_EXACT, NMAX_APPROX, SIZE_D | ||||
| PARAMETER (NMAX_EXACT = 6, NMAX_APPROX = 11, SIZE_D = 8) | PARAMETER (NMAX_EXACT = 6, NMAX_APPROX = 11, SIZE_D = 8) | ||||
| * | * | ||||
| * d's are generated from random permuation of those eight elements. | |||||
| * d's are generated from random permutation of those eight elements. | |||||
| COMPLEX D1(8), D2(8), INVD1(8), INVD2(8) | COMPLEX D1(8), D2(8), INVD1(8), INVD2(8) | ||||
| DATA D1 /(-1,0),(0,1),(-1,-1),(0,-1),(1,0),(-1,1),(1,1),(1,-1)/ | DATA D1 /(-1,0),(0,1),(-1,-1),(0,-1),(1,0),(-1,1),(1,1),(1,-1)/ | ||||
| DATA D2 /(-1,0),(0,-1),(-1,1),(0,1),(1,0),(-1,-1),(1,-1),(1,1)/ | DATA D2 /(-1,0),(0,-1),(-1,1),(0,1),(1,0),(-1,-1),(1,-1),(1,1)/ | ||||
| @@ -114,7 +114,7 @@ | |||||
| * .. | * .. | ||||
| * .. Local Arrays .. | * .. Local Arrays .. | ||||
| INTEGER ISEED( 4 ) | INTEGER ISEED( 4 ) | ||||
| COMPLEX TQUERY( 5 ), WORKQUERY | |||||
| COMPLEX TQUERY( 5 ), WORKQUERY( 1 ) | |||||
| * .. | * .. | ||||
| * .. External Functions .. | * .. External Functions .. | ||||
| REAL SLAMCH, CLANGE, CLANSY | REAL SLAMCH, CLANGE, CLANSY | ||||
| @@ -173,22 +173,22 @@ | |||||
| * | * | ||||
| CALL CGEQR( M, N, AF, M, TQUERY, -1, WORKQUERY, -1, INFO ) | CALL CGEQR( M, N, AF, M, TQUERY, -1, WORKQUERY, -1, INFO ) | ||||
| TSIZE = INT( TQUERY( 1 ) ) | TSIZE = INT( TQUERY( 1 ) ) | ||||
| LWORK = INT( WORKQUERY ) | |||||
| LWORK = INT( WORKQUERY( 1 ) ) | |||||
| CALL CGEMQR( 'L', 'N', M, M, K, AF, M, TQUERY, TSIZE, CF, M, | CALL CGEMQR( 'L', 'N', M, M, K, AF, M, TQUERY, TSIZE, CF, M, | ||||
| $ WORKQUERY, -1, INFO) | $ WORKQUERY, -1, INFO) | ||||
| LWORK = MAX( LWORK, INT( WORKQUERY ) ) | |||||
| LWORK = MAX( LWORK, INT( WORKQUERY( 1 ) ) ) | |||||
| CALL CGEMQR( 'L', 'N', M, N, K, AF, M, TQUERY, TSIZE, CF, M, | CALL CGEMQR( 'L', 'N', M, N, K, AF, M, TQUERY, TSIZE, CF, M, | ||||
| $ WORKQUERY, -1, INFO) | $ WORKQUERY, -1, INFO) | ||||
| LWORK = MAX( LWORK, INT( WORKQUERY ) ) | |||||
| LWORK = MAX( LWORK, INT( WORKQUERY( 1 ) ) ) | |||||
| CALL CGEMQR( 'L', 'C', M, N, K, AF, M, TQUERY, TSIZE, CF, M, | CALL CGEMQR( 'L', 'C', M, N, K, AF, M, TQUERY, TSIZE, CF, M, | ||||
| $ WORKQUERY, -1, INFO) | $ WORKQUERY, -1, INFO) | ||||
| LWORK = MAX( LWORK, INT( WORKQUERY ) ) | |||||
| LWORK = MAX( LWORK, INT( WORKQUERY( 1 ) ) ) | |||||
| CALL CGEMQR( 'R', 'N', N, M, K, AF, M, TQUERY, TSIZE, DF, N, | CALL CGEMQR( 'R', 'N', N, M, K, AF, M, TQUERY, TSIZE, DF, N, | ||||
| $ WORKQUERY, -1, INFO) | $ WORKQUERY, -1, INFO) | ||||
| LWORK = MAX( LWORK, INT( WORKQUERY ) ) | |||||
| LWORK = MAX( LWORK, INT( WORKQUERY( 1 ) ) ) | |||||
| CALL CGEMQR( 'R', 'C', N, M, K, AF, M, TQUERY, TSIZE, DF, N, | CALL CGEMQR( 'R', 'C', N, M, K, AF, M, TQUERY, TSIZE, DF, N, | ||||
| $ WORKQUERY, -1, INFO) | $ WORKQUERY, -1, INFO) | ||||
| LWORK = MAX( LWORK, INT( WORKQUERY ) ) | |||||
| LWORK = MAX( LWORK, INT( WORKQUERY( 1 ) ) ) | |||||
| ALLOCATE ( T( TSIZE ) ) | ALLOCATE ( T( TSIZE ) ) | ||||
| ALLOCATE ( WORK( LWORK ) ) | ALLOCATE ( WORK( LWORK ) ) | ||||
| srnamt = 'CGEQR' | srnamt = 'CGEQR' | ||||
| @@ -316,22 +316,22 @@ | |||||
| ELSE | ELSE | ||||
| CALL CGELQ( M, N, AF, M, TQUERY, -1, WORKQUERY, -1, INFO ) | CALL CGELQ( M, N, AF, M, TQUERY, -1, WORKQUERY, -1, INFO ) | ||||
| TSIZE = INT( TQUERY( 1 ) ) | TSIZE = INT( TQUERY( 1 ) ) | ||||
| LWORK = INT( WORKQUERY ) | |||||
| LWORK = INT( WORKQUERY( 1 ) ) | |||||
| CALL CGEMLQ( 'R', 'N', N, N, K, AF, M, TQUERY, TSIZE, Q, N, | CALL CGEMLQ( 'R', 'N', N, N, K, AF, M, TQUERY, TSIZE, Q, N, | ||||
| $ WORKQUERY, -1, INFO ) | $ WORKQUERY, -1, INFO ) | ||||
| LWORK = MAX( LWORK, INT( WORKQUERY ) ) | |||||
| LWORK = MAX( LWORK, INT( WORKQUERY( 1 ) ) ) | |||||
| CALL CGEMLQ( 'L', 'N', N, M, K, AF, M, TQUERY, TSIZE, DF, N, | CALL CGEMLQ( 'L', 'N', N, M, K, AF, M, TQUERY, TSIZE, DF, N, | ||||
| $ WORKQUERY, -1, INFO) | $ WORKQUERY, -1, INFO) | ||||
| LWORK = MAX( LWORK, INT( WORKQUERY ) ) | |||||
| LWORK = MAX( LWORK, INT( WORKQUERY( 1 ) ) ) | |||||
| CALL CGEMLQ( 'L', 'C', N, M, K, AF, M, TQUERY, TSIZE, DF, N, | CALL CGEMLQ( 'L', 'C', N, M, K, AF, M, TQUERY, TSIZE, DF, N, | ||||
| $ WORKQUERY, -1, INFO) | $ WORKQUERY, -1, INFO) | ||||
| LWORK = MAX( LWORK, INT( WORKQUERY ) ) | |||||
| LWORK = MAX( LWORK, INT( WORKQUERY( 1 ) ) ) | |||||
| CALL CGEMLQ( 'R', 'N', M, N, K, AF, M, TQUERY, TSIZE, CF, M, | CALL CGEMLQ( 'R', 'N', M, N, K, AF, M, TQUERY, TSIZE, CF, M, | ||||
| $ WORKQUERY, -1, INFO) | $ WORKQUERY, -1, INFO) | ||||
| LWORK = MAX( LWORK, INT( WORKQUERY ) ) | |||||
| LWORK = MAX( LWORK, INT( WORKQUERY( 1 ) ) ) | |||||
| CALL CGEMLQ( 'R', 'C', M, N, K, AF, M, TQUERY, TSIZE, CF, M, | CALL CGEMLQ( 'R', 'C', M, N, K, AF, M, TQUERY, TSIZE, CF, M, | ||||
| $ WORKQUERY, -1, INFO) | $ WORKQUERY, -1, INFO) | ||||
| LWORK = MAX( LWORK, INT( WORKQUERY ) ) | |||||
| LWORK = MAX( LWORK, INT( WORKQUERY( 1 ) ) ) | |||||
| ALLOCATE ( T( TSIZE ) ) | ALLOCATE ( T( TSIZE ) ) | ||||
| ALLOCATE ( WORK( LWORK ) ) | ALLOCATE ( WORK( LWORK ) ) | ||||
| srnamt = 'CGELQ' | srnamt = 'CGELQ' | ||||
| @@ -0,0 +1,390 @@ | |||||
| *> \brief \b CUNHR_COL01 | |||||
| * | |||||
| * =========== DOCUMENTATION =========== | |||||
| * | |||||
| * Online html documentation available at | |||||
| * http://www.netlib.org/lapack/explore-html/ | |||||
| * | |||||
| * Definition: | |||||
| * =========== | |||||
| * | |||||
| * SUBROUTINE CUNHR_COL01( M, N, MB1, NB1, NB2, RESULT ) | |||||
| * | |||||
| * .. Scalar Arguments .. | |||||
| * INTEGER M, N, MB1, NB1, NB2 | |||||
| * .. Return values .. | |||||
| * REAL RESULT(6) | |||||
| * | |||||
| * | |||||
| *> \par Purpose: | |||||
| * ============= | |||||
| *> | |||||
| *> \verbatim | |||||
| *> | |||||
| *> CUNHR_COL01 tests CUNHR_COL using CLATSQR, CGEMQRT and CUNGTSQR. | |||||
| *> Therefore, CLATSQR (part of CGEQR), CGEMQRT (part CGEMQR), CUNGTSQR | |||||
| *> have to be tested before this test. | |||||
| *> | |||||
| *> \endverbatim | |||||
| * | |||||
| * Arguments: | |||||
| * ========== | |||||
| * | |||||
| *> \param[in] M | |||||
| *> \verbatim | |||||
| *> M is INTEGER | |||||
| *> Number of rows in test matrix. | |||||
| *> \endverbatim | |||||
| *> \param[in] N | |||||
| *> \verbatim | |||||
| *> N is INTEGER | |||||
| *> Number of columns in test matrix. | |||||
| *> \endverbatim | |||||
| *> \param[in] MB1 | |||||
| *> \verbatim | |||||
| *> MB1 is INTEGER | |||||
| *> Number of row in row block in an input test matrix. | |||||
| *> \endverbatim | |||||
| *> | |||||
| *> \param[in] NB1 | |||||
| *> \verbatim | |||||
| *> NB1 is INTEGER | |||||
| *> Number of columns in column block an input test matrix. | |||||
| *> \endverbatim | |||||
| *> | |||||
| *> \param[in] NB2 | |||||
| *> \verbatim | |||||
| *> NB2 is INTEGER | |||||
| *> Number of columns in column block in an output test matrix. | |||||
| *> \endverbatim | |||||
| *> | |||||
| *> \param[out] RESULT | |||||
| *> \verbatim | |||||
| *> RESULT is REAL array, dimension (6) | |||||
| *> Results of each of the six tests below. | |||||
| *> ( C is a M-by-N random matrix, D is a N-by-M random matrix ) | |||||
| *> | |||||
| *> RESULT(1) = | A - Q * R | / (eps * m * |A|) | |||||
| *> RESULT(2) = | I - (Q**H) * Q | / (eps * m ) | |||||
| *> RESULT(3) = | Q * C - Q * C | / (eps * m * |C|) | |||||
| *> RESULT(4) = | (Q**H) * C - (Q**H) * C | / (eps * m * |C|) | |||||
| *> RESULT(5) = | (D * Q) - D * Q | / (eps * m * |D|) | |||||
| *> RESULT(6) = | D * (Q**H) - D * (Q**H) | / (eps * m * |D|) | |||||
| *> \endverbatim | |||||
| * | |||||
| * Authors: | |||||
| * ======== | |||||
| * | |||||
| *> \author Univ. of Tennessee | |||||
| *> \author Univ. of California Berkeley | |||||
| *> \author Univ. of Colorado Denver | |||||
| *> \author NAG Ltd. | |||||
| * | |||||
| *> \date November 2019 | |||||
| * | |||||
| *> \ingroup complex16_lin | |||||
| * | |||||
| * ===================================================================== | |||||
| SUBROUTINE CUNHR_COL01( M, N, MB1, NB1, NB2, RESULT ) | |||||
| IMPLICIT NONE | |||||
| * | |||||
| * -- LAPACK test routine (version 3.9.0) -- | |||||
| * -- LAPACK is a software package provided by Univ. of Tennessee, -- | |||||
| * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- | |||||
| * November 2019 | |||||
| * | |||||
| * .. Scalar Arguments .. | |||||
| INTEGER M, N, MB1, NB1, NB2 | |||||
| * .. Return values .. | |||||
| REAL RESULT(6) | |||||
| * | |||||
| * ===================================================================== | |||||
| * | |||||
| * .. | |||||
| * .. Local allocatable arrays | |||||
| COMPLEX, ALLOCATABLE :: A(:,:), AF(:,:), Q(:,:), R(:,:), | |||||
| $ WORK( : ), T1(:,:), T2(:,:), DIAG(:), | |||||
| $ C(:,:), CF(:,:), D(:,:), DF(:,:) | |||||
| REAL, ALLOCATABLE :: RWORK(:) | |||||
| * | |||||
| * .. Parameters .. | |||||
| REAL ZERO | |||||
| PARAMETER ( ZERO = 0.0E+0 ) | |||||
| COMPLEX CONE, CZERO | |||||
| PARAMETER ( CONE = ( 1.0E+0, 0.0E+0 ), | |||||
| $ CZERO = ( 0.0E+0, 0.0E+0 ) ) | |||||
| * .. | |||||
| * .. Local Scalars .. | |||||
| LOGICAL TESTZEROS | |||||
| INTEGER INFO, I, J, K, L, LWORK, NB1_UB, NB2_UB, NRB | |||||
| REAL ANORM, EPS, RESID, CNORM, DNORM | |||||
| * .. | |||||
| * .. Local Arrays .. | |||||
| INTEGER ISEED( 4 ) | |||||
| COMPLEX WORKQUERY( 1 ) | |||||
| * .. | |||||
| * .. External Functions .. | |||||
| REAL SLAMCH, CLANGE, CLANSY | |||||
| EXTERNAL SLAMCH, CLANGE, CLANSY | |||||
| * .. | |||||
| * .. External Subroutines .. | |||||
| EXTERNAL CLACPY, CLARNV, CLASET, CLATSQR, CUNHR_COL, | |||||
| $ CUNGTSQR, CSCAL, CGEMM, CGEMQRT, CHERK | |||||
| * .. | |||||
| * .. Intrinsic Functions .. | |||||
| INTRINSIC CEILING, REAL, MAX, MIN | |||||
| * .. | |||||
| * .. Scalars in Common .. | |||||
| CHARACTER(LEN=32) SRNAMT | |||||
| * .. | |||||
| * .. Common blocks .. | |||||
| COMMON / SRMNAMC / SRNAMT | |||||
| * .. | |||||
| * .. Data statements .. | |||||
| DATA ISEED / 1988, 1989, 1990, 1991 / | |||||
| * | |||||
| * TEST MATRICES WITH HALF OF MATRIX BEING ZEROS | |||||
| * | |||||
| TESTZEROS = .FALSE. | |||||
| * | |||||
| EPS = SLAMCH( 'Epsilon' ) | |||||
| K = MIN( M, N ) | |||||
| L = MAX( M, N, 1) | |||||
| * | |||||
| * Dynamically allocate local arrays | |||||
| * | |||||
| ALLOCATE ( A(M,N), AF(M,N), Q(L,L), R(M,L), RWORK(L), | |||||
| $ C(M,N), CF(M,N), | |||||
| $ D(N,M), DF(N,M) ) | |||||
| * | |||||
| * Put random numbers into A and copy to AF | |||||
| * | |||||
| DO J = 1, N | |||||
| CALL CLARNV( 2, ISEED, M, A( 1, J ) ) | |||||
| END DO | |||||
| IF( TESTZEROS ) THEN | |||||
| IF( M.GE.4 ) THEN | |||||
| DO J = 1, N | |||||
| CALL CLARNV( 2, ISEED, M/2, A( M/4, J ) ) | |||||
| END DO | |||||
| END IF | |||||
| END IF | |||||
| CALL CLACPY( 'Full', M, N, A, M, AF, M ) | |||||
| * | |||||
| * Number of row blocks in CLATSQR | |||||
| * | |||||
| NRB = MAX( 1, CEILING( REAL( M - N ) / REAL( MB1 - N ) ) ) | |||||
| * | |||||
| ALLOCATE ( T1( NB1, N * NRB ) ) | |||||
| ALLOCATE ( T2( NB2, N ) ) | |||||
| ALLOCATE ( DIAG( N ) ) | |||||
| * | |||||
| * Begin determine LWORK for the array WORK and allocate memory. | |||||
| * | |||||
| * CLATSQR requires NB1 to be bounded by N. | |||||
| * | |||||
| NB1_UB = MIN( NB1, N) | |||||
| * | |||||
| * CGEMQRT requires NB2 to be bounded by N. | |||||
| * | |||||
| NB2_UB = MIN( NB2, N) | |||||
| * | |||||
| CALL CLATSQR( M, N, MB1, NB1_UB, AF, M, T1, NB1, | |||||
| $ WORKQUERY, -1, INFO ) | |||||
| LWORK = INT( WORKQUERY( 1 ) ) | |||||
| CALL CUNGTSQR( M, N, MB1, NB1, AF, M, T1, NB1, WORKQUERY, -1, | |||||
| $ INFO ) | |||||
| LWORK = MAX( LWORK, INT( WORKQUERY( 1 ) ) ) | |||||
| * | |||||
| * In CGEMQRT, WORK is N*NB2_UB if SIDE = 'L', | |||||
| * or M*NB2_UB if SIDE = 'R'. | |||||
| * | |||||
| LWORK = MAX( LWORK, NB2_UB * N, NB2_UB * M ) | |||||
| * | |||||
| ALLOCATE ( WORK( LWORK ) ) | |||||
| * | |||||
| * End allocate memory for WORK. | |||||
| * | |||||
| * | |||||
| * Begin Householder reconstruction routines | |||||
| * | |||||
| * Factor the matrix A in the array AF. | |||||
| * | |||||
| SRNAMT = 'CLATSQR' | |||||
| CALL CLATSQR( M, N, MB1, NB1_UB, AF, M, T1, NB1, WORK, LWORK, | |||||
| $ INFO ) | |||||
| * | |||||
| * Copy the factor R into the array R. | |||||
| * | |||||
| SRNAMT = 'CLACPY' | |||||
| CALL CLACPY( 'U', M, N, AF, M, R, M ) | |||||
| * | |||||
| * Reconstruct the orthogonal matrix Q. | |||||
| * | |||||
| SRNAMT = 'CUNGTSQR' | |||||
| CALL CUNGTSQR( M, N, MB1, NB1, AF, M, T1, NB1, WORK, LWORK, | |||||
| $ INFO ) | |||||
| * | |||||
| * Perform the Householder reconstruction, the result is stored | |||||
| * the arrays AF and T2. | |||||
| * | |||||
| SRNAMT = 'CUNHR_COL' | |||||
| CALL CUNHR_COL( M, N, NB2, AF, M, T2, NB2, DIAG, INFO ) | |||||
| * | |||||
| * Compute the factor R_hr corresponding to the Householder | |||||
| * reconstructed Q_hr and place it in the upper triangle of AF to | |||||
| * match the Q storage format in CGEQRT. R_hr = R_tsqr * S, | |||||
| * this means changing the sign of I-th row of the matrix R_tsqr | |||||
| * according to sign of of I-th diagonal element DIAG(I) of the | |||||
| * matrix S. | |||||
| * | |||||
| SRNAMT = 'CLACPY' | |||||
| CALL CLACPY( 'U', M, N, R, M, AF, M ) | |||||
| * | |||||
| DO I = 1, N | |||||
| IF( DIAG( I ).EQ.-CONE ) THEN | |||||
| CALL CSCAL( N+1-I, -CONE, AF( I, I ), M ) | |||||
| END IF | |||||
| END DO | |||||
| * | |||||
| * End Householder reconstruction routines. | |||||
| * | |||||
| * | |||||
| * Generate the m-by-m matrix Q | |||||
| * | |||||
| CALL CLASET( 'Full', M, M, CZERO, CONE, Q, M ) | |||||
| * | |||||
| SRNAMT = 'CGEMQRT' | |||||
| CALL CGEMQRT( 'L', 'N', M, M, K, NB2_UB, AF, M, T2, NB2, Q, M, | |||||
| $ WORK, INFO ) | |||||
| * | |||||
| * Copy R | |||||
| * | |||||
| CALL CLASET( 'Full', M, N, CZERO, CZERO, R, M ) | |||||
| * | |||||
| CALL CLACPY( 'Upper', M, N, AF, M, R, M ) | |||||
| * | |||||
| * TEST 1 | |||||
| * Compute |R - (Q**H)*A| / ( eps * m * |A| ) and store in RESULT(1) | |||||
| * | |||||
| CALL CGEMM( 'C', 'N', M, N, M, -CONE, Q, M, A, M, CONE, R, M ) | |||||
| * | |||||
| ANORM = CLANGE( '1', M, N, A, M, RWORK ) | |||||
| RESID = CLANGE( '1', M, N, R, M, RWORK ) | |||||
| IF( ANORM.GT.ZERO ) THEN | |||||
| RESULT( 1 ) = RESID / ( EPS * MAX( 1, M ) * ANORM ) | |||||
| ELSE | |||||
| RESULT( 1 ) = ZERO | |||||
| END IF | |||||
| * | |||||
| * TEST 2 | |||||
| * Compute |I - (Q**H)*Q| / ( eps * m ) and store in RESULT(2) | |||||
| * | |||||
| CALL CLASET( 'Full', M, M, CZERO, CONE, R, M ) | |||||
| CALL CHERK( 'U', 'C', M, M, -CONE, Q, M, CONE, R, M ) | |||||
| RESID = CLANSY( '1', 'Upper', M, R, M, RWORK ) | |||||
| RESULT( 2 ) = RESID / ( EPS * MAX( 1, M ) ) | |||||
| * | |||||
| * Generate random m-by-n matrix C | |||||
| * | |||||
| DO J = 1, N | |||||
| CALL CLARNV( 2, ISEED, M, C( 1, J ) ) | |||||
| END DO | |||||
| CNORM = CLANGE( '1', M, N, C, M, RWORK ) | |||||
| CALL CLACPY( 'Full', M, N, C, M, CF, M ) | |||||
| * | |||||
| * Apply Q to C as Q*C = CF | |||||
| * | |||||
| SRNAMT = 'CGEMQRT' | |||||
| CALL CGEMQRT( 'L', 'N', M, N, K, NB2_UB, AF, M, T2, NB2, CF, M, | |||||
| $ WORK, INFO ) | |||||
| * | |||||
| * TEST 3 | |||||
| * Compute |CF - Q*C| / ( eps * m * |C| ) | |||||
| * | |||||
| CALL CGEMM( 'N', 'N', M, N, M, -CONE, Q, M, C, M, CONE, CF, M ) | |||||
| RESID = CLANGE( '1', M, N, CF, M, RWORK ) | |||||
| IF( CNORM.GT.ZERO ) THEN | |||||
| RESULT( 3 ) = RESID / ( EPS * MAX( 1, M ) * CNORM ) | |||||
| ELSE | |||||
| RESULT( 3 ) = ZERO | |||||
| END IF | |||||
| * | |||||
| * Copy C into CF again | |||||
| * | |||||
| CALL CLACPY( 'Full', M, N, C, M, CF, M ) | |||||
| * | |||||
| * Apply Q to C as (Q**H)*C = CF | |||||
| * | |||||
| SRNAMT = 'CGEMQRT' | |||||
| CALL CGEMQRT( 'L', 'C', M, N, K, NB2_UB, AF, M, T2, NB2, CF, M, | |||||
| $ WORK, INFO ) | |||||
| * | |||||
| * TEST 4 | |||||
| * Compute |CF - (Q**H)*C| / ( eps * m * |C|) | |||||
| * | |||||
| CALL CGEMM( 'C', 'N', M, N, M, -CONE, Q, M, C, M, CONE, CF, M ) | |||||
| RESID = CLANGE( '1', M, N, CF, M, RWORK ) | |||||
| IF( CNORM.GT.ZERO ) THEN | |||||
| RESULT( 4 ) = RESID / ( EPS * MAX( 1, M ) * CNORM ) | |||||
| ELSE | |||||
| RESULT( 4 ) = ZERO | |||||
| END IF | |||||
| * | |||||
| * Generate random n-by-m matrix D and a copy DF | |||||
| * | |||||
| DO J = 1, M | |||||
| CALL CLARNV( 2, ISEED, N, D( 1, J ) ) | |||||
| END DO | |||||
| DNORM = CLANGE( '1', N, M, D, N, RWORK ) | |||||
| CALL CLACPY( 'Full', N, M, D, N, DF, N ) | |||||
| * | |||||
| * Apply Q to D as D*Q = DF | |||||
| * | |||||
| SRNAMT = 'CGEMQRT' | |||||
| CALL CGEMQRT( 'R', 'N', N, M, K, NB2_UB, AF, M, T2, NB2, DF, N, | |||||
| $ WORK, INFO ) | |||||
| * | |||||
| * TEST 5 | |||||
| * Compute |DF - D*Q| / ( eps * m * |D| ) | |||||
| * | |||||
| CALL CGEMM( 'N', 'N', N, M, M, -CONE, D, N, Q, M, CONE, DF, N ) | |||||
| RESID = CLANGE( '1', N, M, DF, N, RWORK ) | |||||
| IF( DNORM.GT.ZERO ) THEN | |||||
| RESULT( 5 ) = RESID / ( EPS * MAX( 1, M ) * DNORM ) | |||||
| ELSE | |||||
| RESULT( 5 ) = ZERO | |||||
| END IF | |||||
| * | |||||
| * Copy D into DF again | |||||
| * | |||||
| CALL CLACPY( 'Full', N, M, D, N, DF, N ) | |||||
| * | |||||
| * Apply Q to D as D*QT = DF | |||||
| * | |||||
| SRNAMT = 'CGEMQRT' | |||||
| CALL CGEMQRT( 'R', 'C', N, M, K, NB2_UB, AF, M, T2, NB2, DF, N, | |||||
| $ WORK, INFO ) | |||||
| * | |||||
| * TEST 6 | |||||
| * Compute |DF - D*(Q**H)| / ( eps * m * |D| ) | |||||
| * | |||||
| CALL CGEMM( 'N', 'C', N, M, M, -CONE, D, N, Q, M, CONE, DF, N ) | |||||
| RESID = CLANGE( '1', N, M, DF, N, RWORK ) | |||||
| IF( DNORM.GT.ZERO ) THEN | |||||
| RESULT( 6 ) = RESID / ( EPS * MAX( 1, M ) * DNORM ) | |||||
| ELSE | |||||
| RESULT( 6 ) = ZERO | |||||
| END IF | |||||
| * | |||||
| * Deallocate all arrays | |||||
| * | |||||
| DEALLOCATE ( A, AF, Q, R, RWORK, WORK, T1, T2, DIAG, | |||||
| $ C, D, CF, DF ) | |||||
| * | |||||
| RETURN | |||||
| * | |||||
| * End of CUNHR_COL01 | |||||
| * | |||||
| END | |||||
| @@ -68,6 +68,10 @@ | |||||
| *> DEQ | *> DEQ | ||||
| *> DQT | *> DQT | ||||
| *> DQX | *> DQX | ||||
| *> DTQ | |||||
| *> DXQ | |||||
| *> DTS | |||||
| *> DHH | |||||
| *> \endverbatim | *> \endverbatim | ||||
| * | * | ||||
| * Parameters: | * Parameters: | ||||
| @@ -102,17 +106,17 @@ | |||||
| *> \author Univ. of Colorado Denver | *> \author Univ. of Colorado Denver | ||||
| *> \author NAG Ltd. | *> \author NAG Ltd. | ||||
| * | * | ||||
| *> \date April 2012 | |||||
| *> \date November 2019 | |||||
| * | * | ||||
| *> \ingroup double_lin | *> \ingroup double_lin | ||||
| * | * | ||||
| * ===================================================================== | * ===================================================================== | ||||
| PROGRAM DCHKAA | PROGRAM DCHKAA | ||||
| * | * | ||||
| * -- LAPACK test routine (version 3.8.0) -- | |||||
| * -- LAPACK test routine (version 3.9.0) -- | |||||
| * -- LAPACK is a software package provided by Univ. of Tennessee, -- | * -- LAPACK is a software package provided by Univ. of Tennessee, -- | ||||
| * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- | * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- | ||||
| * April 2012 | |||||
| * Novemebr 2019 | |||||
| * | * | ||||
| * ===================================================================== | * ===================================================================== | ||||
| * | * | ||||
| @@ -159,15 +163,14 @@ | |||||
| * .. | * .. | ||||
| * .. External Subroutines .. | * .. External Subroutines .. | ||||
| EXTERNAL ALAREQ, DCHKEQ, DCHKGB, DCHKGE, DCHKGT, DCHKLQ, | EXTERNAL ALAREQ, DCHKEQ, DCHKGB, DCHKGE, DCHKGT, DCHKLQ, | ||||
| $ DCHKPB, DCHKPO, DCHKPS, DCHKPP, DCHKPT, DCHKQ3, | |||||
| $ DCHKQL, DCHKQR, DCHKRQ, DCHKSP, DCHKSY, | |||||
| $ DCHKSY_ROOK, DCHKSY_RK, DCHKSY_AA, DCHKTB, | |||||
| $ DCHKTP, DCHKTR, DCHKTZ, DDRVGB, DDRVGE, | |||||
| $ DDRVGT, DDRVLS, DDRVPB, DDRVPO, DDRVPP, | |||||
| $ DDRVPT, DDRVSP, DDRVSY, DDRVSY_ROOK, DDRVSY_RK, | |||||
| $ DDRVSY_AA, ILAVER, DCHKQRT, | |||||
| $ DCHKQRTP, DCHKLQTP, DCHKTSQR, DCHKLQT | |||||
| $ DCHKORHR_COL, DCHKPB, DCHKPO, DCHKPS, DCHKPP, | |||||
| $ DCHKPT, DCHKQ3, DCHKQL, DCHKQR, DCHKRQ, DCHKSP, | |||||
| $ DCHKSY, DCHKSY_ROOK, DCHKSY_RK, DCHKSY_AA, | |||||
| $ DCHKTB, DCHKTP, DCHKTR, DCHKTZ, DDRVGB, DDRVGE, | |||||
| $ DDRVGT, DDRVLS, DDRVPB, DDRVPO, DDRVPP, DDRVPT, | |||||
| $ DDRVSP, DDRVSY, DDRVSY_ROOK, DDRVSY_RK, | |||||
| $ DDRVSY_AA, ILAVER, DCHKLQTP, DCHKQRT, DCHKQRTP, | |||||
| $ DCHKLQT,DCHKTSQR | |||||
| * .. | * .. | ||||
| * .. Scalars in Common .. | * .. Scalars in Common .. | ||||
| LOGICAL LERR, OK | LOGICAL LERR, OK | ||||
| @@ -1007,8 +1010,20 @@ | |||||
| ELSE | ELSE | ||||
| WRITE( NOUT, FMT = 9989 )PATH | WRITE( NOUT, FMT = 9989 )PATH | ||||
| END IF | END IF | ||||
| * | |||||
| ELSE IF( LSAMEN( 2, C2, 'HH' ) ) THEN | |||||
| * | |||||
| * HH: Householder reconstruction for tall-skinny matrices | |||||
| * | |||||
| IF( TSTCHK ) THEN | |||||
| CALL DCHKORHR_COL( THRESH, TSTERR, NM, MVAL, NN, NVAL, NNB, | |||||
| $ NBVAL, NOUT ) | |||||
| ELSE | |||||
| WRITE( NOUT, FMT = 9989 ) PATH | |||||
| END IF | |||||
| * | * | ||||
| ELSE | ELSE | ||||
| * | * | ||||
| WRITE( NOUT, FMT = 9990 )PATH | WRITE( NOUT, FMT = 9990 )PATH | ||||
| END IF | END IF | ||||
| @@ -0,0 +1,239 @@ | |||||
| *> \brief \b DCHKORHR_COL | |||||
| * | |||||
| * =========== DOCUMENTATION =========== | |||||
| * | |||||
| * Online html documentation available at | |||||
| * http://www.netlib.org/lapack/explore-html/ | |||||
| * | |||||
| * Definition: | |||||
| * =========== | |||||
| * | |||||
| * SUBROUTINE DCHKORHR_COL( THRESH, TSTERR, NM, MVAL, NN, NVAL, NNB, | |||||
| * NBVAL, NOUT ) | |||||
| * | |||||
| * .. Scalar Arguments .. | |||||
| * LOGICAL TSTERR | |||||
| * INTEGER NM, NN, NNB, NOUT | |||||
| * DOUBLE PRECISION THRESH | |||||
| * .. | |||||
| * .. Array Arguments .. | |||||
| * INTEGER MVAL( * ), NBVAL( * ), NVAL( * ) | |||||
| * | |||||
| *> \par Purpose: | |||||
| * ============= | |||||
| *> | |||||
| *> \verbatim | |||||
| *> | |||||
| *> DCHKORHR_COL tests DORHR_COL using DLATSQR and DGEMQRT. Therefore, DLATSQR | |||||
| *> (used in DGEQR) and DGEMQRT (used in DGEMQR) have to be tested | |||||
| *> before this test. | |||||
| *> | |||||
| *> \endverbatim | |||||
| * | |||||
| * Arguments: | |||||
| * ========== | |||||
| * | |||||
| *> \param[in] THRESH | |||||
| *> \verbatim | |||||
| *> THRESH is DOUBLE PRECISION | |||||
| *> The threshold value for the test ratios. A result is | |||||
| *> included in the output file if RESULT >= THRESH. To have | |||||
| *> every test ratio printed, use THRESH = 0. | |||||
| *> \endverbatim | |||||
| *> | |||||
| *> \param[in] TSTERR | |||||
| *> \verbatim | |||||
| *> TSTERR is LOGICAL | |||||
| *> Flag that indicates whether error exits are to be tested. | |||||
| *> \endverbatim | |||||
| *> | |||||
| *> \param[in] NM | |||||
| *> \verbatim | |||||
| *> NM is INTEGER | |||||
| *> The number of values of M contained in the vector MVAL. | |||||
| *> \endverbatim | |||||
| *> | |||||
| *> \param[in] MVAL | |||||
| *> \verbatim | |||||
| *> MVAL is INTEGER array, dimension (NM) | |||||
| *> The values of the matrix row dimension M. | |||||
| *> \endverbatim | |||||
| *> | |||||
| *> \param[in] NN | |||||
| *> \verbatim | |||||
| *> NN is INTEGER | |||||
| *> The number of values of N contained in the vector NVAL. | |||||
| *> \endverbatim | |||||
| *> | |||||
| *> \param[in] NVAL | |||||
| *> \verbatim | |||||
| *> NVAL is INTEGER array, dimension (NN) | |||||
| *> The values of the matrix column dimension N. | |||||
| *> \endverbatim | |||||
| *> | |||||
| *> \param[in] NNB | |||||
| *> \verbatim | |||||
| *> NNB is INTEGER | |||||
| *> The number of values of NB contained in the vector NBVAL. | |||||
| *> \endverbatim | |||||
| *> | |||||
| *> \param[in] NBVAL | |||||
| *> \verbatim | |||||
| *> NBVAL is INTEGER array, dimension (NBVAL) | |||||
| *> The values of the blocksize NB. | |||||
| *> \endverbatim | |||||
| *> | |||||
| *> \param[in] NOUT | |||||
| *> \verbatim | |||||
| *> NOUT is INTEGER | |||||
| *> The unit number for output. | |||||
| *> \endverbatim | |||||
| * | |||||
| * Authors: | |||||
| * ======== | |||||
| * | |||||
| *> \author Univ. of Tennessee | |||||
| *> \author Univ. of California Berkeley | |||||
| *> \author Univ. of Colorado Denver | |||||
| *> \author NAG Ltd. | |||||
| * | |||||
| *> \date November 2019 | |||||
| * | |||||
| *> \ingroup double_lin | |||||
| * | |||||
| * ===================================================================== | |||||
| SUBROUTINE DCHKORHR_COL( THRESH, TSTERR, NM, MVAL, NN, NVAL, NNB, | |||||
| $ NBVAL, NOUT ) | |||||
| IMPLICIT NONE | |||||
| * | |||||
| * -- LAPACK test routine (version 3.7.0) -- | |||||
| * -- LAPACK is a software package provided by Univ. of Tennessee, -- | |||||
| * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- | |||||
| * December 2016 | |||||
| * | |||||
| * .. Scalar Arguments .. | |||||
| LOGICAL TSTERR | |||||
| INTEGER NM, NN, NNB, NOUT | |||||
| DOUBLE PRECISION THRESH | |||||
| * .. | |||||
| * .. Array Arguments .. | |||||
| INTEGER MVAL( * ), NBVAL( * ), NVAL( * ) | |||||
| * .. | |||||
| * | |||||
| * ===================================================================== | |||||
| * | |||||
| * .. Parameters .. | |||||
| INTEGER NTESTS | |||||
| PARAMETER ( NTESTS = 6 ) | |||||
| * .. | |||||
| * .. Local Scalars .. | |||||
| CHARACTER(LEN=3) PATH | |||||
| INTEGER I, IMB1, INB1, INB2, J, T, M, N, MB1, NB1, | |||||
| $ NB2, NFAIL, NERRS, NRUN | |||||
| * | |||||
| * .. Local Arrays .. | |||||
| DOUBLE PRECISION RESULT( NTESTS ) | |||||
| * .. | |||||
| * .. External Subroutines .. | |||||
| EXTERNAL ALAHD, ALASUM, DERRORHR_COL, DORHR_COL01 | |||||
| * .. | |||||
| * .. Intrinsic Functions .. | |||||
| INTRINSIC MAX, MIN | |||||
| * .. | |||||
| * .. Scalars in Common .. | |||||
| LOGICAL LERR, OK | |||||
| CHARACTER(LEN=32) SRNAMT | |||||
| INTEGER INFOT, NUNIT | |||||
| * .. | |||||
| * .. Common blocks .. | |||||
| COMMON / INFOC / INFOT, NUNIT, OK, LERR | |||||
| COMMON / SRNAMC / SRNAMT | |||||
| * .. | |||||
| * .. Executable Statements .. | |||||
| * | |||||
| * Initialize constants | |||||
| * | |||||
| PATH( 1: 1 ) = 'D' | |||||
| PATH( 2: 3 ) = 'HH' | |||||
| NRUN = 0 | |||||
| NFAIL = 0 | |||||
| NERRS = 0 | |||||
| * | |||||
| * Test the error exits | |||||
| * | |||||
| IF( TSTERR ) CALL DERRORHR_COL( PATH, NOUT ) | |||||
| INFOT = 0 | |||||
| * | |||||
| * Do for each value of M in MVAL. | |||||
| * | |||||
| DO I = 1, NM | |||||
| M = MVAL( I ) | |||||
| * | |||||
| * Do for each value of N in NVAL. | |||||
| * | |||||
| DO J = 1, NN | |||||
| N = NVAL( J ) | |||||
| * | |||||
| * Only for M >= N | |||||
| * | |||||
| IF ( MIN( M, N ).GT.0 .AND. M.GE.N ) THEN | |||||
| * | |||||
| * Do for each possible value of MB1 | |||||
| * | |||||
| DO IMB1 = 1, NNB | |||||
| MB1 = NBVAL( IMB1 ) | |||||
| * | |||||
| * Only for MB1 > N | |||||
| * | |||||
| IF ( MB1.GT.N ) THEN | |||||
| * | |||||
| * Do for each possible value of NB1 | |||||
| * | |||||
| DO INB1 = 1, NNB | |||||
| NB1 = NBVAL( INB1 ) | |||||
| * | |||||
| * Do for each possible value of NB2 | |||||
| * | |||||
| DO INB2 = 1, NNB | |||||
| NB2 = NBVAL( INB2 ) | |||||
| * | |||||
| IF( NB1.GT.0 .AND. NB2.GT.0 ) THEN | |||||
| * | |||||
| * Test DORHR_COL | |||||
| * | |||||
| CALL DORHR_COL01( M, N, MB1, NB1, NB2, | |||||
| $ RESULT ) | |||||
| * | |||||
| * Print information about the tests that did | |||||
| * not pass the threshold. | |||||
| * | |||||
| DO T = 1, NTESTS | |||||
| IF( RESULT( T ).GE.THRESH ) THEN | |||||
| IF( NFAIL.EQ.0 .AND. NERRS.EQ.0 ) | |||||
| $ CALL ALAHD( NOUT, PATH ) | |||||
| WRITE( NOUT, FMT = 9999 ) M, N, MB1, | |||||
| $ NB1, NB2, T, RESULT( T ) | |||||
| NFAIL = NFAIL + 1 | |||||
| END IF | |||||
| END DO | |||||
| NRUN = NRUN + NTESTS | |||||
| END IF | |||||
| END DO | |||||
| END DO | |||||
| END IF | |||||
| END DO | |||||
| END IF | |||||
| END DO | |||||
| END DO | |||||
| * | |||||
| * Print a summary of the results. | |||||
| * | |||||
| CALL ALASUM( PATH, NOUT, NFAIL, NRUN, NERRS ) | |||||
| * | |||||
| 9999 FORMAT( 'M=', I5, ', N=', I5, ', MB1=', I5, | |||||
| $ ', NB1=', I5, ', NB2=', I5,' test(', I2, ')=', G12.5 ) | |||||
| RETURN | |||||
| * | |||||
| * End of DCHKORHR_COL | |||||
| * | |||||
| END | |||||
| @@ -233,8 +233,8 @@ | |||||
| DOUBLE PRECISION EPS, NORMA, NORMB, RCOND | DOUBLE PRECISION EPS, NORMA, NORMB, RCOND | ||||
| * .. | * .. | ||||
| * .. Local Arrays .. | * .. Local Arrays .. | ||||
| INTEGER ISEED( 4 ), ISEEDY( 4 ), IWQ | |||||
| DOUBLE PRECISION RESULT( NTESTS ), WQ | |||||
| INTEGER ISEED( 4 ), ISEEDY( 4 ), IWQ( 1 ) | |||||
| DOUBLE PRECISION RESULT( NTESTS ), WQ( 1 ) | |||||
| * .. | * .. | ||||
| * .. Allocatable Arrays .. | * .. Allocatable Arrays .. | ||||
| DOUBLE PRECISION, ALLOCATABLE :: WORK (:) | DOUBLE PRECISION, ALLOCATABLE :: WORK (:) | ||||
| @@ -359,27 +359,27 @@ | |||||
| * Compute workspace needed for DGELS | * Compute workspace needed for DGELS | ||||
| CALL DGELS( TRANS, M, N, NRHS, A, LDA, | CALL DGELS( TRANS, M, N, NRHS, A, LDA, | ||||
| $ B, LDB, WQ, -1, INFO ) | $ B, LDB, WQ, -1, INFO ) | ||||
| LWORK_DGELS = INT ( WQ ) | |||||
| LWORK_DGELS = INT ( WQ ( 1 ) ) | |||||
| * Compute workspace needed for DGETSLS | * Compute workspace needed for DGETSLS | ||||
| CALL DGETSLS( TRANS, M, N, NRHS, A, LDA, | CALL DGETSLS( TRANS, M, N, NRHS, A, LDA, | ||||
| $ B, LDB, WQ, -1, INFO ) | $ B, LDB, WQ, -1, INFO ) | ||||
| LWORK_DGETSLS = INT( WQ ) | |||||
| LWORK_DGETSLS = INT( WQ ( 1 ) ) | |||||
| ENDDO | ENDDO | ||||
| END IF | END IF | ||||
| * Compute workspace needed for DGELSY | * Compute workspace needed for DGELSY | ||||
| CALL DGELSY( M, N, NRHS, A, LDA, B, LDB, IWQ, | CALL DGELSY( M, N, NRHS, A, LDA, B, LDB, IWQ, | ||||
| $ RCOND, CRANK, WQ, -1, INFO ) | $ RCOND, CRANK, WQ, -1, INFO ) | ||||
| LWORK_DGELSY = INT( WQ ) | |||||
| LWORK_DGELSY = INT( WQ ( 1 ) ) | |||||
| * Compute workspace needed for DGELSS | * Compute workspace needed for DGELSS | ||||
| CALL DGELSS( M, N, NRHS, A, LDA, B, LDB, S, | CALL DGELSS( M, N, NRHS, A, LDA, B, LDB, S, | ||||
| $ RCOND, CRANK, WQ, -1 , INFO ) | $ RCOND, CRANK, WQ, -1 , INFO ) | ||||
| LWORK_DGELSS = INT( WQ ) | |||||
| LWORK_DGELSS = INT( WQ ( 1 ) ) | |||||
| * Compute workspace needed for DGELSD | * Compute workspace needed for DGELSD | ||||
| CALL DGELSD( M, N, NRHS, A, LDA, B, LDB, S, | CALL DGELSD( M, N, NRHS, A, LDA, B, LDB, S, | ||||
| $ RCOND, CRANK, WQ, -1, IWQ, INFO ) | $ RCOND, CRANK, WQ, -1, IWQ, INFO ) | ||||
| LWORK_DGELSD = INT( WQ ) | |||||
| LWORK_DGELSD = INT( WQ ( 1 ) ) | |||||
| * Compute LIWORK workspace needed for DGELSY and DGELSD | * Compute LIWORK workspace needed for DGELSY and DGELSD | ||||
| LIWORK = MAX( LIWORK, N, IWQ ) | |||||
| LIWORK = MAX( LIWORK, N, IWQ( 1 ) ) | |||||
| * Compute LWORK workspace needed for all functions | * Compute LWORK workspace needed for all functions | ||||
| LWORK = MAX( LWORK, LWORK_DGELS, LWORK_DGETSLS, | LWORK = MAX( LWORK, LWORK_DGELS, LWORK_DGETSLS, | ||||
| $ LWORK_DGELSY, LWORK_DGELSS, | $ LWORK_DGELSY, LWORK_DGELSS, | ||||
| @@ -0,0 +1,164 @@ | |||||
| *> \brief \b DERRORHR_COL | |||||
| * | |||||
| * =========== DOCUMENTATION =========== | |||||
| * | |||||
| * Online html documentation available at | |||||
| * http://www.netlib.org/lapack/explore-html/ | |||||
| * | |||||
| * Definition: | |||||
| * =========== | |||||
| * | |||||
| * SUBROUTINE DERRORHR_COL( PATH, NUNIT ) | |||||
| * | |||||
| * .. Scalar Arguments .. | |||||
| * CHARACTER*3 PATH | |||||
| * INTEGER NUNIT | |||||
| * .. | |||||
| * | |||||
| * | |||||
| *> \par Purpose: | |||||
| * ============= | |||||
| *> | |||||
| *> \verbatim | |||||
| *> | |||||
| *> DERRORHR_COL tests the error exits for DORHR_COL that does | |||||
| *> Householder reconstruction from the ouput of tall-skinny | |||||
| *> factorization DLATSQR. | |||||
| *> \endverbatim | |||||
| * | |||||
| * Arguments: | |||||
| * ========== | |||||
| * | |||||
| *> \param[in] PATH | |||||
| *> \verbatim | |||||
| *> PATH is CHARACTER*3 | |||||
| *> The LAPACK path name for the routines to be tested. | |||||
| *> \endverbatim | |||||
| *> | |||||
| *> \param[in] NUNIT | |||||
| *> \verbatim | |||||
| *> NUNIT is INTEGER | |||||
| *> The unit number for output. | |||||
| *> \endverbatim | |||||
| * | |||||
| * Authors: | |||||
| * ======== | |||||
| * | |||||
| *> \author Univ. of Tennessee | |||||
| *> \author Univ. of California Berkeley | |||||
| *> \author Univ. of Colorado Denver | |||||
| *> \author NAG Ltd. | |||||
| * | |||||
| *> \date November 2019 | |||||
| * | |||||
| *> \ingroup double_lin | |||||
| * | |||||
| * ===================================================================== | |||||
| SUBROUTINE DERRORHR_COL( PATH, NUNIT ) | |||||
| IMPLICIT NONE | |||||
| * | |||||
| * -- LAPACK test routine (version 3.9.0) -- | |||||
| * -- LAPACK is a software package provided by Univ. of Tennessee, -- | |||||
| * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- | |||||
| * November 2019 | |||||
| * | |||||
| * .. Scalar Arguments .. | |||||
| CHARACTER(LEN=3) PATH | |||||
| INTEGER NUNIT | |||||
| * .. | |||||
| * | |||||
| * ===================================================================== | |||||
| * | |||||
| * .. Parameters .. | |||||
| INTEGER NMAX | |||||
| PARAMETER ( NMAX = 2 ) | |||||
| * .. | |||||
| * .. Local Scalars .. | |||||
| INTEGER I, INFO, J | |||||
| * .. | |||||
| * .. Local Arrays .. | |||||
| DOUBLE PRECISION A( NMAX, NMAX ), T( NMAX, NMAX ), D(NMAX) | |||||
| * .. | |||||
| * .. External Subroutines .. | |||||
| EXTERNAL ALAESM, CHKXER, DORHR_COL | |||||
| * .. | |||||
| * .. Scalars in Common .. | |||||
| LOGICAL LERR, OK | |||||
| CHARACTER(LEN=32) SRNAMT | |||||
| INTEGER INFOT, NOUT | |||||
| * .. | |||||
| * .. Common blocks .. | |||||
| COMMON / INFOC / INFOT, NOUT, OK, LERR | |||||
| COMMON / SRNAMC / SRNAMT | |||||
| * .. | |||||
| * .. Intrinsic Functions .. | |||||
| INTRINSIC DBLE | |||||
| * .. | |||||
| * .. Executable Statements .. | |||||
| * | |||||
| NOUT = NUNIT | |||||
| WRITE( NOUT, FMT = * ) | |||||
| * | |||||
| * Set the variables to innocuous values. | |||||
| * | |||||
| DO J = 1, NMAX | |||||
| DO I = 1, NMAX | |||||
| A( I, J ) = 1.D+0 / DBLE( I+J ) | |||||
| T( I, J ) = 1.D+0 / DBLE( I+J ) | |||||
| END DO | |||||
| D( J ) = 0.D+0 | |||||
| END DO | |||||
| OK = .TRUE. | |||||
| * | |||||
| * Error exits for Householder reconstruction | |||||
| * | |||||
| * DORHR_COL | |||||
| * | |||||
| SRNAMT = 'DORHR_COL' | |||||
| * | |||||
| INFOT = 1 | |||||
| CALL DORHR_COL( -1, 0, 1, A, 1, T, 1, D, INFO ) | |||||
| CALL CHKXER( 'DORHR_COL', INFOT, NOUT, LERR, OK ) | |||||
| * | |||||
| INFOT = 2 | |||||
| CALL DORHR_COL( 0, -1, 1, A, 1, T, 1, D, INFO ) | |||||
| CALL CHKXER( 'DORHR_COL', INFOT, NOUT, LERR, OK ) | |||||
| CALL DORHR_COL( 1, 2, 1, A, 1, T, 1, D, INFO ) | |||||
| CALL CHKXER( 'DORHR_COL', INFOT, NOUT, LERR, OK ) | |||||
| * | |||||
| INFOT = 3 | |||||
| CALL DORHR_COL( 0, 0, -1, A, 1, T, 1, D, INFO ) | |||||
| CALL CHKXER( 'DORHR_COL', INFOT, NOUT, LERR, OK ) | |||||
| * | |||||
| CALL DORHR_COL( 0, 0, 0, A, 1, T, 1, D, INFO ) | |||||
| CALL CHKXER( 'DORHR_COL', INFOT, NOUT, LERR, OK ) | |||||
| * | |||||
| INFOT = 5 | |||||
| CALL DORHR_COL( 0, 0, 1, A, -1, T, 1, D, INFO ) | |||||
| CALL CHKXER( 'DORHR_COL', INFOT, NOUT, LERR, OK ) | |||||
| * | |||||
| CALL DORHR_COL( 0, 0, 1, A, 0, T, 1, D, INFO ) | |||||
| CALL CHKXER( 'DORHR_COL', INFOT, NOUT, LERR, OK ) | |||||
| * | |||||
| CALL DORHR_COL( 2, 0, 1, A, 1, T, 1, D, INFO ) | |||||
| CALL CHKXER( 'DORHR_COL', INFOT, NOUT, LERR, OK ) | |||||
| * | |||||
| INFOT = 7 | |||||
| CALL DORHR_COL( 0, 0, 1, A, 1, T, -1, D, INFO ) | |||||
| CALL CHKXER( 'DORHR_COL', INFOT, NOUT, LERR, OK ) | |||||
| * | |||||
| CALL DORHR_COL( 0, 0, 1, A, 1, T, 0, D, INFO ) | |||||
| CALL CHKXER( 'DORHR_COL', INFOT, NOUT, LERR, OK ) | |||||
| * | |||||
| CALL DORHR_COL( 4, 3, 2, A, 4, T, 1, D, INFO ) | |||||
| CALL CHKXER( 'DORHR_COL', INFOT, NOUT, LERR, OK ) | |||||
| * | |||||
| * Print a summary line. | |||||
| * | |||||
| CALL ALAESM( PATH, OK, NOUT ) | |||||
| * | |||||
| RETURN | |||||
| * | |||||
| * End of DERRORHR_COL | |||||
| * | |||||
| END | |||||
| @@ -740,7 +740,7 @@ | |||||
| $ W, 1, INFO ) | $ W, 1, INFO ) | ||||
| CALL CHKXER( 'DSYSV_AA_2STAGE', INFOT, NOUT, LERR, OK ) | CALL CHKXER( 'DSYSV_AA_2STAGE', INFOT, NOUT, LERR, OK ) | ||||
| INFOT = 11 | INFOT = 11 | ||||
| CALL DSYSV_AA_2STAGE( 'U', 2, 1, A, 2, A, 2, IP, IP, B, 1, | |||||
| CALL DSYSV_AA_2STAGE( 'U', 2, 1, A, 2, A, 8, IP, IP, B, 1, | |||||
| $ W, 1, INFO ) | $ W, 1, INFO ) | ||||
| CALL CHKXER( 'DSYSV_AA_2STAGE', INFOT, NOUT, LERR, OK ) | CALL CHKXER( 'DSYSV_AA_2STAGE', INFOT, NOUT, LERR, OK ) | ||||
| INFOT = 7 | INFOT = 7 | ||||
| @@ -0,0 +1,386 @@ | |||||
| *> \brief \b DORHR_COL01 | |||||
| * | |||||
| * =========== DOCUMENTATION =========== | |||||
| * | |||||
| * Online html documentation available at | |||||
| * http://www.netlib.org/lapack/explore-html/ | |||||
| * | |||||
| * Definition: | |||||
| * =========== | |||||
| * | |||||
| * SUBROUTINE DORHR_COL01( M, N, MB1, NB1, NB2, RESULT ) | |||||
| * | |||||
| * .. Scalar Arguments .. | |||||
| * INTEGER M, N, MB1, NB1, NB2 | |||||
| * .. Return values .. | |||||
| * DOUBLE PRECISION RESULT(6) | |||||
| * | |||||
| * | |||||
| *> \par Purpose: | |||||
| * ============= | |||||
| *> | |||||
| *> \verbatim | |||||
| *> | |||||
| *> DORHR_COL01 tests DORHR_COL using DLATSQR, DGEMQRT and DORGTSQR. | |||||
| *> Therefore, DLATSQR (part of DGEQR), DGEMQRT (part DGEMQR), DORGTSQR | |||||
| *> have to be tested before this test. | |||||
| *> | |||||
| *> \endverbatim | |||||
| * | |||||
| * Arguments: | |||||
| * ========== | |||||
| * | |||||
| *> \param[in] M | |||||
| *> \verbatim | |||||
| *> M is INTEGER | |||||
| *> Number of rows in test matrix. | |||||
| *> \endverbatim | |||||
| *> \param[in] N | |||||
| *> \verbatim | |||||
| *> N is INTEGER | |||||
| *> Number of columns in test matrix. | |||||
| *> \endverbatim | |||||
| *> \param[in] MB1 | |||||
| *> \verbatim | |||||
| *> MB1 is INTEGER | |||||
| *> Number of row in row block in an input test matrix. | |||||
| *> \endverbatim | |||||
| *> | |||||
| *> \param[in] NB1 | |||||
| *> \verbatim | |||||
| *> NB1 is INTEGER | |||||
| *> Number of columns in column block an input test matrix. | |||||
| *> \endverbatim | |||||
| *> | |||||
| *> \param[in] NB2 | |||||
| *> \verbatim | |||||
| *> NB2 is INTEGER | |||||
| *> Number of columns in column block in an output test matrix. | |||||
| *> \endverbatim | |||||
| *> | |||||
| *> \param[out] RESULT | |||||
| *> \verbatim | |||||
| *> RESULT is DOUBLE PRECISION array, dimension (6) | |||||
| *> Results of each of the six tests below. | |||||
| *> ( C is a M-by-N random matrix, D is a N-by-M random matrix ) | |||||
| *> | |||||
| *> RESULT(1) = | A - Q * R | / (eps * m * |A|) | |||||
| *> RESULT(2) = | I - (Q**H) * Q | / (eps * m ) | |||||
| *> RESULT(3) = | Q * C - Q * C | / (eps * m * |C|) | |||||
| *> RESULT(4) = | (Q**H) * C - (Q**H) * C | / (eps * m * |C|) | |||||
| *> RESULT(5) = | (D * Q) - D * Q | / (eps * m * |D|) | |||||
| *> RESULT(6) = | D * (Q**H) - D * (Q**H) | / (eps * m * |D|) | |||||
| *> \endverbatim | |||||
| * | |||||
| * Authors: | |||||
| * ======== | |||||
| * | |||||
| *> \author Univ. of Tennessee | |||||
| *> \author Univ. of California Berkeley | |||||
| *> \author Univ. of Colorado Denver | |||||
| *> \author NAG Ltd. | |||||
| * | |||||
| *> \date November 2019 | |||||
| * | |||||
| *> \ingroup single_lin | |||||
| * | |||||
| * ===================================================================== | |||||
| SUBROUTINE DORHR_COL01( M, N, MB1, NB1, NB2, RESULT ) | |||||
| IMPLICIT NONE | |||||
| * | |||||
| * -- LAPACK test routine (version 3.9.0) -- | |||||
| * -- LAPACK is a software package provided by Univ. of Tennessee, -- | |||||
| * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- | |||||
| * November 2019 | |||||
| * | |||||
| * .. Scalar Arguments .. | |||||
| INTEGER M, N, MB1, NB1, NB2 | |||||
| * .. Return values .. | |||||
| DOUBLE PRECISION RESULT(6) | |||||
| * | |||||
| * ===================================================================== | |||||
| * | |||||
| * .. | |||||
| * .. Local allocatable arrays | |||||
| DOUBLE PRECISION, ALLOCATABLE :: A(:,:), AF(:,:), Q(:,:), R(:,:), | |||||
| $ RWORK(:), WORK( : ), T1(:,:), T2(:,:), DIAG(:), | |||||
| $ C(:,:), CF(:,:), D(:,:), DF(:,:) | |||||
| * | |||||
| * .. Parameters .. | |||||
| DOUBLE PRECISION ONE, ZERO | |||||
| PARAMETER ( ZERO = 0.0D+0, ONE = 1.0D+0 ) | |||||
| * .. | |||||
| * .. Local Scalars .. | |||||
| LOGICAL TESTZEROS | |||||
| INTEGER INFO, I, J, K, L, LWORK, NB1_UB, NB2_UB, NRB | |||||
| DOUBLE PRECISION ANORM, EPS, RESID, CNORM, DNORM | |||||
| * .. | |||||
| * .. Local Arrays .. | |||||
| INTEGER ISEED( 4 ) | |||||
| DOUBLE PRECISION WORKQUERY( 1 ) | |||||
| * .. | |||||
| * .. External Functions .. | |||||
| DOUBLE PRECISION DLAMCH, DLANGE, DLANSY | |||||
| EXTERNAL DLAMCH, DLANGE, DLANSY | |||||
| * .. | |||||
| * .. External Subroutines .. | |||||
| EXTERNAL DLACPY, DLARNV, DLASET, DLATSQR, DORHR_COL, | |||||
| $ DORGTSQR, DSCAL, DGEMM, DGEMQRT, DSYRK | |||||
| * .. | |||||
| * .. Intrinsic Functions .. | |||||
| INTRINSIC CEILING, DBLE, MAX, MIN | |||||
| * .. | |||||
| * .. Scalars in Common .. | |||||
| CHARACTER(LEN=32) SRNAMT | |||||
| * .. | |||||
| * .. Common blocks .. | |||||
| COMMON / SRMNAMC / SRNAMT | |||||
| * .. | |||||
| * .. Data statements .. | |||||
| DATA ISEED / 1988, 1989, 1990, 1991 / | |||||
| * | |||||
| * TEST MATRICES WITH HALF OF MATRIX BEING ZEROS | |||||
| * | |||||
| TESTZEROS = .FALSE. | |||||
| * | |||||
| EPS = DLAMCH( 'Epsilon' ) | |||||
| K = MIN( M, N ) | |||||
| L = MAX( M, N, 1) | |||||
| * | |||||
| * Dynamically allocate local arrays | |||||
| * | |||||
| ALLOCATE ( A(M,N), AF(M,N), Q(L,L), R(M,L), RWORK(L), | |||||
| $ C(M,N), CF(M,N), | |||||
| $ D(N,M), DF(N,M) ) | |||||
| * | |||||
| * Put random numbers into A and copy to AF | |||||
| * | |||||
| DO J = 1, N | |||||
| CALL DLARNV( 2, ISEED, M, A( 1, J ) ) | |||||
| END DO | |||||
| IF( TESTZEROS ) THEN | |||||
| IF( M.GE.4 ) THEN | |||||
| DO J = 1, N | |||||
| CALL DLARNV( 2, ISEED, M/2, A( M/4, J ) ) | |||||
| END DO | |||||
| END IF | |||||
| END IF | |||||
| CALL DLACPY( 'Full', M, N, A, M, AF, M ) | |||||
| * | |||||
| * Number of row blocks in DLATSQR | |||||
| * | |||||
| NRB = MAX( 1, CEILING( DBLE( M - N ) / DBLE( MB1 - N ) ) ) | |||||
| * | |||||
| ALLOCATE ( T1( NB1, N * NRB ) ) | |||||
| ALLOCATE ( T2( NB2, N ) ) | |||||
| ALLOCATE ( DIAG( N ) ) | |||||
| * | |||||
| * Begin determine LWORK for the array WORK and allocate memory. | |||||
| * | |||||
| * DLATSQR requires NB1 to be bounded by N. | |||||
| * | |||||
| NB1_UB = MIN( NB1, N) | |||||
| * | |||||
| * DGEMQRT requires NB2 to be bounded by N. | |||||
| * | |||||
| NB2_UB = MIN( NB2, N) | |||||
| * | |||||
| CALL DLATSQR( M, N, MB1, NB1_UB, AF, M, T1, NB1, | |||||
| $ WORKQUERY, -1, INFO ) | |||||
| LWORK = INT( WORKQUERY( 1 ) ) | |||||
| CALL DORGTSQR( M, N, MB1, NB1, AF, M, T1, NB1, WORKQUERY, -1, | |||||
| $ INFO ) | |||||
| LWORK = MAX( LWORK, INT( WORKQUERY( 1 ) ) ) | |||||
| * | |||||
| * In DGEMQRT, WORK is N*NB2_UB if SIDE = 'L', | |||||
| * or M*NB2_UB if SIDE = 'R'. | |||||
| * | |||||
| LWORK = MAX( LWORK, NB2_UB * N, NB2_UB * M ) | |||||
| * | |||||
| ALLOCATE ( WORK( LWORK ) ) | |||||
| * | |||||
| * End allocate memory for WORK. | |||||
| * | |||||
| * | |||||
| * Begin Householder reconstruction routines | |||||
| * | |||||
| * Factor the matrix A in the array AF. | |||||
| * | |||||
| SRNAMT = 'DLATSQR' | |||||
| CALL DLATSQR( M, N, MB1, NB1_UB, AF, M, T1, NB1, WORK, LWORK, | |||||
| $ INFO ) | |||||
| * | |||||
| * Copy the factor R into the array R. | |||||
| * | |||||
| SRNAMT = 'DLACPY' | |||||
| CALL DLACPY( 'U', N, N, AF, M, R, M ) | |||||
| * | |||||
| * Reconstruct the orthogonal matrix Q. | |||||
| * | |||||
| SRNAMT = 'DORGTSQR' | |||||
| CALL DORGTSQR( M, N, MB1, NB1, AF, M, T1, NB1, WORK, LWORK, | |||||
| $ INFO ) | |||||
| * | |||||
| * Perform the Householder reconstruction, the result is stored | |||||
| * the arrays AF and T2. | |||||
| * | |||||
| SRNAMT = 'DORHR_COL' | |||||
| CALL DORHR_COL( M, N, NB2, AF, M, T2, NB2, DIAG, INFO ) | |||||
| * | |||||
| * Compute the factor R_hr corresponding to the Householder | |||||
| * reconstructed Q_hr and place it in the upper triangle of AF to | |||||
| * match the Q storage format in DGEQRT. R_hr = R_tsqr * S, | |||||
| * this means changing the sign of I-th row of the matrix R_tsqr | |||||
| * according to sign of of I-th diagonal element DIAG(I) of the | |||||
| * matrix S. | |||||
| * | |||||
| SRNAMT = 'DLACPY' | |||||
| CALL DLACPY( 'U', N, N, R, M, AF, M ) | |||||
| * | |||||
| DO I = 1, N | |||||
| IF( DIAG( I ).EQ.-ONE ) THEN | |||||
| CALL DSCAL( N+1-I, -ONE, AF( I, I ), M ) | |||||
| END IF | |||||
| END DO | |||||
| * | |||||
| * End Householder reconstruction routines. | |||||
| * | |||||
| * | |||||
| * Generate the m-by-m matrix Q | |||||
| * | |||||
| CALL DLASET( 'Full', M, M, ZERO, ONE, Q, M ) | |||||
| * | |||||
| SRNAMT = 'DGEMQRT' | |||||
| CALL DGEMQRT( 'L', 'N', M, M, K, NB2_UB, AF, M, T2, NB2, Q, M, | |||||
| $ WORK, INFO ) | |||||
| * | |||||
| * Copy R | |||||
| * | |||||
| CALL DLASET( 'Full', M, N, ZERO, ZERO, R, M ) | |||||
| * | |||||
| CALL DLACPY( 'Upper', M, N, AF, M, R, M ) | |||||
| * | |||||
| * TEST 1 | |||||
| * Compute |R - (Q**T)*A| / ( eps * m * |A| ) and store in RESULT(1) | |||||
| * | |||||
| CALL DGEMM( 'T', 'N', M, N, M, -ONE, Q, M, A, M, ONE, R, M ) | |||||
| * | |||||
| ANORM = DLANGE( '1', M, N, A, M, RWORK ) | |||||
| RESID = DLANGE( '1', M, N, R, M, RWORK ) | |||||
| IF( ANORM.GT.ZERO ) THEN | |||||
| RESULT( 1 ) = RESID / ( EPS * MAX( 1, M ) * ANORM ) | |||||
| ELSE | |||||
| RESULT( 1 ) = ZERO | |||||
| END IF | |||||
| * | |||||
| * TEST 2 | |||||
| * Compute |I - (Q**T)*Q| / ( eps * m ) and store in RESULT(2) | |||||
| * | |||||
| CALL DLASET( 'Full', M, M, ZERO, ONE, R, M ) | |||||
| CALL DSYRK( 'U', 'T', M, M, -ONE, Q, M, ONE, R, M ) | |||||
| RESID = DLANSY( '1', 'Upper', M, R, M, RWORK ) | |||||
| RESULT( 2 ) = RESID / ( EPS * MAX( 1, M ) ) | |||||
| * | |||||
| * Generate random m-by-n matrix C | |||||
| * | |||||
| DO J = 1, N | |||||
| CALL DLARNV( 2, ISEED, M, C( 1, J ) ) | |||||
| END DO | |||||
| CNORM = DLANGE( '1', M, N, C, M, RWORK ) | |||||
| CALL DLACPY( 'Full', M, N, C, M, CF, M ) | |||||
| * | |||||
| * Apply Q to C as Q*C = CF | |||||
| * | |||||
| SRNAMT = 'DGEMQRT' | |||||
| CALL DGEMQRT( 'L', 'N', M, N, K, NB2_UB, AF, M, T2, NB2, CF, M, | |||||
| $ WORK, INFO ) | |||||
| * | |||||
| * TEST 3 | |||||
| * Compute |CF - Q*C| / ( eps * m * |C| ) | |||||
| * | |||||
| CALL DGEMM( 'N', 'N', M, N, M, -ONE, Q, M, C, M, ONE, CF, M ) | |||||
| RESID = DLANGE( '1', M, N, CF, M, RWORK ) | |||||
| IF( CNORM.GT.ZERO ) THEN | |||||
| RESULT( 3 ) = RESID / ( EPS * MAX( 1, M ) * CNORM ) | |||||
| ELSE | |||||
| RESULT( 3 ) = ZERO | |||||
| END IF | |||||
| * | |||||
| * Copy C into CF again | |||||
| * | |||||
| CALL DLACPY( 'Full', M, N, C, M, CF, M ) | |||||
| * | |||||
| * Apply Q to C as (Q**T)*C = CF | |||||
| * | |||||
| SRNAMT = 'DGEMQRT' | |||||
| CALL DGEMQRT( 'L', 'T', M, N, K, NB2_UB, AF, M, T2, NB2, CF, M, | |||||
| $ WORK, INFO ) | |||||
| * | |||||
| * TEST 4 | |||||
| * Compute |CF - (Q**T)*C| / ( eps * m * |C|) | |||||
| * | |||||
| CALL DGEMM( 'T', 'N', M, N, M, -ONE, Q, M, C, M, ONE, CF, M ) | |||||
| RESID = DLANGE( '1', M, N, CF, M, RWORK ) | |||||
| IF( CNORM.GT.ZERO ) THEN | |||||
| RESULT( 4 ) = RESID / ( EPS * MAX( 1, M ) * CNORM ) | |||||
| ELSE | |||||
| RESULT( 4 ) = ZERO | |||||
| END IF | |||||
| * | |||||
| * Generate random n-by-m matrix D and a copy DF | |||||
| * | |||||
| DO J = 1, M | |||||
| CALL DLARNV( 2, ISEED, N, D( 1, J ) ) | |||||
| END DO | |||||
| DNORM = DLANGE( '1', N, M, D, N, RWORK ) | |||||
| CALL DLACPY( 'Full', N, M, D, N, DF, N ) | |||||
| * | |||||
| * Apply Q to D as D*Q = DF | |||||
| * | |||||
| SRNAMT = 'DGEMQRT' | |||||
| CALL DGEMQRT( 'R', 'N', N, M, K, NB2_UB, AF, M, T2, NB2, DF, N, | |||||
| $ WORK, INFO ) | |||||
| * | |||||
| * TEST 5 | |||||
| * Compute |DF - D*Q| / ( eps * m * |D| ) | |||||
| * | |||||
| CALL DGEMM( 'N', 'N', N, M, M, -ONE, D, N, Q, M, ONE, DF, N ) | |||||
| RESID = DLANGE( '1', N, M, DF, N, RWORK ) | |||||
| IF( DNORM.GT.ZERO ) THEN | |||||
| RESULT( 5 ) = RESID / ( EPS * MAX( 1, M ) * DNORM ) | |||||
| ELSE | |||||
| RESULT( 5 ) = ZERO | |||||
| END IF | |||||
| * | |||||
| * Copy D into DF again | |||||
| * | |||||
| CALL DLACPY( 'Full', N, M, D, N, DF, N ) | |||||
| * | |||||
| * Apply Q to D as D*QT = DF | |||||
| * | |||||
| SRNAMT = 'DGEMQRT' | |||||
| CALL DGEMQRT( 'R', 'T', N, M, K, NB2_UB, AF, M, T2, NB2, DF, N, | |||||
| $ WORK, INFO ) | |||||
| * | |||||
| * TEST 6 | |||||
| * Compute |DF - D*(Q**T)| / ( eps * m * |D| ) | |||||
| * | |||||
| CALL DGEMM( 'N', 'T', N, M, M, -ONE, D, N, Q, M, ONE, DF, N ) | |||||
| RESID = DLANGE( '1', N, M, DF, N, RWORK ) | |||||
| IF( DNORM.GT.ZERO ) THEN | |||||
| RESULT( 6 ) = RESID / ( EPS * MAX( 1, M ) * DNORM ) | |||||
| ELSE | |||||
| RESULT( 6 ) = ZERO | |||||
| END IF | |||||
| * | |||||
| * Deallocate all arrays | |||||
| * | |||||
| DEALLOCATE ( A, AF, Q, R, RWORK, WORK, T1, T2, DIAG, | |||||
| $ C, D, CF, DF ) | |||||
| * | |||||
| RETURN | |||||
| * | |||||
| * End of DORHR_COL01 | |||||
| * | |||||
| END | |||||
| @@ -115,7 +115,7 @@ | |||||
| * .. | * .. | ||||
| * .. Local Arrays .. | * .. Local Arrays .. | ||||
| INTEGER ISEED( 4 ) | INTEGER ISEED( 4 ) | ||||
| DOUBLE PRECISION TQUERY( 5 ), WORKQUERY | |||||
| DOUBLE PRECISION TQUERY( 5 ), WORKQUERY( 1 ) | |||||
| * .. | * .. | ||||
| * .. External Functions .. | * .. External Functions .. | ||||
| DOUBLE PRECISION DLAMCH, DLANGE, DLANSY | DOUBLE PRECISION DLAMCH, DLANGE, DLANSY | ||||
| @@ -174,22 +174,22 @@ | |||||
| * | * | ||||
| CALL DGEQR( M, N, AF, M, TQUERY, -1, WORKQUERY, -1, INFO ) | CALL DGEQR( M, N, AF, M, TQUERY, -1, WORKQUERY, -1, INFO ) | ||||
| TSIZE = INT( TQUERY( 1 ) ) | TSIZE = INT( TQUERY( 1 ) ) | ||||
| LWORK = INT( WORKQUERY ) | |||||
| LWORK = INT( WORKQUERY( 1 ) ) | |||||
| CALL DGEMQR( 'L', 'N', M, M, K, AF, M, TQUERY, TSIZE, CF, M, | CALL DGEMQR( 'L', 'N', M, M, K, AF, M, TQUERY, TSIZE, CF, M, | ||||
| $ WORKQUERY, -1, INFO) | $ WORKQUERY, -1, INFO) | ||||
| LWORK = MAX( LWORK, INT( WORKQUERY ) ) | |||||
| LWORK = MAX( LWORK, INT( WORKQUERY( 1 ) ) ) | |||||
| CALL DGEMQR( 'L', 'N', M, N, K, AF, M, TQUERY, TSIZE, CF, M, | CALL DGEMQR( 'L', 'N', M, N, K, AF, M, TQUERY, TSIZE, CF, M, | ||||
| $ WORKQUERY, -1, INFO) | $ WORKQUERY, -1, INFO) | ||||
| LWORK = MAX( LWORK, INT( WORKQUERY ) ) | |||||
| LWORK = MAX( LWORK, INT( WORKQUERY( 1 ) ) ) | |||||
| CALL DGEMQR( 'L', 'T', M, N, K, AF, M, TQUERY, TSIZE, CF, M, | CALL DGEMQR( 'L', 'T', M, N, K, AF, M, TQUERY, TSIZE, CF, M, | ||||
| $ WORKQUERY, -1, INFO) | $ WORKQUERY, -1, INFO) | ||||
| LWORK = MAX( LWORK, INT( WORKQUERY ) ) | |||||
| LWORK = MAX( LWORK, INT( WORKQUERY( 1 ) ) ) | |||||
| CALL DGEMQR( 'R', 'N', N, M, K, AF, M, TQUERY, TSIZE, DF, N, | CALL DGEMQR( 'R', 'N', N, M, K, AF, M, TQUERY, TSIZE, DF, N, | ||||
| $ WORKQUERY, -1, INFO) | $ WORKQUERY, -1, INFO) | ||||
| LWORK = MAX( LWORK, INT( WORKQUERY ) ) | |||||
| LWORK = MAX( LWORK, INT( WORKQUERY( 1 ) ) ) | |||||
| CALL DGEMQR( 'R', 'T', N, M, K, AF, M, TQUERY, TSIZE, DF, N, | CALL DGEMQR( 'R', 'T', N, M, K, AF, M, TQUERY, TSIZE, DF, N, | ||||
| $ WORKQUERY, -1, INFO) | $ WORKQUERY, -1, INFO) | ||||
| LWORK = MAX( LWORK, INT( WORKQUERY ) ) | |||||
| LWORK = MAX( LWORK, INT( WORKQUERY( 1 ) ) ) | |||||
| ALLOCATE ( T( TSIZE ) ) | ALLOCATE ( T( TSIZE ) ) | ||||
| ALLOCATE ( WORK( LWORK ) ) | ALLOCATE ( WORK( LWORK ) ) | ||||
| srnamt = 'DGEQR' | srnamt = 'DGEQR' | ||||
| @@ -317,22 +317,22 @@ | |||||
| ELSE | ELSE | ||||
| CALL DGELQ( M, N, AF, M, TQUERY, -1, WORKQUERY, -1, INFO ) | CALL DGELQ( M, N, AF, M, TQUERY, -1, WORKQUERY, -1, INFO ) | ||||
| TSIZE = INT( TQUERY( 1 ) ) | TSIZE = INT( TQUERY( 1 ) ) | ||||
| LWORK = INT( WORKQUERY ) | |||||
| LWORK = INT( WORKQUERY( 1 ) ) | |||||
| CALL DGEMLQ( 'R', 'N', N, N, K, AF, M, TQUERY, TSIZE, Q, N, | CALL DGEMLQ( 'R', 'N', N, N, K, AF, M, TQUERY, TSIZE, Q, N, | ||||
| $ WORKQUERY, -1, INFO ) | $ WORKQUERY, -1, INFO ) | ||||
| LWORK = MAX( LWORK, INT( WORKQUERY ) ) | |||||
| LWORK = MAX( LWORK, INT( WORKQUERY( 1 ) ) ) | |||||
| CALL DGEMLQ( 'L', 'N', N, M, K, AF, M, TQUERY, TSIZE, DF, N, | CALL DGEMLQ( 'L', 'N', N, M, K, AF, M, TQUERY, TSIZE, DF, N, | ||||
| $ WORKQUERY, -1, INFO) | $ WORKQUERY, -1, INFO) | ||||
| LWORK = MAX( LWORK, INT( WORKQUERY ) ) | |||||
| LWORK = MAX( LWORK, INT( WORKQUERY( 1 ) ) ) | |||||
| CALL DGEMLQ( 'L', 'T', N, M, K, AF, M, TQUERY, TSIZE, DF, N, | CALL DGEMLQ( 'L', 'T', N, M, K, AF, M, TQUERY, TSIZE, DF, N, | ||||
| $ WORKQUERY, -1, INFO) | $ WORKQUERY, -1, INFO) | ||||
| LWORK = MAX( LWORK, INT( WORKQUERY ) ) | |||||
| LWORK = MAX( LWORK, INT( WORKQUERY( 1 ) ) ) | |||||
| CALL DGEMLQ( 'R', 'N', M, N, K, AF, M, TQUERY, TSIZE, CF, M, | CALL DGEMLQ( 'R', 'N', M, N, K, AF, M, TQUERY, TSIZE, CF, M, | ||||
| $ WORKQUERY, -1, INFO) | $ WORKQUERY, -1, INFO) | ||||
| LWORK = MAX( LWORK, INT( WORKQUERY ) ) | |||||
| LWORK = MAX( LWORK, INT( WORKQUERY( 1 ) ) ) | |||||
| CALL DGEMLQ( 'R', 'T', M, N, K, AF, M, TQUERY, TSIZE, CF, M, | CALL DGEMLQ( 'R', 'T', M, N, K, AF, M, TQUERY, TSIZE, CF, M, | ||||
| $ WORKQUERY, -1, INFO) | $ WORKQUERY, -1, INFO) | ||||
| LWORK = MAX( LWORK, INT( WORKQUERY ) ) | |||||
| LWORK = MAX( LWORK, INT( WORKQUERY( 1 ) ) ) | |||||
| ALLOCATE ( T( TSIZE ) ) | ALLOCATE ( T( TSIZE ) ) | ||||
| ALLOCATE ( WORK( LWORK ) ) | ALLOCATE ( WORK( LWORK ) ) | ||||
| srnamt = 'DGELQ' | srnamt = 'DGELQ' | ||||
| @@ -68,6 +68,8 @@ | |||||
| *> SEQ | *> SEQ | ||||
| *> SQT | *> SQT | ||||
| *> SQX | *> SQX | ||||
| *> STS | |||||
| *> SHH | |||||
| *> \endverbatim | *> \endverbatim | ||||
| * | * | ||||
| * Parameters: | * Parameters: | ||||
| @@ -102,17 +104,17 @@ | |||||
| *> \author Univ. of Colorado Denver | *> \author Univ. of Colorado Denver | ||||
| *> \author NAG Ltd. | *> \author NAG Ltd. | ||||
| * | * | ||||
| *> \date April 2012 | |||||
| *> \date November 2019 | |||||
| * | * | ||||
| *> \ingroup single_lin | *> \ingroup single_lin | ||||
| * | * | ||||
| * ===================================================================== | * ===================================================================== | ||||
| PROGRAM SCHKAA | PROGRAM SCHKAA | ||||
| * | * | ||||
| * -- LAPACK test routine (version 3.8.0) -- | |||||
| * -- LAPACK test routine (version 3.9.0) -- | |||||
| * -- LAPACK is a software package provided by Univ. of Tennessee, -- | * -- LAPACK is a software package provided by Univ. of Tennessee, -- | ||||
| * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- | * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- | ||||
| * April 2012 | |||||
| * November 2019 | |||||
| * | * | ||||
| * ===================================================================== | * ===================================================================== | ||||
| * | * | ||||
| @@ -159,13 +161,13 @@ | |||||
| * .. | * .. | ||||
| * .. External Subroutines .. | * .. External Subroutines .. | ||||
| EXTERNAL ALAREQ, SCHKEQ, SCHKGB, SCHKGE, SCHKGT, SCHKLQ, | EXTERNAL ALAREQ, SCHKEQ, SCHKGB, SCHKGE, SCHKGT, SCHKLQ, | ||||
| $ SCHKPB, SCHKPO, SCHKPS, SCHKPP, SCHKPT, SCHKQ3, | |||||
| $ SCHKQL, SCHKQR, SCHKRQ, SCHKSP, SCHKSY, | |||||
| $ SCHKSY_ROOK, SCHKSY_RK, SCHKSY_AA, SCHKTB, | |||||
| $ SCHKTP, SCHKTR, SCHKTZ, SDRVGB, SDRVGE, SDRVGT, | |||||
| $ SDRVLS, SDRVPB, SDRVPO, SDRVPP, SDRVPT, SDRVSP, | |||||
| $ SDRVSY, SDRVSY_ROOK, SDRVSY_RK, SDRVSY_AA, | |||||
| $ ILAVER, SCHKLQTP, SCHKQRT, SCHKQRTP, | |||||
| $ SCHKORHR_COL, SCHKPB, SCHKPO, SCHKPS, SCHKPP, | |||||
| $ SCHKPT, SCHKQ3, SCHKQL, SCHKQR, SCHKRQ, SCHKSP, | |||||
| $ SCHKSY, SCHKSY_ROOK, SCHKSY_RK, SCHKSY_AA, | |||||
| $ SCHKTB, SCHKTP, SCHKTR, SCHKTZ, SDRVGB, SDRVGE, | |||||
| $ SDRVGT, SDRVLS, SDRVPB, SDRVPO, SDRVPP, SDRVPT, | |||||
| $ SDRVSP, SDRVSY, SDRVSY_ROOK, SDRVSY_RK, | |||||
| $ SDRVSY_AA, ILAVER, SCHKLQTP, SCHKQRT, SCHKQRTP, | |||||
| $ SCHKLQT, SCHKTSQR | $ SCHKLQT, SCHKTSQR | ||||
| * .. | * .. | ||||
| * .. Scalars in Common .. | * .. Scalars in Common .. | ||||
| @@ -673,7 +675,7 @@ | |||||
| * | * | ||||
| * SK: symmetric indefinite matrices, | * SK: symmetric indefinite matrices, | ||||
| * with bounded Bunch-Kaufman (rook) pivoting algorithm, | * with bounded Bunch-Kaufman (rook) pivoting algorithm, | ||||
| * differnet matrix storage format than SR path version. | |||||
| * different matrix storage format than SR path version. | |||||
| * | * | ||||
| NTYPES = 10 | NTYPES = 10 | ||||
| CALL ALAREQ( PATH, NMATS, DOTYPE, NTYPES, NIN, NOUT ) | CALL ALAREQ( PATH, NMATS, DOTYPE, NTYPES, NIN, NOUT ) | ||||
| @@ -1004,6 +1006,17 @@ | |||||
| ELSE | ELSE | ||||
| WRITE( NOUT, FMT = 9989 )PATH | WRITE( NOUT, FMT = 9989 )PATH | ||||
| END IF | END IF | ||||
| * | |||||
| ELSE IF( LSAMEN( 2, C2, 'HH' ) ) THEN | |||||
| * | |||||
| * HH: Householder reconstruction for tall-skinny matrices | |||||
| * | |||||
| IF( TSTCHK ) THEN | |||||
| CALL SCHKORHR_COL( THRESH, TSTERR, NM, MVAL, NN, NVAL, NNB, | |||||
| $ NBVAL, NOUT ) | |||||
| ELSE | |||||
| WRITE( NOUT, FMT = 9989 ) PATH | |||||
| END IF | |||||
| * | * | ||||
| ELSE | ELSE | ||||
| * | * | ||||
| @@ -0,0 +1,239 @@ | |||||
| *> \brief \b SCHKORHR_COL | |||||
| * | |||||
| * =========== DOCUMENTATION =========== | |||||
| * | |||||
| * Online html documentation available at | |||||
| * http://www.netlib.org/lapack/explore-html/ | |||||
| * | |||||
| * Definition: | |||||
| * =========== | |||||
| * | |||||
| * SUBROUTINE SCHKORHR_COL( THRESH, TSTERR, NM, MVAL, NN, NVAL, NNB, | |||||
| * NBVAL, NOUT ) | |||||
| * | |||||
| * .. Scalar Arguments .. | |||||
| * LOGICAL TSTERR | |||||
| * INTEGER NM, NN, NNB, NOUT | |||||
| * REAL THRESH | |||||
| * .. | |||||
| * .. Array Arguments .. | |||||
| * INTEGER MVAL( * ), NBVAL( * ), NVAL( * ) | |||||
| * | |||||
| *> \par Purpose: | |||||
| * ============= | |||||
| *> | |||||
| *> \verbatim | |||||
| *> | |||||
| *> SCHKORHR_COL tests SORHR_COL using SLATSQR, SGEMQRT and SORGTSQR. | |||||
| *> Therefore, SLATSQR (part of SGEQR), SGEMQRT (part SGEMQR), SORGTSQR | |||||
| *> have to be tested before this test. | |||||
| *> | |||||
| *> \endverbatim | |||||
| * | |||||
| * Arguments: | |||||
| * ========== | |||||
| * | |||||
| *> \param[in] THRESH | |||||
| *> \verbatim | |||||
| *> THRESH is REAL | |||||
| *> The threshold value for the test ratios. A result is | |||||
| *> included in the output file if RESULT >= THRESH. To have | |||||
| *> every test ratio printed, use THRESH = 0. | |||||
| *> \endverbatim | |||||
| *> | |||||
| *> \param[in] TSTERR | |||||
| *> \verbatim | |||||
| *> TSTERR is LOGICAL | |||||
| *> Flag that indicates whether error exits are to be tested. | |||||
| *> \endverbatim | |||||
| *> | |||||
| *> \param[in] NM | |||||
| *> \verbatim | |||||
| *> NM is INTEGER | |||||
| *> The number of values of M contained in the vector MVAL. | |||||
| *> \endverbatim | |||||
| *> | |||||
| *> \param[in] MVAL | |||||
| *> \verbatim | |||||
| *> MVAL is INTEGER array, dimension (NM) | |||||
| *> The values of the matrix row dimension M. | |||||
| *> \endverbatim | |||||
| *> | |||||
| *> \param[in] NN | |||||
| *> \verbatim | |||||
| *> NN is INTEGER | |||||
| *> The number of values of N contained in the vector NVAL. | |||||
| *> \endverbatim | |||||
| *> | |||||
| *> \param[in] NVAL | |||||
| *> \verbatim | |||||
| *> NVAL is INTEGER array, dimension (NN) | |||||
| *> The values of the matrix column dimension N. | |||||
| *> \endverbatim | |||||
| *> | |||||
| *> \param[in] NNB | |||||
| *> \verbatim | |||||
| *> NNB is INTEGER | |||||
| *> The number of values of NB contained in the vector NBVAL. | |||||
| *> \endverbatim | |||||
| *> | |||||
| *> \param[in] NBVAL | |||||
| *> \verbatim | |||||
| *> NBVAL is INTEGER array, dimension (NBVAL) | |||||
| *> The values of the blocksize NB. | |||||
| *> \endverbatim | |||||
| *> | |||||
| *> \param[in] NOUT | |||||
| *> \verbatim | |||||
| *> NOUT is INTEGER | |||||
| *> The unit number for output. | |||||
| *> \endverbatim | |||||
| * | |||||
| * Authors: | |||||
| * ======== | |||||
| * | |||||
| *> \author Univ. of Tennessee | |||||
| *> \author Univ. of California Berkeley | |||||
| *> \author Univ. of Colorado Denver | |||||
| *> \author NAG Ltd. | |||||
| * | |||||
| *> \date November 2019 | |||||
| * | |||||
| *> \ingroup sigle_lin | |||||
| * | |||||
| * ===================================================================== | |||||
| SUBROUTINE SCHKORHR_COL( THRESH, TSTERR, NM, MVAL, NN, NVAL, NNB, | |||||
| $ NBVAL, NOUT ) | |||||
| IMPLICIT NONE | |||||
| * | |||||
| * -- LAPACK test routine (version 3.9.0) -- | |||||
| * -- LAPACK is a software package provided by Univ. of Tennessee, -- | |||||
| * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- | |||||
| * June 2019 | |||||
| * | |||||
| * .. Scalar Arguments .. | |||||
| LOGICAL TSTERR | |||||
| INTEGER NM, NN, NNB, NOUT | |||||
| REAL THRESH | |||||
| * .. | |||||
| * .. Array Arguments .. | |||||
| INTEGER MVAL( * ), NBVAL( * ), NVAL( * ) | |||||
| * .. | |||||
| * | |||||
| * ===================================================================== | |||||
| * | |||||
| * .. Parameters .. | |||||
| INTEGER NTESTS | |||||
| PARAMETER ( NTESTS = 6 ) | |||||
| * .. | |||||
| * .. Local Scalars .. | |||||
| CHARACTER(LEN=3) PATH | |||||
| INTEGER I, IMB1, INB1, INB2, J, T, M, N, MB1, NB1, | |||||
| $ NB2, NFAIL, NERRS, NRUN | |||||
| * | |||||
| * .. Local Arrays .. | |||||
| REAL RESULT( NTESTS ) | |||||
| * .. | |||||
| * .. External Subroutines .. | |||||
| EXTERNAL ALAHD, ALASUM, SERRORHR_COL, SORHR_COL01 | |||||
| * .. | |||||
| * .. Intrinsic Functions .. | |||||
| INTRINSIC MAX, MIN | |||||
| * .. | |||||
| * .. Scalars in Common .. | |||||
| LOGICAL LERR, OK | |||||
| CHARACTER(LEN=32) SRNAMT | |||||
| INTEGER INFOT, NUNIT | |||||
| * .. | |||||
| * .. Common blocks .. | |||||
| COMMON / INFOC / INFOT, NUNIT, OK, LERR | |||||
| COMMON / SRNAMC / SRNAMT | |||||
| * .. | |||||
| * .. Executable Statements .. | |||||
| * | |||||
| * Initialize constants | |||||
| * | |||||
| PATH( 1: 1 ) = 'S' | |||||
| PATH( 2: 3 ) = 'HH' | |||||
| NRUN = 0 | |||||
| NFAIL = 0 | |||||
| NERRS = 0 | |||||
| * | |||||
| * Test the error exits | |||||
| * | |||||
| IF( TSTERR ) CALL SERRORHR_COL( PATH, NOUT ) | |||||
| INFOT = 0 | |||||
| * | |||||
| * Do for each value of M in MVAL. | |||||
| * | |||||
| DO I = 1, NM | |||||
| M = MVAL( I ) | |||||
| * | |||||
| * Do for each value of N in NVAL. | |||||
| * | |||||
| DO J = 1, NN | |||||
| N = NVAL( J ) | |||||
| * | |||||
| * Only for M >= N | |||||
| * | |||||
| IF ( MIN( M, N ).GT.0 .AND. M.GE.N ) THEN | |||||
| * | |||||
| * Do for each possible value of MB1 | |||||
| * | |||||
| DO IMB1 = 1, NNB | |||||
| MB1 = NBVAL( IMB1 ) | |||||
| * | |||||
| * Only for MB1 > N | |||||
| * | |||||
| IF ( MB1.GT.N ) THEN | |||||
| * | |||||
| * Do for each possible value of NB1 | |||||
| * | |||||
| DO INB1 = 1, NNB | |||||
| NB1 = NBVAL( INB1 ) | |||||
| * | |||||
| * Do for each possible value of NB2 | |||||
| * | |||||
| DO INB2 = 1, NNB | |||||
| NB2 = NBVAL( INB2 ) | |||||
| * | |||||
| IF( NB1.GT.0 .AND. NB2.GT.0 ) THEN | |||||
| * | |||||
| * Test SORHR_COL | |||||
| * | |||||
| CALL SORHR_COL01( M, N, MB1, NB1, NB2, | |||||
| $ RESULT ) | |||||
| * | |||||
| * Print information about the tests that did | |||||
| * not pass the threshold. | |||||
| * | |||||
| DO T = 1, NTESTS | |||||
| IF( RESULT( T ).GE.THRESH ) THEN | |||||
| IF( NFAIL.EQ.0 .AND. NERRS.EQ.0 ) | |||||
| $ CALL ALAHD( NOUT, PATH ) | |||||
| WRITE( NOUT, FMT = 9999 ) M, N, MB1, | |||||
| $ NB1, NB2, T, RESULT( T ) | |||||
| NFAIL = NFAIL + 1 | |||||
| END IF | |||||
| END DO | |||||
| NRUN = NRUN + NTESTS | |||||
| END IF | |||||
| END DO | |||||
| END DO | |||||
| END IF | |||||
| END DO | |||||
| END IF | |||||
| END DO | |||||
| END DO | |||||
| * | |||||
| * Print a summary of the results. | |||||
| * | |||||
| CALL ALASUM( PATH, NOUT, NFAIL, NRUN, NERRS ) | |||||
| * | |||||
| 9999 FORMAT( 'M=', I5, ', N=', I5, ', MB1=', I5, | |||||
| $ ', NB1=', I5, ', NB2=', I5,' test(', I2, ')=', G12.5 ) | |||||
| RETURN | |||||
| * | |||||
| * End of SCHKORHR_COL | |||||
| * | |||||
| END | |||||
| @@ -233,8 +233,8 @@ | |||||
| REAL EPS, NORMA, NORMB, RCOND | REAL EPS, NORMA, NORMB, RCOND | ||||
| * .. | * .. | ||||
| * .. Local Arrays .. | * .. Local Arrays .. | ||||
| INTEGER ISEED( 4 ), ISEEDY( 4 ), IWQ | |||||
| REAL RESULT( NTESTS ), WQ | |||||
| INTEGER ISEED( 4 ), ISEEDY( 4 ), IWQ( 1 ) | |||||
| REAL RESULT( NTESTS ), WQ( 1 ) | |||||
| * .. | * .. | ||||
| * .. Allocatable Arrays .. | * .. Allocatable Arrays .. | ||||
| REAL, ALLOCATABLE :: WORK (:) | REAL, ALLOCATABLE :: WORK (:) | ||||
| @@ -358,28 +358,28 @@ | |||||
| * | * | ||||
| * Compute workspace needed for SGELS | * Compute workspace needed for SGELS | ||||
| CALL SGELS( TRANS, M, N, NRHS, A, LDA, | CALL SGELS( TRANS, M, N, NRHS, A, LDA, | ||||
| $ B, LDB, WQ, -1, INFO ) | |||||
| LWORK_SGELS = INT ( WQ ) | |||||
| $ B, LDB, WQ( 1 ), -1, INFO ) | |||||
| LWORK_SGELS = INT ( WQ( 1 ) ) | |||||
| * Compute workspace needed for SGETSLS | * Compute workspace needed for SGETSLS | ||||
| CALL SGETSLS( TRANS, M, N, NRHS, A, LDA, | CALL SGETSLS( TRANS, M, N, NRHS, A, LDA, | ||||
| $ B, LDB, WQ, -1, INFO ) | |||||
| LWORK_SGETSLS = INT( WQ ) | |||||
| $ B, LDB, WQ( 1 ), -1, INFO ) | |||||
| LWORK_SGETSLS = INT( WQ( 1 ) ) | |||||
| ENDDO | ENDDO | ||||
| END IF | END IF | ||||
| * Compute workspace needed for SGELSY | * Compute workspace needed for SGELSY | ||||
| CALL SGELSY( M, N, NRHS, A, LDA, B, LDB, IWQ, | CALL SGELSY( M, N, NRHS, A, LDA, B, LDB, IWQ, | ||||
| $ RCOND, CRANK, WQ, -1, INFO ) | $ RCOND, CRANK, WQ, -1, INFO ) | ||||
| LWORK_SGELSY = INT( WQ ) | |||||
| LWORK_SGELSY = INT( WQ( 1 ) ) | |||||
| * Compute workspace needed for SGELSS | * Compute workspace needed for SGELSS | ||||
| CALL SGELSS( M, N, NRHS, A, LDA, B, LDB, S, | CALL SGELSS( M, N, NRHS, A, LDA, B, LDB, S, | ||||
| $ RCOND, CRANK, WQ, -1 , INFO ) | $ RCOND, CRANK, WQ, -1 , INFO ) | ||||
| LWORK_SGELSS = INT( WQ ) | |||||
| LWORK_SGELSS = INT( WQ( 1 ) ) | |||||
| * Compute workspace needed for SGELSD | * Compute workspace needed for SGELSD | ||||
| CALL SGELSD( M, N, NRHS, A, LDA, B, LDB, S, | CALL SGELSD( M, N, NRHS, A, LDA, B, LDB, S, | ||||
| $ RCOND, CRANK, WQ, -1, IWQ, INFO ) | $ RCOND, CRANK, WQ, -1, IWQ, INFO ) | ||||
| LWORK_SGELSD = INT( WQ ) | |||||
| LWORK_SGELSD = INT( WQ( 1 ) ) | |||||
| * Compute LIWORK workspace needed for SGELSY and SGELSD | * Compute LIWORK workspace needed for SGELSY and SGELSD | ||||
| LIWORK = MAX( LIWORK, N, IWQ ) | |||||
| LIWORK = MAX( LIWORK, N, IWQ( 1 ) ) | |||||
| * Compute LWORK workspace needed for all functions | * Compute LWORK workspace needed for all functions | ||||
| LWORK = MAX( LWORK, LWORK_SGELS, LWORK_SGETSLS, | LWORK = MAX( LWORK, LWORK_SGELS, LWORK_SGETSLS, | ||||
| $ LWORK_SGELSY, LWORK_SGELSS, | $ LWORK_SGELSY, LWORK_SGELSS, | ||||
| @@ -0,0 +1,164 @@ | |||||
| *> \brief \b SERRORHR_COL | |||||
| * | |||||
| * =========== DOCUMENTATION =========== | |||||
| * | |||||
| * Online html documentation available at | |||||
| * http://www.netlib.org/lapack/explore-html/ | |||||
| * | |||||
| * Definition: | |||||
| * =========== | |||||
| * | |||||
| * SUBROUTINE SERRORHR_COL( PATH, NUNIT ) | |||||
| * | |||||
| * .. Scalar Arguments .. | |||||
| * CHARACTER*3 PATH | |||||
| * INTEGER NUNIT | |||||
| * .. | |||||
| * | |||||
| * | |||||
| *> \par Purpose: | |||||
| * ============= | |||||
| *> | |||||
| *> \verbatim | |||||
| *> | |||||
| *> SERRORHR_COL tests the error exits for SORHR_COL that does | |||||
| *> Householder reconstruction from the ouput of tall-skinny | |||||
| *> factorization SLATSQR. | |||||
| *> \endverbatim | |||||
| * | |||||
| * Arguments: | |||||
| * ========== | |||||
| * | |||||
| *> \param[in] PATH | |||||
| *> \verbatim | |||||
| *> PATH is CHARACTER*3 | |||||
| *> The LAPACK path name for the routines to be tested. | |||||
| *> \endverbatim | |||||
| *> | |||||
| *> \param[in] NUNIT | |||||
| *> \verbatim | |||||
| *> NUNIT is INTEGER | |||||
| *> The unit number for output. | |||||
| *> \endverbatim | |||||
| * | |||||
| * Authors: | |||||
| * ======== | |||||
| * | |||||
| *> \author Univ. of Tennessee | |||||
| *> \author Univ. of California Berkeley | |||||
| *> \author Univ. of Colorado Denver | |||||
| *> \author NAG Ltd. | |||||
| * | |||||
| *> \date November 2019 | |||||
| * | |||||
| *> \ingroup singlr_lin | |||||
| * | |||||
| * ===================================================================== | |||||
| SUBROUTINE SERRORHR_COL( PATH, NUNIT ) | |||||
| IMPLICIT NONE | |||||
| * | |||||
| * -- LAPACK test routine (version 3.9.0) -- | |||||
| * -- LAPACK is a software package provided by Univ. of Tennessee, -- | |||||
| * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- | |||||
| * November 2019 | |||||
| * | |||||
| * .. Scalar Arguments .. | |||||
| CHARACTER(LEN=3) PATH | |||||
| INTEGER NUNIT | |||||
| * .. | |||||
| * | |||||
| * ===================================================================== | |||||
| * | |||||
| * .. Parameters .. | |||||
| INTEGER NMAX | |||||
| PARAMETER ( NMAX = 2 ) | |||||
| * .. | |||||
| * .. Local Scalars .. | |||||
| INTEGER I, INFO, J | |||||
| * .. | |||||
| * .. Local Arrays .. | |||||
| REAL A( NMAX, NMAX ), T( NMAX, NMAX ), D(NMAX) | |||||
| * .. | |||||
| * .. External Subroutines .. | |||||
| EXTERNAL ALAESM, CHKXER, SORHR_COL | |||||
| * .. | |||||
| * .. Scalars in Common .. | |||||
| LOGICAL LERR, OK | |||||
| CHARACTER(LEN=32) SRNAMT | |||||
| INTEGER INFOT, NOUT | |||||
| * .. | |||||
| * .. Common blocks .. | |||||
| COMMON / INFOC / INFOT, NOUT, OK, LERR | |||||
| COMMON / SRNAMC / SRNAMT | |||||
| * .. | |||||
| * .. Intrinsic Functions .. | |||||
| INTRINSIC REAL | |||||
| * .. | |||||
| * .. Executable Statements .. | |||||
| * | |||||
| NOUT = NUNIT | |||||
| WRITE( NOUT, FMT = * ) | |||||
| * | |||||
| * Set the variables to innocuous values. | |||||
| * | |||||
| DO J = 1, NMAX | |||||
| DO I = 1, NMAX | |||||
| A( I, J ) = 1.E+0 / REAL( I+J ) | |||||
| T( I, J ) = 1.E+0 / REAL( I+J ) | |||||
| END DO | |||||
| D( J ) = 0.E+0 | |||||
| END DO | |||||
| OK = .TRUE. | |||||
| * | |||||
| * Error exits for Householder reconstruction | |||||
| * | |||||
| * SORHR_COL | |||||
| * | |||||
| SRNAMT = 'SORHR_COL' | |||||
| * | |||||
| INFOT = 1 | |||||
| CALL SORHR_COL( -1, 0, 1, A, 1, T, 1, D, INFO ) | |||||
| CALL CHKXER( 'SORHR_COL', INFOT, NOUT, LERR, OK ) | |||||
| * | |||||
| INFOT = 2 | |||||
| CALL SORHR_COL( 0, -1, 1, A, 1, T, 1, D, INFO ) | |||||
| CALL CHKXER( 'SORHR_COL', INFOT, NOUT, LERR, OK ) | |||||
| CALL SORHR_COL( 1, 2, 1, A, 1, T, 1, D, INFO ) | |||||
| CALL CHKXER( 'SORHR_COL', INFOT, NOUT, LERR, OK ) | |||||
| * | |||||
| INFOT = 3 | |||||
| CALL SORHR_COL( 0, 0, -1, A, 1, T, 1, D, INFO ) | |||||
| CALL CHKXER( 'SORHR_COL', INFOT, NOUT, LERR, OK ) | |||||
| * | |||||
| CALL SORHR_COL( 0, 0, 0, A, 1, T, 1, D, INFO ) | |||||
| CALL CHKXER( 'SORHR_COL', INFOT, NOUT, LERR, OK ) | |||||
| * | |||||
| INFOT = 5 | |||||
| CALL SORHR_COL( 0, 0, 1, A, -1, T, 1, D, INFO ) | |||||
| CALL CHKXER( 'SORHR_COL', INFOT, NOUT, LERR, OK ) | |||||
| * | |||||
| CALL SORHR_COL( 0, 0, 1, A, 0, T, 1, D, INFO ) | |||||
| CALL CHKXER( 'SORHR_COL', INFOT, NOUT, LERR, OK ) | |||||
| * | |||||
| CALL SORHR_COL( 2, 0, 1, A, 1, T, 1, D, INFO ) | |||||
| CALL CHKXER( 'SORHR_COL', INFOT, NOUT, LERR, OK ) | |||||
| * | |||||
| INFOT = 7 | |||||
| CALL SORHR_COL( 0, 0, 1, A, 1, T, -1, D, INFO ) | |||||
| CALL CHKXER( 'SORHR_COL', INFOT, NOUT, LERR, OK ) | |||||
| * | |||||
| CALL SORHR_COL( 0, 0, 1, A, 1, T, 0, D, INFO ) | |||||
| CALL CHKXER( 'SORHR_COL', INFOT, NOUT, LERR, OK ) | |||||
| * | |||||
| CALL SORHR_COL( 4, 3, 2, A, 4, T, 1, D, INFO ) | |||||
| CALL CHKXER( 'SORHR_COL', INFOT, NOUT, LERR, OK ) | |||||
| * | |||||
| * Print a summary line. | |||||
| * | |||||
| CALL ALAESM( PATH, OK, NOUT ) | |||||
| * | |||||
| RETURN | |||||
| * | |||||
| * End of SERRORHR_COL | |||||
| * | |||||
| END | |||||
| @@ -735,7 +735,7 @@ | |||||
| $ W, 1, INFO ) | $ W, 1, INFO ) | ||||
| CALL CHKXER( 'SSYSV_AA_2STAGE', INFOT, NOUT, LERR, OK ) | CALL CHKXER( 'SSYSV_AA_2STAGE', INFOT, NOUT, LERR, OK ) | ||||
| INFOT = 11 | INFOT = 11 | ||||
| CALL SSYSV_AA_2STAGE( 'U', 2, 1, A, 2, A, 2, IP, IP, B, 1, | |||||
| CALL SSYSV_AA_2STAGE( 'U', 2, 1, A, 2, A, 8, IP, IP, B, 1, | |||||
| $ W, 1, INFO ) | $ W, 1, INFO ) | ||||
| CALL CHKXER( 'SSYSV_AA_2STAGE', INFOT, NOUT, LERR, OK ) | CALL CHKXER( 'SSYSV_AA_2STAGE', INFOT, NOUT, LERR, OK ) | ||||
| INFOT = 7 | INFOT = 7 | ||||
| @@ -0,0 +1,386 @@ | |||||
| *> \brief \b SORHR_COL01 | |||||
| * | |||||
| * =========== DOCUMENTATION =========== | |||||
| * | |||||
| * Online html documentation available at | |||||
| * http://www.netlib.org/lapack/explore-html/ | |||||
| * | |||||
| * Definition: | |||||
| * =========== | |||||
| * | |||||
| * SUBROUTINE SORHR_COL01( M, N, MB1, NB1, NB2, RESULT) | |||||
| * | |||||
| * .. Scalar Arguments .. | |||||
| * INTEGER M, N, MB1, NB1, NB2 | |||||
| * .. Return values .. | |||||
| * REAL RESULT(6) | |||||
| * | |||||
| * | |||||
| *> \par Purpose: | |||||
| * ============= | |||||
| *> | |||||
| *> \verbatim | |||||
| *> | |||||
| *> SORHR_COL01 tests SORHR_COL using SLATSQR, SGEMQRT and SORGTSQR. | |||||
| *> Therefore, SLATSQR (part of SGEQR), SGEMQRT (part SGEMQR), SORGTSQR | |||||
| *> have to be tested before this test. | |||||
| *> | |||||
| *> \endverbatim | |||||
| * | |||||
| * Arguments: | |||||
| * ========== | |||||
| * | |||||
| *> \param[in] M | |||||
| *> \verbatim | |||||
| *> M is INTEGER | |||||
| *> Number of rows in test matrix. | |||||
| *> \endverbatim | |||||
| *> \param[in] N | |||||
| *> \verbatim | |||||
| *> N is INTEGER | |||||
| *> Number of columns in test matrix. | |||||
| *> \endverbatim | |||||
| *> \param[in] MB1 | |||||
| *> \verbatim | |||||
| *> MB1 is INTEGER | |||||
| *> Number of row in row block in an input test matrix. | |||||
| *> \endverbatim | |||||
| *> | |||||
| *> \param[in] NB1 | |||||
| *> \verbatim | |||||
| *> NB1 is INTEGER | |||||
| *> Number of columns in column block an input test matrix. | |||||
| *> \endverbatim | |||||
| *> | |||||
| *> \param[in] NB2 | |||||
| *> \verbatim | |||||
| *> NB2 is INTEGER | |||||
| *> Number of columns in column block in an output test matrix. | |||||
| *> \endverbatim | |||||
| *> | |||||
| *> \param[out] RESULT | |||||
| *> \verbatim | |||||
| *> RESULT is REAL array, dimension (6) | |||||
| *> Results of each of the six tests below. | |||||
| *> ( C is a M-by-N random matrix, D is a N-by-M random matrix ) | |||||
| *> | |||||
| *> RESULT(1) = | A - Q * R | / (eps * m * |A|) | |||||
| *> RESULT(2) = | I - (Q**H) * Q | / (eps * m ) | |||||
| *> RESULT(3) = | Q * C - Q * C | / (eps * m * |C|) | |||||
| *> RESULT(4) = | (Q**H) * C - (Q**H) * C | / (eps * m * |C|) | |||||
| *> RESULT(5) = | (D * Q) - D * Q | / (eps * m * |D|) | |||||
| *> RESULT(6) = | D * (Q**H) - D * (Q**H) | / (eps * m * |D|) | |||||
| *> \endverbatim | |||||
| * | |||||
| * Authors: | |||||
| * ======== | |||||
| * | |||||
| *> \author Univ. of Tennessee | |||||
| *> \author Univ. of California Berkeley | |||||
| *> \author Univ. of Colorado Denver | |||||
| *> \author NAG Ltd. | |||||
| * | |||||
| *> \date November 2019 | |||||
| * | |||||
| *> \ingroup single_lin | |||||
| * | |||||
| * ===================================================================== | |||||
| SUBROUTINE SORHR_COL01( M, N, MB1, NB1, NB2, RESULT ) | |||||
| IMPLICIT NONE | |||||
| * | |||||
| * -- LAPACK test routine (version 3.9.0) -- | |||||
| * -- LAPACK is a software package provided by Univ. of Tennessee, -- | |||||
| * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- | |||||
| * November 2019 | |||||
| * | |||||
| * .. Scalar Arguments .. | |||||
| INTEGER M, N, MB1, NB1, NB2 | |||||
| * .. Return values .. | |||||
| REAL RESULT(6) | |||||
| * | |||||
| * ===================================================================== | |||||
| * | |||||
| * .. | |||||
| * .. Local allocatable arrays | |||||
| REAL, ALLOCATABLE :: A(:,:), AF(:,:), Q(:,:), R(:,:), | |||||
| $ RWORK(:), WORK( : ), T1(:,:), T2(:,:), DIAG(:), | |||||
| $ C(:,:), CF(:,:), D(:,:), DF(:,:) | |||||
| * | |||||
| * .. Parameters .. | |||||
| REAL ONE, ZERO | |||||
| PARAMETER ( ZERO = 0.0E+0, ONE = 1.0E+0 ) | |||||
| * .. | |||||
| * .. Local Scalars .. | |||||
| LOGICAL TESTZEROS | |||||
| INTEGER INFO, I, J, K, L, LWORK, NB1_UB, NB2_UB, NRB | |||||
| REAL ANORM, EPS, RESID, CNORM, DNORM | |||||
| * .. | |||||
| * .. Local Arrays .. | |||||
| INTEGER ISEED( 4 ) | |||||
| REAL WORKQUERY( 1 ) | |||||
| * .. | |||||
| * .. External Functions .. | |||||
| REAL SLAMCH, SLANGE, SLANSY | |||||
| EXTERNAL SLAMCH, SLANGE, SLANSY | |||||
| * .. | |||||
| * .. External Subroutines .. | |||||
| EXTERNAL SLACPY, SLARNV, SLASET, SLATSQR, SORHR_COL, | |||||
| $ SORGTSQR, SSCAL, SGEMM, SGEMQRT, SSYRK | |||||
| * .. | |||||
| * .. Intrinsic Functions .. | |||||
| INTRINSIC CEILING, MAX, MIN, REAL | |||||
| * .. | |||||
| * .. Scalars in Common .. | |||||
| CHARACTER(LEN=32) SRNAMT | |||||
| * .. | |||||
| * .. Common blocks .. | |||||
| COMMON / SRMNAMC / SRNAMT | |||||
| * .. | |||||
| * .. Data statements .. | |||||
| DATA ISEED / 1988, 1989, 1990, 1991 / | |||||
| * | |||||
| * TEST MATRICES WITH HALF OF MATRIX BEING ZEROS | |||||
| * | |||||
| TESTZEROS = .FALSE. | |||||
| * | |||||
| EPS = SLAMCH( 'Epsilon' ) | |||||
| K = MIN( M, N ) | |||||
| L = MAX( M, N, 1) | |||||
| * | |||||
| * Dynamically allocate local arrays | |||||
| * | |||||
| ALLOCATE ( A(M,N), AF(M,N), Q(L,L), R(M,L), RWORK(L), | |||||
| $ C(M,N), CF(M,N), | |||||
| $ D(N,M), DF(N,M) ) | |||||
| * | |||||
| * Put random numbers into A and copy to AF | |||||
| * | |||||
| DO J = 1, N | |||||
| CALL SLARNV( 2, ISEED, M, A( 1, J ) ) | |||||
| END DO | |||||
| IF( TESTZEROS ) THEN | |||||
| IF( M.GE.4 ) THEN | |||||
| DO J = 1, N | |||||
| CALL SLARNV( 2, ISEED, M/2, A( M/4, J ) ) | |||||
| END DO | |||||
| END IF | |||||
| END IF | |||||
| CALL SLACPY( 'Full', M, N, A, M, AF, M ) | |||||
| * | |||||
| * Number of row blocks in SLATSQR | |||||
| * | |||||
| NRB = MAX( 1, CEILING( REAL( M - N ) / REAL( MB1 - N ) ) ) | |||||
| * | |||||
| ALLOCATE ( T1( NB1, N * NRB ) ) | |||||
| ALLOCATE ( T2( NB2, N ) ) | |||||
| ALLOCATE ( DIAG( N ) ) | |||||
| * | |||||
| * Begin determine LWORK for the array WORK and allocate memory. | |||||
| * | |||||
| * SLATSQR requires NB1 to be bounded by N. | |||||
| * | |||||
| NB1_UB = MIN( NB1, N) | |||||
| * | |||||
| * SGEMQRT requires NB2 to be bounded by N. | |||||
| * | |||||
| NB2_UB = MIN( NB2, N) | |||||
| * | |||||
| CALL SLATSQR( M, N, MB1, NB1_UB, AF, M, T1, NB1, | |||||
| $ WORKQUERY, -1, INFO ) | |||||
| LWORK = INT( WORKQUERY( 1 ) ) | |||||
| CALL SORGTSQR( M, N, MB1, NB1, AF, M, T1, NB1, WORKQUERY, -1, | |||||
| $ INFO ) | |||||
| LWORK = MAX( LWORK, INT( WORKQUERY( 1 ) ) ) | |||||
| * | |||||
| * In SGEMQRT, WORK is N*NB2_UB if SIDE = 'L', | |||||
| * or M*NB2_UB if SIDE = 'R'. | |||||
| * | |||||
| LWORK = MAX( LWORK, NB2_UB * N, NB2_UB * M ) | |||||
| * | |||||
| ALLOCATE ( WORK( LWORK ) ) | |||||
| * | |||||
| * End allocate memory for WORK. | |||||
| * | |||||
| * | |||||
| * Begin Householder reconstruction routines | |||||
| * | |||||
| * Factor the matrix A in the array AF. | |||||
| * | |||||
| SRNAMT = 'SLATSQR' | |||||
| CALL SLATSQR( M, N, MB1, NB1_UB, AF, M, T1, NB1, WORK, LWORK, | |||||
| $ INFO ) | |||||
| * | |||||
| * Copy the factor R into the array R. | |||||
| * | |||||
| SRNAMT = 'SLACPY' | |||||
| CALL SLACPY( 'U', N, N, AF, M, R, M ) | |||||
| * | |||||
| * Reconstruct the orthogonal matrix Q. | |||||
| * | |||||
| SRNAMT = 'SORGTSQR' | |||||
| CALL SORGTSQR( M, N, MB1, NB1, AF, M, T1, NB1, WORK, LWORK, | |||||
| $ INFO ) | |||||
| * | |||||
| * Perform the Householder reconstruction, the result is stored | |||||
| * the arrays AF and T2. | |||||
| * | |||||
| SRNAMT = 'SORHR_COL' | |||||
| CALL SORHR_COL( M, N, NB2, AF, M, T2, NB2, DIAG, INFO ) | |||||
| * | |||||
| * Compute the factor R_hr corresponding to the Householder | |||||
| * reconstructed Q_hr and place it in the upper triangle of AF to | |||||
| * match the Q storage format in DGEQRT. R_hr = R_tsqr * S, | |||||
| * this means changing the sign of I-th row of the matrix R_tsqr | |||||
| * according to sign of of I-th diagonal element DIAG(I) of the | |||||
| * matrix S. | |||||
| * | |||||
| SRNAMT = 'SLACPY' | |||||
| CALL SLACPY( 'U', N, N, R, M, AF, M ) | |||||
| * | |||||
| DO I = 1, N | |||||
| IF( DIAG( I ).EQ.-ONE ) THEN | |||||
| CALL SSCAL( N+1-I, -ONE, AF( I, I ), M ) | |||||
| END IF | |||||
| END DO | |||||
| * | |||||
| * End Householder reconstruction routines. | |||||
| * | |||||
| * | |||||
| * Generate the m-by-m matrix Q | |||||
| * | |||||
| CALL SLASET( 'Full', M, M, ZERO, ONE, Q, M ) | |||||
| * | |||||
| SRNAMT = 'SGEMQRT' | |||||
| CALL SGEMQRT( 'L', 'N', M, M, K, NB2_UB, AF, M, T2, NB2, Q, M, | |||||
| $ WORK, INFO ) | |||||
| * | |||||
| * Copy R | |||||
| * | |||||
| CALL SLASET( 'Full', M, N, ZERO, ZERO, R, M ) | |||||
| * | |||||
| CALL SLACPY( 'Upper', M, N, AF, M, R, M ) | |||||
| * | |||||
| * TEST 1 | |||||
| * Compute |R - (Q**T)*A| / ( eps * m * |A| ) and store in RESULT(1) | |||||
| * | |||||
| CALL SGEMM( 'T', 'N', M, N, M, -ONE, Q, M, A, M, ONE, R, M ) | |||||
| * | |||||
| ANORM = SLANGE( '1', M, N, A, M, RWORK ) | |||||
| RESID = SLANGE( '1', M, N, R, M, RWORK ) | |||||
| IF( ANORM.GT.ZERO ) THEN | |||||
| RESULT( 1 ) = RESID / ( EPS * MAX( 1, M ) * ANORM ) | |||||
| ELSE | |||||
| RESULT( 1 ) = ZERO | |||||
| END IF | |||||
| * | |||||
| * TEST 2 | |||||
| * Compute |I - (Q**T)*Q| / ( eps * m ) and store in RESULT(2) | |||||
| * | |||||
| CALL SLASET( 'Full', M, M, ZERO, ONE, R, M ) | |||||
| CALL SSYRK( 'U', 'T', M, M, -ONE, Q, M, ONE, R, M ) | |||||
| RESID = SLANSY( '1', 'Upper', M, R, M, RWORK ) | |||||
| RESULT( 2 ) = RESID / ( EPS * MAX( 1, M ) ) | |||||
| * | |||||
| * Generate random m-by-n matrix C | |||||
| * | |||||
| DO J = 1, N | |||||
| CALL SLARNV( 2, ISEED, M, C( 1, J ) ) | |||||
| END DO | |||||
| CNORM = SLANGE( '1', M, N, C, M, RWORK ) | |||||
| CALL SLACPY( 'Full', M, N, C, M, CF, M ) | |||||
| * | |||||
| * Apply Q to C as Q*C = CF | |||||
| * | |||||
| SRNAMT = 'SGEMQRT' | |||||
| CALL SGEMQRT( 'L', 'N', M, N, K, NB2_UB, AF, M, T2, NB2, CF, M, | |||||
| $ WORK, INFO ) | |||||
| * | |||||
| * TEST 3 | |||||
| * Compute |CF - Q*C| / ( eps * m * |C| ) | |||||
| * | |||||
| CALL SGEMM( 'N', 'N', M, N, M, -ONE, Q, M, C, M, ONE, CF, M ) | |||||
| RESID = SLANGE( '1', M, N, CF, M, RWORK ) | |||||
| IF( CNORM.GT.ZERO ) THEN | |||||
| RESULT( 3 ) = RESID / ( EPS * MAX( 1, M ) * CNORM ) | |||||
| ELSE | |||||
| RESULT( 3 ) = ZERO | |||||
| END IF | |||||
| * | |||||
| * Copy C into CF again | |||||
| * | |||||
| CALL SLACPY( 'Full', M, N, C, M, CF, M ) | |||||
| * | |||||
| * Apply Q to C as (Q**T)*C = CF | |||||
| * | |||||
| SRNAMT = 'SGEMQRT' | |||||
| CALL SGEMQRT( 'L', 'T', M, N, K, NB2_UB, AF, M, T2, NB2, CF, M, | |||||
| $ WORK, INFO ) | |||||
| * | |||||
| * TEST 4 | |||||
| * Compute |CF - (Q**T)*C| / ( eps * m * |C|) | |||||
| * | |||||
| CALL SGEMM( 'T', 'N', M, N, M, -ONE, Q, M, C, M, ONE, CF, M ) | |||||
| RESID = SLANGE( '1', M, N, CF, M, RWORK ) | |||||
| IF( CNORM.GT.ZERO ) THEN | |||||
| RESULT( 4 ) = RESID / ( EPS * MAX( 1, M ) * CNORM ) | |||||
| ELSE | |||||
| RESULT( 4 ) = ZERO | |||||
| END IF | |||||
| * | |||||
| * Generate random n-by-m matrix D and a copy DF | |||||
| * | |||||
| DO J = 1, M | |||||
| CALL SLARNV( 2, ISEED, N, D( 1, J ) ) | |||||
| END DO | |||||
| DNORM = SLANGE( '1', N, M, D, N, RWORK ) | |||||
| CALL SLACPY( 'Full', N, M, D, N, DF, N ) | |||||
| * | |||||
| * Apply Q to D as D*Q = DF | |||||
| * | |||||
| SRNAMT = 'SGEMQRT' | |||||
| CALL SGEMQRT( 'R', 'N', N, M, K, NB2_UB, AF, M, T2, NB2, DF, N, | |||||
| $ WORK, INFO ) | |||||
| * | |||||
| * TEST 5 | |||||
| * Compute |DF - D*Q| / ( eps * m * |D| ) | |||||
| * | |||||
| CALL SGEMM( 'N', 'N', N, M, M, -ONE, D, N, Q, M, ONE, DF, N ) | |||||
| RESID = SLANGE( '1', N, M, DF, N, RWORK ) | |||||
| IF( DNORM.GT.ZERO ) THEN | |||||
| RESULT( 5 ) = RESID / ( EPS * MAX( 1, M ) * DNORM ) | |||||
| ELSE | |||||
| RESULT( 5 ) = ZERO | |||||
| END IF | |||||
| * | |||||
| * Copy D into DF again | |||||
| * | |||||
| CALL SLACPY( 'Full', N, M, D, N, DF, N ) | |||||
| * | |||||
| * Apply Q to D as D*QT = DF | |||||
| * | |||||
| SRNAMT = 'SGEMQRT' | |||||
| CALL SGEMQRT( 'R', 'T', N, M, K, NB2_UB, AF, M, T2, NB2, DF, N, | |||||
| $ WORK, INFO ) | |||||
| * | |||||
| * TEST 6 | |||||
| * Compute |DF - D*(Q**T)| / ( eps * m * |D| ) | |||||
| * | |||||
| CALL SGEMM( 'N', 'T', N, M, M, -ONE, D, N, Q, M, ONE, DF, N ) | |||||
| RESID = SLANGE( '1', N, M, DF, N, RWORK ) | |||||
| IF( DNORM.GT.ZERO ) THEN | |||||
| RESULT( 6 ) = RESID / ( EPS * MAX( 1, M ) * DNORM ) | |||||
| ELSE | |||||
| RESULT( 6 ) = ZERO | |||||
| END IF | |||||
| * | |||||
| * Deallocate all arrays | |||||
| * | |||||
| DEALLOCATE ( A, AF, Q, R, RWORK, WORK, T1, T2, DIAG, | |||||
| $ C, D, CF, DF ) | |||||
| * | |||||
| RETURN | |||||
| * | |||||
| * End of SORHR_COL01 | |||||
| * | |||||
| END | |||||
| @@ -115,7 +115,7 @@ | |||||
| * .. | * .. | ||||
| * .. Local Arrays .. | * .. Local Arrays .. | ||||
| INTEGER ISEED( 4 ) | INTEGER ISEED( 4 ) | ||||
| REAL TQUERY( 5 ), WORKQUERY | |||||
| REAL TQUERY( 5 ), WORKQUERY( 1 ) | |||||
| * .. | * .. | ||||
| * .. External Functions .. | * .. External Functions .. | ||||
| REAL SLAMCH, SLANGE, SLANSY | REAL SLAMCH, SLANGE, SLANSY | ||||
| @@ -174,22 +174,22 @@ | |||||
| * | * | ||||
| CALL SGEQR( M, N, AF, M, TQUERY, -1, WORKQUERY, -1, INFO ) | CALL SGEQR( M, N, AF, M, TQUERY, -1, WORKQUERY, -1, INFO ) | ||||
| TSIZE = INT( TQUERY( 1 ) ) | TSIZE = INT( TQUERY( 1 ) ) | ||||
| LWORK = INT( WORKQUERY ) | |||||
| LWORK = INT( WORKQUERY( 1 ) ) | |||||
| CALL SGEMQR( 'L', 'N', M, M, K, AF, M, TQUERY, TSIZE, CF, M, | CALL SGEMQR( 'L', 'N', M, M, K, AF, M, TQUERY, TSIZE, CF, M, | ||||
| $ WORKQUERY, -1, INFO) | $ WORKQUERY, -1, INFO) | ||||
| LWORK = MAX( LWORK, INT( WORKQUERY ) ) | |||||
| LWORK = MAX( LWORK, INT( WORKQUERY( 1 ) ) ) | |||||
| CALL SGEMQR( 'L', 'N', M, N, K, AF, M, TQUERY, TSIZE, CF, M, | CALL SGEMQR( 'L', 'N', M, N, K, AF, M, TQUERY, TSIZE, CF, M, | ||||
| $ WORKQUERY, -1, INFO) | $ WORKQUERY, -1, INFO) | ||||
| LWORK = MAX( LWORK, INT( WORKQUERY ) ) | |||||
| LWORK = MAX( LWORK, INT( WORKQUERY( 1 ) ) ) | |||||
| CALL SGEMQR( 'L', 'T', M, N, K, AF, M, TQUERY, TSIZE, CF, M, | CALL SGEMQR( 'L', 'T', M, N, K, AF, M, TQUERY, TSIZE, CF, M, | ||||
| $ WORKQUERY, -1, INFO) | $ WORKQUERY, -1, INFO) | ||||
| LWORK = MAX( LWORK, INT( WORKQUERY ) ) | |||||
| LWORK = MAX( LWORK, INT( WORKQUERY( 1 ) ) ) | |||||
| CALL SGEMQR( 'R', 'N', N, M, K, AF, M, TQUERY, TSIZE, DF, N, | CALL SGEMQR( 'R', 'N', N, M, K, AF, M, TQUERY, TSIZE, DF, N, | ||||
| $ WORKQUERY, -1, INFO) | $ WORKQUERY, -1, INFO) | ||||
| LWORK = MAX( LWORK, INT( WORKQUERY ) ) | |||||
| LWORK = MAX( LWORK, INT( WORKQUERY( 1 ) ) ) | |||||
| CALL SGEMQR( 'R', 'T', N, M, K, AF, M, TQUERY, TSIZE, DF, N, | CALL SGEMQR( 'R', 'T', N, M, K, AF, M, TQUERY, TSIZE, DF, N, | ||||
| $ WORKQUERY, -1, INFO) | $ WORKQUERY, -1, INFO) | ||||
| LWORK = MAX( LWORK, INT( WORKQUERY ) ) | |||||
| LWORK = MAX( LWORK, INT( WORKQUERY( 1 ) ) ) | |||||
| ALLOCATE ( T( TSIZE ) ) | ALLOCATE ( T( TSIZE ) ) | ||||
| ALLOCATE ( WORK( LWORK ) ) | ALLOCATE ( WORK( LWORK ) ) | ||||
| srnamt = 'SGEQR' | srnamt = 'SGEQR' | ||||
| @@ -317,22 +317,22 @@ | |||||
| ELSE | ELSE | ||||
| CALL SGELQ( M, N, AF, M, TQUERY, -1, WORKQUERY, -1, INFO ) | CALL SGELQ( M, N, AF, M, TQUERY, -1, WORKQUERY, -1, INFO ) | ||||
| TSIZE = INT( TQUERY( 1 ) ) | TSIZE = INT( TQUERY( 1 ) ) | ||||
| LWORK = INT( WORKQUERY ) | |||||
| LWORK = INT( WORKQUERY( 1 )) | |||||
| CALL SGEMLQ( 'R', 'N', N, N, K, AF, M, TQUERY, TSIZE, Q, N, | CALL SGEMLQ( 'R', 'N', N, N, K, AF, M, TQUERY, TSIZE, Q, N, | ||||
| $ WORKQUERY, -1, INFO ) | $ WORKQUERY, -1, INFO ) | ||||
| LWORK = MAX( LWORK, INT( WORKQUERY ) ) | |||||
| LWORK = MAX( LWORK, INT( WORKQUERY( 1 ) ) ) | |||||
| CALL SGEMLQ( 'L', 'N', N, M, K, AF, M, TQUERY, TSIZE, DF, N, | CALL SGEMLQ( 'L', 'N', N, M, K, AF, M, TQUERY, TSIZE, DF, N, | ||||
| $ WORKQUERY, -1, INFO) | $ WORKQUERY, -1, INFO) | ||||
| LWORK = MAX( LWORK, INT( WORKQUERY ) ) | |||||
| LWORK = MAX( LWORK, INT( WORKQUERY( 1 ) ) ) | |||||
| CALL SGEMLQ( 'L', 'T', N, M, K, AF, M, TQUERY, TSIZE, DF, N, | CALL SGEMLQ( 'L', 'T', N, M, K, AF, M, TQUERY, TSIZE, DF, N, | ||||
| $ WORKQUERY, -1, INFO) | $ WORKQUERY, -1, INFO) | ||||
| LWORK = MAX( LWORK, INT( WORKQUERY ) ) | |||||
| LWORK = MAX( LWORK, INT( WORKQUERY( 1 ) ) ) | |||||
| CALL SGEMLQ( 'R', 'N', M, N, K, AF, M, TQUERY, TSIZE, CF, M, | CALL SGEMLQ( 'R', 'N', M, N, K, AF, M, TQUERY, TSIZE, CF, M, | ||||
| $ WORKQUERY, -1, INFO) | $ WORKQUERY, -1, INFO) | ||||
| LWORK = MAX( LWORK, INT( WORKQUERY ) ) | |||||
| LWORK = MAX( LWORK, INT( WORKQUERY( 1 ) ) ) | |||||
| CALL SGEMLQ( 'R', 'T', M, N, K, AF, M, TQUERY, TSIZE, CF, M, | CALL SGEMLQ( 'R', 'T', M, N, K, AF, M, TQUERY, TSIZE, CF, M, | ||||
| $ WORKQUERY, -1, INFO) | $ WORKQUERY, -1, INFO) | ||||
| LWORK = MAX( LWORK, INT( WORKQUERY ) ) | |||||
| LWORK = MAX( LWORK, INT( WORKQUERY( 1 ) ) ) | |||||
| ALLOCATE ( T( TSIZE ) ) | ALLOCATE ( T( TSIZE ) ) | ||||
| ALLOCATE ( WORK( LWORK ) ) | ALLOCATE ( WORK( LWORK ) ) | ||||
| srnamt = 'SGELQ' | srnamt = 'SGELQ' | ||||
| @@ -74,6 +74,8 @@ | |||||
| *> ZEQ | *> ZEQ | ||||
| *> ZQT | *> ZQT | ||||
| *> ZQX | *> ZQX | ||||
| *> ZTS | |||||
| *> ZHH | |||||
| *> \endverbatim | *> \endverbatim | ||||
| * | * | ||||
| * Parameters: | * Parameters: | ||||
| @@ -108,17 +110,17 @@ | |||||
| *> \author Univ. of Colorado Denver | *> \author Univ. of Colorado Denver | ||||
| *> \author NAG Ltd. | *> \author NAG Ltd. | ||||
| * | * | ||||
| *> \date November 2017 | |||||
| *> \date November 2019 | |||||
| * | * | ||||
| *> \ingroup complex16_lin | *> \ingroup complex16_lin | ||||
| * | * | ||||
| * ===================================================================== | * ===================================================================== | ||||
| PROGRAM ZCHKAA | PROGRAM ZCHKAA | ||||
| * | * | ||||
| * -- LAPACK test routine (version 3.8.0) -- | |||||
| * -- LAPACK test routine (version 3.9.0) -- | |||||
| * -- LAPACK is a software package provided by Univ. of Tennessee, -- | * -- LAPACK is a software package provided by Univ. of Tennessee, -- | ||||
| * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- | * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- | ||||
| * November 2017 | |||||
| * November 2019 | |||||
| * | * | ||||
| * ===================================================================== | * ===================================================================== | ||||
| * | * | ||||
| @@ -166,16 +168,16 @@ | |||||
| * .. External Subroutines .. | * .. External Subroutines .. | ||||
| EXTERNAL ALAREQ, ZCHKEQ, ZCHKGB, ZCHKGE, ZCHKGT, ZCHKHE, | EXTERNAL ALAREQ, ZCHKEQ, ZCHKGB, ZCHKGE, ZCHKGT, ZCHKHE, | ||||
| $ ZCHKHE_ROOK, ZCHKHE_RK, ZCHKHE_AA, ZCHKHP, | $ ZCHKHE_ROOK, ZCHKHE_RK, ZCHKHE_AA, ZCHKHP, | ||||
| $ ZCHKLQ, ZCHKPB, ZCHKPO, ZCHKPS, ZCHKPP, ZCHKPT, | |||||
| $ ZCHKQ3, ZCHKQL, ZCHKQR, ZCHKRQ, ZCHKSP, ZCHKSY, | |||||
| $ ZCHKSY_ROOK, ZCHKSY_RK, ZCHKSY_AA, ZCHKTB, | |||||
| $ ZCHKTP, ZCHKTR, ZCHKTZ, ZDRVGB, ZDRVGE, ZDRVGT, | |||||
| $ ZDRVHE, ZDRVHE_ROOK, ZDRVHE_RK, ZDRVHE_AA, | |||||
| $ ZDRVHE_AA_2STAGE, ZDRVHP, ZDRVLS, ZDRVPB, | |||||
| $ ZDRVPO, ZDRVPP, ZDRVPT, ZDRVSP, ZDRVSY, | |||||
| $ ZDRVSY_ROOK, ZDRVSY_RK, ZDRVSY_AA, | |||||
| $ ZDRVSY_AA_2STAGE, ILAVER, ZCHKQRT, ZCHKQRTP, | |||||
| $ ZCHKLQT, ZCHKLQTP, ZCHKTSQR | |||||
| $ ZCHKLQ, ZCHKUNHR_COL, ZCHKPB, ZCHKPO, ZCHKPS, | |||||
| $ ZCHKPP, ZCHKPT, ZCHKQ3, ZCHKQL, ZCHKQR, ZCHKRQ, | |||||
| $ ZCHKSP, ZCHKSY, ZCHKSY_ROOK, ZCHKSY_RK, | |||||
| $ ZCHKSY_AA, ZCHKTB, ZCHKTP, ZCHKTR, ZCHKTZ, | |||||
| $ ZDRVGB, ZDRVGE, ZDRVGT, ZDRVHE, ZDRVHE_ROOK, | |||||
| $ ZDRVHE_RK, ZDRVHE_AA, ZDRVHE_AA_2STAGE, ZDRVHP, | |||||
| $ ZDRVLS, ZDRVPB, ZDRVPO, ZDRVPP, ZDRVPT, | |||||
| $ ZDRVSP, ZDRVSY, ZDRVSY_ROOK, ZDRVSY_RK, | |||||
| $ ZDRVSY_AA, ZDRVSY_AA_2STAGE, ILAVER, ZCHKQRT, | |||||
| $ ZCHKQRTP, ZCHKLQT, ZCHKLQTP, ZCHKTSQR | |||||
| * .. | * .. | ||||
| * .. Scalars in Common .. | * .. Scalars in Common .. | ||||
| LOGICAL LERR, OK | LOGICAL LERR, OK | ||||
| @@ -679,7 +681,7 @@ | |||||
| * | * | ||||
| * HK: Hermitian indefinite matrices, | * HK: Hermitian indefinite matrices, | ||||
| * with bounded Bunch-Kaufman (rook) pivoting algorithm, | * with bounded Bunch-Kaufman (rook) pivoting algorithm, | ||||
| * differnet matrix storage format than HR path version. | |||||
| * different matrix storage format than HR path version. | |||||
| * | * | ||||
| NTYPES = 10 | NTYPES = 10 | ||||
| CALL ALAREQ( PATH, NMATS, DOTYPE, NTYPES, NIN, NOUT ) | CALL ALAREQ( PATH, NMATS, DOTYPE, NTYPES, NIN, NOUT ) | ||||
| @@ -839,7 +841,7 @@ | |||||
| * | * | ||||
| * SK: symmetric indefinite matrices, | * SK: symmetric indefinite matrices, | ||||
| * with bounded Bunch-Kaufman (rook) pivoting algorithm, | * with bounded Bunch-Kaufman (rook) pivoting algorithm, | ||||
| * differnet matrix storage format than SR path version. | |||||
| * different matrix storage format than SR path version. | |||||
| * | * | ||||
| NTYPES = 11 | NTYPES = 11 | ||||
| CALL ALAREQ( PATH, NMATS, DOTYPE, NTYPES, NIN, NOUT ) | CALL ALAREQ( PATH, NMATS, DOTYPE, NTYPES, NIN, NOUT ) | ||||
| @@ -1201,6 +1203,17 @@ | |||||
| ELSE | ELSE | ||||
| WRITE( NOUT, FMT = 9989 )PATH | WRITE( NOUT, FMT = 9989 )PATH | ||||
| END IF | END IF | ||||
| * | |||||
| ELSE IF( LSAMEN( 2, C2, 'HH' ) ) THEN | |||||
| * | |||||
| * HH: Householder reconstruction for tall-skinny matrices | |||||
| * | |||||
| IF( TSTCHK ) THEN | |||||
| CALL ZCHKUNHR_COL( THRESH, TSTERR, NM, MVAL, NN, NVAL, NNB, | |||||
| $ NBVAL, NOUT ) | |||||
| ELSE | |||||
| WRITE( NOUT, FMT = 9989 ) PATH | |||||
| END IF | |||||
| * | * | ||||
| ELSE | ELSE | ||||
| * | * | ||||
| @@ -0,0 +1,239 @@ | |||||
| *> \brief \b ZCHKUNHR_COL | |||||
| * | |||||
| * =========== DOCUMENTATION =========== | |||||
| * | |||||
| * Online html documentation available at | |||||
| * http://www.netlib.org/lapack/explore-html/ | |||||
| * | |||||
| * Definition: | |||||
| * =========== | |||||
| * | |||||
| * SUBROUTINE ZCHKUNHR_COL( THRESH, TSTERR, NM, MVAL, NN, NVAL, NNB, | |||||
| * NBVAL, NOUT ) | |||||
| * | |||||
| * .. Scalar Arguments .. | |||||
| * LOGICAL TSTERR | |||||
| * INTEGER NM, NN, NNB, NOUT | |||||
| * DOUBLE PRECISION THRESH | |||||
| * .. | |||||
| * .. Array Arguments .. | |||||
| * INTEGER MVAL( * ), NBVAL( * ), NVAL( * ) | |||||
| * | |||||
| *> \par Purpose: | |||||
| * ============= | |||||
| *> | |||||
| *> \verbatim | |||||
| *> | |||||
| *> ZCHKUNHR_COL tests ZUNHR_COL using ZLATSQR and ZGEMQRT. Therefore, ZLATSQR | |||||
| *> (used in ZGEQR) and ZGEMQRT (used in ZGEMQR) have to be tested | |||||
| *> before this test. | |||||
| *> | |||||
| *> \endverbatim | |||||
| * | |||||
| * Arguments: | |||||
| * ========== | |||||
| * | |||||
| *> \param[in] THRESH | |||||
| *> \verbatim | |||||
| *> THRESH is DOUBLE PRECISION | |||||
| *> The threshold value for the test ratios. A result is | |||||
| *> included in the output file if RESULT >= THRESH. To have | |||||
| *> every test ratio printed, use THRESH = 0. | |||||
| *> \endverbatim | |||||
| *> | |||||
| *> \param[in] TSTERR | |||||
| *> \verbatim | |||||
| *> TSTERR is LOGICAL | |||||
| *> Flag that indicates whether error exits are to be tested. | |||||
| *> \endverbatim | |||||
| *> | |||||
| *> \param[in] NM | |||||
| *> \verbatim | |||||
| *> NM is INTEGER | |||||
| *> The number of values of M contained in the vector MVAL. | |||||
| *> \endverbatim | |||||
| *> | |||||
| *> \param[in] MVAL | |||||
| *> \verbatim | |||||
| *> MVAL is INTEGER array, dimension (NM) | |||||
| *> The values of the matrix row dimension M. | |||||
| *> \endverbatim | |||||
| *> | |||||
| *> \param[in] NN | |||||
| *> \verbatim | |||||
| *> NN is INTEGER | |||||
| *> The number of values of N contained in the vector NVAL. | |||||
| *> \endverbatim | |||||
| *> | |||||
| *> \param[in] NVAL | |||||
| *> \verbatim | |||||
| *> NVAL is INTEGER array, dimension (NN) | |||||
| *> The values of the matrix column dimension N. | |||||
| *> \endverbatim | |||||
| *> | |||||
| *> \param[in] NNB | |||||
| *> \verbatim | |||||
| *> NNB is INTEGER | |||||
| *> The number of values of NB contained in the vector NBVAL. | |||||
| *> \endverbatim | |||||
| *> | |||||
| *> \param[in] NBVAL | |||||
| *> \verbatim | |||||
| *> NBVAL is INTEGER array, dimension (NBVAL) | |||||
| *> The values of the blocksize NB. | |||||
| *> \endverbatim | |||||
| *> | |||||
| *> \param[in] NOUT | |||||
| *> \verbatim | |||||
| *> NOUT is INTEGER | |||||
| *> The unit number for output. | |||||
| *> \endverbatim | |||||
| * | |||||
| * Authors: | |||||
| * ======== | |||||
| * | |||||
| *> \author Univ. of Tennessee | |||||
| *> \author Univ. of California Berkeley | |||||
| *> \author Univ. of Colorado Denver | |||||
| *> \author NAG Ltd. | |||||
| * | |||||
| *> \date November 2019 | |||||
| * | |||||
| *> \ingroup complex16_lin | |||||
| * | |||||
| * ===================================================================== | |||||
| SUBROUTINE ZCHKUNHR_COL( THRESH, TSTERR, NM, MVAL, NN, NVAL, NNB, | |||||
| $ NBVAL, NOUT ) | |||||
| IMPLICIT NONE | |||||
| * | |||||
| * -- LAPACK test routine (version 3.7.0) -- | |||||
| * -- LAPACK is a software package provided by Univ. of Tennessee, -- | |||||
| * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- | |||||
| * December 2016 | |||||
| * | |||||
| * .. Scalar Arguments .. | |||||
| LOGICAL TSTERR | |||||
| INTEGER NM, NN, NNB, NOUT | |||||
| DOUBLE PRECISION THRESH | |||||
| * .. | |||||
| * .. Array Arguments .. | |||||
| INTEGER MVAL( * ), NBVAL( * ), NVAL( * ) | |||||
| * .. | |||||
| * | |||||
| * ===================================================================== | |||||
| * | |||||
| * .. Parameters .. | |||||
| INTEGER NTESTS | |||||
| PARAMETER ( NTESTS = 6 ) | |||||
| * .. | |||||
| * .. Local Scalars .. | |||||
| CHARACTER(LEN=3) PATH | |||||
| INTEGER I, IMB1, INB1, INB2, J, T, M, N, MB1, NB1, | |||||
| $ NB2, NFAIL, NERRS, NRUN | |||||
| * | |||||
| * .. Local Arrays .. | |||||
| DOUBLE PRECISION RESULT( NTESTS ) | |||||
| * .. | |||||
| * .. External Subroutines .. | |||||
| EXTERNAL ALAHD, ALASUM, ZERRUNHR_COL, ZUNHR_COL01 | |||||
| * .. | |||||
| * .. Intrinsic Functions .. | |||||
| INTRINSIC MAX, MIN | |||||
| * .. | |||||
| * .. Scalars in Common .. | |||||
| LOGICAL LERR, OK | |||||
| CHARACTER(LEN=32) SRNAMT | |||||
| INTEGER INFOT, NUNIT | |||||
| * .. | |||||
| * .. Common blocks .. | |||||
| COMMON / INFOC / INFOT, NUNIT, OK, LERR | |||||
| COMMON / SRNAMC / SRNAMT | |||||
| * .. | |||||
| * .. Executable Statements .. | |||||
| * | |||||
| * Initialize constants | |||||
| * | |||||
| PATH( 1: 1 ) = 'Z' | |||||
| PATH( 2: 3 ) = 'HH' | |||||
| NRUN = 0 | |||||
| NFAIL = 0 | |||||
| NERRS = 0 | |||||
| * | |||||
| * Test the error exits | |||||
| * | |||||
| IF( TSTERR ) CALL ZERRUNHR_COL( PATH, NOUT ) | |||||
| INFOT = 0 | |||||
| * | |||||
| * Do for each value of M in MVAL. | |||||
| * | |||||
| DO I = 1, NM | |||||
| M = MVAL( I ) | |||||
| * | |||||
| * Do for each value of N in NVAL. | |||||
| * | |||||
| DO J = 1, NN | |||||
| N = NVAL( J ) | |||||
| * | |||||
| * Only for M >= N | |||||
| * | |||||
| IF ( MIN( M, N ).GT.0 .AND. M.GE.N ) THEN | |||||
| * | |||||
| * Do for each possible value of MB1 | |||||
| * | |||||
| DO IMB1 = 1, NNB | |||||
| MB1 = NBVAL( IMB1 ) | |||||
| * | |||||
| * Only for MB1 > N | |||||
| * | |||||
| IF ( MB1.GT.N ) THEN | |||||
| * | |||||
| * Do for each possible value of NB1 | |||||
| * | |||||
| DO INB1 = 1, NNB | |||||
| NB1 = NBVAL( INB1 ) | |||||
| * | |||||
| * Do for each possible value of NB2 | |||||
| * | |||||
| DO INB2 = 1, NNB | |||||
| NB2 = NBVAL( INB2 ) | |||||
| * | |||||
| IF( NB1.GT.0 .AND. NB2.GT.0 ) THEN | |||||
| * | |||||
| * Test ZUNHR_COL | |||||
| * | |||||
| CALL ZUNHR_COL01( M, N, MB1, NB1, NB2, | |||||
| $ RESULT ) | |||||
| * | |||||
| * Print information about the tests that did | |||||
| * not pass the threshold. | |||||
| * | |||||
| DO T = 1, NTESTS | |||||
| IF( RESULT( T ).GE.THRESH ) THEN | |||||
| IF( NFAIL.EQ.0 .AND. NERRS.EQ.0 ) | |||||
| $ CALL ALAHD( NOUT, PATH ) | |||||
| WRITE( NOUT, FMT = 9999 ) M, N, MB1, | |||||
| $ NB1, NB2, T, RESULT( T ) | |||||
| NFAIL = NFAIL + 1 | |||||
| END IF | |||||
| END DO | |||||
| NRUN = NRUN + NTESTS | |||||
| END IF | |||||
| END DO | |||||
| END DO | |||||
| END IF | |||||
| END DO | |||||
| END IF | |||||
| END DO | |||||
| END DO | |||||
| * | |||||
| * Print a summary of the results. | |||||
| * | |||||
| CALL ALASUM( PATH, NOUT, NFAIL, NRUN, NERRS ) | |||||
| * | |||||
| 9999 FORMAT( 'M=', I5, ', N=', I5, ', MB1=', I5, | |||||
| $ ', NB1=', I5, ', NB2=', I5,' test(', I2, ')=', G12.5 ) | |||||
| RETURN | |||||
| * | |||||
| * End of ZCHKUNHR_COL | |||||
| * | |||||
| END | |||||
| @@ -98,6 +98,7 @@ | |||||
| *> \param[out] E | *> \param[out] E | ||||
| *> \verbatim | *> \verbatim | ||||
| *> E is COMPLEX*16 array, dimension (NMAX) | *> E is COMPLEX*16 array, dimension (NMAX) | ||||
| *> \endverbatim | |||||
| *> | *> | ||||
| *> \param[out] AINV | *> \param[out] AINV | ||||
| *> \verbatim | *> \verbatim | ||||
| @@ -237,13 +237,13 @@ | |||||
| DOUBLE PRECISION EPS, NORMA, NORMB, RCOND | DOUBLE PRECISION EPS, NORMA, NORMB, RCOND | ||||
| * .. | * .. | ||||
| * .. Local Arrays .. | * .. Local Arrays .. | ||||
| INTEGER ISEED( 4 ), ISEEDY( 4 ), IWQ | |||||
| DOUBLE PRECISION RESULT( NTESTS ), RWQ | |||||
| COMPLEX*16 WQ | |||||
| INTEGER ISEED( 4 ), ISEEDY( 4 ), IWQ( 1 ) | |||||
| DOUBLE PRECISION RESULT( NTESTS ), RWQ( 1 ) | |||||
| COMPLEX*16 WQ( 1 ) | |||||
| * .. | * .. | ||||
| * .. Allocatable Arrays .. | * .. Allocatable Arrays .. | ||||
| COMPLEX*16, ALLOCATABLE :: WORK (:) | COMPLEX*16, ALLOCATABLE :: WORK (:) | ||||
| DOUBLE PRECISION, ALLOCATABLE :: RWORK (:) | |||||
| DOUBLE PRECISION, ALLOCATABLE :: RWORK (:), WORK2 (:) | |||||
| INTEGER, ALLOCATABLE :: IWORK (:) | INTEGER, ALLOCATABLE :: IWORK (:) | ||||
| * .. | * .. | ||||
| * .. External Functions .. | * .. External Functions .. | ||||
| @@ -363,32 +363,32 @@ | |||||
| * Compute workspace needed for ZGELS | * Compute workspace needed for ZGELS | ||||
| CALL ZGELS( TRANS, M, N, NRHS, A, LDA, | CALL ZGELS( TRANS, M, N, NRHS, A, LDA, | ||||
| $ B, LDB, WQ, -1, INFO ) | $ B, LDB, WQ, -1, INFO ) | ||||
| LWORK_ZGELS = INT ( WQ ) | |||||
| LWORK_ZGELS = INT ( WQ( 1 ) ) | |||||
| * Compute workspace needed for ZGETSLS | * Compute workspace needed for ZGETSLS | ||||
| CALL ZGETSLS( TRANS, M, N, NRHS, A, LDA, | CALL ZGETSLS( TRANS, M, N, NRHS, A, LDA, | ||||
| $ B, LDB, WQ, -1, INFO ) | $ B, LDB, WQ, -1, INFO ) | ||||
| LWORK_ZGETSLS = INT( WQ ) | |||||
| LWORK_ZGETSLS = INT( WQ( 1 ) ) | |||||
| ENDDO | ENDDO | ||||
| END IF | END IF | ||||
| * Compute workspace needed for ZGELSY | * Compute workspace needed for ZGELSY | ||||
| CALL ZGELSY( M, N, NRHS, A, LDA, B, LDB, IWQ, | CALL ZGELSY( M, N, NRHS, A, LDA, B, LDB, IWQ, | ||||
| $ RCOND, CRANK, WQ, -1, RWORK, INFO ) | $ RCOND, CRANK, WQ, -1, RWORK, INFO ) | ||||
| LWORK_ZGELSY = INT( WQ ) | |||||
| LWORK_ZGELSY = INT( WQ( 1 ) ) | |||||
| LRWORK_ZGELSY = 2*N | LRWORK_ZGELSY = 2*N | ||||
| * Compute workspace needed for ZGELSS | * Compute workspace needed for ZGELSS | ||||
| CALL ZGELSS( M, N, NRHS, A, LDA, B, LDB, S, | CALL ZGELSS( M, N, NRHS, A, LDA, B, LDB, S, | ||||
| $ RCOND, CRANK, WQ, -1 , RWORK, | $ RCOND, CRANK, WQ, -1 , RWORK, | ||||
| $ INFO ) | $ INFO ) | ||||
| LWORK_ZGELSS = INT( WQ ) | |||||
| LWORK_ZGELSS = INT( WQ( 1 ) ) | |||||
| LRWORK_ZGELSS = 5*MNMIN | LRWORK_ZGELSS = 5*MNMIN | ||||
| * Compute workspace needed for ZGELSD | * Compute workspace needed for ZGELSD | ||||
| CALL ZGELSD( M, N, NRHS, A, LDA, B, LDB, S, | CALL ZGELSD( M, N, NRHS, A, LDA, B, LDB, S, | ||||
| $ RCOND, CRANK, WQ, -1, RWQ, IWQ, | $ RCOND, CRANK, WQ, -1, RWQ, IWQ, | ||||
| $ INFO ) | $ INFO ) | ||||
| LWORK_ZGELSD = INT( WQ ) | |||||
| LRWORK_ZGELSD = INT( RWQ ) | |||||
| LWORK_ZGELSD = INT( WQ( 1 ) ) | |||||
| LRWORK_ZGELSD = INT( RWQ ( 1 ) ) | |||||
| * Compute LIWORK workspace needed for ZGELSY and ZGELSD | * Compute LIWORK workspace needed for ZGELSY and ZGELSD | ||||
| LIWORK = MAX( LIWORK, N, IWQ ) | |||||
| LIWORK = MAX( LIWORK, N, IWQ( 1 ) ) | |||||
| * Compute LRWORK workspace needed for ZGELSY, ZGELSS and ZGELSD | * Compute LRWORK workspace needed for ZGELSY, ZGELSS and ZGELSD | ||||
| LRWORK = MAX( LRWORK, LRWORK_ZGELSY, | LRWORK = MAX( LRWORK, LRWORK_ZGELSY, | ||||
| $ LRWORK_ZGELSS, LRWORK_ZGELSD ) | $ LRWORK_ZGELSS, LRWORK_ZGELSD ) | ||||
| @@ -406,6 +406,7 @@ | |||||
| LWLSY = LWORK | LWLSY = LWORK | ||||
| * | * | ||||
| ALLOCATE( WORK( LWORK ) ) | ALLOCATE( WORK( LWORK ) ) | ||||
| ALLOCATE( WORK2( 2 * LWORK ) ) | |||||
| ALLOCATE( IWORK( LIWORK ) ) | ALLOCATE( IWORK( LIWORK ) ) | ||||
| ALLOCATE( RWORK( LRWORK ) ) | ALLOCATE( RWORK( LRWORK ) ) | ||||
| * | * | ||||
| @@ -596,7 +597,7 @@ | |||||
| $ CALL ZLACPY( 'Full', NROWS, NRHS, | $ CALL ZLACPY( 'Full', NROWS, NRHS, | ||||
| $ COPYB, LDB, C, LDB ) | $ COPYB, LDB, C, LDB ) | ||||
| CALL ZQRT16( TRANS, M, N, NRHS, COPYA, | CALL ZQRT16( TRANS, M, N, NRHS, COPYA, | ||||
| $ LDA, B, LDB, C, LDB, WORK, | |||||
| $ LDA, B, LDB, C, LDB, WORK2, | |||||
| $ RESULT( 15 ) ) | $ RESULT( 15 ) ) | ||||
| * | * | ||||
| IF( ( ITRAN.EQ.1 .AND. M.GE.N ) .OR. | IF( ( ITRAN.EQ.1 .AND. M.GE.N ) .OR. | ||||
| @@ -0,0 +1,164 @@ | |||||
| *> \brief \b ZERRUNHR_COL | |||||
| * | |||||
| * =========== DOCUMENTATION =========== | |||||
| * | |||||
| * Online html documentation available at | |||||
| * http://www.netlib.org/lapack/explore-html/ | |||||
| * | |||||
| * Definition: | |||||
| * =========== | |||||
| * | |||||
| * SUBROUTINE ZERRUNHR_COL( PATH, NUNIT ) | |||||
| * | |||||
| * .. Scalar Arguments .. | |||||
| * CHARACTER*3 PATH | |||||
| * INTEGER NUNIT | |||||
| * .. | |||||
| * | |||||
| * | |||||
| *> \par Purpose: | |||||
| * ============= | |||||
| *> | |||||
| *> \verbatim | |||||
| *> | |||||
| *> ZERRUNHR_COL tests the error exits for ZUNHR_COL that does | |||||
| *> Householder reconstruction from the ouput of tall-skinny | |||||
| *> factorization ZLATSQR. | |||||
| *> \endverbatim | |||||
| * | |||||
| * Arguments: | |||||
| * ========== | |||||
| * | |||||
| *> \param[in] PATH | |||||
| *> \verbatim | |||||
| *> PATH is CHARACTER*3 | |||||
| *> The LAPACK path name for the routines to be tested. | |||||
| *> \endverbatim | |||||
| *> | |||||
| *> \param[in] NUNIT | |||||
| *> \verbatim | |||||
| *> NUNIT is INTEGER | |||||
| *> The unit number for output. | |||||
| *> \endverbatim | |||||
| * | |||||
| * Authors: | |||||
| * ======== | |||||
| * | |||||
| *> \author Univ. of Tennessee | |||||
| *> \author Univ. of California Berkeley | |||||
| *> \author Univ. of Colorado Denver | |||||
| *> \author NAG Ltd. | |||||
| * | |||||
| *> \date November 2019 | |||||
| * | |||||
| *> \ingroup complex16_lin | |||||
| * | |||||
| * ===================================================================== | |||||
| SUBROUTINE ZERRUNHR_COL( PATH, NUNIT ) | |||||
| IMPLICIT NONE | |||||
| * | |||||
| * -- LAPACK test routine (version 3.9.0) -- | |||||
| * -- LAPACK is a software package provided by Univ. of Tennessee, -- | |||||
| * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- | |||||
| * November 2019 | |||||
| * | |||||
| * .. Scalar Arguments .. | |||||
| CHARACTER(LEN=3) PATH | |||||
| INTEGER NUNIT | |||||
| * .. | |||||
| * | |||||
| * ===================================================================== | |||||
| * | |||||
| * .. Parameters .. | |||||
| INTEGER NMAX | |||||
| PARAMETER ( NMAX = 2 ) | |||||
| * .. | |||||
| * .. Local Scalars .. | |||||
| INTEGER I, INFO, J | |||||
| * .. | |||||
| * .. Local Arrays .. | |||||
| COMPLEX*16 A( NMAX, NMAX ), T( NMAX, NMAX ), D(NMAX) | |||||
| * .. | |||||
| * .. External Subroutines .. | |||||
| EXTERNAL ALAESM, CHKXER, ZUNHR_COL | |||||
| * .. | |||||
| * .. Scalars in Common .. | |||||
| LOGICAL LERR, OK | |||||
| CHARACTER(LEN=32) SRNAMT | |||||
| INTEGER INFOT, NOUT | |||||
| * .. | |||||
| * .. Common blocks .. | |||||
| COMMON / INFOC / INFOT, NOUT, OK, LERR | |||||
| COMMON / SRNAMC / SRNAMT | |||||
| * .. | |||||
| * .. Intrinsic Functions .. | |||||
| INTRINSIC DBLE, DCMPLX | |||||
| * .. | |||||
| * .. Executable Statements .. | |||||
| * | |||||
| NOUT = NUNIT | |||||
| WRITE( NOUT, FMT = * ) | |||||
| * | |||||
| * Set the variables to innocuous values. | |||||
| * | |||||
| DO J = 1, NMAX | |||||
| DO I = 1, NMAX | |||||
| A( I, J ) = DCMPLX( 1.D+0 / DBLE( I+J ) ) | |||||
| T( I, J ) = DCMPLX( 1.D+0 / DBLE( I+J ) ) | |||||
| END DO | |||||
| D( J ) = ( 0.D+0, 0.D+0 ) | |||||
| END DO | |||||
| OK = .TRUE. | |||||
| * | |||||
| * Error exits for Householder reconstruction | |||||
| * | |||||
| * ZUNHR_COL | |||||
| * | |||||
| SRNAMT = 'ZUNHR_COL' | |||||
| * | |||||
| INFOT = 1 | |||||
| CALL ZUNHR_COL( -1, 0, 1, A, 1, T, 1, D, INFO ) | |||||
| CALL CHKXER( 'ZUNHR_COL', INFOT, NOUT, LERR, OK ) | |||||
| * | |||||
| INFOT = 2 | |||||
| CALL ZUNHR_COL( 0, -1, 1, A, 1, T, 1, D, INFO ) | |||||
| CALL CHKXER( 'ZUNHR_COL', INFOT, NOUT, LERR, OK ) | |||||
| CALL ZUNHR_COL( 1, 2, 1, A, 1, T, 1, D, INFO ) | |||||
| CALL CHKXER( 'ZUNHR_COL', INFOT, NOUT, LERR, OK ) | |||||
| * | |||||
| INFOT = 3 | |||||
| CALL ZUNHR_COL( 0, 0, -1, A, 1, T, 1, D, INFO ) | |||||
| CALL CHKXER( 'ZUNHR_COL', INFOT, NOUT, LERR, OK ) | |||||
| * | |||||
| CALL ZUNHR_COL( 0, 0, 0, A, 1, T, 1, D, INFO ) | |||||
| CALL CHKXER( 'ZUNHR_COL', INFOT, NOUT, LERR, OK ) | |||||
| * | |||||
| INFOT = 5 | |||||
| CALL ZUNHR_COL( 0, 0, 1, A, -1, T, 1, D, INFO ) | |||||
| CALL CHKXER( 'ZUNHR_COL', INFOT, NOUT, LERR, OK ) | |||||
| * | |||||
| CALL ZUNHR_COL( 0, 0, 1, A, 0, T, 1, D, INFO ) | |||||
| CALL CHKXER( 'ZUNHR_COL', INFOT, NOUT, LERR, OK ) | |||||
| * | |||||
| CALL ZUNHR_COL( 2, 0, 1, A, 1, T, 1, D, INFO ) | |||||
| CALL CHKXER( 'ZUNHR_COL', INFOT, NOUT, LERR, OK ) | |||||
| * | |||||
| INFOT = 7 | |||||
| CALL ZUNHR_COL( 0, 0, 1, A, 1, T, -1, D, INFO ) | |||||
| CALL CHKXER( 'ZUNHR_COL', INFOT, NOUT, LERR, OK ) | |||||
| * | |||||
| CALL ZUNHR_COL( 0, 0, 1, A, 1, T, 0, D, INFO ) | |||||
| CALL CHKXER( 'ZUNHR_COL', INFOT, NOUT, LERR, OK ) | |||||
| * | |||||
| CALL ZUNHR_COL( 4, 3, 2, A, 4, T, 1, D, INFO ) | |||||
| CALL CHKXER( 'ZUNHR_COL', INFOT, NOUT, LERR, OK ) | |||||
| * | |||||
| * Print a summary line. | |||||
| * | |||||
| CALL ALAESM( PATH, OK, NOUT ) | |||||
| * | |||||
| RETURN | |||||
| * | |||||
| * End of ZERRUNHR_COL | |||||
| * | |||||
| END | |||||
| @@ -94,7 +94,7 @@ | |||||
| $ ZHPSV, ZHPSVX, ZPBSV, ZPBSVX, ZPOSV, ZPOSVX, | $ ZHPSV, ZHPSVX, ZPBSV, ZPBSVX, ZPOSV, ZPOSVX, | ||||
| $ ZPPSV, ZPPSVX, ZPTSV, ZPTSVX, ZSPSV, ZSPSVX, | $ ZPPSV, ZPPSVX, ZPTSV, ZPTSVX, ZSPSV, ZSPSVX, | ||||
| $ ZSYSV, ZSYSV_AA, ZSYSV_RK, ZSYSV_ROOK, | $ ZSYSV, ZSYSV_AA, ZSYSV_RK, ZSYSV_ROOK, | ||||
| $ ZSYSVX, ZSYSV_AA_2STAGE | |||||
| $ ZSYSVX, ZHESV_AA_2STAGE | |||||
| * .. | * .. | ||||
| * .. Scalars in Common .. | * .. Scalars in Common .. | ||||
| LOGICAL LERR, OK | LOGICAL LERR, OK | ||||
| @@ -721,7 +721,7 @@ | |||||
| * | * | ||||
| ELSE IF( LSAMEN( 2, C2, 'H2' ) ) THEN | ELSE IF( LSAMEN( 2, C2, 'H2' ) ) THEN | ||||
| * | * | ||||
| * CHESV_AASEN_2STAGE | |||||
| * ZHESV_AASEN_2STAGE | |||||
| * | * | ||||
| SRNAMT = 'ZHESV_AA_2STAGE' | SRNAMT = 'ZHESV_AA_2STAGE' | ||||
| INFOT = 1 | INFOT = 1 | ||||
| @@ -741,7 +741,7 @@ | |||||
| $ W, 1, INFO ) | $ W, 1, INFO ) | ||||
| CALL CHKXER( 'ZHESV_AA_2STAGE', INFOT, NOUT, LERR, OK ) | CALL CHKXER( 'ZHESV_AA_2STAGE', INFOT, NOUT, LERR, OK ) | ||||
| INFOT = 11 | INFOT = 11 | ||||
| CALL ZHESV_AA_2STAGE( 'U', 2, 1, A, 2, A, 2, IP, IP, B, 1, | |||||
| CALL ZHESV_AA_2STAGE( 'U', 2, 1, A, 2, A, 8, IP, IP, B, 1, | |||||
| $ W, 1, INFO ) | $ W, 1, INFO ) | ||||
| CALL CHKXER( 'ZHESV_AA_2STAGE', INFOT, NOUT, LERR, OK ) | CALL CHKXER( 'ZHESV_AA_2STAGE', INFOT, NOUT, LERR, OK ) | ||||
| INFOT = 7 | INFOT = 7 | ||||
| @@ -749,6 +749,36 @@ | |||||
| $ W, 1, INFO ) | $ W, 1, INFO ) | ||||
| CALL CHKXER( 'ZHESV_AA_2STAGE', INFOT, NOUT, LERR, OK ) | CALL CHKXER( 'ZHESV_AA_2STAGE', INFOT, NOUT, LERR, OK ) | ||||
| * | * | ||||
| ELSE IF( LSAMEN( 2, C2, 'S2' ) ) THEN | |||||
| * | |||||
| * ZSYSV_AASEN_2STAGE | |||||
| * | |||||
| SRNAMT = 'ZSYSV_AA_2STAGE' | |||||
| INFOT = 1 | |||||
| CALL ZSYSV_AA_2STAGE( '/', 0, 0, A, 1, A, 1, IP, IP, B, 1, | |||||
| $ W, 1, INFO ) | |||||
| CALL CHKXER( 'ZSYSV_AA_2STAGE', INFOT, NOUT, LERR, OK ) | |||||
| INFOT = 2 | |||||
| CALL ZSYSV_AA_2STAGE( 'U', -1, 0, A, 1, A, 1, IP, IP, B, 1, | |||||
| $ W, 1, INFO ) | |||||
| CALL CHKXER( 'ZSYSV_AA_2STAGE', INFOT, NOUT, LERR, OK ) | |||||
| INFOT = 3 | |||||
| CALL ZSYSV_AA_2STAGE( 'U', 0, -1, A, 1, A, 1, IP, IP, B, 1, | |||||
| $ W, 1, INFO ) | |||||
| CALL CHKXER( 'ZSYSV_AA_2STAGE', INFOT, NOUT, LERR, OK ) | |||||
| INFOT = 5 | |||||
| CALL ZSYSV_AA_2STAGE( 'U', 2, 1, A, 1, A, 1, IP, IP, B, 1, | |||||
| $ W, 1, INFO ) | |||||
| CALL CHKXER( 'ZSYSV_AA_2STAGE', INFOT, NOUT, LERR, OK ) | |||||
| INFOT = 11 | |||||
| CALL ZSYSV_AA_2STAGE( 'U', 2, 1, A, 2, A, 8, IP, IP, B, 1, | |||||
| $ W, 1, INFO ) | |||||
| CALL CHKXER( 'ZSYSV_AA_2STAGE', INFOT, NOUT, LERR, OK ) | |||||
| INFOT = 7 | |||||
| CALL ZSYSV_AA_2STAGE( 'U', 2, 1, A, 2, A, 1, IP, IP, B, 2, | |||||
| $ W, 1, INFO ) | |||||
| CALL CHKXER( 'ZSYSV_AA_2STAGE', INFOT, NOUT, LERR, OK ) | |||||
| ** | |||||
| ELSE IF( LSAMEN( 2, C2, 'HP' ) ) THEN | ELSE IF( LSAMEN( 2, C2, 'HP' ) ) THEN | ||||
| * | * | ||||
| * ZHPSV | * ZHPSV | ||||
| @@ -164,7 +164,7 @@ | |||||
| INTEGER NMAX_EXACT, NMAX_APPROX, SIZE_D | INTEGER NMAX_EXACT, NMAX_APPROX, SIZE_D | ||||
| PARAMETER (NMAX_EXACT = 6, NMAX_APPROX = 11, SIZE_D = 8) | PARAMETER (NMAX_EXACT = 6, NMAX_APPROX = 11, SIZE_D = 8) | ||||
| * | * | ||||
| * d's are generated from random permuation of those eight elements. | |||||
| * d's are generated from random permutation of those eight elements. | |||||
| COMPLEX*16 d1(8), d2(8), invd1(8), invd2(8) | COMPLEX*16 d1(8), d2(8), invd1(8), invd2(8) | ||||
| DATA D1 /(-1,0),(0,1),(-1,-1),(0,-1),(1,0),(-1,1),(1,1),(1,-1)/ | DATA D1 /(-1,0),(0,1),(-1,-1),(0,-1),(1,0),(-1,1),(1,1),(1,-1)/ | ||||
| DATA D2 /(-1,0),(0,-1),(-1,1),(0,1),(1,0),(-1,-1),(1,-1),(1,1)/ | DATA D2 /(-1,0),(0,-1),(-1,1),(0,1),(1,0),(-1,-1),(1,-1),(1,1)/ | ||||
| @@ -114,7 +114,7 @@ | |||||
| * .. | * .. | ||||
| * .. Local Arrays .. | * .. Local Arrays .. | ||||
| INTEGER ISEED( 4 ) | INTEGER ISEED( 4 ) | ||||
| COMPLEX*16 TQUERY( 5 ), WORKQUERY | |||||
| COMPLEX*16 TQUERY( 5 ), WORKQUERY( 1 ) | |||||
| * .. | * .. | ||||
| * .. External Functions .. | * .. External Functions .. | ||||
| DOUBLE PRECISION DLAMCH, ZLANGE, ZLANSY | DOUBLE PRECISION DLAMCH, ZLANGE, ZLANSY | ||||
| @@ -173,22 +173,22 @@ | |||||
| * | * | ||||
| CALL ZGEQR( M, N, AF, M, TQUERY, -1, WORKQUERY, -1, INFO ) | CALL ZGEQR( M, N, AF, M, TQUERY, -1, WORKQUERY, -1, INFO ) | ||||
| TSIZE = INT( TQUERY( 1 ) ) | TSIZE = INT( TQUERY( 1 ) ) | ||||
| LWORK = INT( WORKQUERY ) | |||||
| LWORK = INT( WORKQUERY( 1 ) ) | |||||
| CALL ZGEMQR( 'L', 'N', M, M, K, AF, M, TQUERY, TSIZE, CF, M, | CALL ZGEMQR( 'L', 'N', M, M, K, AF, M, TQUERY, TSIZE, CF, M, | ||||
| $ WORKQUERY, -1, INFO) | $ WORKQUERY, -1, INFO) | ||||
| LWORK = MAX( LWORK, INT( WORKQUERY ) ) | |||||
| LWORK = MAX( LWORK, INT( WORKQUERY( 1 ) ) ) | |||||
| CALL ZGEMQR( 'L', 'N', M, N, K, AF, M, TQUERY, TSIZE, CF, M, | CALL ZGEMQR( 'L', 'N', M, N, K, AF, M, TQUERY, TSIZE, CF, M, | ||||
| $ WORKQUERY, -1, INFO) | $ WORKQUERY, -1, INFO) | ||||
| LWORK = MAX( LWORK, INT( WORKQUERY ) ) | |||||
| LWORK = MAX( LWORK, INT( WORKQUERY( 1 ) ) ) | |||||
| CALL ZGEMQR( 'L', 'C', M, N, K, AF, M, TQUERY, TSIZE, CF, M, | CALL ZGEMQR( 'L', 'C', M, N, K, AF, M, TQUERY, TSIZE, CF, M, | ||||
| $ WORKQUERY, -1, INFO) | $ WORKQUERY, -1, INFO) | ||||
| LWORK = MAX( LWORK, INT( WORKQUERY ) ) | |||||
| LWORK = MAX( LWORK, INT( WORKQUERY( 1 ) ) ) | |||||
| CALL ZGEMQR( 'R', 'N', N, M, K, AF, M, TQUERY, TSIZE, DF, N, | CALL ZGEMQR( 'R', 'N', N, M, K, AF, M, TQUERY, TSIZE, DF, N, | ||||
| $ WORKQUERY, -1, INFO) | $ WORKQUERY, -1, INFO) | ||||
| LWORK = MAX( LWORK, INT( WORKQUERY ) ) | |||||
| LWORK = MAX( LWORK, INT( WORKQUERY( 1 ) ) ) | |||||
| CALL ZGEMQR( 'R', 'C', N, M, K, AF, M, TQUERY, TSIZE, DF, N, | CALL ZGEMQR( 'R', 'C', N, M, K, AF, M, TQUERY, TSIZE, DF, N, | ||||
| $ WORKQUERY, -1, INFO) | $ WORKQUERY, -1, INFO) | ||||
| LWORK = MAX( LWORK, INT( WORKQUERY ) ) | |||||
| LWORK = MAX( LWORK, INT( WORKQUERY( 1 ) ) ) | |||||
| ALLOCATE ( T( TSIZE ) ) | ALLOCATE ( T( TSIZE ) ) | ||||
| ALLOCATE ( WORK( LWORK ) ) | ALLOCATE ( WORK( LWORK ) ) | ||||
| srnamt = 'ZGEQR' | srnamt = 'ZGEQR' | ||||
| @@ -316,22 +316,22 @@ | |||||
| ELSE | ELSE | ||||
| CALL ZGELQ( M, N, AF, M, TQUERY, -1, WORKQUERY, -1, INFO ) | CALL ZGELQ( M, N, AF, M, TQUERY, -1, WORKQUERY, -1, INFO ) | ||||
| TSIZE = INT( TQUERY( 1 ) ) | TSIZE = INT( TQUERY( 1 ) ) | ||||
| LWORK = INT( WORKQUERY ) | |||||
| LWORK = INT( WORKQUERY( 1 ) ) | |||||
| CALL ZGEMLQ( 'R', 'N', N, N, K, AF, M, TQUERY, TSIZE, Q, N, | CALL ZGEMLQ( 'R', 'N', N, N, K, AF, M, TQUERY, TSIZE, Q, N, | ||||
| $ WORKQUERY, -1, INFO ) | $ WORKQUERY, -1, INFO ) | ||||
| LWORK = MAX( LWORK, INT( WORKQUERY ) ) | |||||
| LWORK = MAX( LWORK, INT( WORKQUERY( 1 ) ) ) | |||||
| CALL ZGEMLQ( 'L', 'N', N, M, K, AF, M, TQUERY, TSIZE, DF, N, | CALL ZGEMLQ( 'L', 'N', N, M, K, AF, M, TQUERY, TSIZE, DF, N, | ||||
| $ WORKQUERY, -1, INFO) | $ WORKQUERY, -1, INFO) | ||||
| LWORK = MAX( LWORK, INT( WORKQUERY ) ) | |||||
| LWORK = MAX( LWORK, INT( WORKQUERY( 1 ) ) ) | |||||
| CALL ZGEMLQ( 'L', 'C', N, M, K, AF, M, TQUERY, TSIZE, DF, N, | CALL ZGEMLQ( 'L', 'C', N, M, K, AF, M, TQUERY, TSIZE, DF, N, | ||||
| $ WORKQUERY, -1, INFO) | $ WORKQUERY, -1, INFO) | ||||
| LWORK = MAX( LWORK, INT( WORKQUERY ) ) | |||||
| LWORK = MAX( LWORK, INT( WORKQUERY( 1 ) ) ) | |||||
| CALL ZGEMLQ( 'R', 'N', M, N, K, AF, M, TQUERY, TSIZE, CF, M, | CALL ZGEMLQ( 'R', 'N', M, N, K, AF, M, TQUERY, TSIZE, CF, M, | ||||
| $ WORKQUERY, -1, INFO) | $ WORKQUERY, -1, INFO) | ||||
| LWORK = MAX( LWORK, INT( WORKQUERY ) ) | |||||
| LWORK = MAX( LWORK, INT( WORKQUERY( 1 ) ) ) | |||||
| CALL ZGEMLQ( 'R', 'C', M, N, K, AF, M, TQUERY, TSIZE, CF, M, | CALL ZGEMLQ( 'R', 'C', M, N, K, AF, M, TQUERY, TSIZE, CF, M, | ||||
| $ WORKQUERY, -1, INFO) | $ WORKQUERY, -1, INFO) | ||||
| LWORK = MAX( LWORK, INT( WORKQUERY ) ) | |||||
| LWORK = MAX( LWORK, INT( WORKQUERY( 1 ) ) ) | |||||
| ALLOCATE ( T( TSIZE ) ) | ALLOCATE ( T( TSIZE ) ) | ||||
| ALLOCATE ( WORK( LWORK ) ) | ALLOCATE ( WORK( LWORK ) ) | ||||
| srnamt = 'ZGELQ' | srnamt = 'ZGELQ' | ||||
| @@ -0,0 +1,390 @@ | |||||
| *> \brief \b ZUNHR_COL01 | |||||
| * | |||||
| * =========== DOCUMENTATION =========== | |||||
| * | |||||
| * Online html documentation available at | |||||
| * http://www.netlib.org/lapack/explore-html/ | |||||
| * | |||||
| * Definition: | |||||
| * =========== | |||||
| * | |||||
| * SUBROUTINE ZUNHR_COL01( M, N, MB1, NB1, NB2, RESULT ) | |||||
| * | |||||
| * .. Scalar Arguments .. | |||||
| * INTEGER M, N, MB1, NB1, NB2 | |||||
| * .. Return values .. | |||||
| * DOUBLE PRECISION RESULT(6) | |||||
| * | |||||
| * | |||||
| *> \par Purpose: | |||||
| * ============= | |||||
| *> | |||||
| *> \verbatim | |||||
| *> | |||||
| *> ZUNHR_COL01 tests ZUNHR_COL using ZLATSQR, ZGEMQRT and ZUNGTSQR. | |||||
| *> Therefore, ZLATSQR (part of ZGEQR), ZGEMQRT (part ZGEMQR), ZUNGTSQR | |||||
| *> have to be tested before this test. | |||||
| *> | |||||
| *> \endverbatim | |||||
| * | |||||
| * Arguments: | |||||
| * ========== | |||||
| * | |||||
| *> \param[in] M | |||||
| *> \verbatim | |||||
| *> M is INTEGER | |||||
| *> Number of rows in test matrix. | |||||
| *> \endverbatim | |||||
| *> \param[in] N | |||||
| *> \verbatim | |||||
| *> N is INTEGER | |||||
| *> Number of columns in test matrix. | |||||
| *> \endverbatim | |||||
| *> \param[in] MB1 | |||||
| *> \verbatim | |||||
| *> MB1 is INTEGER | |||||
| *> Number of row in row block in an input test matrix. | |||||
| *> \endverbatim | |||||
| *> | |||||
| *> \param[in] NB1 | |||||
| *> \verbatim | |||||
| *> NB1 is INTEGER | |||||
| *> Number of columns in column block an input test matrix. | |||||
| *> \endverbatim | |||||
| *> | |||||
| *> \param[in] NB2 | |||||
| *> \verbatim | |||||
| *> NB2 is INTEGER | |||||
| *> Number of columns in column block in an output test matrix. | |||||
| *> \endverbatim | |||||
| *> | |||||
| *> \param[out] RESULT | |||||
| *> \verbatim | |||||
| *> RESULT is DOUBLE PRECISION array, dimension (6) | |||||
| *> Results of each of the six tests below. | |||||
| *> ( C is a M-by-N random matrix, D is a N-by-M random matrix ) | |||||
| *> | |||||
| *> RESULT(1) = | A - Q * R | / (eps * m * |A|) | |||||
| *> RESULT(2) = | I - (Q**H) * Q | / (eps * m ) | |||||
| *> RESULT(3) = | Q * C - Q * C | / (eps * m * |C|) | |||||
| *> RESULT(4) = | (Q**H) * C - (Q**H) * C | / (eps * m * |C|) | |||||
| *> RESULT(5) = | (D * Q) - D * Q | / (eps * m * |D|) | |||||
| *> RESULT(6) = | D * (Q**H) - D * (Q**H) | / (eps * m * |D|) | |||||
| *> \endverbatim | |||||
| * | |||||
| * Authors: | |||||
| * ======== | |||||
| * | |||||
| *> \author Univ. of Tennessee | |||||
| *> \author Univ. of California Berkeley | |||||
| *> \author Univ. of Colorado Denver | |||||
| *> \author NAG Ltd. | |||||
| * | |||||
| *> \date November 2019 | |||||
| * | |||||
| *> \ingroup complex16_lin | |||||
| * | |||||
| * ===================================================================== | |||||
| SUBROUTINE ZUNHR_COL01( M, N, MB1, NB1, NB2, RESULT ) | |||||
| IMPLICIT NONE | |||||
| * | |||||
| * -- LAPACK test routine (version 3.9.0) -- | |||||
| * -- LAPACK is a software package provided by Univ. of Tennessee, -- | |||||
| * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- | |||||
| * November 2019 | |||||
| * | |||||
| * .. Scalar Arguments .. | |||||
| INTEGER M, N, MB1, NB1, NB2 | |||||
| * .. Return values .. | |||||
| DOUBLE PRECISION RESULT(6) | |||||
| * | |||||
| * ===================================================================== | |||||
| * | |||||
| * .. | |||||
| * .. Local allocatable arrays | |||||
| COMPLEX*16, ALLOCATABLE :: A(:,:), AF(:,:), Q(:,:), R(:,:), | |||||
| $ WORK( : ), T1(:,:), T2(:,:), DIAG(:), | |||||
| $ C(:,:), CF(:,:), D(:,:), DF(:,:) | |||||
| DOUBLE PRECISION, ALLOCATABLE :: RWORK(:) | |||||
| * | |||||
| * .. Parameters .. | |||||
| DOUBLE PRECISION ZERO | |||||
| PARAMETER ( ZERO = 0.0D+0 ) | |||||
| COMPLEX*16 CONE, CZERO | |||||
| PARAMETER ( CONE = ( 1.0D+0, 0.0D+0 ), | |||||
| $ CZERO = ( 0.0D+0, 0.0D+0 ) ) | |||||
| * .. | |||||
| * .. Local Scalars .. | |||||
| LOGICAL TESTZEROS | |||||
| INTEGER INFO, I, J, K, L, LWORK, NB1_UB, NB2_UB, NRB | |||||
| DOUBLE PRECISION ANORM, EPS, RESID, CNORM, DNORM | |||||
| * .. | |||||
| * .. Local Arrays .. | |||||
| INTEGER ISEED( 4 ) | |||||
| COMPLEX*16 WORKQUERY( 1 ) | |||||
| * .. | |||||
| * .. External Functions .. | |||||
| DOUBLE PRECISION DLAMCH, ZLANGE, ZLANSY | |||||
| EXTERNAL DLAMCH, ZLANGE, ZLANSY | |||||
| * .. | |||||
| * .. External Subroutines .. | |||||
| EXTERNAL ZLACPY, ZLARNV, ZLASET, ZLATSQR, ZUNHR_COL, | |||||
| $ ZUNGTSQR, ZSCAL, ZGEMM, ZGEMQRT, ZHERK | |||||
| * .. | |||||
| * .. Intrinsic Functions .. | |||||
| INTRINSIC CEILING, DBLE, MAX, MIN | |||||
| * .. | |||||
| * .. Scalars in Common .. | |||||
| CHARACTER(LEN=32) SRNAMT | |||||
| * .. | |||||
| * .. Common blocks .. | |||||
| COMMON / SRMNAMC / SRNAMT | |||||
| * .. | |||||
| * .. Data statements .. | |||||
| DATA ISEED / 1988, 1989, 1990, 1991 / | |||||
| * | |||||
| * TEST MATRICES WITH HALF OF MATRIX BEING ZEROS | |||||
| * | |||||
| TESTZEROS = .FALSE. | |||||
| * | |||||
| EPS = DLAMCH( 'Epsilon' ) | |||||
| K = MIN( M, N ) | |||||
| L = MAX( M, N, 1) | |||||
| * | |||||
| * Dynamically allocate local arrays | |||||
| * | |||||
| ALLOCATE ( A(M,N), AF(M,N), Q(L,L), R(M,L), RWORK(L), | |||||
| $ C(M,N), CF(M,N), | |||||
| $ D(N,M), DF(N,M) ) | |||||
| * | |||||
| * Put random numbers into A and copy to AF | |||||
| * | |||||
| DO J = 1, N | |||||
| CALL ZLARNV( 2, ISEED, M, A( 1, J ) ) | |||||
| END DO | |||||
| IF( TESTZEROS ) THEN | |||||
| IF( M.GE.4 ) THEN | |||||
| DO J = 1, N | |||||
| CALL ZLARNV( 2, ISEED, M/2, A( M/4, J ) ) | |||||
| END DO | |||||
| END IF | |||||
| END IF | |||||
| CALL ZLACPY( 'Full', M, N, A, M, AF, M ) | |||||
| * | |||||
| * Number of row blocks in ZLATSQR | |||||
| * | |||||
| NRB = MAX( 1, CEILING( DBLE( M - N ) / DBLE( MB1 - N ) ) ) | |||||
| * | |||||
| ALLOCATE ( T1( NB1, N * NRB ) ) | |||||
| ALLOCATE ( T2( NB2, N ) ) | |||||
| ALLOCATE ( DIAG( N ) ) | |||||
| * | |||||
| * Begin determine LWORK for the array WORK and allocate memory. | |||||
| * | |||||
| * ZLATSQR requires NB1 to be bounded by N. | |||||
| * | |||||
| NB1_UB = MIN( NB1, N) | |||||
| * | |||||
| * ZGEMQRT requires NB2 to be bounded by N. | |||||
| * | |||||
| NB2_UB = MIN( NB2, N) | |||||
| * | |||||
| CALL ZLATSQR( M, N, MB1, NB1_UB, AF, M, T1, NB1, | |||||
| $ WORKQUERY, -1, INFO ) | |||||
| LWORK = INT( WORKQUERY( 1 ) ) | |||||
| CALL ZUNGTSQR( M, N, MB1, NB1, AF, M, T1, NB1, WORKQUERY, -1, | |||||
| $ INFO ) | |||||
| LWORK = MAX( LWORK, INT( WORKQUERY( 1 ) ) ) | |||||
| * | |||||
| * In ZGEMQRT, WORK is N*NB2_UB if SIDE = 'L', | |||||
| * or M*NB2_UB if SIDE = 'R'. | |||||
| * | |||||
| LWORK = MAX( LWORK, NB2_UB * N, NB2_UB * M ) | |||||
| * | |||||
| ALLOCATE ( WORK( LWORK ) ) | |||||
| * | |||||
| * End allocate memory for WORK. | |||||
| * | |||||
| * | |||||
| * Begin Householder reconstruction routines | |||||
| * | |||||
| * Factor the matrix A in the array AF. | |||||
| * | |||||
| SRNAMT = 'ZLATSQR' | |||||
| CALL ZLATSQR( M, N, MB1, NB1_UB, AF, M, T1, NB1, WORK, LWORK, | |||||
| $ INFO ) | |||||
| * | |||||
| * Copy the factor R into the array R. | |||||
| * | |||||
| SRNAMT = 'ZLACPY' | |||||
| CALL ZLACPY( 'U', M, N, AF, M, R, M ) | |||||
| * | |||||
| * Reconstruct the orthogonal matrix Q. | |||||
| * | |||||
| SRNAMT = 'ZUNGTSQR' | |||||
| CALL ZUNGTSQR( M, N, MB1, NB1, AF, M, T1, NB1, WORK, LWORK, | |||||
| $ INFO ) | |||||
| * | |||||
| * Perform the Householder reconstruction, the result is stored | |||||
| * the arrays AF and T2. | |||||
| * | |||||
| SRNAMT = 'ZUNHR_COL' | |||||
| CALL ZUNHR_COL( M, N, NB2, AF, M, T2, NB2, DIAG, INFO ) | |||||
| * | |||||
| * Compute the factor R_hr corresponding to the Householder | |||||
| * reconstructed Q_hr and place it in the upper triangle of AF to | |||||
| * match the Q storage format in ZGEQRT. R_hr = R_tsqr * S, | |||||
| * this means changing the sign of I-th row of the matrix R_tsqr | |||||
| * according to sign of of I-th diagonal element DIAG(I) of the | |||||
| * matrix S. | |||||
| * | |||||
| SRNAMT = 'ZLACPY' | |||||
| CALL ZLACPY( 'U', M, N, R, M, AF, M ) | |||||
| * | |||||
| DO I = 1, N | |||||
| IF( DIAG( I ).EQ.-CONE ) THEN | |||||
| CALL ZSCAL( N+1-I, -CONE, AF( I, I ), M ) | |||||
| END IF | |||||
| END DO | |||||
| * | |||||
| * End Householder reconstruction routines. | |||||
| * | |||||
| * | |||||
| * Generate the m-by-m matrix Q | |||||
| * | |||||
| CALL ZLASET( 'Full', M, M, CZERO, CONE, Q, M ) | |||||
| * | |||||
| SRNAMT = 'ZGEMQRT' | |||||
| CALL ZGEMQRT( 'L', 'N', M, M, K, NB2_UB, AF, M, T2, NB2, Q, M, | |||||
| $ WORK, INFO ) | |||||
| * | |||||
| * Copy R | |||||
| * | |||||
| CALL ZLASET( 'Full', M, N, CZERO, CZERO, R, M ) | |||||
| * | |||||
| CALL ZLACPY( 'Upper', M, N, AF, M, R, M ) | |||||
| * | |||||
| * TEST 1 | |||||
| * Compute |R - (Q**H)*A| / ( eps * m * |A| ) and store in RESULT(1) | |||||
| * | |||||
| CALL ZGEMM( 'C', 'N', M, N, M, -CONE, Q, M, A, M, CONE, R, M ) | |||||
| * | |||||
| ANORM = ZLANGE( '1', M, N, A, M, RWORK ) | |||||
| RESID = ZLANGE( '1', M, N, R, M, RWORK ) | |||||
| IF( ANORM.GT.ZERO ) THEN | |||||
| RESULT( 1 ) = RESID / ( EPS * MAX( 1, M ) * ANORM ) | |||||
| ELSE | |||||
| RESULT( 1 ) = ZERO | |||||
| END IF | |||||
| * | |||||
| * TEST 2 | |||||
| * Compute |I - (Q**H)*Q| / ( eps * m ) and store in RESULT(2) | |||||
| * | |||||
| CALL ZLASET( 'Full', M, M, CZERO, CONE, R, M ) | |||||
| CALL ZHERK( 'U', 'C', M, M, -CONE, Q, M, CONE, R, M ) | |||||
| RESID = ZLANSY( '1', 'Upper', M, R, M, RWORK ) | |||||
| RESULT( 2 ) = RESID / ( EPS * MAX( 1, M ) ) | |||||
| * | |||||
| * Generate random m-by-n matrix C | |||||
| * | |||||
| DO J = 1, N | |||||
| CALL ZLARNV( 2, ISEED, M, C( 1, J ) ) | |||||
| END DO | |||||
| CNORM = ZLANGE( '1', M, N, C, M, RWORK ) | |||||
| CALL ZLACPY( 'Full', M, N, C, M, CF, M ) | |||||
| * | |||||
| * Apply Q to C as Q*C = CF | |||||
| * | |||||
| SRNAMT = 'ZGEMQRT' | |||||
| CALL ZGEMQRT( 'L', 'N', M, N, K, NB2_UB, AF, M, T2, NB2, CF, M, | |||||
| $ WORK, INFO ) | |||||
| * | |||||
| * TEST 3 | |||||
| * Compute |CF - Q*C| / ( eps * m * |C| ) | |||||
| * | |||||
| CALL ZGEMM( 'N', 'N', M, N, M, -CONE, Q, M, C, M, CONE, CF, M ) | |||||
| RESID = ZLANGE( '1', M, N, CF, M, RWORK ) | |||||
| IF( CNORM.GT.ZERO ) THEN | |||||
| RESULT( 3 ) = RESID / ( EPS * MAX( 1, M ) * CNORM ) | |||||
| ELSE | |||||
| RESULT( 3 ) = ZERO | |||||
| END IF | |||||
| * | |||||
| * Copy C into CF again | |||||
| * | |||||
| CALL ZLACPY( 'Full', M, N, C, M, CF, M ) | |||||
| * | |||||
| * Apply Q to C as (Q**H)*C = CF | |||||
| * | |||||
| SRNAMT = 'ZGEMQRT' | |||||
| CALL ZGEMQRT( 'L', 'C', M, N, K, NB2_UB, AF, M, T2, NB2, CF, M, | |||||
| $ WORK, INFO ) | |||||
| * | |||||
| * TEST 4 | |||||
| * Compute |CF - (Q**H)*C| / ( eps * m * |C|) | |||||
| * | |||||
| CALL ZGEMM( 'C', 'N', M, N, M, -CONE, Q, M, C, M, CONE, CF, M ) | |||||
| RESID = ZLANGE( '1', M, N, CF, M, RWORK ) | |||||
| IF( CNORM.GT.ZERO ) THEN | |||||
| RESULT( 4 ) = RESID / ( EPS * MAX( 1, M ) * CNORM ) | |||||
| ELSE | |||||
| RESULT( 4 ) = ZERO | |||||
| END IF | |||||
| * | |||||
| * Generate random n-by-m matrix D and a copy DF | |||||
| * | |||||
| DO J = 1, M | |||||
| CALL ZLARNV( 2, ISEED, N, D( 1, J ) ) | |||||
| END DO | |||||
| DNORM = ZLANGE( '1', N, M, D, N, RWORK ) | |||||
| CALL ZLACPY( 'Full', N, M, D, N, DF, N ) | |||||
| * | |||||
| * Apply Q to D as D*Q = DF | |||||
| * | |||||
| SRNAMT = 'ZGEMQRT' | |||||
| CALL ZGEMQRT( 'R', 'N', N, M, K, NB2_UB, AF, M, T2, NB2, DF, N, | |||||
| $ WORK, INFO ) | |||||
| * | |||||
| * TEST 5 | |||||
| * Compute |DF - D*Q| / ( eps * m * |D| ) | |||||
| * | |||||
| CALL ZGEMM( 'N', 'N', N, M, M, -CONE, D, N, Q, M, CONE, DF, N ) | |||||
| RESID = ZLANGE( '1', N, M, DF, N, RWORK ) | |||||
| IF( DNORM.GT.ZERO ) THEN | |||||
| RESULT( 5 ) = RESID / ( EPS * MAX( 1, M ) * DNORM ) | |||||
| ELSE | |||||
| RESULT( 5 ) = ZERO | |||||
| END IF | |||||
| * | |||||
| * Copy D into DF again | |||||
| * | |||||
| CALL ZLACPY( 'Full', N, M, D, N, DF, N ) | |||||
| * | |||||
| * Apply Q to D as D*QT = DF | |||||
| * | |||||
| SRNAMT = 'ZGEMQRT' | |||||
| CALL ZGEMQRT( 'R', 'C', N, M, K, NB2_UB, AF, M, T2, NB2, DF, N, | |||||
| $ WORK, INFO ) | |||||
| * | |||||
| * TEST 6 | |||||
| * Compute |DF - D*(Q**H)| / ( eps * m * |D| ) | |||||
| * | |||||
| CALL ZGEMM( 'N', 'C', N, M, M, -CONE, D, N, Q, M, CONE, DF, N ) | |||||
| RESID = ZLANGE( '1', N, M, DF, N, RWORK ) | |||||
| IF( DNORM.GT.ZERO ) THEN | |||||
| RESULT( 6 ) = RESID / ( EPS * MAX( 1, M ) * DNORM ) | |||||
| ELSE | |||||
| RESULT( 6 ) = ZERO | |||||
| END IF | |||||
| * | |||||
| * Deallocate all arrays | |||||
| * | |||||
| DEALLOCATE ( A, AF, Q, R, RWORK, WORK, T1, T2, DIAG, | |||||
| $ C, D, CF, DF ) | |||||
| * | |||||
| RETURN | |||||
| * | |||||
| * End of ZUNHR_COL01 | |||||
| * | |||||
| END | |||||