| @@ -0,0 +1,943 @@ | |||||
| #include <math.h> | |||||
| #include <stdlib.h> | |||||
| #include <string.h> | |||||
| #include <stdio.h> | |||||
| #include <complex.h> | |||||
| #ifdef complex | |||||
| #undef complex | |||||
| #endif | |||||
| #ifdef I | |||||
| #undef I | |||||
| #endif | |||||
| #if defined(_WIN64) | |||||
| typedef long long BLASLONG; | |||||
| typedef unsigned long long BLASULONG; | |||||
| #else | |||||
| typedef long BLASLONG; | |||||
| typedef unsigned long BLASULONG; | |||||
| #endif | |||||
| #ifdef LAPACK_ILP64 | |||||
| typedef BLASLONG blasint; | |||||
| #if defined(_WIN64) | |||||
| #define blasabs(x) llabs(x) | |||||
| #else | |||||
| #define blasabs(x) labs(x) | |||||
| #endif | |||||
| #else | |||||
| typedef int blasint; | |||||
| #define blasabs(x) abs(x) | |||||
| #endif | |||||
| typedef blasint integer; | |||||
| typedef unsigned int uinteger; | |||||
| typedef char *address; | |||||
| typedef short int shortint; | |||||
| typedef float real; | |||||
| typedef double doublereal; | |||||
| typedef struct { real r, i; } complex; | |||||
| typedef struct { doublereal r, i; } doublecomplex; | |||||
| #ifdef _MSC_VER | |||||
| static inline _Fcomplex Cf(complex *z) {_Fcomplex zz={z->r , z->i}; return zz;} | |||||
| static inline _Dcomplex Cd(doublecomplex *z) {_Dcomplex zz={z->r , z->i};return zz;} | |||||
| static inline _Fcomplex * _pCf(complex *z) {return (_Fcomplex*)z;} | |||||
| static inline _Dcomplex * _pCd(doublecomplex *z) {return (_Dcomplex*)z;} | |||||
| #else | |||||
| static inline _Complex float Cf(complex *z) {return z->r + z->i*_Complex_I;} | |||||
| static inline _Complex double Cd(doublecomplex *z) {return z->r + z->i*_Complex_I;} | |||||
| static inline _Complex float * _pCf(complex *z) {return (_Complex float*)z;} | |||||
| static inline _Complex double * _pCd(doublecomplex *z) {return (_Complex double*)z;} | |||||
| #endif | |||||
| #define pCf(z) (*_pCf(z)) | |||||
| #define pCd(z) (*_pCd(z)) | |||||
| typedef int logical; | |||||
| typedef short int shortlogical; | |||||
| typedef char logical1; | |||||
| typedef char integer1; | |||||
| #define TRUE_ (1) | |||||
| #define FALSE_ (0) | |||||
| /* Extern is for use with -E */ | |||||
| #ifndef Extern | |||||
| #define Extern extern | |||||
| #endif | |||||
| /* I/O stuff */ | |||||
| typedef int flag; | |||||
| typedef int ftnlen; | |||||
| typedef int ftnint; | |||||
| /*external read, write*/ | |||||
| typedef struct | |||||
| { flag cierr; | |||||
| ftnint ciunit; | |||||
| flag ciend; | |||||
| char *cifmt; | |||||
| ftnint cirec; | |||||
| } cilist; | |||||
| /*internal read, write*/ | |||||
| typedef struct | |||||
| { flag icierr; | |||||
| char *iciunit; | |||||
| flag iciend; | |||||
| char *icifmt; | |||||
| ftnint icirlen; | |||||
| ftnint icirnum; | |||||
| } icilist; | |||||
| /*open*/ | |||||
| typedef struct | |||||
| { flag oerr; | |||||
| ftnint ounit; | |||||
| char *ofnm; | |||||
| ftnlen ofnmlen; | |||||
| char *osta; | |||||
| char *oacc; | |||||
| char *ofm; | |||||
| ftnint orl; | |||||
| char *oblnk; | |||||
| } olist; | |||||
| /*close*/ | |||||
| typedef struct | |||||
| { flag cerr; | |||||
| ftnint cunit; | |||||
| char *csta; | |||||
| } cllist; | |||||
| /*rewind, backspace, endfile*/ | |||||
| typedef struct | |||||
| { flag aerr; | |||||
| ftnint aunit; | |||||
| } alist; | |||||
| /* inquire */ | |||||
| typedef struct | |||||
| { flag inerr; | |||||
| ftnint inunit; | |||||
| char *infile; | |||||
| ftnlen infilen; | |||||
| ftnint *inex; /*parameters in standard's order*/ | |||||
| ftnint *inopen; | |||||
| ftnint *innum; | |||||
| ftnint *innamed; | |||||
| char *inname; | |||||
| ftnlen innamlen; | |||||
| char *inacc; | |||||
| ftnlen inacclen; | |||||
| char *inseq; | |||||
| ftnlen inseqlen; | |||||
| char *indir; | |||||
| ftnlen indirlen; | |||||
| char *infmt; | |||||
| ftnlen infmtlen; | |||||
| char *inform; | |||||
| ftnint informlen; | |||||
| char *inunf; | |||||
| ftnlen inunflen; | |||||
| ftnint *inrecl; | |||||
| ftnint *innrec; | |||||
| char *inblank; | |||||
| ftnlen inblanklen; | |||||
| } inlist; | |||||
| #define VOID void | |||||
| union Multitype { /* for multiple entry points */ | |||||
| integer1 g; | |||||
| shortint h; | |||||
| integer i; | |||||
| /* longint j; */ | |||||
| real r; | |||||
| doublereal d; | |||||
| complex c; | |||||
| doublecomplex z; | |||||
| }; | |||||
| typedef union Multitype Multitype; | |||||
| struct Vardesc { /* for Namelist */ | |||||
| char *name; | |||||
| char *addr; | |||||
| ftnlen *dims; | |||||
| int type; | |||||
| }; | |||||
| typedef struct Vardesc Vardesc; | |||||
| struct Namelist { | |||||
| char *name; | |||||
| Vardesc **vars; | |||||
| int nvars; | |||||
| }; | |||||
| typedef struct Namelist Namelist; | |||||
| #define abs(x) ((x) >= 0 ? (x) : -(x)) | |||||
| #define dabs(x) (fabs(x)) | |||||
| #define f2cmin(a,b) ((a) <= (b) ? (a) : (b)) | |||||
| #define f2cmax(a,b) ((a) >= (b) ? (a) : (b)) | |||||
| #define dmin(a,b) (f2cmin(a,b)) | |||||
| #define dmax(a,b) (f2cmax(a,b)) | |||||
| #define bit_test(a,b) ((a) >> (b) & 1) | |||||
| #define bit_clear(a,b) ((a) & ~((uinteger)1 << (b))) | |||||
| #define bit_set(a,b) ((a) | ((uinteger)1 << (b))) | |||||
| #define abort_() { sig_die("Fortran abort routine called", 1); } | |||||
| #define c_abs(z) (cabsf(Cf(z))) | |||||
| #define c_cos(R,Z) { pCf(R)=ccos(Cf(Z)); } | |||||
| #ifdef _MSC_VER | |||||
| #define c_div(c, a, b) {Cf(c)._Val[0] = (Cf(a)._Val[0]/Cf(b)._Val[0]); Cf(c)._Val[1]=(Cf(a)._Val[1]/Cf(b)._Val[1]);} | |||||
| #define z_div(c, a, b) {Cd(c)._Val[0] = (Cd(a)._Val[0]/Cd(b)._Val[0]); Cd(c)._Val[1]=(Cd(a)._Val[1]/Cd(b)._Val[1]);} | |||||
| #else | |||||
| #define c_div(c, a, b) {pCf(c) = Cf(a)/Cf(b);} | |||||
| #define z_div(c, a, b) {pCd(c) = Cd(a)/Cd(b);} | |||||
| #endif | |||||
| #define c_exp(R, Z) {pCf(R) = cexpf(Cf(Z));} | |||||
| #define c_log(R, Z) {pCf(R) = clogf(Cf(Z));} | |||||
| #define c_sin(R, Z) {pCf(R) = csinf(Cf(Z));} | |||||
| //#define c_sqrt(R, Z) {*(R) = csqrtf(Cf(Z));} | |||||
| #define c_sqrt(R, Z) {pCf(R) = csqrtf(Cf(Z));} | |||||
| #define d_abs(x) (fabs(*(x))) | |||||
| #define d_acos(x) (acos(*(x))) | |||||
| #define d_asin(x) (asin(*(x))) | |||||
| #define d_atan(x) (atan(*(x))) | |||||
| #define d_atn2(x, y) (atan2(*(x),*(y))) | |||||
| #define d_cnjg(R, Z) { pCd(R) = conj(Cd(Z)); } | |||||
| #define r_cnjg(R, Z) { pCf(R) = conjf(Cf(Z)); } | |||||
| #define d_cos(x) (cos(*(x))) | |||||
| #define d_cosh(x) (cosh(*(x))) | |||||
| #define d_dim(__a, __b) ( *(__a) > *(__b) ? *(__a) - *(__b) : 0.0 ) | |||||
| #define d_exp(x) (exp(*(x))) | |||||
| #define d_imag(z) (cimag(Cd(z))) | |||||
| #define r_imag(z) (cimagf(Cf(z))) | |||||
| #define d_int(__x) (*(__x)>0 ? floor(*(__x)) : -floor(- *(__x))) | |||||
| #define r_int(__x) (*(__x)>0 ? floor(*(__x)) : -floor(- *(__x))) | |||||
| #define d_lg10(x) ( 0.43429448190325182765 * log(*(x)) ) | |||||
| #define r_lg10(x) ( 0.43429448190325182765 * log(*(x)) ) | |||||
| #define d_log(x) (log(*(x))) | |||||
| #define d_mod(x, y) (fmod(*(x), *(y))) | |||||
| #define u_nint(__x) ((__x)>=0 ? floor((__x) + .5) : -floor(.5 - (__x))) | |||||
| #define d_nint(x) u_nint(*(x)) | |||||
| #define u_sign(__a,__b) ((__b) >= 0 ? ((__a) >= 0 ? (__a) : -(__a)) : -((__a) >= 0 ? (__a) : -(__a))) | |||||
| #define d_sign(a,b) u_sign(*(a),*(b)) | |||||
| #define r_sign(a,b) u_sign(*(a),*(b)) | |||||
| #define d_sin(x) (sin(*(x))) | |||||
| #define d_sinh(x) (sinh(*(x))) | |||||
| #define d_sqrt(x) (sqrt(*(x))) | |||||
| #define d_tan(x) (tan(*(x))) | |||||
| #define d_tanh(x) (tanh(*(x))) | |||||
| #define i_abs(x) abs(*(x)) | |||||
| #define i_dnnt(x) ((integer)u_nint(*(x))) | |||||
| #define i_len(s, n) (n) | |||||
| #define i_nint(x) ((integer)u_nint(*(x))) | |||||
| #define i_sign(a,b) ((integer)u_sign((integer)*(a),(integer)*(b))) | |||||
| #define pow_dd(ap, bp) ( pow(*(ap), *(bp))) | |||||
| #define pow_si(B,E) spow_ui(*(B),*(E)) | |||||
| #define pow_ri(B,E) spow_ui(*(B),*(E)) | |||||
| #define pow_di(B,E) dpow_ui(*(B),*(E)) | |||||
| #define pow_zi(p, a, b) {pCd(p) = zpow_ui(Cd(a), *(b));} | |||||
| #define pow_ci(p, a, b) {pCf(p) = cpow_ui(Cf(a), *(b));} | |||||
| #define pow_zz(R,A,B) {pCd(R) = cpow(Cd(A),*(B));} | |||||
| #define s_cat(lpp, rpp, rnp, np, llp) { ftnlen i, nc, ll; char *f__rp, *lp; ll = (llp); lp = (lpp); for(i=0; i < (int)*(np); ++i) { nc = ll; if((rnp)[i] < nc) nc = (rnp)[i]; ll -= nc; f__rp = (rpp)[i]; while(--nc >= 0) *lp++ = *(f__rp)++; } while(--ll >= 0) *lp++ = ' '; } | |||||
| #define s_cmp(a,b,c,d) ((integer)strncmp((a),(b),f2cmin((c),(d)))) | |||||
| #define s_copy(A,B,C,D) { int __i,__m; for (__i=0, __m=f2cmin((C),(D)); __i<__m && (B)[__i] != 0; ++__i) (A)[__i] = (B)[__i]; } | |||||
| #define sig_die(s, kill) { exit(1); } | |||||
| #define s_stop(s, n) {exit(0);} | |||||
| static char junk[] = "\n@(#)LIBF77 VERSION 19990503\n"; | |||||
| #define z_abs(z) (cabs(Cd(z))) | |||||
| #define z_exp(R, Z) {pCd(R) = cexp(Cd(Z));} | |||||
| #define z_sqrt(R, Z) {pCd(R) = csqrt(Cd(Z));} | |||||
| #define myexit_() break; | |||||
| #define mycycle_() continue; | |||||
| #define myceiling_(w) {ceil(w)} | |||||
| #define myhuge_(w) {HUGE_VAL} | |||||
| //#define mymaxloc_(w,s,e,n) {if (sizeof(*(w)) == sizeof(double)) dmaxloc_((w),*(s),*(e),n); else dmaxloc_((w),*(s),*(e),n);} | |||||
| #define mymaxloc_(w,s,e,n) dmaxloc_(w,*(s),*(e),n) | |||||
| /* procedure parameter types for -A and -C++ */ | |||||
| #define F2C_proc_par_types 1 | |||||
| #ifdef __cplusplus | |||||
| typedef logical (*L_fp)(...); | |||||
| #else | |||||
| typedef logical (*L_fp)(); | |||||
| #endif | |||||
| static float spow_ui(float x, integer n) { | |||||
| float pow=1.0; unsigned long int u; | |||||
| if(n != 0) { | |||||
| if(n < 0) n = -n, x = 1/x; | |||||
| for(u = n; ; ) { | |||||
| if(u & 01) pow *= x; | |||||
| if(u >>= 1) x *= x; | |||||
| else break; | |||||
| } | |||||
| } | |||||
| return pow; | |||||
| } | |||||
| static double dpow_ui(double x, integer n) { | |||||
| double pow=1.0; unsigned long int u; | |||||
| if(n != 0) { | |||||
| if(n < 0) n = -n, x = 1/x; | |||||
| for(u = n; ; ) { | |||||
| if(u & 01) pow *= x; | |||||
| if(u >>= 1) x *= x; | |||||
| else break; | |||||
| } | |||||
| } | |||||
| return pow; | |||||
| } | |||||
| #ifdef _MSC_VER | |||||
| static _Fcomplex cpow_ui(complex x, integer n) { | |||||
| complex pow={1.0,0.0}; unsigned long int u; | |||||
| if(n != 0) { | |||||
| if(n < 0) n = -n, x.r = 1/x.r, x.i=1/x.i; | |||||
| for(u = n; ; ) { | |||||
| if(u & 01) pow.r *= x.r, pow.i *= x.i; | |||||
| if(u >>= 1) x.r *= x.r, x.i *= x.i; | |||||
| else break; | |||||
| } | |||||
| } | |||||
| _Fcomplex p={pow.r, pow.i}; | |||||
| return p; | |||||
| } | |||||
| #else | |||||
| static _Complex float cpow_ui(_Complex float x, integer n) { | |||||
| _Complex float pow=1.0; unsigned long int u; | |||||
| if(n != 0) { | |||||
| if(n < 0) n = -n, x = 1/x; | |||||
| for(u = n; ; ) { | |||||
| if(u & 01) pow *= x; | |||||
| if(u >>= 1) x *= x; | |||||
| else break; | |||||
| } | |||||
| } | |||||
| return pow; | |||||
| } | |||||
| #endif | |||||
| #ifdef _MSC_VER | |||||
| static _Dcomplex zpow_ui(_Dcomplex x, integer n) { | |||||
| _Dcomplex pow={1.0,0.0}; unsigned long int u; | |||||
| if(n != 0) { | |||||
| if(n < 0) n = -n, x._Val[0] = 1/x._Val[0], x._Val[1] =1/x._Val[1]; | |||||
| for(u = n; ; ) { | |||||
| if(u & 01) pow._Val[0] *= x._Val[0], pow._Val[1] *= x._Val[1]; | |||||
| if(u >>= 1) x._Val[0] *= x._Val[0], x._Val[1] *= x._Val[1]; | |||||
| else break; | |||||
| } | |||||
| } | |||||
| _Dcomplex p = {pow._Val[0], pow._Val[1]}; | |||||
| return p; | |||||
| } | |||||
| #else | |||||
| static _Complex double zpow_ui(_Complex double x, integer n) { | |||||
| _Complex double pow=1.0; unsigned long int u; | |||||
| if(n != 0) { | |||||
| if(n < 0) n = -n, x = 1/x; | |||||
| for(u = n; ; ) { | |||||
| if(u & 01) pow *= x; | |||||
| if(u >>= 1) x *= x; | |||||
| else break; | |||||
| } | |||||
| } | |||||
| return pow; | |||||
| } | |||||
| #endif | |||||
| static integer pow_ii(integer x, integer n) { | |||||
| integer pow; unsigned long int u; | |||||
| if (n <= 0) { | |||||
| if (n == 0 || x == 1) pow = 1; | |||||
| else if (x != -1) pow = x == 0 ? 1/x : 0; | |||||
| else n = -n; | |||||
| } | |||||
| if ((n > 0) || !(n == 0 || x == 1 || x != -1)) { | |||||
| u = n; | |||||
| for(pow = 1; ; ) { | |||||
| if(u & 01) pow *= x; | |||||
| if(u >>= 1) x *= x; | |||||
| else break; | |||||
| } | |||||
| } | |||||
| return pow; | |||||
| } | |||||
| static integer dmaxloc_(double *w, integer s, integer e, integer *n) | |||||
| { | |||||
| double m; integer i, mi; | |||||
| for(m=w[s-1], mi=s, i=s+1; i<=e; i++) | |||||
| if (w[i-1]>m) mi=i ,m=w[i-1]; | |||||
| return mi-s+1; | |||||
| } | |||||
| static integer smaxloc_(float *w, integer s, integer e, integer *n) | |||||
| { | |||||
| float m; integer i, mi; | |||||
| for(m=w[s-1], mi=s, i=s+1; i<=e; i++) | |||||
| if (w[i-1]>m) mi=i ,m=w[i-1]; | |||||
| return mi-s+1; | |||||
| } | |||||
| static inline void cdotc_(complex *z, integer *n_, complex *x, integer *incx_, complex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| #ifdef _MSC_VER | |||||
| _Fcomplex zdotc = {0.0, 0.0}; | |||||
| if (incx == 1 && incy == 1) { | |||||
| for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */ | |||||
| zdotc._Val[0] += conjf(Cf(&x[i]))._Val[0] * Cf(&y[i])._Val[0]; | |||||
| zdotc._Val[1] += conjf(Cf(&x[i]))._Val[1] * Cf(&y[i])._Val[1]; | |||||
| } | |||||
| } else { | |||||
| for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */ | |||||
| zdotc._Val[0] += conjf(Cf(&x[i*incx]))._Val[0] * Cf(&y[i*incy])._Val[0]; | |||||
| zdotc._Val[1] += conjf(Cf(&x[i*incx]))._Val[1] * Cf(&y[i*incy])._Val[1]; | |||||
| } | |||||
| } | |||||
| pCf(z) = zdotc; | |||||
| } | |||||
| #else | |||||
| _Complex float zdotc = 0.0; | |||||
| if (incx == 1 && incy == 1) { | |||||
| for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */ | |||||
| zdotc += conjf(Cf(&x[i])) * Cf(&y[i]); | |||||
| } | |||||
| } else { | |||||
| for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */ | |||||
| zdotc += conjf(Cf(&x[i*incx])) * Cf(&y[i*incy]); | |||||
| } | |||||
| } | |||||
| pCf(z) = zdotc; | |||||
| } | |||||
| #endif | |||||
| static inline void zdotc_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| #ifdef _MSC_VER | |||||
| _Dcomplex zdotc = {0.0, 0.0}; | |||||
| if (incx == 1 && incy == 1) { | |||||
| for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */ | |||||
| zdotc._Val[0] += conj(Cd(&x[i]))._Val[0] * Cd(&y[i])._Val[0]; | |||||
| zdotc._Val[1] += conj(Cd(&x[i]))._Val[1] * Cd(&y[i])._Val[1]; | |||||
| } | |||||
| } else { | |||||
| for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */ | |||||
| zdotc._Val[0] += conj(Cd(&x[i*incx]))._Val[0] * Cd(&y[i*incy])._Val[0]; | |||||
| zdotc._Val[1] += conj(Cd(&x[i*incx]))._Val[1] * Cd(&y[i*incy])._Val[1]; | |||||
| } | |||||
| } | |||||
| pCd(z) = zdotc; | |||||
| } | |||||
| #else | |||||
| _Complex double zdotc = 0.0; | |||||
| if (incx == 1 && incy == 1) { | |||||
| for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */ | |||||
| zdotc += conj(Cd(&x[i])) * Cd(&y[i]); | |||||
| } | |||||
| } else { | |||||
| for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */ | |||||
| zdotc += conj(Cd(&x[i*incx])) * Cd(&y[i*incy]); | |||||
| } | |||||
| } | |||||
| pCd(z) = zdotc; | |||||
| } | |||||
| #endif | |||||
| static inline void cdotu_(complex *z, integer *n_, complex *x, integer *incx_, complex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| #ifdef _MSC_VER | |||||
| _Fcomplex zdotc = {0.0, 0.0}; | |||||
| if (incx == 1 && incy == 1) { | |||||
| for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */ | |||||
| zdotc._Val[0] += Cf(&x[i])._Val[0] * Cf(&y[i])._Val[0]; | |||||
| zdotc._Val[1] += Cf(&x[i])._Val[1] * Cf(&y[i])._Val[1]; | |||||
| } | |||||
| } else { | |||||
| for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */ | |||||
| zdotc._Val[0] += Cf(&x[i*incx])._Val[0] * Cf(&y[i*incy])._Val[0]; | |||||
| zdotc._Val[1] += Cf(&x[i*incx])._Val[1] * Cf(&y[i*incy])._Val[1]; | |||||
| } | |||||
| } | |||||
| pCf(z) = zdotc; | |||||
| } | |||||
| #else | |||||
| _Complex float zdotc = 0.0; | |||||
| if (incx == 1 && incy == 1) { | |||||
| for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */ | |||||
| zdotc += Cf(&x[i]) * Cf(&y[i]); | |||||
| } | |||||
| } else { | |||||
| for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */ | |||||
| zdotc += Cf(&x[i*incx]) * Cf(&y[i*incy]); | |||||
| } | |||||
| } | |||||
| pCf(z) = zdotc; | |||||
| } | |||||
| #endif | |||||
| static inline void zdotu_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| #ifdef _MSC_VER | |||||
| _Dcomplex zdotc = {0.0, 0.0}; | |||||
| if (incx == 1 && incy == 1) { | |||||
| for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */ | |||||
| zdotc._Val[0] += Cd(&x[i])._Val[0] * Cd(&y[i])._Val[0]; | |||||
| zdotc._Val[1] += Cd(&x[i])._Val[1] * Cd(&y[i])._Val[1]; | |||||
| } | |||||
| } else { | |||||
| for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */ | |||||
| zdotc._Val[0] += Cd(&x[i*incx])._Val[0] * Cd(&y[i*incy])._Val[0]; | |||||
| zdotc._Val[1] += Cd(&x[i*incx])._Val[1] * Cd(&y[i*incy])._Val[1]; | |||||
| } | |||||
| } | |||||
| pCd(z) = zdotc; | |||||
| } | |||||
| #else | |||||
| _Complex double zdotc = 0.0; | |||||
| if (incx == 1 && incy == 1) { | |||||
| for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */ | |||||
| zdotc += Cd(&x[i]) * Cd(&y[i]); | |||||
| } | |||||
| } else { | |||||
| for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */ | |||||
| zdotc += Cd(&x[i*incx]) * Cd(&y[i*incy]); | |||||
| } | |||||
| } | |||||
| pCd(z) = zdotc; | |||||
| } | |||||
| #endif | |||||
| /* -- translated by f2c (version 20000121). | |||||
| You must link the resulting object file with the libraries: | |||||
| -lf2c -lm (in that order) | |||||
| */ | |||||
| /* -- translated by f2c (version 20000121). | |||||
| You must link the resulting object file with the libraries: | |||||
| -lf2c -lm (in that order) | |||||
| */ | |||||
| /* Table of constant values */ | |||||
| static integer c__1 = 1; | |||||
| /* Subroutine */ int claqp2rk_(integer *m, integer *n, integer *nrhs, integer | |||||
| *ioffset, integer *kmax, real *abstol, real *reltol, integer *kp1, | |||||
| real *maxc2nrm, complex *a, integer *lda, integer *k, real *maxc2nrmk, | |||||
| real *relmaxc2nrmk, integer *jpiv, complex *tau, real *vn1, real * | |||||
| vn2, complex *work, integer *info) | |||||
| { | |||||
| /* System generated locals */ | |||||
| integer a_dim1, a_offset, i__1, i__2, i__3; | |||||
| real r__1; | |||||
| complex q__1; | |||||
| /* Local variables */ | |||||
| complex aikk; | |||||
| real temp, temp2; | |||||
| integer i__, j; | |||||
| real tol3z; | |||||
| integer jmaxc2nrm; | |||||
| extern /* Subroutine */ int clarf_(char *, integer *, integer *, complex * | |||||
| , integer *, complex *, complex *, integer *, complex *), | |||||
| cswap_(integer *, complex *, integer *, complex *, integer *); | |||||
| integer itemp, minmnfact; | |||||
| real myhugeval; | |||||
| integer minmnupdt; | |||||
| extern real scnrm2_(integer *, complex *, integer *); | |||||
| integer kk, kp; | |||||
| extern /* Subroutine */ int clarfg_(integer *, complex *, complex *, | |||||
| integer *, complex *); | |||||
| extern real slamch_(char *); | |||||
| extern integer isamax_(integer *, real *, integer *); | |||||
| real taunan; | |||||
| extern logical sisnan_(real *); | |||||
| /* -- LAPACK auxiliary routine -- */ | |||||
| /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ | |||||
| /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ | |||||
| /* ===================================================================== */ | |||||
| /* Initialize INFO */ | |||||
| /* Parameter adjustments */ | |||||
| a_dim1 = *lda; | |||||
| a_offset = 1 + a_dim1 * 1; | |||||
| a -= a_offset; | |||||
| --jpiv; | |||||
| --tau; | |||||
| --vn1; | |||||
| --vn2; | |||||
| --work; | |||||
| /* Function Body */ | |||||
| *info = 0; | |||||
| /* MINMNFACT in the smallest dimension of the submatrix */ | |||||
| /* A(IOFFSET+1:M,1:N) to be factorized. */ | |||||
| /* MINMNUPDT is the smallest dimension */ | |||||
| /* of the subarray A(IOFFSET+1:M,1:N+NRHS) to be udated, which */ | |||||
| /* contains the submatrices A(IOFFSET+1:M,1:N) and */ | |||||
| /* B(IOFFSET+1:M,1:NRHS) as column blocks. */ | |||||
| /* Computing MIN */ | |||||
| i__1 = *m - *ioffset; | |||||
| minmnfact = f2cmin(i__1,*n); | |||||
| /* Computing MIN */ | |||||
| i__1 = *m - *ioffset, i__2 = *n + *nrhs; | |||||
| minmnupdt = f2cmin(i__1,i__2); | |||||
| *kmax = f2cmin(*kmax,minmnfact); | |||||
| tol3z = sqrt(slamch_("Epsilon")); | |||||
| myhugeval = slamch_("Overflow"); | |||||
| /* Compute the factorization, KK is the lomn loop index. */ | |||||
| i__1 = *kmax; | |||||
| for (kk = 1; kk <= i__1; ++kk) { | |||||
| i__ = *ioffset + kk; | |||||
| if (i__ == 1) { | |||||
| /* ============================================================ */ | |||||
| /* We are at the first column of the original whole matrix A, */ | |||||
| /* therefore we use the computed KP1 and MAXC2NRM from the */ | |||||
| /* main routine. */ | |||||
| kp = *kp1; | |||||
| /* ============================================================ */ | |||||
| } else { | |||||
| /* ============================================================ */ | |||||
| /* Determine the pivot column in KK-th step, i.e. the index */ | |||||
| /* of the column with the maximum 2-norm in the */ | |||||
| /* submatrix A(I:M,K:N). */ | |||||
| i__2 = *n - kk + 1; | |||||
| kp = kk - 1 + isamax_(&i__2, &vn1[kk], &c__1); | |||||
| /* Determine the maximum column 2-norm and the relative maximum */ | |||||
| /* column 2-norm of the submatrix A(I:M,KK:N) in step KK. */ | |||||
| /* RELMAXC2NRMK will be computed later, after somecondition */ | |||||
| /* checks on MAXC2NRMK. */ | |||||
| *maxc2nrmk = vn1[kp]; | |||||
| /* ============================================================ */ | |||||
| /* Check if the submatrix A(I:M,KK:N) contains NaN, and set */ | |||||
| /* INFO parameter to the column number, where the first NaN */ | |||||
| /* is found and return from the routine. */ | |||||
| /* We need to check the condition only if the */ | |||||
| /* column index (same as row index) of the original whole */ | |||||
| /* matrix is larger than 1, since the condition for whole */ | |||||
| /* original matrix is checked in the main routine. */ | |||||
| if (sisnan_(maxc2nrmk)) { | |||||
| /* Set K, the number of factorized columns. */ | |||||
| /* that are not zero. */ | |||||
| *k = kk - 1; | |||||
| *info = *k + kp; | |||||
| /* Set RELMAXC2NRMK to NaN. */ | |||||
| *relmaxc2nrmk = *maxc2nrmk; | |||||
| /* Array TAU(K+1:MINMNFACT) is not set and contains */ | |||||
| /* undefined elements. */ | |||||
| return 0; | |||||
| } | |||||
| /* ============================================================ */ | |||||
| /* Quick return, if the submatrix A(I:M,KK:N) is */ | |||||
| /* a zero matrix. */ | |||||
| /* We need to check the condition only if the */ | |||||
| /* column index (same as row index) of the original whole */ | |||||
| /* matrix is larger than 1, since the condition for whole */ | |||||
| /* original matrix is checked in the main routine. */ | |||||
| if (*maxc2nrmk == 0.f) { | |||||
| /* Set K, the number of factorized columns. */ | |||||
| /* that are not zero. */ | |||||
| *k = kk - 1; | |||||
| *relmaxc2nrmk = 0.f; | |||||
| /* Set TAUs corresponding to the columns that were not */ | |||||
| /* factorized to ZERO, i.e. set TAU(KK:MINMNFACT) to CZERO. */ | |||||
| i__2 = minmnfact; | |||||
| for (j = kk; j <= i__2; ++j) { | |||||
| i__3 = j; | |||||
| tau[i__3].r = 0.f, tau[i__3].i = 0.f; | |||||
| } | |||||
| /* Return from the routine. */ | |||||
| return 0; | |||||
| } | |||||
| /* ============================================================ */ | |||||
| /* Check if the submatrix A(I:M,KK:N) contains Inf, */ | |||||
| /* set INFO parameter to the column number, where */ | |||||
| /* the first Inf is found plus N, and continue */ | |||||
| /* the computation. */ | |||||
| /* We need to check the condition only if the */ | |||||
| /* column index (same as row index) of the original whole */ | |||||
| /* matrix is larger than 1, since the condition for whole */ | |||||
| /* original matrix is checked in the main routine. */ | |||||
| if (*info == 0 && *maxc2nrmk > myhugeval) { | |||||
| *info = *n + kk - 1 + kp; | |||||
| } | |||||
| /* ============================================================ */ | |||||
| /* Test for the second and third stopping criteria. */ | |||||
| /* NOTE: There is no need to test for ABSTOL >= ZERO, since */ | |||||
| /* MAXC2NRMK is non-negative. Similarly, there is no need */ | |||||
| /* to test for RELTOL >= ZERO, since RELMAXC2NRMK is */ | |||||
| /* non-negative. */ | |||||
| /* We need to check the condition only if the */ | |||||
| /* column index (same as row index) of the original whole */ | |||||
| /* matrix is larger than 1, since the condition for whole */ | |||||
| /* original matrix is checked in the main routine. */ | |||||
| *relmaxc2nrmk = *maxc2nrmk / *maxc2nrm; | |||||
| if (*maxc2nrmk <= *abstol || *relmaxc2nrmk <= *reltol) { | |||||
| /* Set K, the number of factorized columns. */ | |||||
| *k = kk - 1; | |||||
| /* Set TAUs corresponding to the columns that were not */ | |||||
| /* factorized to ZERO, i.e. set TAU(KK:MINMNFACT) to CZERO. */ | |||||
| i__2 = minmnfact; | |||||
| for (j = kk; j <= i__2; ++j) { | |||||
| i__3 = j; | |||||
| tau[i__3].r = 0.f, tau[i__3].i = 0.f; | |||||
| } | |||||
| /* Return from the routine. */ | |||||
| return 0; | |||||
| } | |||||
| /* ============================================================ */ | |||||
| /* End ELSE of IF(I.EQ.1) */ | |||||
| } | |||||
| /* =============================================================== */ | |||||
| /* If the pivot column is not the first column of the */ | |||||
| /* subblock A(1:M,KK:N): */ | |||||
| /* 1) swap the KK-th column and the KP-th pivot column */ | |||||
| /* in A(1:M,1:N); */ | |||||
| /* 2) copy the KK-th element into the KP-th element of the partial */ | |||||
| /* and exact 2-norm vectors VN1 and VN2. ( Swap is not needed */ | |||||
| /* for VN1 and VN2 since we use the element with the index */ | |||||
| /* larger than KK in the next loop step.) */ | |||||
| /* 3) Save the pivot interchange with the indices relative to the */ | |||||
| /* the original matrix A, not the block A(1:M,1:N). */ | |||||
| if (kp != kk) { | |||||
| cswap_(m, &a[kp * a_dim1 + 1], &c__1, &a[kk * a_dim1 + 1], &c__1); | |||||
| vn1[kp] = vn1[kk]; | |||||
| vn2[kp] = vn2[kk]; | |||||
| itemp = jpiv[kp]; | |||||
| jpiv[kp] = jpiv[kk]; | |||||
| jpiv[kk] = itemp; | |||||
| } | |||||
| /* Generate elementary reflector H(KK) using the column A(I:M,KK), */ | |||||
| /* if the column has more than one element, otherwise */ | |||||
| /* the elementary reflector would be an identity matrix, */ | |||||
| /* and TAU(KK) = CZERO. */ | |||||
| if (i__ < *m) { | |||||
| i__2 = *m - i__ + 1; | |||||
| clarfg_(&i__2, &a[i__ + kk * a_dim1], &a[i__ + 1 + kk * a_dim1], & | |||||
| c__1, &tau[kk]); | |||||
| } else { | |||||
| i__2 = kk; | |||||
| tau[i__2].r = 0.f, tau[i__2].i = 0.f; | |||||
| } | |||||
| /* Check if TAU(KK) contains NaN, set INFO parameter */ | |||||
| /* to the column number where NaN is found and return from */ | |||||
| /* the routine. */ | |||||
| /* NOTE: There is no need to check TAU(KK) for Inf, */ | |||||
| /* since CLARFG cannot produce TAU(KK) or Householder vector */ | |||||
| /* below the diagonal containing Inf. Only BETA on the diagonal, */ | |||||
| /* returned by CLARFG can contain Inf, which requires */ | |||||
| /* TAU(KK) to contain NaN. Therefore, this case of generating Inf */ | |||||
| /* by CLARFG is covered by checking TAU(KK) for NaN. */ | |||||
| i__2 = kk; | |||||
| r__1 = tau[i__2].r; | |||||
| if (sisnan_(&r__1)) { | |||||
| i__2 = kk; | |||||
| taunan = tau[i__2].r; | |||||
| } else /* if(complicated condition) */ { | |||||
| r__1 = r_imag(&tau[kk]); | |||||
| if (sisnan_(&r__1)) { | |||||
| taunan = r_imag(&tau[kk]); | |||||
| } else { | |||||
| taunan = 0.f; | |||||
| } | |||||
| } | |||||
| if (sisnan_(&taunan)) { | |||||
| *k = kk - 1; | |||||
| *info = kk; | |||||
| /* Set MAXC2NRMK and RELMAXC2NRMK to NaN. */ | |||||
| *maxc2nrmk = taunan; | |||||
| *relmaxc2nrmk = taunan; | |||||
| /* Array TAU(KK:MINMNFACT) is not set and contains */ | |||||
| /* undefined elements, except the first element TAU(KK) = NaN. */ | |||||
| return 0; | |||||
| } | |||||
| /* Apply H(KK)**H to A(I:M,KK+1:N+NRHS) from the left. */ | |||||
| /* ( If M >= N, then at KK = N there is no residual matrix, */ | |||||
| /* i.e. no columns of A to update, only columns of B. */ | |||||
| /* If M < N, then at KK = M-IOFFSET, I = M and we have a */ | |||||
| /* one-row residual matrix in A and the elementary */ | |||||
| /* reflector is a unit matrix, TAU(KK) = CZERO, i.e. no update */ | |||||
| /* is needed for the residual matrix in A and the */ | |||||
| /* right-hand-side-matrix in B. */ | |||||
| /* Therefore, we update only if */ | |||||
| /* KK < MINMNUPDT = f2cmin(M-IOFFSET, N+NRHS) */ | |||||
| /* condition is satisfied, not only KK < N+NRHS ) */ | |||||
| if (kk < minmnupdt) { | |||||
| i__2 = i__ + kk * a_dim1; | |||||
| aikk.r = a[i__2].r, aikk.i = a[i__2].i; | |||||
| i__2 = i__ + kk * a_dim1; | |||||
| a[i__2].r = 1.f, a[i__2].i = 0.f; | |||||
| i__2 = *m - i__ + 1; | |||||
| i__3 = *n + *nrhs - kk; | |||||
| r_cnjg(&q__1, &tau[kk]); | |||||
| clarf_("Left", &i__2, &i__3, &a[i__ + kk * a_dim1], &c__1, &q__1, | |||||
| &a[i__ + (kk + 1) * a_dim1], lda, &work[1]); | |||||
| i__2 = i__ + kk * a_dim1; | |||||
| a[i__2].r = aikk.r, a[i__2].i = aikk.i; | |||||
| } | |||||
| if (kk < minmnfact) { | |||||
| /* Update the partial column 2-norms for the residual matrix, */ | |||||
| /* only if the residual matrix A(I+1:M,KK+1:N) exists, i.e. */ | |||||
| /* when KK < f2cmin(M-IOFFSET, N). */ | |||||
| i__2 = *n; | |||||
| for (j = kk + 1; j <= i__2; ++j) { | |||||
| if (vn1[j] != 0.f) { | |||||
| /* NOTE: The following lines follow from the analysis in */ | |||||
| /* Lapack Working Note 176. */ | |||||
| /* Computing 2nd power */ | |||||
| r__1 = c_abs(&a[i__ + j * a_dim1]) / vn1[j]; | |||||
| temp = 1.f - r__1 * r__1; | |||||
| temp = f2cmax(temp,0.f); | |||||
| /* Computing 2nd power */ | |||||
| r__1 = vn1[j] / vn2[j]; | |||||
| temp2 = temp * (r__1 * r__1); | |||||
| if (temp2 <= tol3z) { | |||||
| /* Compute the column 2-norm for the partial */ | |||||
| /* column A(I+1:M,J) by explicitly computing it, */ | |||||
| /* and store it in both partial 2-norm vector VN1 */ | |||||
| /* and exact column 2-norm vector VN2. */ | |||||
| i__3 = *m - i__; | |||||
| vn1[j] = scnrm2_(&i__3, &a[i__ + 1 + j * a_dim1], & | |||||
| c__1); | |||||
| vn2[j] = vn1[j]; | |||||
| } else { | |||||
| /* Update the column 2-norm for the partial */ | |||||
| /* column A(I+1:M,J) by removing one */ | |||||
| /* element A(I,J) and store it in partial */ | |||||
| /* 2-norm vector VN1. */ | |||||
| vn1[j] *= sqrt(temp); | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| /* End factorization loop */ | |||||
| } | |||||
| /* If we reached this point, all colunms have been factorized, */ | |||||
| /* i.e. no condition was triggered to exit the routine. */ | |||||
| /* Set the number of factorized columns. */ | |||||
| *k = *kmax; | |||||
| /* We reached the end of the loop, i.e. all KMAX columns were */ | |||||
| /* factorized, we need to set MAXC2NRMK and RELMAXC2NRMK before */ | |||||
| /* we return. */ | |||||
| if (*k < minmnfact) { | |||||
| i__1 = *n - *k; | |||||
| jmaxc2nrm = *k + isamax_(&i__1, &vn1[*k + 1], &c__1); | |||||
| *maxc2nrmk = vn1[jmaxc2nrm]; | |||||
| if (*k == 0) { | |||||
| *relmaxc2nrmk = 1.f; | |||||
| } else { | |||||
| *relmaxc2nrmk = *maxc2nrmk / *maxc2nrm; | |||||
| } | |||||
| } else { | |||||
| *maxc2nrmk = 0.f; | |||||
| *relmaxc2nrmk = 0.f; | |||||
| } | |||||
| /* We reached the end of the loop, i.e. all KMAX columns were */ | |||||
| /* factorized, set TAUs corresponding to the columns that were */ | |||||
| /* not factorized to ZERO, i.e. TAU(K+1:MINMNFACT) set to CZERO. */ | |||||
| i__1 = minmnfact; | |||||
| for (j = *k + 1; j <= i__1; ++j) { | |||||
| i__2 = j; | |||||
| tau[i__2].r = 0.f, tau[i__2].i = 0.f; | |||||
| } | |||||
| return 0; | |||||
| /* End of CLAQP2RK */ | |||||
| } /* claqp2rk_ */ | |||||
| @@ -0,0 +1,923 @@ | |||||
| #include <math.h> | |||||
| #include <stdlib.h> | |||||
| #include <string.h> | |||||
| #include <stdio.h> | |||||
| #include <complex.h> | |||||
| #ifdef complex | |||||
| #undef complex | |||||
| #endif | |||||
| #ifdef I | |||||
| #undef I | |||||
| #endif | |||||
| #if defined(_WIN64) | |||||
| typedef long long BLASLONG; | |||||
| typedef unsigned long long BLASULONG; | |||||
| #else | |||||
| typedef long BLASLONG; | |||||
| typedef unsigned long BLASULONG; | |||||
| #endif | |||||
| #ifdef LAPACK_ILP64 | |||||
| typedef BLASLONG blasint; | |||||
| #if defined(_WIN64) | |||||
| #define blasabs(x) llabs(x) | |||||
| #else | |||||
| #define blasabs(x) labs(x) | |||||
| #endif | |||||
| #else | |||||
| typedef int blasint; | |||||
| #define blasabs(x) abs(x) | |||||
| #endif | |||||
| typedef blasint integer; | |||||
| typedef unsigned int uinteger; | |||||
| typedef char *address; | |||||
| typedef short int shortint; | |||||
| typedef float real; | |||||
| typedef double doublereal; | |||||
| typedef struct { real r, i; } complex; | |||||
| typedef struct { doublereal r, i; } doublecomplex; | |||||
| #ifdef _MSC_VER | |||||
| static inline _Fcomplex Cf(complex *z) {_Fcomplex zz={z->r , z->i}; return zz;} | |||||
| static inline _Dcomplex Cd(doublecomplex *z) {_Dcomplex zz={z->r , z->i};return zz;} | |||||
| static inline _Fcomplex * _pCf(complex *z) {return (_Fcomplex*)z;} | |||||
| static inline _Dcomplex * _pCd(doublecomplex *z) {return (_Dcomplex*)z;} | |||||
| #else | |||||
| static inline _Complex float Cf(complex *z) {return z->r + z->i*_Complex_I;} | |||||
| static inline _Complex double Cd(doublecomplex *z) {return z->r + z->i*_Complex_I;} | |||||
| static inline _Complex float * _pCf(complex *z) {return (_Complex float*)z;} | |||||
| static inline _Complex double * _pCd(doublecomplex *z) {return (_Complex double*)z;} | |||||
| #endif | |||||
| #define pCf(z) (*_pCf(z)) | |||||
| #define pCd(z) (*_pCd(z)) | |||||
| typedef int logical; | |||||
| typedef short int shortlogical; | |||||
| typedef char logical1; | |||||
| typedef char integer1; | |||||
| #define TRUE_ (1) | |||||
| #define FALSE_ (0) | |||||
| /* Extern is for use with -E */ | |||||
| #ifndef Extern | |||||
| #define Extern extern | |||||
| #endif | |||||
| /* I/O stuff */ | |||||
| typedef int flag; | |||||
| typedef int ftnlen; | |||||
| typedef int ftnint; | |||||
| /*external read, write*/ | |||||
| typedef struct | |||||
| { flag cierr; | |||||
| ftnint ciunit; | |||||
| flag ciend; | |||||
| char *cifmt; | |||||
| ftnint cirec; | |||||
| } cilist; | |||||
| /*internal read, write*/ | |||||
| typedef struct | |||||
| { flag icierr; | |||||
| char *iciunit; | |||||
| flag iciend; | |||||
| char *icifmt; | |||||
| ftnint icirlen; | |||||
| ftnint icirnum; | |||||
| } icilist; | |||||
| /*open*/ | |||||
| typedef struct | |||||
| { flag oerr; | |||||
| ftnint ounit; | |||||
| char *ofnm; | |||||
| ftnlen ofnmlen; | |||||
| char *osta; | |||||
| char *oacc; | |||||
| char *ofm; | |||||
| ftnint orl; | |||||
| char *oblnk; | |||||
| } olist; | |||||
| /*close*/ | |||||
| typedef struct | |||||
| { flag cerr; | |||||
| ftnint cunit; | |||||
| char *csta; | |||||
| } cllist; | |||||
| /*rewind, backspace, endfile*/ | |||||
| typedef struct | |||||
| { flag aerr; | |||||
| ftnint aunit; | |||||
| } alist; | |||||
| /* inquire */ | |||||
| typedef struct | |||||
| { flag inerr; | |||||
| ftnint inunit; | |||||
| char *infile; | |||||
| ftnlen infilen; | |||||
| ftnint *inex; /*parameters in standard's order*/ | |||||
| ftnint *inopen; | |||||
| ftnint *innum; | |||||
| ftnint *innamed; | |||||
| char *inname; | |||||
| ftnlen innamlen; | |||||
| char *inacc; | |||||
| ftnlen inacclen; | |||||
| char *inseq; | |||||
| ftnlen inseqlen; | |||||
| char *indir; | |||||
| ftnlen indirlen; | |||||
| char *infmt; | |||||
| ftnlen infmtlen; | |||||
| char *inform; | |||||
| ftnint informlen; | |||||
| char *inunf; | |||||
| ftnlen inunflen; | |||||
| ftnint *inrecl; | |||||
| ftnint *innrec; | |||||
| char *inblank; | |||||
| ftnlen inblanklen; | |||||
| } inlist; | |||||
| #define VOID void | |||||
| union Multitype { /* for multiple entry points */ | |||||
| integer1 g; | |||||
| shortint h; | |||||
| integer i; | |||||
| /* longint j; */ | |||||
| real r; | |||||
| doublereal d; | |||||
| complex c; | |||||
| doublecomplex z; | |||||
| }; | |||||
| typedef union Multitype Multitype; | |||||
| struct Vardesc { /* for Namelist */ | |||||
| char *name; | |||||
| char *addr; | |||||
| ftnlen *dims; | |||||
| int type; | |||||
| }; | |||||
| typedef struct Vardesc Vardesc; | |||||
| struct Namelist { | |||||
| char *name; | |||||
| Vardesc **vars; | |||||
| int nvars; | |||||
| }; | |||||
| typedef struct Namelist Namelist; | |||||
| #define abs(x) ((x) >= 0 ? (x) : -(x)) | |||||
| #define dabs(x) (fabs(x)) | |||||
| #define f2cmin(a,b) ((a) <= (b) ? (a) : (b)) | |||||
| #define f2cmax(a,b) ((a) >= (b) ? (a) : (b)) | |||||
| #define dmin(a,b) (f2cmin(a,b)) | |||||
| #define dmax(a,b) (f2cmax(a,b)) | |||||
| #define bit_test(a,b) ((a) >> (b) & 1) | |||||
| #define bit_clear(a,b) ((a) & ~((uinteger)1 << (b))) | |||||
| #define bit_set(a,b) ((a) | ((uinteger)1 << (b))) | |||||
| #define abort_() { sig_die("Fortran abort routine called", 1); } | |||||
| #define c_abs(z) (cabsf(Cf(z))) | |||||
| #define c_cos(R,Z) { pCf(R)=ccos(Cf(Z)); } | |||||
| #ifdef _MSC_VER | |||||
| #define c_div(c, a, b) {Cf(c)._Val[0] = (Cf(a)._Val[0]/Cf(b)._Val[0]); Cf(c)._Val[1]=(Cf(a)._Val[1]/Cf(b)._Val[1]);} | |||||
| #define z_div(c, a, b) {Cd(c)._Val[0] = (Cd(a)._Val[0]/Cd(b)._Val[0]); Cd(c)._Val[1]=(Cd(a)._Val[1]/Cd(b)._Val[1]);} | |||||
| #else | |||||
| #define c_div(c, a, b) {pCf(c) = Cf(a)/Cf(b);} | |||||
| #define z_div(c, a, b) {pCd(c) = Cd(a)/Cd(b);} | |||||
| #endif | |||||
| #define c_exp(R, Z) {pCf(R) = cexpf(Cf(Z));} | |||||
| #define c_log(R, Z) {pCf(R) = clogf(Cf(Z));} | |||||
| #define c_sin(R, Z) {pCf(R) = csinf(Cf(Z));} | |||||
| //#define c_sqrt(R, Z) {*(R) = csqrtf(Cf(Z));} | |||||
| #define c_sqrt(R, Z) {pCf(R) = csqrtf(Cf(Z));} | |||||
| #define d_abs(x) (fabs(*(x))) | |||||
| #define d_acos(x) (acos(*(x))) | |||||
| #define d_asin(x) (asin(*(x))) | |||||
| #define d_atan(x) (atan(*(x))) | |||||
| #define d_atn2(x, y) (atan2(*(x),*(y))) | |||||
| #define d_cnjg(R, Z) { pCd(R) = conj(Cd(Z)); } | |||||
| #define r_cnjg(R, Z) { pCf(R) = conjf(Cf(Z)); } | |||||
| #define d_cos(x) (cos(*(x))) | |||||
| #define d_cosh(x) (cosh(*(x))) | |||||
| #define d_dim(__a, __b) ( *(__a) > *(__b) ? *(__a) - *(__b) : 0.0 ) | |||||
| #define d_exp(x) (exp(*(x))) | |||||
| #define d_imag(z) (cimag(Cd(z))) | |||||
| #define r_imag(z) (cimagf(Cf(z))) | |||||
| #define d_int(__x) (*(__x)>0 ? floor(*(__x)) : -floor(- *(__x))) | |||||
| #define r_int(__x) (*(__x)>0 ? floor(*(__x)) : -floor(- *(__x))) | |||||
| #define d_lg10(x) ( 0.43429448190325182765 * log(*(x)) ) | |||||
| #define r_lg10(x) ( 0.43429448190325182765 * log(*(x)) ) | |||||
| #define d_log(x) (log(*(x))) | |||||
| #define d_mod(x, y) (fmod(*(x), *(y))) | |||||
| #define u_nint(__x) ((__x)>=0 ? floor((__x) + .5) : -floor(.5 - (__x))) | |||||
| #define d_nint(x) u_nint(*(x)) | |||||
| #define u_sign(__a,__b) ((__b) >= 0 ? ((__a) >= 0 ? (__a) : -(__a)) : -((__a) >= 0 ? (__a) : -(__a))) | |||||
| #define d_sign(a,b) u_sign(*(a),*(b)) | |||||
| #define r_sign(a,b) u_sign(*(a),*(b)) | |||||
| #define d_sin(x) (sin(*(x))) | |||||
| #define d_sinh(x) (sinh(*(x))) | |||||
| #define d_sqrt(x) (sqrt(*(x))) | |||||
| #define d_tan(x) (tan(*(x))) | |||||
| #define d_tanh(x) (tanh(*(x))) | |||||
| #define i_abs(x) abs(*(x)) | |||||
| #define i_dnnt(x) ((integer)u_nint(*(x))) | |||||
| #define i_len(s, n) (n) | |||||
| #define i_nint(x) ((integer)u_nint(*(x))) | |||||
| #define i_sign(a,b) ((integer)u_sign((integer)*(a),(integer)*(b))) | |||||
| #define pow_dd(ap, bp) ( pow(*(ap), *(bp))) | |||||
| #define pow_si(B,E) spow_ui(*(B),*(E)) | |||||
| #define pow_ri(B,E) spow_ui(*(B),*(E)) | |||||
| #define pow_di(B,E) dpow_ui(*(B),*(E)) | |||||
| #define pow_zi(p, a, b) {pCd(p) = zpow_ui(Cd(a), *(b));} | |||||
| #define pow_ci(p, a, b) {pCf(p) = cpow_ui(Cf(a), *(b));} | |||||
| #define pow_zz(R,A,B) {pCd(R) = cpow(Cd(A),*(B));} | |||||
| #define s_cat(lpp, rpp, rnp, np, llp) { ftnlen i, nc, ll; char *f__rp, *lp; ll = (llp); lp = (lpp); for(i=0; i < (int)*(np); ++i) { nc = ll; if((rnp)[i] < nc) nc = (rnp)[i]; ll -= nc; f__rp = (rpp)[i]; while(--nc >= 0) *lp++ = *(f__rp)++; } while(--ll >= 0) *lp++ = ' '; } | |||||
| #define s_cmp(a,b,c,d) ((integer)strncmp((a),(b),f2cmin((c),(d)))) | |||||
| #define s_copy(A,B,C,D) { int __i,__m; for (__i=0, __m=f2cmin((C),(D)); __i<__m && (B)[__i] != 0; ++__i) (A)[__i] = (B)[__i]; } | |||||
| #define sig_die(s, kill) { exit(1); } | |||||
| #define s_stop(s, n) {exit(0);} | |||||
| static char junk[] = "\n@(#)LIBF77 VERSION 19990503\n"; | |||||
| #define z_abs(z) (cabs(Cd(z))) | |||||
| #define z_exp(R, Z) {pCd(R) = cexp(Cd(Z));} | |||||
| #define z_sqrt(R, Z) {pCd(R) = csqrt(Cd(Z));} | |||||
| #define myexit_() break; | |||||
| #define mycycle_() continue; | |||||
| #define myceiling_(w) {ceil(w)} | |||||
| #define myhuge_(w) {HUGE_VAL} | |||||
| //#define mymaxloc_(w,s,e,n) {if (sizeof(*(w)) == sizeof(double)) dmaxloc_((w),*(s),*(e),n); else dmaxloc_((w),*(s),*(e),n);} | |||||
| #define mymaxloc_(w,s,e,n) dmaxloc_(w,*(s),*(e),n) | |||||
| /* procedure parameter types for -A and -C++ */ | |||||
| #define F2C_proc_par_types 1 | |||||
| #ifdef __cplusplus | |||||
| typedef logical (*L_fp)(...); | |||||
| #else | |||||
| typedef logical (*L_fp)(); | |||||
| #endif | |||||
| static float spow_ui(float x, integer n) { | |||||
| float pow=1.0; unsigned long int u; | |||||
| if(n != 0) { | |||||
| if(n < 0) n = -n, x = 1/x; | |||||
| for(u = n; ; ) { | |||||
| if(u & 01) pow *= x; | |||||
| if(u >>= 1) x *= x; | |||||
| else break; | |||||
| } | |||||
| } | |||||
| return pow; | |||||
| } | |||||
| static double dpow_ui(double x, integer n) { | |||||
| double pow=1.0; unsigned long int u; | |||||
| if(n != 0) { | |||||
| if(n < 0) n = -n, x = 1/x; | |||||
| for(u = n; ; ) { | |||||
| if(u & 01) pow *= x; | |||||
| if(u >>= 1) x *= x; | |||||
| else break; | |||||
| } | |||||
| } | |||||
| return pow; | |||||
| } | |||||
| #ifdef _MSC_VER | |||||
| static _Fcomplex cpow_ui(complex x, integer n) { | |||||
| complex pow={1.0,0.0}; unsigned long int u; | |||||
| if(n != 0) { | |||||
| if(n < 0) n = -n, x.r = 1/x.r, x.i=1/x.i; | |||||
| for(u = n; ; ) { | |||||
| if(u & 01) pow.r *= x.r, pow.i *= x.i; | |||||
| if(u >>= 1) x.r *= x.r, x.i *= x.i; | |||||
| else break; | |||||
| } | |||||
| } | |||||
| _Fcomplex p={pow.r, pow.i}; | |||||
| return p; | |||||
| } | |||||
| #else | |||||
| static _Complex float cpow_ui(_Complex float x, integer n) { | |||||
| _Complex float pow=1.0; unsigned long int u; | |||||
| if(n != 0) { | |||||
| if(n < 0) n = -n, x = 1/x; | |||||
| for(u = n; ; ) { | |||||
| if(u & 01) pow *= x; | |||||
| if(u >>= 1) x *= x; | |||||
| else break; | |||||
| } | |||||
| } | |||||
| return pow; | |||||
| } | |||||
| #endif | |||||
| #ifdef _MSC_VER | |||||
| static _Dcomplex zpow_ui(_Dcomplex x, integer n) { | |||||
| _Dcomplex pow={1.0,0.0}; unsigned long int u; | |||||
| if(n != 0) { | |||||
| if(n < 0) n = -n, x._Val[0] = 1/x._Val[0], x._Val[1] =1/x._Val[1]; | |||||
| for(u = n; ; ) { | |||||
| if(u & 01) pow._Val[0] *= x._Val[0], pow._Val[1] *= x._Val[1]; | |||||
| if(u >>= 1) x._Val[0] *= x._Val[0], x._Val[1] *= x._Val[1]; | |||||
| else break; | |||||
| } | |||||
| } | |||||
| _Dcomplex p = {pow._Val[0], pow._Val[1]}; | |||||
| return p; | |||||
| } | |||||
| #else | |||||
| static _Complex double zpow_ui(_Complex double x, integer n) { | |||||
| _Complex double pow=1.0; unsigned long int u; | |||||
| if(n != 0) { | |||||
| if(n < 0) n = -n, x = 1/x; | |||||
| for(u = n; ; ) { | |||||
| if(u & 01) pow *= x; | |||||
| if(u >>= 1) x *= x; | |||||
| else break; | |||||
| } | |||||
| } | |||||
| return pow; | |||||
| } | |||||
| #endif | |||||
| static integer pow_ii(integer x, integer n) { | |||||
| integer pow; unsigned long int u; | |||||
| if (n <= 0) { | |||||
| if (n == 0 || x == 1) pow = 1; | |||||
| else if (x != -1) pow = x == 0 ? 1/x : 0; | |||||
| else n = -n; | |||||
| } | |||||
| if ((n > 0) || !(n == 0 || x == 1 || x != -1)) { | |||||
| u = n; | |||||
| for(pow = 1; ; ) { | |||||
| if(u & 01) pow *= x; | |||||
| if(u >>= 1) x *= x; | |||||
| else break; | |||||
| } | |||||
| } | |||||
| return pow; | |||||
| } | |||||
| static integer dmaxloc_(double *w, integer s, integer e, integer *n) | |||||
| { | |||||
| double m; integer i, mi; | |||||
| for(m=w[s-1], mi=s, i=s+1; i<=e; i++) | |||||
| if (w[i-1]>m) mi=i ,m=w[i-1]; | |||||
| return mi-s+1; | |||||
| } | |||||
| static integer smaxloc_(float *w, integer s, integer e, integer *n) | |||||
| { | |||||
| float m; integer i, mi; | |||||
| for(m=w[s-1], mi=s, i=s+1; i<=e; i++) | |||||
| if (w[i-1]>m) mi=i ,m=w[i-1]; | |||||
| return mi-s+1; | |||||
| } | |||||
| static inline void cdotc_(complex *z, integer *n_, complex *x, integer *incx_, complex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| #ifdef _MSC_VER | |||||
| _Fcomplex zdotc = {0.0, 0.0}; | |||||
| if (incx == 1 && incy == 1) { | |||||
| for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */ | |||||
| zdotc._Val[0] += conjf(Cf(&x[i]))._Val[0] * Cf(&y[i])._Val[0]; | |||||
| zdotc._Val[1] += conjf(Cf(&x[i]))._Val[1] * Cf(&y[i])._Val[1]; | |||||
| } | |||||
| } else { | |||||
| for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */ | |||||
| zdotc._Val[0] += conjf(Cf(&x[i*incx]))._Val[0] * Cf(&y[i*incy])._Val[0]; | |||||
| zdotc._Val[1] += conjf(Cf(&x[i*incx]))._Val[1] * Cf(&y[i*incy])._Val[1]; | |||||
| } | |||||
| } | |||||
| pCf(z) = zdotc; | |||||
| } | |||||
| #else | |||||
| _Complex float zdotc = 0.0; | |||||
| if (incx == 1 && incy == 1) { | |||||
| for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */ | |||||
| zdotc += conjf(Cf(&x[i])) * Cf(&y[i]); | |||||
| } | |||||
| } else { | |||||
| for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */ | |||||
| zdotc += conjf(Cf(&x[i*incx])) * Cf(&y[i*incy]); | |||||
| } | |||||
| } | |||||
| pCf(z) = zdotc; | |||||
| } | |||||
| #endif | |||||
| static inline void zdotc_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| #ifdef _MSC_VER | |||||
| _Dcomplex zdotc = {0.0, 0.0}; | |||||
| if (incx == 1 && incy == 1) { | |||||
| for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */ | |||||
| zdotc._Val[0] += conj(Cd(&x[i]))._Val[0] * Cd(&y[i])._Val[0]; | |||||
| zdotc._Val[1] += conj(Cd(&x[i]))._Val[1] * Cd(&y[i])._Val[1]; | |||||
| } | |||||
| } else { | |||||
| for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */ | |||||
| zdotc._Val[0] += conj(Cd(&x[i*incx]))._Val[0] * Cd(&y[i*incy])._Val[0]; | |||||
| zdotc._Val[1] += conj(Cd(&x[i*incx]))._Val[1] * Cd(&y[i*incy])._Val[1]; | |||||
| } | |||||
| } | |||||
| pCd(z) = zdotc; | |||||
| } | |||||
| #else | |||||
| _Complex double zdotc = 0.0; | |||||
| if (incx == 1 && incy == 1) { | |||||
| for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */ | |||||
| zdotc += conj(Cd(&x[i])) * Cd(&y[i]); | |||||
| } | |||||
| } else { | |||||
| for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */ | |||||
| zdotc += conj(Cd(&x[i*incx])) * Cd(&y[i*incy]); | |||||
| } | |||||
| } | |||||
| pCd(z) = zdotc; | |||||
| } | |||||
| #endif | |||||
| static inline void cdotu_(complex *z, integer *n_, complex *x, integer *incx_, complex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| #ifdef _MSC_VER | |||||
| _Fcomplex zdotc = {0.0, 0.0}; | |||||
| if (incx == 1 && incy == 1) { | |||||
| for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */ | |||||
| zdotc._Val[0] += Cf(&x[i])._Val[0] * Cf(&y[i])._Val[0]; | |||||
| zdotc._Val[1] += Cf(&x[i])._Val[1] * Cf(&y[i])._Val[1]; | |||||
| } | |||||
| } else { | |||||
| for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */ | |||||
| zdotc._Val[0] += Cf(&x[i*incx])._Val[0] * Cf(&y[i*incy])._Val[0]; | |||||
| zdotc._Val[1] += Cf(&x[i*incx])._Val[1] * Cf(&y[i*incy])._Val[1]; | |||||
| } | |||||
| } | |||||
| pCf(z) = zdotc; | |||||
| } | |||||
| #else | |||||
| _Complex float zdotc = 0.0; | |||||
| if (incx == 1 && incy == 1) { | |||||
| for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */ | |||||
| zdotc += Cf(&x[i]) * Cf(&y[i]); | |||||
| } | |||||
| } else { | |||||
| for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */ | |||||
| zdotc += Cf(&x[i*incx]) * Cf(&y[i*incy]); | |||||
| } | |||||
| } | |||||
| pCf(z) = zdotc; | |||||
| } | |||||
| #endif | |||||
| static inline void zdotu_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| #ifdef _MSC_VER | |||||
| _Dcomplex zdotc = {0.0, 0.0}; | |||||
| if (incx == 1 && incy == 1) { | |||||
| for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */ | |||||
| zdotc._Val[0] += Cd(&x[i])._Val[0] * Cd(&y[i])._Val[0]; | |||||
| zdotc._Val[1] += Cd(&x[i])._Val[1] * Cd(&y[i])._Val[1]; | |||||
| } | |||||
| } else { | |||||
| for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */ | |||||
| zdotc._Val[0] += Cd(&x[i*incx])._Val[0] * Cd(&y[i*incy])._Val[0]; | |||||
| zdotc._Val[1] += Cd(&x[i*incx])._Val[1] * Cd(&y[i*incy])._Val[1]; | |||||
| } | |||||
| } | |||||
| pCd(z) = zdotc; | |||||
| } | |||||
| #else | |||||
| _Complex double zdotc = 0.0; | |||||
| if (incx == 1 && incy == 1) { | |||||
| for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */ | |||||
| zdotc += Cd(&x[i]) * Cd(&y[i]); | |||||
| } | |||||
| } else { | |||||
| for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */ | |||||
| zdotc += Cd(&x[i*incx]) * Cd(&y[i*incy]); | |||||
| } | |||||
| } | |||||
| pCd(z) = zdotc; | |||||
| } | |||||
| #endif | |||||
| /* -- translated by f2c (version 20000121). | |||||
| You must link the resulting object file with the libraries: | |||||
| -lf2c -lm (in that order) | |||||
| */ | |||||
| /* -- translated by f2c (version 20000121). | |||||
| You must link the resulting object file with the libraries: | |||||
| -lf2c -lm (in that order) | |||||
| */ | |||||
| /* Table of constant values */ | |||||
| static integer c__1 = 1; | |||||
| /* Subroutine */ int dlaqp2rk_(integer *m, integer *n, integer *nrhs, integer | |||||
| *ioffset, integer *kmax, doublereal *abstol, doublereal *reltol, | |||||
| integer *kp1, doublereal *maxc2nrm, doublereal *a, integer *lda, | |||||
| integer *k, doublereal *maxc2nrmk, doublereal *relmaxc2nrmk, integer * | |||||
| jpiv, doublereal *tau, doublereal *vn1, doublereal *vn2, doublereal * | |||||
| work, integer *info) | |||||
| { | |||||
| /* System generated locals */ | |||||
| integer a_dim1, a_offset, i__1, i__2, i__3; | |||||
| doublereal d__1, d__2; | |||||
| /* Local variables */ | |||||
| doublereal aikk, temp; | |||||
| extern doublereal dnrm2_(integer *, doublereal *, integer *); | |||||
| doublereal temp2; | |||||
| integer i__, j; | |||||
| doublereal tol3z; | |||||
| integer jmaxc2nrm; | |||||
| extern /* Subroutine */ int dlarf_(char *, integer *, integer *, | |||||
| doublereal *, integer *, doublereal *, doublereal *, integer *, | |||||
| doublereal *); | |||||
| integer itemp; | |||||
| extern /* Subroutine */ int dswap_(integer *, doublereal *, integer *, | |||||
| doublereal *, integer *); | |||||
| integer minmnfact; | |||||
| doublereal myhugeval; | |||||
| integer minmnupdt, kk; | |||||
| extern doublereal dlamch_(char *); | |||||
| integer kp; | |||||
| extern /* Subroutine */ int dlarfg_(integer *, doublereal *, doublereal *, | |||||
| integer *, doublereal *); | |||||
| extern integer idamax_(integer *, doublereal *, integer *); | |||||
| extern logical disnan_(doublereal *); | |||||
| /* -- LAPACK auxiliary routine -- */ | |||||
| /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ | |||||
| /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ | |||||
| /* ===================================================================== */ | |||||
| /* Initialize INFO */ | |||||
| /* Parameter adjustments */ | |||||
| a_dim1 = *lda; | |||||
| a_offset = 1 + a_dim1 * 1; | |||||
| a -= a_offset; | |||||
| --jpiv; | |||||
| --tau; | |||||
| --vn1; | |||||
| --vn2; | |||||
| --work; | |||||
| /* Function Body */ | |||||
| *info = 0; | |||||
| /* MINMNFACT in the smallest dimension of the submatrix */ | |||||
| /* A(IOFFSET+1:M,1:N) to be factorized. */ | |||||
| /* MINMNUPDT is the smallest dimension */ | |||||
| /* of the subarray A(IOFFSET+1:M,1:N+NRHS) to be udated, which */ | |||||
| /* contains the submatrices A(IOFFSET+1:M,1:N) and */ | |||||
| /* B(IOFFSET+1:M,1:NRHS) as column blocks. */ | |||||
| /* Computing MIN */ | |||||
| i__1 = *m - *ioffset; | |||||
| minmnfact = f2cmin(i__1,*n); | |||||
| /* Computing MIN */ | |||||
| i__1 = *m - *ioffset, i__2 = *n + *nrhs; | |||||
| minmnupdt = f2cmin(i__1,i__2); | |||||
| *kmax = f2cmin(*kmax,minmnfact); | |||||
| tol3z = sqrt(dlamch_("Epsilon")); | |||||
| myhugeval = dlamch_("Overflow"); | |||||
| /* Compute the factorization, KK is the lomn loop index. */ | |||||
| i__1 = *kmax; | |||||
| for (kk = 1; kk <= i__1; ++kk) { | |||||
| i__ = *ioffset + kk; | |||||
| if (i__ == 1) { | |||||
| /* ============================================================ */ | |||||
| /* We are at the first column of the original whole matrix A, */ | |||||
| /* therefore we use the computed KP1 and MAXC2NRM from the */ | |||||
| /* main routine. */ | |||||
| kp = *kp1; | |||||
| /* ============================================================ */ | |||||
| } else { | |||||
| /* ============================================================ */ | |||||
| /* Determine the pivot column in KK-th step, i.e. the index */ | |||||
| /* of the column with the maximum 2-norm in the */ | |||||
| /* submatrix A(I:M,K:N). */ | |||||
| i__2 = *n - kk + 1; | |||||
| kp = kk - 1 + idamax_(&i__2, &vn1[kk], &c__1); | |||||
| /* Determine the maximum column 2-norm and the relative maximum */ | |||||
| /* column 2-norm of the submatrix A(I:M,KK:N) in step KK. */ | |||||
| /* RELMAXC2NRMK will be computed later, after somecondition */ | |||||
| /* checks on MAXC2NRMK. */ | |||||
| *maxc2nrmk = vn1[kp]; | |||||
| /* ============================================================ */ | |||||
| /* Check if the submatrix A(I:M,KK:N) contains NaN, and set */ | |||||
| /* INFO parameter to the column number, where the first NaN */ | |||||
| /* is found and return from the routine. */ | |||||
| /* We need to check the condition only if the */ | |||||
| /* column index (same as row index) of the original whole */ | |||||
| /* matrix is larger than 1, since the condition for whole */ | |||||
| /* original matrix is checked in the main routine. */ | |||||
| if (disnan_(maxc2nrmk)) { | |||||
| /* Set K, the number of factorized columns. */ | |||||
| /* that are not zero. */ | |||||
| *k = kk - 1; | |||||
| *info = *k + kp; | |||||
| /* Set RELMAXC2NRMK to NaN. */ | |||||
| *relmaxc2nrmk = *maxc2nrmk; | |||||
| /* Array TAU(K+1:MINMNFACT) is not set and contains */ | |||||
| /* undefined elements. */ | |||||
| return 0; | |||||
| } | |||||
| /* ============================================================ */ | |||||
| /* Quick return, if the submatrix A(I:M,KK:N) is */ | |||||
| /* a zero matrix. */ | |||||
| /* We need to check the condition only if the */ | |||||
| /* column index (same as row index) of the original whole */ | |||||
| /* matrix is larger than 1, since the condition for whole */ | |||||
| /* original matrix is checked in the main routine. */ | |||||
| if (*maxc2nrmk == 0.) { | |||||
| /* Set K, the number of factorized columns. */ | |||||
| /* that are not zero. */ | |||||
| *k = kk - 1; | |||||
| *relmaxc2nrmk = 0.; | |||||
| /* Set TAUs corresponding to the columns that were not */ | |||||
| /* factorized to ZERO, i.e. set TAU(KK:MINMNFACT) to ZERO. */ | |||||
| i__2 = minmnfact; | |||||
| for (j = kk; j <= i__2; ++j) { | |||||
| tau[j] = 0.; | |||||
| } | |||||
| /* Return from the routine. */ | |||||
| return 0; | |||||
| } | |||||
| /* ============================================================ */ | |||||
| /* Check if the submatrix A(I:M,KK:N) contains Inf, */ | |||||
| /* set INFO parameter to the column number, where */ | |||||
| /* the first Inf is found plus N, and continue */ | |||||
| /* the computation. */ | |||||
| /* We need to check the condition only if the */ | |||||
| /* column index (same as row index) of the original whole */ | |||||
| /* matrix is larger than 1, since the condition for whole */ | |||||
| /* original matrix is checked in the main routine. */ | |||||
| if (*info == 0 && *maxc2nrmk > myhugeval) { | |||||
| *info = *n + kk - 1 + kp; | |||||
| } | |||||
| /* ============================================================ */ | |||||
| /* Test for the second and third stopping criteria. */ | |||||
| /* NOTE: There is no need to test for ABSTOL >= ZERO, since */ | |||||
| /* MAXC2NRMK is non-negative. Similarly, there is no need */ | |||||
| /* to test for RELTOL >= ZERO, since RELMAXC2NRMK is */ | |||||
| /* non-negative. */ | |||||
| /* We need to check the condition only if the */ | |||||
| /* column index (same as row index) of the original whole */ | |||||
| /* matrix is larger than 1, since the condition for whole */ | |||||
| /* original matrix is checked in the main routine. */ | |||||
| *relmaxc2nrmk = *maxc2nrmk / *maxc2nrm; | |||||
| if (*maxc2nrmk <= *abstol || *relmaxc2nrmk <= *reltol) { | |||||
| /* Set K, the number of factorized columns. */ | |||||
| *k = kk - 1; | |||||
| /* Set TAUs corresponding to the columns that were not */ | |||||
| /* factorized to ZERO, i.e. set TAU(KK:MINMNFACT) to ZERO. */ | |||||
| i__2 = minmnfact; | |||||
| for (j = kk; j <= i__2; ++j) { | |||||
| tau[j] = 0.; | |||||
| } | |||||
| /* Return from the routine. */ | |||||
| return 0; | |||||
| } | |||||
| /* ============================================================ */ | |||||
| /* End ELSE of IF(I.EQ.1) */ | |||||
| } | |||||
| /* =============================================================== */ | |||||
| /* If the pivot column is not the first column of the */ | |||||
| /* subblock A(1:M,KK:N): */ | |||||
| /* 1) swap the KK-th column and the KP-th pivot column */ | |||||
| /* in A(1:M,1:N); */ | |||||
| /* 2) copy the KK-th element into the KP-th element of the partial */ | |||||
| /* and exact 2-norm vectors VN1 and VN2. ( Swap is not needed */ | |||||
| /* for VN1 and VN2 since we use the element with the index */ | |||||
| /* larger than KK in the next loop step.) */ | |||||
| /* 3) Save the pivot interchange with the indices relative to the */ | |||||
| /* the original matrix A, not the block A(1:M,1:N). */ | |||||
| if (kp != kk) { | |||||
| dswap_(m, &a[kp * a_dim1 + 1], &c__1, &a[kk * a_dim1 + 1], &c__1); | |||||
| vn1[kp] = vn1[kk]; | |||||
| vn2[kp] = vn2[kk]; | |||||
| itemp = jpiv[kp]; | |||||
| jpiv[kp] = jpiv[kk]; | |||||
| jpiv[kk] = itemp; | |||||
| } | |||||
| /* Generate elementary reflector H(KK) using the column A(I:M,KK), */ | |||||
| /* if the column has more than one element, otherwise */ | |||||
| /* the elementary reflector would be an identity matrix, */ | |||||
| /* and TAU(KK) = ZERO. */ | |||||
| if (i__ < *m) { | |||||
| i__2 = *m - i__ + 1; | |||||
| dlarfg_(&i__2, &a[i__ + kk * a_dim1], &a[i__ + 1 + kk * a_dim1], & | |||||
| c__1, &tau[kk]); | |||||
| } else { | |||||
| tau[kk] = 0.; | |||||
| } | |||||
| /* Check if TAU(KK) contains NaN, set INFO parameter */ | |||||
| /* to the column number where NaN is found and return from */ | |||||
| /* the routine. */ | |||||
| /* NOTE: There is no need to check TAU(KK) for Inf, */ | |||||
| /* since DLARFG cannot produce TAU(KK) or Householder vector */ | |||||
| /* below the diagonal containing Inf. Only BETA on the diagonal, */ | |||||
| /* returned by DLARFG can contain Inf, which requires */ | |||||
| /* TAU(KK) to contain NaN. Therefore, this case of generating Inf */ | |||||
| /* by DLARFG is covered by checking TAU(KK) for NaN. */ | |||||
| if (disnan_(&tau[kk])) { | |||||
| *k = kk - 1; | |||||
| *info = kk; | |||||
| /* Set MAXC2NRMK and RELMAXC2NRMK to NaN. */ | |||||
| *maxc2nrmk = tau[kk]; | |||||
| *relmaxc2nrmk = tau[kk]; | |||||
| /* Array TAU(KK:MINMNFACT) is not set and contains */ | |||||
| /* undefined elements, except the first element TAU(KK) = NaN. */ | |||||
| return 0; | |||||
| } | |||||
| /* Apply H(KK)**T to A(I:M,KK+1:N+NRHS) from the left. */ | |||||
| /* ( If M >= N, then at KK = N there is no residual matrix, */ | |||||
| /* i.e. no columns of A to update, only columns of B. */ | |||||
| /* If M < N, then at KK = M-IOFFSET, I = M and we have a */ | |||||
| /* one-row residual matrix in A and the elementary */ | |||||
| /* reflector is a unit matrix, TAU(KK) = ZERO, i.e. no update */ | |||||
| /* is needed for the residual matrix in A and the */ | |||||
| /* right-hand-side-matrix in B. */ | |||||
| /* Therefore, we update only if */ | |||||
| /* KK < MINMNUPDT = f2cmin(M-IOFFSET, N+NRHS) */ | |||||
| /* condition is satisfied, not only KK < N+NRHS ) */ | |||||
| if (kk < minmnupdt) { | |||||
| aikk = a[i__ + kk * a_dim1]; | |||||
| a[i__ + kk * a_dim1] = 1.; | |||||
| i__2 = *m - i__ + 1; | |||||
| i__3 = *n + *nrhs - kk; | |||||
| dlarf_("Left", &i__2, &i__3, &a[i__ + kk * a_dim1], &c__1, &tau[ | |||||
| kk], &a[i__ + (kk + 1) * a_dim1], lda, &work[1]); | |||||
| a[i__ + kk * a_dim1] = aikk; | |||||
| } | |||||
| if (kk < minmnfact) { | |||||
| /* Update the partial column 2-norms for the residual matrix, */ | |||||
| /* only if the residual matrix A(I+1:M,KK+1:N) exists, i.e. */ | |||||
| /* when KK < f2cmin(M-IOFFSET, N). */ | |||||
| i__2 = *n; | |||||
| for (j = kk + 1; j <= i__2; ++j) { | |||||
| if (vn1[j] != 0.) { | |||||
| /* NOTE: The following lines follow from the analysis in */ | |||||
| /* Lapack Working Note 176. */ | |||||
| /* Computing 2nd power */ | |||||
| d__2 = (d__1 = a[i__ + j * a_dim1], abs(d__1)) / vn1[j]; | |||||
| temp = 1. - d__2 * d__2; | |||||
| temp = f2cmax(temp,0.); | |||||
| /* Computing 2nd power */ | |||||
| d__1 = vn1[j] / vn2[j]; | |||||
| temp2 = temp * (d__1 * d__1); | |||||
| if (temp2 <= tol3z) { | |||||
| /* Compute the column 2-norm for the partial */ | |||||
| /* column A(I+1:M,J) by explicitly computing it, */ | |||||
| /* and store it in both partial 2-norm vector VN1 */ | |||||
| /* and exact column 2-norm vector VN2. */ | |||||
| i__3 = *m - i__; | |||||
| vn1[j] = dnrm2_(&i__3, &a[i__ + 1 + j * a_dim1], & | |||||
| c__1); | |||||
| vn2[j] = vn1[j]; | |||||
| } else { | |||||
| /* Update the column 2-norm for the partial */ | |||||
| /* column A(I+1:M,J) by removing one */ | |||||
| /* element A(I,J) and store it in partial */ | |||||
| /* 2-norm vector VN1. */ | |||||
| vn1[j] *= sqrt(temp); | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| /* End factorization loop */ | |||||
| } | |||||
| /* If we reached this point, all colunms have been factorized, */ | |||||
| /* i.e. no condition was triggered to exit the routine. */ | |||||
| /* Set the number of factorized columns. */ | |||||
| *k = *kmax; | |||||
| /* We reached the end of the loop, i.e. all KMAX columns were */ | |||||
| /* factorized, we need to set MAXC2NRMK and RELMAXC2NRMK before */ | |||||
| /* we return. */ | |||||
| if (*k < minmnfact) { | |||||
| i__1 = *n - *k; | |||||
| jmaxc2nrm = *k + idamax_(&i__1, &vn1[*k + 1], &c__1); | |||||
| *maxc2nrmk = vn1[jmaxc2nrm]; | |||||
| if (*k == 0) { | |||||
| *relmaxc2nrmk = 1.; | |||||
| } else { | |||||
| *relmaxc2nrmk = *maxc2nrmk / *maxc2nrm; | |||||
| } | |||||
| } else { | |||||
| *maxc2nrmk = 0.; | |||||
| *relmaxc2nrmk = 0.; | |||||
| } | |||||
| /* We reached the end of the loop, i.e. all KMAX columns were */ | |||||
| /* factorized, set TAUs corresponding to the columns that were */ | |||||
| /* not factorized to ZERO, i.e. TAU(K+1:MINMNFACT) set to ZERO. */ | |||||
| i__1 = minmnfact; | |||||
| for (j = *k + 1; j <= i__1; ++j) { | |||||
| tau[j] = 0.; | |||||
| } | |||||
| return 0; | |||||
| /* End of DLAQP2RK */ | |||||
| } /* dlaqp2rk_ */ | |||||
| @@ -0,0 +1,918 @@ | |||||
| #include <math.h> | |||||
| #include <stdlib.h> | |||||
| #include <string.h> | |||||
| #include <stdio.h> | |||||
| #include <complex.h> | |||||
| #ifdef complex | |||||
| #undef complex | |||||
| #endif | |||||
| #ifdef I | |||||
| #undef I | |||||
| #endif | |||||
| #if defined(_WIN64) | |||||
| typedef long long BLASLONG; | |||||
| typedef unsigned long long BLASULONG; | |||||
| #else | |||||
| typedef long BLASLONG; | |||||
| typedef unsigned long BLASULONG; | |||||
| #endif | |||||
| #ifdef LAPACK_ILP64 | |||||
| typedef BLASLONG blasint; | |||||
| #if defined(_WIN64) | |||||
| #define blasabs(x) llabs(x) | |||||
| #else | |||||
| #define blasabs(x) labs(x) | |||||
| #endif | |||||
| #else | |||||
| typedef int blasint; | |||||
| #define blasabs(x) abs(x) | |||||
| #endif | |||||
| typedef blasint integer; | |||||
| typedef unsigned int uinteger; | |||||
| typedef char *address; | |||||
| typedef short int shortint; | |||||
| typedef float real; | |||||
| typedef double doublereal; | |||||
| typedef struct { real r, i; } complex; | |||||
| typedef struct { doublereal r, i; } doublecomplex; | |||||
| #ifdef _MSC_VER | |||||
| static inline _Fcomplex Cf(complex *z) {_Fcomplex zz={z->r , z->i}; return zz;} | |||||
| static inline _Dcomplex Cd(doublecomplex *z) {_Dcomplex zz={z->r , z->i};return zz;} | |||||
| static inline _Fcomplex * _pCf(complex *z) {return (_Fcomplex*)z;} | |||||
| static inline _Dcomplex * _pCd(doublecomplex *z) {return (_Dcomplex*)z;} | |||||
| #else | |||||
| static inline _Complex float Cf(complex *z) {return z->r + z->i*_Complex_I;} | |||||
| static inline _Complex double Cd(doublecomplex *z) {return z->r + z->i*_Complex_I;} | |||||
| static inline _Complex float * _pCf(complex *z) {return (_Complex float*)z;} | |||||
| static inline _Complex double * _pCd(doublecomplex *z) {return (_Complex double*)z;} | |||||
| #endif | |||||
| #define pCf(z) (*_pCf(z)) | |||||
| #define pCd(z) (*_pCd(z)) | |||||
| typedef int logical; | |||||
| typedef short int shortlogical; | |||||
| typedef char logical1; | |||||
| typedef char integer1; | |||||
| #define TRUE_ (1) | |||||
| #define FALSE_ (0) | |||||
| /* Extern is for use with -E */ | |||||
| #ifndef Extern | |||||
| #define Extern extern | |||||
| #endif | |||||
| /* I/O stuff */ | |||||
| typedef int flag; | |||||
| typedef int ftnlen; | |||||
| typedef int ftnint; | |||||
| /*external read, write*/ | |||||
| typedef struct | |||||
| { flag cierr; | |||||
| ftnint ciunit; | |||||
| flag ciend; | |||||
| char *cifmt; | |||||
| ftnint cirec; | |||||
| } cilist; | |||||
| /*internal read, write*/ | |||||
| typedef struct | |||||
| { flag icierr; | |||||
| char *iciunit; | |||||
| flag iciend; | |||||
| char *icifmt; | |||||
| ftnint icirlen; | |||||
| ftnint icirnum; | |||||
| } icilist; | |||||
| /*open*/ | |||||
| typedef struct | |||||
| { flag oerr; | |||||
| ftnint ounit; | |||||
| char *ofnm; | |||||
| ftnlen ofnmlen; | |||||
| char *osta; | |||||
| char *oacc; | |||||
| char *ofm; | |||||
| ftnint orl; | |||||
| char *oblnk; | |||||
| } olist; | |||||
| /*close*/ | |||||
| typedef struct | |||||
| { flag cerr; | |||||
| ftnint cunit; | |||||
| char *csta; | |||||
| } cllist; | |||||
| /*rewind, backspace, endfile*/ | |||||
| typedef struct | |||||
| { flag aerr; | |||||
| ftnint aunit; | |||||
| } alist; | |||||
| /* inquire */ | |||||
| typedef struct | |||||
| { flag inerr; | |||||
| ftnint inunit; | |||||
| char *infile; | |||||
| ftnlen infilen; | |||||
| ftnint *inex; /*parameters in standard's order*/ | |||||
| ftnint *inopen; | |||||
| ftnint *innum; | |||||
| ftnint *innamed; | |||||
| char *inname; | |||||
| ftnlen innamlen; | |||||
| char *inacc; | |||||
| ftnlen inacclen; | |||||
| char *inseq; | |||||
| ftnlen inseqlen; | |||||
| char *indir; | |||||
| ftnlen indirlen; | |||||
| char *infmt; | |||||
| ftnlen infmtlen; | |||||
| char *inform; | |||||
| ftnint informlen; | |||||
| char *inunf; | |||||
| ftnlen inunflen; | |||||
| ftnint *inrecl; | |||||
| ftnint *innrec; | |||||
| char *inblank; | |||||
| ftnlen inblanklen; | |||||
| } inlist; | |||||
| #define VOID void | |||||
| union Multitype { /* for multiple entry points */ | |||||
| integer1 g; | |||||
| shortint h; | |||||
| integer i; | |||||
| /* longint j; */ | |||||
| real r; | |||||
| doublereal d; | |||||
| complex c; | |||||
| doublecomplex z; | |||||
| }; | |||||
| typedef union Multitype Multitype; | |||||
| struct Vardesc { /* for Namelist */ | |||||
| char *name; | |||||
| char *addr; | |||||
| ftnlen *dims; | |||||
| int type; | |||||
| }; | |||||
| typedef struct Vardesc Vardesc; | |||||
| struct Namelist { | |||||
| char *name; | |||||
| Vardesc **vars; | |||||
| int nvars; | |||||
| }; | |||||
| typedef struct Namelist Namelist; | |||||
| #define abs(x) ((x) >= 0 ? (x) : -(x)) | |||||
| #define dabs(x) (fabs(x)) | |||||
| #define f2cmin(a,b) ((a) <= (b) ? (a) : (b)) | |||||
| #define f2cmax(a,b) ((a) >= (b) ? (a) : (b)) | |||||
| #define dmin(a,b) (f2cmin(a,b)) | |||||
| #define dmax(a,b) (f2cmax(a,b)) | |||||
| #define bit_test(a,b) ((a) >> (b) & 1) | |||||
| #define bit_clear(a,b) ((a) & ~((uinteger)1 << (b))) | |||||
| #define bit_set(a,b) ((a) | ((uinteger)1 << (b))) | |||||
| #define abort_() { sig_die("Fortran abort routine called", 1); } | |||||
| #define c_abs(z) (cabsf(Cf(z))) | |||||
| #define c_cos(R,Z) { pCf(R)=ccos(Cf(Z)); } | |||||
| #ifdef _MSC_VER | |||||
| #define c_div(c, a, b) {Cf(c)._Val[0] = (Cf(a)._Val[0]/Cf(b)._Val[0]); Cf(c)._Val[1]=(Cf(a)._Val[1]/Cf(b)._Val[1]);} | |||||
| #define z_div(c, a, b) {Cd(c)._Val[0] = (Cd(a)._Val[0]/Cd(b)._Val[0]); Cd(c)._Val[1]=(Cd(a)._Val[1]/Cd(b)._Val[1]);} | |||||
| #else | |||||
| #define c_div(c, a, b) {pCf(c) = Cf(a)/Cf(b);} | |||||
| #define z_div(c, a, b) {pCd(c) = Cd(a)/Cd(b);} | |||||
| #endif | |||||
| #define c_exp(R, Z) {pCf(R) = cexpf(Cf(Z));} | |||||
| #define c_log(R, Z) {pCf(R) = clogf(Cf(Z));} | |||||
| #define c_sin(R, Z) {pCf(R) = csinf(Cf(Z));} | |||||
| //#define c_sqrt(R, Z) {*(R) = csqrtf(Cf(Z));} | |||||
| #define c_sqrt(R, Z) {pCf(R) = csqrtf(Cf(Z));} | |||||
| #define d_abs(x) (fabs(*(x))) | |||||
| #define d_acos(x) (acos(*(x))) | |||||
| #define d_asin(x) (asin(*(x))) | |||||
| #define d_atan(x) (atan(*(x))) | |||||
| #define d_atn2(x, y) (atan2(*(x),*(y))) | |||||
| #define d_cnjg(R, Z) { pCd(R) = conj(Cd(Z)); } | |||||
| #define r_cnjg(R, Z) { pCf(R) = conjf(Cf(Z)); } | |||||
| #define d_cos(x) (cos(*(x))) | |||||
| #define d_cosh(x) (cosh(*(x))) | |||||
| #define d_dim(__a, __b) ( *(__a) > *(__b) ? *(__a) - *(__b) : 0.0 ) | |||||
| #define d_exp(x) (exp(*(x))) | |||||
| #define d_imag(z) (cimag(Cd(z))) | |||||
| #define r_imag(z) (cimagf(Cf(z))) | |||||
| #define d_int(__x) (*(__x)>0 ? floor(*(__x)) : -floor(- *(__x))) | |||||
| #define r_int(__x) (*(__x)>0 ? floor(*(__x)) : -floor(- *(__x))) | |||||
| #define d_lg10(x) ( 0.43429448190325182765 * log(*(x)) ) | |||||
| #define r_lg10(x) ( 0.43429448190325182765 * log(*(x)) ) | |||||
| #define d_log(x) (log(*(x))) | |||||
| #define d_mod(x, y) (fmod(*(x), *(y))) | |||||
| #define u_nint(__x) ((__x)>=0 ? floor((__x) + .5) : -floor(.5 - (__x))) | |||||
| #define d_nint(x) u_nint(*(x)) | |||||
| #define u_sign(__a,__b) ((__b) >= 0 ? ((__a) >= 0 ? (__a) : -(__a)) : -((__a) >= 0 ? (__a) : -(__a))) | |||||
| #define d_sign(a,b) u_sign(*(a),*(b)) | |||||
| #define r_sign(a,b) u_sign(*(a),*(b)) | |||||
| #define d_sin(x) (sin(*(x))) | |||||
| #define d_sinh(x) (sinh(*(x))) | |||||
| #define d_sqrt(x) (sqrt(*(x))) | |||||
| #define d_tan(x) (tan(*(x))) | |||||
| #define d_tanh(x) (tanh(*(x))) | |||||
| #define i_abs(x) abs(*(x)) | |||||
| #define i_dnnt(x) ((integer)u_nint(*(x))) | |||||
| #define i_len(s, n) (n) | |||||
| #define i_nint(x) ((integer)u_nint(*(x))) | |||||
| #define i_sign(a,b) ((integer)u_sign((integer)*(a),(integer)*(b))) | |||||
| #define pow_dd(ap, bp) ( pow(*(ap), *(bp))) | |||||
| #define pow_si(B,E) spow_ui(*(B),*(E)) | |||||
| #define pow_ri(B,E) spow_ui(*(B),*(E)) | |||||
| #define pow_di(B,E) dpow_ui(*(B),*(E)) | |||||
| #define pow_zi(p, a, b) {pCd(p) = zpow_ui(Cd(a), *(b));} | |||||
| #define pow_ci(p, a, b) {pCf(p) = cpow_ui(Cf(a), *(b));} | |||||
| #define pow_zz(R,A,B) {pCd(R) = cpow(Cd(A),*(B));} | |||||
| #define s_cat(lpp, rpp, rnp, np, llp) { ftnlen i, nc, ll; char *f__rp, *lp; ll = (llp); lp = (lpp); for(i=0; i < (int)*(np); ++i) { nc = ll; if((rnp)[i] < nc) nc = (rnp)[i]; ll -= nc; f__rp = (rpp)[i]; while(--nc >= 0) *lp++ = *(f__rp)++; } while(--ll >= 0) *lp++ = ' '; } | |||||
| #define s_cmp(a,b,c,d) ((integer)strncmp((a),(b),f2cmin((c),(d)))) | |||||
| #define s_copy(A,B,C,D) { int __i,__m; for (__i=0, __m=f2cmin((C),(D)); __i<__m && (B)[__i] != 0; ++__i) (A)[__i] = (B)[__i]; } | |||||
| #define sig_die(s, kill) { exit(1); } | |||||
| #define s_stop(s, n) {exit(0);} | |||||
| static char junk[] = "\n@(#)LIBF77 VERSION 19990503\n"; | |||||
| #define z_abs(z) (cabs(Cd(z))) | |||||
| #define z_exp(R, Z) {pCd(R) = cexp(Cd(Z));} | |||||
| #define z_sqrt(R, Z) {pCd(R) = csqrt(Cd(Z));} | |||||
| #define myexit_() break; | |||||
| #define mycycle_() continue; | |||||
| #define myceiling_(w) {ceil(w)} | |||||
| #define myhuge_(w) {HUGE_VAL} | |||||
| //#define mymaxloc_(w,s,e,n) {if (sizeof(*(w)) == sizeof(double)) dmaxloc_((w),*(s),*(e),n); else dmaxloc_((w),*(s),*(e),n);} | |||||
| #define mymaxloc_(w,s,e,n) dmaxloc_(w,*(s),*(e),n) | |||||
| /* procedure parameter types for -A and -C++ */ | |||||
| #define F2C_proc_par_types 1 | |||||
| #ifdef __cplusplus | |||||
| typedef logical (*L_fp)(...); | |||||
| #else | |||||
| typedef logical (*L_fp)(); | |||||
| #endif | |||||
| static float spow_ui(float x, integer n) { | |||||
| float pow=1.0; unsigned long int u; | |||||
| if(n != 0) { | |||||
| if(n < 0) n = -n, x = 1/x; | |||||
| for(u = n; ; ) { | |||||
| if(u & 01) pow *= x; | |||||
| if(u >>= 1) x *= x; | |||||
| else break; | |||||
| } | |||||
| } | |||||
| return pow; | |||||
| } | |||||
| static double dpow_ui(double x, integer n) { | |||||
| double pow=1.0; unsigned long int u; | |||||
| if(n != 0) { | |||||
| if(n < 0) n = -n, x = 1/x; | |||||
| for(u = n; ; ) { | |||||
| if(u & 01) pow *= x; | |||||
| if(u >>= 1) x *= x; | |||||
| else break; | |||||
| } | |||||
| } | |||||
| return pow; | |||||
| } | |||||
| #ifdef _MSC_VER | |||||
| static _Fcomplex cpow_ui(complex x, integer n) { | |||||
| complex pow={1.0,0.0}; unsigned long int u; | |||||
| if(n != 0) { | |||||
| if(n < 0) n = -n, x.r = 1/x.r, x.i=1/x.i; | |||||
| for(u = n; ; ) { | |||||
| if(u & 01) pow.r *= x.r, pow.i *= x.i; | |||||
| if(u >>= 1) x.r *= x.r, x.i *= x.i; | |||||
| else break; | |||||
| } | |||||
| } | |||||
| _Fcomplex p={pow.r, pow.i}; | |||||
| return p; | |||||
| } | |||||
| #else | |||||
| static _Complex float cpow_ui(_Complex float x, integer n) { | |||||
| _Complex float pow=1.0; unsigned long int u; | |||||
| if(n != 0) { | |||||
| if(n < 0) n = -n, x = 1/x; | |||||
| for(u = n; ; ) { | |||||
| if(u & 01) pow *= x; | |||||
| if(u >>= 1) x *= x; | |||||
| else break; | |||||
| } | |||||
| } | |||||
| return pow; | |||||
| } | |||||
| #endif | |||||
| #ifdef _MSC_VER | |||||
| static _Dcomplex zpow_ui(_Dcomplex x, integer n) { | |||||
| _Dcomplex pow={1.0,0.0}; unsigned long int u; | |||||
| if(n != 0) { | |||||
| if(n < 0) n = -n, x._Val[0] = 1/x._Val[0], x._Val[1] =1/x._Val[1]; | |||||
| for(u = n; ; ) { | |||||
| if(u & 01) pow._Val[0] *= x._Val[0], pow._Val[1] *= x._Val[1]; | |||||
| if(u >>= 1) x._Val[0] *= x._Val[0], x._Val[1] *= x._Val[1]; | |||||
| else break; | |||||
| } | |||||
| } | |||||
| _Dcomplex p = {pow._Val[0], pow._Val[1]}; | |||||
| return p; | |||||
| } | |||||
| #else | |||||
| static _Complex double zpow_ui(_Complex double x, integer n) { | |||||
| _Complex double pow=1.0; unsigned long int u; | |||||
| if(n != 0) { | |||||
| if(n < 0) n = -n, x = 1/x; | |||||
| for(u = n; ; ) { | |||||
| if(u & 01) pow *= x; | |||||
| if(u >>= 1) x *= x; | |||||
| else break; | |||||
| } | |||||
| } | |||||
| return pow; | |||||
| } | |||||
| #endif | |||||
| static integer pow_ii(integer x, integer n) { | |||||
| integer pow; unsigned long int u; | |||||
| if (n <= 0) { | |||||
| if (n == 0 || x == 1) pow = 1; | |||||
| else if (x != -1) pow = x == 0 ? 1/x : 0; | |||||
| else n = -n; | |||||
| } | |||||
| if ((n > 0) || !(n == 0 || x == 1 || x != -1)) { | |||||
| u = n; | |||||
| for(pow = 1; ; ) { | |||||
| if(u & 01) pow *= x; | |||||
| if(u >>= 1) x *= x; | |||||
| else break; | |||||
| } | |||||
| } | |||||
| return pow; | |||||
| } | |||||
| static integer dmaxloc_(double *w, integer s, integer e, integer *n) | |||||
| { | |||||
| double m; integer i, mi; | |||||
| for(m=w[s-1], mi=s, i=s+1; i<=e; i++) | |||||
| if (w[i-1]>m) mi=i ,m=w[i-1]; | |||||
| return mi-s+1; | |||||
| } | |||||
| static integer smaxloc_(float *w, integer s, integer e, integer *n) | |||||
| { | |||||
| float m; integer i, mi; | |||||
| for(m=w[s-1], mi=s, i=s+1; i<=e; i++) | |||||
| if (w[i-1]>m) mi=i ,m=w[i-1]; | |||||
| return mi-s+1; | |||||
| } | |||||
| static inline void cdotc_(complex *z, integer *n_, complex *x, integer *incx_, complex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| #ifdef _MSC_VER | |||||
| _Fcomplex zdotc = {0.0, 0.0}; | |||||
| if (incx == 1 && incy == 1) { | |||||
| for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */ | |||||
| zdotc._Val[0] += conjf(Cf(&x[i]))._Val[0] * Cf(&y[i])._Val[0]; | |||||
| zdotc._Val[1] += conjf(Cf(&x[i]))._Val[1] * Cf(&y[i])._Val[1]; | |||||
| } | |||||
| } else { | |||||
| for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */ | |||||
| zdotc._Val[0] += conjf(Cf(&x[i*incx]))._Val[0] * Cf(&y[i*incy])._Val[0]; | |||||
| zdotc._Val[1] += conjf(Cf(&x[i*incx]))._Val[1] * Cf(&y[i*incy])._Val[1]; | |||||
| } | |||||
| } | |||||
| pCf(z) = zdotc; | |||||
| } | |||||
| #else | |||||
| _Complex float zdotc = 0.0; | |||||
| if (incx == 1 && incy == 1) { | |||||
| for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */ | |||||
| zdotc += conjf(Cf(&x[i])) * Cf(&y[i]); | |||||
| } | |||||
| } else { | |||||
| for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */ | |||||
| zdotc += conjf(Cf(&x[i*incx])) * Cf(&y[i*incy]); | |||||
| } | |||||
| } | |||||
| pCf(z) = zdotc; | |||||
| } | |||||
| #endif | |||||
| static inline void zdotc_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| #ifdef _MSC_VER | |||||
| _Dcomplex zdotc = {0.0, 0.0}; | |||||
| if (incx == 1 && incy == 1) { | |||||
| for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */ | |||||
| zdotc._Val[0] += conj(Cd(&x[i]))._Val[0] * Cd(&y[i])._Val[0]; | |||||
| zdotc._Val[1] += conj(Cd(&x[i]))._Val[1] * Cd(&y[i])._Val[1]; | |||||
| } | |||||
| } else { | |||||
| for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */ | |||||
| zdotc._Val[0] += conj(Cd(&x[i*incx]))._Val[0] * Cd(&y[i*incy])._Val[0]; | |||||
| zdotc._Val[1] += conj(Cd(&x[i*incx]))._Val[1] * Cd(&y[i*incy])._Val[1]; | |||||
| } | |||||
| } | |||||
| pCd(z) = zdotc; | |||||
| } | |||||
| #else | |||||
| _Complex double zdotc = 0.0; | |||||
| if (incx == 1 && incy == 1) { | |||||
| for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */ | |||||
| zdotc += conj(Cd(&x[i])) * Cd(&y[i]); | |||||
| } | |||||
| } else { | |||||
| for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */ | |||||
| zdotc += conj(Cd(&x[i*incx])) * Cd(&y[i*incy]); | |||||
| } | |||||
| } | |||||
| pCd(z) = zdotc; | |||||
| } | |||||
| #endif | |||||
| static inline void cdotu_(complex *z, integer *n_, complex *x, integer *incx_, complex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| #ifdef _MSC_VER | |||||
| _Fcomplex zdotc = {0.0, 0.0}; | |||||
| if (incx == 1 && incy == 1) { | |||||
| for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */ | |||||
| zdotc._Val[0] += Cf(&x[i])._Val[0] * Cf(&y[i])._Val[0]; | |||||
| zdotc._Val[1] += Cf(&x[i])._Val[1] * Cf(&y[i])._Val[1]; | |||||
| } | |||||
| } else { | |||||
| for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */ | |||||
| zdotc._Val[0] += Cf(&x[i*incx])._Val[0] * Cf(&y[i*incy])._Val[0]; | |||||
| zdotc._Val[1] += Cf(&x[i*incx])._Val[1] * Cf(&y[i*incy])._Val[1]; | |||||
| } | |||||
| } | |||||
| pCf(z) = zdotc; | |||||
| } | |||||
| #else | |||||
| _Complex float zdotc = 0.0; | |||||
| if (incx == 1 && incy == 1) { | |||||
| for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */ | |||||
| zdotc += Cf(&x[i]) * Cf(&y[i]); | |||||
| } | |||||
| } else { | |||||
| for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */ | |||||
| zdotc += Cf(&x[i*incx]) * Cf(&y[i*incy]); | |||||
| } | |||||
| } | |||||
| pCf(z) = zdotc; | |||||
| } | |||||
| #endif | |||||
| static inline void zdotu_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| #ifdef _MSC_VER | |||||
| _Dcomplex zdotc = {0.0, 0.0}; | |||||
| if (incx == 1 && incy == 1) { | |||||
| for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */ | |||||
| zdotc._Val[0] += Cd(&x[i])._Val[0] * Cd(&y[i])._Val[0]; | |||||
| zdotc._Val[1] += Cd(&x[i])._Val[1] * Cd(&y[i])._Val[1]; | |||||
| } | |||||
| } else { | |||||
| for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */ | |||||
| zdotc._Val[0] += Cd(&x[i*incx])._Val[0] * Cd(&y[i*incy])._Val[0]; | |||||
| zdotc._Val[1] += Cd(&x[i*incx])._Val[1] * Cd(&y[i*incy])._Val[1]; | |||||
| } | |||||
| } | |||||
| pCd(z) = zdotc; | |||||
| } | |||||
| #else | |||||
| _Complex double zdotc = 0.0; | |||||
| if (incx == 1 && incy == 1) { | |||||
| for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */ | |||||
| zdotc += Cd(&x[i]) * Cd(&y[i]); | |||||
| } | |||||
| } else { | |||||
| for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */ | |||||
| zdotc += Cd(&x[i*incx]) * Cd(&y[i*incy]); | |||||
| } | |||||
| } | |||||
| pCd(z) = zdotc; | |||||
| } | |||||
| #endif | |||||
| /* -- translated by f2c (version 20000121). | |||||
| You must link the resulting object file with the libraries: | |||||
| -lf2c -lm (in that order) | |||||
| */ | |||||
| /* -- translated by f2c (version 20000121). | |||||
| You must link the resulting object file with the libraries: | |||||
| -lf2c -lm (in that order) | |||||
| */ | |||||
| /* Table of constant values */ | |||||
| static integer c__1 = 1; | |||||
| /* Subroutine */ int slaqp2rk_(integer *m, integer *n, integer *nrhs, integer | |||||
| *ioffset, integer *kmax, real *abstol, real *reltol, integer *kp1, | |||||
| real *maxc2nrm, real *a, integer *lda, integer *k, real *maxc2nrmk, | |||||
| real *relmaxc2nrmk, integer *jpiv, real *tau, real *vn1, real *vn2, | |||||
| real *work, integer *info) | |||||
| { | |||||
| /* System generated locals */ | |||||
| integer a_dim1, a_offset, i__1, i__2, i__3; | |||||
| real r__1, r__2; | |||||
| /* Local variables */ | |||||
| real aikk, temp, temp2; | |||||
| extern real snrm2_(integer *, real *, integer *); | |||||
| integer i__, j; | |||||
| real tol3z; | |||||
| integer jmaxc2nrm; | |||||
| extern /* Subroutine */ int slarf_(char *, integer *, integer *, real *, | |||||
| integer *, real *, real *, integer *, real *); | |||||
| integer itemp, minmnfact; | |||||
| extern /* Subroutine */ int sswap_(integer *, real *, integer *, real *, | |||||
| integer *); | |||||
| real myhugeval; | |||||
| integer minmnupdt, kk, kp; | |||||
| extern real slamch_(char *); | |||||
| extern /* Subroutine */ int slarfg_(integer *, real *, real *, integer *, | |||||
| real *); | |||||
| extern integer isamax_(integer *, real *, integer *); | |||||
| extern logical sisnan_(real *); | |||||
| /* -- LAPACK auxiliary routine -- */ | |||||
| /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ | |||||
| /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ | |||||
| /* ===================================================================== */ | |||||
| /* Initialize INFO */ | |||||
| /* Parameter adjustments */ | |||||
| a_dim1 = *lda; | |||||
| a_offset = 1 + a_dim1 * 1; | |||||
| a -= a_offset; | |||||
| --jpiv; | |||||
| --tau; | |||||
| --vn1; | |||||
| --vn2; | |||||
| --work; | |||||
| /* Function Body */ | |||||
| *info = 0; | |||||
| /* MINMNFACT in the smallest dimension of the submatrix */ | |||||
| /* A(IOFFSET+1:M,1:N) to be factorized. */ | |||||
| /* MINMNUPDT is the smallest dimension */ | |||||
| /* of the subarray A(IOFFSET+1:M,1:N+NRHS) to be udated, which */ | |||||
| /* contains the submatrices A(IOFFSET+1:M,1:N) and */ | |||||
| /* B(IOFFSET+1:M,1:NRHS) as column blocks. */ | |||||
| /* Computing MIN */ | |||||
| i__1 = *m - *ioffset; | |||||
| minmnfact = f2cmin(i__1,*n); | |||||
| /* Computing MIN */ | |||||
| i__1 = *m - *ioffset, i__2 = *n + *nrhs; | |||||
| minmnupdt = f2cmin(i__1,i__2); | |||||
| *kmax = f2cmin(*kmax,minmnfact); | |||||
| tol3z = sqrt(slamch_("Epsilon")); | |||||
| myhugeval = slamch_("Overflow"); | |||||
| /* Compute the factorization, KK is the lomn loop index. */ | |||||
| i__1 = *kmax; | |||||
| for (kk = 1; kk <= i__1; ++kk) { | |||||
| i__ = *ioffset + kk; | |||||
| if (i__ == 1) { | |||||
| /* ============================================================ */ | |||||
| /* We are at the first column of the original whole matrix A, */ | |||||
| /* therefore we use the computed KP1 and MAXC2NRM from the */ | |||||
| /* main routine. */ | |||||
| kp = *kp1; | |||||
| /* ============================================================ */ | |||||
| } else { | |||||
| /* ============================================================ */ | |||||
| /* Determine the pivot column in KK-th step, i.e. the index */ | |||||
| /* of the column with the maximum 2-norm in the */ | |||||
| /* submatrix A(I:M,K:N). */ | |||||
| i__2 = *n - kk + 1; | |||||
| kp = kk - 1 + isamax_(&i__2, &vn1[kk], &c__1); | |||||
| /* Determine the maximum column 2-norm and the relative maximum */ | |||||
| /* column 2-norm of the submatrix A(I:M,KK:N) in step KK. */ | |||||
| /* RELMAXC2NRMK will be computed later, after somecondition */ | |||||
| /* checks on MAXC2NRMK. */ | |||||
| *maxc2nrmk = vn1[kp]; | |||||
| /* ============================================================ */ | |||||
| /* Check if the submatrix A(I:M,KK:N) contains NaN, and set */ | |||||
| /* INFO parameter to the column number, where the first NaN */ | |||||
| /* is found and return from the routine. */ | |||||
| /* We need to check the condition only if the */ | |||||
| /* column index (same as row index) of the original whole */ | |||||
| /* matrix is larger than 1, since the condition for whole */ | |||||
| /* original matrix is checked in the main routine. */ | |||||
| if (sisnan_(maxc2nrmk)) { | |||||
| /* Set K, the number of factorized columns. */ | |||||
| /* that are not zero. */ | |||||
| *k = kk - 1; | |||||
| *info = *k + kp; | |||||
| /* Set RELMAXC2NRMK to NaN. */ | |||||
| *relmaxc2nrmk = *maxc2nrmk; | |||||
| /* Array TAU(K+1:MINMNFACT) is not set and contains */ | |||||
| /* undefined elements. */ | |||||
| return 0; | |||||
| } | |||||
| /* ============================================================ */ | |||||
| /* Quick return, if the submatrix A(I:M,KK:N) is */ | |||||
| /* a zero matrix. */ | |||||
| /* We need to check the condition only if the */ | |||||
| /* column index (same as row index) of the original whole */ | |||||
| /* matrix is larger than 1, since the condition for whole */ | |||||
| /* original matrix is checked in the main routine. */ | |||||
| if (*maxc2nrmk == 0.f) { | |||||
| /* Set K, the number of factorized columns. */ | |||||
| /* that are not zero. */ | |||||
| *k = kk - 1; | |||||
| *relmaxc2nrmk = 0.f; | |||||
| /* Set TAUs corresponding to the columns that were not */ | |||||
| /* factorized to ZERO, i.e. set TAU(KK:MINMNFACT) to ZERO. */ | |||||
| i__2 = minmnfact; | |||||
| for (j = kk; j <= i__2; ++j) { | |||||
| tau[j] = 0.f; | |||||
| } | |||||
| /* Return from the routine. */ | |||||
| return 0; | |||||
| } | |||||
| /* ============================================================ */ | |||||
| /* Check if the submatrix A(I:M,KK:N) contains Inf, */ | |||||
| /* set INFO parameter to the column number, where */ | |||||
| /* the first Inf is found plus N, and continue */ | |||||
| /* the computation. */ | |||||
| /* We need to check the condition only if the */ | |||||
| /* column index (same as row index) of the original whole */ | |||||
| /* matrix is larger than 1, since the condition for whole */ | |||||
| /* original matrix is checked in the main routine. */ | |||||
| if (*info == 0 && *maxc2nrmk > myhugeval) { | |||||
| *info = *n + kk - 1 + kp; | |||||
| } | |||||
| /* ============================================================ */ | |||||
| /* Test for the second and third stopping criteria. */ | |||||
| /* NOTE: There is no need to test for ABSTOL >= ZERO, since */ | |||||
| /* MAXC2NRMK is non-negative. Similarly, there is no need */ | |||||
| /* to test for RELTOL >= ZERO, since RELMAXC2NRMK is */ | |||||
| /* non-negative. */ | |||||
| /* We need to check the condition only if the */ | |||||
| /* column index (same as row index) of the original whole */ | |||||
| /* matrix is larger than 1, since the condition for whole */ | |||||
| /* original matrix is checked in the main routine. */ | |||||
| *relmaxc2nrmk = *maxc2nrmk / *maxc2nrm; | |||||
| if (*maxc2nrmk <= *abstol || *relmaxc2nrmk <= *reltol) { | |||||
| /* Set K, the number of factorized columns. */ | |||||
| *k = kk - 1; | |||||
| /* Set TAUs corresponding to the columns that were not */ | |||||
| /* factorized to ZERO, i.e. set TAU(KK:MINMNFACT) to ZERO. */ | |||||
| i__2 = minmnfact; | |||||
| for (j = kk; j <= i__2; ++j) { | |||||
| tau[j] = 0.f; | |||||
| } | |||||
| /* Return from the routine. */ | |||||
| return 0; | |||||
| } | |||||
| /* ============================================================ */ | |||||
| /* End ELSE of IF(I.EQ.1) */ | |||||
| } | |||||
| /* =============================================================== */ | |||||
| /* If the pivot column is not the first column of the */ | |||||
| /* subblock A(1:M,KK:N): */ | |||||
| /* 1) swap the KK-th column and the KP-th pivot column */ | |||||
| /* in A(1:M,1:N); */ | |||||
| /* 2) copy the KK-th element into the KP-th element of the partial */ | |||||
| /* and exact 2-norm vectors VN1 and VN2. ( Swap is not needed */ | |||||
| /* for VN1 and VN2 since we use the element with the index */ | |||||
| /* larger than KK in the next loop step.) */ | |||||
| /* 3) Save the pivot interchange with the indices relative to the */ | |||||
| /* the original matrix A, not the block A(1:M,1:N). */ | |||||
| if (kp != kk) { | |||||
| sswap_(m, &a[kp * a_dim1 + 1], &c__1, &a[kk * a_dim1 + 1], &c__1); | |||||
| vn1[kp] = vn1[kk]; | |||||
| vn2[kp] = vn2[kk]; | |||||
| itemp = jpiv[kp]; | |||||
| jpiv[kp] = jpiv[kk]; | |||||
| jpiv[kk] = itemp; | |||||
| } | |||||
| /* Generate elementary reflector H(KK) using the column A(I:M,KK), */ | |||||
| /* if the column has more than one element, otherwise */ | |||||
| /* the elementary reflector would be an identity matrix, */ | |||||
| /* and TAU(KK) = ZERO. */ | |||||
| if (i__ < *m) { | |||||
| i__2 = *m - i__ + 1; | |||||
| slarfg_(&i__2, &a[i__ + kk * a_dim1], &a[i__ + 1 + kk * a_dim1], & | |||||
| c__1, &tau[kk]); | |||||
| } else { | |||||
| tau[kk] = 0.f; | |||||
| } | |||||
| /* Check if TAU(KK) contains NaN, set INFO parameter */ | |||||
| /* to the column number where NaN is found and return from */ | |||||
| /* the routine. */ | |||||
| /* NOTE: There is no need to check TAU(KK) for Inf, */ | |||||
| /* since SLARFG cannot produce TAU(KK) or Householder vector */ | |||||
| /* below the diagonal containing Inf. Only BETA on the diagonal, */ | |||||
| /* returned by SLARFG can contain Inf, which requires */ | |||||
| /* TAU(KK) to contain NaN. Therefore, this case of generating Inf */ | |||||
| /* by SLARFG is covered by checking TAU(KK) for NaN. */ | |||||
| if (sisnan_(&tau[kk])) { | |||||
| *k = kk - 1; | |||||
| *info = kk; | |||||
| /* Set MAXC2NRMK and RELMAXC2NRMK to NaN. */ | |||||
| *maxc2nrmk = tau[kk]; | |||||
| *relmaxc2nrmk = tau[kk]; | |||||
| /* Array TAU(KK:MINMNFACT) is not set and contains */ | |||||
| /* undefined elements, except the first element TAU(KK) = NaN. */ | |||||
| return 0; | |||||
| } | |||||
| /* Apply H(KK)**T to A(I:M,KK+1:N+NRHS) from the left. */ | |||||
| /* ( If M >= N, then at KK = N there is no residual matrix, */ | |||||
| /* i.e. no columns of A to update, only columns of B. */ | |||||
| /* If M < N, then at KK = M-IOFFSET, I = M and we have a */ | |||||
| /* one-row residual matrix in A and the elementary */ | |||||
| /* reflector is a unit matrix, TAU(KK) = ZERO, i.e. no update */ | |||||
| /* is needed for the residual matrix in A and the */ | |||||
| /* right-hand-side-matrix in B. */ | |||||
| /* Therefore, we update only if */ | |||||
| /* KK < MINMNUPDT = f2cmin(M-IOFFSET, N+NRHS) */ | |||||
| /* condition is satisfied, not only KK < N+NRHS ) */ | |||||
| if (kk < minmnupdt) { | |||||
| aikk = a[i__ + kk * a_dim1]; | |||||
| a[i__ + kk * a_dim1] = 1.f; | |||||
| i__2 = *m - i__ + 1; | |||||
| i__3 = *n + *nrhs - kk; | |||||
| slarf_("Left", &i__2, &i__3, &a[i__ + kk * a_dim1], &c__1, &tau[ | |||||
| kk], &a[i__ + (kk + 1) * a_dim1], lda, &work[1]); | |||||
| a[i__ + kk * a_dim1] = aikk; | |||||
| } | |||||
| if (kk < minmnfact) { | |||||
| /* Update the partial column 2-norms for the residual matrix, */ | |||||
| /* only if the residual matrix A(I+1:M,KK+1:N) exists, i.e. */ | |||||
| /* when KK < f2cmin(M-IOFFSET, N). */ | |||||
| i__2 = *n; | |||||
| for (j = kk + 1; j <= i__2; ++j) { | |||||
| if (vn1[j] != 0.f) { | |||||
| /* NOTE: The following lines follow from the analysis in */ | |||||
| /* Lapack Working Note 176. */ | |||||
| /* Computing 2nd power */ | |||||
| r__2 = (r__1 = a[i__ + j * a_dim1], abs(r__1)) / vn1[j]; | |||||
| temp = 1.f - r__2 * r__2; | |||||
| temp = f2cmax(temp,0.f); | |||||
| /* Computing 2nd power */ | |||||
| r__1 = vn1[j] / vn2[j]; | |||||
| temp2 = temp * (r__1 * r__1); | |||||
| if (temp2 <= tol3z) { | |||||
| /* Compute the column 2-norm for the partial */ | |||||
| /* column A(I+1:M,J) by explicitly computing it, */ | |||||
| /* and store it in both partial 2-norm vector VN1 */ | |||||
| /* and exact column 2-norm vector VN2. */ | |||||
| i__3 = *m - i__; | |||||
| vn1[j] = snrm2_(&i__3, &a[i__ + 1 + j * a_dim1], & | |||||
| c__1); | |||||
| vn2[j] = vn1[j]; | |||||
| } else { | |||||
| /* Update the column 2-norm for the partial */ | |||||
| /* column A(I+1:M,J) by removing one */ | |||||
| /* element A(I,J) and store it in partial */ | |||||
| /* 2-norm vector VN1. */ | |||||
| vn1[j] *= sqrt(temp); | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| /* End factorization loop */ | |||||
| } | |||||
| /* If we reached this point, all colunms have been factorized, */ | |||||
| /* i.e. no condition was triggered to exit the routine. */ | |||||
| /* Set the number of factorized columns. */ | |||||
| *k = *kmax; | |||||
| /* We reached the end of the loop, i.e. all KMAX columns were */ | |||||
| /* factorized, we need to set MAXC2NRMK and RELMAXC2NRMK before */ | |||||
| /* we return. */ | |||||
| if (*k < minmnfact) { | |||||
| i__1 = *n - *k; | |||||
| jmaxc2nrm = *k + isamax_(&i__1, &vn1[*k + 1], &c__1); | |||||
| *maxc2nrmk = vn1[jmaxc2nrm]; | |||||
| if (*k == 0) { | |||||
| *relmaxc2nrmk = 1.f; | |||||
| } else { | |||||
| *relmaxc2nrmk = *maxc2nrmk / *maxc2nrm; | |||||
| } | |||||
| } else { | |||||
| *maxc2nrmk = 0.f; | |||||
| *relmaxc2nrmk = 0.f; | |||||
| } | |||||
| /* We reached the end of the loop, i.e. all KMAX columns were */ | |||||
| /* factorized, set TAUs corresponding to the columns that were */ | |||||
| /* not factorized to ZERO, i.e. TAU(K+1:MINMNFACT) set to ZERO. */ | |||||
| i__1 = minmnfact; | |||||
| for (j = *k + 1; j <= i__1; ++j) { | |||||
| tau[j] = 0.f; | |||||
| } | |||||
| return 0; | |||||
| /* End of SLAQP2RK */ | |||||
| } /* slaqp2rk_ */ | |||||
| @@ -0,0 +1,947 @@ | |||||
| #include <math.h> | |||||
| #include <stdlib.h> | |||||
| #include <string.h> | |||||
| #include <stdio.h> | |||||
| #include <complex.h> | |||||
| #ifdef complex | |||||
| #undef complex | |||||
| #endif | |||||
| #ifdef I | |||||
| #undef I | |||||
| #endif | |||||
| #if defined(_WIN64) | |||||
| typedef long long BLASLONG; | |||||
| typedef unsigned long long BLASULONG; | |||||
| #else | |||||
| typedef long BLASLONG; | |||||
| typedef unsigned long BLASULONG; | |||||
| #endif | |||||
| #ifdef LAPACK_ILP64 | |||||
| typedef BLASLONG blasint; | |||||
| #if defined(_WIN64) | |||||
| #define blasabs(x) llabs(x) | |||||
| #else | |||||
| #define blasabs(x) labs(x) | |||||
| #endif | |||||
| #else | |||||
| typedef int blasint; | |||||
| #define blasabs(x) abs(x) | |||||
| #endif | |||||
| typedef blasint integer; | |||||
| typedef unsigned int uinteger; | |||||
| typedef char *address; | |||||
| typedef short int shortint; | |||||
| typedef float real; | |||||
| typedef double doublereal; | |||||
| typedef struct { real r, i; } complex; | |||||
| typedef struct { doublereal r, i; } doublecomplex; | |||||
| #ifdef _MSC_VER | |||||
| static inline _Fcomplex Cf(complex *z) {_Fcomplex zz={z->r , z->i}; return zz;} | |||||
| static inline _Dcomplex Cd(doublecomplex *z) {_Dcomplex zz={z->r , z->i};return zz;} | |||||
| static inline _Fcomplex * _pCf(complex *z) {return (_Fcomplex*)z;} | |||||
| static inline _Dcomplex * _pCd(doublecomplex *z) {return (_Dcomplex*)z;} | |||||
| #else | |||||
| static inline _Complex float Cf(complex *z) {return z->r + z->i*_Complex_I;} | |||||
| static inline _Complex double Cd(doublecomplex *z) {return z->r + z->i*_Complex_I;} | |||||
| static inline _Complex float * _pCf(complex *z) {return (_Complex float*)z;} | |||||
| static inline _Complex double * _pCd(doublecomplex *z) {return (_Complex double*)z;} | |||||
| #endif | |||||
| #define pCf(z) (*_pCf(z)) | |||||
| #define pCd(z) (*_pCd(z)) | |||||
| typedef int logical; | |||||
| typedef short int shortlogical; | |||||
| typedef char logical1; | |||||
| typedef char integer1; | |||||
| #define TRUE_ (1) | |||||
| #define FALSE_ (0) | |||||
| /* Extern is for use with -E */ | |||||
| #ifndef Extern | |||||
| #define Extern extern | |||||
| #endif | |||||
| /* I/O stuff */ | |||||
| typedef int flag; | |||||
| typedef int ftnlen; | |||||
| typedef int ftnint; | |||||
| /*external read, write*/ | |||||
| typedef struct | |||||
| { flag cierr; | |||||
| ftnint ciunit; | |||||
| flag ciend; | |||||
| char *cifmt; | |||||
| ftnint cirec; | |||||
| } cilist; | |||||
| /*internal read, write*/ | |||||
| typedef struct | |||||
| { flag icierr; | |||||
| char *iciunit; | |||||
| flag iciend; | |||||
| char *icifmt; | |||||
| ftnint icirlen; | |||||
| ftnint icirnum; | |||||
| } icilist; | |||||
| /*open*/ | |||||
| typedef struct | |||||
| { flag oerr; | |||||
| ftnint ounit; | |||||
| char *ofnm; | |||||
| ftnlen ofnmlen; | |||||
| char *osta; | |||||
| char *oacc; | |||||
| char *ofm; | |||||
| ftnint orl; | |||||
| char *oblnk; | |||||
| } olist; | |||||
| /*close*/ | |||||
| typedef struct | |||||
| { flag cerr; | |||||
| ftnint cunit; | |||||
| char *csta; | |||||
| } cllist; | |||||
| /*rewind, backspace, endfile*/ | |||||
| typedef struct | |||||
| { flag aerr; | |||||
| ftnint aunit; | |||||
| } alist; | |||||
| /* inquire */ | |||||
| typedef struct | |||||
| { flag inerr; | |||||
| ftnint inunit; | |||||
| char *infile; | |||||
| ftnlen infilen; | |||||
| ftnint *inex; /*parameters in standard's order*/ | |||||
| ftnint *inopen; | |||||
| ftnint *innum; | |||||
| ftnint *innamed; | |||||
| char *inname; | |||||
| ftnlen innamlen; | |||||
| char *inacc; | |||||
| ftnlen inacclen; | |||||
| char *inseq; | |||||
| ftnlen inseqlen; | |||||
| char *indir; | |||||
| ftnlen indirlen; | |||||
| char *infmt; | |||||
| ftnlen infmtlen; | |||||
| char *inform; | |||||
| ftnint informlen; | |||||
| char *inunf; | |||||
| ftnlen inunflen; | |||||
| ftnint *inrecl; | |||||
| ftnint *innrec; | |||||
| char *inblank; | |||||
| ftnlen inblanklen; | |||||
| } inlist; | |||||
| #define VOID void | |||||
| union Multitype { /* for multiple entry points */ | |||||
| integer1 g; | |||||
| shortint h; | |||||
| integer i; | |||||
| /* longint j; */ | |||||
| real r; | |||||
| doublereal d; | |||||
| complex c; | |||||
| doublecomplex z; | |||||
| }; | |||||
| typedef union Multitype Multitype; | |||||
| struct Vardesc { /* for Namelist */ | |||||
| char *name; | |||||
| char *addr; | |||||
| ftnlen *dims; | |||||
| int type; | |||||
| }; | |||||
| typedef struct Vardesc Vardesc; | |||||
| struct Namelist { | |||||
| char *name; | |||||
| Vardesc **vars; | |||||
| int nvars; | |||||
| }; | |||||
| typedef struct Namelist Namelist; | |||||
| #define abs(x) ((x) >= 0 ? (x) : -(x)) | |||||
| #define dabs(x) (fabs(x)) | |||||
| #define f2cmin(a,b) ((a) <= (b) ? (a) : (b)) | |||||
| #define f2cmax(a,b) ((a) >= (b) ? (a) : (b)) | |||||
| #define dmin(a,b) (f2cmin(a,b)) | |||||
| #define dmax(a,b) (f2cmax(a,b)) | |||||
| #define bit_test(a,b) ((a) >> (b) & 1) | |||||
| #define bit_clear(a,b) ((a) & ~((uinteger)1 << (b))) | |||||
| #define bit_set(a,b) ((a) | ((uinteger)1 << (b))) | |||||
| #define abort_() { sig_die("Fortran abort routine called", 1); } | |||||
| #define c_abs(z) (cabsf(Cf(z))) | |||||
| #define c_cos(R,Z) { pCf(R)=ccos(Cf(Z)); } | |||||
| #ifdef _MSC_VER | |||||
| #define c_div(c, a, b) {Cf(c)._Val[0] = (Cf(a)._Val[0]/Cf(b)._Val[0]); Cf(c)._Val[1]=(Cf(a)._Val[1]/Cf(b)._Val[1]);} | |||||
| #define z_div(c, a, b) {Cd(c)._Val[0] = (Cd(a)._Val[0]/Cd(b)._Val[0]); Cd(c)._Val[1]=(Cd(a)._Val[1]/Cd(b)._Val[1]);} | |||||
| #else | |||||
| #define c_div(c, a, b) {pCf(c) = Cf(a)/Cf(b);} | |||||
| #define z_div(c, a, b) {pCd(c) = Cd(a)/Cd(b);} | |||||
| #endif | |||||
| #define c_exp(R, Z) {pCf(R) = cexpf(Cf(Z));} | |||||
| #define c_log(R, Z) {pCf(R) = clogf(Cf(Z));} | |||||
| #define c_sin(R, Z) {pCf(R) = csinf(Cf(Z));} | |||||
| //#define c_sqrt(R, Z) {*(R) = csqrtf(Cf(Z));} | |||||
| #define c_sqrt(R, Z) {pCf(R) = csqrtf(Cf(Z));} | |||||
| #define d_abs(x) (fabs(*(x))) | |||||
| #define d_acos(x) (acos(*(x))) | |||||
| #define d_asin(x) (asin(*(x))) | |||||
| #define d_atan(x) (atan(*(x))) | |||||
| #define d_atn2(x, y) (atan2(*(x),*(y))) | |||||
| #define d_cnjg(R, Z) { pCd(R) = conj(Cd(Z)); } | |||||
| #define r_cnjg(R, Z) { pCf(R) = conjf(Cf(Z)); } | |||||
| #define d_cos(x) (cos(*(x))) | |||||
| #define d_cosh(x) (cosh(*(x))) | |||||
| #define d_dim(__a, __b) ( *(__a) > *(__b) ? *(__a) - *(__b) : 0.0 ) | |||||
| #define d_exp(x) (exp(*(x))) | |||||
| #define d_imag(z) (cimag(Cd(z))) | |||||
| #define r_imag(z) (cimagf(Cf(z))) | |||||
| #define d_int(__x) (*(__x)>0 ? floor(*(__x)) : -floor(- *(__x))) | |||||
| #define r_int(__x) (*(__x)>0 ? floor(*(__x)) : -floor(- *(__x))) | |||||
| #define d_lg10(x) ( 0.43429448190325182765 * log(*(x)) ) | |||||
| #define r_lg10(x) ( 0.43429448190325182765 * log(*(x)) ) | |||||
| #define d_log(x) (log(*(x))) | |||||
| #define d_mod(x, y) (fmod(*(x), *(y))) | |||||
| #define u_nint(__x) ((__x)>=0 ? floor((__x) + .5) : -floor(.5 - (__x))) | |||||
| #define d_nint(x) u_nint(*(x)) | |||||
| #define u_sign(__a,__b) ((__b) >= 0 ? ((__a) >= 0 ? (__a) : -(__a)) : -((__a) >= 0 ? (__a) : -(__a))) | |||||
| #define d_sign(a,b) u_sign(*(a),*(b)) | |||||
| #define r_sign(a,b) u_sign(*(a),*(b)) | |||||
| #define d_sin(x) (sin(*(x))) | |||||
| #define d_sinh(x) (sinh(*(x))) | |||||
| #define d_sqrt(x) (sqrt(*(x))) | |||||
| #define d_tan(x) (tan(*(x))) | |||||
| #define d_tanh(x) (tanh(*(x))) | |||||
| #define i_abs(x) abs(*(x)) | |||||
| #define i_dnnt(x) ((integer)u_nint(*(x))) | |||||
| #define i_len(s, n) (n) | |||||
| #define i_nint(x) ((integer)u_nint(*(x))) | |||||
| #define i_sign(a,b) ((integer)u_sign((integer)*(a),(integer)*(b))) | |||||
| #define pow_dd(ap, bp) ( pow(*(ap), *(bp))) | |||||
| #define pow_si(B,E) spow_ui(*(B),*(E)) | |||||
| #define pow_ri(B,E) spow_ui(*(B),*(E)) | |||||
| #define pow_di(B,E) dpow_ui(*(B),*(E)) | |||||
| #define pow_zi(p, a, b) {pCd(p) = zpow_ui(Cd(a), *(b));} | |||||
| #define pow_ci(p, a, b) {pCf(p) = cpow_ui(Cf(a), *(b));} | |||||
| #define pow_zz(R,A,B) {pCd(R) = cpow(Cd(A),*(B));} | |||||
| #define s_cat(lpp, rpp, rnp, np, llp) { ftnlen i, nc, ll; char *f__rp, *lp; ll = (llp); lp = (lpp); for(i=0; i < (int)*(np); ++i) { nc = ll; if((rnp)[i] < nc) nc = (rnp)[i]; ll -= nc; f__rp = (rpp)[i]; while(--nc >= 0) *lp++ = *(f__rp)++; } while(--ll >= 0) *lp++ = ' '; } | |||||
| #define s_cmp(a,b,c,d) ((integer)strncmp((a),(b),f2cmin((c),(d)))) | |||||
| #define s_copy(A,B,C,D) { int __i,__m; for (__i=0, __m=f2cmin((C),(D)); __i<__m && (B)[__i] != 0; ++__i) (A)[__i] = (B)[__i]; } | |||||
| #define sig_die(s, kill) { exit(1); } | |||||
| #define s_stop(s, n) {exit(0);} | |||||
| static char junk[] = "\n@(#)LIBF77 VERSION 19990503\n"; | |||||
| #define z_abs(z) (cabs(Cd(z))) | |||||
| #define z_exp(R, Z) {pCd(R) = cexp(Cd(Z));} | |||||
| #define z_sqrt(R, Z) {pCd(R) = csqrt(Cd(Z));} | |||||
| #define myexit_() break; | |||||
| #define mycycle_() continue; | |||||
| #define myceiling_(w) {ceil(w)} | |||||
| #define myhuge_(w) {HUGE_VAL} | |||||
| //#define mymaxloc_(w,s,e,n) {if (sizeof(*(w)) == sizeof(double)) dmaxloc_((w),*(s),*(e),n); else dmaxloc_((w),*(s),*(e),n);} | |||||
| #define mymaxloc_(w,s,e,n) dmaxloc_(w,*(s),*(e),n) | |||||
| /* procedure parameter types for -A and -C++ */ | |||||
| #define F2C_proc_par_types 1 | |||||
| #ifdef __cplusplus | |||||
| typedef logical (*L_fp)(...); | |||||
| #else | |||||
| typedef logical (*L_fp)(); | |||||
| #endif | |||||
| static float spow_ui(float x, integer n) { | |||||
| float pow=1.0; unsigned long int u; | |||||
| if(n != 0) { | |||||
| if(n < 0) n = -n, x = 1/x; | |||||
| for(u = n; ; ) { | |||||
| if(u & 01) pow *= x; | |||||
| if(u >>= 1) x *= x; | |||||
| else break; | |||||
| } | |||||
| } | |||||
| return pow; | |||||
| } | |||||
| static double dpow_ui(double x, integer n) { | |||||
| double pow=1.0; unsigned long int u; | |||||
| if(n != 0) { | |||||
| if(n < 0) n = -n, x = 1/x; | |||||
| for(u = n; ; ) { | |||||
| if(u & 01) pow *= x; | |||||
| if(u >>= 1) x *= x; | |||||
| else break; | |||||
| } | |||||
| } | |||||
| return pow; | |||||
| } | |||||
| #ifdef _MSC_VER | |||||
| static _Fcomplex cpow_ui(complex x, integer n) { | |||||
| complex pow={1.0,0.0}; unsigned long int u; | |||||
| if(n != 0) { | |||||
| if(n < 0) n = -n, x.r = 1/x.r, x.i=1/x.i; | |||||
| for(u = n; ; ) { | |||||
| if(u & 01) pow.r *= x.r, pow.i *= x.i; | |||||
| if(u >>= 1) x.r *= x.r, x.i *= x.i; | |||||
| else break; | |||||
| } | |||||
| } | |||||
| _Fcomplex p={pow.r, pow.i}; | |||||
| return p; | |||||
| } | |||||
| #else | |||||
| static _Complex float cpow_ui(_Complex float x, integer n) { | |||||
| _Complex float pow=1.0; unsigned long int u; | |||||
| if(n != 0) { | |||||
| if(n < 0) n = -n, x = 1/x; | |||||
| for(u = n; ; ) { | |||||
| if(u & 01) pow *= x; | |||||
| if(u >>= 1) x *= x; | |||||
| else break; | |||||
| } | |||||
| } | |||||
| return pow; | |||||
| } | |||||
| #endif | |||||
| #ifdef _MSC_VER | |||||
| static _Dcomplex zpow_ui(_Dcomplex x, integer n) { | |||||
| _Dcomplex pow={1.0,0.0}; unsigned long int u; | |||||
| if(n != 0) { | |||||
| if(n < 0) n = -n, x._Val[0] = 1/x._Val[0], x._Val[1] =1/x._Val[1]; | |||||
| for(u = n; ; ) { | |||||
| if(u & 01) pow._Val[0] *= x._Val[0], pow._Val[1] *= x._Val[1]; | |||||
| if(u >>= 1) x._Val[0] *= x._Val[0], x._Val[1] *= x._Val[1]; | |||||
| else break; | |||||
| } | |||||
| } | |||||
| _Dcomplex p = {pow._Val[0], pow._Val[1]}; | |||||
| return p; | |||||
| } | |||||
| #else | |||||
| static _Complex double zpow_ui(_Complex double x, integer n) { | |||||
| _Complex double pow=1.0; unsigned long int u; | |||||
| if(n != 0) { | |||||
| if(n < 0) n = -n, x = 1/x; | |||||
| for(u = n; ; ) { | |||||
| if(u & 01) pow *= x; | |||||
| if(u >>= 1) x *= x; | |||||
| else break; | |||||
| } | |||||
| } | |||||
| return pow; | |||||
| } | |||||
| #endif | |||||
| static integer pow_ii(integer x, integer n) { | |||||
| integer pow; unsigned long int u; | |||||
| if (n <= 0) { | |||||
| if (n == 0 || x == 1) pow = 1; | |||||
| else if (x != -1) pow = x == 0 ? 1/x : 0; | |||||
| else n = -n; | |||||
| } | |||||
| if ((n > 0) || !(n == 0 || x == 1 || x != -1)) { | |||||
| u = n; | |||||
| for(pow = 1; ; ) { | |||||
| if(u & 01) pow *= x; | |||||
| if(u >>= 1) x *= x; | |||||
| else break; | |||||
| } | |||||
| } | |||||
| return pow; | |||||
| } | |||||
| static integer dmaxloc_(double *w, integer s, integer e, integer *n) | |||||
| { | |||||
| double m; integer i, mi; | |||||
| for(m=w[s-1], mi=s, i=s+1; i<=e; i++) | |||||
| if (w[i-1]>m) mi=i ,m=w[i-1]; | |||||
| return mi-s+1; | |||||
| } | |||||
| static integer smaxloc_(float *w, integer s, integer e, integer *n) | |||||
| { | |||||
| float m; integer i, mi; | |||||
| for(m=w[s-1], mi=s, i=s+1; i<=e; i++) | |||||
| if (w[i-1]>m) mi=i ,m=w[i-1]; | |||||
| return mi-s+1; | |||||
| } | |||||
| static inline void cdotc_(complex *z, integer *n_, complex *x, integer *incx_, complex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| #ifdef _MSC_VER | |||||
| _Fcomplex zdotc = {0.0, 0.0}; | |||||
| if (incx == 1 && incy == 1) { | |||||
| for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */ | |||||
| zdotc._Val[0] += conjf(Cf(&x[i]))._Val[0] * Cf(&y[i])._Val[0]; | |||||
| zdotc._Val[1] += conjf(Cf(&x[i]))._Val[1] * Cf(&y[i])._Val[1]; | |||||
| } | |||||
| } else { | |||||
| for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */ | |||||
| zdotc._Val[0] += conjf(Cf(&x[i*incx]))._Val[0] * Cf(&y[i*incy])._Val[0]; | |||||
| zdotc._Val[1] += conjf(Cf(&x[i*incx]))._Val[1] * Cf(&y[i*incy])._Val[1]; | |||||
| } | |||||
| } | |||||
| pCf(z) = zdotc; | |||||
| } | |||||
| #else | |||||
| _Complex float zdotc = 0.0; | |||||
| if (incx == 1 && incy == 1) { | |||||
| for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */ | |||||
| zdotc += conjf(Cf(&x[i])) * Cf(&y[i]); | |||||
| } | |||||
| } else { | |||||
| for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */ | |||||
| zdotc += conjf(Cf(&x[i*incx])) * Cf(&y[i*incy]); | |||||
| } | |||||
| } | |||||
| pCf(z) = zdotc; | |||||
| } | |||||
| #endif | |||||
| static inline void zdotc_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| #ifdef _MSC_VER | |||||
| _Dcomplex zdotc = {0.0, 0.0}; | |||||
| if (incx == 1 && incy == 1) { | |||||
| for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */ | |||||
| zdotc._Val[0] += conj(Cd(&x[i]))._Val[0] * Cd(&y[i])._Val[0]; | |||||
| zdotc._Val[1] += conj(Cd(&x[i]))._Val[1] * Cd(&y[i])._Val[1]; | |||||
| } | |||||
| } else { | |||||
| for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */ | |||||
| zdotc._Val[0] += conj(Cd(&x[i*incx]))._Val[0] * Cd(&y[i*incy])._Val[0]; | |||||
| zdotc._Val[1] += conj(Cd(&x[i*incx]))._Val[1] * Cd(&y[i*incy])._Val[1]; | |||||
| } | |||||
| } | |||||
| pCd(z) = zdotc; | |||||
| } | |||||
| #else | |||||
| _Complex double zdotc = 0.0; | |||||
| if (incx == 1 && incy == 1) { | |||||
| for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */ | |||||
| zdotc += conj(Cd(&x[i])) * Cd(&y[i]); | |||||
| } | |||||
| } else { | |||||
| for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */ | |||||
| zdotc += conj(Cd(&x[i*incx])) * Cd(&y[i*incy]); | |||||
| } | |||||
| } | |||||
| pCd(z) = zdotc; | |||||
| } | |||||
| #endif | |||||
| static inline void cdotu_(complex *z, integer *n_, complex *x, integer *incx_, complex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| #ifdef _MSC_VER | |||||
| _Fcomplex zdotc = {0.0, 0.0}; | |||||
| if (incx == 1 && incy == 1) { | |||||
| for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */ | |||||
| zdotc._Val[0] += Cf(&x[i])._Val[0] * Cf(&y[i])._Val[0]; | |||||
| zdotc._Val[1] += Cf(&x[i])._Val[1] * Cf(&y[i])._Val[1]; | |||||
| } | |||||
| } else { | |||||
| for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */ | |||||
| zdotc._Val[0] += Cf(&x[i*incx])._Val[0] * Cf(&y[i*incy])._Val[0]; | |||||
| zdotc._Val[1] += Cf(&x[i*incx])._Val[1] * Cf(&y[i*incy])._Val[1]; | |||||
| } | |||||
| } | |||||
| pCf(z) = zdotc; | |||||
| } | |||||
| #else | |||||
| _Complex float zdotc = 0.0; | |||||
| if (incx == 1 && incy == 1) { | |||||
| for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */ | |||||
| zdotc += Cf(&x[i]) * Cf(&y[i]); | |||||
| } | |||||
| } else { | |||||
| for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */ | |||||
| zdotc += Cf(&x[i*incx]) * Cf(&y[i*incy]); | |||||
| } | |||||
| } | |||||
| pCf(z) = zdotc; | |||||
| } | |||||
| #endif | |||||
| static inline void zdotu_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| #ifdef _MSC_VER | |||||
| _Dcomplex zdotc = {0.0, 0.0}; | |||||
| if (incx == 1 && incy == 1) { | |||||
| for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */ | |||||
| zdotc._Val[0] += Cd(&x[i])._Val[0] * Cd(&y[i])._Val[0]; | |||||
| zdotc._Val[1] += Cd(&x[i])._Val[1] * Cd(&y[i])._Val[1]; | |||||
| } | |||||
| } else { | |||||
| for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */ | |||||
| zdotc._Val[0] += Cd(&x[i*incx])._Val[0] * Cd(&y[i*incy])._Val[0]; | |||||
| zdotc._Val[1] += Cd(&x[i*incx])._Val[1] * Cd(&y[i*incy])._Val[1]; | |||||
| } | |||||
| } | |||||
| pCd(z) = zdotc; | |||||
| } | |||||
| #else | |||||
| _Complex double zdotc = 0.0; | |||||
| if (incx == 1 && incy == 1) { | |||||
| for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */ | |||||
| zdotc += Cd(&x[i]) * Cd(&y[i]); | |||||
| } | |||||
| } else { | |||||
| for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */ | |||||
| zdotc += Cd(&x[i*incx]) * Cd(&y[i*incy]); | |||||
| } | |||||
| } | |||||
| pCd(z) = zdotc; | |||||
| } | |||||
| #endif | |||||
| /* -- translated by f2c (version 20000121). | |||||
| You must link the resulting object file with the libraries: | |||||
| -lf2c -lm (in that order) | |||||
| */ | |||||
| /* -- translated by f2c (version 20000121). | |||||
| You must link the resulting object file with the libraries: | |||||
| -lf2c -lm (in that order) | |||||
| */ | |||||
| /* Table of constant values */ | |||||
| static integer c__1 = 1; | |||||
| /* Subroutine */ int zlaqp2rk_(integer *m, integer *n, integer *nrhs, integer | |||||
| *ioffset, integer *kmax, doublereal *abstol, doublereal *reltol, | |||||
| integer *kp1, doublereal *maxc2nrm, doublecomplex *a, integer *lda, | |||||
| integer *k, doublereal *maxc2nrmk, doublereal *relmaxc2nrmk, integer * | |||||
| jpiv, doublecomplex *tau, doublereal *vn1, doublereal *vn2, | |||||
| doublecomplex *work, integer *info) | |||||
| { | |||||
| /* System generated locals */ | |||||
| integer a_dim1, a_offset, i__1, i__2, i__3; | |||||
| doublereal d__1; | |||||
| doublecomplex z__1; | |||||
| /* Local variables */ | |||||
| doublecomplex aikk; | |||||
| doublereal temp, temp2; | |||||
| integer i__, j; | |||||
| doublereal tol3z; | |||||
| integer jmaxc2nrm, itemp; | |||||
| extern /* Subroutine */ int zlarf_(char *, integer *, integer *, | |||||
| doublecomplex *, integer *, doublecomplex *, doublecomplex *, | |||||
| integer *, doublecomplex *); | |||||
| integer minmnfact; | |||||
| extern /* Subroutine */ int zswap_(integer *, doublecomplex *, integer *, | |||||
| doublecomplex *, integer *); | |||||
| doublereal myhugeval; | |||||
| integer minmnupdt; | |||||
| extern doublereal dznrm2_(integer *, doublecomplex *, integer *); | |||||
| integer kk; | |||||
| extern doublereal dlamch_(char *); | |||||
| integer kp; | |||||
| extern integer idamax_(integer *, doublereal *, integer *); | |||||
| extern logical disnan_(doublereal *); | |||||
| extern /* Subroutine */ int zlarfg_(integer *, doublecomplex *, | |||||
| doublecomplex *, integer *, doublecomplex *); | |||||
| doublereal taunan; | |||||
| /* -- LAPACK auxiliary routine -- */ | |||||
| /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ | |||||
| /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ | |||||
| /* ===================================================================== */ | |||||
| /* Initialize INFO */ | |||||
| /* Parameter adjustments */ | |||||
| a_dim1 = *lda; | |||||
| a_offset = 1 + a_dim1 * 1; | |||||
| a -= a_offset; | |||||
| --jpiv; | |||||
| --tau; | |||||
| --vn1; | |||||
| --vn2; | |||||
| --work; | |||||
| /* Function Body */ | |||||
| *info = 0; | |||||
| /* MINMNFACT in the smallest dimension of the submatrix */ | |||||
| /* A(IOFFSET+1:M,1:N) to be factorized. */ | |||||
| /* MINMNUPDT is the smallest dimension */ | |||||
| /* of the subarray A(IOFFSET+1:M,1:N+NRHS) to be udated, which */ | |||||
| /* contains the submatrices A(IOFFSET+1:M,1:N) and */ | |||||
| /* B(IOFFSET+1:M,1:NRHS) as column blocks. */ | |||||
| /* Computing MIN */ | |||||
| i__1 = *m - *ioffset; | |||||
| minmnfact = f2cmin(i__1,*n); | |||||
| /* Computing MIN */ | |||||
| i__1 = *m - *ioffset, i__2 = *n + *nrhs; | |||||
| minmnupdt = f2cmin(i__1,i__2); | |||||
| *kmax = f2cmin(*kmax,minmnfact); | |||||
| tol3z = sqrt(dlamch_("Epsilon")); | |||||
| myhugeval = dlamch_("Overflow"); | |||||
| /* Compute the factorization, KK is the lomn loop index. */ | |||||
| i__1 = *kmax; | |||||
| for (kk = 1; kk <= i__1; ++kk) { | |||||
| i__ = *ioffset + kk; | |||||
| if (i__ == 1) { | |||||
| /* ============================================================ */ | |||||
| /* We are at the first column of the original whole matrix A, */ | |||||
| /* therefore we use the computed KP1 and MAXC2NRM from the */ | |||||
| /* main routine. */ | |||||
| kp = *kp1; | |||||
| /* ============================================================ */ | |||||
| } else { | |||||
| /* ============================================================ */ | |||||
| /* Determine the pivot column in KK-th step, i.e. the index */ | |||||
| /* of the column with the maximum 2-norm in the */ | |||||
| /* submatrix A(I:M,K:N). */ | |||||
| i__2 = *n - kk + 1; | |||||
| kp = kk - 1 + idamax_(&i__2, &vn1[kk], &c__1); | |||||
| /* Determine the maximum column 2-norm and the relative maximum */ | |||||
| /* column 2-norm of the submatrix A(I:M,KK:N) in step KK. */ | |||||
| /* RELMAXC2NRMK will be computed later, after somecondition */ | |||||
| /* checks on MAXC2NRMK. */ | |||||
| *maxc2nrmk = vn1[kp]; | |||||
| /* ============================================================ */ | |||||
| /* Check if the submatrix A(I:M,KK:N) contains NaN, and set */ | |||||
| /* INFO parameter to the column number, where the first NaN */ | |||||
| /* is found and return from the routine. */ | |||||
| /* We need to check the condition only if the */ | |||||
| /* column index (same as row index) of the original whole */ | |||||
| /* matrix is larger than 1, since the condition for whole */ | |||||
| /* original matrix is checked in the main routine. */ | |||||
| if (disnan_(maxc2nrmk)) { | |||||
| /* Set K, the number of factorized columns. */ | |||||
| /* that are not zero. */ | |||||
| *k = kk - 1; | |||||
| *info = *k + kp; | |||||
| /* Set RELMAXC2NRMK to NaN. */ | |||||
| *relmaxc2nrmk = *maxc2nrmk; | |||||
| /* Array TAU(K+1:MINMNFACT) is not set and contains */ | |||||
| /* undefined elements. */ | |||||
| return 0; | |||||
| } | |||||
| /* ============================================================ */ | |||||
| /* Quick return, if the submatrix A(I:M,KK:N) is */ | |||||
| /* a zero matrix. */ | |||||
| /* We need to check the condition only if the */ | |||||
| /* column index (same as row index) of the original whole */ | |||||
| /* matrix is larger than 1, since the condition for whole */ | |||||
| /* original matrix is checked in the main routine. */ | |||||
| if (*maxc2nrmk == 0.) { | |||||
| /* Set K, the number of factorized columns. */ | |||||
| /* that are not zero. */ | |||||
| *k = kk - 1; | |||||
| *relmaxc2nrmk = 0.; | |||||
| /* Set TAUs corresponding to the columns that were not */ | |||||
| /* factorized to ZERO, i.e. set TAU(KK:MINMNFACT) to CZERO. */ | |||||
| i__2 = minmnfact; | |||||
| for (j = kk; j <= i__2; ++j) { | |||||
| i__3 = j; | |||||
| tau[i__3].r = 0., tau[i__3].i = 0.; | |||||
| } | |||||
| /* Return from the routine. */ | |||||
| return 0; | |||||
| } | |||||
| /* ============================================================ */ | |||||
| /* Check if the submatrix A(I:M,KK:N) contains Inf, */ | |||||
| /* set INFO parameter to the column number, where */ | |||||
| /* the first Inf is found plus N, and continue */ | |||||
| /* the computation. */ | |||||
| /* We need to check the condition only if the */ | |||||
| /* column index (same as row index) of the original whole */ | |||||
| /* matrix is larger than 1, since the condition for whole */ | |||||
| /* original matrix is checked in the main routine. */ | |||||
| if (*info == 0 && *maxc2nrmk > myhugeval) { | |||||
| *info = *n + kk - 1 + kp; | |||||
| } | |||||
| /* ============================================================ */ | |||||
| /* Test for the second and third stopping criteria. */ | |||||
| /* NOTE: There is no need to test for ABSTOL >= ZERO, since */ | |||||
| /* MAXC2NRMK is non-negative. Similarly, there is no need */ | |||||
| /* to test for RELTOL >= ZERO, since RELMAXC2NRMK is */ | |||||
| /* non-negative. */ | |||||
| /* We need to check the condition only if the */ | |||||
| /* column index (same as row index) of the original whole */ | |||||
| /* matrix is larger than 1, since the condition for whole */ | |||||
| /* original matrix is checked in the main routine. */ | |||||
| *relmaxc2nrmk = *maxc2nrmk / *maxc2nrm; | |||||
| if (*maxc2nrmk <= *abstol || *relmaxc2nrmk <= *reltol) { | |||||
| /* Set K, the number of factorized columns. */ | |||||
| *k = kk - 1; | |||||
| /* Set TAUs corresponding to the columns that were not */ | |||||
| /* factorized to ZERO, i.e. set TAU(KK:MINMNFACT) to CZERO. */ | |||||
| i__2 = minmnfact; | |||||
| for (j = kk; j <= i__2; ++j) { | |||||
| i__3 = j; | |||||
| tau[i__3].r = 0., tau[i__3].i = 0.; | |||||
| } | |||||
| /* Return from the routine. */ | |||||
| return 0; | |||||
| } | |||||
| /* ============================================================ */ | |||||
| /* End ELSE of IF(I.EQ.1) */ | |||||
| } | |||||
| /* =============================================================== */ | |||||
| /* If the pivot column is not the first column of the */ | |||||
| /* subblock A(1:M,KK:N): */ | |||||
| /* 1) swap the KK-th column and the KP-th pivot column */ | |||||
| /* in A(1:M,1:N); */ | |||||
| /* 2) copy the KK-th element into the KP-th element of the partial */ | |||||
| /* and exact 2-norm vectors VN1 and VN2. ( Swap is not needed */ | |||||
| /* for VN1 and VN2 since we use the element with the index */ | |||||
| /* larger than KK in the next loop step.) */ | |||||
| /* 3) Save the pivot interchange with the indices relative to the */ | |||||
| /* the original matrix A, not the block A(1:M,1:N). */ | |||||
| if (kp != kk) { | |||||
| zswap_(m, &a[kp * a_dim1 + 1], &c__1, &a[kk * a_dim1 + 1], &c__1); | |||||
| vn1[kp] = vn1[kk]; | |||||
| vn2[kp] = vn2[kk]; | |||||
| itemp = jpiv[kp]; | |||||
| jpiv[kp] = jpiv[kk]; | |||||
| jpiv[kk] = itemp; | |||||
| } | |||||
| /* Generate elementary reflector H(KK) using the column A(I:M,KK), */ | |||||
| /* if the column has more than one element, otherwise */ | |||||
| /* the elementary reflector would be an identity matrix, */ | |||||
| /* and TAU(KK) = CZERO. */ | |||||
| if (i__ < *m) { | |||||
| i__2 = *m - i__ + 1; | |||||
| zlarfg_(&i__2, &a[i__ + kk * a_dim1], &a[i__ + 1 + kk * a_dim1], & | |||||
| c__1, &tau[kk]); | |||||
| } else { | |||||
| i__2 = kk; | |||||
| tau[i__2].r = 0., tau[i__2].i = 0.; | |||||
| } | |||||
| /* Check if TAU(KK) contains NaN, set INFO parameter */ | |||||
| /* to the column number where NaN is found and return from */ | |||||
| /* the routine. */ | |||||
| /* NOTE: There is no need to check TAU(KK) for Inf, */ | |||||
| /* since ZLARFG cannot produce TAU(KK) or Householder vector */ | |||||
| /* below the diagonal containing Inf. Only BETA on the diagonal, */ | |||||
| /* returned by ZLARFG can contain Inf, which requires */ | |||||
| /* TAU(KK) to contain NaN. Therefore, this case of generating Inf */ | |||||
| /* by ZLARFG is covered by checking TAU(KK) for NaN. */ | |||||
| i__2 = kk; | |||||
| d__1 = tau[i__2].r; | |||||
| if (disnan_(&d__1)) { | |||||
| i__2 = kk; | |||||
| taunan = tau[i__2].r; | |||||
| } else /* if(complicated condition) */ { | |||||
| d__1 = d_imag(&tau[kk]); | |||||
| if (disnan_(&d__1)) { | |||||
| taunan = d_imag(&tau[kk]); | |||||
| } else { | |||||
| taunan = 0.; | |||||
| } | |||||
| } | |||||
| if (disnan_(&taunan)) { | |||||
| *k = kk - 1; | |||||
| *info = kk; | |||||
| /* Set MAXC2NRMK and RELMAXC2NRMK to NaN. */ | |||||
| *maxc2nrmk = taunan; | |||||
| *relmaxc2nrmk = taunan; | |||||
| /* Array TAU(KK:MINMNFACT) is not set and contains */ | |||||
| /* undefined elements, except the first element TAU(KK) = NaN. */ | |||||
| return 0; | |||||
| } | |||||
| /* Apply H(KK)**H to A(I:M,KK+1:N+NRHS) from the left. */ | |||||
| /* ( If M >= N, then at KK = N there is no residual matrix, */ | |||||
| /* i.e. no columns of A to update, only columns of B. */ | |||||
| /* If M < N, then at KK = M-IOFFSET, I = M and we have a */ | |||||
| /* one-row residual matrix in A and the elementary */ | |||||
| /* reflector is a unit matrix, TAU(KK) = CZERO, i.e. no update */ | |||||
| /* is needed for the residual matrix in A and the */ | |||||
| /* right-hand-side-matrix in B. */ | |||||
| /* Therefore, we update only if */ | |||||
| /* KK < MINMNUPDT = f2cmin(M-IOFFSET, N+NRHS) */ | |||||
| /* condition is satisfied, not only KK < N+NRHS ) */ | |||||
| if (kk < minmnupdt) { | |||||
| i__2 = i__ + kk * a_dim1; | |||||
| aikk.r = a[i__2].r, aikk.i = a[i__2].i; | |||||
| i__2 = i__ + kk * a_dim1; | |||||
| a[i__2].r = 1., a[i__2].i = 0.; | |||||
| i__2 = *m - i__ + 1; | |||||
| i__3 = *n + *nrhs - kk; | |||||
| d_cnjg(&z__1, &tau[kk]); | |||||
| zlarf_("Left", &i__2, &i__3, &a[i__ + kk * a_dim1], &c__1, &z__1, | |||||
| &a[i__ + (kk + 1) * a_dim1], lda, &work[1]); | |||||
| i__2 = i__ + kk * a_dim1; | |||||
| a[i__2].r = aikk.r, a[i__2].i = aikk.i; | |||||
| } | |||||
| if (kk < minmnfact) { | |||||
| /* Update the partial column 2-norms for the residual matrix, */ | |||||
| /* only if the residual matrix A(I+1:M,KK+1:N) exists, i.e. */ | |||||
| /* when KK < f2cmin(M-IOFFSET, N). */ | |||||
| i__2 = *n; | |||||
| for (j = kk + 1; j <= i__2; ++j) { | |||||
| if (vn1[j] != 0.) { | |||||
| /* NOTE: The following lines follow from the analysis in */ | |||||
| /* Lapack Working Note 176. */ | |||||
| /* Computing 2nd power */ | |||||
| d__1 = z_abs(&a[i__ + j * a_dim1]) / vn1[j]; | |||||
| temp = 1. - d__1 * d__1; | |||||
| temp = f2cmax(temp,0.); | |||||
| /* Computing 2nd power */ | |||||
| d__1 = vn1[j] / vn2[j]; | |||||
| temp2 = temp * (d__1 * d__1); | |||||
| if (temp2 <= tol3z) { | |||||
| /* Compute the column 2-norm for the partial */ | |||||
| /* column A(I+1:M,J) by explicitly computing it, */ | |||||
| /* and store it in both partial 2-norm vector VN1 */ | |||||
| /* and exact column 2-norm vector VN2. */ | |||||
| i__3 = *m - i__; | |||||
| vn1[j] = dznrm2_(&i__3, &a[i__ + 1 + j * a_dim1], & | |||||
| c__1); | |||||
| vn2[j] = vn1[j]; | |||||
| } else { | |||||
| /* Update the column 2-norm for the partial */ | |||||
| /* column A(I+1:M,J) by removing one */ | |||||
| /* element A(I,J) and store it in partial */ | |||||
| /* 2-norm vector VN1. */ | |||||
| vn1[j] *= sqrt(temp); | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| /* End factorization loop */ | |||||
| } | |||||
| /* If we reached this point, all colunms have been factorized, */ | |||||
| /* i.e. no condition was triggered to exit the routine. */ | |||||
| /* Set the number of factorized columns. */ | |||||
| *k = *kmax; | |||||
| /* We reached the end of the loop, i.e. all KMAX columns were */ | |||||
| /* factorized, we need to set MAXC2NRMK and RELMAXC2NRMK before */ | |||||
| /* we return. */ | |||||
| if (*k < minmnfact) { | |||||
| i__1 = *n - *k; | |||||
| jmaxc2nrm = *k + idamax_(&i__1, &vn1[*k + 1], &c__1); | |||||
| *maxc2nrmk = vn1[jmaxc2nrm]; | |||||
| if (*k == 0) { | |||||
| *relmaxc2nrmk = 1.; | |||||
| } else { | |||||
| *relmaxc2nrmk = *maxc2nrmk / *maxc2nrm; | |||||
| } | |||||
| } else { | |||||
| *maxc2nrmk = 0.; | |||||
| *relmaxc2nrmk = 0.; | |||||
| } | |||||
| /* We reached the end of the loop, i.e. all KMAX columns were */ | |||||
| /* factorized, set TAUs corresponding to the columns that were */ | |||||
| /* not factorized to ZERO, i.e. TAU(K+1:MINMNFACT) set to CZERO. */ | |||||
| i__1 = minmnfact; | |||||
| for (j = *k + 1; j <= i__1; ++j) { | |||||
| i__2 = j; | |||||
| tau[i__2].r = 0., tau[i__2].i = 0.; | |||||
| } | |||||
| return 0; | |||||
| /* End of ZLAQP2RK */ | |||||
| } /* zlaqp2rk_ */ | |||||