// ------------------------------------------------------------------ // qrfacdd.cpp // // This file contains a routines for QR factorization with // column pivoting using double-double precision. // ------------------------------------------------------------------ // Copyright (c) 2000 by Cornell University. All rights reserved. // // See the accompanying file 'Copyright' for authorship information, // the terms of the license governing this software, and disclaimers // concerning this software. // ------------------------------------------------------------------ // This file is part of the QMG software. // Version 2.0 of QMG, release date September 3, 1999 // Version 2.0.1 -- rewritten to estimate generalized eigenvector // sensitivity, October 29, 1999. Steve Vavasis // Version 2.0.2 -- rewritten with a new way to handle // degenerate problems. // ------------------------------------------------------------------ #include "doubledouble2.h" #include "inline2.h" #include "qnamesp.h" // QR factorization with column pivoting using double-double // precision. // (See Golub and Van Loan). // Input arguments: // A: input matrix, stored in column major order. Overwritten // with U.T. factor. // m: # rows in A. // n: # cols in A. // select_col: return variable holding the column permutation // (which columns were selected). // hhmat: return variable holding the householder transforms. // should have at least m*n entries. // betavec: return variable holding the householder beta's. // should have at least n entries. // wksp: must have at least m*(n+1) entries. namespace QMG { void QR_Factor_with_col_pivoting_quadprec(double* A, int m, int n, double* select_col, double* hhmat, double* betavec, doubledouble* wksp); } namespace { static int quadprec_validated = 0; // Validate quad precision arithmetic at run-time. // This routine should be executed just once. void validate_quadprec() { if (quadprec_validated > 0) return; quadprec_validated = 1; const int NROW = 48; const int NCOL = 30; const int MSIZE = NROW * NCOL; double A[MSIZE] = { -0.37294231619671758, -1.64092563368247290, -2.40665711100176780, -1.17656959922312600, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -1.09449245841755590, -4.81820036896715820, -7.07024319914606460, -3.45828886777286560, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -0.88226073078117995, -3.88882476099122700, -5.71366270563540460, -2.79824444621603250, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -0.11325365668264621, -0.50311880686536048, -0.74493286480999210, -0.36761485610442735, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -0.37294231619671758, -1.64092563368247290, -2.40665711100176780, -1.17656959922312600, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -1.09449245841755590, -4.81820036896715820, -7.07024319914606460, -3.45828886777286560, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -0.88226073078117995, -3.88882476099122700, -5.71366270563540460, -2.79824444621603250, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -0.11325365668264621, -0.50311880686536048, -0.74493286480999210, -0.36761485610442735, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -0.37294231619671758, -1.64092563368247290, -2.40665711100176780, -1.17656959922312600, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -1.09449245841755590, -4.81820036896715820, -7.07024319914606460, -3.45828886777286560, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -0.88226073078117995, -3.88882476099122700, -5.71366270563540460, -2.79824444621603250, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -0.11325365668264621, -0.50311880686536048, -0.74493286480999210, -0.36761485610442735, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -0.37294231619671758, -1.64092563368247290, -2.40665711100176780, -1.17656959922312600, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -1.09449245841755590, -4.81820036896715820, -7.07024319914606460, -3.45828886777286560, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -0.88226073078117995, -3.88882476099122700, -5.71366270563540460, -2.79824444621603250, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -0.11325365668264621, -0.50311880686536048, -0.74493286480999210, -0.36761485610442735, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -0.37294231619671758, -1.64092563368247290, -2.40665711100176780, -1.17656959922312600, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -1.09449245841755590, -4.81820036896715820, -7.07024319914606460, -3.45828886777286560, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -0.88226073078117995, -3.88882476099122700, -5.71366270563540460, -2.79824444621603250, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -0.11325365668264621, -0.50311880686536048, -0.74493286480999210, -0.36761485610442735, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -0.37294231619671758, -1.64092563368247290, -2.40665711100176780, -1.17656959922312600, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -1.09449245841755590, -4.81820036896715820, -7.07024319914606460, -3.45828886777286560, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -0.88226073078117995, -3.88882476099122700, -5.71366270563540460, -2.79824444621603250, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -0.11325365668264621, -0.50311880686536048, -0.74493286480999210, -0.36761485610442735, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -0.37294231619671758, -1.64092563368247290, -2.40665711100176780, -1.17656959922312600, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -1.09449245841755590, -4.81820036896715820, -7.07024319914606460, -3.45828886777286560, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -0.88226073078117995, -3.88882476099122700, -5.71366270563540460, -2.79824444621603250, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -0.11325365668264621, -0.50311880686536048, -0.74493286480999210, -0.36761485610442735, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -0.37294231619671758, -1.64092563368247290, -2.40665711100176780, -1.17656959922312600, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -1.09449245841755590, -4.81820036896715820, -7.07024319914606460, -3.45828886777286560, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -0.88226073078117995, -3.88882476099122700, -5.71366270563540460, -2.79824444621603250, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -0.11325365668264621, -0.50311880686536048, -0.74493286480999210, -0.36761485610442735, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -0.37294231619671758, -1.64092563368247290, -2.40665711100176780, -1.17656959922312600, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -1.09449245841755590, -4.81820036896715820, -7.07024319914606460, -3.45828886777286560, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -0.88226073078117995, -3.88882476099122700, -5.71366270563540460, -2.79824444621603250, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -0.11325365668264621, -0.50311880686536048, -0.74493286480999210, -0.36761485610442735, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -0.37294231619671758, -1.64092563368247290, -2.40665711100176780, -1.17656959922312600, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -1.09449245841755590, -4.81820036896715820, -7.07024319914606460, -3.45828886777286560, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -0.88226073078117995, -3.88882476099122700, -5.71366270563540460, -2.79824444621603250, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -0.11325365668264621, -0.50311880686536048, -0.74493286480999210, -0.36761485610442735, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -0.37294231619671758, -1.64092563368247290, -2.40665711100176780, -1.17656959922312600, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -1.09449245841755590, -4.81820036896715820, -7.07024319914606460, -3.45828886777286560, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -0.88226073078117995, -3.88882476099122700, -5.71366270563540460, -2.79824444621603250, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -0.11325365668264621, -0.50311880686536048, -0.74493286480999210, -0.36761485610442735, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -0.37294231619671758, -1.64092563368247290, -2.40665711100176780, -1.17656959922312600, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -1.09449245841755590, -4.81820036896715820, -7.07024319914606460, -3.45828886777286560, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -0.88226073078117995, -3.88882476099122700, -5.71366270563540460, -2.79824444621603250, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -0.11325365668264621, -0.50311880686536048, -0.74493286480999210, -0.36761485610442735, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -0.37294231619671758, -1.64092563368247290, -2.40665711100176780, -1.17656959922312600, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -1.09449245841755590, -4.81820036896715820, -7.07024319914606460, -3.45828886777286560, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -0.88226073078117995, -3.88882476099122700, -5.71366270563540460, -2.79824444621603250, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -0.11325365668264621, -0.50311880686536048, -0.74493286480999210, -0.36761485610442735, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -0.37294231619671758, -1.64092563368247290, -2.40665711100176780, -1.17656959922312600, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -1.09449245841755590, -4.81820036896715820, -7.07024319914606460, -3.45828886777286560, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -0.88226073078117995, -3.88882476099122700, -5.71366270563540460, -2.79824444621603250, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -0.11325365668264621, -0.50311880686536048, -0.74493286480999210, -0.36761485610442735, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -0.37294231619671758, -1.64092563368247290, -2.40665711100176780, -1.17656959922312600, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -1.09449245841755590, -4.81820036896715820, -7.07024319914606460, -3.45828886777286560, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -0.88226073078117995, -3.88882476099122700, -5.71366270563540460, -2.79824444621603250, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -0.11325365668264621, -0.50311880686536048, -0.74493286480999210, -0.36761485610442735, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -0.37632693448078425, -1.16053091818835190, -0.97746886918395970, -0.12448591278103610, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -1.58018485898444380, -4.88934345699834870, -4.15214655923599190, -0.55771161183433637, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -2.21157818735521560, -6.86544645464809820, -5.87705111460319960, -0.82877435305472957, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -1.03168930189765500, -3.21301406089028290, -2.77184779491166380, -0.40876355017300581, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -0.37632693448078425, -1.16053091818835190, -0.97746886918395970, -0.12448591278103610, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -1.58018485898444380, -4.88934345699834870, -4.15214655923599190, -0.55771161183433637, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -2.21157818735521560, -6.86544645464809820, -5.87705111460319960, -0.82877435305472957, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -1.03168930189765500, -3.21301406089028290, -2.77184779491166380, -0.40876355017300581, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -0.37632693448078425, -1.16053091818835190, -0.97746886918395970, -0.12448591278103610, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -1.58018485898444380, -4.88934345699834870, -4.15214655923599190, -0.55771161183433637, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -2.21157818735521560, -6.86544645464809820, -5.87705111460319960, -0.82877435305472957, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -1.03168930189765500, -3.21301406089028290, -2.77184779491166380, -0.40876355017300581, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -0.37632693448078425, -1.16053091818835190, -0.97746886918395970, -0.12448591278103610, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -1.58018485898444380, -4.88934345699834870, -4.15214655923599190, -0.55771161183433637, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -2.21157818735521560, -6.86544645464809820, -5.87705111460319960, -0.82877435305472957, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -1.03168930189765500, -3.21301406089028290, -2.77184779491166380, -0.40876355017300581, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -0.37632693448078425, -1.16053091818835190, -0.97746886918395970, -0.12448591278103610, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -1.58018485898444380, -4.88934345699834870, -4.15214655923599190, -0.55771161183433637, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -2.21157818735521560, -6.86544645464809820, -5.87705111460319960, -0.82877435305472957, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -1.03168930189765500, -3.21301406089028290, -2.77184779491166380, -0.40876355017300581, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -0.37632693448078425, -1.16053091818835190, -0.97746886918395970, -0.12448591278103610, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -1.58018485898444380, -4.88934345699834870, -4.15214655923599190, -0.55771161183433637, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -2.21157818735521560, -6.86544645464809820, -5.87705111460319960, -0.82877435305472957, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -1.03168930189765500, -3.21301406089028290, -2.77184779491166380, -0.40876355017300581, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -0.37632693448078425, -1.16053091818835190, -0.97746886918395970, -0.12448591278103610, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -1.58018485898444380, -4.88934345699834870, -4.15214655923599190, -0.55771161183433637, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -2.21157818735521560, -6.86544645464809820, -5.87705111460319960, -0.82877435305472957, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -1.03168930189765500, -3.21301406089028290, -2.77184779491166380, -0.40876355017300581, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -0.37632693448078425, -1.16053091818835190, -0.97746886918395970, -0.12448591278103610, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -1.58018485898444380, -4.88934345699834870, -4.15214655923599190, -0.55771161183433637, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -2.21157818735521560, -6.86544645464809820, -5.87705111460319960, -0.82877435305472957, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -1.03168930189765500, -3.21301406089028290, -2.77184779491166380, -0.40876355017300581, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -0.37632693448078425, -1.16053091818835190, -0.97746886918395970, -0.12448591278103610, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -1.58018485898444380, -4.88934345699834870, -4.15214655923599190, -0.55771161183433637, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -2.21157818735521560, -6.86544645464809820, -5.87705111460319960, -0.82877435305472957, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -1.03168930189765500, -3.21301406089028290, -2.77184779491166380, -0.40876355017300581, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -0.37632693448078425, -1.16053091818835190, -0.97746886918395970, -0.12448591278103610, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -1.58018485898444380, -4.88934345699834870, -4.15214655923599190, -0.55771161183433637, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -2.21157818735521560, -6.86544645464809820, -5.87705111460319960, -0.82877435305472957, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -1.03168930189765500, -3.21301406089028290, -2.77184779491166380, -0.40876355017300581, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -0.37632693448078425, -1.16053091818835190, -0.97746886918395970, -0.12448591278103610, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -1.58018485898444380, -4.88934345699834870, -4.15214655923599190, -0.55771161183433637, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -2.21157818735521560, -6.86544645464809820, -5.87705111460319960, -0.82877435305472957, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -1.03168930189765500, -3.21301406089028290, -2.77184779491166380, -0.40876355017300581, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -0.37632693448078425, -1.16053091818835190, -0.97746886918395970, -0.12448591278103610, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -1.58018485898444380, -4.88934345699834870, -4.15214655923599190, -0.55771161183433637, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -2.21157818735521560, -6.86544645464809820, -5.87705111460319960, -0.82877435305472957, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -1.03168930189765500, -3.21301406089028290, -2.77184779491166380, -0.40876355017300581, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -0.37632693448078425, -1.16053091818835190, -0.97746886918395970, -0.12448591278103610, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -1.58018485898444380, -4.88934345699834870, -4.15214655923599190, -0.55771161183433637, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -2.21157818735521560, -6.86544645464809820, -5.87705111460319960, -0.82877435305472957, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -1.03168930189765500, -3.21301406089028290, -2.77184779491166380, -0.40876355017300581, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -0.37632693448078425, -1.16053091818835190, -0.97746886918395970, -0.12448591278103610, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -1.58018485898444380, -4.88934345699834870, -4.15214655923599190, -0.55771161183433637, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -2.21157818735521560, -6.86544645464809820, -5.87705111460319960, -0.82877435305472957, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -1.03168930189765500, -3.21301406089028290, -2.77184779491166380, -0.40876355017300581, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -0.37632693448078425, -1.16053091818835190, -0.97746886918395970, -0.12448591278103610, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -1.58018485898444380, -4.88934345699834870, -4.15214655923599190, -0.55771161183433637, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -2.21157818735521560, -6.86544645464809820, -5.87705111460319960, -0.82877435305472957, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, -1.03168930189765500, -3.21301406089028290, -2.77184779491166380, -0.40876355017300581, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000}; double select_col[NCOL]; double hhmat[MSIZE]; double betavec[NCOL]; doubledouble wkspa[MSIZE + NROW]; double Am[MSIZE]; { for (int i = 0; i < MSIZE; ++i) Am[i] = A[i]; } QMG::QR_Factor_with_col_pivoting_quadprec(Am, NROW, NCOL, select_col, hhmat, betavec, wkspa); if (fabs(Am[NCOL - 1 + (NCOL - 1) * NROW] - 1.826711667667790e-016) > 1e-30) { quadprec_validated = 0; QMG::throw_error("Double-double validation failed; see the file doubledouble_info.txt for more info"); } } } void QMG::QR_Factor_with_col_pivoting_quadprec(double* A, int m, int n, double* select_col, double* hhmat, double* betavec, doubledouble* wksp) { validate_quadprec(); doubledouble::FloatControlType old_float_control = doubledouble::set_float_control_to_53_bits(); doubledouble* dA = wksp; doubledouble* hhtrans = wksp + (m*n); { for (int j = 0; j < n; ++j) { for (int i = 0; i < m; ++i) { dA[i + j * m] = doubledouble(A[i + j * m]); } select_col[j] = static_cast(j); } } int nstep = (m < n)? m : n; for (int k = 0; k < nstep; ++k) { // Find the next pivot column. double mxnorm = -1.0; int pivcol; { for (int j = k; j < n; ++j) { double sumsq = 0.0; for (int i = k; i < m; ++i) { double t = double(dA[i + j * m]); sumsq += t * t; } if (sumsq > mxnorm) { pivcol = j; mxnorm = sumsq; } } } // Swap the pivot column with column k. { double tmp1 = select_col[pivcol]; select_col[pivcol] = select_col[k]; select_col[k] = tmp1; for (int i = 0; i < m; ++i) { doubledouble tmp2 = dA[i + k * m]; dA[i + k * m] = dA[i + pivcol * m]; dA[i + pivcol * m] = tmp2; } } // Compute the next hh transform. doubledouble sigma = 0.0; doubledouble mu = 0.0; { for (int i = k; i < m; ++i) { doubledouble t = dA[i + k * m]; hhtrans[i] = t; doubledouble tsq = sqr(t); if (i > k) sigma += tsq; mu += tsq; } } mu = sqrt(mu); doubledouble beta; if (double(sigma) == 0.0) { hhtrans[k] = 1.0; beta = 0.0; } else { if (double(hhtrans[k]) < 0.0) { hhtrans[k] -= mu; } else { hhtrans[k] = -sigma / (hhtrans[k] + mu); } beta = doubledouble(-1.0) / (mu * hhtrans[k]); } { for (int j = k; j < n; ++j) { doubledouble ip = 0.0; { for (int i = k; i < m; ++i) ip += dA[i + j * m] * hhtrans[i]; } ip *= beta; { for (int i = k; i < m; ++i) dA[i + j * m] -= ip * hhtrans[i]; } } } { for (int i = k; i < m; ++i) { hhmat[i + k * m] = double(hhtrans[i]); } betavec[k] = double(beta); } { for (int i = 0; i < m; ++i) { A[i + k * m] = double(dA[i + k * m]); } } } doubledouble::restore_float_control(old_float_control); }