| @@ -0,0 +1,512 @@ | |||||
| /* f2c.h -- Standard Fortran to C header file */ | |||||
| /** barf [ba:rf] 2. "He suggested using FORTRAN, and everybody barfed." | |||||
| - From The Shogakukan DICTIONARY OF NEW ENGLISH (Second edition) */ | |||||
| #ifndef F2C_INCLUDE | |||||
| #define F2C_INCLUDE | |||||
| #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 | |||||
| typedef int 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; | |||||
| 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;} | |||||
| #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)); } | |||||
| #define c_div(c, a, b) {pCf(c) = Cf(a)/Cf(b);} | |||||
| #define z_div(c, a, b) {pCd(c) = Cd(a)/Cd(b);} | |||||
| #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) = conj(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) (cimag(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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotc_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void cdotu_(complex *z, integer *n_, complex *x, integer *incx_, complex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotu_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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) | |||||
| */ | |||||
| /* > \brief \b CLACGV conjugates a complex vector. */ | |||||
| /* =========== DOCUMENTATION =========== */ | |||||
| /* Online html documentation available at */ | |||||
| /* http://www.netlib.org/lapack/explore-html/ */ | |||||
| /* > \htmlonly */ | |||||
| /* > Download CLACGV + dependencies */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/clacgv. | |||||
| f"> */ | |||||
| /* > [TGZ]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/clacgv. | |||||
| f"> */ | |||||
| /* > [ZIP]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/clacgv. | |||||
| f"> */ | |||||
| /* > [TXT]</a> */ | |||||
| /* > \endhtmlonly */ | |||||
| /* Definition: */ | |||||
| /* =========== */ | |||||
| /* SUBROUTINE CLACGV( N, X, INCX ) */ | |||||
| /* INTEGER INCX, N */ | |||||
| /* COMPLEX X( * ) */ | |||||
| /* > \par Purpose: */ | |||||
| /* ============= */ | |||||
| /* > */ | |||||
| /* > \verbatim */ | |||||
| /* > */ | |||||
| /* > CLACGV conjugates a complex vector of length N. */ | |||||
| /* > \endverbatim */ | |||||
| /* Arguments: */ | |||||
| /* ========== */ | |||||
| /* > \param[in] N */ | |||||
| /* > \verbatim */ | |||||
| /* > N is INTEGER */ | |||||
| /* > The length of the vector X. N >= 0. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in,out] X */ | |||||
| /* > \verbatim */ | |||||
| /* > X is COMPLEX array, dimension */ | |||||
| /* > (1+(N-1)*abs(INCX)) */ | |||||
| /* > On entry, the vector of length N to be conjugated. */ | |||||
| /* > On exit, X is overwritten with conjg(X). */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] INCX */ | |||||
| /* > \verbatim */ | |||||
| /* > INCX is INTEGER */ | |||||
| /* > The spacing between successive elements of X. */ | |||||
| /* > \endverbatim */ | |||||
| /* Authors: */ | |||||
| /* ======== */ | |||||
| /* > \author Univ. of Tennessee */ | |||||
| /* > \author Univ. of California Berkeley */ | |||||
| /* > \author Univ. of Colorado Denver */ | |||||
| /* > \author NAG Ltd. */ | |||||
| /* > \date December 2016 */ | |||||
| /* > \ingroup complexOTHERauxiliary */ | |||||
| /* ===================================================================== */ | |||||
| /* Subroutine */ int clacgv_(integer *n, complex *x, integer *incx) | |||||
| { | |||||
| /* System generated locals */ | |||||
| integer i__1, i__2; | |||||
| complex q__1; | |||||
| /* Local variables */ | |||||
| integer ioff, i__; | |||||
| /* -- LAPACK auxiliary routine (version 3.7.0) -- */ | |||||
| /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ | |||||
| /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ | |||||
| /* December 2016 */ | |||||
| /* ===================================================================== */ | |||||
| /* Parameter adjustments */ | |||||
| --x; | |||||
| /* Function Body */ | |||||
| if (*incx == 1) { | |||||
| i__1 = *n; | |||||
| for (i__ = 1; i__ <= i__1; ++i__) { | |||||
| i__2 = i__; | |||||
| r_cnjg(&q__1, &x[i__]); | |||||
| x[i__2].r = q__1.r, x[i__2].i = q__1.i; | |||||
| /* L10: */ | |||||
| } | |||||
| } else { | |||||
| ioff = 1; | |||||
| if (*incx < 0) { | |||||
| ioff = 1 - (*n - 1) * *incx; | |||||
| } | |||||
| i__1 = *n; | |||||
| for (i__ = 1; i__ <= i__1; ++i__) { | |||||
| i__2 = ioff; | |||||
| r_cnjg(&q__1, &x[ioff]); | |||||
| x[i__2].r = q__1.r, x[i__2].i = q__1.i; | |||||
| ioff += *incx; | |||||
| /* L20: */ | |||||
| } | |||||
| } | |||||
| return 0; | |||||
| /* End of CLACGV */ | |||||
| } /* clacgv_ */ | |||||
| @@ -0,0 +1,716 @@ | |||||
| /* f2c.h -- Standard Fortran to C header file */ | |||||
| /** barf [ba:rf] 2. "He suggested using FORTRAN, and everybody barfed." | |||||
| - From The Shogakukan DICTIONARY OF NEW ENGLISH (Second edition) */ | |||||
| #ifndef F2C_INCLUDE | |||||
| #define F2C_INCLUDE | |||||
| #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 | |||||
| typedef int 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; | |||||
| 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;} | |||||
| #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)); } | |||||
| #define c_div(c, a, b) {pCf(c) = Cf(a)/Cf(b);} | |||||
| #define z_div(c, a, b) {pCd(c) = Cd(a)/Cd(b);} | |||||
| #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) = conj(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) (cimag(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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotc_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void cdotu_(complex *z, integer *n_, complex *x, integer *incx_, complex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotu_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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) | |||||
| */ | |||||
| /* Table of constant values */ | |||||
| static integer c__1 = 1; | |||||
| /* > \brief \b CLACN2 estimates the 1-norm of a square matrix, using reverse communication for evaluating matr | |||||
| ix-vector products. */ | |||||
| /* =========== DOCUMENTATION =========== */ | |||||
| /* Online html documentation available at */ | |||||
| /* http://www.netlib.org/lapack/explore-html/ */ | |||||
| /* > \htmlonly */ | |||||
| /* > Download CLACN2 + dependencies */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/clacn2. | |||||
| f"> */ | |||||
| /* > [TGZ]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/clacn2. | |||||
| f"> */ | |||||
| /* > [ZIP]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/clacn2. | |||||
| f"> */ | |||||
| /* > [TXT]</a> */ | |||||
| /* > \endhtmlonly */ | |||||
| /* Definition: */ | |||||
| /* =========== */ | |||||
| /* SUBROUTINE CLACN2( N, V, X, EST, KASE, ISAVE ) */ | |||||
| /* INTEGER KASE, N */ | |||||
| /* REAL EST */ | |||||
| /* INTEGER ISAVE( 3 ) */ | |||||
| /* COMPLEX V( * ), X( * ) */ | |||||
| /* > \par Purpose: */ | |||||
| /* ============= */ | |||||
| /* > */ | |||||
| /* > \verbatim */ | |||||
| /* > */ | |||||
| /* > CLACN2 estimates the 1-norm of a square, complex matrix A. */ | |||||
| /* > Reverse communication is used for evaluating matrix-vector products. */ | |||||
| /* > \endverbatim */ | |||||
| /* Arguments: */ | |||||
| /* ========== */ | |||||
| /* > \param[in] N */ | |||||
| /* > \verbatim */ | |||||
| /* > N is INTEGER */ | |||||
| /* > The order of the matrix. N >= 1. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] V */ | |||||
| /* > \verbatim */ | |||||
| /* > V is COMPLEX array, dimension (N) */ | |||||
| /* > On the final return, V = A*W, where EST = norm(V)/norm(W) */ | |||||
| /* > (W is not returned). */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in,out] X */ | |||||
| /* > \verbatim */ | |||||
| /* > X is COMPLEX array, dimension (N) */ | |||||
| /* > On an intermediate return, X should be overwritten by */ | |||||
| /* > A * X, if KASE=1, */ | |||||
| /* > A**H * X, if KASE=2, */ | |||||
| /* > where A**H is the conjugate transpose of A, and CLACN2 must be */ | |||||
| /* > re-called with all the other parameters unchanged. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in,out] EST */ | |||||
| /* > \verbatim */ | |||||
| /* > EST is REAL */ | |||||
| /* > On entry with KASE = 1 or 2 and ISAVE(1) = 3, EST should be */ | |||||
| /* > unchanged from the previous call to CLACN2. */ | |||||
| /* > On exit, EST is an estimate (a lower bound) for norm(A). */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in,out] KASE */ | |||||
| /* > \verbatim */ | |||||
| /* > KASE is INTEGER */ | |||||
| /* > On the initial call to CLACN2, KASE should be 0. */ | |||||
| /* > On an intermediate return, KASE will be 1 or 2, indicating */ | |||||
| /* > whether X should be overwritten by A * X or A**H * X. */ | |||||
| /* > On the final return from CLACN2, KASE will again be 0. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in,out] ISAVE */ | |||||
| /* > \verbatim */ | |||||
| /* > ISAVE is INTEGER array, dimension (3) */ | |||||
| /* > ISAVE is used to save variables between calls to SLACN2 */ | |||||
| /* > \endverbatim */ | |||||
| /* Authors: */ | |||||
| /* ======== */ | |||||
| /* > \author Univ. of Tennessee */ | |||||
| /* > \author Univ. of California Berkeley */ | |||||
| /* > \author Univ. of Colorado Denver */ | |||||
| /* > \author NAG Ltd. */ | |||||
| /* > \date December 2016 */ | |||||
| /* > \ingroup complexOTHERauxiliary */ | |||||
| /* > \par Further Details: */ | |||||
| /* ===================== */ | |||||
| /* > */ | |||||
| /* > \verbatim */ | |||||
| /* > */ | |||||
| /* > Originally named CONEST, dated March 16, 1988. */ | |||||
| /* > */ | |||||
| /* > Last modified: April, 1999 */ | |||||
| /* > */ | |||||
| /* > This is a thread safe version of CLACON, which uses the array ISAVE */ | |||||
| /* > in place of a SAVE statement, as follows: */ | |||||
| /* > */ | |||||
| /* > CLACON CLACN2 */ | |||||
| /* > JUMP ISAVE(1) */ | |||||
| /* > J ISAVE(2) */ | |||||
| /* > ITER ISAVE(3) */ | |||||
| /* > \endverbatim */ | |||||
| /* > \par Contributors: */ | |||||
| /* ================== */ | |||||
| /* > */ | |||||
| /* > Nick Higham, University of Manchester */ | |||||
| /* > \par References: */ | |||||
| /* ================ */ | |||||
| /* > */ | |||||
| /* > N.J. Higham, "FORTRAN codes for estimating the one-norm of */ | |||||
| /* > a real or complex matrix, with applications to condition estimation", */ | |||||
| /* > ACM Trans. Math. Soft., vol. 14, no. 4, pp. 381-396, December 1988. */ | |||||
| /* > */ | |||||
| /* ===================================================================== */ | |||||
| /* Subroutine */ int clacn2_(integer *n, complex *v, complex *x, real *est, | |||||
| integer *kase, integer *isave) | |||||
| { | |||||
| /* System generated locals */ | |||||
| integer i__1, i__2, i__3; | |||||
| real r__1, r__2; | |||||
| complex q__1; | |||||
| /* Local variables */ | |||||
| real temp; | |||||
| integer i__; | |||||
| real absxi; | |||||
| integer jlast; | |||||
| extern /* Subroutine */ int ccopy_(integer *, complex *, integer *, | |||||
| complex *, integer *); | |||||
| extern integer icmax1_(integer *, complex *, integer *); | |||||
| extern real scsum1_(integer *, complex *, integer *), slamch_(char *); | |||||
| real safmin, altsgn, estold; | |||||
| /* -- LAPACK auxiliary routine (version 3.7.0) -- */ | |||||
| /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ | |||||
| /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ | |||||
| /* December 2016 */ | |||||
| /* ===================================================================== */ | |||||
| /* Parameter adjustments */ | |||||
| --isave; | |||||
| --x; | |||||
| --v; | |||||
| /* Function Body */ | |||||
| safmin = slamch_("Safe minimum"); | |||||
| if (*kase == 0) { | |||||
| i__1 = *n; | |||||
| for (i__ = 1; i__ <= i__1; ++i__) { | |||||
| i__2 = i__; | |||||
| r__1 = 1.f / (real) (*n); | |||||
| q__1.r = r__1, q__1.i = 0.f; | |||||
| x[i__2].r = q__1.r, x[i__2].i = q__1.i; | |||||
| /* L10: */ | |||||
| } | |||||
| *kase = 1; | |||||
| isave[1] = 1; | |||||
| return 0; | |||||
| } | |||||
| switch (isave[1]) { | |||||
| case 1: goto L20; | |||||
| case 2: goto L40; | |||||
| case 3: goto L70; | |||||
| case 4: goto L90; | |||||
| case 5: goto L120; | |||||
| } | |||||
| /* ................ ENTRY (ISAVE( 1 ) = 1) */ | |||||
| /* FIRST ITERATION. X HAS BEEN OVERWRITTEN BY A*X. */ | |||||
| L20: | |||||
| if (*n == 1) { | |||||
| v[1].r = x[1].r, v[1].i = x[1].i; | |||||
| *est = c_abs(&v[1]); | |||||
| /* ... QUIT */ | |||||
| goto L130; | |||||
| } | |||||
| *est = scsum1_(n, &x[1], &c__1); | |||||
| i__1 = *n; | |||||
| for (i__ = 1; i__ <= i__1; ++i__) { | |||||
| absxi = c_abs(&x[i__]); | |||||
| if (absxi > safmin) { | |||||
| i__2 = i__; | |||||
| i__3 = i__; | |||||
| r__1 = x[i__3].r / absxi; | |||||
| r__2 = r_imag(&x[i__]) / absxi; | |||||
| q__1.r = r__1, q__1.i = r__2; | |||||
| x[i__2].r = q__1.r, x[i__2].i = q__1.i; | |||||
| } else { | |||||
| i__2 = i__; | |||||
| x[i__2].r = 1.f, x[i__2].i = 0.f; | |||||
| } | |||||
| /* L30: */ | |||||
| } | |||||
| *kase = 2; | |||||
| isave[1] = 2; | |||||
| return 0; | |||||
| /* ................ ENTRY (ISAVE( 1 ) = 2) */ | |||||
| /* FIRST ITERATION. X HAS BEEN OVERWRITTEN BY CTRANS(A)*X. */ | |||||
| L40: | |||||
| isave[2] = icmax1_(n, &x[1], &c__1); | |||||
| isave[3] = 2; | |||||
| /* MAIN LOOP - ITERATIONS 2,3,...,ITMAX. */ | |||||
| L50: | |||||
| i__1 = *n; | |||||
| for (i__ = 1; i__ <= i__1; ++i__) { | |||||
| i__2 = i__; | |||||
| x[i__2].r = 0.f, x[i__2].i = 0.f; | |||||
| /* L60: */ | |||||
| } | |||||
| i__1 = isave[2]; | |||||
| x[i__1].r = 1.f, x[i__1].i = 0.f; | |||||
| *kase = 1; | |||||
| isave[1] = 3; | |||||
| return 0; | |||||
| /* ................ ENTRY (ISAVE( 1 ) = 3) */ | |||||
| /* X HAS BEEN OVERWRITTEN BY A*X. */ | |||||
| L70: | |||||
| ccopy_(n, &x[1], &c__1, &v[1], &c__1); | |||||
| estold = *est; | |||||
| *est = scsum1_(n, &v[1], &c__1); | |||||
| /* TEST FOR CYCLING. */ | |||||
| if (*est <= estold) { | |||||
| goto L100; | |||||
| } | |||||
| i__1 = *n; | |||||
| for (i__ = 1; i__ <= i__1; ++i__) { | |||||
| absxi = c_abs(&x[i__]); | |||||
| if (absxi > safmin) { | |||||
| i__2 = i__; | |||||
| i__3 = i__; | |||||
| r__1 = x[i__3].r / absxi; | |||||
| r__2 = r_imag(&x[i__]) / absxi; | |||||
| q__1.r = r__1, q__1.i = r__2; | |||||
| x[i__2].r = q__1.r, x[i__2].i = q__1.i; | |||||
| } else { | |||||
| i__2 = i__; | |||||
| x[i__2].r = 1.f, x[i__2].i = 0.f; | |||||
| } | |||||
| /* L80: */ | |||||
| } | |||||
| *kase = 2; | |||||
| isave[1] = 4; | |||||
| return 0; | |||||
| /* ................ ENTRY (ISAVE( 1 ) = 4) */ | |||||
| /* X HAS BEEN OVERWRITTEN BY CTRANS(A)*X. */ | |||||
| L90: | |||||
| jlast = isave[2]; | |||||
| isave[2] = icmax1_(n, &x[1], &c__1); | |||||
| if (c_abs(&x[jlast]) != c_abs(&x[isave[2]]) && isave[3] < 5) { | |||||
| ++isave[3]; | |||||
| goto L50; | |||||
| } | |||||
| /* ITERATION COMPLETE. FINAL STAGE. */ | |||||
| L100: | |||||
| altsgn = 1.f; | |||||
| i__1 = *n; | |||||
| for (i__ = 1; i__ <= i__1; ++i__) { | |||||
| i__2 = i__; | |||||
| r__1 = altsgn * ((real) (i__ - 1) / (real) (*n - 1) + 1.f); | |||||
| q__1.r = r__1, q__1.i = 0.f; | |||||
| x[i__2].r = q__1.r, x[i__2].i = q__1.i; | |||||
| altsgn = -altsgn; | |||||
| /* L110: */ | |||||
| } | |||||
| *kase = 1; | |||||
| isave[1] = 5; | |||||
| return 0; | |||||
| /* ................ ENTRY (ISAVE( 1 ) = 5) */ | |||||
| /* X HAS BEEN OVERWRITTEN BY A*X. */ | |||||
| L120: | |||||
| temp = scsum1_(n, &x[1], &c__1) / (real) (*n * 3) * 2.f; | |||||
| if (temp > *est) { | |||||
| ccopy_(n, &x[1], &c__1, &v[1], &c__1); | |||||
| *est = temp; | |||||
| } | |||||
| L130: | |||||
| *kase = 0; | |||||
| return 0; | |||||
| /* End of CLACN2 */ | |||||
| } /* clacn2_ */ | |||||
| @@ -0,0 +1,697 @@ | |||||
| /* f2c.h -- Standard Fortran to C header file */ | |||||
| /** barf [ba:rf] 2. "He suggested using FORTRAN, and everybody barfed." | |||||
| - From The Shogakukan DICTIONARY OF NEW ENGLISH (Second edition) */ | |||||
| #ifndef F2C_INCLUDE | |||||
| #define F2C_INCLUDE | |||||
| #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 | |||||
| typedef int 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; | |||||
| 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;} | |||||
| #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)); } | |||||
| #define c_div(c, a, b) {pCf(c) = Cf(a)/Cf(b);} | |||||
| #define z_div(c, a, b) {pCd(c) = Cd(a)/Cd(b);} | |||||
| #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) = conj(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) (cimag(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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotc_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void cdotu_(complex *z, integer *n_, complex *x, integer *incx_, complex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotu_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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) | |||||
| */ | |||||
| /* Table of constant values */ | |||||
| static integer c__1 = 1; | |||||
| /* > \brief \b CLACON estimates the 1-norm of a square matrix, using reverse communication for evaluating matr | |||||
| ix-vector products. */ | |||||
| /* =========== DOCUMENTATION =========== */ | |||||
| /* Online html documentation available at */ | |||||
| /* http://www.netlib.org/lapack/explore-html/ */ | |||||
| /* > \htmlonly */ | |||||
| /* > Download CLACON + dependencies */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/clacon. | |||||
| f"> */ | |||||
| /* > [TGZ]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/clacon. | |||||
| f"> */ | |||||
| /* > [ZIP]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/clacon. | |||||
| f"> */ | |||||
| /* > [TXT]</a> */ | |||||
| /* > \endhtmlonly */ | |||||
| /* Definition: */ | |||||
| /* =========== */ | |||||
| /* SUBROUTINE CLACON( N, V, X, EST, KASE ) */ | |||||
| /* INTEGER KASE, N */ | |||||
| /* REAL EST */ | |||||
| /* COMPLEX V( N ), X( N ) */ | |||||
| /* > \par Purpose: */ | |||||
| /* ============= */ | |||||
| /* > */ | |||||
| /* > \verbatim */ | |||||
| /* > */ | |||||
| /* > CLACON estimates the 1-norm of a square, complex matrix A. */ | |||||
| /* > Reverse communication is used for evaluating matrix-vector products. */ | |||||
| /* > \endverbatim */ | |||||
| /* Arguments: */ | |||||
| /* ========== */ | |||||
| /* > \param[in] N */ | |||||
| /* > \verbatim */ | |||||
| /* > N is INTEGER */ | |||||
| /* > The order of the matrix. N >= 1. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] V */ | |||||
| /* > \verbatim */ | |||||
| /* > V is COMPLEX array, dimension (N) */ | |||||
| /* > On the final return, V = A*W, where EST = norm(V)/norm(W) */ | |||||
| /* > (W is not returned). */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in,out] X */ | |||||
| /* > \verbatim */ | |||||
| /* > X is COMPLEX array, dimension (N) */ | |||||
| /* > On an intermediate return, X should be overwritten by */ | |||||
| /* > A * X, if KASE=1, */ | |||||
| /* > A**H * X, if KASE=2, */ | |||||
| /* > where A**H is the conjugate transpose of A, and CLACON must be */ | |||||
| /* > re-called with all the other parameters unchanged. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in,out] EST */ | |||||
| /* > \verbatim */ | |||||
| /* > EST is REAL */ | |||||
| /* > On entry with KASE = 1 or 2 and JUMP = 3, EST should be */ | |||||
| /* > unchanged from the previous call to CLACON. */ | |||||
| /* > On exit, EST is an estimate (a lower bound) for norm(A). */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in,out] KASE */ | |||||
| /* > \verbatim */ | |||||
| /* > KASE is INTEGER */ | |||||
| /* > On the initial call to CLACON, KASE should be 0. */ | |||||
| /* > On an intermediate return, KASE will be 1 or 2, indicating */ | |||||
| /* > whether X should be overwritten by A * X or A**H * X. */ | |||||
| /* > On the final return from CLACON, KASE will again be 0. */ | |||||
| /* > \endverbatim */ | |||||
| /* Authors: */ | |||||
| /* ======== */ | |||||
| /* > \author Univ. of Tennessee */ | |||||
| /* > \author Univ. of California Berkeley */ | |||||
| /* > \author Univ. of Colorado Denver */ | |||||
| /* > \author NAG Ltd. */ | |||||
| /* > \date December 2016 */ | |||||
| /* > \ingroup complexOTHERauxiliary */ | |||||
| /* > \par Further Details: */ | |||||
| /* ===================== */ | |||||
| /* > */ | |||||
| /* > Originally named CONEST, dated March 16, 1988. \n */ | |||||
| /* > Last modified: April, 1999 */ | |||||
| /* > \par Contributors: */ | |||||
| /* ================== */ | |||||
| /* > */ | |||||
| /* > Nick Higham, University of Manchester */ | |||||
| /* > \par References: */ | |||||
| /* ================ */ | |||||
| /* > */ | |||||
| /* > N.J. Higham, "FORTRAN codes for estimating the one-norm of */ | |||||
| /* > a real or complex matrix, with applications to condition estimation", */ | |||||
| /* > ACM Trans. Math. Soft., vol. 14, no. 4, pp. 381-396, December 1988. */ | |||||
| /* > */ | |||||
| /* ===================================================================== */ | |||||
| /* Subroutine */ int clacon_(integer *n, complex *v, complex *x, real *est, | |||||
| integer *kase) | |||||
| { | |||||
| /* System generated locals */ | |||||
| integer i__1, i__2, i__3; | |||||
| real r__1, r__2; | |||||
| complex q__1; | |||||
| /* Local variables */ | |||||
| static integer iter; | |||||
| static real temp; | |||||
| static integer jump, i__, j; | |||||
| static real absxi; | |||||
| static integer jlast; | |||||
| extern /* Subroutine */ int ccopy_(integer *, complex *, integer *, | |||||
| complex *, integer *); | |||||
| extern integer icmax1_(integer *, complex *, integer *); | |||||
| extern real scsum1_(integer *, complex *, integer *), slamch_(char *); | |||||
| static real safmin, altsgn, estold; | |||||
| /* -- LAPACK auxiliary routine (version 3.7.0) -- */ | |||||
| /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ | |||||
| /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ | |||||
| /* December 2016 */ | |||||
| /* ===================================================================== */ | |||||
| /* Parameter adjustments */ | |||||
| --x; | |||||
| --v; | |||||
| /* Function Body */ | |||||
| safmin = slamch_("Safe minimum"); | |||||
| if (*kase == 0) { | |||||
| i__1 = *n; | |||||
| for (i__ = 1; i__ <= i__1; ++i__) { | |||||
| i__2 = i__; | |||||
| r__1 = 1.f / (real) (*n); | |||||
| q__1.r = r__1, q__1.i = 0.f; | |||||
| x[i__2].r = q__1.r, x[i__2].i = q__1.i; | |||||
| /* L10: */ | |||||
| } | |||||
| *kase = 1; | |||||
| jump = 1; | |||||
| return 0; | |||||
| } | |||||
| switch (jump) { | |||||
| case 1: goto L20; | |||||
| case 2: goto L40; | |||||
| case 3: goto L70; | |||||
| case 4: goto L90; | |||||
| case 5: goto L120; | |||||
| } | |||||
| /* ................ ENTRY (JUMP = 1) */ | |||||
| /* FIRST ITERATION. X HAS BEEN OVERWRITTEN BY A*X. */ | |||||
| L20: | |||||
| if (*n == 1) { | |||||
| v[1].r = x[1].r, v[1].i = x[1].i; | |||||
| *est = c_abs(&v[1]); | |||||
| /* ... QUIT */ | |||||
| goto L130; | |||||
| } | |||||
| *est = scsum1_(n, &x[1], &c__1); | |||||
| i__1 = *n; | |||||
| for (i__ = 1; i__ <= i__1; ++i__) { | |||||
| absxi = c_abs(&x[i__]); | |||||
| if (absxi > safmin) { | |||||
| i__2 = i__; | |||||
| i__3 = i__; | |||||
| r__1 = x[i__3].r / absxi; | |||||
| r__2 = r_imag(&x[i__]) / absxi; | |||||
| q__1.r = r__1, q__1.i = r__2; | |||||
| x[i__2].r = q__1.r, x[i__2].i = q__1.i; | |||||
| } else { | |||||
| i__2 = i__; | |||||
| x[i__2].r = 1.f, x[i__2].i = 0.f; | |||||
| } | |||||
| /* L30: */ | |||||
| } | |||||
| *kase = 2; | |||||
| jump = 2; | |||||
| return 0; | |||||
| /* ................ ENTRY (JUMP = 2) */ | |||||
| /* FIRST ITERATION. X HAS BEEN OVERWRITTEN BY CTRANS(A)*X. */ | |||||
| L40: | |||||
| j = icmax1_(n, &x[1], &c__1); | |||||
| iter = 2; | |||||
| /* MAIN LOOP - ITERATIONS 2,3,...,ITMAX. */ | |||||
| L50: | |||||
| i__1 = *n; | |||||
| for (i__ = 1; i__ <= i__1; ++i__) { | |||||
| i__2 = i__; | |||||
| x[i__2].r = 0.f, x[i__2].i = 0.f; | |||||
| /* L60: */ | |||||
| } | |||||
| i__1 = j; | |||||
| x[i__1].r = 1.f, x[i__1].i = 0.f; | |||||
| *kase = 1; | |||||
| jump = 3; | |||||
| return 0; | |||||
| /* ................ ENTRY (JUMP = 3) */ | |||||
| /* X HAS BEEN OVERWRITTEN BY A*X. */ | |||||
| L70: | |||||
| ccopy_(n, &x[1], &c__1, &v[1], &c__1); | |||||
| estold = *est; | |||||
| *est = scsum1_(n, &v[1], &c__1); | |||||
| /* TEST FOR CYCLING. */ | |||||
| if (*est <= estold) { | |||||
| goto L100; | |||||
| } | |||||
| i__1 = *n; | |||||
| for (i__ = 1; i__ <= i__1; ++i__) { | |||||
| absxi = c_abs(&x[i__]); | |||||
| if (absxi > safmin) { | |||||
| i__2 = i__; | |||||
| i__3 = i__; | |||||
| r__1 = x[i__3].r / absxi; | |||||
| r__2 = r_imag(&x[i__]) / absxi; | |||||
| q__1.r = r__1, q__1.i = r__2; | |||||
| x[i__2].r = q__1.r, x[i__2].i = q__1.i; | |||||
| } else { | |||||
| i__2 = i__; | |||||
| x[i__2].r = 1.f, x[i__2].i = 0.f; | |||||
| } | |||||
| /* L80: */ | |||||
| } | |||||
| *kase = 2; | |||||
| jump = 4; | |||||
| return 0; | |||||
| /* ................ ENTRY (JUMP = 4) */ | |||||
| /* X HAS BEEN OVERWRITTEN BY CTRANS(A)*X. */ | |||||
| L90: | |||||
| jlast = j; | |||||
| j = icmax1_(n, &x[1], &c__1); | |||||
| if (c_abs(&x[jlast]) != c_abs(&x[j]) && iter < 5) { | |||||
| ++iter; | |||||
| goto L50; | |||||
| } | |||||
| /* ITERATION COMPLETE. FINAL STAGE. */ | |||||
| L100: | |||||
| altsgn = 1.f; | |||||
| i__1 = *n; | |||||
| for (i__ = 1; i__ <= i__1; ++i__) { | |||||
| i__2 = i__; | |||||
| r__1 = altsgn * ((real) (i__ - 1) / (real) (*n - 1) + 1.f); | |||||
| q__1.r = r__1, q__1.i = 0.f; | |||||
| x[i__2].r = q__1.r, x[i__2].i = q__1.i; | |||||
| altsgn = -altsgn; | |||||
| /* L110: */ | |||||
| } | |||||
| *kase = 1; | |||||
| jump = 5; | |||||
| return 0; | |||||
| /* ................ ENTRY (JUMP = 5) */ | |||||
| /* X HAS BEEN OVERWRITTEN BY A*X. */ | |||||
| L120: | |||||
| temp = scsum1_(n, &x[1], &c__1) / (real) (*n * 3) * 2.f; | |||||
| if (temp > *est) { | |||||
| ccopy_(n, &x[1], &c__1, &v[1], &c__1); | |||||
| *est = temp; | |||||
| } | |||||
| L130: | |||||
| *kase = 0; | |||||
| return 0; | |||||
| /* End of CLACON */ | |||||
| } /* clacon_ */ | |||||
| @@ -0,0 +1,566 @@ | |||||
| /* f2c.h -- Standard Fortran to C header file */ | |||||
| /** barf [ba:rf] 2. "He suggested using FORTRAN, and everybody barfed." | |||||
| - From The Shogakukan DICTIONARY OF NEW ENGLISH (Second edition) */ | |||||
| #ifndef F2C_INCLUDE | |||||
| #define F2C_INCLUDE | |||||
| #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 | |||||
| typedef int 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; | |||||
| 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;} | |||||
| #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)); } | |||||
| #define c_div(c, a, b) {pCf(c) = Cf(a)/Cf(b);} | |||||
| #define z_div(c, a, b) {pCd(c) = Cd(a)/Cd(b);} | |||||
| #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) = conj(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) (cimag(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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotc_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void cdotu_(complex *z, integer *n_, complex *x, integer *incx_, complex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotu_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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) | |||||
| */ | |||||
| /* > \brief \b CLACP2 copies all or part of a real two-dimensional array to a complex array. */ | |||||
| /* =========== DOCUMENTATION =========== */ | |||||
| /* Online html documentation available at */ | |||||
| /* http://www.netlib.org/lapack/explore-html/ */ | |||||
| /* > \htmlonly */ | |||||
| /* > Download CLACP2 + dependencies */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/clacp2. | |||||
| f"> */ | |||||
| /* > [TGZ]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/clacp2. | |||||
| f"> */ | |||||
| /* > [ZIP]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/clacp2. | |||||
| f"> */ | |||||
| /* > [TXT]</a> */ | |||||
| /* > \endhtmlonly */ | |||||
| /* Definition: */ | |||||
| /* =========== */ | |||||
| /* SUBROUTINE CLACP2( UPLO, M, N, A, LDA, B, LDB ) */ | |||||
| /* CHARACTER UPLO */ | |||||
| /* INTEGER LDA, LDB, M, N */ | |||||
| /* REAL A( LDA, * ) */ | |||||
| /* COMPLEX B( LDB, * ) */ | |||||
| /* > \par Purpose: */ | |||||
| /* ============= */ | |||||
| /* > */ | |||||
| /* > \verbatim */ | |||||
| /* > */ | |||||
| /* > CLACP2 copies all or part of a real two-dimensional matrix A to a */ | |||||
| /* > complex matrix B. */ | |||||
| /* > \endverbatim */ | |||||
| /* Arguments: */ | |||||
| /* ========== */ | |||||
| /* > \param[in] UPLO */ | |||||
| /* > \verbatim */ | |||||
| /* > UPLO is CHARACTER*1 */ | |||||
| /* > Specifies the part of the matrix A to be copied to B. */ | |||||
| /* > = 'U': Upper triangular part */ | |||||
| /* > = 'L': Lower triangular part */ | |||||
| /* > Otherwise: All of the matrix A */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] M */ | |||||
| /* > \verbatim */ | |||||
| /* > M is INTEGER */ | |||||
| /* > The number of rows of the matrix A. M >= 0. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] N */ | |||||
| /* > \verbatim */ | |||||
| /* > N is INTEGER */ | |||||
| /* > The number of columns of the matrix A. N >= 0. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] A */ | |||||
| /* > \verbatim */ | |||||
| /* > A is REAL array, dimension (LDA,N) */ | |||||
| /* > The m by n matrix A. If UPLO = 'U', only the upper trapezium */ | |||||
| /* > is accessed; if UPLO = 'L', only the lower trapezium is */ | |||||
| /* > accessed. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] LDA */ | |||||
| /* > \verbatim */ | |||||
| /* > LDA is INTEGER */ | |||||
| /* > The leading dimension of the array A. LDA >= f2cmax(1,M). */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] B */ | |||||
| /* > \verbatim */ | |||||
| /* > B is COMPLEX array, dimension (LDB,N) */ | |||||
| /* > On exit, B = A in the locations specified by UPLO. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] LDB */ | |||||
| /* > \verbatim */ | |||||
| /* > LDB is INTEGER */ | |||||
| /* > The leading dimension of the array B. LDB >= f2cmax(1,M). */ | |||||
| /* > \endverbatim */ | |||||
| /* Authors: */ | |||||
| /* ======== */ | |||||
| /* > \author Univ. of Tennessee */ | |||||
| /* > \author Univ. of California Berkeley */ | |||||
| /* > \author Univ. of Colorado Denver */ | |||||
| /* > \author NAG Ltd. */ | |||||
| /* > \date December 2016 */ | |||||
| /* > \ingroup complexOTHERauxiliary */ | |||||
| /* ===================================================================== */ | |||||
| /* Subroutine */ int clacp2_(char *uplo, integer *m, integer *n, real *a, | |||||
| integer *lda, complex *b, integer *ldb) | |||||
| { | |||||
| /* System generated locals */ | |||||
| integer a_dim1, a_offset, b_dim1, b_offset, i__1, i__2, i__3, i__4; | |||||
| /* Local variables */ | |||||
| integer i__, j; | |||||
| extern logical lsame_(char *, char *); | |||||
| /* -- LAPACK auxiliary routine (version 3.7.0) -- */ | |||||
| /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ | |||||
| /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ | |||||
| /* December 2016 */ | |||||
| /* ===================================================================== */ | |||||
| /* Parameter adjustments */ | |||||
| a_dim1 = *lda; | |||||
| a_offset = 1 + a_dim1 * 1; | |||||
| a -= a_offset; | |||||
| b_dim1 = *ldb; | |||||
| b_offset = 1 + b_dim1 * 1; | |||||
| b -= b_offset; | |||||
| /* Function Body */ | |||||
| if (lsame_(uplo, "U")) { | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| i__2 = f2cmin(j,*m); | |||||
| for (i__ = 1; i__ <= i__2; ++i__) { | |||||
| i__3 = i__ + j * b_dim1; | |||||
| i__4 = i__ + j * a_dim1; | |||||
| b[i__3].r = a[i__4], b[i__3].i = 0.f; | |||||
| /* L10: */ | |||||
| } | |||||
| /* L20: */ | |||||
| } | |||||
| } else if (lsame_(uplo, "L")) { | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| i__2 = *m; | |||||
| for (i__ = j; i__ <= i__2; ++i__) { | |||||
| i__3 = i__ + j * b_dim1; | |||||
| i__4 = i__ + j * a_dim1; | |||||
| b[i__3].r = a[i__4], b[i__3].i = 0.f; | |||||
| /* L30: */ | |||||
| } | |||||
| /* L40: */ | |||||
| } | |||||
| } else { | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| i__2 = *m; | |||||
| for (i__ = 1; i__ <= i__2; ++i__) { | |||||
| i__3 = i__ + j * b_dim1; | |||||
| i__4 = i__ + j * a_dim1; | |||||
| b[i__3].r = a[i__4], b[i__3].i = 0.f; | |||||
| /* L50: */ | |||||
| } | |||||
| /* L60: */ | |||||
| } | |||||
| } | |||||
| return 0; | |||||
| /* End of CLACP2 */ | |||||
| } /* clacp2_ */ | |||||
| @@ -0,0 +1,565 @@ | |||||
| /* f2c.h -- Standard Fortran to C header file */ | |||||
| /** barf [ba:rf] 2. "He suggested using FORTRAN, and everybody barfed." | |||||
| - From The Shogakukan DICTIONARY OF NEW ENGLISH (Second edition) */ | |||||
| #ifndef F2C_INCLUDE | |||||
| #define F2C_INCLUDE | |||||
| #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 | |||||
| typedef int 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; | |||||
| 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;} | |||||
| #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)); } | |||||
| #define c_div(c, a, b) {pCf(c) = Cf(a)/Cf(b);} | |||||
| #define z_div(c, a, b) {pCd(c) = Cd(a)/Cd(b);} | |||||
| #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) = conj(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) (cimag(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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotc_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void cdotu_(complex *z, integer *n_, complex *x, integer *incx_, complex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotu_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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) | |||||
| */ | |||||
| /* > \brief \b CLACPY copies all or part of one two-dimensional array to another. */ | |||||
| /* =========== DOCUMENTATION =========== */ | |||||
| /* Online html documentation available at */ | |||||
| /* http://www.netlib.org/lapack/explore-html/ */ | |||||
| /* > \htmlonly */ | |||||
| /* > Download CLACPY + dependencies */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/clacpy. | |||||
| f"> */ | |||||
| /* > [TGZ]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/clacpy. | |||||
| f"> */ | |||||
| /* > [ZIP]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/clacpy. | |||||
| f"> */ | |||||
| /* > [TXT]</a> */ | |||||
| /* > \endhtmlonly */ | |||||
| /* Definition: */ | |||||
| /* =========== */ | |||||
| /* SUBROUTINE CLACPY( UPLO, M, N, A, LDA, B, LDB ) */ | |||||
| /* CHARACTER UPLO */ | |||||
| /* INTEGER LDA, LDB, M, N */ | |||||
| /* COMPLEX A( LDA, * ), B( LDB, * ) */ | |||||
| /* > \par Purpose: */ | |||||
| /* ============= */ | |||||
| /* > */ | |||||
| /* > \verbatim */ | |||||
| /* > */ | |||||
| /* > CLACPY copies all or part of a two-dimensional matrix A to another */ | |||||
| /* > matrix B. */ | |||||
| /* > \endverbatim */ | |||||
| /* Arguments: */ | |||||
| /* ========== */ | |||||
| /* > \param[in] UPLO */ | |||||
| /* > \verbatim */ | |||||
| /* > UPLO is CHARACTER*1 */ | |||||
| /* > Specifies the part of the matrix A to be copied to B. */ | |||||
| /* > = 'U': Upper triangular part */ | |||||
| /* > = 'L': Lower triangular part */ | |||||
| /* > Otherwise: All of the matrix A */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] M */ | |||||
| /* > \verbatim */ | |||||
| /* > M is INTEGER */ | |||||
| /* > The number of rows of the matrix A. M >= 0. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] N */ | |||||
| /* > \verbatim */ | |||||
| /* > N is INTEGER */ | |||||
| /* > The number of columns of the matrix A. N >= 0. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] A */ | |||||
| /* > \verbatim */ | |||||
| /* > A is COMPLEX array, dimension (LDA,N) */ | |||||
| /* > The m by n matrix A. If UPLO = 'U', only the upper trapezium */ | |||||
| /* > is accessed; if UPLO = 'L', only the lower trapezium is */ | |||||
| /* > accessed. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] LDA */ | |||||
| /* > \verbatim */ | |||||
| /* > LDA is INTEGER */ | |||||
| /* > The leading dimension of the array A. LDA >= f2cmax(1,M). */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] B */ | |||||
| /* > \verbatim */ | |||||
| /* > B is COMPLEX array, dimension (LDB,N) */ | |||||
| /* > On exit, B = A in the locations specified by UPLO. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] LDB */ | |||||
| /* > \verbatim */ | |||||
| /* > LDB is INTEGER */ | |||||
| /* > The leading dimension of the array B. LDB >= f2cmax(1,M). */ | |||||
| /* > \endverbatim */ | |||||
| /* Authors: */ | |||||
| /* ======== */ | |||||
| /* > \author Univ. of Tennessee */ | |||||
| /* > \author Univ. of California Berkeley */ | |||||
| /* > \author Univ. of Colorado Denver */ | |||||
| /* > \author NAG Ltd. */ | |||||
| /* > \date December 2016 */ | |||||
| /* > \ingroup complexOTHERauxiliary */ | |||||
| /* ===================================================================== */ | |||||
| /* Subroutine */ int clacpy_(char *uplo, integer *m, integer *n, complex *a, | |||||
| integer *lda, complex *b, integer *ldb) | |||||
| { | |||||
| /* System generated locals */ | |||||
| integer a_dim1, a_offset, b_dim1, b_offset, i__1, i__2, i__3, i__4; | |||||
| /* Local variables */ | |||||
| integer i__, j; | |||||
| extern logical lsame_(char *, char *); | |||||
| /* -- LAPACK auxiliary routine (version 3.7.0) -- */ | |||||
| /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ | |||||
| /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ | |||||
| /* December 2016 */ | |||||
| /* ===================================================================== */ | |||||
| /* Parameter adjustments */ | |||||
| a_dim1 = *lda; | |||||
| a_offset = 1 + a_dim1 * 1; | |||||
| a -= a_offset; | |||||
| b_dim1 = *ldb; | |||||
| b_offset = 1 + b_dim1 * 1; | |||||
| b -= b_offset; | |||||
| /* Function Body */ | |||||
| if (lsame_(uplo, "U")) { | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| i__2 = f2cmin(j,*m); | |||||
| for (i__ = 1; i__ <= i__2; ++i__) { | |||||
| i__3 = i__ + j * b_dim1; | |||||
| i__4 = i__ + j * a_dim1; | |||||
| b[i__3].r = a[i__4].r, b[i__3].i = a[i__4].i; | |||||
| /* L10: */ | |||||
| } | |||||
| /* L20: */ | |||||
| } | |||||
| } else if (lsame_(uplo, "L")) { | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| i__2 = *m; | |||||
| for (i__ = j; i__ <= i__2; ++i__) { | |||||
| i__3 = i__ + j * b_dim1; | |||||
| i__4 = i__ + j * a_dim1; | |||||
| b[i__3].r = a[i__4].r, b[i__3].i = a[i__4].i; | |||||
| /* L30: */ | |||||
| } | |||||
| /* L40: */ | |||||
| } | |||||
| } else { | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| i__2 = *m; | |||||
| for (i__ = 1; i__ <= i__2; ++i__) { | |||||
| i__3 = i__ + j * b_dim1; | |||||
| i__4 = i__ + j * a_dim1; | |||||
| b[i__3].r = a[i__4].r, b[i__3].i = a[i__4].i; | |||||
| /* L50: */ | |||||
| } | |||||
| /* L60: */ | |||||
| } | |||||
| } | |||||
| return 0; | |||||
| /* End of CLACPY */ | |||||
| } /* clacpy_ */ | |||||
| @@ -0,0 +1,608 @@ | |||||
| /* f2c.h -- Standard Fortran to C header file */ | |||||
| /** barf [ba:rf] 2. "He suggested using FORTRAN, and everybody barfed." | |||||
| - From The Shogakukan DICTIONARY OF NEW ENGLISH (Second edition) */ | |||||
| #ifndef F2C_INCLUDE | |||||
| #define F2C_INCLUDE | |||||
| #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 | |||||
| typedef int 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; | |||||
| 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;} | |||||
| #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)); } | |||||
| #define c_div(c, a, b) {pCf(c) = Cf(a)/Cf(b);} | |||||
| #define z_div(c, a, b) {pCd(c) = Cd(a)/Cd(b);} | |||||
| #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) = conj(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) (cimag(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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotc_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void cdotu_(complex *z, integer *n_, complex *x, integer *incx_, complex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotu_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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) | |||||
| */ | |||||
| /* Table of constant values */ | |||||
| static real c_b6 = 1.f; | |||||
| static real c_b7 = 0.f; | |||||
| /* > \brief \b CLACRM multiplies a complex matrix by a square real matrix. */ | |||||
| /* =========== DOCUMENTATION =========== */ | |||||
| /* Online html documentation available at */ | |||||
| /* http://www.netlib.org/lapack/explore-html/ */ | |||||
| /* > \htmlonly */ | |||||
| /* > Download CLACRM + dependencies */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/clacrm. | |||||
| f"> */ | |||||
| /* > [TGZ]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/clacrm. | |||||
| f"> */ | |||||
| /* > [ZIP]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/clacrm. | |||||
| f"> */ | |||||
| /* > [TXT]</a> */ | |||||
| /* > \endhtmlonly */ | |||||
| /* Definition: */ | |||||
| /* =========== */ | |||||
| /* SUBROUTINE CLACRM( M, N, A, LDA, B, LDB, C, LDC, RWORK ) */ | |||||
| /* INTEGER LDA, LDB, LDC, M, N */ | |||||
| /* REAL B( LDB, * ), RWORK( * ) */ | |||||
| /* COMPLEX A( LDA, * ), C( LDC, * ) */ | |||||
| /* > \par Purpose: */ | |||||
| /* ============= */ | |||||
| /* > */ | |||||
| /* > \verbatim */ | |||||
| /* > */ | |||||
| /* > CLACRM performs a very simple matrix-matrix multiplication: */ | |||||
| /* > C := A * B, */ | |||||
| /* > where A is M by N and complex; B is N by N and real; */ | |||||
| /* > C is M by N and complex. */ | |||||
| /* > \endverbatim */ | |||||
| /* Arguments: */ | |||||
| /* ========== */ | |||||
| /* > \param[in] M */ | |||||
| /* > \verbatim */ | |||||
| /* > M is INTEGER */ | |||||
| /* > The number of rows of the matrix A and of the matrix C. */ | |||||
| /* > M >= 0. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] N */ | |||||
| /* > \verbatim */ | |||||
| /* > N is INTEGER */ | |||||
| /* > The number of columns and rows of the matrix B and */ | |||||
| /* > the number of columns of the matrix C. */ | |||||
| /* > N >= 0. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] A */ | |||||
| /* > \verbatim */ | |||||
| /* > A is COMPLEX array, dimension (LDA, N) */ | |||||
| /* > On entry, A contains the M by N matrix A. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] LDA */ | |||||
| /* > \verbatim */ | |||||
| /* > LDA is INTEGER */ | |||||
| /* > The leading dimension of the array A. LDA >=f2cmax(1,M). */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] B */ | |||||
| /* > \verbatim */ | |||||
| /* > B is REAL array, dimension (LDB, N) */ | |||||
| /* > On entry, B contains the N by N matrix B. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] LDB */ | |||||
| /* > \verbatim */ | |||||
| /* > LDB is INTEGER */ | |||||
| /* > The leading dimension of the array B. LDB >=f2cmax(1,N). */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] C */ | |||||
| /* > \verbatim */ | |||||
| /* > C is COMPLEX array, dimension (LDC, N) */ | |||||
| /* > On exit, C contains the M by N matrix C. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] LDC */ | |||||
| /* > \verbatim */ | |||||
| /* > LDC is INTEGER */ | |||||
| /* > The leading dimension of the array C. LDC >=f2cmax(1,N). */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] RWORK */ | |||||
| /* > \verbatim */ | |||||
| /* > RWORK is REAL array, dimension (2*M*N) */ | |||||
| /* > \endverbatim */ | |||||
| /* Authors: */ | |||||
| /* ======== */ | |||||
| /* > \author Univ. of Tennessee */ | |||||
| /* > \author Univ. of California Berkeley */ | |||||
| /* > \author Univ. of Colorado Denver */ | |||||
| /* > \author NAG Ltd. */ | |||||
| /* > \date December 2016 */ | |||||
| /* > \ingroup complexOTHERauxiliary */ | |||||
| /* ===================================================================== */ | |||||
| /* Subroutine */ int clacrm_(integer *m, integer *n, complex *a, integer *lda, | |||||
| real *b, integer *ldb, complex *c__, integer *ldc, real *rwork) | |||||
| { | |||||
| /* System generated locals */ | |||||
| integer b_dim1, b_offset, a_dim1, a_offset, c_dim1, c_offset, i__1, i__2, | |||||
| i__3, i__4, i__5; | |||||
| real r__1; | |||||
| complex q__1; | |||||
| /* Local variables */ | |||||
| integer i__, j, l; | |||||
| extern /* Subroutine */ int sgemm_(char *, char *, integer *, integer *, | |||||
| integer *, real *, real *, integer *, real *, integer *, real *, | |||||
| real *, integer *); | |||||
| /* -- LAPACK auxiliary routine (version 3.7.0) -- */ | |||||
| /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ | |||||
| /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ | |||||
| /* December 2016 */ | |||||
| /* ===================================================================== */ | |||||
| /* Quick return if possible. */ | |||||
| /* Parameter adjustments */ | |||||
| a_dim1 = *lda; | |||||
| a_offset = 1 + a_dim1 * 1; | |||||
| a -= a_offset; | |||||
| b_dim1 = *ldb; | |||||
| b_offset = 1 + b_dim1 * 1; | |||||
| b -= b_offset; | |||||
| c_dim1 = *ldc; | |||||
| c_offset = 1 + c_dim1 * 1; | |||||
| c__ -= c_offset; | |||||
| --rwork; | |||||
| /* Function Body */ | |||||
| if (*m == 0 || *n == 0) { | |||||
| return 0; | |||||
| } | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| i__2 = *m; | |||||
| for (i__ = 1; i__ <= i__2; ++i__) { | |||||
| i__3 = i__ + j * a_dim1; | |||||
| rwork[(j - 1) * *m + i__] = a[i__3].r; | |||||
| /* L10: */ | |||||
| } | |||||
| /* L20: */ | |||||
| } | |||||
| l = *m * *n + 1; | |||||
| sgemm_("N", "N", m, n, n, &c_b6, &rwork[1], m, &b[b_offset], ldb, &c_b7, & | |||||
| rwork[l], m); | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| i__2 = *m; | |||||
| for (i__ = 1; i__ <= i__2; ++i__) { | |||||
| i__3 = i__ + j * c_dim1; | |||||
| i__4 = l + (j - 1) * *m + i__ - 1; | |||||
| c__[i__3].r = rwork[i__4], c__[i__3].i = 0.f; | |||||
| /* L30: */ | |||||
| } | |||||
| /* L40: */ | |||||
| } | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| i__2 = *m; | |||||
| for (i__ = 1; i__ <= i__2; ++i__) { | |||||
| rwork[(j - 1) * *m + i__] = r_imag(&a[i__ + j * a_dim1]); | |||||
| /* L50: */ | |||||
| } | |||||
| /* L60: */ | |||||
| } | |||||
| sgemm_("N", "N", m, n, n, &c_b6, &rwork[1], m, &b[b_offset], ldb, &c_b7, & | |||||
| rwork[l], m); | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| i__2 = *m; | |||||
| for (i__ = 1; i__ <= i__2; ++i__) { | |||||
| i__3 = i__ + j * c_dim1; | |||||
| i__4 = i__ + j * c_dim1; | |||||
| r__1 = c__[i__4].r; | |||||
| i__5 = l + (j - 1) * *m + i__ - 1; | |||||
| q__1.r = r__1, q__1.i = rwork[i__5]; | |||||
| c__[i__3].r = q__1.r, c__[i__3].i = q__1.i; | |||||
| /* L70: */ | |||||
| } | |||||
| /* L80: */ | |||||
| } | |||||
| return 0; | |||||
| /* End of CLACRM */ | |||||
| } /* clacrm_ */ | |||||
| @@ -0,0 +1,592 @@ | |||||
| /* f2c.h -- Standard Fortran to C header file */ | |||||
| /** barf [ba:rf] 2. "He suggested using FORTRAN, and everybody barfed." | |||||
| - From The Shogakukan DICTIONARY OF NEW ENGLISH (Second edition) */ | |||||
| #ifndef F2C_INCLUDE | |||||
| #define F2C_INCLUDE | |||||
| #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 | |||||
| typedef int 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; | |||||
| 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;} | |||||
| #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)); } | |||||
| #define c_div(c, a, b) {pCf(c) = Cf(a)/Cf(b);} | |||||
| #define z_div(c, a, b) {pCd(c) = Cd(a)/Cd(b);} | |||||
| #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) = conj(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) (cimag(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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotc_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void cdotu_(complex *z, integer *n_, complex *x, integer *incx_, complex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotu_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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) | |||||
| */ | |||||
| /* > \brief \b CLACRT performs a linear transformation of a pair of complex vectors. */ | |||||
| /* =========== DOCUMENTATION =========== */ | |||||
| /* Online html documentation available at */ | |||||
| /* http://www.netlib.org/lapack/explore-html/ */ | |||||
| /* > \htmlonly */ | |||||
| /* > Download CLACRT + dependencies */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/clacrt. | |||||
| f"> */ | |||||
| /* > [TGZ]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/clacrt. | |||||
| f"> */ | |||||
| /* > [ZIP]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/clacrt. | |||||
| f"> */ | |||||
| /* > [TXT]</a> */ | |||||
| /* > \endhtmlonly */ | |||||
| /* Definition: */ | |||||
| /* =========== */ | |||||
| /* SUBROUTINE CLACRT( N, CX, INCX, CY, INCY, C, S ) */ | |||||
| /* INTEGER INCX, INCY, N */ | |||||
| /* COMPLEX C, S */ | |||||
| /* COMPLEX CX( * ), CY( * ) */ | |||||
| /* > \par Purpose: */ | |||||
| /* ============= */ | |||||
| /* > */ | |||||
| /* > \verbatim */ | |||||
| /* > */ | |||||
| /* > CLACRT performs the operation */ | |||||
| /* > */ | |||||
| /* > ( c s )( x ) ==> ( x ) */ | |||||
| /* > ( -s c )( y ) ( y ) */ | |||||
| /* > */ | |||||
| /* > where c and s are complex and the vectors x and y are complex. */ | |||||
| /* > \endverbatim */ | |||||
| /* Arguments: */ | |||||
| /* ========== */ | |||||
| /* > \param[in] N */ | |||||
| /* > \verbatim */ | |||||
| /* > N is INTEGER */ | |||||
| /* > The number of elements in the vectors CX and CY. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in,out] CX */ | |||||
| /* > \verbatim */ | |||||
| /* > CX is COMPLEX array, dimension (N) */ | |||||
| /* > On input, the vector x. */ | |||||
| /* > On output, CX is overwritten with c*x + s*y. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] INCX */ | |||||
| /* > \verbatim */ | |||||
| /* > INCX is INTEGER */ | |||||
| /* > The increment between successive values of CX. INCX <> 0. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in,out] CY */ | |||||
| /* > \verbatim */ | |||||
| /* > CY is COMPLEX array, dimension (N) */ | |||||
| /* > On input, the vector y. */ | |||||
| /* > On output, CY is overwritten with -s*x + c*y. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] INCY */ | |||||
| /* > \verbatim */ | |||||
| /* > INCY is INTEGER */ | |||||
| /* > The increment between successive values of CY. INCY <> 0. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] C */ | |||||
| /* > \verbatim */ | |||||
| /* > C is COMPLEX */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] S */ | |||||
| /* > \verbatim */ | |||||
| /* > S is COMPLEX */ | |||||
| /* > C and S define the matrix */ | |||||
| /* > [ C S ]. */ | |||||
| /* > [ -S C ] */ | |||||
| /* > \endverbatim */ | |||||
| /* Authors: */ | |||||
| /* ======== */ | |||||
| /* > \author Univ. of Tennessee */ | |||||
| /* > \author Univ. of California Berkeley */ | |||||
| /* > \author Univ. of Colorado Denver */ | |||||
| /* > \author NAG Ltd. */ | |||||
| /* > \date December 2016 */ | |||||
| /* > \ingroup complexOTHERauxiliary */ | |||||
| /* ===================================================================== */ | |||||
| /* Subroutine */ int clacrt_(integer *n, complex *cx, integer *incx, complex * | |||||
| cy, integer *incy, complex *c__, complex *s) | |||||
| { | |||||
| /* System generated locals */ | |||||
| integer i__1, i__2, i__3, i__4; | |||||
| complex q__1, q__2, q__3; | |||||
| /* Local variables */ | |||||
| integer i__; | |||||
| complex ctemp; | |||||
| integer ix, iy; | |||||
| /* -- LAPACK auxiliary routine (version 3.7.0) -- */ | |||||
| /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ | |||||
| /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ | |||||
| /* December 2016 */ | |||||
| /* ===================================================================== */ | |||||
| /* Parameter adjustments */ | |||||
| --cy; | |||||
| --cx; | |||||
| /* Function Body */ | |||||
| if (*n <= 0) { | |||||
| return 0; | |||||
| } | |||||
| if (*incx == 1 && *incy == 1) { | |||||
| goto L20; | |||||
| } | |||||
| /* Code for unequal increments or equal increments not equal to 1 */ | |||||
| ix = 1; | |||||
| iy = 1; | |||||
| if (*incx < 0) { | |||||
| ix = (-(*n) + 1) * *incx + 1; | |||||
| } | |||||
| if (*incy < 0) { | |||||
| iy = (-(*n) + 1) * *incy + 1; | |||||
| } | |||||
| i__1 = *n; | |||||
| for (i__ = 1; i__ <= i__1; ++i__) { | |||||
| i__2 = ix; | |||||
| q__2.r = c__->r * cx[i__2].r - c__->i * cx[i__2].i, q__2.i = c__->r * | |||||
| cx[i__2].i + c__->i * cx[i__2].r; | |||||
| i__3 = iy; | |||||
| q__3.r = s->r * cy[i__3].r - s->i * cy[i__3].i, q__3.i = s->r * cy[ | |||||
| i__3].i + s->i * cy[i__3].r; | |||||
| q__1.r = q__2.r + q__3.r, q__1.i = q__2.i + q__3.i; | |||||
| ctemp.r = q__1.r, ctemp.i = q__1.i; | |||||
| i__2 = iy; | |||||
| i__3 = iy; | |||||
| q__2.r = c__->r * cy[i__3].r - c__->i * cy[i__3].i, q__2.i = c__->r * | |||||
| cy[i__3].i + c__->i * cy[i__3].r; | |||||
| i__4 = ix; | |||||
| q__3.r = s->r * cx[i__4].r - s->i * cx[i__4].i, q__3.i = s->r * cx[ | |||||
| i__4].i + s->i * cx[i__4].r; | |||||
| q__1.r = q__2.r - q__3.r, q__1.i = q__2.i - q__3.i; | |||||
| cy[i__2].r = q__1.r, cy[i__2].i = q__1.i; | |||||
| i__2 = ix; | |||||
| cx[i__2].r = ctemp.r, cx[i__2].i = ctemp.i; | |||||
| ix += *incx; | |||||
| iy += *incy; | |||||
| /* L10: */ | |||||
| } | |||||
| return 0; | |||||
| /* Code for both increments equal to 1 */ | |||||
| L20: | |||||
| i__1 = *n; | |||||
| for (i__ = 1; i__ <= i__1; ++i__) { | |||||
| i__2 = i__; | |||||
| q__2.r = c__->r * cx[i__2].r - c__->i * cx[i__2].i, q__2.i = c__->r * | |||||
| cx[i__2].i + c__->i * cx[i__2].r; | |||||
| i__3 = i__; | |||||
| q__3.r = s->r * cy[i__3].r - s->i * cy[i__3].i, q__3.i = s->r * cy[ | |||||
| i__3].i + s->i * cy[i__3].r; | |||||
| q__1.r = q__2.r + q__3.r, q__1.i = q__2.i + q__3.i; | |||||
| ctemp.r = q__1.r, ctemp.i = q__1.i; | |||||
| i__2 = i__; | |||||
| i__3 = i__; | |||||
| q__2.r = c__->r * cy[i__3].r - c__->i * cy[i__3].i, q__2.i = c__->r * | |||||
| cy[i__3].i + c__->i * cy[i__3].r; | |||||
| i__4 = i__; | |||||
| q__3.r = s->r * cx[i__4].r - s->i * cx[i__4].i, q__3.i = s->r * cx[ | |||||
| i__4].i + s->i * cx[i__4].r; | |||||
| q__1.r = q__2.r - q__3.r, q__1.i = q__2.i - q__3.i; | |||||
| cy[i__2].r = q__1.r, cy[i__2].i = q__1.i; | |||||
| i__2 = i__; | |||||
| cx[i__2].r = ctemp.r, cx[i__2].i = ctemp.i; | |||||
| /* L30: */ | |||||
| } | |||||
| return 0; | |||||
| } /* clacrt_ */ | |||||
| @@ -0,0 +1,488 @@ | |||||
| /* f2c.h -- Standard Fortran to C header file */ | |||||
| /** barf [ba:rf] 2. "He suggested using FORTRAN, and everybody barfed." | |||||
| - From The Shogakukan DICTIONARY OF NEW ENGLISH (Second edition) */ | |||||
| #ifndef F2C_INCLUDE | |||||
| #define F2C_INCLUDE | |||||
| #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 | |||||
| typedef int 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; | |||||
| 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;} | |||||
| #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)); } | |||||
| #define c_div(c, a, b) {pCf(c) = Cf(a)/Cf(b);} | |||||
| #define z_div(c, a, b) {pCd(c) = Cd(a)/Cd(b);} | |||||
| #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) = conj(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) (cimag(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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotc_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void cdotu_(complex *z, integer *n_, complex *x, integer *incx_, complex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotu_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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) | |||||
| */ | |||||
| /* > \brief \b CLADIV performs complex division in real arithmetic, avoiding unnecessary overflow. */ | |||||
| /* =========== DOCUMENTATION =========== */ | |||||
| /* Online html documentation available at */ | |||||
| /* http://www.netlib.org/lapack/explore-html/ */ | |||||
| /* > \htmlonly */ | |||||
| /* > Download CLADIV + dependencies */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/cladiv. | |||||
| f"> */ | |||||
| /* > [TGZ]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/cladiv. | |||||
| f"> */ | |||||
| /* > [ZIP]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/cladiv. | |||||
| f"> */ | |||||
| /* > [TXT]</a> */ | |||||
| /* > \endhtmlonly */ | |||||
| /* Definition: */ | |||||
| /* =========== */ | |||||
| /* COMPLEX FUNCTION CLADIV( X, Y ) */ | |||||
| /* COMPLEX X, Y */ | |||||
| /* > \par Purpose: */ | |||||
| /* ============= */ | |||||
| /* > */ | |||||
| /* > \verbatim */ | |||||
| /* > */ | |||||
| /* > CLADIV := X / Y, where X and Y are complex. The computation of X / Y */ | |||||
| /* > will not overflow on an intermediary step unless the results */ | |||||
| /* > overflows. */ | |||||
| /* > \endverbatim */ | |||||
| /* Arguments: */ | |||||
| /* ========== */ | |||||
| /* > \param[in] X */ | |||||
| /* > \verbatim */ | |||||
| /* > X is COMPLEX */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] Y */ | |||||
| /* > \verbatim */ | |||||
| /* > Y is COMPLEX */ | |||||
| /* > The complex scalars X and Y. */ | |||||
| /* > \endverbatim */ | |||||
| /* Authors: */ | |||||
| /* ======== */ | |||||
| /* > \author Univ. of Tennessee */ | |||||
| /* > \author Univ. of California Berkeley */ | |||||
| /* > \author Univ. of Colorado Denver */ | |||||
| /* > \author NAG Ltd. */ | |||||
| /* > \date December 2016 */ | |||||
| /* > \ingroup complexOTHERauxiliary */ | |||||
| /* ===================================================================== */ | |||||
| /* Complex */ VOID cladiv_(complex * ret_val, complex *x, complex *y) | |||||
| { | |||||
| /* System generated locals */ | |||||
| real r__1, r__2, r__3, r__4; | |||||
| complex q__1; | |||||
| /* Local variables */ | |||||
| real zi, zr; | |||||
| extern /* Subroutine */ int sladiv_(real *, real *, real *, real *, real * | |||||
| , real *); | |||||
| /* -- LAPACK auxiliary routine (version 3.7.0) -- */ | |||||
| /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ | |||||
| /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ | |||||
| /* December 2016 */ | |||||
| /* ===================================================================== */ | |||||
| r__1 = x->r; | |||||
| r__2 = r_imag(x); | |||||
| r__3 = y->r; | |||||
| r__4 = r_imag(y); | |||||
| sladiv_(&r__1, &r__2, &r__3, &r__4, &zr, &zi); | |||||
| q__1.r = zr, q__1.i = zi; | |||||
| ret_val->r = q__1.r, ret_val->i = q__1.i; | |||||
| return ; | |||||
| /* End of CLADIV */ | |||||
| } /* cladiv_ */ | |||||
| @@ -0,0 +1,806 @@ | |||||
| /* f2c.h -- Standard Fortran to C header file */ | |||||
| /** barf [ba:rf] 2. "He suggested using FORTRAN, and everybody barfed." | |||||
| - From The Shogakukan DICTIONARY OF NEW ENGLISH (Second edition) */ | |||||
| #ifndef F2C_INCLUDE | |||||
| #define F2C_INCLUDE | |||||
| #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 | |||||
| typedef int 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; | |||||
| 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;} | |||||
| #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)); } | |||||
| #define c_div(c, a, b) {pCf(c) = Cf(a)/Cf(b);} | |||||
| #define z_div(c, a, b) {pCd(c) = Cd(a)/Cd(b);} | |||||
| #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) = conj(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) (cimag(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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotc_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void cdotu_(complex *z, integer *n_, complex *x, integer *incx_, complex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotu_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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) | |||||
| */ | |||||
| /* Table of constant values */ | |||||
| static integer c__9 = 9; | |||||
| static integer c__0 = 0; | |||||
| static integer c__2 = 2; | |||||
| static integer c__1 = 1; | |||||
| /* > \brief \b CLAED0 used by sstedc. Computes all eigenvalues and corresponding eigenvectors of an unreduced | |||||
| symmetric tridiagonal matrix using the divide and conquer method. */ | |||||
| /* =========== DOCUMENTATION =========== */ | |||||
| /* Online html documentation available at */ | |||||
| /* http://www.netlib.org/lapack/explore-html/ */ | |||||
| /* > \htmlonly */ | |||||
| /* > Download CLAED0 + dependencies */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/claed0. | |||||
| f"> */ | |||||
| /* > [TGZ]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/claed0. | |||||
| f"> */ | |||||
| /* > [ZIP]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/claed0. | |||||
| f"> */ | |||||
| /* > [TXT]</a> */ | |||||
| /* > \endhtmlonly */ | |||||
| /* Definition: */ | |||||
| /* =========== */ | |||||
| /* SUBROUTINE CLAED0( QSIZ, N, D, E, Q, LDQ, QSTORE, LDQS, RWORK, */ | |||||
| /* IWORK, INFO ) */ | |||||
| /* INTEGER INFO, LDQ, LDQS, N, QSIZ */ | |||||
| /* INTEGER IWORK( * ) */ | |||||
| /* REAL D( * ), E( * ), RWORK( * ) */ | |||||
| /* COMPLEX Q( LDQ, * ), QSTORE( LDQS, * ) */ | |||||
| /* > \par Purpose: */ | |||||
| /* ============= */ | |||||
| /* > */ | |||||
| /* > \verbatim */ | |||||
| /* > */ | |||||
| /* > Using the divide and conquer method, CLAED0 computes all eigenvalues */ | |||||
| /* > of a symmetric tridiagonal matrix which is one diagonal block of */ | |||||
| /* > those from reducing a dense or band Hermitian matrix and */ | |||||
| /* > corresponding eigenvectors of the dense or band matrix. */ | |||||
| /* > \endverbatim */ | |||||
| /* Arguments: */ | |||||
| /* ========== */ | |||||
| /* > \param[in] QSIZ */ | |||||
| /* > \verbatim */ | |||||
| /* > QSIZ is INTEGER */ | |||||
| /* > The dimension of the unitary matrix used to reduce */ | |||||
| /* > the full matrix to tridiagonal form. QSIZ >= N if ICOMPQ = 1. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] N */ | |||||
| /* > \verbatim */ | |||||
| /* > N is INTEGER */ | |||||
| /* > The dimension of the symmetric tridiagonal matrix. N >= 0. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in,out] D */ | |||||
| /* > \verbatim */ | |||||
| /* > D is REAL array, dimension (N) */ | |||||
| /* > On entry, the diagonal elements of the tridiagonal matrix. */ | |||||
| /* > On exit, the eigenvalues in ascending order. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in,out] E */ | |||||
| /* > \verbatim */ | |||||
| /* > E is REAL array, dimension (N-1) */ | |||||
| /* > On entry, the off-diagonal elements of the tridiagonal matrix. */ | |||||
| /* > On exit, E has been destroyed. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in,out] Q */ | |||||
| /* > \verbatim */ | |||||
| /* > Q is COMPLEX array, dimension (LDQ,N) */ | |||||
| /* > On entry, Q must contain an QSIZ x N matrix whose columns */ | |||||
| /* > unitarily orthonormal. It is a part of the unitary matrix */ | |||||
| /* > that reduces the full dense Hermitian matrix to a */ | |||||
| /* > (reducible) symmetric tridiagonal matrix. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] LDQ */ | |||||
| /* > \verbatim */ | |||||
| /* > LDQ is INTEGER */ | |||||
| /* > The leading dimension of the array Q. LDQ >= f2cmax(1,N). */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] IWORK */ | |||||
| /* > \verbatim */ | |||||
| /* > IWORK is INTEGER array, */ | |||||
| /* > the dimension of IWORK must be at least */ | |||||
| /* > 6 + 6*N + 5*N*lg N */ | |||||
| /* > ( lg( N ) = smallest integer k */ | |||||
| /* > such that 2^k >= N ) */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] RWORK */ | |||||
| /* > \verbatim */ | |||||
| /* > RWORK is REAL array, */ | |||||
| /* > dimension (1 + 3*N + 2*N*lg N + 3*N**2) */ | |||||
| /* > ( lg( N ) = smallest integer k */ | |||||
| /* > such that 2^k >= N ) */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] QSTORE */ | |||||
| /* > \verbatim */ | |||||
| /* > QSTORE is COMPLEX array, dimension (LDQS, N) */ | |||||
| /* > Used to store parts of */ | |||||
| /* > the eigenvector matrix when the updating matrix multiplies */ | |||||
| /* > take place. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] LDQS */ | |||||
| /* > \verbatim */ | |||||
| /* > LDQS is INTEGER */ | |||||
| /* > The leading dimension of the array QSTORE. */ | |||||
| /* > LDQS >= f2cmax(1,N). */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] INFO */ | |||||
| /* > \verbatim */ | |||||
| /* > INFO is INTEGER */ | |||||
| /* > = 0: successful exit. */ | |||||
| /* > < 0: if INFO = -i, the i-th argument had an illegal value. */ | |||||
| /* > > 0: The algorithm failed to compute an eigenvalue while */ | |||||
| /* > working on the submatrix lying in rows and columns */ | |||||
| /* > INFO/(N+1) through mod(INFO,N+1). */ | |||||
| /* > \endverbatim */ | |||||
| /* Authors: */ | |||||
| /* ======== */ | |||||
| /* > \author Univ. of Tennessee */ | |||||
| /* > \author Univ. of California Berkeley */ | |||||
| /* > \author Univ. of Colorado Denver */ | |||||
| /* > \author NAG Ltd. */ | |||||
| /* > \date December 2016 */ | |||||
| /* > \ingroup complexOTHERcomputational */ | |||||
| /* ===================================================================== */ | |||||
| /* Subroutine */ int claed0_(integer *qsiz, integer *n, real *d__, real *e, | |||||
| complex *q, integer *ldq, complex *qstore, integer *ldqs, real *rwork, | |||||
| integer *iwork, integer *info) | |||||
| { | |||||
| /* System generated locals */ | |||||
| integer q_dim1, q_offset, qstore_dim1, qstore_offset, i__1, i__2; | |||||
| real r__1; | |||||
| /* Local variables */ | |||||
| real temp; | |||||
| integer curr, i__, j, k, iperm; | |||||
| extern /* Subroutine */ int ccopy_(integer *, complex *, integer *, | |||||
| complex *, integer *); | |||||
| integer indxq, iwrem; | |||||
| extern /* Subroutine */ int scopy_(integer *, real *, integer *, real *, | |||||
| integer *); | |||||
| integer iqptr; | |||||
| extern /* Subroutine */ int claed7_(integer *, integer *, integer *, | |||||
| integer *, integer *, integer *, real *, complex *, integer *, | |||||
| real *, integer *, real *, integer *, integer *, integer *, | |||||
| integer *, integer *, real *, complex *, real *, integer *, | |||||
| integer *); | |||||
| integer tlvls, ll, iq; | |||||
| extern /* Subroutine */ int clacrm_(integer *, integer *, complex *, | |||||
| integer *, real *, integer *, complex *, integer *, real *); | |||||
| integer igivcl; | |||||
| extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); | |||||
| extern integer ilaenv_(integer *, char *, char *, integer *, integer *, | |||||
| integer *, integer *, ftnlen, ftnlen); | |||||
| integer igivnm, submat, curprb, subpbs, igivpt, curlvl, matsiz, iprmpt, | |||||
| smlsiz; | |||||
| extern /* Subroutine */ int ssteqr_(char *, integer *, real *, real *, | |||||
| real *, integer *, real *, integer *); | |||||
| integer lgn, msd2, smm1, spm1, spm2; | |||||
| /* -- LAPACK computational routine (version 3.7.0) -- */ | |||||
| /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ | |||||
| /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ | |||||
| /* December 2016 */ | |||||
| /* ===================================================================== */ | |||||
| /* Warning: N could be as big as QSIZ! */ | |||||
| /* Test the input parameters. */ | |||||
| /* Parameter adjustments */ | |||||
| --d__; | |||||
| --e; | |||||
| q_dim1 = *ldq; | |||||
| q_offset = 1 + q_dim1 * 1; | |||||
| q -= q_offset; | |||||
| qstore_dim1 = *ldqs; | |||||
| qstore_offset = 1 + qstore_dim1 * 1; | |||||
| qstore -= qstore_offset; | |||||
| --rwork; | |||||
| --iwork; | |||||
| /* Function Body */ | |||||
| *info = 0; | |||||
| /* IF( ICOMPQ .LT. 0 .OR. ICOMPQ .GT. 2 ) THEN */ | |||||
| /* INFO = -1 */ | |||||
| /* ELSE IF( ( ICOMPQ .EQ. 1 ) .AND. ( QSIZ .LT. MAX( 0, N ) ) ) */ | |||||
| /* $ THEN */ | |||||
| if (*qsiz < f2cmax(0,*n)) { | |||||
| *info = -1; | |||||
| } else if (*n < 0) { | |||||
| *info = -2; | |||||
| } else if (*ldq < f2cmax(1,*n)) { | |||||
| *info = -6; | |||||
| } else if (*ldqs < f2cmax(1,*n)) { | |||||
| *info = -8; | |||||
| } | |||||
| if (*info != 0) { | |||||
| i__1 = -(*info); | |||||
| xerbla_("CLAED0", &i__1, (ftnlen)6); | |||||
| return 0; | |||||
| } | |||||
| /* Quick return if possible */ | |||||
| if (*n == 0) { | |||||
| return 0; | |||||
| } | |||||
| smlsiz = ilaenv_(&c__9, "CLAED0", " ", &c__0, &c__0, &c__0, &c__0, ( | |||||
| ftnlen)6, (ftnlen)1); | |||||
| /* Determine the size and placement of the submatrices, and save in */ | |||||
| /* the leading elements of IWORK. */ | |||||
| iwork[1] = *n; | |||||
| subpbs = 1; | |||||
| tlvls = 0; | |||||
| L10: | |||||
| if (iwork[subpbs] > smlsiz) { | |||||
| for (j = subpbs; j >= 1; --j) { | |||||
| iwork[j * 2] = (iwork[j] + 1) / 2; | |||||
| iwork[(j << 1) - 1] = iwork[j] / 2; | |||||
| /* L20: */ | |||||
| } | |||||
| ++tlvls; | |||||
| subpbs <<= 1; | |||||
| goto L10; | |||||
| } | |||||
| i__1 = subpbs; | |||||
| for (j = 2; j <= i__1; ++j) { | |||||
| iwork[j] += iwork[j - 1]; | |||||
| /* L30: */ | |||||
| } | |||||
| /* Divide the matrix into SUBPBS submatrices of size at most SMLSIZ+1 */ | |||||
| /* using rank-1 modifications (cuts). */ | |||||
| spm1 = subpbs - 1; | |||||
| i__1 = spm1; | |||||
| for (i__ = 1; i__ <= i__1; ++i__) { | |||||
| submat = iwork[i__] + 1; | |||||
| smm1 = submat - 1; | |||||
| d__[smm1] -= (r__1 = e[smm1], abs(r__1)); | |||||
| d__[submat] -= (r__1 = e[smm1], abs(r__1)); | |||||
| /* L40: */ | |||||
| } | |||||
| indxq = (*n << 2) + 3; | |||||
| /* Set up workspaces for eigenvalues only/accumulate new vectors */ | |||||
| /* routine */ | |||||
| temp = log((real) (*n)) / log(2.f); | |||||
| lgn = (integer) temp; | |||||
| if (pow_ii(&c__2, &lgn) < *n) { | |||||
| ++lgn; | |||||
| } | |||||
| if (pow_ii(&c__2, &lgn) < *n) { | |||||
| ++lgn; | |||||
| } | |||||
| iprmpt = indxq + *n + 1; | |||||
| iperm = iprmpt + *n * lgn; | |||||
| iqptr = iperm + *n * lgn; | |||||
| igivpt = iqptr + *n + 2; | |||||
| igivcl = igivpt + *n * lgn; | |||||
| igivnm = 1; | |||||
| iq = igivnm + (*n << 1) * lgn; | |||||
| /* Computing 2nd power */ | |||||
| i__1 = *n; | |||||
| iwrem = iq + i__1 * i__1 + 1; | |||||
| /* Initialize pointers */ | |||||
| i__1 = subpbs; | |||||
| for (i__ = 0; i__ <= i__1; ++i__) { | |||||
| iwork[iprmpt + i__] = 1; | |||||
| iwork[igivpt + i__] = 1; | |||||
| /* L50: */ | |||||
| } | |||||
| iwork[iqptr] = 1; | |||||
| /* Solve each submatrix eigenproblem at the bottom of the divide and */ | |||||
| /* conquer tree. */ | |||||
| curr = 0; | |||||
| i__1 = spm1; | |||||
| for (i__ = 0; i__ <= i__1; ++i__) { | |||||
| if (i__ == 0) { | |||||
| submat = 1; | |||||
| matsiz = iwork[1]; | |||||
| } else { | |||||
| submat = iwork[i__] + 1; | |||||
| matsiz = iwork[i__ + 1] - iwork[i__]; | |||||
| } | |||||
| ll = iq - 1 + iwork[iqptr + curr]; | |||||
| ssteqr_("I", &matsiz, &d__[submat], &e[submat], &rwork[ll], &matsiz, & | |||||
| rwork[1], info); | |||||
| clacrm_(qsiz, &matsiz, &q[submat * q_dim1 + 1], ldq, &rwork[ll], & | |||||
| matsiz, &qstore[submat * qstore_dim1 + 1], ldqs, &rwork[iwrem] | |||||
| ); | |||||
| /* Computing 2nd power */ | |||||
| i__2 = matsiz; | |||||
| iwork[iqptr + curr + 1] = iwork[iqptr + curr] + i__2 * i__2; | |||||
| ++curr; | |||||
| if (*info > 0) { | |||||
| *info = submat * (*n + 1) + submat + matsiz - 1; | |||||
| return 0; | |||||
| } | |||||
| k = 1; | |||||
| i__2 = iwork[i__ + 1]; | |||||
| for (j = submat; j <= i__2; ++j) { | |||||
| iwork[indxq + j] = k; | |||||
| ++k; | |||||
| /* L60: */ | |||||
| } | |||||
| /* L70: */ | |||||
| } | |||||
| /* Successively merge eigensystems of adjacent submatrices */ | |||||
| /* into eigensystem for the corresponding larger matrix. */ | |||||
| /* while ( SUBPBS > 1 ) */ | |||||
| curlvl = 1; | |||||
| L80: | |||||
| if (subpbs > 1) { | |||||
| spm2 = subpbs - 2; | |||||
| i__1 = spm2; | |||||
| for (i__ = 0; i__ <= i__1; i__ += 2) { | |||||
| if (i__ == 0) { | |||||
| submat = 1; | |||||
| matsiz = iwork[2]; | |||||
| msd2 = iwork[1]; | |||||
| curprb = 0; | |||||
| } else { | |||||
| submat = iwork[i__] + 1; | |||||
| matsiz = iwork[i__ + 2] - iwork[i__]; | |||||
| msd2 = matsiz / 2; | |||||
| ++curprb; | |||||
| } | |||||
| /* Merge lower order eigensystems (of size MSD2 and MATSIZ - MSD2) */ | |||||
| /* into an eigensystem of size MATSIZ. CLAED7 handles the case */ | |||||
| /* when the eigenvectors of a full or band Hermitian matrix (which */ | |||||
| /* was reduced to tridiagonal form) are desired. */ | |||||
| /* I am free to use Q as a valuable working space until Loop 150. */ | |||||
| claed7_(&matsiz, &msd2, qsiz, &tlvls, &curlvl, &curprb, &d__[ | |||||
| submat], &qstore[submat * qstore_dim1 + 1], ldqs, &e[ | |||||
| submat + msd2 - 1], &iwork[indxq + submat], &rwork[iq], & | |||||
| iwork[iqptr], &iwork[iprmpt], &iwork[iperm], &iwork[ | |||||
| igivpt], &iwork[igivcl], &rwork[igivnm], &q[submat * | |||||
| q_dim1 + 1], &rwork[iwrem], &iwork[subpbs + 1], info); | |||||
| if (*info > 0) { | |||||
| *info = submat * (*n + 1) + submat + matsiz - 1; | |||||
| return 0; | |||||
| } | |||||
| iwork[i__ / 2 + 1] = iwork[i__ + 2]; | |||||
| /* L90: */ | |||||
| } | |||||
| subpbs /= 2; | |||||
| ++curlvl; | |||||
| goto L80; | |||||
| } | |||||
| /* end while */ | |||||
| /* Re-merge the eigenvalues/vectors which were deflated at the final */ | |||||
| /* merge step. */ | |||||
| i__1 = *n; | |||||
| for (i__ = 1; i__ <= i__1; ++i__) { | |||||
| j = iwork[indxq + i__]; | |||||
| rwork[i__] = d__[j]; | |||||
| ccopy_(qsiz, &qstore[j * qstore_dim1 + 1], &c__1, &q[i__ * q_dim1 + 1] | |||||
| , &c__1); | |||||
| /* L100: */ | |||||
| } | |||||
| scopy_(n, &rwork[1], &c__1, &d__[1], &c__1); | |||||
| return 0; | |||||
| /* End of CLAED0 */ | |||||
| } /* claed0_ */ | |||||
| @@ -0,0 +1,807 @@ | |||||
| /* f2c.h -- Standard Fortran to C header file */ | |||||
| /** barf [ba:rf] 2. "He suggested using FORTRAN, and everybody barfed." | |||||
| - From The Shogakukan DICTIONARY OF NEW ENGLISH (Second edition) */ | |||||
| #ifndef F2C_INCLUDE | |||||
| #define F2C_INCLUDE | |||||
| #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 | |||||
| typedef int 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; | |||||
| 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;} | |||||
| #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)); } | |||||
| #define c_div(c, a, b) {pCf(c) = Cf(a)/Cf(b);} | |||||
| #define z_div(c, a, b) {pCd(c) = Cd(a)/Cd(b);} | |||||
| #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) = conj(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) (cimag(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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotc_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void cdotu_(complex *z, integer *n_, complex *x, integer *incx_, complex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotu_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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) | |||||
| */ | |||||
| /* Table of constant values */ | |||||
| static integer c__2 = 2; | |||||
| static integer c__1 = 1; | |||||
| static integer c_n1 = -1; | |||||
| /* > \brief \b CLAED7 used by sstedc. Computes the updated eigensystem of a diagonal matrix after modification | |||||
| by a rank-one symmetric matrix. Used when the original matrix is dense. */ | |||||
| /* =========== DOCUMENTATION =========== */ | |||||
| /* Online html documentation available at */ | |||||
| /* http://www.netlib.org/lapack/explore-html/ */ | |||||
| /* > \htmlonly */ | |||||
| /* > Download CLAED7 + dependencies */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/claed7. | |||||
| f"> */ | |||||
| /* > [TGZ]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/claed7. | |||||
| f"> */ | |||||
| /* > [ZIP]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/claed7. | |||||
| f"> */ | |||||
| /* > [TXT]</a> */ | |||||
| /* > \endhtmlonly */ | |||||
| /* Definition: */ | |||||
| /* =========== */ | |||||
| /* SUBROUTINE CLAED7( N, CUTPNT, QSIZ, TLVLS, CURLVL, CURPBM, D, Q, */ | |||||
| /* LDQ, RHO, INDXQ, QSTORE, QPTR, PRMPTR, PERM, */ | |||||
| /* GIVPTR, GIVCOL, GIVNUM, WORK, RWORK, IWORK, */ | |||||
| /* INFO ) */ | |||||
| /* INTEGER CURLVL, CURPBM, CUTPNT, INFO, LDQ, N, QSIZ, */ | |||||
| /* $ TLVLS */ | |||||
| /* REAL RHO */ | |||||
| /* INTEGER GIVCOL( 2, * ), GIVPTR( * ), INDXQ( * ), */ | |||||
| /* $ IWORK( * ), PERM( * ), PRMPTR( * ), QPTR( * ) */ | |||||
| /* REAL D( * ), GIVNUM( 2, * ), QSTORE( * ), RWORK( * ) */ | |||||
| /* COMPLEX Q( LDQ, * ), WORK( * ) */ | |||||
| /* > \par Purpose: */ | |||||
| /* ============= */ | |||||
| /* > */ | |||||
| /* > \verbatim */ | |||||
| /* > */ | |||||
| /* > CLAED7 computes the updated eigensystem of a diagonal */ | |||||
| /* > matrix after modification by a rank-one symmetric matrix. This */ | |||||
| /* > routine is used only for the eigenproblem which requires all */ | |||||
| /* > eigenvalues and optionally eigenvectors of a dense or banded */ | |||||
| /* > Hermitian matrix that has been reduced to tridiagonal form. */ | |||||
| /* > */ | |||||
| /* > T = Q(in) ( D(in) + RHO * Z*Z**H ) Q**H(in) = Q(out) * D(out) * Q**H(out) */ | |||||
| /* > */ | |||||
| /* > where Z = Q**Hu, u is a vector of length N with ones in the */ | |||||
| /* > CUTPNT and CUTPNT + 1 th elements and zeros elsewhere. */ | |||||
| /* > */ | |||||
| /* > The eigenvectors of the original matrix are stored in Q, and the */ | |||||
| /* > eigenvalues are in D. The algorithm consists of three stages: */ | |||||
| /* > */ | |||||
| /* > The first stage consists of deflating the size of the problem */ | |||||
| /* > when there are multiple eigenvalues or if there is a zero in */ | |||||
| /* > the Z vector. For each such occurrence the dimension of the */ | |||||
| /* > secular equation problem is reduced by one. This stage is */ | |||||
| /* > performed by the routine SLAED2. */ | |||||
| /* > */ | |||||
| /* > The second stage consists of calculating the updated */ | |||||
| /* > eigenvalues. This is done by finding the roots of the secular */ | |||||
| /* > equation via the routine SLAED4 (as called by SLAED3). */ | |||||
| /* > This routine also calculates the eigenvectors of the current */ | |||||
| /* > problem. */ | |||||
| /* > */ | |||||
| /* > The final stage consists of computing the updated eigenvectors */ | |||||
| /* > directly using the updated eigenvalues. The eigenvectors for */ | |||||
| /* > the current problem are multiplied with the eigenvectors from */ | |||||
| /* > the overall problem. */ | |||||
| /* > \endverbatim */ | |||||
| /* Arguments: */ | |||||
| /* ========== */ | |||||
| /* > \param[in] N */ | |||||
| /* > \verbatim */ | |||||
| /* > N is INTEGER */ | |||||
| /* > The dimension of the symmetric tridiagonal matrix. N >= 0. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] CUTPNT */ | |||||
| /* > \verbatim */ | |||||
| /* > CUTPNT is INTEGER */ | |||||
| /* > Contains the location of the last eigenvalue in the leading */ | |||||
| /* > sub-matrix. f2cmin(1,N) <= CUTPNT <= N. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] QSIZ */ | |||||
| /* > \verbatim */ | |||||
| /* > QSIZ is INTEGER */ | |||||
| /* > The dimension of the unitary matrix used to reduce */ | |||||
| /* > the full matrix to tridiagonal form. QSIZ >= N. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] TLVLS */ | |||||
| /* > \verbatim */ | |||||
| /* > TLVLS is INTEGER */ | |||||
| /* > The total number of merging levels in the overall divide and */ | |||||
| /* > conquer tree. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] CURLVL */ | |||||
| /* > \verbatim */ | |||||
| /* > CURLVL is INTEGER */ | |||||
| /* > The current level in the overall merge routine, */ | |||||
| /* > 0 <= curlvl <= tlvls. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] CURPBM */ | |||||
| /* > \verbatim */ | |||||
| /* > CURPBM is INTEGER */ | |||||
| /* > The current problem in the current level in the overall */ | |||||
| /* > merge routine (counting from upper left to lower right). */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in,out] D */ | |||||
| /* > \verbatim */ | |||||
| /* > D is REAL array, dimension (N) */ | |||||
| /* > On entry, the eigenvalues of the rank-1-perturbed matrix. */ | |||||
| /* > On exit, the eigenvalues of the repaired matrix. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in,out] Q */ | |||||
| /* > \verbatim */ | |||||
| /* > Q is COMPLEX array, dimension (LDQ,N) */ | |||||
| /* > On entry, the eigenvectors of the rank-1-perturbed matrix. */ | |||||
| /* > On exit, the eigenvectors of the repaired tridiagonal matrix. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] LDQ */ | |||||
| /* > \verbatim */ | |||||
| /* > LDQ is INTEGER */ | |||||
| /* > The leading dimension of the array Q. LDQ >= f2cmax(1,N). */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] RHO */ | |||||
| /* > \verbatim */ | |||||
| /* > RHO is REAL */ | |||||
| /* > Contains the subdiagonal element used to create the rank-1 */ | |||||
| /* > modification. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] INDXQ */ | |||||
| /* > \verbatim */ | |||||
| /* > INDXQ is INTEGER array, dimension (N) */ | |||||
| /* > This contains the permutation which will reintegrate the */ | |||||
| /* > subproblem just solved back into sorted order, */ | |||||
| /* > ie. D( INDXQ( I = 1, N ) ) will be in ascending order. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] IWORK */ | |||||
| /* > \verbatim */ | |||||
| /* > IWORK is INTEGER array, dimension (4*N) */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] RWORK */ | |||||
| /* > \verbatim */ | |||||
| /* > RWORK is REAL array, */ | |||||
| /* > dimension (3*N+2*QSIZ*N) */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] WORK */ | |||||
| /* > \verbatim */ | |||||
| /* > WORK is COMPLEX array, dimension (QSIZ*N) */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in,out] QSTORE */ | |||||
| /* > \verbatim */ | |||||
| /* > QSTORE is REAL array, dimension (N**2+1) */ | |||||
| /* > Stores eigenvectors of submatrices encountered during */ | |||||
| /* > divide and conquer, packed together. QPTR points to */ | |||||
| /* > beginning of the submatrices. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in,out] QPTR */ | |||||
| /* > \verbatim */ | |||||
| /* > QPTR is INTEGER array, dimension (N+2) */ | |||||
| /* > List of indices pointing to beginning of submatrices stored */ | |||||
| /* > in QSTORE. The submatrices are numbered starting at the */ | |||||
| /* > bottom left of the divide and conquer tree, from left to */ | |||||
| /* > right and bottom to top. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] PRMPTR */ | |||||
| /* > \verbatim */ | |||||
| /* > PRMPTR is INTEGER array, dimension (N lg N) */ | |||||
| /* > Contains a list of pointers which indicate where in PERM a */ | |||||
| /* > level's permutation is stored. PRMPTR(i+1) - PRMPTR(i) */ | |||||
| /* > indicates the size of the permutation and also the size of */ | |||||
| /* > the full, non-deflated problem. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] PERM */ | |||||
| /* > \verbatim */ | |||||
| /* > PERM is INTEGER array, dimension (N lg N) */ | |||||
| /* > Contains the permutations (from deflation and sorting) to be */ | |||||
| /* > applied to each eigenblock. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] GIVPTR */ | |||||
| /* > \verbatim */ | |||||
| /* > GIVPTR is INTEGER array, dimension (N lg N) */ | |||||
| /* > Contains a list of pointers which indicate where in GIVCOL a */ | |||||
| /* > level's Givens rotations are stored. GIVPTR(i+1) - GIVPTR(i) */ | |||||
| /* > indicates the number of Givens rotations. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] GIVCOL */ | |||||
| /* > \verbatim */ | |||||
| /* > GIVCOL is INTEGER array, dimension (2, N lg N) */ | |||||
| /* > Each pair of numbers indicates a pair of columns to take place */ | |||||
| /* > in a Givens rotation. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] GIVNUM */ | |||||
| /* > \verbatim */ | |||||
| /* > GIVNUM is REAL array, dimension (2, N lg N) */ | |||||
| /* > Each number indicates the S value to be used in the */ | |||||
| /* > corresponding Givens rotation. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] INFO */ | |||||
| /* > \verbatim */ | |||||
| /* > INFO is INTEGER */ | |||||
| /* > = 0: successful exit. */ | |||||
| /* > < 0: if INFO = -i, the i-th argument had an illegal value. */ | |||||
| /* > > 0: if INFO = 1, an eigenvalue did not converge */ | |||||
| /* > \endverbatim */ | |||||
| /* Authors: */ | |||||
| /* ======== */ | |||||
| /* > \author Univ. of Tennessee */ | |||||
| /* > \author Univ. of California Berkeley */ | |||||
| /* > \author Univ. of Colorado Denver */ | |||||
| /* > \author NAG Ltd. */ | |||||
| /* > \date June 2016 */ | |||||
| /* > \ingroup complexOTHERcomputational */ | |||||
| /* ===================================================================== */ | |||||
| /* Subroutine */ int claed7_(integer *n, integer *cutpnt, integer *qsiz, | |||||
| integer *tlvls, integer *curlvl, integer *curpbm, real *d__, complex * | |||||
| q, integer *ldq, real *rho, integer *indxq, real *qstore, integer * | |||||
| qptr, integer *prmptr, integer *perm, integer *givptr, integer * | |||||
| givcol, real *givnum, complex *work, real *rwork, integer *iwork, | |||||
| integer *info) | |||||
| { | |||||
| /* System generated locals */ | |||||
| integer q_dim1, q_offset, i__1, i__2; | |||||
| /* Local variables */ | |||||
| integer indx, curr, i__, k, indxc, indxp, n1, n2; | |||||
| extern /* Subroutine */ int claed8_(integer *, integer *, integer *, | |||||
| complex *, integer *, real *, real *, integer *, real *, real *, | |||||
| complex *, integer *, real *, integer *, integer *, integer *, | |||||
| integer *, integer *, integer *, real *, integer *), slaed9_( | |||||
| integer *, integer *, integer *, integer *, real *, real *, | |||||
| integer *, real *, real *, real *, real *, integer *, integer *), | |||||
| slaeda_(integer *, integer *, integer *, integer *, integer *, | |||||
| integer *, integer *, integer *, real *, real *, integer *, real * | |||||
| , real *, integer *); | |||||
| integer idlmda, iq, iw; | |||||
| extern /* Subroutine */ int clacrm_(integer *, integer *, complex *, | |||||
| integer *, real *, integer *, complex *, integer *, real *); | |||||
| integer iz; | |||||
| extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen), slamrg_( | |||||
| integer *, integer *, real *, integer *, integer *, integer *); | |||||
| integer coltyp, ptr; | |||||
| /* -- LAPACK computational routine (version 3.7.0) -- */ | |||||
| /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ | |||||
| /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ | |||||
| /* June 2016 */ | |||||
| /* ===================================================================== */ | |||||
| /* Test the input parameters. */ | |||||
| /* Parameter adjustments */ | |||||
| --d__; | |||||
| q_dim1 = *ldq; | |||||
| q_offset = 1 + q_dim1 * 1; | |||||
| q -= q_offset; | |||||
| --indxq; | |||||
| --qstore; | |||||
| --qptr; | |||||
| --prmptr; | |||||
| --perm; | |||||
| --givptr; | |||||
| givcol -= 3; | |||||
| givnum -= 3; | |||||
| --work; | |||||
| --rwork; | |||||
| --iwork; | |||||
| /* Function Body */ | |||||
| *info = 0; | |||||
| /* IF( ICOMPQ.LT.0 .OR. ICOMPQ.GT.1 ) THEN */ | |||||
| /* INFO = -1 */ | |||||
| /* ELSE IF( N.LT.0 ) THEN */ | |||||
| if (*n < 0) { | |||||
| *info = -1; | |||||
| } else if (f2cmin(1,*n) > *cutpnt || *n < *cutpnt) { | |||||
| *info = -2; | |||||
| } else if (*qsiz < *n) { | |||||
| *info = -3; | |||||
| } else if (*ldq < f2cmax(1,*n)) { | |||||
| *info = -9; | |||||
| } | |||||
| if (*info != 0) { | |||||
| i__1 = -(*info); | |||||
| xerbla_("CLAED7", &i__1, (ftnlen)6); | |||||
| return 0; | |||||
| } | |||||
| /* Quick return if possible */ | |||||
| if (*n == 0) { | |||||
| return 0; | |||||
| } | |||||
| /* The following values are for bookkeeping purposes only. They are */ | |||||
| /* integer pointers which indicate the portion of the workspace */ | |||||
| /* used by a particular array in SLAED2 and SLAED3. */ | |||||
| iz = 1; | |||||
| idlmda = iz + *n; | |||||
| iw = idlmda + *n; | |||||
| iq = iw + *n; | |||||
| indx = 1; | |||||
| indxc = indx + *n; | |||||
| coltyp = indxc + *n; | |||||
| indxp = coltyp + *n; | |||||
| /* Form the z-vector which consists of the last row of Q_1 and the */ | |||||
| /* first row of Q_2. */ | |||||
| ptr = pow_ii(&c__2, tlvls) + 1; | |||||
| i__1 = *curlvl - 1; | |||||
| for (i__ = 1; i__ <= i__1; ++i__) { | |||||
| i__2 = *tlvls - i__; | |||||
| ptr += pow_ii(&c__2, &i__2); | |||||
| /* L10: */ | |||||
| } | |||||
| curr = ptr + *curpbm; | |||||
| slaeda_(n, tlvls, curlvl, curpbm, &prmptr[1], &perm[1], &givptr[1], & | |||||
| givcol[3], &givnum[3], &qstore[1], &qptr[1], &rwork[iz], &rwork[ | |||||
| iz + *n], info); | |||||
| /* When solving the final problem, we no longer need the stored data, */ | |||||
| /* so we will overwrite the data from this level onto the previously */ | |||||
| /* used storage space. */ | |||||
| if (*curlvl == *tlvls) { | |||||
| qptr[curr] = 1; | |||||
| prmptr[curr] = 1; | |||||
| givptr[curr] = 1; | |||||
| } | |||||
| /* Sort and Deflate eigenvalues. */ | |||||
| claed8_(&k, n, qsiz, &q[q_offset], ldq, &d__[1], rho, cutpnt, &rwork[iz], | |||||
| &rwork[idlmda], &work[1], qsiz, &rwork[iw], &iwork[indxp], &iwork[ | |||||
| indx], &indxq[1], &perm[prmptr[curr]], &givptr[curr + 1], &givcol[ | |||||
| (givptr[curr] << 1) + 1], &givnum[(givptr[curr] << 1) + 1], info); | |||||
| prmptr[curr + 1] = prmptr[curr] + *n; | |||||
| givptr[curr + 1] += givptr[curr]; | |||||
| /* Solve Secular Equation. */ | |||||
| if (k != 0) { | |||||
| slaed9_(&k, &c__1, &k, n, &d__[1], &rwork[iq], &k, rho, &rwork[idlmda] | |||||
| , &rwork[iw], &qstore[qptr[curr]], &k, info); | |||||
| clacrm_(qsiz, &k, &work[1], qsiz, &qstore[qptr[curr]], &k, &q[ | |||||
| q_offset], ldq, &rwork[iq]); | |||||
| /* Computing 2nd power */ | |||||
| i__1 = k; | |||||
| qptr[curr + 1] = qptr[curr] + i__1 * i__1; | |||||
| if (*info != 0) { | |||||
| return 0; | |||||
| } | |||||
| /* Prepare the INDXQ sorting premutation. */ | |||||
| n1 = k; | |||||
| n2 = *n - k; | |||||
| slamrg_(&n1, &n2, &d__[1], &c__1, &c_n1, &indxq[1]); | |||||
| } else { | |||||
| qptr[curr + 1] = qptr[curr]; | |||||
| i__1 = *n; | |||||
| for (i__ = 1; i__ <= i__1; ++i__) { | |||||
| indxq[i__] = i__; | |||||
| /* L20: */ | |||||
| } | |||||
| } | |||||
| return 0; | |||||
| /* End of CLAED7 */ | |||||
| } /* claed7_ */ | |||||
| @@ -0,0 +1,920 @@ | |||||
| /* f2c.h -- Standard Fortran to C header file */ | |||||
| /** barf [ba:rf] 2. "He suggested using FORTRAN, and everybody barfed." | |||||
| - From The Shogakukan DICTIONARY OF NEW ENGLISH (Second edition) */ | |||||
| #ifndef F2C_INCLUDE | |||||
| #define F2C_INCLUDE | |||||
| #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 | |||||
| typedef int 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; | |||||
| 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;} | |||||
| #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)); } | |||||
| #define c_div(c, a, b) {pCf(c) = Cf(a)/Cf(b);} | |||||
| #define z_div(c, a, b) {pCd(c) = Cd(a)/Cd(b);} | |||||
| #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) = conj(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) (cimag(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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotc_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void cdotu_(complex *z, integer *n_, complex *x, integer *incx_, complex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotu_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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) | |||||
| */ | |||||
| /* Table of constant values */ | |||||
| static real c_b3 = -1.f; | |||||
| static integer c__1 = 1; | |||||
| /* > \brief \b CLAED8 used by sstedc. Merges eigenvalues and deflates secular equation. Used when the original | |||||
| matrix is dense. */ | |||||
| /* =========== DOCUMENTATION =========== */ | |||||
| /* Online html documentation available at */ | |||||
| /* http://www.netlib.org/lapack/explore-html/ */ | |||||
| /* > \htmlonly */ | |||||
| /* > Download CLAED8 + dependencies */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/claed8. | |||||
| f"> */ | |||||
| /* > [TGZ]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/claed8. | |||||
| f"> */ | |||||
| /* > [ZIP]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/claed8. | |||||
| f"> */ | |||||
| /* > [TXT]</a> */ | |||||
| /* > \endhtmlonly */ | |||||
| /* Definition: */ | |||||
| /* =========== */ | |||||
| /* SUBROUTINE CLAED8( K, N, QSIZ, Q, LDQ, D, RHO, CUTPNT, Z, DLAMDA, */ | |||||
| /* Q2, LDQ2, W, INDXP, INDX, INDXQ, PERM, GIVPTR, */ | |||||
| /* GIVCOL, GIVNUM, INFO ) */ | |||||
| /* INTEGER CUTPNT, GIVPTR, INFO, K, LDQ, LDQ2, N, QSIZ */ | |||||
| /* REAL RHO */ | |||||
| /* INTEGER GIVCOL( 2, * ), INDX( * ), INDXP( * ), */ | |||||
| /* $ INDXQ( * ), PERM( * ) */ | |||||
| /* REAL D( * ), DLAMDA( * ), GIVNUM( 2, * ), W( * ), */ | |||||
| /* $ Z( * ) */ | |||||
| /* COMPLEX Q( LDQ, * ), Q2( LDQ2, * ) */ | |||||
| /* > \par Purpose: */ | |||||
| /* ============= */ | |||||
| /* > */ | |||||
| /* > \verbatim */ | |||||
| /* > */ | |||||
| /* > CLAED8 merges the two sets of eigenvalues together into a single */ | |||||
| /* > sorted set. Then it tries to deflate the size of the problem. */ | |||||
| /* > There are two ways in which deflation can occur: when two or more */ | |||||
| /* > eigenvalues are close together or if there is a tiny element in the */ | |||||
| /* > Z vector. For each such occurrence the order of the related secular */ | |||||
| /* > equation problem is reduced by one. */ | |||||
| /* > \endverbatim */ | |||||
| /* Arguments: */ | |||||
| /* ========== */ | |||||
| /* > \param[out] K */ | |||||
| /* > \verbatim */ | |||||
| /* > K is INTEGER */ | |||||
| /* > Contains the number of non-deflated eigenvalues. */ | |||||
| /* > This is the order of the related secular equation. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] N */ | |||||
| /* > \verbatim */ | |||||
| /* > N is INTEGER */ | |||||
| /* > The dimension of the symmetric tridiagonal matrix. N >= 0. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] QSIZ */ | |||||
| /* > \verbatim */ | |||||
| /* > QSIZ is INTEGER */ | |||||
| /* > The dimension of the unitary matrix used to reduce */ | |||||
| /* > the dense or band matrix to tridiagonal form. */ | |||||
| /* > QSIZ >= N if ICOMPQ = 1. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in,out] Q */ | |||||
| /* > \verbatim */ | |||||
| /* > Q is COMPLEX array, dimension (LDQ,N) */ | |||||
| /* > On entry, Q contains the eigenvectors of the partially solved */ | |||||
| /* > system which has been previously updated in matrix */ | |||||
| /* > multiplies with other partially solved eigensystems. */ | |||||
| /* > On exit, Q contains the trailing (N-K) updated eigenvectors */ | |||||
| /* > (those which were deflated) in its last N-K columns. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] LDQ */ | |||||
| /* > \verbatim */ | |||||
| /* > LDQ is INTEGER */ | |||||
| /* > The leading dimension of the array Q. LDQ >= f2cmax( 1, N ). */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in,out] D */ | |||||
| /* > \verbatim */ | |||||
| /* > D is REAL array, dimension (N) */ | |||||
| /* > On entry, D contains the eigenvalues of the two submatrices to */ | |||||
| /* > be combined. On exit, D contains the trailing (N-K) updated */ | |||||
| /* > eigenvalues (those which were deflated) sorted into increasing */ | |||||
| /* > order. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in,out] RHO */ | |||||
| /* > \verbatim */ | |||||
| /* > RHO is REAL */ | |||||
| /* > Contains the off diagonal element associated with the rank-1 */ | |||||
| /* > cut which originally split the two submatrices which are now */ | |||||
| /* > being recombined. RHO is modified during the computation to */ | |||||
| /* > the value required by SLAED3. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] CUTPNT */ | |||||
| /* > \verbatim */ | |||||
| /* > CUTPNT is INTEGER */ | |||||
| /* > Contains the location of the last eigenvalue in the leading */ | |||||
| /* > sub-matrix. MIN(1,N) <= CUTPNT <= N. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] Z */ | |||||
| /* > \verbatim */ | |||||
| /* > Z is REAL array, dimension (N) */ | |||||
| /* > On input this vector contains the updating vector (the last */ | |||||
| /* > row of the first sub-eigenvector matrix and the first row of */ | |||||
| /* > the second sub-eigenvector matrix). The contents of Z are */ | |||||
| /* > destroyed during the updating process. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] DLAMDA */ | |||||
| /* > \verbatim */ | |||||
| /* > DLAMDA is REAL array, dimension (N) */ | |||||
| /* > Contains a copy of the first K eigenvalues which will be used */ | |||||
| /* > by SLAED3 to form the secular equation. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] Q2 */ | |||||
| /* > \verbatim */ | |||||
| /* > Q2 is COMPLEX array, dimension (LDQ2,N) */ | |||||
| /* > If ICOMPQ = 0, Q2 is not referenced. Otherwise, */ | |||||
| /* > Contains a copy of the first K eigenvectors which will be used */ | |||||
| /* > by SLAED7 in a matrix multiply (SGEMM) to update the new */ | |||||
| /* > eigenvectors. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] LDQ2 */ | |||||
| /* > \verbatim */ | |||||
| /* > LDQ2 is INTEGER */ | |||||
| /* > The leading dimension of the array Q2. LDQ2 >= f2cmax( 1, N ). */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] W */ | |||||
| /* > \verbatim */ | |||||
| /* > W is REAL array, dimension (N) */ | |||||
| /* > This will hold the first k values of the final */ | |||||
| /* > deflation-altered z-vector and will be passed to SLAED3. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] INDXP */ | |||||
| /* > \verbatim */ | |||||
| /* > INDXP is INTEGER array, dimension (N) */ | |||||
| /* > This will contain the permutation used to place deflated */ | |||||
| /* > values of D at the end of the array. On output INDXP(1:K) */ | |||||
| /* > points to the nondeflated D-values and INDXP(K+1:N) */ | |||||
| /* > points to the deflated eigenvalues. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] INDX */ | |||||
| /* > \verbatim */ | |||||
| /* > INDX is INTEGER array, dimension (N) */ | |||||
| /* > This will contain the permutation used to sort the contents of */ | |||||
| /* > D into ascending order. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] INDXQ */ | |||||
| /* > \verbatim */ | |||||
| /* > INDXQ is INTEGER array, dimension (N) */ | |||||
| /* > This contains the permutation which separately sorts the two */ | |||||
| /* > sub-problems in D into ascending order. Note that elements in */ | |||||
| /* > the second half of this permutation must first have CUTPNT */ | |||||
| /* > added to their values in order to be accurate. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] PERM */ | |||||
| /* > \verbatim */ | |||||
| /* > PERM is INTEGER array, dimension (N) */ | |||||
| /* > Contains the permutations (from deflation and sorting) to be */ | |||||
| /* > applied to each eigenblock. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] GIVPTR */ | |||||
| /* > \verbatim */ | |||||
| /* > GIVPTR is INTEGER */ | |||||
| /* > Contains the number of Givens rotations which took place in */ | |||||
| /* > this subproblem. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] GIVCOL */ | |||||
| /* > \verbatim */ | |||||
| /* > GIVCOL is INTEGER array, dimension (2, N) */ | |||||
| /* > Each pair of numbers indicates a pair of columns to take place */ | |||||
| /* > in a Givens rotation. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] GIVNUM */ | |||||
| /* > \verbatim */ | |||||
| /* > GIVNUM is REAL array, dimension (2, N) */ | |||||
| /* > Each number indicates the S value to be used in the */ | |||||
| /* > corresponding Givens rotation. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] INFO */ | |||||
| /* > \verbatim */ | |||||
| /* > INFO is INTEGER */ | |||||
| /* > = 0: successful exit. */ | |||||
| /* > < 0: if INFO = -i, the i-th argument had an illegal value. */ | |||||
| /* > \endverbatim */ | |||||
| /* Authors: */ | |||||
| /* ======== */ | |||||
| /* > \author Univ. of Tennessee */ | |||||
| /* > \author Univ. of California Berkeley */ | |||||
| /* > \author Univ. of Colorado Denver */ | |||||
| /* > \author NAG Ltd. */ | |||||
| /* > \date December 2016 */ | |||||
| /* > \ingroup complexOTHERcomputational */ | |||||
| /* ===================================================================== */ | |||||
| /* Subroutine */ int claed8_(integer *k, integer *n, integer *qsiz, complex * | |||||
| q, integer *ldq, real *d__, real *rho, integer *cutpnt, real *z__, | |||||
| real *dlamda, complex *q2, integer *ldq2, real *w, integer *indxp, | |||||
| integer *indx, integer *indxq, integer *perm, integer *givptr, | |||||
| integer *givcol, real *givnum, integer *info) | |||||
| { | |||||
| /* System generated locals */ | |||||
| integer q_dim1, q_offset, q2_dim1, q2_offset, i__1; | |||||
| real r__1; | |||||
| /* Local variables */ | |||||
| integer jlam, imax, jmax; | |||||
| real c__; | |||||
| integer i__, j; | |||||
| real s, t; | |||||
| extern /* Subroutine */ int sscal_(integer *, real *, real *, integer *), | |||||
| ccopy_(integer *, complex *, integer *, complex *, integer *), | |||||
| csrot_(integer *, complex *, integer *, complex *, integer *, | |||||
| real *, real *); | |||||
| integer k2; | |||||
| extern /* Subroutine */ int scopy_(integer *, real *, integer *, real *, | |||||
| integer *); | |||||
| integer n1, n2; | |||||
| extern real slapy2_(real *, real *); | |||||
| integer jp; | |||||
| extern real slamch_(char *); | |||||
| extern /* Subroutine */ int clacpy_(char *, integer *, integer *, complex | |||||
| *, integer *, complex *, integer *), xerbla_(char *, | |||||
| integer *, ftnlen); | |||||
| extern integer isamax_(integer *, real *, integer *); | |||||
| extern /* Subroutine */ int slamrg_(integer *, integer *, real *, integer | |||||
| *, integer *, integer *); | |||||
| integer n1p1; | |||||
| real eps, tau, tol; | |||||
| /* -- LAPACK computational routine (version 3.7.0) -- */ | |||||
| /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ | |||||
| /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ | |||||
| /* December 2016 */ | |||||
| /* ===================================================================== */ | |||||
| /* Test the input parameters. */ | |||||
| /* Parameter adjustments */ | |||||
| q_dim1 = *ldq; | |||||
| q_offset = 1 + q_dim1 * 1; | |||||
| q -= q_offset; | |||||
| --d__; | |||||
| --z__; | |||||
| --dlamda; | |||||
| q2_dim1 = *ldq2; | |||||
| q2_offset = 1 + q2_dim1 * 1; | |||||
| q2 -= q2_offset; | |||||
| --w; | |||||
| --indxp; | |||||
| --indx; | |||||
| --indxq; | |||||
| --perm; | |||||
| givcol -= 3; | |||||
| givnum -= 3; | |||||
| /* Function Body */ | |||||
| *info = 0; | |||||
| if (*n < 0) { | |||||
| *info = -2; | |||||
| } else if (*qsiz < *n) { | |||||
| *info = -3; | |||||
| } else if (*ldq < f2cmax(1,*n)) { | |||||
| *info = -5; | |||||
| } else if (*cutpnt < f2cmin(1,*n) || *cutpnt > *n) { | |||||
| *info = -8; | |||||
| } else if (*ldq2 < f2cmax(1,*n)) { | |||||
| *info = -12; | |||||
| } | |||||
| if (*info != 0) { | |||||
| i__1 = -(*info); | |||||
| xerbla_("CLAED8", &i__1, (ftnlen)6); | |||||
| return 0; | |||||
| } | |||||
| /* Need to initialize GIVPTR to O here in case of quick exit */ | |||||
| /* to prevent an unspecified code behavior (usually sigfault) */ | |||||
| /* when IWORK array on entry to *stedc is not zeroed */ | |||||
| /* (or at least some IWORK entries which used in *laed7 for GIVPTR). */ | |||||
| *givptr = 0; | |||||
| /* Quick return if possible */ | |||||
| if (*n == 0) { | |||||
| return 0; | |||||
| } | |||||
| n1 = *cutpnt; | |||||
| n2 = *n - n1; | |||||
| n1p1 = n1 + 1; | |||||
| if (*rho < 0.f) { | |||||
| sscal_(&n2, &c_b3, &z__[n1p1], &c__1); | |||||
| } | |||||
| /* Normalize z so that norm(z) = 1 */ | |||||
| t = 1.f / sqrt(2.f); | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| indx[j] = j; | |||||
| /* L10: */ | |||||
| } | |||||
| sscal_(n, &t, &z__[1], &c__1); | |||||
| *rho = (r__1 = *rho * 2.f, abs(r__1)); | |||||
| /* Sort the eigenvalues into increasing order */ | |||||
| i__1 = *n; | |||||
| for (i__ = *cutpnt + 1; i__ <= i__1; ++i__) { | |||||
| indxq[i__] += *cutpnt; | |||||
| /* L20: */ | |||||
| } | |||||
| i__1 = *n; | |||||
| for (i__ = 1; i__ <= i__1; ++i__) { | |||||
| dlamda[i__] = d__[indxq[i__]]; | |||||
| w[i__] = z__[indxq[i__]]; | |||||
| /* L30: */ | |||||
| } | |||||
| i__ = 1; | |||||
| j = *cutpnt + 1; | |||||
| slamrg_(&n1, &n2, &dlamda[1], &c__1, &c__1, &indx[1]); | |||||
| i__1 = *n; | |||||
| for (i__ = 1; i__ <= i__1; ++i__) { | |||||
| d__[i__] = dlamda[indx[i__]]; | |||||
| z__[i__] = w[indx[i__]]; | |||||
| /* L40: */ | |||||
| } | |||||
| /* Calculate the allowable deflation tolerance */ | |||||
| imax = isamax_(n, &z__[1], &c__1); | |||||
| jmax = isamax_(n, &d__[1], &c__1); | |||||
| eps = slamch_("Epsilon"); | |||||
| tol = eps * 8.f * (r__1 = d__[jmax], abs(r__1)); | |||||
| /* If the rank-1 modifier is small enough, no more needs to be done */ | |||||
| /* -- except to reorganize Q so that its columns correspond with the */ | |||||
| /* elements in D. */ | |||||
| if (*rho * (r__1 = z__[imax], abs(r__1)) <= tol) { | |||||
| *k = 0; | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| perm[j] = indxq[indx[j]]; | |||||
| ccopy_(qsiz, &q[perm[j] * q_dim1 + 1], &c__1, &q2[j * q2_dim1 + 1] | |||||
| , &c__1); | |||||
| /* L50: */ | |||||
| } | |||||
| clacpy_("A", qsiz, n, &q2[q2_dim1 + 1], ldq2, &q[q_dim1 + 1], ldq); | |||||
| return 0; | |||||
| } | |||||
| /* If there are multiple eigenvalues then the problem deflates. Here */ | |||||
| /* the number of equal eigenvalues are found. As each equal */ | |||||
| /* eigenvalue is found, an elementary reflector is computed to rotate */ | |||||
| /* the corresponding eigensubspace so that the corresponding */ | |||||
| /* components of Z are zero in this new basis. */ | |||||
| *k = 0; | |||||
| k2 = *n + 1; | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| if (*rho * (r__1 = z__[j], abs(r__1)) <= tol) { | |||||
| /* Deflate due to small z component. */ | |||||
| --k2; | |||||
| indxp[k2] = j; | |||||
| if (j == *n) { | |||||
| goto L100; | |||||
| } | |||||
| } else { | |||||
| jlam = j; | |||||
| goto L70; | |||||
| } | |||||
| /* L60: */ | |||||
| } | |||||
| L70: | |||||
| ++j; | |||||
| if (j > *n) { | |||||
| goto L90; | |||||
| } | |||||
| if (*rho * (r__1 = z__[j], abs(r__1)) <= tol) { | |||||
| /* Deflate due to small z component. */ | |||||
| --k2; | |||||
| indxp[k2] = j; | |||||
| } else { | |||||
| /* Check if eigenvalues are close enough to allow deflation. */ | |||||
| s = z__[jlam]; | |||||
| c__ = z__[j]; | |||||
| /* Find sqrt(a**2+b**2) without overflow or */ | |||||
| /* destructive underflow. */ | |||||
| tau = slapy2_(&c__, &s); | |||||
| t = d__[j] - d__[jlam]; | |||||
| c__ /= tau; | |||||
| s = -s / tau; | |||||
| if ((r__1 = t * c__ * s, abs(r__1)) <= tol) { | |||||
| /* Deflation is possible. */ | |||||
| z__[j] = tau; | |||||
| z__[jlam] = 0.f; | |||||
| /* Record the appropriate Givens rotation */ | |||||
| ++(*givptr); | |||||
| givcol[(*givptr << 1) + 1] = indxq[indx[jlam]]; | |||||
| givcol[(*givptr << 1) + 2] = indxq[indx[j]]; | |||||
| givnum[(*givptr << 1) + 1] = c__; | |||||
| givnum[(*givptr << 1) + 2] = s; | |||||
| csrot_(qsiz, &q[indxq[indx[jlam]] * q_dim1 + 1], &c__1, &q[indxq[ | |||||
| indx[j]] * q_dim1 + 1], &c__1, &c__, &s); | |||||
| t = d__[jlam] * c__ * c__ + d__[j] * s * s; | |||||
| d__[j] = d__[jlam] * s * s + d__[j] * c__ * c__; | |||||
| d__[jlam] = t; | |||||
| --k2; | |||||
| i__ = 1; | |||||
| L80: | |||||
| if (k2 + i__ <= *n) { | |||||
| if (d__[jlam] < d__[indxp[k2 + i__]]) { | |||||
| indxp[k2 + i__ - 1] = indxp[k2 + i__]; | |||||
| indxp[k2 + i__] = jlam; | |||||
| ++i__; | |||||
| goto L80; | |||||
| } else { | |||||
| indxp[k2 + i__ - 1] = jlam; | |||||
| } | |||||
| } else { | |||||
| indxp[k2 + i__ - 1] = jlam; | |||||
| } | |||||
| jlam = j; | |||||
| } else { | |||||
| ++(*k); | |||||
| w[*k] = z__[jlam]; | |||||
| dlamda[*k] = d__[jlam]; | |||||
| indxp[*k] = jlam; | |||||
| jlam = j; | |||||
| } | |||||
| } | |||||
| goto L70; | |||||
| L90: | |||||
| /* Record the last eigenvalue. */ | |||||
| ++(*k); | |||||
| w[*k] = z__[jlam]; | |||||
| dlamda[*k] = d__[jlam]; | |||||
| indxp[*k] = jlam; | |||||
| L100: | |||||
| /* Sort the eigenvalues and corresponding eigenvectors into DLAMDA */ | |||||
| /* and Q2 respectively. The eigenvalues/vectors which were not */ | |||||
| /* deflated go into the first K slots of DLAMDA and Q2 respectively, */ | |||||
| /* while those which were deflated go into the last N - K slots. */ | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| jp = indxp[j]; | |||||
| dlamda[j] = d__[jp]; | |||||
| perm[j] = indxq[indx[jp]]; | |||||
| ccopy_(qsiz, &q[perm[j] * q_dim1 + 1], &c__1, &q2[j * q2_dim1 + 1], & | |||||
| c__1); | |||||
| /* L110: */ | |||||
| } | |||||
| /* The deflated eigenvalues and their corresponding vectors go back */ | |||||
| /* into the last N - K slots of D and Q respectively. */ | |||||
| if (*k < *n) { | |||||
| i__1 = *n - *k; | |||||
| scopy_(&i__1, &dlamda[*k + 1], &c__1, &d__[*k + 1], &c__1); | |||||
| i__1 = *n - *k; | |||||
| clacpy_("A", qsiz, &i__1, &q2[(*k + 1) * q2_dim1 + 1], ldq2, &q[(*k + | |||||
| 1) * q_dim1 + 1], ldq); | |||||
| } | |||||
| return 0; | |||||
| /* End of CLAED8 */ | |||||
| } /* claed8_ */ | |||||
| @@ -0,0 +1,837 @@ | |||||
| /* f2c.h -- Standard Fortran to C header file */ | |||||
| /** barf [ba:rf] 2. "He suggested using FORTRAN, and everybody barfed." | |||||
| - From The Shogakukan DICTIONARY OF NEW ENGLISH (Second edition) */ | |||||
| #ifndef F2C_INCLUDE | |||||
| #define F2C_INCLUDE | |||||
| #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 | |||||
| typedef int 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; | |||||
| 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;} | |||||
| #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)); } | |||||
| #define c_div(c, a, b) {pCf(c) = Cf(a)/Cf(b);} | |||||
| #define z_div(c, a, b) {pCd(c) = Cd(a)/Cd(b);} | |||||
| #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) = conj(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) (cimag(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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotc_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void cdotu_(complex *z, integer *n_, complex *x, integer *incx_, complex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotu_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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) | |||||
| */ | |||||
| /* Table of constant values */ | |||||
| static integer c__1 = 1; | |||||
| /* > \brief \b CLAEIN computes a specified right or left eigenvector of an upper Hessenberg matrix by inverse | |||||
| iteration. */ | |||||
| /* =========== DOCUMENTATION =========== */ | |||||
| /* Online html documentation available at */ | |||||
| /* http://www.netlib.org/lapack/explore-html/ */ | |||||
| /* > \htmlonly */ | |||||
| /* > Download CLAEIN + dependencies */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/claein. | |||||
| f"> */ | |||||
| /* > [TGZ]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/claein. | |||||
| f"> */ | |||||
| /* > [ZIP]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/claein. | |||||
| f"> */ | |||||
| /* > [TXT]</a> */ | |||||
| /* > \endhtmlonly */ | |||||
| /* Definition: */ | |||||
| /* =========== */ | |||||
| /* SUBROUTINE CLAEIN( RIGHTV, NOINIT, N, H, LDH, W, V, B, LDB, RWORK, */ | |||||
| /* EPS3, SMLNUM, INFO ) */ | |||||
| /* LOGICAL NOINIT, RIGHTV */ | |||||
| /* INTEGER INFO, LDB, LDH, N */ | |||||
| /* REAL EPS3, SMLNUM */ | |||||
| /* COMPLEX W */ | |||||
| /* REAL RWORK( * ) */ | |||||
| /* COMPLEX B( LDB, * ), H( LDH, * ), V( * ) */ | |||||
| /* > \par Purpose: */ | |||||
| /* ============= */ | |||||
| /* > */ | |||||
| /* > \verbatim */ | |||||
| /* > */ | |||||
| /* > CLAEIN uses inverse iteration to find a right or left eigenvector */ | |||||
| /* > corresponding to the eigenvalue W of a complex upper Hessenberg */ | |||||
| /* > matrix H. */ | |||||
| /* > \endverbatim */ | |||||
| /* Arguments: */ | |||||
| /* ========== */ | |||||
| /* > \param[in] RIGHTV */ | |||||
| /* > \verbatim */ | |||||
| /* > RIGHTV is LOGICAL */ | |||||
| /* > = .TRUE. : compute right eigenvector; */ | |||||
| /* > = .FALSE.: compute left eigenvector. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] NOINIT */ | |||||
| /* > \verbatim */ | |||||
| /* > NOINIT is LOGICAL */ | |||||
| /* > = .TRUE. : no initial vector supplied in V */ | |||||
| /* > = .FALSE.: initial vector supplied in V. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] N */ | |||||
| /* > \verbatim */ | |||||
| /* > N is INTEGER */ | |||||
| /* > The order of the matrix H. N >= 0. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] H */ | |||||
| /* > \verbatim */ | |||||
| /* > H is COMPLEX array, dimension (LDH,N) */ | |||||
| /* > The upper Hessenberg matrix H. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] LDH */ | |||||
| /* > \verbatim */ | |||||
| /* > LDH is INTEGER */ | |||||
| /* > The leading dimension of the array H. LDH >= f2cmax(1,N). */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] W */ | |||||
| /* > \verbatim */ | |||||
| /* > W is COMPLEX */ | |||||
| /* > The eigenvalue of H whose corresponding right or left */ | |||||
| /* > eigenvector is to be computed. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in,out] V */ | |||||
| /* > \verbatim */ | |||||
| /* > V is COMPLEX array, dimension (N) */ | |||||
| /* > On entry, if NOINIT = .FALSE., V must contain a starting */ | |||||
| /* > vector for inverse iteration; otherwise V need not be set. */ | |||||
| /* > On exit, V contains the computed eigenvector, normalized so */ | |||||
| /* > that the component of largest magnitude has magnitude 1; here */ | |||||
| /* > the magnitude of a complex number (x,y) is taken to be */ | |||||
| /* > |x| + |y|. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] B */ | |||||
| /* > \verbatim */ | |||||
| /* > B is COMPLEX array, dimension (LDB,N) */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] LDB */ | |||||
| /* > \verbatim */ | |||||
| /* > LDB is INTEGER */ | |||||
| /* > The leading dimension of the array B. LDB >= f2cmax(1,N). */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] RWORK */ | |||||
| /* > \verbatim */ | |||||
| /* > RWORK is REAL array, dimension (N) */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] EPS3 */ | |||||
| /* > \verbatim */ | |||||
| /* > EPS3 is REAL */ | |||||
| /* > A small machine-dependent value which is used to perturb */ | |||||
| /* > close eigenvalues, and to replace zero pivots. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] SMLNUM */ | |||||
| /* > \verbatim */ | |||||
| /* > SMLNUM is REAL */ | |||||
| /* > A machine-dependent value close to the underflow threshold. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] INFO */ | |||||
| /* > \verbatim */ | |||||
| /* > INFO is INTEGER */ | |||||
| /* > = 0: successful exit */ | |||||
| /* > = 1: inverse iteration did not converge; V is set to the */ | |||||
| /* > last iterate. */ | |||||
| /* > \endverbatim */ | |||||
| /* Authors: */ | |||||
| /* ======== */ | |||||
| /* > \author Univ. of Tennessee */ | |||||
| /* > \author Univ. of California Berkeley */ | |||||
| /* > \author Univ. of Colorado Denver */ | |||||
| /* > \author NAG Ltd. */ | |||||
| /* > \date December 2016 */ | |||||
| /* > \ingroup complexOTHERauxiliary */ | |||||
| /* ===================================================================== */ | |||||
| /* Subroutine */ int claein_(logical *rightv, logical *noinit, integer *n, | |||||
| complex *h__, integer *ldh, complex *w, complex *v, complex *b, | |||||
| integer *ldb, real *rwork, real *eps3, real *smlnum, integer *info) | |||||
| { | |||||
| /* System generated locals */ | |||||
| integer b_dim1, b_offset, h_dim1, h_offset, i__1, i__2, i__3, i__4, i__5; | |||||
| real r__1, r__2, r__3, r__4; | |||||
| complex q__1, q__2; | |||||
| /* Local variables */ | |||||
| integer ierr; | |||||
| complex temp; | |||||
| integer i__, j; | |||||
| real scale; | |||||
| complex x; | |||||
| char trans[1]; | |||||
| real rtemp, rootn, vnorm; | |||||
| extern real scnrm2_(integer *, complex *, integer *); | |||||
| complex ei, ej; | |||||
| extern integer icamax_(integer *, complex *, integer *); | |||||
| extern /* Complex */ VOID cladiv_(complex *, complex *, complex *); | |||||
| extern /* Subroutine */ int csscal_(integer *, real *, complex *, integer | |||||
| *), clatrs_(char *, char *, char *, char *, integer *, complex *, | |||||
| integer *, complex *, real *, real *, integer *); | |||||
| extern real scasum_(integer *, complex *, integer *); | |||||
| char normin[1]; | |||||
| real nrmsml, growto; | |||||
| integer its; | |||||
| /* -- LAPACK auxiliary routine (version 3.7.0) -- */ | |||||
| /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ | |||||
| /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ | |||||
| /* December 2016 */ | |||||
| /* ===================================================================== */ | |||||
| /* Parameter adjustments */ | |||||
| h_dim1 = *ldh; | |||||
| h_offset = 1 + h_dim1 * 1; | |||||
| h__ -= h_offset; | |||||
| --v; | |||||
| b_dim1 = *ldb; | |||||
| b_offset = 1 + b_dim1 * 1; | |||||
| b -= b_offset; | |||||
| --rwork; | |||||
| /* Function Body */ | |||||
| *info = 0; | |||||
| /* GROWTO is the threshold used in the acceptance test for an */ | |||||
| /* eigenvector. */ | |||||
| rootn = sqrt((real) (*n)); | |||||
| growto = .1f / rootn; | |||||
| /* Computing MAX */ | |||||
| r__1 = 1.f, r__2 = *eps3 * rootn; | |||||
| nrmsml = f2cmax(r__1,r__2) * *smlnum; | |||||
| /* Form B = H - W*I (except that the subdiagonal elements are not */ | |||||
| /* stored). */ | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| i__2 = j - 1; | |||||
| for (i__ = 1; i__ <= i__2; ++i__) { | |||||
| i__3 = i__ + j * b_dim1; | |||||
| i__4 = i__ + j * h_dim1; | |||||
| b[i__3].r = h__[i__4].r, b[i__3].i = h__[i__4].i; | |||||
| /* L10: */ | |||||
| } | |||||
| i__2 = j + j * b_dim1; | |||||
| i__3 = j + j * h_dim1; | |||||
| q__1.r = h__[i__3].r - w->r, q__1.i = h__[i__3].i - w->i; | |||||
| b[i__2].r = q__1.r, b[i__2].i = q__1.i; | |||||
| /* L20: */ | |||||
| } | |||||
| if (*noinit) { | |||||
| /* Initialize V. */ | |||||
| i__1 = *n; | |||||
| for (i__ = 1; i__ <= i__1; ++i__) { | |||||
| i__2 = i__; | |||||
| v[i__2].r = *eps3, v[i__2].i = 0.f; | |||||
| /* L30: */ | |||||
| } | |||||
| } else { | |||||
| /* Scale supplied initial vector. */ | |||||
| vnorm = scnrm2_(n, &v[1], &c__1); | |||||
| r__1 = *eps3 * rootn / f2cmax(vnorm,nrmsml); | |||||
| csscal_(n, &r__1, &v[1], &c__1); | |||||
| } | |||||
| if (*rightv) { | |||||
| /* LU decomposition with partial pivoting of B, replacing zero */ | |||||
| /* pivots by EPS3. */ | |||||
| i__1 = *n - 1; | |||||
| for (i__ = 1; i__ <= i__1; ++i__) { | |||||
| i__2 = i__ + 1 + i__ * h_dim1; | |||||
| ei.r = h__[i__2].r, ei.i = h__[i__2].i; | |||||
| i__2 = i__ + i__ * b_dim1; | |||||
| if ((r__1 = b[i__2].r, abs(r__1)) + (r__2 = r_imag(&b[i__ + i__ * | |||||
| b_dim1]), abs(r__2)) < (r__3 = ei.r, abs(r__3)) + (r__4 = | |||||
| r_imag(&ei), abs(r__4))) { | |||||
| /* Interchange rows and eliminate. */ | |||||
| cladiv_(&q__1, &b[i__ + i__ * b_dim1], &ei); | |||||
| x.r = q__1.r, x.i = q__1.i; | |||||
| i__2 = i__ + i__ * b_dim1; | |||||
| b[i__2].r = ei.r, b[i__2].i = ei.i; | |||||
| i__2 = *n; | |||||
| for (j = i__ + 1; j <= i__2; ++j) { | |||||
| i__3 = i__ + 1 + j * b_dim1; | |||||
| temp.r = b[i__3].r, temp.i = b[i__3].i; | |||||
| i__3 = i__ + 1 + j * b_dim1; | |||||
| i__4 = i__ + j * b_dim1; | |||||
| q__2.r = x.r * temp.r - x.i * temp.i, q__2.i = x.r * | |||||
| temp.i + x.i * temp.r; | |||||
| q__1.r = b[i__4].r - q__2.r, q__1.i = b[i__4].i - q__2.i; | |||||
| b[i__3].r = q__1.r, b[i__3].i = q__1.i; | |||||
| i__3 = i__ + j * b_dim1; | |||||
| b[i__3].r = temp.r, b[i__3].i = temp.i; | |||||
| /* L40: */ | |||||
| } | |||||
| } else { | |||||
| /* Eliminate without interchange. */ | |||||
| i__2 = i__ + i__ * b_dim1; | |||||
| if (b[i__2].r == 0.f && b[i__2].i == 0.f) { | |||||
| i__3 = i__ + i__ * b_dim1; | |||||
| b[i__3].r = *eps3, b[i__3].i = 0.f; | |||||
| } | |||||
| cladiv_(&q__1, &ei, &b[i__ + i__ * b_dim1]); | |||||
| x.r = q__1.r, x.i = q__1.i; | |||||
| if (x.r != 0.f || x.i != 0.f) { | |||||
| i__2 = *n; | |||||
| for (j = i__ + 1; j <= i__2; ++j) { | |||||
| i__3 = i__ + 1 + j * b_dim1; | |||||
| i__4 = i__ + 1 + j * b_dim1; | |||||
| i__5 = i__ + j * b_dim1; | |||||
| q__2.r = x.r * b[i__5].r - x.i * b[i__5].i, q__2.i = | |||||
| x.r * b[i__5].i + x.i * b[i__5].r; | |||||
| q__1.r = b[i__4].r - q__2.r, q__1.i = b[i__4].i - | |||||
| q__2.i; | |||||
| b[i__3].r = q__1.r, b[i__3].i = q__1.i; | |||||
| /* L50: */ | |||||
| } | |||||
| } | |||||
| } | |||||
| /* L60: */ | |||||
| } | |||||
| i__1 = *n + *n * b_dim1; | |||||
| if (b[i__1].r == 0.f && b[i__1].i == 0.f) { | |||||
| i__2 = *n + *n * b_dim1; | |||||
| b[i__2].r = *eps3, b[i__2].i = 0.f; | |||||
| } | |||||
| *(unsigned char *)trans = 'N'; | |||||
| } else { | |||||
| /* UL decomposition with partial pivoting of B, replacing zero */ | |||||
| /* pivots by EPS3. */ | |||||
| for (j = *n; j >= 2; --j) { | |||||
| i__1 = j + (j - 1) * h_dim1; | |||||
| ej.r = h__[i__1].r, ej.i = h__[i__1].i; | |||||
| i__1 = j + j * b_dim1; | |||||
| if ((r__1 = b[i__1].r, abs(r__1)) + (r__2 = r_imag(&b[j + j * | |||||
| b_dim1]), abs(r__2)) < (r__3 = ej.r, abs(r__3)) + (r__4 = | |||||
| r_imag(&ej), abs(r__4))) { | |||||
| /* Interchange columns and eliminate. */ | |||||
| cladiv_(&q__1, &b[j + j * b_dim1], &ej); | |||||
| x.r = q__1.r, x.i = q__1.i; | |||||
| i__1 = j + j * b_dim1; | |||||
| b[i__1].r = ej.r, b[i__1].i = ej.i; | |||||
| i__1 = j - 1; | |||||
| for (i__ = 1; i__ <= i__1; ++i__) { | |||||
| i__2 = i__ + (j - 1) * b_dim1; | |||||
| temp.r = b[i__2].r, temp.i = b[i__2].i; | |||||
| i__2 = i__ + (j - 1) * b_dim1; | |||||
| i__3 = i__ + j * b_dim1; | |||||
| q__2.r = x.r * temp.r - x.i * temp.i, q__2.i = x.r * | |||||
| temp.i + x.i * temp.r; | |||||
| q__1.r = b[i__3].r - q__2.r, q__1.i = b[i__3].i - q__2.i; | |||||
| b[i__2].r = q__1.r, b[i__2].i = q__1.i; | |||||
| i__2 = i__ + j * b_dim1; | |||||
| b[i__2].r = temp.r, b[i__2].i = temp.i; | |||||
| /* L70: */ | |||||
| } | |||||
| } else { | |||||
| /* Eliminate without interchange. */ | |||||
| i__1 = j + j * b_dim1; | |||||
| if (b[i__1].r == 0.f && b[i__1].i == 0.f) { | |||||
| i__2 = j + j * b_dim1; | |||||
| b[i__2].r = *eps3, b[i__2].i = 0.f; | |||||
| } | |||||
| cladiv_(&q__1, &ej, &b[j + j * b_dim1]); | |||||
| x.r = q__1.r, x.i = q__1.i; | |||||
| if (x.r != 0.f || x.i != 0.f) { | |||||
| i__1 = j - 1; | |||||
| for (i__ = 1; i__ <= i__1; ++i__) { | |||||
| i__2 = i__ + (j - 1) * b_dim1; | |||||
| i__3 = i__ + (j - 1) * b_dim1; | |||||
| i__4 = i__ + j * b_dim1; | |||||
| q__2.r = x.r * b[i__4].r - x.i * b[i__4].i, q__2.i = | |||||
| x.r * b[i__4].i + x.i * b[i__4].r; | |||||
| q__1.r = b[i__3].r - q__2.r, q__1.i = b[i__3].i - | |||||
| q__2.i; | |||||
| b[i__2].r = q__1.r, b[i__2].i = q__1.i; | |||||
| /* L80: */ | |||||
| } | |||||
| } | |||||
| } | |||||
| /* L90: */ | |||||
| } | |||||
| i__1 = b_dim1 + 1; | |||||
| if (b[i__1].r == 0.f && b[i__1].i == 0.f) { | |||||
| i__2 = b_dim1 + 1; | |||||
| b[i__2].r = *eps3, b[i__2].i = 0.f; | |||||
| } | |||||
| *(unsigned char *)trans = 'C'; | |||||
| } | |||||
| *(unsigned char *)normin = 'N'; | |||||
| i__1 = *n; | |||||
| for (its = 1; its <= i__1; ++its) { | |||||
| /* Solve U*x = scale*v for a right eigenvector */ | |||||
| /* or U**H *x = scale*v for a left eigenvector, */ | |||||
| /* overwriting x on v. */ | |||||
| clatrs_("Upper", trans, "Nonunit", normin, n, &b[b_offset], ldb, &v[1] | |||||
| , &scale, &rwork[1], &ierr); | |||||
| *(unsigned char *)normin = 'Y'; | |||||
| /* Test for sufficient growth in the norm of v. */ | |||||
| vnorm = scasum_(n, &v[1], &c__1); | |||||
| if (vnorm >= growto * scale) { | |||||
| goto L120; | |||||
| } | |||||
| /* Choose new orthogonal starting vector and try again. */ | |||||
| rtemp = *eps3 / (rootn + 1.f); | |||||
| v[1].r = *eps3, v[1].i = 0.f; | |||||
| i__2 = *n; | |||||
| for (i__ = 2; i__ <= i__2; ++i__) { | |||||
| i__3 = i__; | |||||
| v[i__3].r = rtemp, v[i__3].i = 0.f; | |||||
| /* L100: */ | |||||
| } | |||||
| i__2 = *n - its + 1; | |||||
| i__3 = *n - its + 1; | |||||
| r__1 = *eps3 * rootn; | |||||
| q__1.r = v[i__3].r - r__1, q__1.i = v[i__3].i; | |||||
| v[i__2].r = q__1.r, v[i__2].i = q__1.i; | |||||
| /* L110: */ | |||||
| } | |||||
| /* Failure to find eigenvector in N iterations. */ | |||||
| *info = 1; | |||||
| L120: | |||||
| /* Normalize eigenvector. */ | |||||
| i__ = icamax_(n, &v[1], &c__1); | |||||
| i__1 = i__; | |||||
| r__3 = 1.f / ((r__1 = v[i__1].r, abs(r__1)) + (r__2 = r_imag(&v[i__]), | |||||
| abs(r__2))); | |||||
| csscal_(n, &r__3, &v[1], &c__1); | |||||
| return 0; | |||||
| /* End of CLAEIN */ | |||||
| } /* claein_ */ | |||||
| @@ -0,0 +1,636 @@ | |||||
| /* f2c.h -- Standard Fortran to C header file */ | |||||
| /** barf [ba:rf] 2. "He suggested using FORTRAN, and everybody barfed." | |||||
| - From The Shogakukan DICTIONARY OF NEW ENGLISH (Second edition) */ | |||||
| #ifndef F2C_INCLUDE | |||||
| #define F2C_INCLUDE | |||||
| #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 | |||||
| typedef int 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; | |||||
| 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;} | |||||
| #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)); } | |||||
| #define c_div(c, a, b) {pCf(c) = Cf(a)/Cf(b);} | |||||
| #define z_div(c, a, b) {pCd(c) = Cd(a)/Cd(b);} | |||||
| #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) = conj(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) (cimag(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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotc_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void cdotu_(complex *z, integer *n_, complex *x, integer *incx_, complex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotu_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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) | |||||
| */ | |||||
| /* Table of constant values */ | |||||
| static complex c_b1 = {1.f,0.f}; | |||||
| static integer c__2 = 2; | |||||
| /* > \brief \b CLAESY computes the eigenvalues and eigenvectors of a 2-by-2 complex symmetric matrix. */ | |||||
| /* =========== DOCUMENTATION =========== */ | |||||
| /* Online html documentation available at */ | |||||
| /* http://www.netlib.org/lapack/explore-html/ */ | |||||
| /* > \htmlonly */ | |||||
| /* > Download CLAESY + dependencies */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/claesy. | |||||
| f"> */ | |||||
| /* > [TGZ]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/claesy. | |||||
| f"> */ | |||||
| /* > [ZIP]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/claesy. | |||||
| f"> */ | |||||
| /* > [TXT]</a> */ | |||||
| /* > \endhtmlonly */ | |||||
| /* Definition: */ | |||||
| /* =========== */ | |||||
| /* SUBROUTINE CLAESY( A, B, C, RT1, RT2, EVSCAL, CS1, SN1 ) */ | |||||
| /* COMPLEX A, B, C, CS1, EVSCAL, RT1, RT2, SN1 */ | |||||
| /* > \par Purpose: */ | |||||
| /* ============= */ | |||||
| /* > */ | |||||
| /* > \verbatim */ | |||||
| /* > */ | |||||
| /* > CLAESY computes the eigendecomposition of a 2-by-2 symmetric matrix */ | |||||
| /* > ( ( A, B );( B, C ) ) */ | |||||
| /* > provided the norm of the matrix of eigenvectors is larger than */ | |||||
| /* > some threshold value. */ | |||||
| /* > */ | |||||
| /* > RT1 is the eigenvalue of larger absolute value, and RT2 of */ | |||||
| /* > smaller absolute value. If the eigenvectors are computed, then */ | |||||
| /* > on return ( CS1, SN1 ) is the unit eigenvector for RT1, hence */ | |||||
| /* > */ | |||||
| /* > [ CS1 SN1 ] . [ A B ] . [ CS1 -SN1 ] = [ RT1 0 ] */ | |||||
| /* > [ -SN1 CS1 ] [ B C ] [ SN1 CS1 ] [ 0 RT2 ] */ | |||||
| /* > \endverbatim */ | |||||
| /* Arguments: */ | |||||
| /* ========== */ | |||||
| /* > \param[in] A */ | |||||
| /* > \verbatim */ | |||||
| /* > A is COMPLEX */ | |||||
| /* > The ( 1, 1 ) element of input matrix. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] B */ | |||||
| /* > \verbatim */ | |||||
| /* > B is COMPLEX */ | |||||
| /* > The ( 1, 2 ) element of input matrix. The ( 2, 1 ) element */ | |||||
| /* > is also given by B, since the 2-by-2 matrix is symmetric. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] C */ | |||||
| /* > \verbatim */ | |||||
| /* > C is COMPLEX */ | |||||
| /* > The ( 2, 2 ) element of input matrix. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] RT1 */ | |||||
| /* > \verbatim */ | |||||
| /* > RT1 is COMPLEX */ | |||||
| /* > The eigenvalue of larger modulus. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] RT2 */ | |||||
| /* > \verbatim */ | |||||
| /* > RT2 is COMPLEX */ | |||||
| /* > The eigenvalue of smaller modulus. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] EVSCAL */ | |||||
| /* > \verbatim */ | |||||
| /* > EVSCAL is COMPLEX */ | |||||
| /* > The complex value by which the eigenvector matrix was scaled */ | |||||
| /* > to make it orthonormal. If EVSCAL is zero, the eigenvectors */ | |||||
| /* > were not computed. This means one of two things: the 2-by-2 */ | |||||
| /* > matrix could not be diagonalized, or the norm of the matrix */ | |||||
| /* > of eigenvectors before scaling was larger than the threshold */ | |||||
| /* > value THRESH (set below). */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] CS1 */ | |||||
| /* > \verbatim */ | |||||
| /* > CS1 is COMPLEX */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] SN1 */ | |||||
| /* > \verbatim */ | |||||
| /* > SN1 is COMPLEX */ | |||||
| /* > If EVSCAL .NE. 0, ( CS1, SN1 ) is the unit right eigenvector */ | |||||
| /* > for RT1. */ | |||||
| /* > \endverbatim */ | |||||
| /* Authors: */ | |||||
| /* ======== */ | |||||
| /* > \author Univ. of Tennessee */ | |||||
| /* > \author Univ. of California Berkeley */ | |||||
| /* > \author Univ. of Colorado Denver */ | |||||
| /* > \author NAG Ltd. */ | |||||
| /* > \date December 2016 */ | |||||
| /* > \ingroup complexSYauxiliary */ | |||||
| /* ===================================================================== */ | |||||
| /* Subroutine */ int claesy_(complex *a, complex *b, complex *c__, complex * | |||||
| rt1, complex *rt2, complex *evscal, complex *cs1, complex *sn1) | |||||
| { | |||||
| /* System generated locals */ | |||||
| real r__1, r__2; | |||||
| complex q__1, q__2, q__3, q__4, q__5, q__6, q__7; | |||||
| /* Local variables */ | |||||
| real babs, tabs; | |||||
| complex s, t; | |||||
| real z__, evnorm; | |||||
| complex tmp; | |||||
| /* -- LAPACK auxiliary routine (version 3.7.0) -- */ | |||||
| /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ | |||||
| /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ | |||||
| /* December 2016 */ | |||||
| /* ===================================================================== */ | |||||
| /* Special case: The matrix is actually diagonal. */ | |||||
| /* To avoid divide by zero later, we treat this case separately. */ | |||||
| if (c_abs(b) == 0.f) { | |||||
| rt1->r = a->r, rt1->i = a->i; | |||||
| rt2->r = c__->r, rt2->i = c__->i; | |||||
| if (c_abs(rt1) < c_abs(rt2)) { | |||||
| tmp.r = rt1->r, tmp.i = rt1->i; | |||||
| rt1->r = rt2->r, rt1->i = rt2->i; | |||||
| rt2->r = tmp.r, rt2->i = tmp.i; | |||||
| cs1->r = 0.f, cs1->i = 0.f; | |||||
| sn1->r = 1.f, sn1->i = 0.f; | |||||
| } else { | |||||
| cs1->r = 1.f, cs1->i = 0.f; | |||||
| sn1->r = 0.f, sn1->i = 0.f; | |||||
| } | |||||
| } else { | |||||
| /* Compute the eigenvalues and eigenvectors. */ | |||||
| /* The characteristic equation is */ | |||||
| /* lambda **2 - (A+C) lambda + (A*C - B*B) */ | |||||
| /* and we solve it using the quadratic formula. */ | |||||
| q__2.r = a->r + c__->r, q__2.i = a->i + c__->i; | |||||
| q__1.r = q__2.r * .5f, q__1.i = q__2.i * .5f; | |||||
| s.r = q__1.r, s.i = q__1.i; | |||||
| q__2.r = a->r - c__->r, q__2.i = a->i - c__->i; | |||||
| q__1.r = q__2.r * .5f, q__1.i = q__2.i * .5f; | |||||
| t.r = q__1.r, t.i = q__1.i; | |||||
| /* Take the square root carefully to avoid over/under flow. */ | |||||
| babs = c_abs(b); | |||||
| tabs = c_abs(&t); | |||||
| z__ = f2cmax(babs,tabs); | |||||
| if (z__ > 0.f) { | |||||
| q__5.r = t.r / z__, q__5.i = t.i / z__; | |||||
| pow_ci(&q__4, &q__5, &c__2); | |||||
| q__7.r = b->r / z__, q__7.i = b->i / z__; | |||||
| pow_ci(&q__6, &q__7, &c__2); | |||||
| q__3.r = q__4.r + q__6.r, q__3.i = q__4.i + q__6.i; | |||||
| c_sqrt(&q__2, &q__3); | |||||
| q__1.r = z__ * q__2.r, q__1.i = z__ * q__2.i; | |||||
| t.r = q__1.r, t.i = q__1.i; | |||||
| } | |||||
| /* Compute the two eigenvalues. RT1 and RT2 are exchanged */ | |||||
| /* if necessary so that RT1 will have the greater magnitude. */ | |||||
| q__1.r = s.r + t.r, q__1.i = s.i + t.i; | |||||
| rt1->r = q__1.r, rt1->i = q__1.i; | |||||
| q__1.r = s.r - t.r, q__1.i = s.i - t.i; | |||||
| rt2->r = q__1.r, rt2->i = q__1.i; | |||||
| if (c_abs(rt1) < c_abs(rt2)) { | |||||
| tmp.r = rt1->r, tmp.i = rt1->i; | |||||
| rt1->r = rt2->r, rt1->i = rt2->i; | |||||
| rt2->r = tmp.r, rt2->i = tmp.i; | |||||
| } | |||||
| /* Choose CS1 = 1 and SN1 to satisfy the first equation, then */ | |||||
| /* scale the components of this eigenvector so that the matrix */ | |||||
| /* of eigenvectors X satisfies X * X**T = I . (No scaling is */ | |||||
| /* done if the norm of the eigenvalue matrix is less than THRESH.) */ | |||||
| q__2.r = rt1->r - a->r, q__2.i = rt1->i - a->i; | |||||
| c_div(&q__1, &q__2, b); | |||||
| sn1->r = q__1.r, sn1->i = q__1.i; | |||||
| tabs = c_abs(sn1); | |||||
| if (tabs > 1.f) { | |||||
| /* Computing 2nd power */ | |||||
| r__2 = 1.f / tabs; | |||||
| r__1 = r__2 * r__2; | |||||
| q__5.r = sn1->r / tabs, q__5.i = sn1->i / tabs; | |||||
| pow_ci(&q__4, &q__5, &c__2); | |||||
| q__3.r = r__1 + q__4.r, q__3.i = q__4.i; | |||||
| c_sqrt(&q__2, &q__3); | |||||
| q__1.r = tabs * q__2.r, q__1.i = tabs * q__2.i; | |||||
| t.r = q__1.r, t.i = q__1.i; | |||||
| } else { | |||||
| q__3.r = sn1->r * sn1->r - sn1->i * sn1->i, q__3.i = sn1->r * | |||||
| sn1->i + sn1->i * sn1->r; | |||||
| q__2.r = q__3.r + 1.f, q__2.i = q__3.i + 0.f; | |||||
| c_sqrt(&q__1, &q__2); | |||||
| t.r = q__1.r, t.i = q__1.i; | |||||
| } | |||||
| evnorm = c_abs(&t); | |||||
| if (evnorm >= .1f) { | |||||
| c_div(&q__1, &c_b1, &t); | |||||
| evscal->r = q__1.r, evscal->i = q__1.i; | |||||
| cs1->r = evscal->r, cs1->i = evscal->i; | |||||
| q__1.r = sn1->r * evscal->r - sn1->i * evscal->i, q__1.i = sn1->r | |||||
| * evscal->i + sn1->i * evscal->r; | |||||
| sn1->r = q__1.r, sn1->i = q__1.i; | |||||
| } else { | |||||
| evscal->r = 0.f, evscal->i = 0.f; | |||||
| } | |||||
| } | |||||
| return 0; | |||||
| /* End of CLAESY */ | |||||
| } /* claesy_ */ | |||||
| @@ -0,0 +1,553 @@ | |||||
| /* f2c.h -- Standard Fortran to C header file */ | |||||
| /** barf [ba:rf] 2. "He suggested using FORTRAN, and everybody barfed." | |||||
| - From The Shogakukan DICTIONARY OF NEW ENGLISH (Second edition) */ | |||||
| #ifndef F2C_INCLUDE | |||||
| #define F2C_INCLUDE | |||||
| #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 | |||||
| typedef int 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; | |||||
| 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;} | |||||
| #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)); } | |||||
| #define c_div(c, a, b) {pCf(c) = Cf(a)/Cf(b);} | |||||
| #define z_div(c, a, b) {pCd(c) = Cd(a)/Cd(b);} | |||||
| #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) = conj(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) (cimag(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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotc_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void cdotu_(complex *z, integer *n_, complex *x, integer *incx_, complex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotu_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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) | |||||
| */ | |||||
| /* > \brief \b CLAEV2 computes the eigenvalues and eigenvectors of a 2-by-2 symmetric/Hermitian matrix. */ | |||||
| /* =========== DOCUMENTATION =========== */ | |||||
| /* Online html documentation available at */ | |||||
| /* http://www.netlib.org/lapack/explore-html/ */ | |||||
| /* > \htmlonly */ | |||||
| /* > Download CLAEV2 + dependencies */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/claev2. | |||||
| f"> */ | |||||
| /* > [TGZ]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/claev2. | |||||
| f"> */ | |||||
| /* > [ZIP]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/claev2. | |||||
| f"> */ | |||||
| /* > [TXT]</a> */ | |||||
| /* > \endhtmlonly */ | |||||
| /* Definition: */ | |||||
| /* =========== */ | |||||
| /* SUBROUTINE CLAEV2( A, B, C, RT1, RT2, CS1, SN1 ) */ | |||||
| /* REAL CS1, RT1, RT2 */ | |||||
| /* COMPLEX A, B, C, SN1 */ | |||||
| /* > \par Purpose: */ | |||||
| /* ============= */ | |||||
| /* > */ | |||||
| /* > \verbatim */ | |||||
| /* > */ | |||||
| /* > CLAEV2 computes the eigendecomposition of a 2-by-2 Hermitian matrix */ | |||||
| /* > [ A B ] */ | |||||
| /* > [ CONJG(B) C ]. */ | |||||
| /* > On return, RT1 is the eigenvalue of larger absolute value, RT2 is the */ | |||||
| /* > eigenvalue of smaller absolute value, and (CS1,SN1) is the unit right */ | |||||
| /* > eigenvector for RT1, giving the decomposition */ | |||||
| /* > */ | |||||
| /* > [ CS1 CONJG(SN1) ] [ A B ] [ CS1 -CONJG(SN1) ] = [ RT1 0 ] */ | |||||
| /* > [-SN1 CS1 ] [ CONJG(B) C ] [ SN1 CS1 ] [ 0 RT2 ]. */ | |||||
| /* > \endverbatim */ | |||||
| /* Arguments: */ | |||||
| /* ========== */ | |||||
| /* > \param[in] A */ | |||||
| /* > \verbatim */ | |||||
| /* > A is COMPLEX */ | |||||
| /* > The (1,1) element of the 2-by-2 matrix. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] B */ | |||||
| /* > \verbatim */ | |||||
| /* > B is COMPLEX */ | |||||
| /* > The (1,2) element and the conjugate of the (2,1) element of */ | |||||
| /* > the 2-by-2 matrix. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] C */ | |||||
| /* > \verbatim */ | |||||
| /* > C is COMPLEX */ | |||||
| /* > The (2,2) element of the 2-by-2 matrix. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] RT1 */ | |||||
| /* > \verbatim */ | |||||
| /* > RT1 is REAL */ | |||||
| /* > The eigenvalue of larger absolute value. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] RT2 */ | |||||
| /* > \verbatim */ | |||||
| /* > RT2 is REAL */ | |||||
| /* > The eigenvalue of smaller absolute value. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] CS1 */ | |||||
| /* > \verbatim */ | |||||
| /* > CS1 is REAL */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] SN1 */ | |||||
| /* > \verbatim */ | |||||
| /* > SN1 is COMPLEX */ | |||||
| /* > The vector (CS1, SN1) is a unit right eigenvector for RT1. */ | |||||
| /* > \endverbatim */ | |||||
| /* Authors: */ | |||||
| /* ======== */ | |||||
| /* > \author Univ. of Tennessee */ | |||||
| /* > \author Univ. of California Berkeley */ | |||||
| /* > \author Univ. of Colorado Denver */ | |||||
| /* > \author NAG Ltd. */ | |||||
| /* > \date December 2016 */ | |||||
| /* > \ingroup complexOTHERauxiliary */ | |||||
| /* > \par Further Details: */ | |||||
| /* ===================== */ | |||||
| /* > */ | |||||
| /* > \verbatim */ | |||||
| /* > */ | |||||
| /* > RT1 is accurate to a few ulps barring over/underflow. */ | |||||
| /* > */ | |||||
| /* > RT2 may be inaccurate if there is massive cancellation in the */ | |||||
| /* > determinant A*C-B*B; higher precision or correctly rounded or */ | |||||
| /* > correctly truncated arithmetic would be needed to compute RT2 */ | |||||
| /* > accurately in all cases. */ | |||||
| /* > */ | |||||
| /* > CS1 and SN1 are accurate to a few ulps barring over/underflow. */ | |||||
| /* > */ | |||||
| /* > Overflow is possible only if RT1 is within a factor of 5 of overflow. */ | |||||
| /* > Underflow is harmless if the input data is 0 or exceeds */ | |||||
| /* > underflow_threshold / macheps. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* ===================================================================== */ | |||||
| /* Subroutine */ int claev2_(complex *a, complex *b, complex *c__, real *rt1, | |||||
| real *rt2, real *cs1, complex *sn1) | |||||
| { | |||||
| /* System generated locals */ | |||||
| real r__1, r__2, r__3; | |||||
| complex q__1, q__2; | |||||
| /* Local variables */ | |||||
| real t; | |||||
| complex w; | |||||
| extern /* Subroutine */ int slaev2_(real *, real *, real *, real *, real * | |||||
| , real *, real *); | |||||
| /* -- LAPACK auxiliary routine (version 3.7.0) -- */ | |||||
| /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ | |||||
| /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ | |||||
| /* December 2016 */ | |||||
| /* ===================================================================== */ | |||||
| if (c_abs(b) == 0.f) { | |||||
| w.r = 1.f, w.i = 0.f; | |||||
| } else { | |||||
| r_cnjg(&q__2, b); | |||||
| r__1 = c_abs(b); | |||||
| q__1.r = q__2.r / r__1, q__1.i = q__2.i / r__1; | |||||
| w.r = q__1.r, w.i = q__1.i; | |||||
| } | |||||
| r__1 = a->r; | |||||
| r__2 = c_abs(b); | |||||
| r__3 = c__->r; | |||||
| slaev2_(&r__1, &r__2, &r__3, rt1, rt2, cs1, &t); | |||||
| q__1.r = t * w.r, q__1.i = t * w.i; | |||||
| sn1->r = q__1.r, sn1->i = q__1.i; | |||||
| return 0; | |||||
| /* End of CLAEV2 */ | |||||
| } /* claev2_ */ | |||||
| @@ -0,0 +1,536 @@ | |||||
| /* f2c.h -- Standard Fortran to C header file */ | |||||
| /** barf [ba:rf] 2. "He suggested using FORTRAN, and everybody barfed." | |||||
| - From The Shogakukan DICTIONARY OF NEW ENGLISH (Second edition) */ | |||||
| #ifndef F2C_INCLUDE | |||||
| #define F2C_INCLUDE | |||||
| #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 | |||||
| typedef int 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; | |||||
| 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;} | |||||
| #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)); } | |||||
| #define c_div(c, a, b) {pCf(c) = Cf(a)/Cf(b);} | |||||
| #define z_div(c, a, b) {pCd(c) = Cd(a)/Cd(b);} | |||||
| #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) = conj(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) (cimag(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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotc_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void cdotu_(complex *z, integer *n_, complex *x, integer *incx_, complex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotu_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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) | |||||
| */ | |||||
| /* > \brief \b CLAG2Z converts a complex single precision matrix to a complex double precision matrix. */ | |||||
| /* =========== DOCUMENTATION =========== */ | |||||
| /* Online html documentation available at */ | |||||
| /* http://www.netlib.org/lapack/explore-html/ */ | |||||
| /* > \htmlonly */ | |||||
| /* > Download CLAG2Z + dependencies */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/clag2z. | |||||
| f"> */ | |||||
| /* > [TGZ]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/clag2z. | |||||
| f"> */ | |||||
| /* > [ZIP]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/clag2z. | |||||
| f"> */ | |||||
| /* > [TXT]</a> */ | |||||
| /* > \endhtmlonly */ | |||||
| /* Definition: */ | |||||
| /* =========== */ | |||||
| /* SUBROUTINE CLAG2Z( M, N, SA, LDSA, A, LDA, INFO ) */ | |||||
| /* INTEGER INFO, LDA, LDSA, M, N */ | |||||
| /* COMPLEX SA( LDSA, * ) */ | |||||
| /* COMPLEX*16 A( LDA, * ) */ | |||||
| /* > \par Purpose: */ | |||||
| /* ============= */ | |||||
| /* > */ | |||||
| /* > \verbatim */ | |||||
| /* > */ | |||||
| /* > CLAG2Z converts a COMPLEX matrix, SA, to a COMPLEX*16 matrix, A. */ | |||||
| /* > */ | |||||
| /* > Note that while it is possible to overflow while converting */ | |||||
| /* > from double to single, it is not possible to overflow when */ | |||||
| /* > converting from single to double. */ | |||||
| /* > */ | |||||
| /* > This is an auxiliary routine so there is no argument checking. */ | |||||
| /* > \endverbatim */ | |||||
| /* Arguments: */ | |||||
| /* ========== */ | |||||
| /* > \param[in] M */ | |||||
| /* > \verbatim */ | |||||
| /* > M is INTEGER */ | |||||
| /* > The number of lines of the matrix A. M >= 0. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] N */ | |||||
| /* > \verbatim */ | |||||
| /* > N is INTEGER */ | |||||
| /* > The number of columns of the matrix A. N >= 0. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] SA */ | |||||
| /* > \verbatim */ | |||||
| /* > SA is COMPLEX array, dimension (LDSA,N) */ | |||||
| /* > On entry, the M-by-N coefficient matrix SA. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] LDSA */ | |||||
| /* > \verbatim */ | |||||
| /* > LDSA is INTEGER */ | |||||
| /* > The leading dimension of the array SA. LDSA >= f2cmax(1,M). */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] A */ | |||||
| /* > \verbatim */ | |||||
| /* > A is COMPLEX*16 array, dimension (LDA,N) */ | |||||
| /* > On exit, the M-by-N coefficient matrix A. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] LDA */ | |||||
| /* > \verbatim */ | |||||
| /* > LDA is INTEGER */ | |||||
| /* > The leading dimension of the array A. LDA >= f2cmax(1,M). */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] INFO */ | |||||
| /* > \verbatim */ | |||||
| /* > INFO is INTEGER */ | |||||
| /* > = 0: successful exit */ | |||||
| /* > \endverbatim */ | |||||
| /* Authors: */ | |||||
| /* ======== */ | |||||
| /* > \author Univ. of Tennessee */ | |||||
| /* > \author Univ. of California Berkeley */ | |||||
| /* > \author Univ. of Colorado Denver */ | |||||
| /* > \author NAG Ltd. */ | |||||
| /* > \date December 2016 */ | |||||
| /* > \ingroup complex16OTHERauxiliary */ | |||||
| /* ===================================================================== */ | |||||
| /* Subroutine */ int clag2z_(integer *m, integer *n, complex *sa, integer * | |||||
| ldsa, doublecomplex *a, integer *lda, integer *info) | |||||
| { | |||||
| /* System generated locals */ | |||||
| integer sa_dim1, sa_offset, a_dim1, a_offset, i__1, i__2, i__3, i__4; | |||||
| /* Local variables */ | |||||
| integer i__, j; | |||||
| /* -- LAPACK auxiliary routine (version 3.7.0) -- */ | |||||
| /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ | |||||
| /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ | |||||
| /* December 2016 */ | |||||
| /* ===================================================================== */ | |||||
| /* Parameter adjustments */ | |||||
| sa_dim1 = *ldsa; | |||||
| sa_offset = 1 + sa_dim1 * 1; | |||||
| sa -= sa_offset; | |||||
| a_dim1 = *lda; | |||||
| a_offset = 1 + a_dim1 * 1; | |||||
| a -= a_offset; | |||||
| /* Function Body */ | |||||
| *info = 0; | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| i__2 = *m; | |||||
| for (i__ = 1; i__ <= i__2; ++i__) { | |||||
| i__3 = i__ + j * a_dim1; | |||||
| i__4 = i__ + j * sa_dim1; | |||||
| a[i__3].r = sa[i__4].r, a[i__3].i = sa[i__4].i; | |||||
| /* L10: */ | |||||
| } | |||||
| /* L20: */ | |||||
| } | |||||
| return 0; | |||||
| /* End of CLAG2Z */ | |||||
| } /* clag2z_ */ | |||||
| @@ -0,0 +1,912 @@ | |||||
| /* f2c.h -- Standard Fortran to C header file */ | |||||
| /** barf [ba:rf] 2. "He suggested using FORTRAN, and everybody barfed." | |||||
| - From The Shogakukan DICTIONARY OF NEW ENGLISH (Second edition) */ | |||||
| #ifndef F2C_INCLUDE | |||||
| #define F2C_INCLUDE | |||||
| #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 | |||||
| typedef int 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; | |||||
| 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;} | |||||
| #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)); } | |||||
| #define c_div(c, a, b) {pCf(c) = Cf(a)/Cf(b);} | |||||
| #define z_div(c, a, b) {pCd(c) = Cd(a)/Cd(b);} | |||||
| #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) = conj(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) (cimag(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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotc_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void cdotu_(complex *z, integer *n_, complex *x, integer *incx_, complex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotu_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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) | |||||
| */ | |||||
| /* > \brief \b CLAGS2 */ | |||||
| /* =========== DOCUMENTATION =========== */ | |||||
| /* Online html documentation available at */ | |||||
| /* http://www.netlib.org/lapack/explore-html/ */ | |||||
| /* > \htmlonly */ | |||||
| /* > Download CLAGS2 + dependencies */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/clags2. | |||||
| f"> */ | |||||
| /* > [TGZ]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/clags2. | |||||
| f"> */ | |||||
| /* > [ZIP]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/clags2. | |||||
| f"> */ | |||||
| /* > [TXT]</a> */ | |||||
| /* > \endhtmlonly */ | |||||
| /* Definition: */ | |||||
| /* =========== */ | |||||
| /* SUBROUTINE CLAGS2( UPPER, A1, A2, A3, B1, B2, B3, CSU, SNU, CSV, */ | |||||
| /* SNV, CSQ, SNQ ) */ | |||||
| /* LOGICAL UPPER */ | |||||
| /* REAL A1, A3, B1, B3, CSQ, CSU, CSV */ | |||||
| /* COMPLEX A2, B2, SNQ, SNU, SNV */ | |||||
| /* > \par Purpose: */ | |||||
| /* ============= */ | |||||
| /* > */ | |||||
| /* > \verbatim */ | |||||
| /* > */ | |||||
| /* > CLAGS2 computes 2-by-2 unitary matrices U, V and Q, such */ | |||||
| /* > that if ( UPPER ) then */ | |||||
| /* > */ | |||||
| /* > U**H *A*Q = U**H *( A1 A2 )*Q = ( x 0 ) */ | |||||
| /* > ( 0 A3 ) ( x x ) */ | |||||
| /* > and */ | |||||
| /* > V**H*B*Q = V**H *( B1 B2 )*Q = ( x 0 ) */ | |||||
| /* > ( 0 B3 ) ( x x ) */ | |||||
| /* > */ | |||||
| /* > or if ( .NOT.UPPER ) then */ | |||||
| /* > */ | |||||
| /* > U**H *A*Q = U**H *( A1 0 )*Q = ( x x ) */ | |||||
| /* > ( A2 A3 ) ( 0 x ) */ | |||||
| /* > and */ | |||||
| /* > V**H *B*Q = V**H *( B1 0 )*Q = ( x x ) */ | |||||
| /* > ( B2 B3 ) ( 0 x ) */ | |||||
| /* > where */ | |||||
| /* > */ | |||||
| /* > U = ( CSU SNU ), V = ( CSV SNV ), */ | |||||
| /* > ( -SNU**H CSU ) ( -SNV**H CSV ) */ | |||||
| /* > */ | |||||
| /* > Q = ( CSQ SNQ ) */ | |||||
| /* > ( -SNQ**H CSQ ) */ | |||||
| /* > */ | |||||
| /* > The rows of the transformed A and B are parallel. Moreover, if the */ | |||||
| /* > input 2-by-2 matrix A is not zero, then the transformed (1,1) entry */ | |||||
| /* > of A is not zero. If the input matrices A and B are both not zero, */ | |||||
| /* > then the transformed (2,2) element of B is not zero, except when the */ | |||||
| /* > first rows of input A and B are parallel and the second rows are */ | |||||
| /* > zero. */ | |||||
| /* > \endverbatim */ | |||||
| /* Arguments: */ | |||||
| /* ========== */ | |||||
| /* > \param[in] UPPER */ | |||||
| /* > \verbatim */ | |||||
| /* > UPPER is LOGICAL */ | |||||
| /* > = .TRUE.: the input matrices A and B are upper triangular. */ | |||||
| /* > = .FALSE.: the input matrices A and B are lower triangular. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] A1 */ | |||||
| /* > \verbatim */ | |||||
| /* > A1 is REAL */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] A2 */ | |||||
| /* > \verbatim */ | |||||
| /* > A2 is COMPLEX */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] A3 */ | |||||
| /* > \verbatim */ | |||||
| /* > A3 is REAL */ | |||||
| /* > On entry, A1, A2 and A3 are elements of the input 2-by-2 */ | |||||
| /* > upper (lower) triangular matrix A. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] B1 */ | |||||
| /* > \verbatim */ | |||||
| /* > B1 is REAL */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] B2 */ | |||||
| /* > \verbatim */ | |||||
| /* > B2 is COMPLEX */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] B3 */ | |||||
| /* > \verbatim */ | |||||
| /* > B3 is REAL */ | |||||
| /* > On entry, B1, B2 and B3 are elements of the input 2-by-2 */ | |||||
| /* > upper (lower) triangular matrix B. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] CSU */ | |||||
| /* > \verbatim */ | |||||
| /* > CSU is REAL */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] SNU */ | |||||
| /* > \verbatim */ | |||||
| /* > SNU is COMPLEX */ | |||||
| /* > The desired unitary matrix U. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] CSV */ | |||||
| /* > \verbatim */ | |||||
| /* > CSV is REAL */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] SNV */ | |||||
| /* > \verbatim */ | |||||
| /* > SNV is COMPLEX */ | |||||
| /* > The desired unitary matrix V. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] CSQ */ | |||||
| /* > \verbatim */ | |||||
| /* > CSQ is REAL */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] SNQ */ | |||||
| /* > \verbatim */ | |||||
| /* > SNQ is COMPLEX */ | |||||
| /* > The desired unitary matrix Q. */ | |||||
| /* > \endverbatim */ | |||||
| /* Authors: */ | |||||
| /* ======== */ | |||||
| /* > \author Univ. of Tennessee */ | |||||
| /* > \author Univ. of California Berkeley */ | |||||
| /* > \author Univ. of Colorado Denver */ | |||||
| /* > \author NAG Ltd. */ | |||||
| /* > \date December 2016 */ | |||||
| /* > \ingroup complexOTHERauxiliary */ | |||||
| /* ===================================================================== */ | |||||
| /* Subroutine */ int clags2_(logical *upper, real *a1, complex *a2, real *a3, | |||||
| real *b1, complex *b2, real *b3, real *csu, complex *snu, real *csv, | |||||
| complex *snv, real *csq, complex *snq) | |||||
| { | |||||
| /* System generated locals */ | |||||
| real r__1, r__2, r__3, r__4, r__5, r__6, r__7, r__8; | |||||
| complex q__1, q__2, q__3, q__4, q__5; | |||||
| /* Local variables */ | |||||
| real aua11, aua12, aua21, aua22, avb11, avb12, avb21, avb22, ua11r, ua22r, | |||||
| vb11r, vb22r, a; | |||||
| complex b, c__; | |||||
| real d__; | |||||
| complex r__, d1; | |||||
| real s1, s2, fb, fc; | |||||
| extern /* Subroutine */ int slasv2_(real *, real *, real *, real *, real * | |||||
| , real *, real *, real *, real *), clartg_(complex *, complex *, | |||||
| real *, complex *, complex *); | |||||
| complex ua11, ua12, ua21, ua22, vb11, vb12, vb21, vb22; | |||||
| real csl, csr, snl, snr; | |||||
| /* -- LAPACK auxiliary routine (version 3.7.0) -- */ | |||||
| /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ | |||||
| /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ | |||||
| /* December 2016 */ | |||||
| /* ===================================================================== */ | |||||
| if (*upper) { | |||||
| /* Input matrices A and B are upper triangular matrices */ | |||||
| /* Form matrix C = A*adj(B) = ( a b ) */ | |||||
| /* ( 0 d ) */ | |||||
| a = *a1 * *b3; | |||||
| d__ = *a3 * *b1; | |||||
| q__2.r = *b1 * a2->r, q__2.i = *b1 * a2->i; | |||||
| q__3.r = *a1 * b2->r, q__3.i = *a1 * b2->i; | |||||
| q__1.r = q__2.r - q__3.r, q__1.i = q__2.i - q__3.i; | |||||
| b.r = q__1.r, b.i = q__1.i; | |||||
| fb = c_abs(&b); | |||||
| /* Transform complex 2-by-2 matrix C to real matrix by unitary */ | |||||
| /* diagonal matrix diag(1,D1). */ | |||||
| d1.r = 1.f, d1.i = 0.f; | |||||
| if (fb != 0.f) { | |||||
| q__1.r = b.r / fb, q__1.i = b.i / fb; | |||||
| d1.r = q__1.r, d1.i = q__1.i; | |||||
| } | |||||
| /* The SVD of real 2 by 2 triangular C */ | |||||
| /* ( CSL -SNL )*( A B )*( CSR SNR ) = ( R 0 ) */ | |||||
| /* ( SNL CSL ) ( 0 D ) ( -SNR CSR ) ( 0 T ) */ | |||||
| slasv2_(&a, &fb, &d__, &s1, &s2, &snr, &csr, &snl, &csl); | |||||
| if (abs(csl) >= abs(snl) || abs(csr) >= abs(snr)) { | |||||
| /* Compute the (1,1) and (1,2) elements of U**H *A and V**H *B, */ | |||||
| /* and (1,2) element of |U|**H *|A| and |V|**H *|B|. */ | |||||
| ua11r = csl * *a1; | |||||
| q__2.r = csl * a2->r, q__2.i = csl * a2->i; | |||||
| q__4.r = snl * d1.r, q__4.i = snl * d1.i; | |||||
| q__3.r = *a3 * q__4.r, q__3.i = *a3 * q__4.i; | |||||
| q__1.r = q__2.r + q__3.r, q__1.i = q__2.i + q__3.i; | |||||
| ua12.r = q__1.r, ua12.i = q__1.i; | |||||
| vb11r = csr * *b1; | |||||
| q__2.r = csr * b2->r, q__2.i = csr * b2->i; | |||||
| q__4.r = snr * d1.r, q__4.i = snr * d1.i; | |||||
| q__3.r = *b3 * q__4.r, q__3.i = *b3 * q__4.i; | |||||
| q__1.r = q__2.r + q__3.r, q__1.i = q__2.i + q__3.i; | |||||
| vb12.r = q__1.r, vb12.i = q__1.i; | |||||
| aua12 = abs(csl) * ((r__1 = a2->r, abs(r__1)) + (r__2 = r_imag(a2) | |||||
| , abs(r__2))) + abs(snl) * abs(*a3); | |||||
| avb12 = abs(csr) * ((r__1 = b2->r, abs(r__1)) + (r__2 = r_imag(b2) | |||||
| , abs(r__2))) + abs(snr) * abs(*b3); | |||||
| /* zero (1,2) elements of U**H *A and V**H *B */ | |||||
| if (abs(ua11r) + ((r__1 = ua12.r, abs(r__1)) + (r__2 = r_imag(& | |||||
| ua12), abs(r__2))) == 0.f) { | |||||
| q__2.r = vb11r, q__2.i = 0.f; | |||||
| q__1.r = -q__2.r, q__1.i = -q__2.i; | |||||
| r_cnjg(&q__3, &vb12); | |||||
| clartg_(&q__1, &q__3, csq, snq, &r__); | |||||
| } else if (abs(vb11r) + ((r__1 = vb12.r, abs(r__1)) + (r__2 = | |||||
| r_imag(&vb12), abs(r__2))) == 0.f) { | |||||
| q__2.r = ua11r, q__2.i = 0.f; | |||||
| q__1.r = -q__2.r, q__1.i = -q__2.i; | |||||
| r_cnjg(&q__3, &ua12); | |||||
| clartg_(&q__1, &q__3, csq, snq, &r__); | |||||
| } else if (aua12 / (abs(ua11r) + ((r__1 = ua12.r, abs(r__1)) + ( | |||||
| r__2 = r_imag(&ua12), abs(r__2)))) <= avb12 / (abs(vb11r) | |||||
| + ((r__3 = vb12.r, abs(r__3)) + (r__4 = r_imag(&vb12), | |||||
| abs(r__4))))) { | |||||
| q__2.r = ua11r, q__2.i = 0.f; | |||||
| q__1.r = -q__2.r, q__1.i = -q__2.i; | |||||
| r_cnjg(&q__3, &ua12); | |||||
| clartg_(&q__1, &q__3, csq, snq, &r__); | |||||
| } else { | |||||
| q__2.r = vb11r, q__2.i = 0.f; | |||||
| q__1.r = -q__2.r, q__1.i = -q__2.i; | |||||
| r_cnjg(&q__3, &vb12); | |||||
| clartg_(&q__1, &q__3, csq, snq, &r__); | |||||
| } | |||||
| *csu = csl; | |||||
| q__2.r = -d1.r, q__2.i = -d1.i; | |||||
| q__1.r = snl * q__2.r, q__1.i = snl * q__2.i; | |||||
| snu->r = q__1.r, snu->i = q__1.i; | |||||
| *csv = csr; | |||||
| q__2.r = -d1.r, q__2.i = -d1.i; | |||||
| q__1.r = snr * q__2.r, q__1.i = snr * q__2.i; | |||||
| snv->r = q__1.r, snv->i = q__1.i; | |||||
| } else { | |||||
| /* Compute the (2,1) and (2,2) elements of U**H *A and V**H *B, */ | |||||
| /* and (2,2) element of |U|**H *|A| and |V|**H *|B|. */ | |||||
| r_cnjg(&q__4, &d1); | |||||
| q__3.r = -q__4.r, q__3.i = -q__4.i; | |||||
| q__2.r = snl * q__3.r, q__2.i = snl * q__3.i; | |||||
| q__1.r = *a1 * q__2.r, q__1.i = *a1 * q__2.i; | |||||
| ua21.r = q__1.r, ua21.i = q__1.i; | |||||
| r_cnjg(&q__5, &d1); | |||||
| q__4.r = -q__5.r, q__4.i = -q__5.i; | |||||
| q__3.r = snl * q__4.r, q__3.i = snl * q__4.i; | |||||
| q__2.r = q__3.r * a2->r - q__3.i * a2->i, q__2.i = q__3.r * a2->i | |||||
| + q__3.i * a2->r; | |||||
| r__1 = csl * *a3; | |||||
| q__1.r = q__2.r + r__1, q__1.i = q__2.i; | |||||
| ua22.r = q__1.r, ua22.i = q__1.i; | |||||
| r_cnjg(&q__4, &d1); | |||||
| q__3.r = -q__4.r, q__3.i = -q__4.i; | |||||
| q__2.r = snr * q__3.r, q__2.i = snr * q__3.i; | |||||
| q__1.r = *b1 * q__2.r, q__1.i = *b1 * q__2.i; | |||||
| vb21.r = q__1.r, vb21.i = q__1.i; | |||||
| r_cnjg(&q__5, &d1); | |||||
| q__4.r = -q__5.r, q__4.i = -q__5.i; | |||||
| q__3.r = snr * q__4.r, q__3.i = snr * q__4.i; | |||||
| q__2.r = q__3.r * b2->r - q__3.i * b2->i, q__2.i = q__3.r * b2->i | |||||
| + q__3.i * b2->r; | |||||
| r__1 = csr * *b3; | |||||
| q__1.r = q__2.r + r__1, q__1.i = q__2.i; | |||||
| vb22.r = q__1.r, vb22.i = q__1.i; | |||||
| aua22 = abs(snl) * ((r__1 = a2->r, abs(r__1)) + (r__2 = r_imag(a2) | |||||
| , abs(r__2))) + abs(csl) * abs(*a3); | |||||
| avb22 = abs(snr) * ((r__1 = b2->r, abs(r__1)) + (r__2 = r_imag(b2) | |||||
| , abs(r__2))) + abs(csr) * abs(*b3); | |||||
| /* zero (2,2) elements of U**H *A and V**H *B, and then swap. */ | |||||
| if ((r__1 = ua21.r, abs(r__1)) + (r__2 = r_imag(&ua21), abs(r__2)) | |||||
| + ((r__3 = ua22.r, abs(r__3)) + (r__4 = r_imag(&ua22), | |||||
| abs(r__4))) == 0.f) { | |||||
| r_cnjg(&q__2, &vb21); | |||||
| q__1.r = -q__2.r, q__1.i = -q__2.i; | |||||
| r_cnjg(&q__3, &vb22); | |||||
| clartg_(&q__1, &q__3, csq, snq, &r__); | |||||
| } else if ((r__1 = vb21.r, abs(r__1)) + (r__2 = r_imag(&vb21), | |||||
| abs(r__2)) + c_abs(&vb22) == 0.f) { | |||||
| r_cnjg(&q__2, &ua21); | |||||
| q__1.r = -q__2.r, q__1.i = -q__2.i; | |||||
| r_cnjg(&q__3, &ua22); | |||||
| clartg_(&q__1, &q__3, csq, snq, &r__); | |||||
| } else if (aua22 / ((r__1 = ua21.r, abs(r__1)) + (r__2 = r_imag(& | |||||
| ua21), abs(r__2)) + ((r__3 = ua22.r, abs(r__3)) + (r__4 = | |||||
| r_imag(&ua22), abs(r__4)))) <= avb22 / ((r__5 = vb21.r, | |||||
| abs(r__5)) + (r__6 = r_imag(&vb21), abs(r__6)) + ((r__7 = | |||||
| vb22.r, abs(r__7)) + (r__8 = r_imag(&vb22), abs(r__8))))) | |||||
| { | |||||
| r_cnjg(&q__2, &ua21); | |||||
| q__1.r = -q__2.r, q__1.i = -q__2.i; | |||||
| r_cnjg(&q__3, &ua22); | |||||
| clartg_(&q__1, &q__3, csq, snq, &r__); | |||||
| } else { | |||||
| r_cnjg(&q__2, &vb21); | |||||
| q__1.r = -q__2.r, q__1.i = -q__2.i; | |||||
| r_cnjg(&q__3, &vb22); | |||||
| clartg_(&q__1, &q__3, csq, snq, &r__); | |||||
| } | |||||
| *csu = snl; | |||||
| q__1.r = csl * d1.r, q__1.i = csl * d1.i; | |||||
| snu->r = q__1.r, snu->i = q__1.i; | |||||
| *csv = snr; | |||||
| q__1.r = csr * d1.r, q__1.i = csr * d1.i; | |||||
| snv->r = q__1.r, snv->i = q__1.i; | |||||
| } | |||||
| } else { | |||||
| /* Input matrices A and B are lower triangular matrices */ | |||||
| /* Form matrix C = A*adj(B) = ( a 0 ) */ | |||||
| /* ( c d ) */ | |||||
| a = *a1 * *b3; | |||||
| d__ = *a3 * *b1; | |||||
| q__2.r = *b3 * a2->r, q__2.i = *b3 * a2->i; | |||||
| q__3.r = *a3 * b2->r, q__3.i = *a3 * b2->i; | |||||
| q__1.r = q__2.r - q__3.r, q__1.i = q__2.i - q__3.i; | |||||
| c__.r = q__1.r, c__.i = q__1.i; | |||||
| fc = c_abs(&c__); | |||||
| /* Transform complex 2-by-2 matrix C to real matrix by unitary */ | |||||
| /* diagonal matrix diag(d1,1). */ | |||||
| d1.r = 1.f, d1.i = 0.f; | |||||
| if (fc != 0.f) { | |||||
| q__1.r = c__.r / fc, q__1.i = c__.i / fc; | |||||
| d1.r = q__1.r, d1.i = q__1.i; | |||||
| } | |||||
| /* The SVD of real 2 by 2 triangular C */ | |||||
| /* ( CSL -SNL )*( A 0 )*( CSR SNR ) = ( R 0 ) */ | |||||
| /* ( SNL CSL ) ( C D ) ( -SNR CSR ) ( 0 T ) */ | |||||
| slasv2_(&a, &fc, &d__, &s1, &s2, &snr, &csr, &snl, &csl); | |||||
| if (abs(csr) >= abs(snr) || abs(csl) >= abs(snl)) { | |||||
| /* Compute the (2,1) and (2,2) elements of U**H *A and V**H *B, */ | |||||
| /* and (2,1) element of |U|**H *|A| and |V|**H *|B|. */ | |||||
| q__4.r = -d1.r, q__4.i = -d1.i; | |||||
| q__3.r = snr * q__4.r, q__3.i = snr * q__4.i; | |||||
| q__2.r = *a1 * q__3.r, q__2.i = *a1 * q__3.i; | |||||
| q__5.r = csr * a2->r, q__5.i = csr * a2->i; | |||||
| q__1.r = q__2.r + q__5.r, q__1.i = q__2.i + q__5.i; | |||||
| ua21.r = q__1.r, ua21.i = q__1.i; | |||||
| ua22r = csr * *a3; | |||||
| q__4.r = -d1.r, q__4.i = -d1.i; | |||||
| q__3.r = snl * q__4.r, q__3.i = snl * q__4.i; | |||||
| q__2.r = *b1 * q__3.r, q__2.i = *b1 * q__3.i; | |||||
| q__5.r = csl * b2->r, q__5.i = csl * b2->i; | |||||
| q__1.r = q__2.r + q__5.r, q__1.i = q__2.i + q__5.i; | |||||
| vb21.r = q__1.r, vb21.i = q__1.i; | |||||
| vb22r = csl * *b3; | |||||
| aua21 = abs(snr) * abs(*a1) + abs(csr) * ((r__1 = a2->r, abs(r__1) | |||||
| ) + (r__2 = r_imag(a2), abs(r__2))); | |||||
| avb21 = abs(snl) * abs(*b1) + abs(csl) * ((r__1 = b2->r, abs(r__1) | |||||
| ) + (r__2 = r_imag(b2), abs(r__2))); | |||||
| /* zero (2,1) elements of U**H *A and V**H *B. */ | |||||
| if ((r__1 = ua21.r, abs(r__1)) + (r__2 = r_imag(&ua21), abs(r__2)) | |||||
| + abs(ua22r) == 0.f) { | |||||
| q__1.r = vb22r, q__1.i = 0.f; | |||||
| clartg_(&q__1, &vb21, csq, snq, &r__); | |||||
| } else if ((r__1 = vb21.r, abs(r__1)) + (r__2 = r_imag(&vb21), | |||||
| abs(r__2)) + abs(vb22r) == 0.f) { | |||||
| q__1.r = ua22r, q__1.i = 0.f; | |||||
| clartg_(&q__1, &ua21, csq, snq, &r__); | |||||
| } else if (aua21 / ((r__1 = ua21.r, abs(r__1)) + (r__2 = r_imag(& | |||||
| ua21), abs(r__2)) + abs(ua22r)) <= avb21 / ((r__3 = | |||||
| vb21.r, abs(r__3)) + (r__4 = r_imag(&vb21), abs(r__4)) + | |||||
| abs(vb22r))) { | |||||
| q__1.r = ua22r, q__1.i = 0.f; | |||||
| clartg_(&q__1, &ua21, csq, snq, &r__); | |||||
| } else { | |||||
| q__1.r = vb22r, q__1.i = 0.f; | |||||
| clartg_(&q__1, &vb21, csq, snq, &r__); | |||||
| } | |||||
| *csu = csr; | |||||
| r_cnjg(&q__3, &d1); | |||||
| q__2.r = -q__3.r, q__2.i = -q__3.i; | |||||
| q__1.r = snr * q__2.r, q__1.i = snr * q__2.i; | |||||
| snu->r = q__1.r, snu->i = q__1.i; | |||||
| *csv = csl; | |||||
| r_cnjg(&q__3, &d1); | |||||
| q__2.r = -q__3.r, q__2.i = -q__3.i; | |||||
| q__1.r = snl * q__2.r, q__1.i = snl * q__2.i; | |||||
| snv->r = q__1.r, snv->i = q__1.i; | |||||
| } else { | |||||
| /* Compute the (1,1) and (1,2) elements of U**H *A and V**H *B, */ | |||||
| /* and (1,1) element of |U|**H *|A| and |V|**H *|B|. */ | |||||
| r__1 = csr * *a1; | |||||
| r_cnjg(&q__4, &d1); | |||||
| q__3.r = snr * q__4.r, q__3.i = snr * q__4.i; | |||||
| q__2.r = q__3.r * a2->r - q__3.i * a2->i, q__2.i = q__3.r * a2->i | |||||
| + q__3.i * a2->r; | |||||
| q__1.r = r__1 + q__2.r, q__1.i = q__2.i; | |||||
| ua11.r = q__1.r, ua11.i = q__1.i; | |||||
| r_cnjg(&q__3, &d1); | |||||
| q__2.r = snr * q__3.r, q__2.i = snr * q__3.i; | |||||
| q__1.r = *a3 * q__2.r, q__1.i = *a3 * q__2.i; | |||||
| ua12.r = q__1.r, ua12.i = q__1.i; | |||||
| r__1 = csl * *b1; | |||||
| r_cnjg(&q__4, &d1); | |||||
| q__3.r = snl * q__4.r, q__3.i = snl * q__4.i; | |||||
| q__2.r = q__3.r * b2->r - q__3.i * b2->i, q__2.i = q__3.r * b2->i | |||||
| + q__3.i * b2->r; | |||||
| q__1.r = r__1 + q__2.r, q__1.i = q__2.i; | |||||
| vb11.r = q__1.r, vb11.i = q__1.i; | |||||
| r_cnjg(&q__3, &d1); | |||||
| q__2.r = snl * q__3.r, q__2.i = snl * q__3.i; | |||||
| q__1.r = *b3 * q__2.r, q__1.i = *b3 * q__2.i; | |||||
| vb12.r = q__1.r, vb12.i = q__1.i; | |||||
| aua11 = abs(csr) * abs(*a1) + abs(snr) * ((r__1 = a2->r, abs(r__1) | |||||
| ) + (r__2 = r_imag(a2), abs(r__2))); | |||||
| avb11 = abs(csl) * abs(*b1) + abs(snl) * ((r__1 = b2->r, abs(r__1) | |||||
| ) + (r__2 = r_imag(b2), abs(r__2))); | |||||
| /* zero (1,1) elements of U**H *A and V**H *B, and then swap. */ | |||||
| if ((r__1 = ua11.r, abs(r__1)) + (r__2 = r_imag(&ua11), abs(r__2)) | |||||
| + ((r__3 = ua12.r, abs(r__3)) + (r__4 = r_imag(&ua12), | |||||
| abs(r__4))) == 0.f) { | |||||
| clartg_(&vb12, &vb11, csq, snq, &r__); | |||||
| } else if ((r__1 = vb11.r, abs(r__1)) + (r__2 = r_imag(&vb11), | |||||
| abs(r__2)) + ((r__3 = vb12.r, abs(r__3)) + (r__4 = r_imag( | |||||
| &vb12), abs(r__4))) == 0.f) { | |||||
| clartg_(&ua12, &ua11, csq, snq, &r__); | |||||
| } else if (aua11 / ((r__1 = ua11.r, abs(r__1)) + (r__2 = r_imag(& | |||||
| ua11), abs(r__2)) + ((r__3 = ua12.r, abs(r__3)) + (r__4 = | |||||
| r_imag(&ua12), abs(r__4)))) <= avb11 / ((r__5 = vb11.r, | |||||
| abs(r__5)) + (r__6 = r_imag(&vb11), abs(r__6)) + ((r__7 = | |||||
| vb12.r, abs(r__7)) + (r__8 = r_imag(&vb12), abs(r__8))))) | |||||
| { | |||||
| clartg_(&ua12, &ua11, csq, snq, &r__); | |||||
| } else { | |||||
| clartg_(&vb12, &vb11, csq, snq, &r__); | |||||
| } | |||||
| *csu = snr; | |||||
| r_cnjg(&q__2, &d1); | |||||
| q__1.r = csr * q__2.r, q__1.i = csr * q__2.i; | |||||
| snu->r = q__1.r, snu->i = q__1.i; | |||||
| *csv = snl; | |||||
| r_cnjg(&q__2, &d1); | |||||
| q__1.r = csl * q__2.r, q__1.i = csl * q__2.i; | |||||
| snv->r = q__1.r, snv->i = q__1.i; | |||||
| } | |||||
| } | |||||
| return 0; | |||||
| /* End of CLAGS2 */ | |||||
| } /* clags2_ */ | |||||
| @@ -0,0 +1,981 @@ | |||||
| /* f2c.h -- Standard Fortran to C header file */ | |||||
| /** barf [ba:rf] 2. "He suggested using FORTRAN, and everybody barfed." | |||||
| - From The Shogakukan DICTIONARY OF NEW ENGLISH (Second edition) */ | |||||
| #ifndef F2C_INCLUDE | |||||
| #define F2C_INCLUDE | |||||
| #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 | |||||
| typedef int 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; | |||||
| 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;} | |||||
| #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)); } | |||||
| #define c_div(c, a, b) {pCf(c) = Cf(a)/Cf(b);} | |||||
| #define z_div(c, a, b) {pCd(c) = Cd(a)/Cd(b);} | |||||
| #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) = conj(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) (cimag(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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotc_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void cdotu_(complex *z, integer *n_, complex *x, integer *incx_, complex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotu_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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) | |||||
| */ | |||||
| /* Table of constant values */ | |||||
| static complex c_b1 = {0.f,0.f}; | |||||
| static complex c_b2 = {1.f,0.f}; | |||||
| static integer c__1 = 1; | |||||
| /* > \brief \b CLAHEF_AA */ | |||||
| /* =========== DOCUMENTATION =========== */ | |||||
| /* Online html documentation available at */ | |||||
| /* http://www.netlib.org/lapack/explore-html/ */ | |||||
| /* > \htmlonly */ | |||||
| /* > Download CLAHEF_AA + dependencies */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/clahef_ | |||||
| aa.f"> */ | |||||
| /* > [TGZ]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/clahef_ | |||||
| aa.f"> */ | |||||
| /* > [ZIP]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/clahef_ | |||||
| aa.f"> */ | |||||
| /* > [TXT]</a> */ | |||||
| /* > \endhtmlonly */ | |||||
| /* Definition: */ | |||||
| /* =========== */ | |||||
| /* SUBROUTINE CLAHEF_AA( UPLO, J1, M, NB, A, LDA, IPIV, */ | |||||
| /* H, LDH, WORK ) */ | |||||
| /* CHARACTER UPLO */ | |||||
| /* INTEGER J1, M, NB, LDA, LDH */ | |||||
| /* INTEGER IPIV( * ) */ | |||||
| /* COMPLEX A( LDA, * ), H( LDH, * ), WORK( * ) */ | |||||
| /* > \par Purpose: */ | |||||
| /* ============= */ | |||||
| /* > */ | |||||
| /* > \verbatim */ | |||||
| /* > */ | |||||
| /* > CLAHEF_AA factorizes a panel of a complex hermitian matrix A using */ | |||||
| /* > the Aasen's algorithm. The panel consists of a set of NB rows of A */ | |||||
| /* > when UPLO is U, or a set of NB columns when UPLO is L. */ | |||||
| /* > */ | |||||
| /* > In order to factorize the panel, the Aasen's algorithm requires the */ | |||||
| /* > last row, or column, of the previous panel. The first row, or column, */ | |||||
| /* > of A is set to be the first row, or column, of an identity matrix, */ | |||||
| /* > which is used to factorize the first panel. */ | |||||
| /* > */ | |||||
| /* > The resulting J-th row of U, or J-th column of L, is stored in the */ | |||||
| /* > (J-1)-th row, or column, of A (without the unit diagonals), while */ | |||||
| /* > the diagonal and subdiagonal of A are overwritten by those of T. */ | |||||
| /* > */ | |||||
| /* > \endverbatim */ | |||||
| /* Arguments: */ | |||||
| /* ========== */ | |||||
| /* > \param[in] UPLO */ | |||||
| /* > \verbatim */ | |||||
| /* > UPLO is CHARACTER*1 */ | |||||
| /* > = 'U': Upper triangle of A is stored; */ | |||||
| /* > = 'L': Lower triangle of A is stored. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] J1 */ | |||||
| /* > \verbatim */ | |||||
| /* > J1 is INTEGER */ | |||||
| /* > The location of the first row, or column, of the panel */ | |||||
| /* > within the submatrix of A, passed to this routine, e.g., */ | |||||
| /* > when called by CHETRF_AA, for the first panel, J1 is 1, */ | |||||
| /* > while for the remaining panels, J1 is 2. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] M */ | |||||
| /* > \verbatim */ | |||||
| /* > M is INTEGER */ | |||||
| /* > The dimension of the submatrix. M >= 0. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] NB */ | |||||
| /* > \verbatim */ | |||||
| /* > NB is INTEGER */ | |||||
| /* > The dimension of the panel to be facotorized. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in,out] A */ | |||||
| /* > \verbatim */ | |||||
| /* > A is COMPLEX array, dimension (LDA,M) for */ | |||||
| /* > the first panel, while dimension (LDA,M+1) for the */ | |||||
| /* > remaining panels. */ | |||||
| /* > */ | |||||
| /* > On entry, A contains the last row, or column, of */ | |||||
| /* > the previous panel, and the trailing submatrix of A */ | |||||
| /* > to be factorized, except for the first panel, only */ | |||||
| /* > the panel is passed. */ | |||||
| /* > */ | |||||
| /* > On exit, the leading panel is factorized. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] LDA */ | |||||
| /* > \verbatim */ | |||||
| /* > LDA is INTEGER */ | |||||
| /* > The leading dimension of the array A. LDA >= f2cmax(1,N). */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] IPIV */ | |||||
| /* > \verbatim */ | |||||
| /* > IPIV is INTEGER array, dimension (N) */ | |||||
| /* > Details of the row and column interchanges, */ | |||||
| /* > the row and column k were interchanged with the row and */ | |||||
| /* > column IPIV(k). */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in,out] H */ | |||||
| /* > \verbatim */ | |||||
| /* > H is COMPLEX workspace, dimension (LDH,NB). */ | |||||
| /* > */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] LDH */ | |||||
| /* > \verbatim */ | |||||
| /* > LDH is INTEGER */ | |||||
| /* > The leading dimension of the workspace H. LDH >= f2cmax(1,M). */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] WORK */ | |||||
| /* > \verbatim */ | |||||
| /* > WORK is COMPLEX workspace, dimension (M). */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* Authors: */ | |||||
| /* ======== */ | |||||
| /* > \author Univ. of Tennessee */ | |||||
| /* > \author Univ. of California Berkeley */ | |||||
| /* > \author Univ. of Colorado Denver */ | |||||
| /* > \author NAG Ltd. */ | |||||
| /* > \date November 2017 */ | |||||
| /* > \ingroup complexSYcomputational */ | |||||
| /* ===================================================================== */ | |||||
| /* Subroutine */ int clahef_aa_(char *uplo, integer *j1, integer *m, integer | |||||
| *nb, complex *a, integer *lda, integer *ipiv, complex *h__, integer * | |||||
| ldh, complex *work) | |||||
| { | |||||
| /* System generated locals */ | |||||
| integer a_dim1, a_offset, h_dim1, h_offset, i__1, i__2; | |||||
| real r__1; | |||||
| complex q__1, q__2; | |||||
| /* Local variables */ | |||||
| integer j, k; | |||||
| complex alpha; | |||||
| extern /* Subroutine */ int cscal_(integer *, complex *, complex *, | |||||
| integer *); | |||||
| extern logical lsame_(char *, char *); | |||||
| extern /* Subroutine */ int cgemv_(char *, integer *, integer *, complex * | |||||
| , complex *, integer *, complex *, integer *, complex *, complex * | |||||
| , integer *), ccopy_(integer *, complex *, integer *, | |||||
| complex *, integer *), cswap_(integer *, complex *, integer *, | |||||
| complex *, integer *), caxpy_(integer *, complex *, complex *, | |||||
| integer *, complex *, integer *); | |||||
| integer i1, k1, i2, mj; | |||||
| extern /* Subroutine */ int clacgv_(integer *, complex *, integer *); | |||||
| extern integer icamax_(integer *, complex *, integer *); | |||||
| extern /* Subroutine */ int claset_(char *, integer *, integer *, complex | |||||
| *, complex *, complex *, integer *); | |||||
| complex piv; | |||||
| /* -- LAPACK computational routine (version 3.8.0) -- */ | |||||
| /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ | |||||
| /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ | |||||
| /* November 2017 */ | |||||
| /* ===================================================================== */ | |||||
| /* Parameter adjustments */ | |||||
| a_dim1 = *lda; | |||||
| a_offset = 1 + a_dim1 * 1; | |||||
| a -= a_offset; | |||||
| --ipiv; | |||||
| h_dim1 = *ldh; | |||||
| h_offset = 1 + h_dim1 * 1; | |||||
| h__ -= h_offset; | |||||
| --work; | |||||
| /* Function Body */ | |||||
| j = 1; | |||||
| /* K1 is the first column of the panel to be factorized */ | |||||
| /* i.e., K1 is 2 for the first block column, and 1 for the rest of the blocks */ | |||||
| k1 = 2 - *j1 + 1; | |||||
| if (lsame_(uplo, "U")) { | |||||
| /* ..................................................... */ | |||||
| /* Factorize A as U**T*D*U using the upper triangle of A */ | |||||
| /* ..................................................... */ | |||||
| L10: | |||||
| if (j > f2cmin(*m,*nb)) { | |||||
| goto L20; | |||||
| } | |||||
| /* K is the column to be factorized */ | |||||
| /* when being called from CHETRF_AA, */ | |||||
| /* > for the first block column, J1 is 1, hence J1+J-1 is J, */ | |||||
| /* > for the rest of the columns, J1 is 2, and J1+J-1 is J+1, */ | |||||
| k = *j1 + j - 1; | |||||
| if (j == *m) { | |||||
| /* Only need to compute T(J, J) */ | |||||
| mj = 1; | |||||
| } else { | |||||
| mj = *m - j + 1; | |||||
| } | |||||
| /* H(J:N, J) := A(J, J:N) - H(J:N, 1:(J-1)) * L(J1:(J-1), J), */ | |||||
| /* where H(J:N, J) has been initialized to be A(J, J:N) */ | |||||
| if (k > 2) { | |||||
| /* K is the column to be factorized */ | |||||
| /* > for the first block column, K is J, skipping the first two */ | |||||
| /* columns */ | |||||
| /* > for the rest of the columns, K is J+1, skipping only the */ | |||||
| /* first column */ | |||||
| i__1 = j - k1; | |||||
| clacgv_(&i__1, &a[j * a_dim1 + 1], &c__1); | |||||
| i__1 = j - k1; | |||||
| q__1.r = -1.f, q__1.i = 0.f; | |||||
| cgemv_("No transpose", &mj, &i__1, &q__1, &h__[j + k1 * h_dim1], | |||||
| ldh, &a[j * a_dim1 + 1], &c__1, &c_b2, &h__[j + j * | |||||
| h_dim1], &c__1); | |||||
| i__1 = j - k1; | |||||
| clacgv_(&i__1, &a[j * a_dim1 + 1], &c__1); | |||||
| } | |||||
| /* Copy H(i:n, i) into WORK */ | |||||
| ccopy_(&mj, &h__[j + j * h_dim1], &c__1, &work[1], &c__1); | |||||
| if (j > k1) { | |||||
| /* Compute WORK := WORK - L(J-1, J:N) * T(J-1,J), */ | |||||
| /* where A(J-1, J) stores T(J-1, J) and A(J-2, J:N) stores U(J-1, J:N) */ | |||||
| r_cnjg(&q__2, &a[k - 1 + j * a_dim1]); | |||||
| q__1.r = -q__2.r, q__1.i = -q__2.i; | |||||
| alpha.r = q__1.r, alpha.i = q__1.i; | |||||
| caxpy_(&mj, &alpha, &a[k - 2 + j * a_dim1], lda, &work[1], &c__1); | |||||
| } | |||||
| /* Set A(J, J) = T(J, J) */ | |||||
| i__1 = k + j * a_dim1; | |||||
| r__1 = work[1].r; | |||||
| a[i__1].r = r__1, a[i__1].i = 0.f; | |||||
| if (j < *m) { | |||||
| /* Compute WORK(2:N) = T(J, J) L(J, (J+1):N) */ | |||||
| /* where A(J, J) stores T(J, J) and A(J-1, (J+1):N) stores U(J, (J+1):N) */ | |||||
| if (k > 1) { | |||||
| i__1 = k + j * a_dim1; | |||||
| q__1.r = -a[i__1].r, q__1.i = -a[i__1].i; | |||||
| alpha.r = q__1.r, alpha.i = q__1.i; | |||||
| i__1 = *m - j; | |||||
| caxpy_(&i__1, &alpha, &a[k - 1 + (j + 1) * a_dim1], lda, & | |||||
| work[2], &c__1); | |||||
| } | |||||
| /* Find f2cmax(|WORK(2:n)|) */ | |||||
| i__1 = *m - j; | |||||
| i2 = icamax_(&i__1, &work[2], &c__1) + 1; | |||||
| i__1 = i2; | |||||
| piv.r = work[i__1].r, piv.i = work[i__1].i; | |||||
| /* Apply hermitian pivot */ | |||||
| if (i2 != 2 && (piv.r != 0.f || piv.i != 0.)) { | |||||
| /* Swap WORK(I1) and WORK(I2) */ | |||||
| i1 = 2; | |||||
| i__1 = i2; | |||||
| i__2 = i1; | |||||
| work[i__1].r = work[i__2].r, work[i__1].i = work[i__2].i; | |||||
| i__1 = i1; | |||||
| work[i__1].r = piv.r, work[i__1].i = piv.i; | |||||
| /* Swap A(I1, I1+1:N) with A(I1+1:N, I2) */ | |||||
| i1 = i1 + j - 1; | |||||
| i2 = i2 + j - 1; | |||||
| i__1 = i2 - i1 - 1; | |||||
| cswap_(&i__1, &a[*j1 + i1 - 1 + (i1 + 1) * a_dim1], lda, &a[* | |||||
| j1 + i1 + i2 * a_dim1], &c__1); | |||||
| i__1 = i2 - i1; | |||||
| clacgv_(&i__1, &a[*j1 + i1 - 1 + (i1 + 1) * a_dim1], lda); | |||||
| i__1 = i2 - i1 - 1; | |||||
| clacgv_(&i__1, &a[*j1 + i1 + i2 * a_dim1], &c__1); | |||||
| /* Swap A(I1, I2+1:N) with A(I2, I2+1:N) */ | |||||
| if (i2 < *m) { | |||||
| i__1 = *m - i2; | |||||
| cswap_(&i__1, &a[*j1 + i1 - 1 + (i2 + 1) * a_dim1], lda, & | |||||
| a[*j1 + i2 - 1 + (i2 + 1) * a_dim1], lda); | |||||
| } | |||||
| /* Swap A(I1, I1) with A(I2,I2) */ | |||||
| i__1 = i1 + *j1 - 1 + i1 * a_dim1; | |||||
| piv.r = a[i__1].r, piv.i = a[i__1].i; | |||||
| i__1 = *j1 + i1 - 1 + i1 * a_dim1; | |||||
| i__2 = *j1 + i2 - 1 + i2 * a_dim1; | |||||
| a[i__1].r = a[i__2].r, a[i__1].i = a[i__2].i; | |||||
| i__1 = *j1 + i2 - 1 + i2 * a_dim1; | |||||
| a[i__1].r = piv.r, a[i__1].i = piv.i; | |||||
| /* Swap H(I1, 1:J1) with H(I2, 1:J1) */ | |||||
| i__1 = i1 - 1; | |||||
| cswap_(&i__1, &h__[i1 + h_dim1], ldh, &h__[i2 + h_dim1], ldh); | |||||
| ipiv[i1] = i2; | |||||
| if (i1 > k1 - 1) { | |||||
| /* Swap L(1:I1-1, I1) with L(1:I1-1, I2), */ | |||||
| /* skipping the first column */ | |||||
| i__1 = i1 - k1 + 1; | |||||
| cswap_(&i__1, &a[i1 * a_dim1 + 1], &c__1, &a[i2 * a_dim1 | |||||
| + 1], &c__1); | |||||
| } | |||||
| } else { | |||||
| ipiv[j + 1] = j + 1; | |||||
| } | |||||
| /* Set A(J, J+1) = T(J, J+1) */ | |||||
| i__1 = k + (j + 1) * a_dim1; | |||||
| a[i__1].r = work[2].r, a[i__1].i = work[2].i; | |||||
| if (j < *nb) { | |||||
| /* Copy A(J+1:N, J+1) into H(J:N, J), */ | |||||
| i__1 = *m - j; | |||||
| ccopy_(&i__1, &a[k + 1 + (j + 1) * a_dim1], lda, &h__[j + 1 + | |||||
| (j + 1) * h_dim1], &c__1); | |||||
| } | |||||
| /* Compute L(J+2, J+1) = WORK( 3:N ) / T(J, J+1), */ | |||||
| /* where A(J, J+1) = T(J, J+1) and A(J+2:N, J) = L(J+2:N, J+1) */ | |||||
| if (j < *m - 1) { | |||||
| i__1 = k + (j + 1) * a_dim1; | |||||
| if (a[i__1].r != 0.f || a[i__1].i != 0.f) { | |||||
| c_div(&q__1, &c_b2, &a[k + (j + 1) * a_dim1]); | |||||
| alpha.r = q__1.r, alpha.i = q__1.i; | |||||
| i__1 = *m - j - 1; | |||||
| ccopy_(&i__1, &work[3], &c__1, &a[k + (j + 2) * a_dim1], | |||||
| lda); | |||||
| i__1 = *m - j - 1; | |||||
| cscal_(&i__1, &alpha, &a[k + (j + 2) * a_dim1], lda); | |||||
| } else { | |||||
| i__1 = *m - j - 1; | |||||
| claset_("Full", &c__1, &i__1, &c_b1, &c_b1, &a[k + (j + 2) | |||||
| * a_dim1], lda); | |||||
| } | |||||
| } | |||||
| } | |||||
| ++j; | |||||
| goto L10; | |||||
| L20: | |||||
| ; | |||||
| } else { | |||||
| /* ..................................................... */ | |||||
| /* Factorize A as L*D*L**T using the lower triangle of A */ | |||||
| /* ..................................................... */ | |||||
| L30: | |||||
| if (j > f2cmin(*m,*nb)) { | |||||
| goto L40; | |||||
| } | |||||
| /* K is the column to be factorized */ | |||||
| /* when being called from CHETRF_AA, */ | |||||
| /* > for the first block column, J1 is 1, hence J1+J-1 is J, */ | |||||
| /* > for the rest of the columns, J1 is 2, and J1+J-1 is J+1, */ | |||||
| k = *j1 + j - 1; | |||||
| if (j == *m) { | |||||
| /* Only need to compute T(J, J) */ | |||||
| mj = 1; | |||||
| } else { | |||||
| mj = *m - j + 1; | |||||
| } | |||||
| /* H(J:N, J) := A(J:N, J) - H(J:N, 1:(J-1)) * L(J, J1:(J-1))^T, */ | |||||
| /* where H(J:N, J) has been initialized to be A(J:N, J) */ | |||||
| if (k > 2) { | |||||
| /* K is the column to be factorized */ | |||||
| /* > for the first block column, K is J, skipping the first two */ | |||||
| /* columns */ | |||||
| /* > for the rest of the columns, K is J+1, skipping only the */ | |||||
| /* first column */ | |||||
| i__1 = j - k1; | |||||
| clacgv_(&i__1, &a[j + a_dim1], lda); | |||||
| i__1 = j - k1; | |||||
| q__1.r = -1.f, q__1.i = 0.f; | |||||
| cgemv_("No transpose", &mj, &i__1, &q__1, &h__[j + k1 * h_dim1], | |||||
| ldh, &a[j + a_dim1], lda, &c_b2, &h__[j + j * h_dim1], & | |||||
| c__1); | |||||
| i__1 = j - k1; | |||||
| clacgv_(&i__1, &a[j + a_dim1], lda); | |||||
| } | |||||
| /* Copy H(J:N, J) into WORK */ | |||||
| ccopy_(&mj, &h__[j + j * h_dim1], &c__1, &work[1], &c__1); | |||||
| if (j > k1) { | |||||
| /* Compute WORK := WORK - L(J:N, J-1) * T(J-1,J), */ | |||||
| /* where A(J-1, J) = T(J-1, J) and A(J, J-2) = L(J, J-1) */ | |||||
| r_cnjg(&q__2, &a[j + (k - 1) * a_dim1]); | |||||
| q__1.r = -q__2.r, q__1.i = -q__2.i; | |||||
| alpha.r = q__1.r, alpha.i = q__1.i; | |||||
| caxpy_(&mj, &alpha, &a[j + (k - 2) * a_dim1], &c__1, &work[1], & | |||||
| c__1); | |||||
| } | |||||
| /* Set A(J, J) = T(J, J) */ | |||||
| i__1 = j + k * a_dim1; | |||||
| r__1 = work[1].r; | |||||
| a[i__1].r = r__1, a[i__1].i = 0.f; | |||||
| if (j < *m) { | |||||
| /* Compute WORK(2:N) = T(J, J) L((J+1):N, J) */ | |||||
| /* where A(J, J) = T(J, J) and A((J+1):N, J-1) = L((J+1):N, J) */ | |||||
| if (k > 1) { | |||||
| i__1 = j + k * a_dim1; | |||||
| q__1.r = -a[i__1].r, q__1.i = -a[i__1].i; | |||||
| alpha.r = q__1.r, alpha.i = q__1.i; | |||||
| i__1 = *m - j; | |||||
| caxpy_(&i__1, &alpha, &a[j + 1 + (k - 1) * a_dim1], &c__1, & | |||||
| work[2], &c__1); | |||||
| } | |||||
| /* Find f2cmax(|WORK(2:n)|) */ | |||||
| i__1 = *m - j; | |||||
| i2 = icamax_(&i__1, &work[2], &c__1) + 1; | |||||
| i__1 = i2; | |||||
| piv.r = work[i__1].r, piv.i = work[i__1].i; | |||||
| /* Apply hermitian pivot */ | |||||
| if (i2 != 2 && (piv.r != 0.f || piv.i != 0.)) { | |||||
| /* Swap WORK(I1) and WORK(I2) */ | |||||
| i1 = 2; | |||||
| i__1 = i2; | |||||
| i__2 = i1; | |||||
| work[i__1].r = work[i__2].r, work[i__1].i = work[i__2].i; | |||||
| i__1 = i1; | |||||
| work[i__1].r = piv.r, work[i__1].i = piv.i; | |||||
| /* Swap A(I1+1:N, I1) with A(I2, I1+1:N) */ | |||||
| i1 = i1 + j - 1; | |||||
| i2 = i2 + j - 1; | |||||
| i__1 = i2 - i1 - 1; | |||||
| cswap_(&i__1, &a[i1 + 1 + (*j1 + i1 - 1) * a_dim1], &c__1, &a[ | |||||
| i2 + (*j1 + i1) * a_dim1], lda); | |||||
| i__1 = i2 - i1; | |||||
| clacgv_(&i__1, &a[i1 + 1 + (*j1 + i1 - 1) * a_dim1], &c__1); | |||||
| i__1 = i2 - i1 - 1; | |||||
| clacgv_(&i__1, &a[i2 + (*j1 + i1) * a_dim1], lda); | |||||
| /* Swap A(I2+1:N, I1) with A(I2+1:N, I2) */ | |||||
| if (i2 < *m) { | |||||
| i__1 = *m - i2; | |||||
| cswap_(&i__1, &a[i2 + 1 + (*j1 + i1 - 1) * a_dim1], &c__1, | |||||
| &a[i2 + 1 + (*j1 + i2 - 1) * a_dim1], &c__1); | |||||
| } | |||||
| /* Swap A(I1, I1) with A(I2, I2) */ | |||||
| i__1 = i1 + (*j1 + i1 - 1) * a_dim1; | |||||
| piv.r = a[i__1].r, piv.i = a[i__1].i; | |||||
| i__1 = i1 + (*j1 + i1 - 1) * a_dim1; | |||||
| i__2 = i2 + (*j1 + i2 - 1) * a_dim1; | |||||
| a[i__1].r = a[i__2].r, a[i__1].i = a[i__2].i; | |||||
| i__1 = i2 + (*j1 + i2 - 1) * a_dim1; | |||||
| a[i__1].r = piv.r, a[i__1].i = piv.i; | |||||
| /* Swap H(I1, I1:J1) with H(I2, I2:J1) */ | |||||
| i__1 = i1 - 1; | |||||
| cswap_(&i__1, &h__[i1 + h_dim1], ldh, &h__[i2 + h_dim1], ldh); | |||||
| ipiv[i1] = i2; | |||||
| if (i1 > k1 - 1) { | |||||
| /* Swap L(1:I1-1, I1) with L(1:I1-1, I2), */ | |||||
| /* skipping the first column */ | |||||
| i__1 = i1 - k1 + 1; | |||||
| cswap_(&i__1, &a[i1 + a_dim1], lda, &a[i2 + a_dim1], lda); | |||||
| } | |||||
| } else { | |||||
| ipiv[j + 1] = j + 1; | |||||
| } | |||||
| /* Set A(J+1, J) = T(J+1, J) */ | |||||
| i__1 = j + 1 + k * a_dim1; | |||||
| a[i__1].r = work[2].r, a[i__1].i = work[2].i; | |||||
| if (j < *nb) { | |||||
| /* Copy A(J+1:N, J+1) into H(J+1:N, J), */ | |||||
| i__1 = *m - j; | |||||
| ccopy_(&i__1, &a[j + 1 + (k + 1) * a_dim1], &c__1, &h__[j + 1 | |||||
| + (j + 1) * h_dim1], &c__1); | |||||
| } | |||||
| /* Compute L(J+2, J+1) = WORK( 3:N ) / T(J, J+1), */ | |||||
| /* where A(J, J+1) = T(J, J+1) and A(J+2:N, J) = L(J+2:N, J+1) */ | |||||
| if (j < *m - 1) { | |||||
| i__1 = j + 1 + k * a_dim1; | |||||
| if (a[i__1].r != 0.f || a[i__1].i != 0.f) { | |||||
| c_div(&q__1, &c_b2, &a[j + 1 + k * a_dim1]); | |||||
| alpha.r = q__1.r, alpha.i = q__1.i; | |||||
| i__1 = *m - j - 1; | |||||
| ccopy_(&i__1, &work[3], &c__1, &a[j + 2 + k * a_dim1], & | |||||
| c__1); | |||||
| i__1 = *m - j - 1; | |||||
| cscal_(&i__1, &alpha, &a[j + 2 + k * a_dim1], &c__1); | |||||
| } else { | |||||
| i__1 = *m - j - 1; | |||||
| claset_("Full", &i__1, &c__1, &c_b1, &c_b1, &a[j + 2 + k * | |||||
| a_dim1], lda); | |||||
| } | |||||
| } | |||||
| } | |||||
| ++j; | |||||
| goto L30; | |||||
| L40: | |||||
| ; | |||||
| } | |||||
| return 0; | |||||
| /* End of CLAHEF_AA */ | |||||
| } /* clahef_aa__ */ | |||||
| @@ -0,0 +1,781 @@ | |||||
| /* f2c.h -- Standard Fortran to C header file */ | |||||
| /** barf [ba:rf] 2. "He suggested using FORTRAN, and everybody barfed." | |||||
| - From The Shogakukan DICTIONARY OF NEW ENGLISH (Second edition) */ | |||||
| #ifndef F2C_INCLUDE | |||||
| #define F2C_INCLUDE | |||||
| #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 | |||||
| typedef int 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; | |||||
| 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;} | |||||
| #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)); } | |||||
| #define c_div(c, a, b) {pCf(c) = Cf(a)/Cf(b);} | |||||
| #define z_div(c, a, b) {pCd(c) = Cd(a)/Cd(b);} | |||||
| #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) = conj(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) (cimag(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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotc_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void cdotu_(complex *z, integer *n_, complex *x, integer *incx_, complex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotu_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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) | |||||
| */ | |||||
| /* Table of constant values */ | |||||
| static complex c_b1 = {0.f,0.f}; | |||||
| static complex c_b2 = {1.f,0.f}; | |||||
| static integer c__1 = 1; | |||||
| /* > \brief \b CLAHR2 reduces the specified number of first columns of a general rectangular matrix A so that | |||||
| elements below the specified subdiagonal are zero, and returns auxiliary matrices which are needed to | |||||
| apply the transformation to the unreduced part */ | |||||
| /* of A. */ | |||||
| /* =========== DOCUMENTATION =========== */ | |||||
| /* Online html documentation available at */ | |||||
| /* http://www.netlib.org/lapack/explore-html/ */ | |||||
| /* > \htmlonly */ | |||||
| /* > Download CLAHR2 + dependencies */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/clahr2. | |||||
| f"> */ | |||||
| /* > [TGZ]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/clahr2. | |||||
| f"> */ | |||||
| /* > [ZIP]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/clahr2. | |||||
| f"> */ | |||||
| /* > [TXT]</a> */ | |||||
| /* > \endhtmlonly */ | |||||
| /* Definition: */ | |||||
| /* =========== */ | |||||
| /* SUBROUTINE CLAHR2( N, K, NB, A, LDA, TAU, T, LDT, Y, LDY ) */ | |||||
| /* INTEGER K, LDA, LDT, LDY, N, NB */ | |||||
| /* COMPLEX A( LDA, * ), T( LDT, NB ), TAU( NB ), */ | |||||
| /* $ Y( LDY, NB ) */ | |||||
| /* > \par Purpose: */ | |||||
| /* ============= */ | |||||
| /* > */ | |||||
| /* > \verbatim */ | |||||
| /* > */ | |||||
| /* > CLAHR2 reduces the first NB columns of A complex general n-BY-(n-k+1) */ | |||||
| /* > matrix A so that elements below the k-th subdiagonal are zero. The */ | |||||
| /* > reduction is performed by an unitary similarity transformation */ | |||||
| /* > Q**H * A * Q. The routine returns the matrices V and T which determine */ | |||||
| /* > Q as a block reflector I - V*T*v**H, and also the matrix Y = A * V * T. */ | |||||
| /* > */ | |||||
| /* > This is an auxiliary routine called by CGEHRD. */ | |||||
| /* > \endverbatim */ | |||||
| /* Arguments: */ | |||||
| /* ========== */ | |||||
| /* > \param[in] N */ | |||||
| /* > \verbatim */ | |||||
| /* > N is INTEGER */ | |||||
| /* > The order of the matrix A. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] K */ | |||||
| /* > \verbatim */ | |||||
| /* > K is INTEGER */ | |||||
| /* > The offset for the reduction. Elements below the k-th */ | |||||
| /* > subdiagonal in the first NB columns are reduced to zero. */ | |||||
| /* > K < N. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] NB */ | |||||
| /* > \verbatim */ | |||||
| /* > NB is INTEGER */ | |||||
| /* > The number of columns to be reduced. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in,out] A */ | |||||
| /* > \verbatim */ | |||||
| /* > A is COMPLEX array, dimension (LDA,N-K+1) */ | |||||
| /* > On entry, the n-by-(n-k+1) general matrix A. */ | |||||
| /* > On exit, the elements on and above the k-th subdiagonal in */ | |||||
| /* > the first NB columns are overwritten with the corresponding */ | |||||
| /* > elements of the reduced matrix; the elements below the k-th */ | |||||
| /* > subdiagonal, with the array TAU, represent the matrix Q as a */ | |||||
| /* > product of elementary reflectors. The other columns of A are */ | |||||
| /* > unchanged. See Further Details. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] LDA */ | |||||
| /* > \verbatim */ | |||||
| /* > LDA is INTEGER */ | |||||
| /* > The leading dimension of the array A. LDA >= f2cmax(1,N). */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] TAU */ | |||||
| /* > \verbatim */ | |||||
| /* > TAU is COMPLEX array, dimension (NB) */ | |||||
| /* > The scalar factors of the elementary reflectors. See Further */ | |||||
| /* > Details. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] T */ | |||||
| /* > \verbatim */ | |||||
| /* > T is COMPLEX array, dimension (LDT,NB) */ | |||||
| /* > The upper triangular matrix T. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] LDT */ | |||||
| /* > \verbatim */ | |||||
| /* > LDT is INTEGER */ | |||||
| /* > The leading dimension of the array T. LDT >= NB. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] Y */ | |||||
| /* > \verbatim */ | |||||
| /* > Y is COMPLEX array, dimension (LDY,NB) */ | |||||
| /* > The n-by-nb matrix Y. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] LDY */ | |||||
| /* > \verbatim */ | |||||
| /* > LDY is INTEGER */ | |||||
| /* > The leading dimension of the array Y. LDY >= N. */ | |||||
| /* > \endverbatim */ | |||||
| /* Authors: */ | |||||
| /* ======== */ | |||||
| /* > \author Univ. of Tennessee */ | |||||
| /* > \author Univ. of California Berkeley */ | |||||
| /* > \author Univ. of Colorado Denver */ | |||||
| /* > \author NAG Ltd. */ | |||||
| /* > \date December 2016 */ | |||||
| /* > \ingroup complexOTHERauxiliary */ | |||||
| /* > \par Further Details: */ | |||||
| /* ===================== */ | |||||
| /* > */ | |||||
| /* > \verbatim */ | |||||
| /* > */ | |||||
| /* > The matrix Q is represented as a product of nb elementary reflectors */ | |||||
| /* > */ | |||||
| /* > Q = H(1) H(2) . . . H(nb). */ | |||||
| /* > */ | |||||
| /* > Each H(i) has the form */ | |||||
| /* > */ | |||||
| /* > H(i) = I - tau * v * v**H */ | |||||
| /* > */ | |||||
| /* > where tau is a complex scalar, and v is a complex vector with */ | |||||
| /* > v(1:i+k-1) = 0, v(i+k) = 1; v(i+k+1:n) is stored on exit in */ | |||||
| /* > A(i+k+1:n,i), and tau in TAU(i). */ | |||||
| /* > */ | |||||
| /* > The elements of the vectors v together form the (n-k+1)-by-nb matrix */ | |||||
| /* > V which is needed, with T and Y, to apply the transformation to the */ | |||||
| /* > unreduced part of the matrix, using an update of the form: */ | |||||
| /* > A := (I - V*T*V**H) * (A - Y*V**H). */ | |||||
| /* > */ | |||||
| /* > The contents of A on exit are illustrated by the following example */ | |||||
| /* > with n = 7, k = 3 and nb = 2: */ | |||||
| /* > */ | |||||
| /* > ( a a a a a ) */ | |||||
| /* > ( a a a a a ) */ | |||||
| /* > ( a a a a a ) */ | |||||
| /* > ( h h a a a ) */ | |||||
| /* > ( v1 h a a a ) */ | |||||
| /* > ( v1 v2 a a a ) */ | |||||
| /* > ( v1 v2 a a a ) */ | |||||
| /* > */ | |||||
| /* > where a denotes an element of the original matrix A, h denotes a */ | |||||
| /* > modified element of the upper Hessenberg matrix H, and vi denotes an */ | |||||
| /* > element of the vector defining H(i). */ | |||||
| /* > */ | |||||
| /* > This subroutine is a slight modification of LAPACK-3.0's DLAHRD */ | |||||
| /* > incorporating improvements proposed by Quintana-Orti and Van de */ | |||||
| /* > Gejin. Note that the entries of A(1:K,2:NB) differ from those */ | |||||
| /* > returned by the original LAPACK-3.0's DLAHRD routine. (This */ | |||||
| /* > subroutine is not backward compatible with LAPACK-3.0's DLAHRD.) */ | |||||
| /* > \endverbatim */ | |||||
| /* > \par References: */ | |||||
| /* ================ */ | |||||
| /* > */ | |||||
| /* > Gregorio Quintana-Orti and Robert van de Geijn, "Improving the */ | |||||
| /* > performance of reduction to Hessenberg form," ACM Transactions on */ | |||||
| /* > Mathematical Software, 32(2):180-194, June 2006. */ | |||||
| /* > */ | |||||
| /* ===================================================================== */ | |||||
| /* Subroutine */ int clahr2_(integer *n, integer *k, integer *nb, complex *a, | |||||
| integer *lda, complex *tau, complex *t, integer *ldt, complex *y, | |||||
| integer *ldy) | |||||
| { | |||||
| /* System generated locals */ | |||||
| integer a_dim1, a_offset, t_dim1, t_offset, y_dim1, y_offset, i__1, i__2, | |||||
| i__3; | |||||
| complex q__1; | |||||
| /* Local variables */ | |||||
| integer i__; | |||||
| extern /* Subroutine */ int cscal_(integer *, complex *, complex *, | |||||
| integer *), cgemm_(char *, char *, integer *, integer *, integer * | |||||
| , complex *, complex *, integer *, complex *, integer *, complex * | |||||
| , complex *, integer *), cgemv_(char *, integer *, | |||||
| integer *, complex *, complex *, integer *, complex *, integer *, | |||||
| complex *, complex *, integer *), ccopy_(integer *, | |||||
| complex *, integer *, complex *, integer *), ctrmm_(char *, char * | |||||
| , char *, char *, integer *, integer *, complex *, complex *, | |||||
| integer *, complex *, integer *), | |||||
| caxpy_(integer *, complex *, complex *, integer *, complex *, | |||||
| integer *), ctrmv_(char *, char *, char *, integer *, complex *, | |||||
| integer *, complex *, integer *); | |||||
| complex ei; | |||||
| extern /* Subroutine */ int clarfg_(integer *, complex *, complex *, | |||||
| integer *, complex *), clacgv_(integer *, complex *, integer *), | |||||
| clacpy_(char *, integer *, integer *, complex *, integer *, | |||||
| complex *, integer *); | |||||
| /* -- LAPACK auxiliary routine (version 3.7.0) -- */ | |||||
| /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ | |||||
| /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ | |||||
| /* December 2016 */ | |||||
| /* ===================================================================== */ | |||||
| /* Quick return if possible */ | |||||
| /* Parameter adjustments */ | |||||
| --tau; | |||||
| a_dim1 = *lda; | |||||
| a_offset = 1 + a_dim1 * 1; | |||||
| a -= a_offset; | |||||
| t_dim1 = *ldt; | |||||
| t_offset = 1 + t_dim1 * 1; | |||||
| t -= t_offset; | |||||
| y_dim1 = *ldy; | |||||
| y_offset = 1 + y_dim1 * 1; | |||||
| y -= y_offset; | |||||
| /* Function Body */ | |||||
| if (*n <= 1) { | |||||
| return 0; | |||||
| } | |||||
| i__1 = *nb; | |||||
| for (i__ = 1; i__ <= i__1; ++i__) { | |||||
| if (i__ > 1) { | |||||
| /* Update A(K+1:N,I) */ | |||||
| /* Update I-th column of A - Y * V**H */ | |||||
| i__2 = i__ - 1; | |||||
| clacgv_(&i__2, &a[*k + i__ - 1 + a_dim1], lda); | |||||
| i__2 = *n - *k; | |||||
| i__3 = i__ - 1; | |||||
| q__1.r = -1.f, q__1.i = 0.f; | |||||
| cgemv_("NO TRANSPOSE", &i__2, &i__3, &q__1, &y[*k + 1 + y_dim1], | |||||
| ldy, &a[*k + i__ - 1 + a_dim1], lda, &c_b2, &a[*k + 1 + | |||||
| i__ * a_dim1], &c__1); | |||||
| i__2 = i__ - 1; | |||||
| clacgv_(&i__2, &a[*k + i__ - 1 + a_dim1], lda); | |||||
| /* Apply I - V * T**H * V**H to this column (call it b) from the */ | |||||
| /* left, using the last column of T as workspace */ | |||||
| /* Let V = ( V1 ) and b = ( b1 ) (first I-1 rows) */ | |||||
| /* ( V2 ) ( b2 ) */ | |||||
| /* where V1 is unit lower triangular */ | |||||
| /* w := V1**H * b1 */ | |||||
| i__2 = i__ - 1; | |||||
| ccopy_(&i__2, &a[*k + 1 + i__ * a_dim1], &c__1, &t[*nb * t_dim1 + | |||||
| 1], &c__1); | |||||
| i__2 = i__ - 1; | |||||
| ctrmv_("Lower", "Conjugate transpose", "UNIT", &i__2, &a[*k + 1 + | |||||
| a_dim1], lda, &t[*nb * t_dim1 + 1], &c__1); | |||||
| /* w := w + V2**H * b2 */ | |||||
| i__2 = *n - *k - i__ + 1; | |||||
| i__3 = i__ - 1; | |||||
| cgemv_("Conjugate transpose", &i__2, &i__3, &c_b2, &a[*k + i__ + | |||||
| a_dim1], lda, &a[*k + i__ + i__ * a_dim1], &c__1, &c_b2, & | |||||
| t[*nb * t_dim1 + 1], &c__1); | |||||
| /* w := T**H * w */ | |||||
| i__2 = i__ - 1; | |||||
| ctrmv_("Upper", "Conjugate transpose", "NON-UNIT", &i__2, &t[ | |||||
| t_offset], ldt, &t[*nb * t_dim1 + 1], &c__1); | |||||
| /* b2 := b2 - V2*w */ | |||||
| i__2 = *n - *k - i__ + 1; | |||||
| i__3 = i__ - 1; | |||||
| q__1.r = -1.f, q__1.i = 0.f; | |||||
| cgemv_("NO TRANSPOSE", &i__2, &i__3, &q__1, &a[*k + i__ + a_dim1], | |||||
| lda, &t[*nb * t_dim1 + 1], &c__1, &c_b2, &a[*k + i__ + | |||||
| i__ * a_dim1], &c__1); | |||||
| /* b1 := b1 - V1*w */ | |||||
| i__2 = i__ - 1; | |||||
| ctrmv_("Lower", "NO TRANSPOSE", "UNIT", &i__2, &a[*k + 1 + a_dim1] | |||||
| , lda, &t[*nb * t_dim1 + 1], &c__1); | |||||
| i__2 = i__ - 1; | |||||
| q__1.r = -1.f, q__1.i = 0.f; | |||||
| caxpy_(&i__2, &q__1, &t[*nb * t_dim1 + 1], &c__1, &a[*k + 1 + i__ | |||||
| * a_dim1], &c__1); | |||||
| i__2 = *k + i__ - 1 + (i__ - 1) * a_dim1; | |||||
| a[i__2].r = ei.r, a[i__2].i = ei.i; | |||||
| } | |||||
| /* Generate the elementary reflector H(I) to annihilate */ | |||||
| /* A(K+I+1:N,I) */ | |||||
| i__2 = *n - *k - i__ + 1; | |||||
| /* Computing MIN */ | |||||
| i__3 = *k + i__ + 1; | |||||
| clarfg_(&i__2, &a[*k + i__ + i__ * a_dim1], &a[f2cmin(i__3,*n) + i__ * | |||||
| a_dim1], &c__1, &tau[i__]); | |||||
| i__2 = *k + i__ + i__ * a_dim1; | |||||
| ei.r = a[i__2].r, ei.i = a[i__2].i; | |||||
| i__2 = *k + i__ + i__ * a_dim1; | |||||
| a[i__2].r = 1.f, a[i__2].i = 0.f; | |||||
| /* Compute Y(K+1:N,I) */ | |||||
| i__2 = *n - *k; | |||||
| i__3 = *n - *k - i__ + 1; | |||||
| cgemv_("NO TRANSPOSE", &i__2, &i__3, &c_b2, &a[*k + 1 + (i__ + 1) * | |||||
| a_dim1], lda, &a[*k + i__ + i__ * a_dim1], &c__1, &c_b1, &y[* | |||||
| k + 1 + i__ * y_dim1], &c__1); | |||||
| i__2 = *n - *k - i__ + 1; | |||||
| i__3 = i__ - 1; | |||||
| cgemv_("Conjugate transpose", &i__2, &i__3, &c_b2, &a[*k + i__ + | |||||
| a_dim1], lda, &a[*k + i__ + i__ * a_dim1], &c__1, &c_b1, &t[ | |||||
| i__ * t_dim1 + 1], &c__1); | |||||
| i__2 = *n - *k; | |||||
| i__3 = i__ - 1; | |||||
| q__1.r = -1.f, q__1.i = 0.f; | |||||
| cgemv_("NO TRANSPOSE", &i__2, &i__3, &q__1, &y[*k + 1 + y_dim1], ldy, | |||||
| &t[i__ * t_dim1 + 1], &c__1, &c_b2, &y[*k + 1 + i__ * y_dim1], | |||||
| &c__1); | |||||
| i__2 = *n - *k; | |||||
| cscal_(&i__2, &tau[i__], &y[*k + 1 + i__ * y_dim1], &c__1); | |||||
| /* Compute T(1:I,I) */ | |||||
| i__2 = i__ - 1; | |||||
| i__3 = i__; | |||||
| q__1.r = -tau[i__3].r, q__1.i = -tau[i__3].i; | |||||
| cscal_(&i__2, &q__1, &t[i__ * t_dim1 + 1], &c__1); | |||||
| i__2 = i__ - 1; | |||||
| ctrmv_("Upper", "No Transpose", "NON-UNIT", &i__2, &t[t_offset], ldt, | |||||
| &t[i__ * t_dim1 + 1], &c__1) | |||||
| ; | |||||
| i__2 = i__ + i__ * t_dim1; | |||||
| i__3 = i__; | |||||
| t[i__2].r = tau[i__3].r, t[i__2].i = tau[i__3].i; | |||||
| /* L10: */ | |||||
| } | |||||
| i__1 = *k + *nb + *nb * a_dim1; | |||||
| a[i__1].r = ei.r, a[i__1].i = ei.i; | |||||
| /* Compute Y(1:K,1:NB) */ | |||||
| clacpy_("ALL", k, nb, &a[(a_dim1 << 1) + 1], lda, &y[y_offset], ldy); | |||||
| ctrmm_("RIGHT", "Lower", "NO TRANSPOSE", "UNIT", k, nb, &c_b2, &a[*k + 1 | |||||
| + a_dim1], lda, &y[y_offset], ldy); | |||||
| if (*n > *k + *nb) { | |||||
| i__1 = *n - *k - *nb; | |||||
| cgemm_("NO TRANSPOSE", "NO TRANSPOSE", k, nb, &i__1, &c_b2, &a[(*nb + | |||||
| 2) * a_dim1 + 1], lda, &a[*k + 1 + *nb + a_dim1], lda, &c_b2, | |||||
| &y[y_offset], ldy); | |||||
| } | |||||
| ctrmm_("RIGHT", "Upper", "NO TRANSPOSE", "NON-UNIT", k, nb, &c_b2, &t[ | |||||
| t_offset], ldt, &y[y_offset], ldy); | |||||
| return 0; | |||||
| /* End of CLAHR2 */ | |||||
| } /* clahr2_ */ | |||||
| @@ -0,0 +1,877 @@ | |||||
| /* f2c.h -- Standard Fortran to C header file */ | |||||
| /** barf [ba:rf] 2. "He suggested using FORTRAN, and everybody barfed." | |||||
| - From The Shogakukan DICTIONARY OF NEW ENGLISH (Second edition) */ | |||||
| #ifndef F2C_INCLUDE | |||||
| #define F2C_INCLUDE | |||||
| #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 | |||||
| typedef int 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; | |||||
| 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;} | |||||
| #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)); } | |||||
| #define c_div(c, a, b) {pCf(c) = Cf(a)/Cf(b);} | |||||
| #define z_div(c, a, b) {pCd(c) = Cd(a)/Cd(b);} | |||||
| #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) = conj(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) (cimag(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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotc_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void cdotu_(complex *z, integer *n_, complex *x, integer *incx_, complex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotu_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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) | |||||
| */ | |||||
| /* Table of constant values */ | |||||
| static integer c__1 = 1; | |||||
| /* > \brief \b CLAIC1 applies one step of incremental condition estimation. */ | |||||
| /* =========== DOCUMENTATION =========== */ | |||||
| /* Online html documentation available at */ | |||||
| /* http://www.netlib.org/lapack/explore-html/ */ | |||||
| /* > \htmlonly */ | |||||
| /* > Download CLAIC1 + dependencies */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/claic1. | |||||
| f"> */ | |||||
| /* > [TGZ]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/claic1. | |||||
| f"> */ | |||||
| /* > [ZIP]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/claic1. | |||||
| f"> */ | |||||
| /* > [TXT]</a> */ | |||||
| /* > \endhtmlonly */ | |||||
| /* Definition: */ | |||||
| /* =========== */ | |||||
| /* SUBROUTINE CLAIC1( JOB, J, X, SEST, W, GAMMA, SESTPR, S, C ) */ | |||||
| /* INTEGER J, JOB */ | |||||
| /* REAL SEST, SESTPR */ | |||||
| /* COMPLEX C, GAMMA, S */ | |||||
| /* COMPLEX W( J ), X( J ) */ | |||||
| /* > \par Purpose: */ | |||||
| /* ============= */ | |||||
| /* > */ | |||||
| /* > \verbatim */ | |||||
| /* > */ | |||||
| /* > CLAIC1 applies one step of incremental condition estimation in */ | |||||
| /* > its simplest version: */ | |||||
| /* > */ | |||||
| /* > Let x, twonorm(x) = 1, be an approximate singular vector of an j-by-j */ | |||||
| /* > lower triangular matrix L, such that */ | |||||
| /* > twonorm(L*x) = sest */ | |||||
| /* > Then CLAIC1 computes sestpr, s, c such that */ | |||||
| /* > the vector */ | |||||
| /* > [ s*x ] */ | |||||
| /* > xhat = [ c ] */ | |||||
| /* > is an approximate singular vector of */ | |||||
| /* > [ L 0 ] */ | |||||
| /* > Lhat = [ w**H gamma ] */ | |||||
| /* > in the sense that */ | |||||
| /* > twonorm(Lhat*xhat) = sestpr. */ | |||||
| /* > */ | |||||
| /* > Depending on JOB, an estimate for the largest or smallest singular */ | |||||
| /* > value is computed. */ | |||||
| /* > */ | |||||
| /* > Note that [s c]**H and sestpr**2 is an eigenpair of the system */ | |||||
| /* > */ | |||||
| /* > diag(sest*sest, 0) + [alpha gamma] * [ conjg(alpha) ] */ | |||||
| /* > [ conjg(gamma) ] */ | |||||
| /* > */ | |||||
| /* > where alpha = x**H*w. */ | |||||
| /* > \endverbatim */ | |||||
| /* Arguments: */ | |||||
| /* ========== */ | |||||
| /* > \param[in] JOB */ | |||||
| /* > \verbatim */ | |||||
| /* > JOB is INTEGER */ | |||||
| /* > = 1: an estimate for the largest singular value is computed. */ | |||||
| /* > = 2: an estimate for the smallest singular value is computed. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] J */ | |||||
| /* > \verbatim */ | |||||
| /* > J is INTEGER */ | |||||
| /* > Length of X and W */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] X */ | |||||
| /* > \verbatim */ | |||||
| /* > X is COMPLEX array, dimension (J) */ | |||||
| /* > The j-vector x. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] SEST */ | |||||
| /* > \verbatim */ | |||||
| /* > SEST is REAL */ | |||||
| /* > Estimated singular value of j by j matrix L */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] W */ | |||||
| /* > \verbatim */ | |||||
| /* > W is COMPLEX array, dimension (J) */ | |||||
| /* > The j-vector w. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] GAMMA */ | |||||
| /* > \verbatim */ | |||||
| /* > GAMMA is COMPLEX */ | |||||
| /* > The diagonal element gamma. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] SESTPR */ | |||||
| /* > \verbatim */ | |||||
| /* > SESTPR is REAL */ | |||||
| /* > Estimated singular value of (j+1) by (j+1) matrix Lhat. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] S */ | |||||
| /* > \verbatim */ | |||||
| /* > S is COMPLEX */ | |||||
| /* > Sine needed in forming xhat. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] C */ | |||||
| /* > \verbatim */ | |||||
| /* > C is COMPLEX */ | |||||
| /* > Cosine needed in forming xhat. */ | |||||
| /* > \endverbatim */ | |||||
| /* Authors: */ | |||||
| /* ======== */ | |||||
| /* > \author Univ. of Tennessee */ | |||||
| /* > \author Univ. of California Berkeley */ | |||||
| /* > \author Univ. of Colorado Denver */ | |||||
| /* > \author NAG Ltd. */ | |||||
| /* > \date December 2016 */ | |||||
| /* > \ingroup complexOTHERauxiliary */ | |||||
| /* ===================================================================== */ | |||||
| /* Subroutine */ int claic1_(integer *job, integer *j, complex *x, real *sest, | |||||
| complex *w, complex *gamma, real *sestpr, complex *s, complex *c__) | |||||
| { | |||||
| /* System generated locals */ | |||||
| real r__1, r__2; | |||||
| complex q__1, q__2, q__3, q__4, q__5, q__6; | |||||
| /* Local variables */ | |||||
| complex sine; | |||||
| real test, zeta1, zeta2, b, t; | |||||
| complex alpha; | |||||
| extern /* Complex */ VOID cdotc_(complex *, integer *, complex *, integer | |||||
| *, complex *, integer *); | |||||
| real norma, s1, s2, absgam, absalp; | |||||
| extern real slamch_(char *); | |||||
| complex cosine; | |||||
| real absest, scl, eps, tmp; | |||||
| /* -- LAPACK auxiliary routine (version 3.7.0) -- */ | |||||
| /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ | |||||
| /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ | |||||
| /* December 2016 */ | |||||
| /* ===================================================================== */ | |||||
| /* Parameter adjustments */ | |||||
| --w; | |||||
| --x; | |||||
| /* Function Body */ | |||||
| eps = slamch_("Epsilon"); | |||||
| cdotc_(&q__1, j, &x[1], &c__1, &w[1], &c__1); | |||||
| alpha.r = q__1.r, alpha.i = q__1.i; | |||||
| absalp = c_abs(&alpha); | |||||
| absgam = c_abs(gamma); | |||||
| absest = abs(*sest); | |||||
| if (*job == 1) { | |||||
| /* Estimating largest singular value */ | |||||
| /* special cases */ | |||||
| if (*sest == 0.f) { | |||||
| s1 = f2cmax(absgam,absalp); | |||||
| if (s1 == 0.f) { | |||||
| s->r = 0.f, s->i = 0.f; | |||||
| c__->r = 1.f, c__->i = 0.f; | |||||
| *sestpr = 0.f; | |||||
| } else { | |||||
| q__1.r = alpha.r / s1, q__1.i = alpha.i / s1; | |||||
| s->r = q__1.r, s->i = q__1.i; | |||||
| q__1.r = gamma->r / s1, q__1.i = gamma->i / s1; | |||||
| c__->r = q__1.r, c__->i = q__1.i; | |||||
| r_cnjg(&q__4, s); | |||||
| q__3.r = s->r * q__4.r - s->i * q__4.i, q__3.i = s->r * | |||||
| q__4.i + s->i * q__4.r; | |||||
| r_cnjg(&q__6, c__); | |||||
| q__5.r = c__->r * q__6.r - c__->i * q__6.i, q__5.i = c__->r * | |||||
| q__6.i + c__->i * q__6.r; | |||||
| q__2.r = q__3.r + q__5.r, q__2.i = q__3.i + q__5.i; | |||||
| c_sqrt(&q__1, &q__2); | |||||
| tmp = q__1.r; | |||||
| q__1.r = s->r / tmp, q__1.i = s->i / tmp; | |||||
| s->r = q__1.r, s->i = q__1.i; | |||||
| q__1.r = c__->r / tmp, q__1.i = c__->i / tmp; | |||||
| c__->r = q__1.r, c__->i = q__1.i; | |||||
| *sestpr = s1 * tmp; | |||||
| } | |||||
| return 0; | |||||
| } else if (absgam <= eps * absest) { | |||||
| s->r = 1.f, s->i = 0.f; | |||||
| c__->r = 0.f, c__->i = 0.f; | |||||
| tmp = f2cmax(absest,absalp); | |||||
| s1 = absest / tmp; | |||||
| s2 = absalp / tmp; | |||||
| *sestpr = tmp * sqrt(s1 * s1 + s2 * s2); | |||||
| return 0; | |||||
| } else if (absalp <= eps * absest) { | |||||
| s1 = absgam; | |||||
| s2 = absest; | |||||
| if (s1 <= s2) { | |||||
| s->r = 1.f, s->i = 0.f; | |||||
| c__->r = 0.f, c__->i = 0.f; | |||||
| *sestpr = s2; | |||||
| } else { | |||||
| s->r = 0.f, s->i = 0.f; | |||||
| c__->r = 1.f, c__->i = 0.f; | |||||
| *sestpr = s1; | |||||
| } | |||||
| return 0; | |||||
| } else if (absest <= eps * absalp || absest <= eps * absgam) { | |||||
| s1 = absgam; | |||||
| s2 = absalp; | |||||
| if (s1 <= s2) { | |||||
| tmp = s1 / s2; | |||||
| scl = sqrt(tmp * tmp + 1.f); | |||||
| *sestpr = s2 * scl; | |||||
| q__2.r = alpha.r / s2, q__2.i = alpha.i / s2; | |||||
| q__1.r = q__2.r / scl, q__1.i = q__2.i / scl; | |||||
| s->r = q__1.r, s->i = q__1.i; | |||||
| q__2.r = gamma->r / s2, q__2.i = gamma->i / s2; | |||||
| q__1.r = q__2.r / scl, q__1.i = q__2.i / scl; | |||||
| c__->r = q__1.r, c__->i = q__1.i; | |||||
| } else { | |||||
| tmp = s2 / s1; | |||||
| scl = sqrt(tmp * tmp + 1.f); | |||||
| *sestpr = s1 * scl; | |||||
| q__2.r = alpha.r / s1, q__2.i = alpha.i / s1; | |||||
| q__1.r = q__2.r / scl, q__1.i = q__2.i / scl; | |||||
| s->r = q__1.r, s->i = q__1.i; | |||||
| q__2.r = gamma->r / s1, q__2.i = gamma->i / s1; | |||||
| q__1.r = q__2.r / scl, q__1.i = q__2.i / scl; | |||||
| c__->r = q__1.r, c__->i = q__1.i; | |||||
| } | |||||
| return 0; | |||||
| } else { | |||||
| /* normal case */ | |||||
| zeta1 = absalp / absest; | |||||
| zeta2 = absgam / absest; | |||||
| b = (1.f - zeta1 * zeta1 - zeta2 * zeta2) * .5f; | |||||
| r__1 = zeta1 * zeta1; | |||||
| c__->r = r__1, c__->i = 0.f; | |||||
| if (b > 0.f) { | |||||
| r__1 = b * b; | |||||
| q__4.r = r__1 + c__->r, q__4.i = c__->i; | |||||
| c_sqrt(&q__3, &q__4); | |||||
| q__2.r = b + q__3.r, q__2.i = q__3.i; | |||||
| c_div(&q__1, c__, &q__2); | |||||
| t = q__1.r; | |||||
| } else { | |||||
| r__1 = b * b; | |||||
| q__3.r = r__1 + c__->r, q__3.i = c__->i; | |||||
| c_sqrt(&q__2, &q__3); | |||||
| q__1.r = q__2.r - b, q__1.i = q__2.i; | |||||
| t = q__1.r; | |||||
| } | |||||
| q__3.r = alpha.r / absest, q__3.i = alpha.i / absest; | |||||
| q__2.r = -q__3.r, q__2.i = -q__3.i; | |||||
| q__1.r = q__2.r / t, q__1.i = q__2.i / t; | |||||
| sine.r = q__1.r, sine.i = q__1.i; | |||||
| q__3.r = gamma->r / absest, q__3.i = gamma->i / absest; | |||||
| q__2.r = -q__3.r, q__2.i = -q__3.i; | |||||
| r__1 = t + 1.f; | |||||
| q__1.r = q__2.r / r__1, q__1.i = q__2.i / r__1; | |||||
| cosine.r = q__1.r, cosine.i = q__1.i; | |||||
| r_cnjg(&q__4, &sine); | |||||
| q__3.r = sine.r * q__4.r - sine.i * q__4.i, q__3.i = sine.r * | |||||
| q__4.i + sine.i * q__4.r; | |||||
| r_cnjg(&q__6, &cosine); | |||||
| q__5.r = cosine.r * q__6.r - cosine.i * q__6.i, q__5.i = cosine.r | |||||
| * q__6.i + cosine.i * q__6.r; | |||||
| q__2.r = q__3.r + q__5.r, q__2.i = q__3.i + q__5.i; | |||||
| c_sqrt(&q__1, &q__2); | |||||
| tmp = q__1.r; | |||||
| q__1.r = sine.r / tmp, q__1.i = sine.i / tmp; | |||||
| s->r = q__1.r, s->i = q__1.i; | |||||
| q__1.r = cosine.r / tmp, q__1.i = cosine.i / tmp; | |||||
| c__->r = q__1.r, c__->i = q__1.i; | |||||
| *sestpr = sqrt(t + 1.f) * absest; | |||||
| return 0; | |||||
| } | |||||
| } else if (*job == 2) { | |||||
| /* Estimating smallest singular value */ | |||||
| /* special cases */ | |||||
| if (*sest == 0.f) { | |||||
| *sestpr = 0.f; | |||||
| if (f2cmax(absgam,absalp) == 0.f) { | |||||
| sine.r = 1.f, sine.i = 0.f; | |||||
| cosine.r = 0.f, cosine.i = 0.f; | |||||
| } else { | |||||
| r_cnjg(&q__2, gamma); | |||||
| q__1.r = -q__2.r, q__1.i = -q__2.i; | |||||
| sine.r = q__1.r, sine.i = q__1.i; | |||||
| r_cnjg(&q__1, &alpha); | |||||
| cosine.r = q__1.r, cosine.i = q__1.i; | |||||
| } | |||||
| /* Computing MAX */ | |||||
| r__1 = c_abs(&sine), r__2 = c_abs(&cosine); | |||||
| s1 = f2cmax(r__1,r__2); | |||||
| q__1.r = sine.r / s1, q__1.i = sine.i / s1; | |||||
| s->r = q__1.r, s->i = q__1.i; | |||||
| q__1.r = cosine.r / s1, q__1.i = cosine.i / s1; | |||||
| c__->r = q__1.r, c__->i = q__1.i; | |||||
| r_cnjg(&q__4, s); | |||||
| q__3.r = s->r * q__4.r - s->i * q__4.i, q__3.i = s->r * q__4.i + | |||||
| s->i * q__4.r; | |||||
| r_cnjg(&q__6, c__); | |||||
| q__5.r = c__->r * q__6.r - c__->i * q__6.i, q__5.i = c__->r * | |||||
| q__6.i + c__->i * q__6.r; | |||||
| q__2.r = q__3.r + q__5.r, q__2.i = q__3.i + q__5.i; | |||||
| c_sqrt(&q__1, &q__2); | |||||
| tmp = q__1.r; | |||||
| q__1.r = s->r / tmp, q__1.i = s->i / tmp; | |||||
| s->r = q__1.r, s->i = q__1.i; | |||||
| q__1.r = c__->r / tmp, q__1.i = c__->i / tmp; | |||||
| c__->r = q__1.r, c__->i = q__1.i; | |||||
| return 0; | |||||
| } else if (absgam <= eps * absest) { | |||||
| s->r = 0.f, s->i = 0.f; | |||||
| c__->r = 1.f, c__->i = 0.f; | |||||
| *sestpr = absgam; | |||||
| return 0; | |||||
| } else if (absalp <= eps * absest) { | |||||
| s1 = absgam; | |||||
| s2 = absest; | |||||
| if (s1 <= s2) { | |||||
| s->r = 0.f, s->i = 0.f; | |||||
| c__->r = 1.f, c__->i = 0.f; | |||||
| *sestpr = s1; | |||||
| } else { | |||||
| s->r = 1.f, s->i = 0.f; | |||||
| c__->r = 0.f, c__->i = 0.f; | |||||
| *sestpr = s2; | |||||
| } | |||||
| return 0; | |||||
| } else if (absest <= eps * absalp || absest <= eps * absgam) { | |||||
| s1 = absgam; | |||||
| s2 = absalp; | |||||
| if (s1 <= s2) { | |||||
| tmp = s1 / s2; | |||||
| scl = sqrt(tmp * tmp + 1.f); | |||||
| *sestpr = absest * (tmp / scl); | |||||
| r_cnjg(&q__4, gamma); | |||||
| q__3.r = q__4.r / s2, q__3.i = q__4.i / s2; | |||||
| q__2.r = -q__3.r, q__2.i = -q__3.i; | |||||
| q__1.r = q__2.r / scl, q__1.i = q__2.i / scl; | |||||
| s->r = q__1.r, s->i = q__1.i; | |||||
| r_cnjg(&q__3, &alpha); | |||||
| q__2.r = q__3.r / s2, q__2.i = q__3.i / s2; | |||||
| q__1.r = q__2.r / scl, q__1.i = q__2.i / scl; | |||||
| c__->r = q__1.r, c__->i = q__1.i; | |||||
| } else { | |||||
| tmp = s2 / s1; | |||||
| scl = sqrt(tmp * tmp + 1.f); | |||||
| *sestpr = absest / scl; | |||||
| r_cnjg(&q__4, gamma); | |||||
| q__3.r = q__4.r / s1, q__3.i = q__4.i / s1; | |||||
| q__2.r = -q__3.r, q__2.i = -q__3.i; | |||||
| q__1.r = q__2.r / scl, q__1.i = q__2.i / scl; | |||||
| s->r = q__1.r, s->i = q__1.i; | |||||
| r_cnjg(&q__3, &alpha); | |||||
| q__2.r = q__3.r / s1, q__2.i = q__3.i / s1; | |||||
| q__1.r = q__2.r / scl, q__1.i = q__2.i / scl; | |||||
| c__->r = q__1.r, c__->i = q__1.i; | |||||
| } | |||||
| return 0; | |||||
| } else { | |||||
| /* normal case */ | |||||
| zeta1 = absalp / absest; | |||||
| zeta2 = absgam / absest; | |||||
| /* Computing MAX */ | |||||
| r__1 = zeta1 * zeta1 + 1.f + zeta1 * zeta2, r__2 = zeta1 * zeta2 | |||||
| + zeta2 * zeta2; | |||||
| norma = f2cmax(r__1,r__2); | |||||
| /* See if root is closer to zero or to ONE */ | |||||
| test = (zeta1 - zeta2) * 2.f * (zeta1 + zeta2) + 1.f; | |||||
| if (test >= 0.f) { | |||||
| /* root is close to zero, compute directly */ | |||||
| b = (zeta1 * zeta1 + zeta2 * zeta2 + 1.f) * .5f; | |||||
| r__1 = zeta2 * zeta2; | |||||
| c__->r = r__1, c__->i = 0.f; | |||||
| r__2 = b * b; | |||||
| q__2.r = r__2 - c__->r, q__2.i = -c__->i; | |||||
| r__1 = b + sqrt(c_abs(&q__2)); | |||||
| q__1.r = c__->r / r__1, q__1.i = c__->i / r__1; | |||||
| t = q__1.r; | |||||
| q__2.r = alpha.r / absest, q__2.i = alpha.i / absest; | |||||
| r__1 = 1.f - t; | |||||
| q__1.r = q__2.r / r__1, q__1.i = q__2.i / r__1; | |||||
| sine.r = q__1.r, sine.i = q__1.i; | |||||
| q__3.r = gamma->r / absest, q__3.i = gamma->i / absest; | |||||
| q__2.r = -q__3.r, q__2.i = -q__3.i; | |||||
| q__1.r = q__2.r / t, q__1.i = q__2.i / t; | |||||
| cosine.r = q__1.r, cosine.i = q__1.i; | |||||
| *sestpr = sqrt(t + eps * 4.f * eps * norma) * absest; | |||||
| } else { | |||||
| /* root is closer to ONE, shift by that amount */ | |||||
| b = (zeta2 * zeta2 + zeta1 * zeta1 - 1.f) * .5f; | |||||
| r__1 = zeta1 * zeta1; | |||||
| c__->r = r__1, c__->i = 0.f; | |||||
| if (b >= 0.f) { | |||||
| q__2.r = -c__->r, q__2.i = -c__->i; | |||||
| r__1 = b * b; | |||||
| q__5.r = r__1 + c__->r, q__5.i = c__->i; | |||||
| c_sqrt(&q__4, &q__5); | |||||
| q__3.r = b + q__4.r, q__3.i = q__4.i; | |||||
| c_div(&q__1, &q__2, &q__3); | |||||
| t = q__1.r; | |||||
| } else { | |||||
| r__1 = b * b; | |||||
| q__3.r = r__1 + c__->r, q__3.i = c__->i; | |||||
| c_sqrt(&q__2, &q__3); | |||||
| q__1.r = b - q__2.r, q__1.i = -q__2.i; | |||||
| t = q__1.r; | |||||
| } | |||||
| q__3.r = alpha.r / absest, q__3.i = alpha.i / absest; | |||||
| q__2.r = -q__3.r, q__2.i = -q__3.i; | |||||
| q__1.r = q__2.r / t, q__1.i = q__2.i / t; | |||||
| sine.r = q__1.r, sine.i = q__1.i; | |||||
| q__3.r = gamma->r / absest, q__3.i = gamma->i / absest; | |||||
| q__2.r = -q__3.r, q__2.i = -q__3.i; | |||||
| r__1 = t + 1.f; | |||||
| q__1.r = q__2.r / r__1, q__1.i = q__2.i / r__1; | |||||
| cosine.r = q__1.r, cosine.i = q__1.i; | |||||
| *sestpr = sqrt(t + 1.f + eps * 4.f * eps * norma) * absest; | |||||
| } | |||||
| r_cnjg(&q__4, &sine); | |||||
| q__3.r = sine.r * q__4.r - sine.i * q__4.i, q__3.i = sine.r * | |||||
| q__4.i + sine.i * q__4.r; | |||||
| r_cnjg(&q__6, &cosine); | |||||
| q__5.r = cosine.r * q__6.r - cosine.i * q__6.i, q__5.i = cosine.r | |||||
| * q__6.i + cosine.i * q__6.r; | |||||
| q__2.r = q__3.r + q__5.r, q__2.i = q__3.i + q__5.i; | |||||
| c_sqrt(&q__1, &q__2); | |||||
| tmp = q__1.r; | |||||
| q__1.r = sine.r / tmp, q__1.i = sine.i / tmp; | |||||
| s->r = q__1.r, s->i = q__1.i; | |||||
| q__1.r = cosine.r / tmp, q__1.i = cosine.i / tmp; | |||||
| c__->r = q__1.r, c__->i = q__1.i; | |||||
| return 0; | |||||
| } | |||||
| } | |||||
| return 0; | |||||
| /* End of CLAIC1 */ | |||||
| } /* claic1_ */ | |||||
| @@ -0,0 +1,844 @@ | |||||
| /* f2c.h -- Standard Fortran to C header file */ | |||||
| /** barf [ba:rf] 2. "He suggested using FORTRAN, and everybody barfed." | |||||
| - From The Shogakukan DICTIONARY OF NEW ENGLISH (Second edition) */ | |||||
| #ifndef F2C_INCLUDE | |||||
| #define F2C_INCLUDE | |||||
| #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 | |||||
| typedef int 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; | |||||
| 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;} | |||||
| #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)); } | |||||
| #define c_div(c, a, b) {pCf(c) = Cf(a)/Cf(b);} | |||||
| #define z_div(c, a, b) {pCd(c) = Cd(a)/Cd(b);} | |||||
| #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) = conj(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) (cimag(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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotc_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void cdotu_(complex *z, integer *n_, complex *x, integer *incx_, complex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotu_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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) | |||||
| */ | |||||
| /* Table of constant values */ | |||||
| static integer c__0 = 0; | |||||
| /* > \brief \b CLAMSWLQ */ | |||||
| /* Definition: */ | |||||
| /* =========== */ | |||||
| /* SUBROUTINE CLAMSWLQ( SIDE, TRANS, M, N, K, MB, NB, A, LDA, T, */ | |||||
| /* $ LDT, C, LDC, WORK, LWORK, INFO ) */ | |||||
| /* CHARACTER SIDE, TRANS */ | |||||
| /* INTEGER INFO, LDA, M, N, K, MB, NB, LDT, LWORK, LDC */ | |||||
| /* COMPLEX A( LDA, * ), WORK( * ), C(LDC, * ), */ | |||||
| /* $ T( LDT, * ) */ | |||||
| /* > \par Purpose: */ | |||||
| /* ============= */ | |||||
| /* > */ | |||||
| /* > \verbatim */ | |||||
| /* > */ | |||||
| /* > CLAMQRTS overwrites the general real M-by-N matrix C with */ | |||||
| /* > */ | |||||
| /* > */ | |||||
| /* > SIDE = 'L' SIDE = 'R' */ | |||||
| /* > TRANS = 'N': Q * C C * Q */ | |||||
| /* > TRANS = 'T': Q**H * C C * Q**H */ | |||||
| /* > where Q is a real orthogonal matrix defined as the product of blocked */ | |||||
| /* > elementary reflectors computed by short wide LQ */ | |||||
| /* > factorization (CLASWLQ) */ | |||||
| /* > \endverbatim */ | |||||
| /* Arguments: */ | |||||
| /* ========== */ | |||||
| /* > \param[in] SIDE */ | |||||
| /* > \verbatim */ | |||||
| /* > SIDE is CHARACTER*1 */ | |||||
| /* > = 'L': apply Q or Q**H from the Left; */ | |||||
| /* > = 'R': apply Q or Q**H from the Right. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] TRANS */ | |||||
| /* > \verbatim */ | |||||
| /* > TRANS is CHARACTER*1 */ | |||||
| /* > = 'N': No transpose, apply Q; */ | |||||
| /* > = 'C': Transpose, apply Q**H. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] M */ | |||||
| /* > \verbatim */ | |||||
| /* > M is INTEGER */ | |||||
| /* > The number of rows of the matrix C. M >=0. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] N */ | |||||
| /* > \verbatim */ | |||||
| /* > N is INTEGER */ | |||||
| /* > The number of columns of the matrix C. N >= M. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] K */ | |||||
| /* > \verbatim */ | |||||
| /* > K is INTEGER */ | |||||
| /* > The number of elementary reflectors whose product defines */ | |||||
| /* > the matrix Q. */ | |||||
| /* > M >= K >= 0; */ | |||||
| /* > */ | |||||
| /* > \endverbatim */ | |||||
| /* > \param[in] MB */ | |||||
| /* > \verbatim */ | |||||
| /* > MB is INTEGER */ | |||||
| /* > The row block size to be used in the blocked QR. */ | |||||
| /* > M >= MB >= 1 */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] NB */ | |||||
| /* > \verbatim */ | |||||
| /* > NB is INTEGER */ | |||||
| /* > The column block size to be used in the blocked QR. */ | |||||
| /* > NB > M. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] NB */ | |||||
| /* > \verbatim */ | |||||
| /* > NB is INTEGER */ | |||||
| /* > The block size to be used in the blocked QR. */ | |||||
| /* > MB > M. */ | |||||
| /* > */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] A */ | |||||
| /* > \verbatim */ | |||||
| /* > A is COMPLEX array, dimension */ | |||||
| /* > (LDA,M) if SIDE = 'L', */ | |||||
| /* > (LDA,N) if SIDE = 'R' */ | |||||
| /* > The i-th row must contain the vector which defines the blocked */ | |||||
| /* > elementary reflector H(i), for i = 1,2,...,k, as returned by */ | |||||
| /* > CLASWLQ in the first k rows of its array argument A. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] LDA */ | |||||
| /* > \verbatim */ | |||||
| /* > LDA is INTEGER */ | |||||
| /* > The leading dimension of the array A. */ | |||||
| /* > If SIDE = 'L', LDA >= f2cmax(1,M); */ | |||||
| /* > if SIDE = 'R', LDA >= f2cmax(1,N). */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] T */ | |||||
| /* > \verbatim */ | |||||
| /* > T is COMPLEX array, dimension */ | |||||
| /* > ( M * Number of blocks(CEIL(N-K/NB-K)), */ | |||||
| /* > The blocked upper triangular block reflectors stored in compact form */ | |||||
| /* > as a sequence of upper triangular blocks. See below */ | |||||
| /* > for further details. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] LDT */ | |||||
| /* > \verbatim */ | |||||
| /* > LDT is INTEGER */ | |||||
| /* > The leading dimension of the array T. LDT >= MB. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in,out] C */ | |||||
| /* > \verbatim */ | |||||
| /* > C is COMPLEX array, dimension (LDC,N) */ | |||||
| /* > On entry, the M-by-N matrix C. */ | |||||
| /* > On exit, C is overwritten by Q*C or Q**H*C or C*Q**H or C*Q. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] LDC */ | |||||
| /* > \verbatim */ | |||||
| /* > LDC is INTEGER */ | |||||
| /* > The leading dimension of the array C. LDC >= f2cmax(1,M). */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] WORK */ | |||||
| /* > \verbatim */ | |||||
| /* > (workspace) COMPLEX array, dimension (MAX(1,LWORK)) */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] LWORK */ | |||||
| /* > \verbatim */ | |||||
| /* > LWORK is INTEGER */ | |||||
| /* > The dimension of the array WORK. */ | |||||
| /* > If SIDE = 'L', LWORK >= f2cmax(1,NB) * MB; */ | |||||
| /* > if SIDE = 'R', LWORK >= f2cmax(1,M) * MB. */ | |||||
| /* > If LWORK = -1, then a workspace query is assumed; the routine */ | |||||
| /* > only calculates the optimal size of the WORK array, returns */ | |||||
| /* > this value as the first entry of the WORK array, and no error */ | |||||
| /* > message related to LWORK is issued by XERBLA. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] INFO */ | |||||
| /* > \verbatim */ | |||||
| /* > INFO is INTEGER */ | |||||
| /* > = 0: successful exit */ | |||||
| /* > < 0: if INFO = -i, the i-th argument had an illegal value */ | |||||
| /* > \endverbatim */ | |||||
| /* Authors: */ | |||||
| /* ======== */ | |||||
| /* > \author Univ. of Tennessee */ | |||||
| /* > \author Univ. of California Berkeley */ | |||||
| /* > \author Univ. of Colorado Denver */ | |||||
| /* > \author NAG Ltd. */ | |||||
| /* > \par Further Details: */ | |||||
| /* ===================== */ | |||||
| /* > */ | |||||
| /* > \verbatim */ | |||||
| /* > Short-Wide LQ (SWLQ) performs LQ by a sequence of orthogonal transformations, */ | |||||
| /* > representing Q as a product of other orthogonal matrices */ | |||||
| /* > Q = Q(1) * Q(2) * . . . * Q(k) */ | |||||
| /* > where each Q(i) zeros out upper diagonal entries of a block of NB rows of A: */ | |||||
| /* > Q(1) zeros out the upper diagonal entries of rows 1:NB of A */ | |||||
| /* > Q(2) zeros out the bottom MB-N rows of rows [1:M,NB+1:2*NB-M] of A */ | |||||
| /* > Q(3) zeros out the bottom MB-N rows of rows [1:M,2*NB-M+1:3*NB-2*M] of A */ | |||||
| /* > . . . */ | |||||
| /* > */ | |||||
| /* > Q(1) is computed by GELQT, which represents Q(1) by Householder vectors */ | |||||
| /* > stored under the diagonal of rows 1:MB of A, and by upper triangular */ | |||||
| /* > block reflectors, stored in array T(1:LDT,1:N). */ | |||||
| /* > For more information see Further Details in GELQT. */ | |||||
| /* > */ | |||||
| /* > Q(i) for i>1 is computed by TPLQT, which represents Q(i) by Householder vectors */ | |||||
| /* > stored in columns [(i-1)*(NB-M)+M+1:i*(NB-M)+M] of A, and by upper triangular */ | |||||
| /* > block reflectors, stored in array T(1:LDT,(i-1)*M+1:i*M). */ | |||||
| /* > The last Q(k) may use fewer rows. */ | |||||
| /* > For more information see Further Details in TPQRT. */ | |||||
| /* > */ | |||||
| /* > For more details of the overall algorithm, see the description of */ | |||||
| /* > Sequential TSQR in Section 2.2 of [1]. */ | |||||
| /* > */ | |||||
| /* > [1] “Communication-Optimal Parallel and Sequential QR and LU Factorizations, */ | |||||
| /* > J. Demmel, L. Grigori, M. Hoemmen, J. Langou, */ | |||||
| /* > SIAM J. Sci. Comput, vol. 34, no. 1, 2012 */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* ===================================================================== */ | |||||
| /* Subroutine */ int clamswlq_(char *side, char *trans, integer *m, integer * | |||||
| n, integer *k, integer *mb, integer *nb, complex *a, integer *lda, | |||||
| complex *t, integer *ldt, complex *c__, integer *ldc, complex *work, | |||||
| integer *lwork, integer *info) | |||||
| { | |||||
| /* System generated locals */ | |||||
| integer a_dim1, a_offset, c_dim1, c_offset, t_dim1, t_offset, i__1, i__2, | |||||
| i__3; | |||||
| /* Local variables */ | |||||
| logical left, tran; | |||||
| integer i__; | |||||
| extern logical lsame_(char *, char *); | |||||
| logical right; | |||||
| integer ii, kk, lw; | |||||
| extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); | |||||
| logical notran, lquery; | |||||
| integer ctr; | |||||
| extern /* Subroutine */ int cgemlqt_(char *, char *, integer *, integer *, | |||||
| integer *, integer *, complex *, integer *, complex *, integer *, | |||||
| complex *, integer *, complex *, integer *), | |||||
| ctpmlqt_(char *, char *, integer *, integer *, integer *, integer | |||||
| *, integer *, complex *, integer *, complex *, integer *, complex | |||||
| *, integer *, complex *, integer *, complex *, integer *); | |||||
| /* -- LAPACK computational routine (version 3.7.1) -- */ | |||||
| /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ | |||||
| /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ | |||||
| /* June 2017 */ | |||||
| /* ===================================================================== */ | |||||
| /* Test the input arguments */ | |||||
| /* Parameter adjustments */ | |||||
| a_dim1 = *lda; | |||||
| a_offset = 1 + a_dim1 * 1; | |||||
| a -= a_offset; | |||||
| t_dim1 = *ldt; | |||||
| t_offset = 1 + t_dim1 * 1; | |||||
| t -= t_offset; | |||||
| c_dim1 = *ldc; | |||||
| c_offset = 1 + c_dim1 * 1; | |||||
| c__ -= c_offset; | |||||
| --work; | |||||
| /* Function Body */ | |||||
| lquery = *lwork < 0; | |||||
| notran = lsame_(trans, "N"); | |||||
| tran = lsame_(trans, "C"); | |||||
| left = lsame_(side, "L"); | |||||
| right = lsame_(side, "R"); | |||||
| if (left) { | |||||
| lw = *n * *mb; | |||||
| } else { | |||||
| lw = *m * *mb; | |||||
| } | |||||
| *info = 0; | |||||
| if (! left && ! right) { | |||||
| *info = -1; | |||||
| } else if (! tran && ! notran) { | |||||
| *info = -2; | |||||
| } else if (*m < 0) { | |||||
| *info = -3; | |||||
| } else if (*n < 0) { | |||||
| *info = -4; | |||||
| } else if (*k < 0) { | |||||
| *info = -5; | |||||
| } else if (*lda < f2cmax(1,*k)) { | |||||
| *info = -9; | |||||
| } else if (*ldt < f2cmax(1,*mb)) { | |||||
| *info = -11; | |||||
| } else if (*ldc < f2cmax(1,*m)) { | |||||
| *info = -13; | |||||
| } else if (*lwork < f2cmax(1,lw) && ! lquery) { | |||||
| *info = -15; | |||||
| } | |||||
| if (*info != 0) { | |||||
| i__1 = -(*info); | |||||
| xerbla_("CLAMSWLQ", &i__1, (ftnlen)8); | |||||
| work[1].r = (real) lw, work[1].i = 0.f; | |||||
| return 0; | |||||
| } else if (lquery) { | |||||
| work[1].r = (real) lw, work[1].i = 0.f; | |||||
| return 0; | |||||
| } | |||||
| /* Quick return if possible */ | |||||
| /* Computing MIN */ | |||||
| i__1 = f2cmin(*m,*n); | |||||
| if (f2cmin(i__1,*k) == 0) { | |||||
| return 0; | |||||
| } | |||||
| /* Computing MAX */ | |||||
| i__1 = f2cmax(*m,*n); | |||||
| if (*nb <= *k || *nb >= f2cmax(i__1,*k)) { | |||||
| cgemlqt_(side, trans, m, n, k, mb, &a[a_offset], lda, &t[t_offset], | |||||
| ldt, &c__[c_offset], ldc, &work[1], info); | |||||
| return 0; | |||||
| } | |||||
| if (left && tran) { | |||||
| /* Multiply Q to the last block of C */ | |||||
| kk = (*m - *k) % (*nb - *k); | |||||
| ctr = (*m - *k) / (*nb - *k); | |||||
| if (kk > 0) { | |||||
| ii = *m - kk + 1; | |||||
| ctpmlqt_("L", "C", &kk, n, k, &c__0, mb, &a[ii * a_dim1 + 1], lda, | |||||
| &t[(ctr * *k + 1) * t_dim1 + 1], ldt, &c__[c_dim1 + 1], | |||||
| ldc, &c__[ii + c_dim1], ldc, &work[1], info); | |||||
| } else { | |||||
| ii = *m + 1; | |||||
| } | |||||
| i__1 = *nb + 1; | |||||
| i__2 = -(*nb - *k); | |||||
| for (i__ = ii - (*nb - *k); i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ | |||||
| += i__2) { | |||||
| /* Multiply Q to the current block of C (1:M,I:I+NB) */ | |||||
| --ctr; | |||||
| i__3 = *nb - *k; | |||||
| ctpmlqt_("L", "C", &i__3, n, k, &c__0, mb, &a[i__ * a_dim1 + 1], | |||||
| lda, &t[(ctr * *k + 1) * t_dim1 + 1], ldt, &c__[c_dim1 + | |||||
| 1], ldc, &c__[i__ + c_dim1], ldc, &work[1], info); | |||||
| } | |||||
| /* Multiply Q to the first block of C (1:M,1:NB) */ | |||||
| cgemlqt_("L", "C", nb, n, k, mb, &a[a_dim1 + 1], lda, &t[t_offset], | |||||
| ldt, &c__[c_dim1 + 1], ldc, &work[1], info); | |||||
| } else if (left && notran) { | |||||
| /* Multiply Q to the first block of C */ | |||||
| kk = (*m - *k) % (*nb - *k); | |||||
| ii = *m - kk + 1; | |||||
| ctr = 1; | |||||
| cgemlqt_("L", "N", nb, n, k, mb, &a[a_dim1 + 1], lda, &t[t_offset], | |||||
| ldt, &c__[c_dim1 + 1], ldc, &work[1], info); | |||||
| i__2 = ii - *nb + *k; | |||||
| i__1 = *nb - *k; | |||||
| for (i__ = *nb + 1; i__1 < 0 ? i__ >= i__2 : i__ <= i__2; i__ += i__1) | |||||
| { | |||||
| /* Multiply Q to the current block of C (I:I+NB,1:N) */ | |||||
| i__3 = *nb - *k; | |||||
| ctpmlqt_("L", "N", &i__3, n, k, &c__0, mb, &a[i__ * a_dim1 + 1], | |||||
| lda, &t[(ctr * *k + 1) * t_dim1 + 1], ldt, &c__[c_dim1 + | |||||
| 1], ldc, &c__[i__ + c_dim1], ldc, &work[1], info); | |||||
| ++ctr; | |||||
| } | |||||
| if (ii <= *m) { | |||||
| /* Multiply Q to the last block of C */ | |||||
| ctpmlqt_("L", "N", &kk, n, k, &c__0, mb, &a[ii * a_dim1 + 1], lda, | |||||
| &t[(ctr * *k + 1) * t_dim1 + 1], ldt, &c__[c_dim1 + 1], | |||||
| ldc, &c__[ii + c_dim1], ldc, &work[1], info); | |||||
| } | |||||
| } else if (right && notran) { | |||||
| /* Multiply Q to the last block of C */ | |||||
| kk = (*n - *k) % (*nb - *k); | |||||
| ctr = (*n - *k) / (*nb - *k); | |||||
| if (kk > 0) { | |||||
| ii = *n - kk + 1; | |||||
| ctpmlqt_("R", "N", m, &kk, k, &c__0, mb, &a[ii * a_dim1 + 1], lda, | |||||
| &t[(ctr * *k + 1) * t_dim1 + 1], ldt, &c__[c_dim1 + 1], | |||||
| ldc, &c__[ii * c_dim1 + 1], ldc, &work[1], info); | |||||
| } else { | |||||
| ii = *n + 1; | |||||
| } | |||||
| i__1 = *nb + 1; | |||||
| i__2 = -(*nb - *k); | |||||
| for (i__ = ii - (*nb - *k); i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ | |||||
| += i__2) { | |||||
| /* Multiply Q to the current block of C (1:M,I:I+MB) */ | |||||
| --ctr; | |||||
| i__3 = *nb - *k; | |||||
| ctpmlqt_("R", "N", m, &i__3, k, &c__0, mb, &a[i__ * a_dim1 + 1], | |||||
| lda, &t[(ctr * *k + 1) * t_dim1 + 1], ldt, &c__[c_dim1 + | |||||
| 1], ldc, &c__[i__ * c_dim1 + 1], ldc, &work[1], info); | |||||
| } | |||||
| /* Multiply Q to the first block of C (1:M,1:MB) */ | |||||
| cgemlqt_("R", "N", m, nb, k, mb, &a[a_dim1 + 1], lda, &t[t_offset], | |||||
| ldt, &c__[c_dim1 + 1], ldc, &work[1], info); | |||||
| } else if (right && tran) { | |||||
| /* Multiply Q to the first block of C */ | |||||
| kk = (*n - *k) % (*nb - *k); | |||||
| ii = *n - kk + 1; | |||||
| ctr = 1; | |||||
| cgemlqt_("R", "C", m, nb, k, mb, &a[a_dim1 + 1], lda, &t[t_offset], | |||||
| ldt, &c__[c_dim1 + 1], ldc, &work[1], info); | |||||
| i__2 = ii - *nb + *k; | |||||
| i__1 = *nb - *k; | |||||
| for (i__ = *nb + 1; i__1 < 0 ? i__ >= i__2 : i__ <= i__2; i__ += i__1) | |||||
| { | |||||
| /* Multiply Q to the current block of C (1:M,I:I+MB) */ | |||||
| i__3 = *nb - *k; | |||||
| ctpmlqt_("R", "C", m, &i__3, k, &c__0, mb, &a[i__ * a_dim1 + 1], | |||||
| lda, &t[(ctr * *k + 1) * t_dim1 + 1], ldt, &c__[c_dim1 + | |||||
| 1], ldc, &c__[i__ * c_dim1 + 1], ldc, &work[1], info); | |||||
| ++ctr; | |||||
| } | |||||
| if (ii <= *n) { | |||||
| /* Multiply Q to the last block of C */ | |||||
| ctpmlqt_("R", "C", m, &kk, k, &c__0, mb, &a[ii * a_dim1 + 1], lda, | |||||
| &t[(ctr * *k + 1) * t_dim1 + 1], ldt, &c__[c_dim1 + 1], | |||||
| ldc, &c__[ii * c_dim1 + 1], ldc, &work[1], info); | |||||
| } | |||||
| } | |||||
| work[1].r = (real) lw, work[1].i = 0.f; | |||||
| return 0; | |||||
| /* End of CLAMSWLQ */ | |||||
| } /* clamswlq_ */ | |||||
| @@ -0,0 +1,841 @@ | |||||
| /* f2c.h -- Standard Fortran to C header file */ | |||||
| /** barf [ba:rf] 2. "He suggested using FORTRAN, and everybody barfed." | |||||
| - From The Shogakukan DICTIONARY OF NEW ENGLISH (Second edition) */ | |||||
| #ifndef F2C_INCLUDE | |||||
| #define F2C_INCLUDE | |||||
| #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 | |||||
| typedef int 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; | |||||
| 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;} | |||||
| #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)); } | |||||
| #define c_div(c, a, b) {pCf(c) = Cf(a)/Cf(b);} | |||||
| #define z_div(c, a, b) {pCd(c) = Cd(a)/Cd(b);} | |||||
| #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) = conj(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) (cimag(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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotc_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void cdotu_(complex *z, integer *n_, complex *x, integer *incx_, complex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotu_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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) | |||||
| */ | |||||
| /* Table of constant values */ | |||||
| static integer c__0 = 0; | |||||
| /* > \brief \b CLAMTSQR */ | |||||
| /* Definition: */ | |||||
| /* =========== */ | |||||
| /* SUBROUTINE CLAMTSQR( SIDE, TRANS, M, N, K, MB, NB, A, LDA, T, */ | |||||
| /* $ LDT, C, LDC, WORK, LWORK, INFO ) */ | |||||
| /* CHARACTER SIDE, TRANS */ | |||||
| /* INTEGER INFO, LDA, M, N, K, MB, NB, LDT, LWORK, LDC */ | |||||
| /* COMPLEX A( LDA, * ), WORK( * ), C(LDC, * ), */ | |||||
| /* $ T( LDT, * ) */ | |||||
| /* > \par Purpose: */ | |||||
| /* ============= */ | |||||
| /* > */ | |||||
| /* > \verbatim */ | |||||
| /* > */ | |||||
| /* > CLAMTSQR overwrites the general complex M-by-N matrix C with */ | |||||
| /* > */ | |||||
| /* > */ | |||||
| /* > SIDE = 'L' SIDE = 'R' */ | |||||
| /* > TRANS = 'N': Q * C C * Q */ | |||||
| /* > TRANS = 'C': Q**H * C C * Q**H */ | |||||
| /* > where Q is a real orthogonal matrix defined as the product */ | |||||
| /* > of blocked elementary reflectors computed by tall skinny */ | |||||
| /* > QR factorization (CLATSQR) */ | |||||
| /* > \endverbatim */ | |||||
| /* Arguments: */ | |||||
| /* ========== */ | |||||
| /* > \param[in] SIDE */ | |||||
| /* > \verbatim */ | |||||
| /* > SIDE is CHARACTER*1 */ | |||||
| /* > = 'L': apply Q or Q**H from the Left; */ | |||||
| /* > = 'R': apply Q or Q**H from the Right. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] TRANS */ | |||||
| /* > \verbatim */ | |||||
| /* > TRANS is CHARACTER*1 */ | |||||
| /* > = 'N': No transpose, apply Q; */ | |||||
| /* > = 'C': Conjugate Transpose, apply Q**H. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] M */ | |||||
| /* > \verbatim */ | |||||
| /* > M is INTEGER */ | |||||
| /* > The number of rows of the matrix A. M >=0. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] N */ | |||||
| /* > \verbatim */ | |||||
| /* > N is INTEGER */ | |||||
| /* > The number of columns of the matrix C. M >= N >= 0. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] K */ | |||||
| /* > \verbatim */ | |||||
| /* > K is INTEGER */ | |||||
| /* > The number of elementary reflectors whose product defines */ | |||||
| /* > the matrix Q. */ | |||||
| /* > N >= K >= 0; */ | |||||
| /* > */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] MB */ | |||||
| /* > \verbatim */ | |||||
| /* > MB is INTEGER */ | |||||
| /* > The block size to be used in the blocked QR. */ | |||||
| /* > MB > N. (must be the same as DLATSQR) */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] NB */ | |||||
| /* > \verbatim */ | |||||
| /* > NB is INTEGER */ | |||||
| /* > The column block size to be used in the blocked QR. */ | |||||
| /* > N >= NB >= 1. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] A */ | |||||
| /* > \verbatim */ | |||||
| /* > A is COMPLEX array, dimension (LDA,K) */ | |||||
| /* > The i-th column must contain the vector which defines the */ | |||||
| /* > blockedelementary reflector H(i), for i = 1,2,...,k, as */ | |||||
| /* > returned by DLATSQR in the first k columns of */ | |||||
| /* > its array argument A. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] LDA */ | |||||
| /* > \verbatim */ | |||||
| /* > LDA is INTEGER */ | |||||
| /* > The leading dimension of the array A. */ | |||||
| /* > If SIDE = 'L', LDA >= f2cmax(1,M); */ | |||||
| /* > if SIDE = 'R', LDA >= f2cmax(1,N). */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] T */ | |||||
| /* > \verbatim */ | |||||
| /* > T is COMPLEX array, dimension */ | |||||
| /* > ( N * Number of blocks(CEIL(M-K/MB-K)), */ | |||||
| /* > The blocked upper triangular block reflectors stored in compact form */ | |||||
| /* > as a sequence of upper triangular blocks. See below */ | |||||
| /* > for further details. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] LDT */ | |||||
| /* > \verbatim */ | |||||
| /* > LDT is INTEGER */ | |||||
| /* > The leading dimension of the array T. LDT >= NB. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in,out] C */ | |||||
| /* > \verbatim */ | |||||
| /* > C is COMPLEX array, dimension (LDC,N) */ | |||||
| /* > On entry, the M-by-N matrix C. */ | |||||
| /* > On exit, C is overwritten by Q*C or Q**H*C or C*Q**H or C*Q. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] LDC */ | |||||
| /* > \verbatim */ | |||||
| /* > LDC is INTEGER */ | |||||
| /* > The leading dimension of the array C. LDC >= f2cmax(1,M). */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] WORK */ | |||||
| /* > \verbatim */ | |||||
| /* > (workspace) COMPLEX array, dimension (MAX(1,LWORK)) */ | |||||
| /* > */ | |||||
| /* > \endverbatim */ | |||||
| /* > \param[in] LWORK */ | |||||
| /* > \verbatim */ | |||||
| /* > LWORK is INTEGER */ | |||||
| /* > The dimension of the array WORK. */ | |||||
| /* > */ | |||||
| /* > If SIDE = 'L', LWORK >= f2cmax(1,N)*NB; */ | |||||
| /* > if SIDE = 'R', LWORK >= f2cmax(1,MB)*NB. */ | |||||
| /* > If LWORK = -1, then a workspace query is assumed; the routine */ | |||||
| /* > only calculates the optimal size of the WORK array, returns */ | |||||
| /* > this value as the first entry of the WORK array, and no error */ | |||||
| /* > message related to LWORK is issued by XERBLA. */ | |||||
| /* > */ | |||||
| /* > \endverbatim */ | |||||
| /* > \param[out] INFO */ | |||||
| /* > \verbatim */ | |||||
| /* > INFO is INTEGER */ | |||||
| /* > = 0: successful exit */ | |||||
| /* > < 0: if INFO = -i, the i-th argument had an illegal value */ | |||||
| /* > \endverbatim */ | |||||
| /* Authors: */ | |||||
| /* ======== */ | |||||
| /* > \author Univ. of Tennessee */ | |||||
| /* > \author Univ. of California Berkeley */ | |||||
| /* > \author Univ. of Colorado Denver */ | |||||
| /* > \author NAG Ltd. */ | |||||
| /* > \par Further Details: */ | |||||
| /* ===================== */ | |||||
| /* > */ | |||||
| /* > \verbatim */ | |||||
| /* > Tall-Skinny QR (TSQR) performs QR by a sequence of orthogonal transformations, */ | |||||
| /* > representing Q as a product of other orthogonal matrices */ | |||||
| /* > Q = Q(1) * Q(2) * . . . * Q(k) */ | |||||
| /* > where each Q(i) zeros out subdiagonal entries of a block of MB rows of A: */ | |||||
| /* > Q(1) zeros out the subdiagonal entries of rows 1:MB of A */ | |||||
| /* > Q(2) zeros out the bottom MB-N rows of rows [1:N,MB+1:2*MB-N] of A */ | |||||
| /* > Q(3) zeros out the bottom MB-N rows of rows [1:N,2*MB-N+1:3*MB-2*N] of A */ | |||||
| /* > . . . */ | |||||
| /* > */ | |||||
| /* > Q(1) is computed by GEQRT, which represents Q(1) by Householder vectors */ | |||||
| /* > stored under the diagonal of rows 1:MB of A, and by upper triangular */ | |||||
| /* > block reflectors, stored in array T(1:LDT,1:N). */ | |||||
| /* > For more information see Further Details in GEQRT. */ | |||||
| /* > */ | |||||
| /* > Q(i) for i>1 is computed by TPQRT, which represents Q(i) by Householder vectors */ | |||||
| /* > stored in rows [(i-1)*(MB-N)+N+1:i*(MB-N)+N] of A, and by upper triangular */ | |||||
| /* > block reflectors, stored in array T(1:LDT,(i-1)*N+1:i*N). */ | |||||
| /* > The last Q(k) may use fewer rows. */ | |||||
| /* > For more information see Further Details in TPQRT. */ | |||||
| /* > */ | |||||
| /* > For more details of the overall algorithm, see the description of */ | |||||
| /* > Sequential TSQR in Section 2.2 of [1]. */ | |||||
| /* > */ | |||||
| /* > [1] “Communication-Optimal Parallel and Sequential QR and LU Factorizations, */ | |||||
| /* > J. Demmel, L. Grigori, M. Hoemmen, J. Langou, */ | |||||
| /* > SIAM J. Sci. Comput, vol. 34, no. 1, 2012 */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* ===================================================================== */ | |||||
| /* Subroutine */ int clamtsqr_(char *side, char *trans, integer *m, integer * | |||||
| n, integer *k, integer *mb, integer *nb, complex *a, integer *lda, | |||||
| complex *t, integer *ldt, complex *c__, integer *ldc, complex *work, | |||||
| integer *lwork, integer *info) | |||||
| { | |||||
| /* System generated locals */ | |||||
| integer a_dim1, a_offset, c_dim1, c_offset, t_dim1, t_offset, i__1, i__2, | |||||
| i__3; | |||||
| /* Local variables */ | |||||
| logical left, tran; | |||||
| integer i__; | |||||
| extern logical lsame_(char *, char *); | |||||
| logical right; | |||||
| integer ii, kk, lw; | |||||
| extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); | |||||
| logical notran, lquery; | |||||
| integer ctr; | |||||
| extern /* Subroutine */ int cgemqrt_(char *, char *, integer *, integer *, | |||||
| integer *, integer *, complex *, integer *, complex *, integer *, | |||||
| complex *, integer *, complex *, integer *), | |||||
| ctpmqrt_(char *, char *, integer *, integer *, integer *, integer | |||||
| *, integer *, complex *, integer *, complex *, integer *, complex | |||||
| *, integer *, complex *, integer *, complex *, integer *); | |||||
| /* -- LAPACK computational routine (version 3.7.1) -- */ | |||||
| /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ | |||||
| /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ | |||||
| /* June 2017 */ | |||||
| /* ===================================================================== */ | |||||
| /* Test the input arguments */ | |||||
| /* Parameter adjustments */ | |||||
| a_dim1 = *lda; | |||||
| a_offset = 1 + a_dim1 * 1; | |||||
| a -= a_offset; | |||||
| t_dim1 = *ldt; | |||||
| t_offset = 1 + t_dim1 * 1; | |||||
| t -= t_offset; | |||||
| c_dim1 = *ldc; | |||||
| c_offset = 1 + c_dim1 * 1; | |||||
| c__ -= c_offset; | |||||
| --work; | |||||
| /* Function Body */ | |||||
| lquery = *lwork < 0; | |||||
| notran = lsame_(trans, "N"); | |||||
| tran = lsame_(trans, "C"); | |||||
| left = lsame_(side, "L"); | |||||
| right = lsame_(side, "R"); | |||||
| if (left) { | |||||
| lw = *n * *nb; | |||||
| } else { | |||||
| lw = *m * *nb; | |||||
| } | |||||
| *info = 0; | |||||
| if (! left && ! right) { | |||||
| *info = -1; | |||||
| } else if (! tran && ! notran) { | |||||
| *info = -2; | |||||
| } else if (*m < 0) { | |||||
| *info = -3; | |||||
| } else if (*n < 0) { | |||||
| *info = -4; | |||||
| } else if (*k < 0) { | |||||
| *info = -5; | |||||
| } else if (*lda < f2cmax(1,*k)) { | |||||
| *info = -9; | |||||
| } else if (*ldt < f2cmax(1,*nb)) { | |||||
| *info = -11; | |||||
| } else if (*ldc < f2cmax(1,*m)) { | |||||
| *info = -13; | |||||
| } else if (*lwork < f2cmax(1,lw) && ! lquery) { | |||||
| *info = -15; | |||||
| } | |||||
| /* Determine the block size if it is tall skinny or short and wide */ | |||||
| if (*info == 0) { | |||||
| work[1].r = (real) lw, work[1].i = 0.f; | |||||
| } | |||||
| if (*info != 0) { | |||||
| i__1 = -(*info); | |||||
| xerbla_("CLAMTSQR", &i__1, (ftnlen)8); | |||||
| return 0; | |||||
| } else if (lquery) { | |||||
| return 0; | |||||
| } | |||||
| /* Quick return if possible */ | |||||
| /* Computing MIN */ | |||||
| i__1 = f2cmin(*m,*n); | |||||
| if (f2cmin(i__1,*k) == 0) { | |||||
| return 0; | |||||
| } | |||||
| /* Computing MAX */ | |||||
| i__1 = f2cmax(*m,*n); | |||||
| if (*mb <= *k || *mb >= f2cmax(i__1,*k)) { | |||||
| cgemqrt_(side, trans, m, n, k, nb, &a[a_offset], lda, &t[t_offset], | |||||
| ldt, &c__[c_offset], ldc, &work[1], info); | |||||
| return 0; | |||||
| } | |||||
| if (left && notran) { | |||||
| /* Multiply Q to the last block of C */ | |||||
| kk = (*m - *k) % (*mb - *k); | |||||
| ctr = (*m - *k) / (*mb - *k); | |||||
| if (kk > 0) { | |||||
| ii = *m - kk + 1; | |||||
| ctpmqrt_("L", "N", &kk, n, k, &c__0, nb, &a[ii + a_dim1], lda, &t[ | |||||
| (ctr * *k + 1) * t_dim1 + 1], ldt, &c__[c_dim1 + 1], ldc, | |||||
| &c__[ii + c_dim1], ldc, &work[1], info); | |||||
| } else { | |||||
| ii = *m + 1; | |||||
| } | |||||
| i__1 = *mb + 1; | |||||
| i__2 = -(*mb - *k); | |||||
| for (i__ = ii - (*mb - *k); i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ | |||||
| += i__2) { | |||||
| /* Multiply Q to the current block of C (I:I+MB,1:N) */ | |||||
| --ctr; | |||||
| i__3 = *mb - *k; | |||||
| ctpmqrt_("L", "N", &i__3, n, k, &c__0, nb, &a[i__ + a_dim1], lda, | |||||
| &t[(ctr * *k + 1) * t_dim1 + 1], ldt, &c__[c_dim1 + 1], | |||||
| ldc, &c__[i__ + c_dim1], ldc, &work[1], info); | |||||
| } | |||||
| /* Multiply Q to the first block of C (1:MB,1:N) */ | |||||
| cgemqrt_("L", "N", mb, n, k, nb, &a[a_dim1 + 1], lda, &t[t_offset], | |||||
| ldt, &c__[c_dim1 + 1], ldc, &work[1], info); | |||||
| } else if (left && tran) { | |||||
| /* Multiply Q to the first block of C */ | |||||
| kk = (*m - *k) % (*mb - *k); | |||||
| ii = *m - kk + 1; | |||||
| ctr = 1; | |||||
| cgemqrt_("L", "C", mb, n, k, nb, &a[a_dim1 + 1], lda, &t[t_offset], | |||||
| ldt, &c__[c_dim1 + 1], ldc, &work[1], info); | |||||
| i__2 = ii - *mb + *k; | |||||
| i__1 = *mb - *k; | |||||
| for (i__ = *mb + 1; i__1 < 0 ? i__ >= i__2 : i__ <= i__2; i__ += i__1) | |||||
| { | |||||
| /* Multiply Q to the current block of C (I:I+MB,1:N) */ | |||||
| i__3 = *mb - *k; | |||||
| ctpmqrt_("L", "C", &i__3, n, k, &c__0, nb, &a[i__ + a_dim1], lda, | |||||
| &t[(ctr * *k + 1) * t_dim1 + 1], ldt, &c__[c_dim1 + 1], | |||||
| ldc, &c__[i__ + c_dim1], ldc, &work[1], info); | |||||
| ++ctr; | |||||
| } | |||||
| if (ii <= *m) { | |||||
| /* Multiply Q to the last block of C */ | |||||
| ctpmqrt_("L", "C", &kk, n, k, &c__0, nb, &a[ii + a_dim1], lda, &t[ | |||||
| (ctr * *k + 1) * t_dim1 + 1], ldt, &c__[c_dim1 + 1], ldc, | |||||
| &c__[ii + c_dim1], ldc, &work[1], info); | |||||
| } | |||||
| } else if (right && tran) { | |||||
| /* Multiply Q to the last block of C */ | |||||
| kk = (*n - *k) % (*mb - *k); | |||||
| ctr = (*n - *k) / (*mb - *k); | |||||
| if (kk > 0) { | |||||
| ii = *n - kk + 1; | |||||
| ctpmqrt_("R", "C", m, &kk, k, &c__0, nb, &a[ii + a_dim1], lda, &t[ | |||||
| (ctr * *k + 1) * t_dim1 + 1], ldt, &c__[c_dim1 + 1], ldc, | |||||
| &c__[ii * c_dim1 + 1], ldc, &work[1], info); | |||||
| } else { | |||||
| ii = *n + 1; | |||||
| } | |||||
| i__1 = *mb + 1; | |||||
| i__2 = -(*mb - *k); | |||||
| for (i__ = ii - (*mb - *k); i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ | |||||
| += i__2) { | |||||
| /* Multiply Q to the current block of C (1:M,I:I+MB) */ | |||||
| --ctr; | |||||
| i__3 = *mb - *k; | |||||
| ctpmqrt_("R", "C", m, &i__3, k, &c__0, nb, &a[i__ + a_dim1], lda, | |||||
| &t[(ctr * *k + 1) * t_dim1 + 1], ldt, &c__[c_dim1 + 1], | |||||
| ldc, &c__[i__ * c_dim1 + 1], ldc, &work[1], info); | |||||
| } | |||||
| /* Multiply Q to the first block of C (1:M,1:MB) */ | |||||
| cgemqrt_("R", "C", m, mb, k, nb, &a[a_dim1 + 1], lda, &t[t_offset], | |||||
| ldt, &c__[c_dim1 + 1], ldc, &work[1], info); | |||||
| } else if (right && notran) { | |||||
| /* Multiply Q to the first block of C */ | |||||
| kk = (*n - *k) % (*mb - *k); | |||||
| ii = *n - kk + 1; | |||||
| ctr = 1; | |||||
| cgemqrt_("R", "N", m, mb, k, nb, &a[a_dim1 + 1], lda, &t[t_offset], | |||||
| ldt, &c__[c_dim1 + 1], ldc, &work[1], info); | |||||
| i__2 = ii - *mb + *k; | |||||
| i__1 = *mb - *k; | |||||
| for (i__ = *mb + 1; i__1 < 0 ? i__ >= i__2 : i__ <= i__2; i__ += i__1) | |||||
| { | |||||
| /* Multiply Q to the current block of C (1:M,I:I+MB) */ | |||||
| i__3 = *mb - *k; | |||||
| ctpmqrt_("R", "N", m, &i__3, k, &c__0, nb, &a[i__ + a_dim1], lda, | |||||
| &t[(ctr * *k + 1) * t_dim1 + 1], ldt, &c__[c_dim1 + 1], | |||||
| ldc, &c__[i__ * c_dim1 + 1], ldc, &work[1], info); | |||||
| ++ctr; | |||||
| } | |||||
| if (ii <= *n) { | |||||
| /* Multiply Q to the last block of C */ | |||||
| ctpmqrt_("R", "N", m, &kk, k, &c__0, nb, &a[ii + a_dim1], lda, &t[ | |||||
| (ctr * *k + 1) * t_dim1 + 1], ldt, &c__[c_dim1 + 1], ldc, | |||||
| &c__[ii * c_dim1 + 1], ldc, &work[1], info); | |||||
| } | |||||
| } | |||||
| work[1].r = (real) lw, work[1].i = 0.f; | |||||
| return 0; | |||||
| /* End of CLAMTSQR */ | |||||
| } /* clamtsqr_ */ | |||||
| @@ -0,0 +1,663 @@ | |||||
| /* f2c.h -- Standard Fortran to C header file */ | |||||
| /** barf [ba:rf] 2. "He suggested using FORTRAN, and everybody barfed." | |||||
| - From The Shogakukan DICTIONARY OF NEW ENGLISH (Second edition) */ | |||||
| #ifndef F2C_INCLUDE | |||||
| #define F2C_INCLUDE | |||||
| #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 | |||||
| typedef int 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; | |||||
| 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;} | |||||
| #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)); } | |||||
| #define c_div(c, a, b) {pCf(c) = Cf(a)/Cf(b);} | |||||
| #define z_div(c, a, b) {pCd(c) = Cd(a)/Cd(b);} | |||||
| #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) = conj(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) (cimag(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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotc_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void cdotu_(complex *z, integer *n_, complex *x, integer *incx_, complex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotu_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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) | |||||
| */ | |||||
| /* Table of constant values */ | |||||
| static integer c__1 = 1; | |||||
| /* > \brief \b CLANGB returns the value of the 1-norm, Frobenius norm, infinity-norm, or the largest absolute | |||||
| value of any element of general band matrix. */ | |||||
| /* =========== DOCUMENTATION =========== */ | |||||
| /* Online html documentation available at */ | |||||
| /* http://www.netlib.org/lapack/explore-html/ */ | |||||
| /* > \htmlonly */ | |||||
| /* > Download CLANGB + dependencies */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/clangb. | |||||
| f"> */ | |||||
| /* > [TGZ]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/clangb. | |||||
| f"> */ | |||||
| /* > [ZIP]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/clangb. | |||||
| f"> */ | |||||
| /* > [TXT]</a> */ | |||||
| /* > \endhtmlonly */ | |||||
| /* Definition: */ | |||||
| /* =========== */ | |||||
| /* REAL FUNCTION CLANGB( NORM, N, KL, KU, AB, LDAB, */ | |||||
| /* WORK ) */ | |||||
| /* CHARACTER NORM */ | |||||
| /* INTEGER KL, KU, LDAB, N */ | |||||
| /* REAL WORK( * ) */ | |||||
| /* COMPLEX AB( LDAB, * ) */ | |||||
| /* > \par Purpose: */ | |||||
| /* ============= */ | |||||
| /* > */ | |||||
| /* > \verbatim */ | |||||
| /* > */ | |||||
| /* > CLANGB returns the value of the one norm, or the Frobenius norm, or */ | |||||
| /* > the infinity norm, or the element of largest absolute value of an */ | |||||
| /* > n by n band matrix A, with kl sub-diagonals and ku super-diagonals. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \return CLANGB */ | |||||
| /* > \verbatim */ | |||||
| /* > */ | |||||
| /* > CLANGB = ( f2cmax(abs(A(i,j))), NORM = 'M' or 'm' */ | |||||
| /* > ( */ | |||||
| /* > ( norm1(A), NORM = '1', 'O' or 'o' */ | |||||
| /* > ( */ | |||||
| /* > ( normI(A), NORM = 'I' or 'i' */ | |||||
| /* > ( */ | |||||
| /* > ( normF(A), NORM = 'F', 'f', 'E' or 'e' */ | |||||
| /* > */ | |||||
| /* > where norm1 denotes the one norm of a matrix (maximum column sum), */ | |||||
| /* > normI denotes the infinity norm of a matrix (maximum row sum) and */ | |||||
| /* > normF denotes the Frobenius norm of a matrix (square root of sum of */ | |||||
| /* > squares). Note that f2cmax(abs(A(i,j))) is not a consistent matrix norm. */ | |||||
| /* > \endverbatim */ | |||||
| /* Arguments: */ | |||||
| /* ========== */ | |||||
| /* > \param[in] NORM */ | |||||
| /* > \verbatim */ | |||||
| /* > NORM is CHARACTER*1 */ | |||||
| /* > Specifies the value to be returned in CLANGB as described */ | |||||
| /* > above. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] N */ | |||||
| /* > \verbatim */ | |||||
| /* > N is INTEGER */ | |||||
| /* > The order of the matrix A. N >= 0. When N = 0, CLANGB is */ | |||||
| /* > set to zero. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] KL */ | |||||
| /* > \verbatim */ | |||||
| /* > KL is INTEGER */ | |||||
| /* > The number of sub-diagonals of the matrix A. KL >= 0. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] KU */ | |||||
| /* > \verbatim */ | |||||
| /* > KU is INTEGER */ | |||||
| /* > The number of super-diagonals of the matrix A. KU >= 0. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] AB */ | |||||
| /* > \verbatim */ | |||||
| /* > AB is COMPLEX array, dimension (LDAB,N) */ | |||||
| /* > The band matrix A, stored in rows 1 to KL+KU+1. The j-th */ | |||||
| /* > column of A is stored in the j-th column of the array AB as */ | |||||
| /* > follows: */ | |||||
| /* > AB(ku+1+i-j,j) = A(i,j) for f2cmax(1,j-ku)<=i<=f2cmin(n,j+kl). */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] LDAB */ | |||||
| /* > \verbatim */ | |||||
| /* > LDAB is INTEGER */ | |||||
| /* > The leading dimension of the array AB. LDAB >= KL+KU+1. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] WORK */ | |||||
| /* > \verbatim */ | |||||
| /* > WORK is REAL array, dimension (MAX(1,LWORK)), */ | |||||
| /* > where LWORK >= N when NORM = 'I'; otherwise, WORK is not */ | |||||
| /* > referenced. */ | |||||
| /* > \endverbatim */ | |||||
| /* Authors: */ | |||||
| /* ======== */ | |||||
| /* > \author Univ. of Tennessee */ | |||||
| /* > \author Univ. of California Berkeley */ | |||||
| /* > \author Univ. of Colorado Denver */ | |||||
| /* > \author NAG Ltd. */ | |||||
| /* > \date December 2016 */ | |||||
| /* > \ingroup complexGBauxiliary */ | |||||
| /* ===================================================================== */ | |||||
| real clangb_(char *norm, integer *n, integer *kl, integer *ku, complex *ab, | |||||
| integer *ldab, real *work) | |||||
| { | |||||
| /* System generated locals */ | |||||
| integer ab_dim1, ab_offset, i__1, i__2, i__3, i__4, i__5, i__6; | |||||
| real ret_val; | |||||
| /* Local variables */ | |||||
| real temp; | |||||
| extern /* Subroutine */ int scombssq_(real *, real *); | |||||
| integer i__, j, k, l; | |||||
| extern logical lsame_(char *, char *); | |||||
| real value; | |||||
| extern /* Subroutine */ int classq_(integer *, complex *, integer *, real | |||||
| *, real *); | |||||
| extern logical sisnan_(real *); | |||||
| real colssq[2], sum, ssq[2]; | |||||
| /* -- LAPACK auxiliary routine (version 3.7.0) -- */ | |||||
| /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ | |||||
| /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ | |||||
| /* December 2016 */ | |||||
| /* ===================================================================== */ | |||||
| /* Parameter adjustments */ | |||||
| ab_dim1 = *ldab; | |||||
| ab_offset = 1 + ab_dim1 * 1; | |||||
| ab -= ab_offset; | |||||
| --work; | |||||
| /* Function Body */ | |||||
| if (*n == 0) { | |||||
| value = 0.f; | |||||
| } else if (lsame_(norm, "M")) { | |||||
| /* Find f2cmax(abs(A(i,j))). */ | |||||
| value = 0.f; | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| /* Computing MAX */ | |||||
| i__2 = *ku + 2 - j; | |||||
| /* Computing MIN */ | |||||
| i__4 = *n + *ku + 1 - j, i__5 = *kl + *ku + 1; | |||||
| i__3 = f2cmin(i__4,i__5); | |||||
| for (i__ = f2cmax(i__2,1); i__ <= i__3; ++i__) { | |||||
| temp = c_abs(&ab[i__ + j * ab_dim1]); | |||||
| if (value < temp || sisnan_(&temp)) { | |||||
| value = temp; | |||||
| } | |||||
| /* L10: */ | |||||
| } | |||||
| /* L20: */ | |||||
| } | |||||
| } else if (lsame_(norm, "O") || *(unsigned char *) | |||||
| norm == '1') { | |||||
| /* Find norm1(A). */ | |||||
| value = 0.f; | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| sum = 0.f; | |||||
| /* Computing MAX */ | |||||
| i__3 = *ku + 2 - j; | |||||
| /* Computing MIN */ | |||||
| i__4 = *n + *ku + 1 - j, i__5 = *kl + *ku + 1; | |||||
| i__2 = f2cmin(i__4,i__5); | |||||
| for (i__ = f2cmax(i__3,1); i__ <= i__2; ++i__) { | |||||
| sum += c_abs(&ab[i__ + j * ab_dim1]); | |||||
| /* L30: */ | |||||
| } | |||||
| if (value < sum || sisnan_(&sum)) { | |||||
| value = sum; | |||||
| } | |||||
| /* L40: */ | |||||
| } | |||||
| } else if (lsame_(norm, "I")) { | |||||
| /* Find normI(A). */ | |||||
| i__1 = *n; | |||||
| for (i__ = 1; i__ <= i__1; ++i__) { | |||||
| work[i__] = 0.f; | |||||
| /* L50: */ | |||||
| } | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| k = *ku + 1 - j; | |||||
| /* Computing MAX */ | |||||
| i__2 = 1, i__3 = j - *ku; | |||||
| /* Computing MIN */ | |||||
| i__5 = *n, i__6 = j + *kl; | |||||
| i__4 = f2cmin(i__5,i__6); | |||||
| for (i__ = f2cmax(i__2,i__3); i__ <= i__4; ++i__) { | |||||
| work[i__] += c_abs(&ab[k + i__ + j * ab_dim1]); | |||||
| /* L60: */ | |||||
| } | |||||
| /* L70: */ | |||||
| } | |||||
| value = 0.f; | |||||
| i__1 = *n; | |||||
| for (i__ = 1; i__ <= i__1; ++i__) { | |||||
| temp = work[i__]; | |||||
| if (value < temp || sisnan_(&temp)) { | |||||
| value = temp; | |||||
| } | |||||
| /* L80: */ | |||||
| } | |||||
| } else if (lsame_(norm, "F") || lsame_(norm, "E")) { | |||||
| /* Find normF(A). */ | |||||
| /* SSQ(1) is scale */ | |||||
| /* SSQ(2) is sum-of-squares */ | |||||
| /* For better accuracy, sum each column separately. */ | |||||
| ssq[0] = 0.f; | |||||
| ssq[1] = 1.f; | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| /* Computing MAX */ | |||||
| i__4 = 1, i__2 = j - *ku; | |||||
| l = f2cmax(i__4,i__2); | |||||
| k = *ku + 1 - j + l; | |||||
| colssq[0] = 0.f; | |||||
| colssq[1] = 1.f; | |||||
| /* Computing MIN */ | |||||
| i__2 = *n, i__3 = j + *kl; | |||||
| i__4 = f2cmin(i__2,i__3) - l + 1; | |||||
| classq_(&i__4, &ab[k + j * ab_dim1], &c__1, colssq, &colssq[1]); | |||||
| scombssq_(ssq, colssq); | |||||
| /* L90: */ | |||||
| } | |||||
| value = ssq[0] * sqrt(ssq[1]); | |||||
| } | |||||
| ret_val = value; | |||||
| return ret_val; | |||||
| /* End of CLANGB */ | |||||
| } /* clangb_ */ | |||||
| @@ -0,0 +1,634 @@ | |||||
| /* f2c.h -- Standard Fortran to C header file */ | |||||
| /** barf [ba:rf] 2. "He suggested using FORTRAN, and everybody barfed." | |||||
| - From The Shogakukan DICTIONARY OF NEW ENGLISH (Second edition) */ | |||||
| #ifndef F2C_INCLUDE | |||||
| #define F2C_INCLUDE | |||||
| #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 | |||||
| typedef int 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; | |||||
| 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;} | |||||
| #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)); } | |||||
| #define c_div(c, a, b) {pCf(c) = Cf(a)/Cf(b);} | |||||
| #define z_div(c, a, b) {pCd(c) = Cd(a)/Cd(b);} | |||||
| #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) = conj(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) (cimag(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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotc_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void cdotu_(complex *z, integer *n_, complex *x, integer *incx_, complex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotu_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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) | |||||
| */ | |||||
| /* Table of constant values */ | |||||
| static integer c__1 = 1; | |||||
| /* > \brief \b CLANGE returns the value of the 1-norm, Frobenius norm, infinity-norm, or the largest absolute | |||||
| value of any element of a general rectangular matrix. */ | |||||
| /* =========== DOCUMENTATION =========== */ | |||||
| /* Online html documentation available at */ | |||||
| /* http://www.netlib.org/lapack/explore-html/ */ | |||||
| /* > \htmlonly */ | |||||
| /* > Download CLANGE + dependencies */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/clange. | |||||
| f"> */ | |||||
| /* > [TGZ]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/clange. | |||||
| f"> */ | |||||
| /* > [ZIP]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/clange. | |||||
| f"> */ | |||||
| /* > [TXT]</a> */ | |||||
| /* > \endhtmlonly */ | |||||
| /* Definition: */ | |||||
| /* =========== */ | |||||
| /* REAL FUNCTION CLANGE( NORM, M, N, A, LDA, WORK ) */ | |||||
| /* CHARACTER NORM */ | |||||
| /* INTEGER LDA, M, N */ | |||||
| /* REAL WORK( * ) */ | |||||
| /* COMPLEX A( LDA, * ) */ | |||||
| /* > \par Purpose: */ | |||||
| /* ============= */ | |||||
| /* > */ | |||||
| /* > \verbatim */ | |||||
| /* > */ | |||||
| /* > CLANGE returns the value of the one norm, or the Frobenius norm, or */ | |||||
| /* > the infinity norm, or the element of largest absolute value of a */ | |||||
| /* > complex matrix A. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \return CLANGE */ | |||||
| /* > \verbatim */ | |||||
| /* > */ | |||||
| /* > CLANGE = ( f2cmax(abs(A(i,j))), NORM = 'M' or 'm' */ | |||||
| /* > ( */ | |||||
| /* > ( norm1(A), NORM = '1', 'O' or 'o' */ | |||||
| /* > ( */ | |||||
| /* > ( normI(A), NORM = 'I' or 'i' */ | |||||
| /* > ( */ | |||||
| /* > ( normF(A), NORM = 'F', 'f', 'E' or 'e' */ | |||||
| /* > */ | |||||
| /* > where norm1 denotes the one norm of a matrix (maximum column sum), */ | |||||
| /* > normI denotes the infinity norm of a matrix (maximum row sum) and */ | |||||
| /* > normF denotes the Frobenius norm of a matrix (square root of sum of */ | |||||
| /* > squares). Note that f2cmax(abs(A(i,j))) is not a consistent matrix norm. */ | |||||
| /* > \endverbatim */ | |||||
| /* Arguments: */ | |||||
| /* ========== */ | |||||
| /* > \param[in] NORM */ | |||||
| /* > \verbatim */ | |||||
| /* > NORM is CHARACTER*1 */ | |||||
| /* > Specifies the value to be returned in CLANGE as described */ | |||||
| /* > above. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] M */ | |||||
| /* > \verbatim */ | |||||
| /* > M is INTEGER */ | |||||
| /* > The number of rows of the matrix A. M >= 0. When M = 0, */ | |||||
| /* > CLANGE is set to zero. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] N */ | |||||
| /* > \verbatim */ | |||||
| /* > N is INTEGER */ | |||||
| /* > The number of columns of the matrix A. N >= 0. When N = 0, */ | |||||
| /* > CLANGE is set to zero. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] A */ | |||||
| /* > \verbatim */ | |||||
| /* > A is COMPLEX array, dimension (LDA,N) */ | |||||
| /* > The m by n matrix A. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] LDA */ | |||||
| /* > \verbatim */ | |||||
| /* > LDA is INTEGER */ | |||||
| /* > The leading dimension of the array A. LDA >= f2cmax(M,1). */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] WORK */ | |||||
| /* > \verbatim */ | |||||
| /* > WORK is REAL array, dimension (MAX(1,LWORK)), */ | |||||
| /* > where LWORK >= M when NORM = 'I'; otherwise, WORK is not */ | |||||
| /* > referenced. */ | |||||
| /* > \endverbatim */ | |||||
| /* Authors: */ | |||||
| /* ======== */ | |||||
| /* > \author Univ. of Tennessee */ | |||||
| /* > \author Univ. of California Berkeley */ | |||||
| /* > \author Univ. of Colorado Denver */ | |||||
| /* > \author NAG Ltd. */ | |||||
| /* > \date December 2016 */ | |||||
| /* > \ingroup complexGEauxiliary */ | |||||
| /* ===================================================================== */ | |||||
| real clange_(char *norm, integer *m, integer *n, complex *a, integer *lda, | |||||
| real *work) | |||||
| { | |||||
| /* System generated locals */ | |||||
| integer a_dim1, a_offset, i__1, i__2; | |||||
| real ret_val; | |||||
| /* Local variables */ | |||||
| real temp; | |||||
| extern /* Subroutine */ int scombssq_(real *, real *); | |||||
| integer i__, j; | |||||
| extern logical lsame_(char *, char *); | |||||
| real value; | |||||
| extern /* Subroutine */ int classq_(integer *, complex *, integer *, real | |||||
| *, real *); | |||||
| extern logical sisnan_(real *); | |||||
| real colssq[2], sum, ssq[2]; | |||||
| /* -- LAPACK auxiliary routine (version 3.7.0) -- */ | |||||
| /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ | |||||
| /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ | |||||
| /* December 2016 */ | |||||
| /* ===================================================================== */ | |||||
| /* Parameter adjustments */ | |||||
| a_dim1 = *lda; | |||||
| a_offset = 1 + a_dim1 * 1; | |||||
| a -= a_offset; | |||||
| --work; | |||||
| /* Function Body */ | |||||
| if (f2cmin(*m,*n) == 0) { | |||||
| value = 0.f; | |||||
| } else if (lsame_(norm, "M")) { | |||||
| /* Find f2cmax(abs(A(i,j))). */ | |||||
| value = 0.f; | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| i__2 = *m; | |||||
| for (i__ = 1; i__ <= i__2; ++i__) { | |||||
| temp = c_abs(&a[i__ + j * a_dim1]); | |||||
| if (value < temp || sisnan_(&temp)) { | |||||
| value = temp; | |||||
| } | |||||
| /* L10: */ | |||||
| } | |||||
| /* L20: */ | |||||
| } | |||||
| } else if (lsame_(norm, "O") || *(unsigned char *) | |||||
| norm == '1') { | |||||
| /* Find norm1(A). */ | |||||
| value = 0.f; | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| sum = 0.f; | |||||
| i__2 = *m; | |||||
| for (i__ = 1; i__ <= i__2; ++i__) { | |||||
| sum += c_abs(&a[i__ + j * a_dim1]); | |||||
| /* L30: */ | |||||
| } | |||||
| if (value < sum || sisnan_(&sum)) { | |||||
| value = sum; | |||||
| } | |||||
| /* L40: */ | |||||
| } | |||||
| } else if (lsame_(norm, "I")) { | |||||
| /* Find normI(A). */ | |||||
| i__1 = *m; | |||||
| for (i__ = 1; i__ <= i__1; ++i__) { | |||||
| work[i__] = 0.f; | |||||
| /* L50: */ | |||||
| } | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| i__2 = *m; | |||||
| for (i__ = 1; i__ <= i__2; ++i__) { | |||||
| work[i__] += c_abs(&a[i__ + j * a_dim1]); | |||||
| /* L60: */ | |||||
| } | |||||
| /* L70: */ | |||||
| } | |||||
| value = 0.f; | |||||
| i__1 = *m; | |||||
| for (i__ = 1; i__ <= i__1; ++i__) { | |||||
| temp = work[i__]; | |||||
| if (value < temp || sisnan_(&temp)) { | |||||
| value = temp; | |||||
| } | |||||
| /* L80: */ | |||||
| } | |||||
| } else if (lsame_(norm, "F") || lsame_(norm, "E")) { | |||||
| /* Find normF(A). */ | |||||
| /* SSQ(1) is scale */ | |||||
| /* SSQ(2) is sum-of-squares */ | |||||
| /* For better accuracy, sum each column separately. */ | |||||
| ssq[0] = 0.f; | |||||
| ssq[1] = 1.f; | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| colssq[0] = 0.f; | |||||
| colssq[1] = 1.f; | |||||
| classq_(m, &a[j * a_dim1 + 1], &c__1, colssq, &colssq[1]); | |||||
| scombssq_(ssq, colssq); | |||||
| /* L90: */ | |||||
| } | |||||
| value = ssq[0] * sqrt(ssq[1]); | |||||
| } | |||||
| ret_val = value; | |||||
| return ret_val; | |||||
| /* End of CLANGE */ | |||||
| } /* clange_ */ | |||||
| @@ -0,0 +1,622 @@ | |||||
| /* f2c.h -- Standard Fortran to C header file */ | |||||
| /** barf [ba:rf] 2. "He suggested using FORTRAN, and everybody barfed." | |||||
| - From The Shogakukan DICTIONARY OF NEW ENGLISH (Second edition) */ | |||||
| #ifndef F2C_INCLUDE | |||||
| #define F2C_INCLUDE | |||||
| #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 | |||||
| typedef int 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; | |||||
| 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;} | |||||
| #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)); } | |||||
| #define c_div(c, a, b) {pCf(c) = Cf(a)/Cf(b);} | |||||
| #define z_div(c, a, b) {pCd(c) = Cd(a)/Cd(b);} | |||||
| #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) = conj(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) (cimag(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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotc_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void cdotu_(complex *z, integer *n_, complex *x, integer *incx_, complex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotu_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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) | |||||
| */ | |||||
| /* Table of constant values */ | |||||
| static integer c__1 = 1; | |||||
| /* > \brief \b CLANGT returns the value of the 1-norm, Frobenius norm, infinity-norm, or the largest absolute | |||||
| value of any element of a general tridiagonal matrix. */ | |||||
| /* =========== DOCUMENTATION =========== */ | |||||
| /* Online html documentation available at */ | |||||
| /* http://www.netlib.org/lapack/explore-html/ */ | |||||
| /* > \htmlonly */ | |||||
| /* > Download CLANGT + dependencies */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/clangt. | |||||
| f"> */ | |||||
| /* > [TGZ]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/clangt. | |||||
| f"> */ | |||||
| /* > [ZIP]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/clangt. | |||||
| f"> */ | |||||
| /* > [TXT]</a> */ | |||||
| /* > \endhtmlonly */ | |||||
| /* Definition: */ | |||||
| /* =========== */ | |||||
| /* REAL FUNCTION CLANGT( NORM, N, DL, D, DU ) */ | |||||
| /* CHARACTER NORM */ | |||||
| /* INTEGER N */ | |||||
| /* COMPLEX D( * ), DL( * ), DU( * ) */ | |||||
| /* > \par Purpose: */ | |||||
| /* ============= */ | |||||
| /* > */ | |||||
| /* > \verbatim */ | |||||
| /* > */ | |||||
| /* > CLANGT returns the value of the one norm, or the Frobenius norm, or */ | |||||
| /* > the infinity norm, or the element of largest absolute value of a */ | |||||
| /* > complex tridiagonal matrix A. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \return CLANGT */ | |||||
| /* > \verbatim */ | |||||
| /* > */ | |||||
| /* > CLANGT = ( f2cmax(abs(A(i,j))), NORM = 'M' or 'm' */ | |||||
| /* > ( */ | |||||
| /* > ( norm1(A), NORM = '1', 'O' or 'o' */ | |||||
| /* > ( */ | |||||
| /* > ( normI(A), NORM = 'I' or 'i' */ | |||||
| /* > ( */ | |||||
| /* > ( normF(A), NORM = 'F', 'f', 'E' or 'e' */ | |||||
| /* > */ | |||||
| /* > where norm1 denotes the one norm of a matrix (maximum column sum), */ | |||||
| /* > normI denotes the infinity norm of a matrix (maximum row sum) and */ | |||||
| /* > normF denotes the Frobenius norm of a matrix (square root of sum of */ | |||||
| /* > squares). Note that f2cmax(abs(A(i,j))) is not a consistent matrix norm. */ | |||||
| /* > \endverbatim */ | |||||
| /* Arguments: */ | |||||
| /* ========== */ | |||||
| /* > \param[in] NORM */ | |||||
| /* > \verbatim */ | |||||
| /* > NORM is CHARACTER*1 */ | |||||
| /* > Specifies the value to be returned in CLANGT as described */ | |||||
| /* > above. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] N */ | |||||
| /* > \verbatim */ | |||||
| /* > N is INTEGER */ | |||||
| /* > The order of the matrix A. N >= 0. When N = 0, CLANGT is */ | |||||
| /* > set to zero. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] DL */ | |||||
| /* > \verbatim */ | |||||
| /* > DL is COMPLEX array, dimension (N-1) */ | |||||
| /* > The (n-1) sub-diagonal elements of A. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] D */ | |||||
| /* > \verbatim */ | |||||
| /* > D is COMPLEX array, dimension (N) */ | |||||
| /* > The diagonal elements of A. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] DU */ | |||||
| /* > \verbatim */ | |||||
| /* > DU is COMPLEX array, dimension (N-1) */ | |||||
| /* > The (n-1) super-diagonal elements of A. */ | |||||
| /* > \endverbatim */ | |||||
| /* Authors: */ | |||||
| /* ======== */ | |||||
| /* > \author Univ. of Tennessee */ | |||||
| /* > \author Univ. of California Berkeley */ | |||||
| /* > \author Univ. of Colorado Denver */ | |||||
| /* > \author NAG Ltd. */ | |||||
| /* > \date December 2016 */ | |||||
| /* > \ingroup complexOTHERauxiliary */ | |||||
| /* ===================================================================== */ | |||||
| real clangt_(char *norm, integer *n, complex *dl, complex *d__, complex *du) | |||||
| { | |||||
| /* System generated locals */ | |||||
| integer i__1; | |||||
| real ret_val, r__1; | |||||
| /* Local variables */ | |||||
| real temp; | |||||
| integer i__; | |||||
| real scale; | |||||
| extern logical lsame_(char *, char *); | |||||
| real anorm; | |||||
| extern /* Subroutine */ int classq_(integer *, complex *, integer *, real | |||||
| *, real *); | |||||
| extern logical sisnan_(real *); | |||||
| real sum; | |||||
| /* -- LAPACK auxiliary routine (version 3.7.0) -- */ | |||||
| /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ | |||||
| /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ | |||||
| /* December 2016 */ | |||||
| /* ===================================================================== */ | |||||
| /* Parameter adjustments */ | |||||
| --du; | |||||
| --d__; | |||||
| --dl; | |||||
| /* Function Body */ | |||||
| if (*n <= 0) { | |||||
| anorm = 0.f; | |||||
| } else if (lsame_(norm, "M")) { | |||||
| /* Find f2cmax(abs(A(i,j))). */ | |||||
| anorm = c_abs(&d__[*n]); | |||||
| i__1 = *n - 1; | |||||
| for (i__ = 1; i__ <= i__1; ++i__) { | |||||
| r__1 = c_abs(&dl[i__]); | |||||
| if (anorm < c_abs(&dl[i__]) || sisnan_(&r__1)) { | |||||
| anorm = c_abs(&dl[i__]); | |||||
| } | |||||
| r__1 = c_abs(&d__[i__]); | |||||
| if (anorm < c_abs(&d__[i__]) || sisnan_(&r__1)) { | |||||
| anorm = c_abs(&d__[i__]); | |||||
| } | |||||
| r__1 = c_abs(&du[i__]); | |||||
| if (anorm < c_abs(&du[i__]) || sisnan_(&r__1)) { | |||||
| anorm = c_abs(&du[i__]); | |||||
| } | |||||
| /* L10: */ | |||||
| } | |||||
| } else if (lsame_(norm, "O") || *(unsigned char *) | |||||
| norm == '1') { | |||||
| /* Find norm1(A). */ | |||||
| if (*n == 1) { | |||||
| anorm = c_abs(&d__[1]); | |||||
| } else { | |||||
| anorm = c_abs(&d__[1]) + c_abs(&dl[1]); | |||||
| temp = c_abs(&d__[*n]) + c_abs(&du[*n - 1]); | |||||
| if (anorm < temp || sisnan_(&temp)) { | |||||
| anorm = temp; | |||||
| } | |||||
| i__1 = *n - 1; | |||||
| for (i__ = 2; i__ <= i__1; ++i__) { | |||||
| temp = c_abs(&d__[i__]) + c_abs(&dl[i__]) + c_abs(&du[i__ - 1] | |||||
| ); | |||||
| if (anorm < temp || sisnan_(&temp)) { | |||||
| anorm = temp; | |||||
| } | |||||
| /* L20: */ | |||||
| } | |||||
| } | |||||
| } else if (lsame_(norm, "I")) { | |||||
| /* Find normI(A). */ | |||||
| if (*n == 1) { | |||||
| anorm = c_abs(&d__[1]); | |||||
| } else { | |||||
| anorm = c_abs(&d__[1]) + c_abs(&du[1]); | |||||
| temp = c_abs(&d__[*n]) + c_abs(&dl[*n - 1]); | |||||
| if (anorm < temp || sisnan_(&temp)) { | |||||
| anorm = temp; | |||||
| } | |||||
| i__1 = *n - 1; | |||||
| for (i__ = 2; i__ <= i__1; ++i__) { | |||||
| temp = c_abs(&d__[i__]) + c_abs(&du[i__]) + c_abs(&dl[i__ - 1] | |||||
| ); | |||||
| if (anorm < temp || sisnan_(&temp)) { | |||||
| anorm = temp; | |||||
| } | |||||
| /* L30: */ | |||||
| } | |||||
| } | |||||
| } else if (lsame_(norm, "F") || lsame_(norm, "E")) { | |||||
| /* Find normF(A). */ | |||||
| scale = 0.f; | |||||
| sum = 1.f; | |||||
| classq_(n, &d__[1], &c__1, &scale, &sum); | |||||
| if (*n > 1) { | |||||
| i__1 = *n - 1; | |||||
| classq_(&i__1, &dl[1], &c__1, &scale, &sum); | |||||
| i__1 = *n - 1; | |||||
| classq_(&i__1, &du[1], &c__1, &scale, &sum); | |||||
| } | |||||
| anorm = scale * sqrt(sum); | |||||
| } | |||||
| ret_val = anorm; | |||||
| return ret_val; | |||||
| /* End of CLANGT */ | |||||
| } /* clangt_ */ | |||||
| @@ -0,0 +1,746 @@ | |||||
| /* f2c.h -- Standard Fortran to C header file */ | |||||
| /** barf [ba:rf] 2. "He suggested using FORTRAN, and everybody barfed." | |||||
| - From The Shogakukan DICTIONARY OF NEW ENGLISH (Second edition) */ | |||||
| #ifndef F2C_INCLUDE | |||||
| #define F2C_INCLUDE | |||||
| #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 | |||||
| typedef int 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; | |||||
| 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;} | |||||
| #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)); } | |||||
| #define c_div(c, a, b) {pCf(c) = Cf(a)/Cf(b);} | |||||
| #define z_div(c, a, b) {pCd(c) = Cd(a)/Cd(b);} | |||||
| #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) = conj(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) (cimag(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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotc_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void cdotu_(complex *z, integer *n_, complex *x, integer *incx_, complex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotu_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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) | |||||
| */ | |||||
| /* Table of constant values */ | |||||
| static integer c__1 = 1; | |||||
| /* > \brief \b CLANHB returns the value of the 1-norm, or the Frobenius norm, or the infinity norm, or the ele | |||||
| ment of largest absolute value of a Hermitian band matrix. */ | |||||
| /* =========== DOCUMENTATION =========== */ | |||||
| /* Online html documentation available at */ | |||||
| /* http://www.netlib.org/lapack/explore-html/ */ | |||||
| /* > \htmlonly */ | |||||
| /* > Download CLANHB + dependencies */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/clanhb. | |||||
| f"> */ | |||||
| /* > [TGZ]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/clanhb. | |||||
| f"> */ | |||||
| /* > [ZIP]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/clanhb. | |||||
| f"> */ | |||||
| /* > [TXT]</a> */ | |||||
| /* > \endhtmlonly */ | |||||
| /* Definition: */ | |||||
| /* =========== */ | |||||
| /* REAL FUNCTION CLANHB( NORM, UPLO, N, K, AB, LDAB, */ | |||||
| /* WORK ) */ | |||||
| /* CHARACTER NORM, UPLO */ | |||||
| /* INTEGER K, LDAB, N */ | |||||
| /* REAL WORK( * ) */ | |||||
| /* COMPLEX AB( LDAB, * ) */ | |||||
| /* > \par Purpose: */ | |||||
| /* ============= */ | |||||
| /* > */ | |||||
| /* > \verbatim */ | |||||
| /* > */ | |||||
| /* > CLANHB returns the value of the one norm, or the Frobenius norm, or */ | |||||
| /* > the infinity norm, or the element of largest absolute value of an */ | |||||
| /* > n by n hermitian band matrix A, with k super-diagonals. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \return CLANHB */ | |||||
| /* > \verbatim */ | |||||
| /* > */ | |||||
| /* > CLANHB = ( f2cmax(abs(A(i,j))), NORM = 'M' or 'm' */ | |||||
| /* > ( */ | |||||
| /* > ( norm1(A), NORM = '1', 'O' or 'o' */ | |||||
| /* > ( */ | |||||
| /* > ( normI(A), NORM = 'I' or 'i' */ | |||||
| /* > ( */ | |||||
| /* > ( normF(A), NORM = 'F', 'f', 'E' or 'e' */ | |||||
| /* > */ | |||||
| /* > where norm1 denotes the one norm of a matrix (maximum column sum), */ | |||||
| /* > normI denotes the infinity norm of a matrix (maximum row sum) and */ | |||||
| /* > normF denotes the Frobenius norm of a matrix (square root of sum of */ | |||||
| /* > squares). Note that f2cmax(abs(A(i,j))) is not a consistent matrix norm. */ | |||||
| /* > \endverbatim */ | |||||
| /* Arguments: */ | |||||
| /* ========== */ | |||||
| /* > \param[in] NORM */ | |||||
| /* > \verbatim */ | |||||
| /* > NORM is CHARACTER*1 */ | |||||
| /* > Specifies the value to be returned in CLANHB as described */ | |||||
| /* > above. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] UPLO */ | |||||
| /* > \verbatim */ | |||||
| /* > UPLO is CHARACTER*1 */ | |||||
| /* > Specifies whether the upper or lower triangular part of the */ | |||||
| /* > band matrix A is supplied. */ | |||||
| /* > = 'U': Upper triangular */ | |||||
| /* > = 'L': Lower triangular */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] N */ | |||||
| /* > \verbatim */ | |||||
| /* > N is INTEGER */ | |||||
| /* > The order of the matrix A. N >= 0. When N = 0, CLANHB is */ | |||||
| /* > set to zero. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] K */ | |||||
| /* > \verbatim */ | |||||
| /* > K is INTEGER */ | |||||
| /* > The number of super-diagonals or sub-diagonals of the */ | |||||
| /* > band matrix A. K >= 0. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] AB */ | |||||
| /* > \verbatim */ | |||||
| /* > AB is COMPLEX array, dimension (LDAB,N) */ | |||||
| /* > The upper or lower triangle of the hermitian band matrix A, */ | |||||
| /* > stored in the first K+1 rows of AB. The j-th column of A is */ | |||||
| /* > stored in the j-th column of the array AB as follows: */ | |||||
| /* > if UPLO = 'U', AB(k+1+i-j,j) = A(i,j) for f2cmax(1,j-k)<=i<=j; */ | |||||
| /* > if UPLO = 'L', AB(1+i-j,j) = A(i,j) for j<=i<=f2cmin(n,j+k). */ | |||||
| /* > Note that the imaginary parts of the diagonal elements need */ | |||||
| /* > not be set and are assumed to be zero. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] LDAB */ | |||||
| /* > \verbatim */ | |||||
| /* > LDAB is INTEGER */ | |||||
| /* > The leading dimension of the array AB. LDAB >= K+1. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] WORK */ | |||||
| /* > \verbatim */ | |||||
| /* > WORK is REAL array, dimension (MAX(1,LWORK)), */ | |||||
| /* > where LWORK >= N when NORM = 'I' or '1' or 'O'; otherwise, */ | |||||
| /* > WORK is not referenced. */ | |||||
| /* > \endverbatim */ | |||||
| /* Authors: */ | |||||
| /* ======== */ | |||||
| /* > \author Univ. of Tennessee */ | |||||
| /* > \author Univ. of California Berkeley */ | |||||
| /* > \author Univ. of Colorado Denver */ | |||||
| /* > \author NAG Ltd. */ | |||||
| /* > \date December 2016 */ | |||||
| /* > \ingroup complexOTHERauxiliary */ | |||||
| /* ===================================================================== */ | |||||
| real clanhb_(char *norm, char *uplo, integer *n, integer *k, complex *ab, | |||||
| integer *ldab, real *work) | |||||
| { | |||||
| /* System generated locals */ | |||||
| integer ab_dim1, ab_offset, i__1, i__2, i__3, i__4; | |||||
| real ret_val, r__1; | |||||
| /* Local variables */ | |||||
| real absa; | |||||
| extern /* Subroutine */ int scombssq_(real *, real *); | |||||
| integer i__, j, l; | |||||
| extern logical lsame_(char *, char *); | |||||
| real value; | |||||
| extern /* Subroutine */ int classq_(integer *, complex *, integer *, real | |||||
| *, real *); | |||||
| extern logical sisnan_(real *); | |||||
| real colssq[2], sum, ssq[2]; | |||||
| /* -- LAPACK auxiliary routine (version 3.7.0) -- */ | |||||
| /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ | |||||
| /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ | |||||
| /* December 2016 */ | |||||
| /* ===================================================================== */ | |||||
| /* Parameter adjustments */ | |||||
| ab_dim1 = *ldab; | |||||
| ab_offset = 1 + ab_dim1 * 1; | |||||
| ab -= ab_offset; | |||||
| --work; | |||||
| /* Function Body */ | |||||
| if (*n == 0) { | |||||
| value = 0.f; | |||||
| } else if (lsame_(norm, "M")) { | |||||
| /* Find f2cmax(abs(A(i,j))). */ | |||||
| value = 0.f; | |||||
| if (lsame_(uplo, "U")) { | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| /* Computing MAX */ | |||||
| i__2 = *k + 2 - j; | |||||
| i__3 = *k; | |||||
| for (i__ = f2cmax(i__2,1); i__ <= i__3; ++i__) { | |||||
| sum = c_abs(&ab[i__ + j * ab_dim1]); | |||||
| if (value < sum || sisnan_(&sum)) { | |||||
| value = sum; | |||||
| } | |||||
| /* L10: */ | |||||
| } | |||||
| i__3 = *k + 1 + j * ab_dim1; | |||||
| sum = (r__1 = ab[i__3].r, abs(r__1)); | |||||
| if (value < sum || sisnan_(&sum)) { | |||||
| value = sum; | |||||
| } | |||||
| /* L20: */ | |||||
| } | |||||
| } else { | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| i__3 = j * ab_dim1 + 1; | |||||
| sum = (r__1 = ab[i__3].r, abs(r__1)); | |||||
| if (value < sum || sisnan_(&sum)) { | |||||
| value = sum; | |||||
| } | |||||
| /* Computing MIN */ | |||||
| i__2 = *n + 1 - j, i__4 = *k + 1; | |||||
| i__3 = f2cmin(i__2,i__4); | |||||
| for (i__ = 2; i__ <= i__3; ++i__) { | |||||
| sum = c_abs(&ab[i__ + j * ab_dim1]); | |||||
| if (value < sum || sisnan_(&sum)) { | |||||
| value = sum; | |||||
| } | |||||
| /* L30: */ | |||||
| } | |||||
| /* L40: */ | |||||
| } | |||||
| } | |||||
| } else if (lsame_(norm, "I") || lsame_(norm, "O") || *(unsigned char *)norm == '1') { | |||||
| /* Find normI(A) ( = norm1(A), since A is hermitian). */ | |||||
| value = 0.f; | |||||
| if (lsame_(uplo, "U")) { | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| sum = 0.f; | |||||
| l = *k + 1 - j; | |||||
| /* Computing MAX */ | |||||
| i__3 = 1, i__2 = j - *k; | |||||
| i__4 = j - 1; | |||||
| for (i__ = f2cmax(i__3,i__2); i__ <= i__4; ++i__) { | |||||
| absa = c_abs(&ab[l + i__ + j * ab_dim1]); | |||||
| sum += absa; | |||||
| work[i__] += absa; | |||||
| /* L50: */ | |||||
| } | |||||
| i__4 = *k + 1 + j * ab_dim1; | |||||
| work[j] = sum + (r__1 = ab[i__4].r, abs(r__1)); | |||||
| /* L60: */ | |||||
| } | |||||
| i__1 = *n; | |||||
| for (i__ = 1; i__ <= i__1; ++i__) { | |||||
| sum = work[i__]; | |||||
| if (value < sum || sisnan_(&sum)) { | |||||
| value = sum; | |||||
| } | |||||
| /* L70: */ | |||||
| } | |||||
| } else { | |||||
| i__1 = *n; | |||||
| for (i__ = 1; i__ <= i__1; ++i__) { | |||||
| work[i__] = 0.f; | |||||
| /* L80: */ | |||||
| } | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| i__4 = j * ab_dim1 + 1; | |||||
| sum = work[j] + (r__1 = ab[i__4].r, abs(r__1)); | |||||
| l = 1 - j; | |||||
| /* Computing MIN */ | |||||
| i__3 = *n, i__2 = j + *k; | |||||
| i__4 = f2cmin(i__3,i__2); | |||||
| for (i__ = j + 1; i__ <= i__4; ++i__) { | |||||
| absa = c_abs(&ab[l + i__ + j * ab_dim1]); | |||||
| sum += absa; | |||||
| work[i__] += absa; | |||||
| /* L90: */ | |||||
| } | |||||
| if (value < sum || sisnan_(&sum)) { | |||||
| value = sum; | |||||
| } | |||||
| /* L100: */ | |||||
| } | |||||
| } | |||||
| } else if (lsame_(norm, "F") || lsame_(norm, "E")) { | |||||
| /* Find normF(A). */ | |||||
| /* SSQ(1) is scale */ | |||||
| /* SSQ(2) is sum-of-squares */ | |||||
| /* For better accuracy, sum each column separately. */ | |||||
| ssq[0] = 0.f; | |||||
| ssq[1] = 1.f; | |||||
| /* Sum off-diagonals */ | |||||
| if (*k > 0) { | |||||
| if (lsame_(uplo, "U")) { | |||||
| i__1 = *n; | |||||
| for (j = 2; j <= i__1; ++j) { | |||||
| colssq[0] = 0.f; | |||||
| colssq[1] = 1.f; | |||||
| /* Computing MIN */ | |||||
| i__3 = j - 1; | |||||
| i__4 = f2cmin(i__3,*k); | |||||
| /* Computing MAX */ | |||||
| i__2 = *k + 2 - j; | |||||
| classq_(&i__4, &ab[f2cmax(i__2,1) + j * ab_dim1], &c__1, | |||||
| colssq, &colssq[1]); | |||||
| scombssq_(ssq, colssq); | |||||
| /* L110: */ | |||||
| } | |||||
| l = *k + 1; | |||||
| } else { | |||||
| i__1 = *n - 1; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| colssq[0] = 0.f; | |||||
| colssq[1] = 1.f; | |||||
| /* Computing MIN */ | |||||
| i__3 = *n - j; | |||||
| i__4 = f2cmin(i__3,*k); | |||||
| classq_(&i__4, &ab[j * ab_dim1 + 2], &c__1, colssq, & | |||||
| colssq[1]); | |||||
| scombssq_(ssq, colssq); | |||||
| /* L120: */ | |||||
| } | |||||
| l = 1; | |||||
| } | |||||
| ssq[1] *= 2; | |||||
| } else { | |||||
| l = 1; | |||||
| } | |||||
| /* Sum diagonal */ | |||||
| colssq[0] = 0.f; | |||||
| colssq[1] = 1.f; | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| i__4 = l + j * ab_dim1; | |||||
| if (ab[i__4].r != 0.f) { | |||||
| i__4 = l + j * ab_dim1; | |||||
| absa = (r__1 = ab[i__4].r, abs(r__1)); | |||||
| if (colssq[0] < absa) { | |||||
| /* Computing 2nd power */ | |||||
| r__1 = colssq[0] / absa; | |||||
| colssq[1] = colssq[1] * (r__1 * r__1) + 1.f; | |||||
| colssq[0] = absa; | |||||
| } else { | |||||
| /* Computing 2nd power */ | |||||
| r__1 = absa / colssq[0]; | |||||
| colssq[1] += r__1 * r__1; | |||||
| } | |||||
| } | |||||
| /* L130: */ | |||||
| } | |||||
| scombssq_(ssq, colssq); | |||||
| value = ssq[0] * sqrt(ssq[1]); | |||||
| } | |||||
| ret_val = value; | |||||
| return ret_val; | |||||
| /* End of CLANHB */ | |||||
| } /* clanhb_ */ | |||||
| @@ -0,0 +1,713 @@ | |||||
| /* f2c.h -- Standard Fortran to C header file */ | |||||
| /** barf [ba:rf] 2. "He suggested using FORTRAN, and everybody barfed." | |||||
| - From The Shogakukan DICTIONARY OF NEW ENGLISH (Second edition) */ | |||||
| #ifndef F2C_INCLUDE | |||||
| #define F2C_INCLUDE | |||||
| #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 | |||||
| typedef int 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; | |||||
| 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;} | |||||
| #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)); } | |||||
| #define c_div(c, a, b) {pCf(c) = Cf(a)/Cf(b);} | |||||
| #define z_div(c, a, b) {pCd(c) = Cd(a)/Cd(b);} | |||||
| #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) = conj(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) (cimag(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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotc_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void cdotu_(complex *z, integer *n_, complex *x, integer *incx_, complex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotu_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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) | |||||
| */ | |||||
| /* Table of constant values */ | |||||
| static integer c__1 = 1; | |||||
| /* > \brief \b CLANHE returns the value of the 1-norm, or the Frobenius norm, or the infinity norm, or the ele | |||||
| ment of largest absolute value of a complex Hermitian matrix. */ | |||||
| /* =========== DOCUMENTATION =========== */ | |||||
| /* Online html documentation available at */ | |||||
| /* http://www.netlib.org/lapack/explore-html/ */ | |||||
| /* > \htmlonly */ | |||||
| /* > Download CLANHE + dependencies */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/clanhe. | |||||
| f"> */ | |||||
| /* > [TGZ]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/clanhe. | |||||
| f"> */ | |||||
| /* > [ZIP]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/clanhe. | |||||
| f"> */ | |||||
| /* > [TXT]</a> */ | |||||
| /* > \endhtmlonly */ | |||||
| /* Definition: */ | |||||
| /* =========== */ | |||||
| /* REAL FUNCTION CLANHE( NORM, UPLO, N, A, LDA, WORK ) */ | |||||
| /* CHARACTER NORM, UPLO */ | |||||
| /* INTEGER LDA, N */ | |||||
| /* REAL WORK( * ) */ | |||||
| /* COMPLEX A( LDA, * ) */ | |||||
| /* > \par Purpose: */ | |||||
| /* ============= */ | |||||
| /* > */ | |||||
| /* > \verbatim */ | |||||
| /* > */ | |||||
| /* > CLANHE returns the value of the one norm, or the Frobenius norm, or */ | |||||
| /* > the infinity norm, or the element of largest absolute value of a */ | |||||
| /* > complex hermitian matrix A. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \return CLANHE */ | |||||
| /* > \verbatim */ | |||||
| /* > */ | |||||
| /* > CLANHE = ( f2cmax(abs(A(i,j))), NORM = 'M' or 'm' */ | |||||
| /* > ( */ | |||||
| /* > ( norm1(A), NORM = '1', 'O' or 'o' */ | |||||
| /* > ( */ | |||||
| /* > ( normI(A), NORM = 'I' or 'i' */ | |||||
| /* > ( */ | |||||
| /* > ( normF(A), NORM = 'F', 'f', 'E' or 'e' */ | |||||
| /* > */ | |||||
| /* > where norm1 denotes the one norm of a matrix (maximum column sum), */ | |||||
| /* > normI denotes the infinity norm of a matrix (maximum row sum) and */ | |||||
| /* > normF denotes the Frobenius norm of a matrix (square root of sum of */ | |||||
| /* > squares). Note that f2cmax(abs(A(i,j))) is not a consistent matrix norm. */ | |||||
| /* > \endverbatim */ | |||||
| /* Arguments: */ | |||||
| /* ========== */ | |||||
| /* > \param[in] NORM */ | |||||
| /* > \verbatim */ | |||||
| /* > NORM is CHARACTER*1 */ | |||||
| /* > Specifies the value to be returned in CLANHE as described */ | |||||
| /* > above. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] UPLO */ | |||||
| /* > \verbatim */ | |||||
| /* > UPLO is CHARACTER*1 */ | |||||
| /* > Specifies whether the upper or lower triangular part of the */ | |||||
| /* > hermitian matrix A is to be referenced. */ | |||||
| /* > = 'U': Upper triangular part of A is referenced */ | |||||
| /* > = 'L': Lower triangular part of A is referenced */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] N */ | |||||
| /* > \verbatim */ | |||||
| /* > N is INTEGER */ | |||||
| /* > The order of the matrix A. N >= 0. When N = 0, CLANHE is */ | |||||
| /* > set to zero. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] A */ | |||||
| /* > \verbatim */ | |||||
| /* > A is COMPLEX array, dimension (LDA,N) */ | |||||
| /* > The hermitian matrix A. If UPLO = 'U', the leading n by n */ | |||||
| /* > upper triangular part of A contains the upper triangular part */ | |||||
| /* > of the matrix A, and the strictly lower triangular part of A */ | |||||
| /* > is not referenced. If UPLO = 'L', the leading n by n lower */ | |||||
| /* > triangular part of A contains the lower triangular part of */ | |||||
| /* > the matrix A, and the strictly upper triangular part of A is */ | |||||
| /* > not referenced. Note that the imaginary parts of the diagonal */ | |||||
| /* > elements need not be set and are assumed to be zero. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] LDA */ | |||||
| /* > \verbatim */ | |||||
| /* > LDA is INTEGER */ | |||||
| /* > The leading dimension of the array A. LDA >= f2cmax(N,1). */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] WORK */ | |||||
| /* > \verbatim */ | |||||
| /* > WORK is REAL array, dimension (MAX(1,LWORK)), */ | |||||
| /* > where LWORK >= N when NORM = 'I' or '1' or 'O'; otherwise, */ | |||||
| /* > WORK is not referenced. */ | |||||
| /* > \endverbatim */ | |||||
| /* Authors: */ | |||||
| /* ======== */ | |||||
| /* > \author Univ. of Tennessee */ | |||||
| /* > \author Univ. of California Berkeley */ | |||||
| /* > \author Univ. of Colorado Denver */ | |||||
| /* > \author NAG Ltd. */ | |||||
| /* > \date December 2016 */ | |||||
| /* > \ingroup complexHEauxiliary */ | |||||
| /* ===================================================================== */ | |||||
| real clanhe_(char *norm, char *uplo, integer *n, complex *a, integer *lda, | |||||
| real *work) | |||||
| { | |||||
| /* System generated locals */ | |||||
| integer a_dim1, a_offset, i__1, i__2; | |||||
| real ret_val, r__1; | |||||
| /* Local variables */ | |||||
| real absa; | |||||
| extern /* Subroutine */ int scombssq_(real *, real *); | |||||
| integer i__, j; | |||||
| extern logical lsame_(char *, char *); | |||||
| real value; | |||||
| extern /* Subroutine */ int classq_(integer *, complex *, integer *, real | |||||
| *, real *); | |||||
| extern logical sisnan_(real *); | |||||
| real colssq[2], sum, ssq[2]; | |||||
| /* -- LAPACK auxiliary routine (version 3.7.0) -- */ | |||||
| /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ | |||||
| /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ | |||||
| /* December 2016 */ | |||||
| /* ===================================================================== */ | |||||
| /* Parameter adjustments */ | |||||
| a_dim1 = *lda; | |||||
| a_offset = 1 + a_dim1 * 1; | |||||
| a -= a_offset; | |||||
| --work; | |||||
| /* Function Body */ | |||||
| if (*n == 0) { | |||||
| value = 0.f; | |||||
| } else if (lsame_(norm, "M")) { | |||||
| /* Find f2cmax(abs(A(i,j))). */ | |||||
| value = 0.f; | |||||
| if (lsame_(uplo, "U")) { | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| i__2 = j - 1; | |||||
| for (i__ = 1; i__ <= i__2; ++i__) { | |||||
| sum = c_abs(&a[i__ + j * a_dim1]); | |||||
| if (value < sum || sisnan_(&sum)) { | |||||
| value = sum; | |||||
| } | |||||
| /* L10: */ | |||||
| } | |||||
| i__2 = j + j * a_dim1; | |||||
| sum = (r__1 = a[i__2].r, abs(r__1)); | |||||
| if (value < sum || sisnan_(&sum)) { | |||||
| value = sum; | |||||
| } | |||||
| /* L20: */ | |||||
| } | |||||
| } else { | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| i__2 = j + j * a_dim1; | |||||
| sum = (r__1 = a[i__2].r, abs(r__1)); | |||||
| if (value < sum || sisnan_(&sum)) { | |||||
| value = sum; | |||||
| } | |||||
| i__2 = *n; | |||||
| for (i__ = j + 1; i__ <= i__2; ++i__) { | |||||
| sum = c_abs(&a[i__ + j * a_dim1]); | |||||
| if (value < sum || sisnan_(&sum)) { | |||||
| value = sum; | |||||
| } | |||||
| /* L30: */ | |||||
| } | |||||
| /* L40: */ | |||||
| } | |||||
| } | |||||
| } else if (lsame_(norm, "I") || lsame_(norm, "O") || *(unsigned char *)norm == '1') { | |||||
| /* Find normI(A) ( = norm1(A), since A is hermitian). */ | |||||
| value = 0.f; | |||||
| if (lsame_(uplo, "U")) { | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| sum = 0.f; | |||||
| i__2 = j - 1; | |||||
| for (i__ = 1; i__ <= i__2; ++i__) { | |||||
| absa = c_abs(&a[i__ + j * a_dim1]); | |||||
| sum += absa; | |||||
| work[i__] += absa; | |||||
| /* L50: */ | |||||
| } | |||||
| i__2 = j + j * a_dim1; | |||||
| work[j] = sum + (r__1 = a[i__2].r, abs(r__1)); | |||||
| /* L60: */ | |||||
| } | |||||
| i__1 = *n; | |||||
| for (i__ = 1; i__ <= i__1; ++i__) { | |||||
| sum = work[i__]; | |||||
| if (value < sum || sisnan_(&sum)) { | |||||
| value = sum; | |||||
| } | |||||
| /* L70: */ | |||||
| } | |||||
| } else { | |||||
| i__1 = *n; | |||||
| for (i__ = 1; i__ <= i__1; ++i__) { | |||||
| work[i__] = 0.f; | |||||
| /* L80: */ | |||||
| } | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| i__2 = j + j * a_dim1; | |||||
| sum = work[j] + (r__1 = a[i__2].r, abs(r__1)); | |||||
| i__2 = *n; | |||||
| for (i__ = j + 1; i__ <= i__2; ++i__) { | |||||
| absa = c_abs(&a[i__ + j * a_dim1]); | |||||
| sum += absa; | |||||
| work[i__] += absa; | |||||
| /* L90: */ | |||||
| } | |||||
| if (value < sum || sisnan_(&sum)) { | |||||
| value = sum; | |||||
| } | |||||
| /* L100: */ | |||||
| } | |||||
| } | |||||
| } else if (lsame_(norm, "F") || lsame_(norm, "E")) { | |||||
| /* Find normF(A). */ | |||||
| /* SSQ(1) is scale */ | |||||
| /* SSQ(2) is sum-of-squares */ | |||||
| /* For better accuracy, sum each column separately. */ | |||||
| ssq[0] = 0.f; | |||||
| ssq[1] = 1.f; | |||||
| /* Sum off-diagonals */ | |||||
| if (lsame_(uplo, "U")) { | |||||
| i__1 = *n; | |||||
| for (j = 2; j <= i__1; ++j) { | |||||
| colssq[0] = 0.f; | |||||
| colssq[1] = 1.f; | |||||
| i__2 = j - 1; | |||||
| classq_(&i__2, &a[j * a_dim1 + 1], &c__1, colssq, &colssq[1]); | |||||
| scombssq_(ssq, colssq); | |||||
| /* L110: */ | |||||
| } | |||||
| } else { | |||||
| i__1 = *n - 1; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| colssq[0] = 0.f; | |||||
| colssq[1] = 1.f; | |||||
| i__2 = *n - j; | |||||
| classq_(&i__2, &a[j + 1 + j * a_dim1], &c__1, colssq, &colssq[ | |||||
| 1]); | |||||
| scombssq_(ssq, colssq); | |||||
| /* L120: */ | |||||
| } | |||||
| } | |||||
| ssq[1] *= 2; | |||||
| /* Sum diagonal */ | |||||
| i__1 = *n; | |||||
| for (i__ = 1; i__ <= i__1; ++i__) { | |||||
| i__2 = i__ + i__ * a_dim1; | |||||
| if (a[i__2].r != 0.f) { | |||||
| i__2 = i__ + i__ * a_dim1; | |||||
| absa = (r__1 = a[i__2].r, abs(r__1)); | |||||
| if (ssq[0] < absa) { | |||||
| /* Computing 2nd power */ | |||||
| r__1 = ssq[0] / absa; | |||||
| ssq[1] = ssq[1] * (r__1 * r__1) + 1.f; | |||||
| ssq[0] = absa; | |||||
| } else { | |||||
| /* Computing 2nd power */ | |||||
| r__1 = absa / ssq[0]; | |||||
| ssq[1] += r__1 * r__1; | |||||
| } | |||||
| } | |||||
| /* L130: */ | |||||
| } | |||||
| value = ssq[0] * sqrt(ssq[1]); | |||||
| } | |||||
| ret_val = value; | |||||
| return ret_val; | |||||
| /* End of CLANHE */ | |||||
| } /* clanhe_ */ | |||||
| @@ -0,0 +1,723 @@ | |||||
| /* f2c.h -- Standard Fortran to C header file */ | |||||
| /** barf [ba:rf] 2. "He suggested using FORTRAN, and everybody barfed." | |||||
| - From The Shogakukan DICTIONARY OF NEW ENGLISH (Second edition) */ | |||||
| #ifndef F2C_INCLUDE | |||||
| #define F2C_INCLUDE | |||||
| #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 | |||||
| typedef int 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; | |||||
| 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;} | |||||
| #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)); } | |||||
| #define c_div(c, a, b) {pCf(c) = Cf(a)/Cf(b);} | |||||
| #define z_div(c, a, b) {pCd(c) = Cd(a)/Cd(b);} | |||||
| #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) = conj(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) (cimag(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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotc_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void cdotu_(complex *z, integer *n_, complex *x, integer *incx_, complex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotu_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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) | |||||
| */ | |||||
| /* Table of constant values */ | |||||
| static integer c__1 = 1; | |||||
| /* > \brief \b CLANHP returns the value of the 1-norm, or the Frobenius norm, or the infinity norm, or the ele | |||||
| ment of largest absolute value of a complex Hermitian matrix supplied in packed form. */ | |||||
| /* =========== DOCUMENTATION =========== */ | |||||
| /* Online html documentation available at */ | |||||
| /* http://www.netlib.org/lapack/explore-html/ */ | |||||
| /* > \htmlonly */ | |||||
| /* > Download CLANHP + dependencies */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/clanhp. | |||||
| f"> */ | |||||
| /* > [TGZ]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/clanhp. | |||||
| f"> */ | |||||
| /* > [ZIP]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/clanhp. | |||||
| f"> */ | |||||
| /* > [TXT]</a> */ | |||||
| /* > \endhtmlonly */ | |||||
| /* Definition: */ | |||||
| /* =========== */ | |||||
| /* REAL FUNCTION CLANHP( NORM, UPLO, N, AP, WORK ) */ | |||||
| /* CHARACTER NORM, UPLO */ | |||||
| /* INTEGER N */ | |||||
| /* REAL WORK( * ) */ | |||||
| /* COMPLEX AP( * ) */ | |||||
| /* > \par Purpose: */ | |||||
| /* ============= */ | |||||
| /* > */ | |||||
| /* > \verbatim */ | |||||
| /* > */ | |||||
| /* > CLANHP returns the value of the one norm, or the Frobenius norm, or */ | |||||
| /* > the infinity norm, or the element of largest absolute value of a */ | |||||
| /* > complex hermitian matrix A, supplied in packed form. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \return CLANHP */ | |||||
| /* > \verbatim */ | |||||
| /* > */ | |||||
| /* > CLANHP = ( f2cmax(abs(A(i,j))), NORM = 'M' or 'm' */ | |||||
| /* > ( */ | |||||
| /* > ( norm1(A), NORM = '1', 'O' or 'o' */ | |||||
| /* > ( */ | |||||
| /* > ( normI(A), NORM = 'I' or 'i' */ | |||||
| /* > ( */ | |||||
| /* > ( normF(A), NORM = 'F', 'f', 'E' or 'e' */ | |||||
| /* > */ | |||||
| /* > where norm1 denotes the one norm of a matrix (maximum column sum), */ | |||||
| /* > normI denotes the infinity norm of a matrix (maximum row sum) and */ | |||||
| /* > normF denotes the Frobenius norm of a matrix (square root of sum of */ | |||||
| /* > squares). Note that f2cmax(abs(A(i,j))) is not a consistent matrix norm. */ | |||||
| /* > \endverbatim */ | |||||
| /* Arguments: */ | |||||
| /* ========== */ | |||||
| /* > \param[in] NORM */ | |||||
| /* > \verbatim */ | |||||
| /* > NORM is CHARACTER*1 */ | |||||
| /* > Specifies the value to be returned in CLANHP as described */ | |||||
| /* > above. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] UPLO */ | |||||
| /* > \verbatim */ | |||||
| /* > UPLO is CHARACTER*1 */ | |||||
| /* > Specifies whether the upper or lower triangular part of the */ | |||||
| /* > hermitian matrix A is supplied. */ | |||||
| /* > = 'U': Upper triangular part of A is supplied */ | |||||
| /* > = 'L': Lower triangular part of A is supplied */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] N */ | |||||
| /* > \verbatim */ | |||||
| /* > N is INTEGER */ | |||||
| /* > The order of the matrix A. N >= 0. When N = 0, CLANHP is */ | |||||
| /* > set to zero. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] AP */ | |||||
| /* > \verbatim */ | |||||
| /* > AP is COMPLEX array, dimension (N*(N+1)/2) */ | |||||
| /* > The upper or lower triangle of the hermitian matrix A, packed */ | |||||
| /* > columnwise in a linear array. The j-th column of A is stored */ | |||||
| /* > in the array AP as follows: */ | |||||
| /* > if UPLO = 'U', AP(i + (j-1)*j/2) = A(i,j) for 1<=i<=j; */ | |||||
| /* > if UPLO = 'L', AP(i + (j-1)*(2n-j)/2) = A(i,j) for j<=i<=n. */ | |||||
| /* > Note that the imaginary parts of the diagonal elements need */ | |||||
| /* > not be set and are assumed to be zero. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] WORK */ | |||||
| /* > \verbatim */ | |||||
| /* > WORK is REAL array, dimension (MAX(1,LWORK)), */ | |||||
| /* > where LWORK >= N when NORM = 'I' or '1' or 'O'; otherwise, */ | |||||
| /* > WORK is not referenced. */ | |||||
| /* > \endverbatim */ | |||||
| /* Authors: */ | |||||
| /* ======== */ | |||||
| /* > \author Univ. of Tennessee */ | |||||
| /* > \author Univ. of California Berkeley */ | |||||
| /* > \author Univ. of Colorado Denver */ | |||||
| /* > \author NAG Ltd. */ | |||||
| /* > \date December 2016 */ | |||||
| /* > \ingroup complexOTHERauxiliary */ | |||||
| /* ===================================================================== */ | |||||
| real clanhp_(char *norm, char *uplo, integer *n, complex *ap, real *work) | |||||
| { | |||||
| /* System generated locals */ | |||||
| integer i__1, i__2; | |||||
| real ret_val, r__1; | |||||
| /* Local variables */ | |||||
| real absa; | |||||
| extern /* Subroutine */ int scombssq_(real *, real *); | |||||
| integer i__, j, k; | |||||
| extern logical lsame_(char *, char *); | |||||
| real value; | |||||
| extern /* Subroutine */ int classq_(integer *, complex *, integer *, real | |||||
| *, real *); | |||||
| extern logical sisnan_(real *); | |||||
| real colssq[2], sum, ssq[2]; | |||||
| /* -- LAPACK auxiliary routine (version 3.7.0) -- */ | |||||
| /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ | |||||
| /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ | |||||
| /* December 2016 */ | |||||
| /* ===================================================================== */ | |||||
| /* Parameter adjustments */ | |||||
| --work; | |||||
| --ap; | |||||
| /* Function Body */ | |||||
| if (*n == 0) { | |||||
| value = 0.f; | |||||
| } else if (lsame_(norm, "M")) { | |||||
| /* Find f2cmax(abs(A(i,j))). */ | |||||
| value = 0.f; | |||||
| if (lsame_(uplo, "U")) { | |||||
| k = 0; | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| i__2 = k + j - 1; | |||||
| for (i__ = k + 1; i__ <= i__2; ++i__) { | |||||
| sum = c_abs(&ap[i__]); | |||||
| if (value < sum || sisnan_(&sum)) { | |||||
| value = sum; | |||||
| } | |||||
| /* L10: */ | |||||
| } | |||||
| k += j; | |||||
| i__2 = k; | |||||
| sum = (r__1 = ap[i__2].r, abs(r__1)); | |||||
| if (value < sum || sisnan_(&sum)) { | |||||
| value = sum; | |||||
| } | |||||
| /* L20: */ | |||||
| } | |||||
| } else { | |||||
| k = 1; | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| i__2 = k; | |||||
| sum = (r__1 = ap[i__2].r, abs(r__1)); | |||||
| if (value < sum || sisnan_(&sum)) { | |||||
| value = sum; | |||||
| } | |||||
| i__2 = k + *n - j; | |||||
| for (i__ = k + 1; i__ <= i__2; ++i__) { | |||||
| sum = c_abs(&ap[i__]); | |||||
| if (value < sum || sisnan_(&sum)) { | |||||
| value = sum; | |||||
| } | |||||
| /* L30: */ | |||||
| } | |||||
| k = k + *n - j + 1; | |||||
| /* L40: */ | |||||
| } | |||||
| } | |||||
| } else if (lsame_(norm, "I") || lsame_(norm, "O") || *(unsigned char *)norm == '1') { | |||||
| /* Find normI(A) ( = norm1(A), since A is hermitian). */ | |||||
| value = 0.f; | |||||
| k = 1; | |||||
| if (lsame_(uplo, "U")) { | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| sum = 0.f; | |||||
| i__2 = j - 1; | |||||
| for (i__ = 1; i__ <= i__2; ++i__) { | |||||
| absa = c_abs(&ap[k]); | |||||
| sum += absa; | |||||
| work[i__] += absa; | |||||
| ++k; | |||||
| /* L50: */ | |||||
| } | |||||
| i__2 = k; | |||||
| work[j] = sum + (r__1 = ap[i__2].r, abs(r__1)); | |||||
| ++k; | |||||
| /* L60: */ | |||||
| } | |||||
| i__1 = *n; | |||||
| for (i__ = 1; i__ <= i__1; ++i__) { | |||||
| sum = work[i__]; | |||||
| if (value < sum || sisnan_(&sum)) { | |||||
| value = sum; | |||||
| } | |||||
| /* L70: */ | |||||
| } | |||||
| } else { | |||||
| i__1 = *n; | |||||
| for (i__ = 1; i__ <= i__1; ++i__) { | |||||
| work[i__] = 0.f; | |||||
| /* L80: */ | |||||
| } | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| i__2 = k; | |||||
| sum = work[j] + (r__1 = ap[i__2].r, abs(r__1)); | |||||
| ++k; | |||||
| i__2 = *n; | |||||
| for (i__ = j + 1; i__ <= i__2; ++i__) { | |||||
| absa = c_abs(&ap[k]); | |||||
| sum += absa; | |||||
| work[i__] += absa; | |||||
| ++k; | |||||
| /* L90: */ | |||||
| } | |||||
| if (value < sum || sisnan_(&sum)) { | |||||
| value = sum; | |||||
| } | |||||
| /* L100: */ | |||||
| } | |||||
| } | |||||
| } else if (lsame_(norm, "F") || lsame_(norm, "E")) { | |||||
| /* Find normF(A). */ | |||||
| /* SSQ(1) is scale */ | |||||
| /* SSQ(2) is sum-of-squares */ | |||||
| /* For better accuracy, sum each column separately. */ | |||||
| ssq[0] = 0.f; | |||||
| ssq[1] = 1.f; | |||||
| /* Sum off-diagonals */ | |||||
| k = 2; | |||||
| if (lsame_(uplo, "U")) { | |||||
| i__1 = *n; | |||||
| for (j = 2; j <= i__1; ++j) { | |||||
| colssq[0] = 0.f; | |||||
| colssq[1] = 1.f; | |||||
| i__2 = j - 1; | |||||
| classq_(&i__2, &ap[k], &c__1, colssq, &colssq[1]); | |||||
| scombssq_(ssq, colssq); | |||||
| k += j; | |||||
| /* L110: */ | |||||
| } | |||||
| } else { | |||||
| i__1 = *n - 1; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| colssq[0] = 0.f; | |||||
| colssq[1] = 1.f; | |||||
| i__2 = *n - j; | |||||
| classq_(&i__2, &ap[k], &c__1, colssq, &colssq[1]); | |||||
| scombssq_(ssq, colssq); | |||||
| k = k + *n - j + 1; | |||||
| /* L120: */ | |||||
| } | |||||
| } | |||||
| ssq[1] *= 2; | |||||
| /* Sum diagonal */ | |||||
| k = 1; | |||||
| colssq[0] = 0.f; | |||||
| colssq[1] = 1.f; | |||||
| i__1 = *n; | |||||
| for (i__ = 1; i__ <= i__1; ++i__) { | |||||
| i__2 = k; | |||||
| if (ap[i__2].r != 0.f) { | |||||
| i__2 = k; | |||||
| absa = (r__1 = ap[i__2].r, abs(r__1)); | |||||
| if (colssq[0] < absa) { | |||||
| /* Computing 2nd power */ | |||||
| r__1 = colssq[0] / absa; | |||||
| colssq[1] = colssq[1] * (r__1 * r__1) + 1.f; | |||||
| colssq[0] = absa; | |||||
| } else { | |||||
| /* Computing 2nd power */ | |||||
| r__1 = absa / colssq[0]; | |||||
| colssq[1] += r__1 * r__1; | |||||
| } | |||||
| } | |||||
| if (lsame_(uplo, "U")) { | |||||
| k = k + i__ + 1; | |||||
| } else { | |||||
| k = k + *n - i__ + 1; | |||||
| } | |||||
| /* L130: */ | |||||
| } | |||||
| scombssq_(ssq, colssq); | |||||
| value = ssq[0] * sqrt(ssq[1]); | |||||
| } | |||||
| ret_val = value; | |||||
| return ret_val; | |||||
| /* End of CLANHP */ | |||||
| } /* clanhp_ */ | |||||
| @@ -0,0 +1,635 @@ | |||||
| /* f2c.h -- Standard Fortran to C header file */ | |||||
| /** barf [ba:rf] 2. "He suggested using FORTRAN, and everybody barfed." | |||||
| - From The Shogakukan DICTIONARY OF NEW ENGLISH (Second edition) */ | |||||
| #ifndef F2C_INCLUDE | |||||
| #define F2C_INCLUDE | |||||
| #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 | |||||
| typedef int 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; | |||||
| 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;} | |||||
| #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)); } | |||||
| #define c_div(c, a, b) {pCf(c) = Cf(a)/Cf(b);} | |||||
| #define z_div(c, a, b) {pCd(c) = Cd(a)/Cd(b);} | |||||
| #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) = conj(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) (cimag(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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotc_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void cdotu_(complex *z, integer *n_, complex *x, integer *incx_, complex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotu_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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) | |||||
| */ | |||||
| /* Table of constant values */ | |||||
| static integer c__1 = 1; | |||||
| /* > \brief \b CLANHS returns the value of the 1-norm, Frobenius norm, infinity-norm, or the largest absolute | |||||
| value of any element of an upper Hessenberg matrix. */ | |||||
| /* =========== DOCUMENTATION =========== */ | |||||
| /* Online html documentation available at */ | |||||
| /* http://www.netlib.org/lapack/explore-html/ */ | |||||
| /* > \htmlonly */ | |||||
| /* > Download CLANHS + dependencies */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/clanhs. | |||||
| f"> */ | |||||
| /* > [TGZ]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/clanhs. | |||||
| f"> */ | |||||
| /* > [ZIP]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/clanhs. | |||||
| f"> */ | |||||
| /* > [TXT]</a> */ | |||||
| /* > \endhtmlonly */ | |||||
| /* Definition: */ | |||||
| /* =========== */ | |||||
| /* REAL FUNCTION CLANHS( NORM, N, A, LDA, WORK ) */ | |||||
| /* CHARACTER NORM */ | |||||
| /* INTEGER LDA, N */ | |||||
| /* REAL WORK( * ) */ | |||||
| /* COMPLEX A( LDA, * ) */ | |||||
| /* > \par Purpose: */ | |||||
| /* ============= */ | |||||
| /* > */ | |||||
| /* > \verbatim */ | |||||
| /* > */ | |||||
| /* > CLANHS returns the value of the one norm, or the Frobenius norm, or */ | |||||
| /* > the infinity norm, or the element of largest absolute value of a */ | |||||
| /* > Hessenberg matrix A. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \return CLANHS */ | |||||
| /* > \verbatim */ | |||||
| /* > */ | |||||
| /* > CLANHS = ( f2cmax(abs(A(i,j))), NORM = 'M' or 'm' */ | |||||
| /* > ( */ | |||||
| /* > ( norm1(A), NORM = '1', 'O' or 'o' */ | |||||
| /* > ( */ | |||||
| /* > ( normI(A), NORM = 'I' or 'i' */ | |||||
| /* > ( */ | |||||
| /* > ( normF(A), NORM = 'F', 'f', 'E' or 'e' */ | |||||
| /* > */ | |||||
| /* > where norm1 denotes the one norm of a matrix (maximum column sum), */ | |||||
| /* > normI denotes the infinity norm of a matrix (maximum row sum) and */ | |||||
| /* > normF denotes the Frobenius norm of a matrix (square root of sum of */ | |||||
| /* > squares). Note that f2cmax(abs(A(i,j))) is not a consistent matrix norm. */ | |||||
| /* > \endverbatim */ | |||||
| /* Arguments: */ | |||||
| /* ========== */ | |||||
| /* > \param[in] NORM */ | |||||
| /* > \verbatim */ | |||||
| /* > NORM is CHARACTER*1 */ | |||||
| /* > Specifies the value to be returned in CLANHS as described */ | |||||
| /* > above. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] N */ | |||||
| /* > \verbatim */ | |||||
| /* > N is INTEGER */ | |||||
| /* > The order of the matrix A. N >= 0. When N = 0, CLANHS is */ | |||||
| /* > set to zero. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] A */ | |||||
| /* > \verbatim */ | |||||
| /* > A is COMPLEX array, dimension (LDA,N) */ | |||||
| /* > The n by n upper Hessenberg matrix A; the part of A below the */ | |||||
| /* > first sub-diagonal is not referenced. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] LDA */ | |||||
| /* > \verbatim */ | |||||
| /* > LDA is INTEGER */ | |||||
| /* > The leading dimension of the array A. LDA >= f2cmax(N,1). */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] WORK */ | |||||
| /* > \verbatim */ | |||||
| /* > WORK is REAL array, dimension (MAX(1,LWORK)), */ | |||||
| /* > where LWORK >= N when NORM = 'I'; otherwise, WORK is not */ | |||||
| /* > referenced. */ | |||||
| /* > \endverbatim */ | |||||
| /* Authors: */ | |||||
| /* ======== */ | |||||
| /* > \author Univ. of Tennessee */ | |||||
| /* > \author Univ. of California Berkeley */ | |||||
| /* > \author Univ. of Colorado Denver */ | |||||
| /* > \author NAG Ltd. */ | |||||
| /* > \date December 2016 */ | |||||
| /* > \ingroup complexOTHERauxiliary */ | |||||
| /* ===================================================================== */ | |||||
| real clanhs_(char *norm, integer *n, complex *a, integer *lda, real *work) | |||||
| { | |||||
| /* System generated locals */ | |||||
| integer a_dim1, a_offset, i__1, i__2, i__3, i__4; | |||||
| real ret_val; | |||||
| /* Local variables */ | |||||
| extern /* Subroutine */ int scombssq_(real *, real *); | |||||
| integer i__, j; | |||||
| extern logical lsame_(char *, char *); | |||||
| real value; | |||||
| extern /* Subroutine */ int classq_(integer *, complex *, integer *, real | |||||
| *, real *); | |||||
| extern logical sisnan_(real *); | |||||
| real colssq[2], sum, ssq[2]; | |||||
| /* -- LAPACK auxiliary routine (version 3.7.0) -- */ | |||||
| /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ | |||||
| /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ | |||||
| /* December 2016 */ | |||||
| /* ===================================================================== */ | |||||
| /* Parameter adjustments */ | |||||
| a_dim1 = *lda; | |||||
| a_offset = 1 + a_dim1 * 1; | |||||
| a -= a_offset; | |||||
| --work; | |||||
| /* Function Body */ | |||||
| if (*n == 0) { | |||||
| value = 0.f; | |||||
| } else if (lsame_(norm, "M")) { | |||||
| /* Find f2cmax(abs(A(i,j))). */ | |||||
| value = 0.f; | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| /* Computing MIN */ | |||||
| i__3 = *n, i__4 = j + 1; | |||||
| i__2 = f2cmin(i__3,i__4); | |||||
| for (i__ = 1; i__ <= i__2; ++i__) { | |||||
| sum = c_abs(&a[i__ + j * a_dim1]); | |||||
| if (value < sum || sisnan_(&sum)) { | |||||
| value = sum; | |||||
| } | |||||
| /* L10: */ | |||||
| } | |||||
| /* L20: */ | |||||
| } | |||||
| } else if (lsame_(norm, "O") || *(unsigned char *) | |||||
| norm == '1') { | |||||
| /* Find norm1(A). */ | |||||
| value = 0.f; | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| sum = 0.f; | |||||
| /* Computing MIN */ | |||||
| i__3 = *n, i__4 = j + 1; | |||||
| i__2 = f2cmin(i__3,i__4); | |||||
| for (i__ = 1; i__ <= i__2; ++i__) { | |||||
| sum += c_abs(&a[i__ + j * a_dim1]); | |||||
| /* L30: */ | |||||
| } | |||||
| if (value < sum || sisnan_(&sum)) { | |||||
| value = sum; | |||||
| } | |||||
| /* L40: */ | |||||
| } | |||||
| } else if (lsame_(norm, "I")) { | |||||
| /* Find normI(A). */ | |||||
| i__1 = *n; | |||||
| for (i__ = 1; i__ <= i__1; ++i__) { | |||||
| work[i__] = 0.f; | |||||
| /* L50: */ | |||||
| } | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| /* Computing MIN */ | |||||
| i__3 = *n, i__4 = j + 1; | |||||
| i__2 = f2cmin(i__3,i__4); | |||||
| for (i__ = 1; i__ <= i__2; ++i__) { | |||||
| work[i__] += c_abs(&a[i__ + j * a_dim1]); | |||||
| /* L60: */ | |||||
| } | |||||
| /* L70: */ | |||||
| } | |||||
| value = 0.f; | |||||
| i__1 = *n; | |||||
| for (i__ = 1; i__ <= i__1; ++i__) { | |||||
| sum = work[i__]; | |||||
| if (value < sum || sisnan_(&sum)) { | |||||
| value = sum; | |||||
| } | |||||
| /* L80: */ | |||||
| } | |||||
| } else if (lsame_(norm, "F") || lsame_(norm, "E")) { | |||||
| /* Find normF(A). */ | |||||
| /* SSQ(1) is scale */ | |||||
| /* SSQ(2) is sum-of-squares */ | |||||
| /* For better accuracy, sum each column separately. */ | |||||
| ssq[0] = 0.f; | |||||
| ssq[1] = 1.f; | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| colssq[0] = 0.f; | |||||
| colssq[1] = 1.f; | |||||
| /* Computing MIN */ | |||||
| i__3 = *n, i__4 = j + 1; | |||||
| i__2 = f2cmin(i__3,i__4); | |||||
| classq_(&i__2, &a[j * a_dim1 + 1], &c__1, colssq, &colssq[1]); | |||||
| scombssq_(ssq, colssq); | |||||
| /* L90: */ | |||||
| } | |||||
| value = ssq[0] * sqrt(ssq[1]); | |||||
| } | |||||
| ret_val = value; | |||||
| return ret_val; | |||||
| /* End of CLANHS */ | |||||
| } /* clanhs_ */ | |||||
| @@ -0,0 +1,590 @@ | |||||
| /* f2c.h -- Standard Fortran to C header file */ | |||||
| /** barf [ba:rf] 2. "He suggested using FORTRAN, and everybody barfed." | |||||
| - From The Shogakukan DICTIONARY OF NEW ENGLISH (Second edition) */ | |||||
| #ifndef F2C_INCLUDE | |||||
| #define F2C_INCLUDE | |||||
| #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 | |||||
| typedef int 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; | |||||
| 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;} | |||||
| #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)); } | |||||
| #define c_div(c, a, b) {pCf(c) = Cf(a)/Cf(b);} | |||||
| #define z_div(c, a, b) {pCd(c) = Cd(a)/Cd(b);} | |||||
| #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) = conj(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) (cimag(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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotc_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void cdotu_(complex *z, integer *n_, complex *x, integer *incx_, complex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotu_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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) | |||||
| */ | |||||
| /* Table of constant values */ | |||||
| static integer c__1 = 1; | |||||
| /* > \brief \b CLANHT returns the value of the 1-norm, or the Frobenius norm, or the infinity norm, or the ele | |||||
| ment of largest absolute value of a complex Hermitian tridiagonal matrix. */ | |||||
| /* =========== DOCUMENTATION =========== */ | |||||
| /* Online html documentation available at */ | |||||
| /* http://www.netlib.org/lapack/explore-html/ */ | |||||
| /* > \htmlonly */ | |||||
| /* > Download CLANHT + dependencies */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/clanht. | |||||
| f"> */ | |||||
| /* > [TGZ]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/clanht. | |||||
| f"> */ | |||||
| /* > [ZIP]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/clanht. | |||||
| f"> */ | |||||
| /* > [TXT]</a> */ | |||||
| /* > \endhtmlonly */ | |||||
| /* Definition: */ | |||||
| /* =========== */ | |||||
| /* REAL FUNCTION CLANHT( NORM, N, D, E ) */ | |||||
| /* CHARACTER NORM */ | |||||
| /* INTEGER N */ | |||||
| /* REAL D( * ) */ | |||||
| /* COMPLEX E( * ) */ | |||||
| /* > \par Purpose: */ | |||||
| /* ============= */ | |||||
| /* > */ | |||||
| /* > \verbatim */ | |||||
| /* > */ | |||||
| /* > CLANHT returns the value of the one norm, or the Frobenius norm, or */ | |||||
| /* > the infinity norm, or the element of largest absolute value of a */ | |||||
| /* > complex Hermitian tridiagonal matrix A. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \return CLANHT */ | |||||
| /* > \verbatim */ | |||||
| /* > */ | |||||
| /* > CLANHT = ( f2cmax(abs(A(i,j))), NORM = 'M' or 'm' */ | |||||
| /* > ( */ | |||||
| /* > ( norm1(A), NORM = '1', 'O' or 'o' */ | |||||
| /* > ( */ | |||||
| /* > ( normI(A), NORM = 'I' or 'i' */ | |||||
| /* > ( */ | |||||
| /* > ( normF(A), NORM = 'F', 'f', 'E' or 'e' */ | |||||
| /* > */ | |||||
| /* > where norm1 denotes the one norm of a matrix (maximum column sum), */ | |||||
| /* > normI denotes the infinity norm of a matrix (maximum row sum) and */ | |||||
| /* > normF denotes the Frobenius norm of a matrix (square root of sum of */ | |||||
| /* > squares). Note that f2cmax(abs(A(i,j))) is not a consistent matrix norm. */ | |||||
| /* > \endverbatim */ | |||||
| /* Arguments: */ | |||||
| /* ========== */ | |||||
| /* > \param[in] NORM */ | |||||
| /* > \verbatim */ | |||||
| /* > NORM is CHARACTER*1 */ | |||||
| /* > Specifies the value to be returned in CLANHT as described */ | |||||
| /* > above. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] N */ | |||||
| /* > \verbatim */ | |||||
| /* > N is INTEGER */ | |||||
| /* > The order of the matrix A. N >= 0. When N = 0, CLANHT is */ | |||||
| /* > set to zero. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] D */ | |||||
| /* > \verbatim */ | |||||
| /* > D is REAL array, dimension (N) */ | |||||
| /* > The diagonal elements of A. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] E */ | |||||
| /* > \verbatim */ | |||||
| /* > E is COMPLEX array, dimension (N-1) */ | |||||
| /* > The (n-1) sub-diagonal or super-diagonal elements of A. */ | |||||
| /* > \endverbatim */ | |||||
| /* Authors: */ | |||||
| /* ======== */ | |||||
| /* > \author Univ. of Tennessee */ | |||||
| /* > \author Univ. of California Berkeley */ | |||||
| /* > \author Univ. of Colorado Denver */ | |||||
| /* > \author NAG Ltd. */ | |||||
| /* > \date December 2016 */ | |||||
| /* > \ingroup complexOTHERauxiliary */ | |||||
| /* ===================================================================== */ | |||||
| real clanht_(char *norm, integer *n, real *d__, complex *e) | |||||
| { | |||||
| /* System generated locals */ | |||||
| integer i__1; | |||||
| real ret_val, r__1; | |||||
| /* Local variables */ | |||||
| integer i__; | |||||
| real scale; | |||||
| extern logical lsame_(char *, char *); | |||||
| real anorm; | |||||
| extern /* Subroutine */ int classq_(integer *, complex *, integer *, real | |||||
| *, real *); | |||||
| extern logical sisnan_(real *); | |||||
| extern /* Subroutine */ int slassq_(integer *, real *, integer *, real *, | |||||
| real *); | |||||
| real sum; | |||||
| /* -- LAPACK auxiliary routine (version 3.7.0) -- */ | |||||
| /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ | |||||
| /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ | |||||
| /* December 2016 */ | |||||
| /* ===================================================================== */ | |||||
| /* Parameter adjustments */ | |||||
| --e; | |||||
| --d__; | |||||
| /* Function Body */ | |||||
| if (*n <= 0) { | |||||
| anorm = 0.f; | |||||
| } else if (lsame_(norm, "M")) { | |||||
| /* Find f2cmax(abs(A(i,j))). */ | |||||
| anorm = (r__1 = d__[*n], abs(r__1)); | |||||
| i__1 = *n - 1; | |||||
| for (i__ = 1; i__ <= i__1; ++i__) { | |||||
| sum = (r__1 = d__[i__], abs(r__1)); | |||||
| if (anorm < sum || sisnan_(&sum)) { | |||||
| anorm = sum; | |||||
| } | |||||
| sum = c_abs(&e[i__]); | |||||
| if (anorm < sum || sisnan_(&sum)) { | |||||
| anorm = sum; | |||||
| } | |||||
| /* L10: */ | |||||
| } | |||||
| } else if (lsame_(norm, "O") || *(unsigned char *) | |||||
| norm == '1' || lsame_(norm, "I")) { | |||||
| /* Find norm1(A). */ | |||||
| if (*n == 1) { | |||||
| anorm = abs(d__[1]); | |||||
| } else { | |||||
| anorm = abs(d__[1]) + c_abs(&e[1]); | |||||
| sum = c_abs(&e[*n - 1]) + (r__1 = d__[*n], abs(r__1)); | |||||
| if (anorm < sum || sisnan_(&sum)) { | |||||
| anorm = sum; | |||||
| } | |||||
| i__1 = *n - 1; | |||||
| for (i__ = 2; i__ <= i__1; ++i__) { | |||||
| sum = (r__1 = d__[i__], abs(r__1)) + c_abs(&e[i__]) + c_abs(& | |||||
| e[i__ - 1]); | |||||
| if (anorm < sum || sisnan_(&sum)) { | |||||
| anorm = sum; | |||||
| } | |||||
| /* L20: */ | |||||
| } | |||||
| } | |||||
| } else if (lsame_(norm, "F") || lsame_(norm, "E")) { | |||||
| /* Find normF(A). */ | |||||
| scale = 0.f; | |||||
| sum = 1.f; | |||||
| if (*n > 1) { | |||||
| i__1 = *n - 1; | |||||
| classq_(&i__1, &e[1], &c__1, &scale, &sum); | |||||
| sum *= 2; | |||||
| } | |||||
| slassq_(n, &d__[1], &c__1, &scale, &sum); | |||||
| anorm = scale * sqrt(sum); | |||||
| } | |||||
| ret_val = anorm; | |||||
| return ret_val; | |||||
| /* End of CLANHT */ | |||||
| } /* clanht_ */ | |||||
| @@ -0,0 +1,714 @@ | |||||
| /* f2c.h -- Standard Fortran to C header file */ | |||||
| /** barf [ba:rf] 2. "He suggested using FORTRAN, and everybody barfed." | |||||
| - From The Shogakukan DICTIONARY OF NEW ENGLISH (Second edition) */ | |||||
| #ifndef F2C_INCLUDE | |||||
| #define F2C_INCLUDE | |||||
| #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 | |||||
| typedef int 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; | |||||
| 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;} | |||||
| #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)); } | |||||
| #define c_div(c, a, b) {pCf(c) = Cf(a)/Cf(b);} | |||||
| #define z_div(c, a, b) {pCd(c) = Cd(a)/Cd(b);} | |||||
| #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) = conj(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) (cimag(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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotc_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void cdotu_(complex *z, integer *n_, complex *x, integer *incx_, complex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotu_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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) | |||||
| */ | |||||
| /* Table of constant values */ | |||||
| static integer c__1 = 1; | |||||
| /* > \brief \b CLANSB returns the value of the 1-norm, or the Frobenius norm, or the infinity norm, or the ele | |||||
| ment of largest absolute value of a symmetric band matrix. */ | |||||
| /* =========== DOCUMENTATION =========== */ | |||||
| /* Online html documentation available at */ | |||||
| /* http://www.netlib.org/lapack/explore-html/ */ | |||||
| /* > \htmlonly */ | |||||
| /* > Download CLANSB + dependencies */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/clansb. | |||||
| f"> */ | |||||
| /* > [TGZ]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/clansb. | |||||
| f"> */ | |||||
| /* > [ZIP]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/clansb. | |||||
| f"> */ | |||||
| /* > [TXT]</a> */ | |||||
| /* > \endhtmlonly */ | |||||
| /* Definition: */ | |||||
| /* =========== */ | |||||
| /* REAL FUNCTION CLANSB( NORM, UPLO, N, K, AB, LDAB, */ | |||||
| /* WORK ) */ | |||||
| /* CHARACTER NORM, UPLO */ | |||||
| /* INTEGER K, LDAB, N */ | |||||
| /* REAL WORK( * ) */ | |||||
| /* COMPLEX AB( LDAB, * ) */ | |||||
| /* > \par Purpose: */ | |||||
| /* ============= */ | |||||
| /* > */ | |||||
| /* > \verbatim */ | |||||
| /* > */ | |||||
| /* > CLANSB returns the value of the one norm, or the Frobenius norm, or */ | |||||
| /* > the infinity norm, or the element of largest absolute value of an */ | |||||
| /* > n by n symmetric band matrix A, with k super-diagonals. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \return CLANSB */ | |||||
| /* > \verbatim */ | |||||
| /* > */ | |||||
| /* > CLANSB = ( f2cmax(abs(A(i,j))), NORM = 'M' or 'm' */ | |||||
| /* > ( */ | |||||
| /* > ( norm1(A), NORM = '1', 'O' or 'o' */ | |||||
| /* > ( */ | |||||
| /* > ( normI(A), NORM = 'I' or 'i' */ | |||||
| /* > ( */ | |||||
| /* > ( normF(A), NORM = 'F', 'f', 'E' or 'e' */ | |||||
| /* > */ | |||||
| /* > where norm1 denotes the one norm of a matrix (maximum column sum), */ | |||||
| /* > normI denotes the infinity norm of a matrix (maximum row sum) and */ | |||||
| /* > normF denotes the Frobenius norm of a matrix (square root of sum of */ | |||||
| /* > squares). Note that f2cmax(abs(A(i,j))) is not a consistent matrix norm. */ | |||||
| /* > \endverbatim */ | |||||
| /* Arguments: */ | |||||
| /* ========== */ | |||||
| /* > \param[in] NORM */ | |||||
| /* > \verbatim */ | |||||
| /* > NORM is CHARACTER*1 */ | |||||
| /* > Specifies the value to be returned in CLANSB as described */ | |||||
| /* > above. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] UPLO */ | |||||
| /* > \verbatim */ | |||||
| /* > UPLO is CHARACTER*1 */ | |||||
| /* > Specifies whether the upper or lower triangular part of the */ | |||||
| /* > band matrix A is supplied. */ | |||||
| /* > = 'U': Upper triangular part is supplied */ | |||||
| /* > = 'L': Lower triangular part is supplied */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] N */ | |||||
| /* > \verbatim */ | |||||
| /* > N is INTEGER */ | |||||
| /* > The order of the matrix A. N >= 0. When N = 0, CLANSB is */ | |||||
| /* > set to zero. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] K */ | |||||
| /* > \verbatim */ | |||||
| /* > K is INTEGER */ | |||||
| /* > The number of super-diagonals or sub-diagonals of the */ | |||||
| /* > band matrix A. K >= 0. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] AB */ | |||||
| /* > \verbatim */ | |||||
| /* > AB is COMPLEX array, dimension (LDAB,N) */ | |||||
| /* > The upper or lower triangle of the symmetric band matrix A, */ | |||||
| /* > stored in the first K+1 rows of AB. The j-th column of A is */ | |||||
| /* > stored in the j-th column of the array AB as follows: */ | |||||
| /* > if UPLO = 'U', AB(k+1+i-j,j) = A(i,j) for f2cmax(1,j-k)<=i<=j; */ | |||||
| /* > if UPLO = 'L', AB(1+i-j,j) = A(i,j) for j<=i<=f2cmin(n,j+k). */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] LDAB */ | |||||
| /* > \verbatim */ | |||||
| /* > LDAB is INTEGER */ | |||||
| /* > The leading dimension of the array AB. LDAB >= K+1. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] WORK */ | |||||
| /* > \verbatim */ | |||||
| /* > WORK is REAL array, dimension (MAX(1,LWORK)), */ | |||||
| /* > where LWORK >= N when NORM = 'I' or '1' or 'O'; otherwise, */ | |||||
| /* > WORK is not referenced. */ | |||||
| /* > \endverbatim */ | |||||
| /* Authors: */ | |||||
| /* ======== */ | |||||
| /* > \author Univ. of Tennessee */ | |||||
| /* > \author Univ. of California Berkeley */ | |||||
| /* > \author Univ. of Colorado Denver */ | |||||
| /* > \author NAG Ltd. */ | |||||
| /* > \date December 2016 */ | |||||
| /* > \ingroup complexOTHERauxiliary */ | |||||
| /* ===================================================================== */ | |||||
| real clansb_(char *norm, char *uplo, integer *n, integer *k, complex *ab, | |||||
| integer *ldab, real *work) | |||||
| { | |||||
| /* System generated locals */ | |||||
| integer ab_dim1, ab_offset, i__1, i__2, i__3, i__4; | |||||
| real ret_val; | |||||
| /* Local variables */ | |||||
| real absa; | |||||
| extern /* Subroutine */ int scombssq_(real *, real *); | |||||
| integer i__, j, l; | |||||
| extern logical lsame_(char *, char *); | |||||
| real value; | |||||
| extern /* Subroutine */ int classq_(integer *, complex *, integer *, real | |||||
| *, real *); | |||||
| extern logical sisnan_(real *); | |||||
| real colssq[2], sum, ssq[2]; | |||||
| /* -- LAPACK auxiliary routine (version 3.7.0) -- */ | |||||
| /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ | |||||
| /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ | |||||
| /* December 2016 */ | |||||
| /* ===================================================================== */ | |||||
| /* Parameter adjustments */ | |||||
| ab_dim1 = *ldab; | |||||
| ab_offset = 1 + ab_dim1 * 1; | |||||
| ab -= ab_offset; | |||||
| --work; | |||||
| /* Function Body */ | |||||
| if (*n == 0) { | |||||
| value = 0.f; | |||||
| } else if (lsame_(norm, "M")) { | |||||
| /* Find f2cmax(abs(A(i,j))). */ | |||||
| value = 0.f; | |||||
| if (lsame_(uplo, "U")) { | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| /* Computing MAX */ | |||||
| i__2 = *k + 2 - j; | |||||
| i__3 = *k + 1; | |||||
| for (i__ = f2cmax(i__2,1); i__ <= i__3; ++i__) { | |||||
| sum = c_abs(&ab[i__ + j * ab_dim1]); | |||||
| if (value < sum || sisnan_(&sum)) { | |||||
| value = sum; | |||||
| } | |||||
| /* L10: */ | |||||
| } | |||||
| /* L20: */ | |||||
| } | |||||
| } else { | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| /* Computing MIN */ | |||||
| i__2 = *n + 1 - j, i__4 = *k + 1; | |||||
| i__3 = f2cmin(i__2,i__4); | |||||
| for (i__ = 1; i__ <= i__3; ++i__) { | |||||
| sum = c_abs(&ab[i__ + j * ab_dim1]); | |||||
| if (value < sum || sisnan_(&sum)) { | |||||
| value = sum; | |||||
| } | |||||
| /* L30: */ | |||||
| } | |||||
| /* L40: */ | |||||
| } | |||||
| } | |||||
| } else if (lsame_(norm, "I") || lsame_(norm, "O") || *(unsigned char *)norm == '1') { | |||||
| /* Find normI(A) ( = norm1(A), since A is symmetric). */ | |||||
| value = 0.f; | |||||
| if (lsame_(uplo, "U")) { | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| sum = 0.f; | |||||
| l = *k + 1 - j; | |||||
| /* Computing MAX */ | |||||
| i__3 = 1, i__2 = j - *k; | |||||
| i__4 = j - 1; | |||||
| for (i__ = f2cmax(i__3,i__2); i__ <= i__4; ++i__) { | |||||
| absa = c_abs(&ab[l + i__ + j * ab_dim1]); | |||||
| sum += absa; | |||||
| work[i__] += absa; | |||||
| /* L50: */ | |||||
| } | |||||
| work[j] = sum + c_abs(&ab[*k + 1 + j * ab_dim1]); | |||||
| /* L60: */ | |||||
| } | |||||
| i__1 = *n; | |||||
| for (i__ = 1; i__ <= i__1; ++i__) { | |||||
| sum = work[i__]; | |||||
| if (value < sum || sisnan_(&sum)) { | |||||
| value = sum; | |||||
| } | |||||
| /* L70: */ | |||||
| } | |||||
| } else { | |||||
| i__1 = *n; | |||||
| for (i__ = 1; i__ <= i__1; ++i__) { | |||||
| work[i__] = 0.f; | |||||
| /* L80: */ | |||||
| } | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| sum = work[j] + c_abs(&ab[j * ab_dim1 + 1]); | |||||
| l = 1 - j; | |||||
| /* Computing MIN */ | |||||
| i__3 = *n, i__2 = j + *k; | |||||
| i__4 = f2cmin(i__3,i__2); | |||||
| for (i__ = j + 1; i__ <= i__4; ++i__) { | |||||
| absa = c_abs(&ab[l + i__ + j * ab_dim1]); | |||||
| sum += absa; | |||||
| work[i__] += absa; | |||||
| /* L90: */ | |||||
| } | |||||
| if (value < sum || sisnan_(&sum)) { | |||||
| value = sum; | |||||
| } | |||||
| /* L100: */ | |||||
| } | |||||
| } | |||||
| } else if (lsame_(norm, "F") || lsame_(norm, "E")) { | |||||
| /* Find normF(A). */ | |||||
| /* SSQ(1) is scale */ | |||||
| /* SSQ(2) is sum-of-squares */ | |||||
| /* For better accuracy, sum each column separately. */ | |||||
| ssq[0] = 0.f; | |||||
| ssq[1] = 1.f; | |||||
| /* Sum off-diagonals */ | |||||
| if (*k > 0) { | |||||
| if (lsame_(uplo, "U")) { | |||||
| i__1 = *n; | |||||
| for (j = 2; j <= i__1; ++j) { | |||||
| colssq[0] = 0.f; | |||||
| colssq[1] = 1.f; | |||||
| /* Computing MIN */ | |||||
| i__3 = j - 1; | |||||
| i__4 = f2cmin(i__3,*k); | |||||
| /* Computing MAX */ | |||||
| i__2 = *k + 2 - j; | |||||
| classq_(&i__4, &ab[f2cmax(i__2,1) + j * ab_dim1], &c__1, | |||||
| colssq, &colssq[1]); | |||||
| scombssq_(ssq, colssq); | |||||
| /* L110: */ | |||||
| } | |||||
| l = *k + 1; | |||||
| } else { | |||||
| i__1 = *n - 1; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| colssq[0] = 0.f; | |||||
| colssq[1] = 1.f; | |||||
| /* Computing MIN */ | |||||
| i__3 = *n - j; | |||||
| i__4 = f2cmin(i__3,*k); | |||||
| classq_(&i__4, &ab[j * ab_dim1 + 2], &c__1, colssq, & | |||||
| colssq[1]); | |||||
| scombssq_(ssq, colssq); | |||||
| /* L120: */ | |||||
| } | |||||
| l = 1; | |||||
| } | |||||
| ssq[1] *= 2; | |||||
| } else { | |||||
| l = 1; | |||||
| } | |||||
| /* Sum diagonal */ | |||||
| colssq[0] = 0.f; | |||||
| colssq[1] = 1.f; | |||||
| classq_(n, &ab[l + ab_dim1], ldab, colssq, &colssq[1]); | |||||
| scombssq_(ssq, colssq); | |||||
| value = ssq[0] * sqrt(ssq[1]); | |||||
| } | |||||
| ret_val = value; | |||||
| return ret_val; | |||||
| /* End of CLANSB */ | |||||
| } /* clansb_ */ | |||||
| @@ -0,0 +1,722 @@ | |||||
| /* f2c.h -- Standard Fortran to C header file */ | |||||
| /** barf [ba:rf] 2. "He suggested using FORTRAN, and everybody barfed." | |||||
| - From The Shogakukan DICTIONARY OF NEW ENGLISH (Second edition) */ | |||||
| #ifndef F2C_INCLUDE | |||||
| #define F2C_INCLUDE | |||||
| #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 | |||||
| typedef int 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; | |||||
| 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;} | |||||
| #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)); } | |||||
| #define c_div(c, a, b) {pCf(c) = Cf(a)/Cf(b);} | |||||
| #define z_div(c, a, b) {pCd(c) = Cd(a)/Cd(b);} | |||||
| #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) = conj(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) (cimag(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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotc_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void cdotu_(complex *z, integer *n_, complex *x, integer *incx_, complex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotu_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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) | |||||
| */ | |||||
| /* Table of constant values */ | |||||
| static integer c__1 = 1; | |||||
| /* > \brief \b CLANSP returns the value of the 1-norm, or the Frobenius norm, or the infinity norm, or the ele | |||||
| ment of largest absolute value of a symmetric matrix supplied in packed form. */ | |||||
| /* =========== DOCUMENTATION =========== */ | |||||
| /* Online html documentation available at */ | |||||
| /* http://www.netlib.org/lapack/explore-html/ */ | |||||
| /* > \htmlonly */ | |||||
| /* > Download CLANSP + dependencies */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/clansp. | |||||
| f"> */ | |||||
| /* > [TGZ]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/clansp. | |||||
| f"> */ | |||||
| /* > [ZIP]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/clansp. | |||||
| f"> */ | |||||
| /* > [TXT]</a> */ | |||||
| /* > \endhtmlonly */ | |||||
| /* Definition: */ | |||||
| /* =========== */ | |||||
| /* REAL FUNCTION CLANSP( NORM, UPLO, N, AP, WORK ) */ | |||||
| /* CHARACTER NORM, UPLO */ | |||||
| /* INTEGER N */ | |||||
| /* REAL WORK( * ) */ | |||||
| /* COMPLEX AP( * ) */ | |||||
| /* > \par Purpose: */ | |||||
| /* ============= */ | |||||
| /* > */ | |||||
| /* > \verbatim */ | |||||
| /* > */ | |||||
| /* > CLANSP returns the value of the one norm, or the Frobenius norm, or */ | |||||
| /* > the infinity norm, or the element of largest absolute value of a */ | |||||
| /* > complex symmetric matrix A, supplied in packed form. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \return CLANSP */ | |||||
| /* > \verbatim */ | |||||
| /* > */ | |||||
| /* > CLANSP = ( f2cmax(abs(A(i,j))), NORM = 'M' or 'm' */ | |||||
| /* > ( */ | |||||
| /* > ( norm1(A), NORM = '1', 'O' or 'o' */ | |||||
| /* > ( */ | |||||
| /* > ( normI(A), NORM = 'I' or 'i' */ | |||||
| /* > ( */ | |||||
| /* > ( normF(A), NORM = 'F', 'f', 'E' or 'e' */ | |||||
| /* > */ | |||||
| /* > where norm1 denotes the one norm of a matrix (maximum column sum), */ | |||||
| /* > normI denotes the infinity norm of a matrix (maximum row sum) and */ | |||||
| /* > normF denotes the Frobenius norm of a matrix (square root of sum of */ | |||||
| /* > squares). Note that f2cmax(abs(A(i,j))) is not a consistent matrix norm. */ | |||||
| /* > \endverbatim */ | |||||
| /* Arguments: */ | |||||
| /* ========== */ | |||||
| /* > \param[in] NORM */ | |||||
| /* > \verbatim */ | |||||
| /* > NORM is CHARACTER*1 */ | |||||
| /* > Specifies the value to be returned in CLANSP as described */ | |||||
| /* > above. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] UPLO */ | |||||
| /* > \verbatim */ | |||||
| /* > UPLO is CHARACTER*1 */ | |||||
| /* > Specifies whether the upper or lower triangular part of the */ | |||||
| /* > symmetric matrix A is supplied. */ | |||||
| /* > = 'U': Upper triangular part of A is supplied */ | |||||
| /* > = 'L': Lower triangular part of A is supplied */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] N */ | |||||
| /* > \verbatim */ | |||||
| /* > N is INTEGER */ | |||||
| /* > The order of the matrix A. N >= 0. When N = 0, CLANSP is */ | |||||
| /* > set to zero. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] AP */ | |||||
| /* > \verbatim */ | |||||
| /* > AP is COMPLEX array, dimension (N*(N+1)/2) */ | |||||
| /* > The upper or lower triangle of the symmetric matrix A, packed */ | |||||
| /* > columnwise in a linear array. The j-th column of A is stored */ | |||||
| /* > in the array AP as follows: */ | |||||
| /* > if UPLO = 'U', AP(i + (j-1)*j/2) = A(i,j) for 1<=i<=j; */ | |||||
| /* > if UPLO = 'L', AP(i + (j-1)*(2n-j)/2) = A(i,j) for j<=i<=n. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] WORK */ | |||||
| /* > \verbatim */ | |||||
| /* > WORK is REAL array, dimension (MAX(1,LWORK)), */ | |||||
| /* > where LWORK >= N when NORM = 'I' or '1' or 'O'; otherwise, */ | |||||
| /* > WORK is not referenced. */ | |||||
| /* > \endverbatim */ | |||||
| /* Authors: */ | |||||
| /* ======== */ | |||||
| /* > \author Univ. of Tennessee */ | |||||
| /* > \author Univ. of California Berkeley */ | |||||
| /* > \author Univ. of Colorado Denver */ | |||||
| /* > \author NAG Ltd. */ | |||||
| /* > \date December 2016 */ | |||||
| /* > \ingroup complexOTHERauxiliary */ | |||||
| /* ===================================================================== */ | |||||
| real clansp_(char *norm, char *uplo, integer *n, complex *ap, real *work) | |||||
| { | |||||
| /* System generated locals */ | |||||
| integer i__1, i__2; | |||||
| real ret_val, r__1; | |||||
| /* Local variables */ | |||||
| real absa; | |||||
| extern /* Subroutine */ int scombssq_(real *, real *); | |||||
| integer i__, j, k; | |||||
| extern logical lsame_(char *, char *); | |||||
| real value; | |||||
| extern /* Subroutine */ int classq_(integer *, complex *, integer *, real | |||||
| *, real *); | |||||
| extern logical sisnan_(real *); | |||||
| real colssq[2], sum, ssq[2]; | |||||
| /* -- LAPACK auxiliary routine (version 3.7.0) -- */ | |||||
| /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ | |||||
| /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ | |||||
| /* December 2016 */ | |||||
| /* ===================================================================== */ | |||||
| /* Parameter adjustments */ | |||||
| --work; | |||||
| --ap; | |||||
| /* Function Body */ | |||||
| if (*n == 0) { | |||||
| value = 0.f; | |||||
| } else if (lsame_(norm, "M")) { | |||||
| /* Find f2cmax(abs(A(i,j))). */ | |||||
| value = 0.f; | |||||
| if (lsame_(uplo, "U")) { | |||||
| k = 1; | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| i__2 = k + j - 1; | |||||
| for (i__ = k; i__ <= i__2; ++i__) { | |||||
| sum = c_abs(&ap[i__]); | |||||
| if (value < sum || sisnan_(&sum)) { | |||||
| value = sum; | |||||
| } | |||||
| /* L10: */ | |||||
| } | |||||
| k += j; | |||||
| /* L20: */ | |||||
| } | |||||
| } else { | |||||
| k = 1; | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| i__2 = k + *n - j; | |||||
| for (i__ = k; i__ <= i__2; ++i__) { | |||||
| sum = c_abs(&ap[i__]); | |||||
| if (value < sum || sisnan_(&sum)) { | |||||
| value = sum; | |||||
| } | |||||
| /* L30: */ | |||||
| } | |||||
| k = k + *n - j + 1; | |||||
| /* L40: */ | |||||
| } | |||||
| } | |||||
| } else if (lsame_(norm, "I") || lsame_(norm, "O") || *(unsigned char *)norm == '1') { | |||||
| /* Find normI(A) ( = norm1(A), since A is symmetric). */ | |||||
| value = 0.f; | |||||
| k = 1; | |||||
| if (lsame_(uplo, "U")) { | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| sum = 0.f; | |||||
| i__2 = j - 1; | |||||
| for (i__ = 1; i__ <= i__2; ++i__) { | |||||
| absa = c_abs(&ap[k]); | |||||
| sum += absa; | |||||
| work[i__] += absa; | |||||
| ++k; | |||||
| /* L50: */ | |||||
| } | |||||
| work[j] = sum + c_abs(&ap[k]); | |||||
| ++k; | |||||
| /* L60: */ | |||||
| } | |||||
| i__1 = *n; | |||||
| for (i__ = 1; i__ <= i__1; ++i__) { | |||||
| sum = work[i__]; | |||||
| if (value < sum || sisnan_(&sum)) { | |||||
| value = sum; | |||||
| } | |||||
| /* L70: */ | |||||
| } | |||||
| } else { | |||||
| i__1 = *n; | |||||
| for (i__ = 1; i__ <= i__1; ++i__) { | |||||
| work[i__] = 0.f; | |||||
| /* L80: */ | |||||
| } | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| sum = work[j] + c_abs(&ap[k]); | |||||
| ++k; | |||||
| i__2 = *n; | |||||
| for (i__ = j + 1; i__ <= i__2; ++i__) { | |||||
| absa = c_abs(&ap[k]); | |||||
| sum += absa; | |||||
| work[i__] += absa; | |||||
| ++k; | |||||
| /* L90: */ | |||||
| } | |||||
| if (value < sum || sisnan_(&sum)) { | |||||
| value = sum; | |||||
| } | |||||
| /* L100: */ | |||||
| } | |||||
| } | |||||
| } else if (lsame_(norm, "F") || lsame_(norm, "E")) { | |||||
| /* Find normF(A). */ | |||||
| /* SSQ(1) is scale */ | |||||
| /* SSQ(2) is sum-of-squares */ | |||||
| /* For better accuracy, sum each column separately. */ | |||||
| ssq[0] = 0.f; | |||||
| ssq[1] = 1.f; | |||||
| /* Sum off-diagonals */ | |||||
| k = 2; | |||||
| if (lsame_(uplo, "U")) { | |||||
| i__1 = *n; | |||||
| for (j = 2; j <= i__1; ++j) { | |||||
| colssq[0] = 0.f; | |||||
| colssq[1] = 1.f; | |||||
| i__2 = j - 1; | |||||
| classq_(&i__2, &ap[k], &c__1, colssq, &colssq[1]); | |||||
| scombssq_(ssq, colssq); | |||||
| k += j; | |||||
| /* L110: */ | |||||
| } | |||||
| } else { | |||||
| i__1 = *n - 1; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| colssq[0] = 0.f; | |||||
| colssq[1] = 1.f; | |||||
| i__2 = *n - j; | |||||
| classq_(&i__2, &ap[k], &c__1, colssq, &colssq[1]); | |||||
| scombssq_(ssq, colssq); | |||||
| k = k + *n - j + 1; | |||||
| /* L120: */ | |||||
| } | |||||
| } | |||||
| ssq[1] *= 2; | |||||
| /* Sum diagonal */ | |||||
| k = 1; | |||||
| colssq[0] = 0.f; | |||||
| colssq[1] = 1.f; | |||||
| i__1 = *n; | |||||
| for (i__ = 1; i__ <= i__1; ++i__) { | |||||
| i__2 = k; | |||||
| if (ap[i__2].r != 0.f) { | |||||
| i__2 = k; | |||||
| absa = (r__1 = ap[i__2].r, abs(r__1)); | |||||
| if (colssq[0] < absa) { | |||||
| /* Computing 2nd power */ | |||||
| r__1 = colssq[0] / absa; | |||||
| colssq[1] = colssq[1] * (r__1 * r__1) + 1.f; | |||||
| colssq[0] = absa; | |||||
| } else { | |||||
| /* Computing 2nd power */ | |||||
| r__1 = absa / colssq[0]; | |||||
| colssq[1] += r__1 * r__1; | |||||
| } | |||||
| } | |||||
| if (r_imag(&ap[k]) != 0.f) { | |||||
| absa = (r__1 = r_imag(&ap[k]), abs(r__1)); | |||||
| if (colssq[0] < absa) { | |||||
| /* Computing 2nd power */ | |||||
| r__1 = colssq[0] / absa; | |||||
| colssq[1] = colssq[1] * (r__1 * r__1) + 1.f; | |||||
| colssq[0] = absa; | |||||
| } else { | |||||
| /* Computing 2nd power */ | |||||
| r__1 = absa / colssq[0]; | |||||
| colssq[1] += r__1 * r__1; | |||||
| } | |||||
| } | |||||
| if (lsame_(uplo, "U")) { | |||||
| k = k + i__ + 1; | |||||
| } else { | |||||
| k = k + *n - i__ + 1; | |||||
| } | |||||
| /* L130: */ | |||||
| } | |||||
| scombssq_(ssq, colssq); | |||||
| value = ssq[0] * sqrt(ssq[1]); | |||||
| } | |||||
| ret_val = value; | |||||
| return ret_val; | |||||
| /* End of CLANSP */ | |||||
| } /* clansp_ */ | |||||
| @@ -0,0 +1,686 @@ | |||||
| /* f2c.h -- Standard Fortran to C header file */ | |||||
| /** barf [ba:rf] 2. "He suggested using FORTRAN, and everybody barfed." | |||||
| - From The Shogakukan DICTIONARY OF NEW ENGLISH (Second edition) */ | |||||
| #ifndef F2C_INCLUDE | |||||
| #define F2C_INCLUDE | |||||
| #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 | |||||
| typedef int 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; | |||||
| 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;} | |||||
| #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)); } | |||||
| #define c_div(c, a, b) {pCf(c) = Cf(a)/Cf(b);} | |||||
| #define z_div(c, a, b) {pCd(c) = Cd(a)/Cd(b);} | |||||
| #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) = conj(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) (cimag(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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotc_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void cdotu_(complex *z, integer *n_, complex *x, integer *incx_, complex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotu_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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) | |||||
| */ | |||||
| /* Table of constant values */ | |||||
| static integer c__1 = 1; | |||||
| /* > \brief \b CLANSY returns the value of the 1-norm, or the Frobenius norm, or the infinity norm, or the ele | |||||
| ment of largest absolute value of a complex symmetric matrix. */ | |||||
| /* =========== DOCUMENTATION =========== */ | |||||
| /* Online html documentation available at */ | |||||
| /* http://www.netlib.org/lapack/explore-html/ */ | |||||
| /* > \htmlonly */ | |||||
| /* > Download CLANSY + dependencies */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/clansy. | |||||
| f"> */ | |||||
| /* > [TGZ]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/clansy. | |||||
| f"> */ | |||||
| /* > [ZIP]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/clansy. | |||||
| f"> */ | |||||
| /* > [TXT]</a> */ | |||||
| /* > \endhtmlonly */ | |||||
| /* Definition: */ | |||||
| /* =========== */ | |||||
| /* REAL FUNCTION CLANSY( NORM, UPLO, N, A, LDA, WORK ) */ | |||||
| /* CHARACTER NORM, UPLO */ | |||||
| /* INTEGER LDA, N */ | |||||
| /* REAL WORK( * ) */ | |||||
| /* COMPLEX A( LDA, * ) */ | |||||
| /* > \par Purpose: */ | |||||
| /* ============= */ | |||||
| /* > */ | |||||
| /* > \verbatim */ | |||||
| /* > */ | |||||
| /* > CLANSY returns the value of the one norm, or the Frobenius norm, or */ | |||||
| /* > the infinity norm, or the element of largest absolute value of a */ | |||||
| /* > complex symmetric matrix A. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \return CLANSY */ | |||||
| /* > \verbatim */ | |||||
| /* > */ | |||||
| /* > CLANSY = ( f2cmax(abs(A(i,j))), NORM = 'M' or 'm' */ | |||||
| /* > ( */ | |||||
| /* > ( norm1(A), NORM = '1', 'O' or 'o' */ | |||||
| /* > ( */ | |||||
| /* > ( normI(A), NORM = 'I' or 'i' */ | |||||
| /* > ( */ | |||||
| /* > ( normF(A), NORM = 'F', 'f', 'E' or 'e' */ | |||||
| /* > */ | |||||
| /* > where norm1 denotes the one norm of a matrix (maximum column sum), */ | |||||
| /* > normI denotes the infinity norm of a matrix (maximum row sum) and */ | |||||
| /* > normF denotes the Frobenius norm of a matrix (square root of sum of */ | |||||
| /* > squares). Note that f2cmax(abs(A(i,j))) is not a consistent matrix norm. */ | |||||
| /* > \endverbatim */ | |||||
| /* Arguments: */ | |||||
| /* ========== */ | |||||
| /* > \param[in] NORM */ | |||||
| /* > \verbatim */ | |||||
| /* > NORM is CHARACTER*1 */ | |||||
| /* > Specifies the value to be returned in CLANSY as described */ | |||||
| /* > above. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] UPLO */ | |||||
| /* > \verbatim */ | |||||
| /* > UPLO is CHARACTER*1 */ | |||||
| /* > Specifies whether the upper or lower triangular part of the */ | |||||
| /* > symmetric matrix A is to be referenced. */ | |||||
| /* > = 'U': Upper triangular part of A is referenced */ | |||||
| /* > = 'L': Lower triangular part of A is referenced */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] N */ | |||||
| /* > \verbatim */ | |||||
| /* > N is INTEGER */ | |||||
| /* > The order of the matrix A. N >= 0. When N = 0, CLANSY is */ | |||||
| /* > set to zero. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] A */ | |||||
| /* > \verbatim */ | |||||
| /* > A is COMPLEX array, dimension (LDA,N) */ | |||||
| /* > The symmetric matrix A. If UPLO = 'U', the leading n by n */ | |||||
| /* > upper triangular part of A contains the upper triangular part */ | |||||
| /* > of the matrix A, and the strictly lower triangular part of A */ | |||||
| /* > is not referenced. If UPLO = 'L', the leading n by n lower */ | |||||
| /* > triangular part of A contains the lower triangular part of */ | |||||
| /* > the matrix A, and the strictly upper triangular part of A is */ | |||||
| /* > not referenced. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] LDA */ | |||||
| /* > \verbatim */ | |||||
| /* > LDA is INTEGER */ | |||||
| /* > The leading dimension of the array A. LDA >= f2cmax(N,1). */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] WORK */ | |||||
| /* > \verbatim */ | |||||
| /* > WORK is REAL array, dimension (MAX(1,LWORK)), */ | |||||
| /* > where LWORK >= N when NORM = 'I' or '1' or 'O'; otherwise, */ | |||||
| /* > WORK is not referenced. */ | |||||
| /* > \endverbatim */ | |||||
| /* Authors: */ | |||||
| /* ======== */ | |||||
| /* > \author Univ. of Tennessee */ | |||||
| /* > \author Univ. of California Berkeley */ | |||||
| /* > \author Univ. of Colorado Denver */ | |||||
| /* > \author NAG Ltd. */ | |||||
| /* > \date December 2016 */ | |||||
| /* > \ingroup complexSYauxiliary */ | |||||
| /* ===================================================================== */ | |||||
| real clansy_(char *norm, char *uplo, integer *n, complex *a, integer *lda, | |||||
| real *work) | |||||
| { | |||||
| /* System generated locals */ | |||||
| integer a_dim1, a_offset, i__1, i__2; | |||||
| real ret_val; | |||||
| /* Local variables */ | |||||
| real absa; | |||||
| extern /* Subroutine */ int scombssq_(real *, real *); | |||||
| integer i__, j; | |||||
| extern logical lsame_(char *, char *); | |||||
| real value; | |||||
| extern /* Subroutine */ int classq_(integer *, complex *, integer *, real | |||||
| *, real *); | |||||
| extern logical sisnan_(real *); | |||||
| real colssq[2], sum, ssq[2]; | |||||
| /* -- LAPACK auxiliary routine (version 3.7.0) -- */ | |||||
| /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ | |||||
| /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ | |||||
| /* December 2016 */ | |||||
| /* ===================================================================== */ | |||||
| /* Parameter adjustments */ | |||||
| a_dim1 = *lda; | |||||
| a_offset = 1 + a_dim1 * 1; | |||||
| a -= a_offset; | |||||
| --work; | |||||
| /* Function Body */ | |||||
| if (*n == 0) { | |||||
| value = 0.f; | |||||
| } else if (lsame_(norm, "M")) { | |||||
| /* Find f2cmax(abs(A(i,j))). */ | |||||
| value = 0.f; | |||||
| if (lsame_(uplo, "U")) { | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| i__2 = j; | |||||
| for (i__ = 1; i__ <= i__2; ++i__) { | |||||
| sum = c_abs(&a[i__ + j * a_dim1]); | |||||
| if (value < sum || sisnan_(&sum)) { | |||||
| value = sum; | |||||
| } | |||||
| /* L10: */ | |||||
| } | |||||
| /* L20: */ | |||||
| } | |||||
| } else { | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| i__2 = *n; | |||||
| for (i__ = j; i__ <= i__2; ++i__) { | |||||
| sum = c_abs(&a[i__ + j * a_dim1]); | |||||
| if (value < sum || sisnan_(&sum)) { | |||||
| value = sum; | |||||
| } | |||||
| /* L30: */ | |||||
| } | |||||
| /* L40: */ | |||||
| } | |||||
| } | |||||
| } else if (lsame_(norm, "I") || lsame_(norm, "O") || *(unsigned char *)norm == '1') { | |||||
| /* Find normI(A) ( = norm1(A), since A is symmetric). */ | |||||
| value = 0.f; | |||||
| if (lsame_(uplo, "U")) { | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| sum = 0.f; | |||||
| i__2 = j - 1; | |||||
| for (i__ = 1; i__ <= i__2; ++i__) { | |||||
| absa = c_abs(&a[i__ + j * a_dim1]); | |||||
| sum += absa; | |||||
| work[i__] += absa; | |||||
| /* L50: */ | |||||
| } | |||||
| work[j] = sum + c_abs(&a[j + j * a_dim1]); | |||||
| /* L60: */ | |||||
| } | |||||
| i__1 = *n; | |||||
| for (i__ = 1; i__ <= i__1; ++i__) { | |||||
| sum = work[i__]; | |||||
| if (value < sum || sisnan_(&sum)) { | |||||
| value = sum; | |||||
| } | |||||
| /* L70: */ | |||||
| } | |||||
| } else { | |||||
| i__1 = *n; | |||||
| for (i__ = 1; i__ <= i__1; ++i__) { | |||||
| work[i__] = 0.f; | |||||
| /* L80: */ | |||||
| } | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| sum = work[j] + c_abs(&a[j + j * a_dim1]); | |||||
| i__2 = *n; | |||||
| for (i__ = j + 1; i__ <= i__2; ++i__) { | |||||
| absa = c_abs(&a[i__ + j * a_dim1]); | |||||
| sum += absa; | |||||
| work[i__] += absa; | |||||
| /* L90: */ | |||||
| } | |||||
| if (value < sum || sisnan_(&sum)) { | |||||
| value = sum; | |||||
| } | |||||
| /* L100: */ | |||||
| } | |||||
| } | |||||
| } else if (lsame_(norm, "F") || lsame_(norm, "E")) { | |||||
| /* Find normF(A). */ | |||||
| /* SSQ(1) is scale */ | |||||
| /* SSQ(2) is sum-of-squares */ | |||||
| /* For better accuracy, sum each column separately. */ | |||||
| ssq[0] = 0.f; | |||||
| ssq[1] = 1.f; | |||||
| /* Sum off-diagonals */ | |||||
| if (lsame_(uplo, "U")) { | |||||
| i__1 = *n; | |||||
| for (j = 2; j <= i__1; ++j) { | |||||
| colssq[0] = 0.f; | |||||
| colssq[1] = 1.f; | |||||
| i__2 = j - 1; | |||||
| classq_(&i__2, &a[j * a_dim1 + 1], &c__1, colssq, &colssq[1]); | |||||
| scombssq_(ssq, colssq); | |||||
| /* L110: */ | |||||
| } | |||||
| } else { | |||||
| i__1 = *n - 1; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| colssq[0] = 0.f; | |||||
| colssq[1] = 1.f; | |||||
| i__2 = *n - j; | |||||
| classq_(&i__2, &a[j + 1 + j * a_dim1], &c__1, colssq, &colssq[ | |||||
| 1]); | |||||
| scombssq_(ssq, colssq); | |||||
| /* L120: */ | |||||
| } | |||||
| } | |||||
| ssq[1] *= 2; | |||||
| /* Sum diagonal */ | |||||
| colssq[0] = 0.f; | |||||
| colssq[1] = 1.f; | |||||
| i__1 = *lda + 1; | |||||
| classq_(n, &a[a_offset], &i__1, colssq, &colssq[1]); | |||||
| scombssq_(ssq, colssq); | |||||
| value = ssq[0] * sqrt(ssq[1]); | |||||
| } | |||||
| ret_val = value; | |||||
| return ret_val; | |||||
| /* End of CLANSY */ | |||||
| } /* clansy_ */ | |||||
| @@ -0,0 +1,882 @@ | |||||
| /* f2c.h -- Standard Fortran to C header file */ | |||||
| /** barf [ba:rf] 2. "He suggested using FORTRAN, and everybody barfed." | |||||
| - From The Shogakukan DICTIONARY OF NEW ENGLISH (Second edition) */ | |||||
| #ifndef F2C_INCLUDE | |||||
| #define F2C_INCLUDE | |||||
| #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 | |||||
| typedef int 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; | |||||
| 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;} | |||||
| #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)); } | |||||
| #define c_div(c, a, b) {pCf(c) = Cf(a)/Cf(b);} | |||||
| #define z_div(c, a, b) {pCd(c) = Cd(a)/Cd(b);} | |||||
| #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) = conj(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) (cimag(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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotc_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void cdotu_(complex *z, integer *n_, complex *x, integer *incx_, complex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotu_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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) | |||||
| */ | |||||
| /* Table of constant values */ | |||||
| static integer c__1 = 1; | |||||
| /* > \brief \b CLANTB returns the value of the 1-norm, or the Frobenius norm, or the infinity norm, or the ele | |||||
| ment of largest absolute value of a triangular band matrix. */ | |||||
| /* =========== DOCUMENTATION =========== */ | |||||
| /* Online html documentation available at */ | |||||
| /* http://www.netlib.org/lapack/explore-html/ */ | |||||
| /* > \htmlonly */ | |||||
| /* > Download CLANTB + dependencies */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/clantb. | |||||
| f"> */ | |||||
| /* > [TGZ]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/clantb. | |||||
| f"> */ | |||||
| /* > [ZIP]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/clantb. | |||||
| f"> */ | |||||
| /* > [TXT]</a> */ | |||||
| /* > \endhtmlonly */ | |||||
| /* Definition: */ | |||||
| /* =========== */ | |||||
| /* REAL FUNCTION CLANTB( NORM, UPLO, DIAG, N, K, AB, */ | |||||
| /* LDAB, WORK ) */ | |||||
| /* CHARACTER DIAG, NORM, UPLO */ | |||||
| /* INTEGER K, LDAB, N */ | |||||
| /* REAL WORK( * ) */ | |||||
| /* COMPLEX AB( LDAB, * ) */ | |||||
| /* > \par Purpose: */ | |||||
| /* ============= */ | |||||
| /* > */ | |||||
| /* > \verbatim */ | |||||
| /* > */ | |||||
| /* > CLANTB returns the value of the one norm, or the Frobenius norm, or */ | |||||
| /* > the infinity norm, or the element of largest absolute value of an */ | |||||
| /* > n by n triangular band matrix A, with ( k + 1 ) diagonals. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \return CLANTB */ | |||||
| /* > \verbatim */ | |||||
| /* > */ | |||||
| /* > CLANTB = ( f2cmax(abs(A(i,j))), NORM = 'M' or 'm' */ | |||||
| /* > ( */ | |||||
| /* > ( norm1(A), NORM = '1', 'O' or 'o' */ | |||||
| /* > ( */ | |||||
| /* > ( normI(A), NORM = 'I' or 'i' */ | |||||
| /* > ( */ | |||||
| /* > ( normF(A), NORM = 'F', 'f', 'E' or 'e' */ | |||||
| /* > */ | |||||
| /* > where norm1 denotes the one norm of a matrix (maximum column sum), */ | |||||
| /* > normI denotes the infinity norm of a matrix (maximum row sum) and */ | |||||
| /* > normF denotes the Frobenius norm of a matrix (square root of sum of */ | |||||
| /* > squares). Note that f2cmax(abs(A(i,j))) is not a consistent matrix norm. */ | |||||
| /* > \endverbatim */ | |||||
| /* Arguments: */ | |||||
| /* ========== */ | |||||
| /* > \param[in] NORM */ | |||||
| /* > \verbatim */ | |||||
| /* > NORM is CHARACTER*1 */ | |||||
| /* > Specifies the value to be returned in CLANTB as described */ | |||||
| /* > above. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] UPLO */ | |||||
| /* > \verbatim */ | |||||
| /* > UPLO is CHARACTER*1 */ | |||||
| /* > Specifies whether the matrix A is upper or lower triangular. */ | |||||
| /* > = 'U': Upper triangular */ | |||||
| /* > = 'L': Lower triangular */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] DIAG */ | |||||
| /* > \verbatim */ | |||||
| /* > DIAG is CHARACTER*1 */ | |||||
| /* > Specifies whether or not the matrix A is unit triangular. */ | |||||
| /* > = 'N': Non-unit triangular */ | |||||
| /* > = 'U': Unit triangular */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] N */ | |||||
| /* > \verbatim */ | |||||
| /* > N is INTEGER */ | |||||
| /* > The order of the matrix A. N >= 0. When N = 0, CLANTB is */ | |||||
| /* > set to zero. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] K */ | |||||
| /* > \verbatim */ | |||||
| /* > K is INTEGER */ | |||||
| /* > The number of super-diagonals of the matrix A if UPLO = 'U', */ | |||||
| /* > or the number of sub-diagonals of the matrix A if UPLO = 'L'. */ | |||||
| /* > K >= 0. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] AB */ | |||||
| /* > \verbatim */ | |||||
| /* > AB is COMPLEX array, dimension (LDAB,N) */ | |||||
| /* > The upper or lower triangular band matrix A, stored in the */ | |||||
| /* > first k+1 rows of AB. The j-th column of A is stored */ | |||||
| /* > in the j-th column of the array AB as follows: */ | |||||
| /* > if UPLO = 'U', AB(k+1+i-j,j) = A(i,j) for f2cmax(1,j-k)<=i<=j; */ | |||||
| /* > if UPLO = 'L', AB(1+i-j,j) = A(i,j) for j<=i<=f2cmin(n,j+k). */ | |||||
| /* > Note that when DIAG = 'U', the elements of the array AB */ | |||||
| /* > corresponding to the diagonal elements of the matrix A are */ | |||||
| /* > not referenced, but are assumed to be one. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] LDAB */ | |||||
| /* > \verbatim */ | |||||
| /* > LDAB is INTEGER */ | |||||
| /* > The leading dimension of the array AB. LDAB >= K+1. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] WORK */ | |||||
| /* > \verbatim */ | |||||
| /* > WORK is REAL array, dimension (MAX(1,LWORK)), */ | |||||
| /* > where LWORK >= N when NORM = 'I'; otherwise, WORK is not */ | |||||
| /* > referenced. */ | |||||
| /* > \endverbatim */ | |||||
| /* Authors: */ | |||||
| /* ======== */ | |||||
| /* > \author Univ. of Tennessee */ | |||||
| /* > \author Univ. of California Berkeley */ | |||||
| /* > \author Univ. of Colorado Denver */ | |||||
| /* > \author NAG Ltd. */ | |||||
| /* > \date December 2016 */ | |||||
| /* > \ingroup complexOTHERauxiliary */ | |||||
| /* ===================================================================== */ | |||||
| real clantb_(char *norm, char *uplo, char *diag, integer *n, integer *k, | |||||
| complex *ab, integer *ldab, real *work) | |||||
| { | |||||
| /* System generated locals */ | |||||
| integer ab_dim1, ab_offset, i__1, i__2, i__3, i__4, i__5; | |||||
| real ret_val; | |||||
| /* Local variables */ | |||||
| extern /* Subroutine */ int scombssq_(real *, real *); | |||||
| integer i__, j, l; | |||||
| logical udiag; | |||||
| extern logical lsame_(char *, char *); | |||||
| real value; | |||||
| extern /* Subroutine */ int classq_(integer *, complex *, integer *, real | |||||
| *, real *); | |||||
| extern logical sisnan_(real *); | |||||
| real colssq[2], sum, ssq[2]; | |||||
| /* -- LAPACK auxiliary routine (version 3.7.0) -- */ | |||||
| /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ | |||||
| /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ | |||||
| /* December 2016 */ | |||||
| /* ===================================================================== */ | |||||
| /* Parameter adjustments */ | |||||
| ab_dim1 = *ldab; | |||||
| ab_offset = 1 + ab_dim1 * 1; | |||||
| ab -= ab_offset; | |||||
| --work; | |||||
| /* Function Body */ | |||||
| if (*n == 0) { | |||||
| value = 0.f; | |||||
| } else if (lsame_(norm, "M")) { | |||||
| /* Find f2cmax(abs(A(i,j))). */ | |||||
| if (lsame_(diag, "U")) { | |||||
| value = 1.f; | |||||
| if (lsame_(uplo, "U")) { | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| /* Computing MAX */ | |||||
| i__2 = *k + 2 - j; | |||||
| i__3 = *k; | |||||
| for (i__ = f2cmax(i__2,1); i__ <= i__3; ++i__) { | |||||
| sum = c_abs(&ab[i__ + j * ab_dim1]); | |||||
| if (value < sum || sisnan_(&sum)) { | |||||
| value = sum; | |||||
| } | |||||
| /* L10: */ | |||||
| } | |||||
| /* L20: */ | |||||
| } | |||||
| } else { | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| /* Computing MIN */ | |||||
| i__2 = *n + 1 - j, i__4 = *k + 1; | |||||
| i__3 = f2cmin(i__2,i__4); | |||||
| for (i__ = 2; i__ <= i__3; ++i__) { | |||||
| sum = c_abs(&ab[i__ + j * ab_dim1]); | |||||
| if (value < sum || sisnan_(&sum)) { | |||||
| value = sum; | |||||
| } | |||||
| /* L30: */ | |||||
| } | |||||
| /* L40: */ | |||||
| } | |||||
| } | |||||
| } else { | |||||
| value = 0.f; | |||||
| if (lsame_(uplo, "U")) { | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| /* Computing MAX */ | |||||
| i__3 = *k + 2 - j; | |||||
| i__2 = *k + 1; | |||||
| for (i__ = f2cmax(i__3,1); i__ <= i__2; ++i__) { | |||||
| sum = c_abs(&ab[i__ + j * ab_dim1]); | |||||
| if (value < sum || sisnan_(&sum)) { | |||||
| value = sum; | |||||
| } | |||||
| /* L50: */ | |||||
| } | |||||
| /* L60: */ | |||||
| } | |||||
| } else { | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| /* Computing MIN */ | |||||
| i__3 = *n + 1 - j, i__4 = *k + 1; | |||||
| i__2 = f2cmin(i__3,i__4); | |||||
| for (i__ = 1; i__ <= i__2; ++i__) { | |||||
| sum = c_abs(&ab[i__ + j * ab_dim1]); | |||||
| if (value < sum || sisnan_(&sum)) { | |||||
| value = sum; | |||||
| } | |||||
| /* L70: */ | |||||
| } | |||||
| /* L80: */ | |||||
| } | |||||
| } | |||||
| } | |||||
| } else if (lsame_(norm, "O") || *(unsigned char *) | |||||
| norm == '1') { | |||||
| /* Find norm1(A). */ | |||||
| value = 0.f; | |||||
| udiag = lsame_(diag, "U"); | |||||
| if (lsame_(uplo, "U")) { | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| if (udiag) { | |||||
| sum = 1.f; | |||||
| /* Computing MAX */ | |||||
| i__2 = *k + 2 - j; | |||||
| i__3 = *k; | |||||
| for (i__ = f2cmax(i__2,1); i__ <= i__3; ++i__) { | |||||
| sum += c_abs(&ab[i__ + j * ab_dim1]); | |||||
| /* L90: */ | |||||
| } | |||||
| } else { | |||||
| sum = 0.f; | |||||
| /* Computing MAX */ | |||||
| i__3 = *k + 2 - j; | |||||
| i__2 = *k + 1; | |||||
| for (i__ = f2cmax(i__3,1); i__ <= i__2; ++i__) { | |||||
| sum += c_abs(&ab[i__ + j * ab_dim1]); | |||||
| /* L100: */ | |||||
| } | |||||
| } | |||||
| if (value < sum || sisnan_(&sum)) { | |||||
| value = sum; | |||||
| } | |||||
| /* L110: */ | |||||
| } | |||||
| } else { | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| if (udiag) { | |||||
| sum = 1.f; | |||||
| /* Computing MIN */ | |||||
| i__3 = *n + 1 - j, i__4 = *k + 1; | |||||
| i__2 = f2cmin(i__3,i__4); | |||||
| for (i__ = 2; i__ <= i__2; ++i__) { | |||||
| sum += c_abs(&ab[i__ + j * ab_dim1]); | |||||
| /* L120: */ | |||||
| } | |||||
| } else { | |||||
| sum = 0.f; | |||||
| /* Computing MIN */ | |||||
| i__3 = *n + 1 - j, i__4 = *k + 1; | |||||
| i__2 = f2cmin(i__3,i__4); | |||||
| for (i__ = 1; i__ <= i__2; ++i__) { | |||||
| sum += c_abs(&ab[i__ + j * ab_dim1]); | |||||
| /* L130: */ | |||||
| } | |||||
| } | |||||
| if (value < sum || sisnan_(&sum)) { | |||||
| value = sum; | |||||
| } | |||||
| /* L140: */ | |||||
| } | |||||
| } | |||||
| } else if (lsame_(norm, "I")) { | |||||
| /* Find normI(A). */ | |||||
| value = 0.f; | |||||
| if (lsame_(uplo, "U")) { | |||||
| if (lsame_(diag, "U")) { | |||||
| i__1 = *n; | |||||
| for (i__ = 1; i__ <= i__1; ++i__) { | |||||
| work[i__] = 1.f; | |||||
| /* L150: */ | |||||
| } | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| l = *k + 1 - j; | |||||
| /* Computing MAX */ | |||||
| i__2 = 1, i__3 = j - *k; | |||||
| i__4 = j - 1; | |||||
| for (i__ = f2cmax(i__2,i__3); i__ <= i__4; ++i__) { | |||||
| work[i__] += c_abs(&ab[l + i__ + j * ab_dim1]); | |||||
| /* L160: */ | |||||
| } | |||||
| /* L170: */ | |||||
| } | |||||
| } else { | |||||
| i__1 = *n; | |||||
| for (i__ = 1; i__ <= i__1; ++i__) { | |||||
| work[i__] = 0.f; | |||||
| /* L180: */ | |||||
| } | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| l = *k + 1 - j; | |||||
| /* Computing MAX */ | |||||
| i__4 = 1, i__2 = j - *k; | |||||
| i__3 = j; | |||||
| for (i__ = f2cmax(i__4,i__2); i__ <= i__3; ++i__) { | |||||
| work[i__] += c_abs(&ab[l + i__ + j * ab_dim1]); | |||||
| /* L190: */ | |||||
| } | |||||
| /* L200: */ | |||||
| } | |||||
| } | |||||
| } else { | |||||
| if (lsame_(diag, "U")) { | |||||
| i__1 = *n; | |||||
| for (i__ = 1; i__ <= i__1; ++i__) { | |||||
| work[i__] = 1.f; | |||||
| /* L210: */ | |||||
| } | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| l = 1 - j; | |||||
| /* Computing MIN */ | |||||
| i__4 = *n, i__2 = j + *k; | |||||
| i__3 = f2cmin(i__4,i__2); | |||||
| for (i__ = j + 1; i__ <= i__3; ++i__) { | |||||
| work[i__] += c_abs(&ab[l + i__ + j * ab_dim1]); | |||||
| /* L220: */ | |||||
| } | |||||
| /* L230: */ | |||||
| } | |||||
| } else { | |||||
| i__1 = *n; | |||||
| for (i__ = 1; i__ <= i__1; ++i__) { | |||||
| work[i__] = 0.f; | |||||
| /* L240: */ | |||||
| } | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| l = 1 - j; | |||||
| /* Computing MIN */ | |||||
| i__4 = *n, i__2 = j + *k; | |||||
| i__3 = f2cmin(i__4,i__2); | |||||
| for (i__ = j; i__ <= i__3; ++i__) { | |||||
| work[i__] += c_abs(&ab[l + i__ + j * ab_dim1]); | |||||
| /* L250: */ | |||||
| } | |||||
| /* L260: */ | |||||
| } | |||||
| } | |||||
| } | |||||
| i__1 = *n; | |||||
| for (i__ = 1; i__ <= i__1; ++i__) { | |||||
| sum = work[i__]; | |||||
| if (value < sum || sisnan_(&sum)) { | |||||
| value = sum; | |||||
| } | |||||
| /* L270: */ | |||||
| } | |||||
| } else if (lsame_(norm, "F") || lsame_(norm, "E")) { | |||||
| /* Find normF(A). */ | |||||
| /* SSQ(1) is scale */ | |||||
| /* SSQ(2) is sum-of-squares */ | |||||
| /* For better accuracy, sum each column separately. */ | |||||
| if (lsame_(uplo, "U")) { | |||||
| if (lsame_(diag, "U")) { | |||||
| ssq[0] = 1.f; | |||||
| ssq[1] = (real) (*n); | |||||
| if (*k > 0) { | |||||
| i__1 = *n; | |||||
| for (j = 2; j <= i__1; ++j) { | |||||
| colssq[0] = 0.f; | |||||
| colssq[1] = 1.f; | |||||
| /* Computing MIN */ | |||||
| i__4 = j - 1; | |||||
| i__3 = f2cmin(i__4,*k); | |||||
| /* Computing MAX */ | |||||
| i__2 = *k + 2 - j; | |||||
| classq_(&i__3, &ab[f2cmax(i__2,1) + j * ab_dim1], &c__1, | |||||
| colssq, &colssq[1]); | |||||
| scombssq_(ssq, colssq); | |||||
| /* L280: */ | |||||
| } | |||||
| } | |||||
| } else { | |||||
| ssq[0] = 0.f; | |||||
| ssq[1] = 1.f; | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| colssq[0] = 0.f; | |||||
| colssq[1] = 1.f; | |||||
| /* Computing MIN */ | |||||
| i__4 = j, i__2 = *k + 1; | |||||
| i__3 = f2cmin(i__4,i__2); | |||||
| /* Computing MAX */ | |||||
| i__5 = *k + 2 - j; | |||||
| classq_(&i__3, &ab[f2cmax(i__5,1) + j * ab_dim1], &c__1, | |||||
| colssq, &colssq[1]); | |||||
| scombssq_(ssq, colssq); | |||||
| /* L290: */ | |||||
| } | |||||
| } | |||||
| } else { | |||||
| if (lsame_(diag, "U")) { | |||||
| ssq[0] = 1.f; | |||||
| ssq[1] = (real) (*n); | |||||
| if (*k > 0) { | |||||
| i__1 = *n - 1; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| colssq[0] = 0.f; | |||||
| colssq[1] = 1.f; | |||||
| /* Computing MIN */ | |||||
| i__4 = *n - j; | |||||
| i__3 = f2cmin(i__4,*k); | |||||
| classq_(&i__3, &ab[j * ab_dim1 + 2], &c__1, colssq, & | |||||
| colssq[1]); | |||||
| scombssq_(ssq, colssq); | |||||
| /* L300: */ | |||||
| } | |||||
| } | |||||
| } else { | |||||
| ssq[0] = 0.f; | |||||
| ssq[1] = 1.f; | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| colssq[0] = 0.f; | |||||
| colssq[1] = 1.f; | |||||
| /* Computing MIN */ | |||||
| i__4 = *n - j + 1, i__2 = *k + 1; | |||||
| i__3 = f2cmin(i__4,i__2); | |||||
| classq_(&i__3, &ab[j * ab_dim1 + 1], &c__1, colssq, & | |||||
| colssq[1]); | |||||
| scombssq_(ssq, colssq); | |||||
| /* L310: */ | |||||
| } | |||||
| } | |||||
| } | |||||
| value = ssq[0] * sqrt(ssq[1]); | |||||
| } | |||||
| ret_val = value; | |||||
| return ret_val; | |||||
| /* End of CLANTB */ | |||||
| } /* clantb_ */ | |||||
| @@ -0,0 +1,839 @@ | |||||
| /* f2c.h -- Standard Fortran to C header file */ | |||||
| /** barf [ba:rf] 2. "He suggested using FORTRAN, and everybody barfed." | |||||
| - From The Shogakukan DICTIONARY OF NEW ENGLISH (Second edition) */ | |||||
| #ifndef F2C_INCLUDE | |||||
| #define F2C_INCLUDE | |||||
| #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 | |||||
| typedef int 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; | |||||
| 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;} | |||||
| #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)); } | |||||
| #define c_div(c, a, b) {pCf(c) = Cf(a)/Cf(b);} | |||||
| #define z_div(c, a, b) {pCd(c) = Cd(a)/Cd(b);} | |||||
| #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) = conj(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) (cimag(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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotc_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void cdotu_(complex *z, integer *n_, complex *x, integer *incx_, complex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotu_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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) | |||||
| */ | |||||
| /* Table of constant values */ | |||||
| static integer c__1 = 1; | |||||
| /* > \brief \b CLANTP returns the value of the 1-norm, or the Frobenius norm, or the infinity norm, or the ele | |||||
| ment of largest absolute value of a triangular matrix supplied in packed form. */ | |||||
| /* =========== DOCUMENTATION =========== */ | |||||
| /* Online html documentation available at */ | |||||
| /* http://www.netlib.org/lapack/explore-html/ */ | |||||
| /* > \htmlonly */ | |||||
| /* > Download CLANTP + dependencies */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/clantp. | |||||
| f"> */ | |||||
| /* > [TGZ]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/clantp. | |||||
| f"> */ | |||||
| /* > [ZIP]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/clantp. | |||||
| f"> */ | |||||
| /* > [TXT]</a> */ | |||||
| /* > \endhtmlonly */ | |||||
| /* Definition: */ | |||||
| /* =========== */ | |||||
| /* REAL FUNCTION CLANTP( NORM, UPLO, DIAG, N, AP, WORK ) */ | |||||
| /* CHARACTER DIAG, NORM, UPLO */ | |||||
| /* INTEGER N */ | |||||
| /* REAL WORK( * ) */ | |||||
| /* COMPLEX AP( * ) */ | |||||
| /* > \par Purpose: */ | |||||
| /* ============= */ | |||||
| /* > */ | |||||
| /* > \verbatim */ | |||||
| /* > */ | |||||
| /* > CLANTP returns the value of the one norm, or the Frobenius norm, or */ | |||||
| /* > the infinity norm, or the element of largest absolute value of a */ | |||||
| /* > triangular matrix A, supplied in packed form. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \return CLANTP */ | |||||
| /* > \verbatim */ | |||||
| /* > */ | |||||
| /* > CLANTP = ( f2cmax(abs(A(i,j))), NORM = 'M' or 'm' */ | |||||
| /* > ( */ | |||||
| /* > ( norm1(A), NORM = '1', 'O' or 'o' */ | |||||
| /* > ( */ | |||||
| /* > ( normI(A), NORM = 'I' or 'i' */ | |||||
| /* > ( */ | |||||
| /* > ( normF(A), NORM = 'F', 'f', 'E' or 'e' */ | |||||
| /* > */ | |||||
| /* > where norm1 denotes the one norm of a matrix (maximum column sum), */ | |||||
| /* > normI denotes the infinity norm of a matrix (maximum row sum) and */ | |||||
| /* > normF denotes the Frobenius norm of a matrix (square root of sum of */ | |||||
| /* > squares). Note that f2cmax(abs(A(i,j))) is not a consistent matrix norm. */ | |||||
| /* > \endverbatim */ | |||||
| /* Arguments: */ | |||||
| /* ========== */ | |||||
| /* > \param[in] NORM */ | |||||
| /* > \verbatim */ | |||||
| /* > NORM is CHARACTER*1 */ | |||||
| /* > Specifies the value to be returned in CLANTP as described */ | |||||
| /* > above. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] UPLO */ | |||||
| /* > \verbatim */ | |||||
| /* > UPLO is CHARACTER*1 */ | |||||
| /* > Specifies whether the matrix A is upper or lower triangular. */ | |||||
| /* > = 'U': Upper triangular */ | |||||
| /* > = 'L': Lower triangular */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] DIAG */ | |||||
| /* > \verbatim */ | |||||
| /* > DIAG is CHARACTER*1 */ | |||||
| /* > Specifies whether or not the matrix A is unit triangular. */ | |||||
| /* > = 'N': Non-unit triangular */ | |||||
| /* > = 'U': Unit triangular */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] N */ | |||||
| /* > \verbatim */ | |||||
| /* > N is INTEGER */ | |||||
| /* > The order of the matrix A. N >= 0. When N = 0, CLANTP is */ | |||||
| /* > set to zero. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] AP */ | |||||
| /* > \verbatim */ | |||||
| /* > AP is COMPLEX array, dimension (N*(N+1)/2) */ | |||||
| /* > The upper or lower triangular matrix A, packed columnwise in */ | |||||
| /* > a linear array. The j-th column of A is stored in the array */ | |||||
| /* > AP as follows: */ | |||||
| /* > if UPLO = 'U', AP(i + (j-1)*j/2) = A(i,j) for 1<=i<=j; */ | |||||
| /* > if UPLO = 'L', AP(i + (j-1)*(2n-j)/2) = A(i,j) for j<=i<=n. */ | |||||
| /* > Note that when DIAG = 'U', the elements of the array AP */ | |||||
| /* > corresponding to the diagonal elements of the matrix A are */ | |||||
| /* > not referenced, but are assumed to be one. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] WORK */ | |||||
| /* > \verbatim */ | |||||
| /* > WORK is REAL array, dimension (MAX(1,LWORK)), */ | |||||
| /* > where LWORK >= N when NORM = 'I'; otherwise, WORK is not */ | |||||
| /* > referenced. */ | |||||
| /* > \endverbatim */ | |||||
| /* Authors: */ | |||||
| /* ======== */ | |||||
| /* > \author Univ. of Tennessee */ | |||||
| /* > \author Univ. of California Berkeley */ | |||||
| /* > \author Univ. of Colorado Denver */ | |||||
| /* > \author NAG Ltd. */ | |||||
| /* > \date December 2016 */ | |||||
| /* > \ingroup complexOTHERauxiliary */ | |||||
| /* ===================================================================== */ | |||||
| real clantp_(char *norm, char *uplo, char *diag, integer *n, complex *ap, | |||||
| real *work) | |||||
| { | |||||
| /* System generated locals */ | |||||
| integer i__1, i__2; | |||||
| real ret_val; | |||||
| /* Local variables */ | |||||
| extern /* Subroutine */ int scombssq_(real *, real *); | |||||
| integer i__, j, k; | |||||
| logical udiag; | |||||
| extern logical lsame_(char *, char *); | |||||
| real value; | |||||
| extern /* Subroutine */ int classq_(integer *, complex *, integer *, real | |||||
| *, real *); | |||||
| extern logical sisnan_(real *); | |||||
| real colssq[2], sum, ssq[2]; | |||||
| /* -- LAPACK auxiliary routine (version 3.7.0) -- */ | |||||
| /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ | |||||
| /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ | |||||
| /* December 2016 */ | |||||
| /* ===================================================================== */ | |||||
| /* Parameter adjustments */ | |||||
| --work; | |||||
| --ap; | |||||
| /* Function Body */ | |||||
| if (*n == 0) { | |||||
| value = 0.f; | |||||
| } else if (lsame_(norm, "M")) { | |||||
| /* Find f2cmax(abs(A(i,j))). */ | |||||
| k = 1; | |||||
| if (lsame_(diag, "U")) { | |||||
| value = 1.f; | |||||
| if (lsame_(uplo, "U")) { | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| i__2 = k + j - 2; | |||||
| for (i__ = k; i__ <= i__2; ++i__) { | |||||
| sum = c_abs(&ap[i__]); | |||||
| if (value < sum || sisnan_(&sum)) { | |||||
| value = sum; | |||||
| } | |||||
| /* L10: */ | |||||
| } | |||||
| k += j; | |||||
| /* L20: */ | |||||
| } | |||||
| } else { | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| i__2 = k + *n - j; | |||||
| for (i__ = k + 1; i__ <= i__2; ++i__) { | |||||
| sum = c_abs(&ap[i__]); | |||||
| if (value < sum || sisnan_(&sum)) { | |||||
| value = sum; | |||||
| } | |||||
| /* L30: */ | |||||
| } | |||||
| k = k + *n - j + 1; | |||||
| /* L40: */ | |||||
| } | |||||
| } | |||||
| } else { | |||||
| value = 0.f; | |||||
| if (lsame_(uplo, "U")) { | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| i__2 = k + j - 1; | |||||
| for (i__ = k; i__ <= i__2; ++i__) { | |||||
| sum = c_abs(&ap[i__]); | |||||
| if (value < sum || sisnan_(&sum)) { | |||||
| value = sum; | |||||
| } | |||||
| /* L50: */ | |||||
| } | |||||
| k += j; | |||||
| /* L60: */ | |||||
| } | |||||
| } else { | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| i__2 = k + *n - j; | |||||
| for (i__ = k; i__ <= i__2; ++i__) { | |||||
| sum = c_abs(&ap[i__]); | |||||
| if (value < sum || sisnan_(&sum)) { | |||||
| value = sum; | |||||
| } | |||||
| /* L70: */ | |||||
| } | |||||
| k = k + *n - j + 1; | |||||
| /* L80: */ | |||||
| } | |||||
| } | |||||
| } | |||||
| } else if (lsame_(norm, "O") || *(unsigned char *) | |||||
| norm == '1') { | |||||
| /* Find norm1(A). */ | |||||
| value = 0.f; | |||||
| k = 1; | |||||
| udiag = lsame_(diag, "U"); | |||||
| if (lsame_(uplo, "U")) { | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| if (udiag) { | |||||
| sum = 1.f; | |||||
| i__2 = k + j - 2; | |||||
| for (i__ = k; i__ <= i__2; ++i__) { | |||||
| sum += c_abs(&ap[i__]); | |||||
| /* L90: */ | |||||
| } | |||||
| } else { | |||||
| sum = 0.f; | |||||
| i__2 = k + j - 1; | |||||
| for (i__ = k; i__ <= i__2; ++i__) { | |||||
| sum += c_abs(&ap[i__]); | |||||
| /* L100: */ | |||||
| } | |||||
| } | |||||
| k += j; | |||||
| if (value < sum || sisnan_(&sum)) { | |||||
| value = sum; | |||||
| } | |||||
| /* L110: */ | |||||
| } | |||||
| } else { | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| if (udiag) { | |||||
| sum = 1.f; | |||||
| i__2 = k + *n - j; | |||||
| for (i__ = k + 1; i__ <= i__2; ++i__) { | |||||
| sum += c_abs(&ap[i__]); | |||||
| /* L120: */ | |||||
| } | |||||
| } else { | |||||
| sum = 0.f; | |||||
| i__2 = k + *n - j; | |||||
| for (i__ = k; i__ <= i__2; ++i__) { | |||||
| sum += c_abs(&ap[i__]); | |||||
| /* L130: */ | |||||
| } | |||||
| } | |||||
| k = k + *n - j + 1; | |||||
| if (value < sum || sisnan_(&sum)) { | |||||
| value = sum; | |||||
| } | |||||
| /* L140: */ | |||||
| } | |||||
| } | |||||
| } else if (lsame_(norm, "I")) { | |||||
| /* Find normI(A). */ | |||||
| k = 1; | |||||
| if (lsame_(uplo, "U")) { | |||||
| if (lsame_(diag, "U")) { | |||||
| i__1 = *n; | |||||
| for (i__ = 1; i__ <= i__1; ++i__) { | |||||
| work[i__] = 1.f; | |||||
| /* L150: */ | |||||
| } | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| i__2 = j - 1; | |||||
| for (i__ = 1; i__ <= i__2; ++i__) { | |||||
| work[i__] += c_abs(&ap[k]); | |||||
| ++k; | |||||
| /* L160: */ | |||||
| } | |||||
| ++k; | |||||
| /* L170: */ | |||||
| } | |||||
| } else { | |||||
| i__1 = *n; | |||||
| for (i__ = 1; i__ <= i__1; ++i__) { | |||||
| work[i__] = 0.f; | |||||
| /* L180: */ | |||||
| } | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| i__2 = j; | |||||
| for (i__ = 1; i__ <= i__2; ++i__) { | |||||
| work[i__] += c_abs(&ap[k]); | |||||
| ++k; | |||||
| /* L190: */ | |||||
| } | |||||
| /* L200: */ | |||||
| } | |||||
| } | |||||
| } else { | |||||
| if (lsame_(diag, "U")) { | |||||
| i__1 = *n; | |||||
| for (i__ = 1; i__ <= i__1; ++i__) { | |||||
| work[i__] = 1.f; | |||||
| /* L210: */ | |||||
| } | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| ++k; | |||||
| i__2 = *n; | |||||
| for (i__ = j + 1; i__ <= i__2; ++i__) { | |||||
| work[i__] += c_abs(&ap[k]); | |||||
| ++k; | |||||
| /* L220: */ | |||||
| } | |||||
| /* L230: */ | |||||
| } | |||||
| } else { | |||||
| i__1 = *n; | |||||
| for (i__ = 1; i__ <= i__1; ++i__) { | |||||
| work[i__] = 0.f; | |||||
| /* L240: */ | |||||
| } | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| i__2 = *n; | |||||
| for (i__ = j; i__ <= i__2; ++i__) { | |||||
| work[i__] += c_abs(&ap[k]); | |||||
| ++k; | |||||
| /* L250: */ | |||||
| } | |||||
| /* L260: */ | |||||
| } | |||||
| } | |||||
| } | |||||
| value = 0.f; | |||||
| i__1 = *n; | |||||
| for (i__ = 1; i__ <= i__1; ++i__) { | |||||
| sum = work[i__]; | |||||
| if (value < sum || sisnan_(&sum)) { | |||||
| value = sum; | |||||
| } | |||||
| /* L270: */ | |||||
| } | |||||
| } else if (lsame_(norm, "F") || lsame_(norm, "E")) { | |||||
| /* Find normF(A). */ | |||||
| /* SSQ(1) is scale */ | |||||
| /* SSQ(2) is sum-of-squares */ | |||||
| /* For better accuracy, sum each column separately. */ | |||||
| if (lsame_(uplo, "U")) { | |||||
| if (lsame_(diag, "U")) { | |||||
| ssq[0] = 1.f; | |||||
| ssq[1] = (real) (*n); | |||||
| k = 2; | |||||
| i__1 = *n; | |||||
| for (j = 2; j <= i__1; ++j) { | |||||
| colssq[0] = 0.f; | |||||
| colssq[1] = 1.f; | |||||
| i__2 = j - 1; | |||||
| classq_(&i__2, &ap[k], &c__1, colssq, &colssq[1]); | |||||
| scombssq_(ssq, colssq); | |||||
| k += j; | |||||
| /* L280: */ | |||||
| } | |||||
| } else { | |||||
| ssq[0] = 0.f; | |||||
| ssq[1] = 1.f; | |||||
| k = 1; | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| colssq[0] = 0.f; | |||||
| colssq[1] = 1.f; | |||||
| classq_(&j, &ap[k], &c__1, colssq, &colssq[1]); | |||||
| scombssq_(ssq, colssq); | |||||
| k += j; | |||||
| /* L290: */ | |||||
| } | |||||
| } | |||||
| } else { | |||||
| if (lsame_(diag, "U")) { | |||||
| ssq[0] = 1.f; | |||||
| ssq[1] = (real) (*n); | |||||
| k = 2; | |||||
| i__1 = *n - 1; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| colssq[0] = 0.f; | |||||
| colssq[1] = 1.f; | |||||
| i__2 = *n - j; | |||||
| classq_(&i__2, &ap[k], &c__1, colssq, &colssq[1]); | |||||
| scombssq_(ssq, colssq); | |||||
| k = k + *n - j + 1; | |||||
| /* L300: */ | |||||
| } | |||||
| } else { | |||||
| ssq[0] = 0.f; | |||||
| ssq[1] = 1.f; | |||||
| k = 1; | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| colssq[0] = 0.f; | |||||
| colssq[1] = 1.f; | |||||
| i__2 = *n - j + 1; | |||||
| classq_(&i__2, &ap[k], &c__1, colssq, &colssq[1]); | |||||
| scombssq_(ssq, colssq); | |||||
| k = k + *n - j + 1; | |||||
| /* L310: */ | |||||
| } | |||||
| } | |||||
| } | |||||
| value = ssq[0] * sqrt(ssq[1]); | |||||
| } | |||||
| ret_val = value; | |||||
| return ret_val; | |||||
| /* End of CLANTP */ | |||||
| } /* clantp_ */ | |||||
| @@ -0,0 +1,852 @@ | |||||
| /* f2c.h -- Standard Fortran to C header file */ | |||||
| /** barf [ba:rf] 2. "He suggested using FORTRAN, and everybody barfed." | |||||
| - From The Shogakukan DICTIONARY OF NEW ENGLISH (Second edition) */ | |||||
| #ifndef F2C_INCLUDE | |||||
| #define F2C_INCLUDE | |||||
| #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 | |||||
| typedef int 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; | |||||
| 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;} | |||||
| #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)); } | |||||
| #define c_div(c, a, b) {pCf(c) = Cf(a)/Cf(b);} | |||||
| #define z_div(c, a, b) {pCd(c) = Cd(a)/Cd(b);} | |||||
| #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) = conj(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) (cimag(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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotc_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void cdotu_(complex *z, integer *n_, complex *x, integer *incx_, complex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotu_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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) | |||||
| */ | |||||
| /* Table of constant values */ | |||||
| static integer c__1 = 1; | |||||
| /* > \brief \b CLANTR returns the value of the 1-norm, or the Frobenius norm, or the infinity norm, or the ele | |||||
| ment of largest absolute value of a trapezoidal or triangular matrix. */ | |||||
| /* =========== DOCUMENTATION =========== */ | |||||
| /* Online html documentation available at */ | |||||
| /* http://www.netlib.org/lapack/explore-html/ */ | |||||
| /* > \htmlonly */ | |||||
| /* > Download CLANTR + dependencies */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/clantr. | |||||
| f"> */ | |||||
| /* > [TGZ]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/clantr. | |||||
| f"> */ | |||||
| /* > [ZIP]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/clantr. | |||||
| f"> */ | |||||
| /* > [TXT]</a> */ | |||||
| /* > \endhtmlonly */ | |||||
| /* Definition: */ | |||||
| /* =========== */ | |||||
| /* REAL FUNCTION CLANTR( NORM, UPLO, DIAG, M, N, A, LDA, */ | |||||
| /* WORK ) */ | |||||
| /* CHARACTER DIAG, NORM, UPLO */ | |||||
| /* INTEGER LDA, M, N */ | |||||
| /* REAL WORK( * ) */ | |||||
| /* COMPLEX A( LDA, * ) */ | |||||
| /* > \par Purpose: */ | |||||
| /* ============= */ | |||||
| /* > */ | |||||
| /* > \verbatim */ | |||||
| /* > */ | |||||
| /* > CLANTR returns the value of the one norm, or the Frobenius norm, or */ | |||||
| /* > the infinity norm, or the element of largest absolute value of a */ | |||||
| /* > trapezoidal or triangular matrix A. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \return CLANTR */ | |||||
| /* > \verbatim */ | |||||
| /* > */ | |||||
| /* > CLANTR = ( f2cmax(abs(A(i,j))), NORM = 'M' or 'm' */ | |||||
| /* > ( */ | |||||
| /* > ( norm1(A), NORM = '1', 'O' or 'o' */ | |||||
| /* > ( */ | |||||
| /* > ( normI(A), NORM = 'I' or 'i' */ | |||||
| /* > ( */ | |||||
| /* > ( normF(A), NORM = 'F', 'f', 'E' or 'e' */ | |||||
| /* > */ | |||||
| /* > where norm1 denotes the one norm of a matrix (maximum column sum), */ | |||||
| /* > normI denotes the infinity norm of a matrix (maximum row sum) and */ | |||||
| /* > normF denotes the Frobenius norm of a matrix (square root of sum of */ | |||||
| /* > squares). Note that f2cmax(abs(A(i,j))) is not a consistent matrix norm. */ | |||||
| /* > \endverbatim */ | |||||
| /* Arguments: */ | |||||
| /* ========== */ | |||||
| /* > \param[in] NORM */ | |||||
| /* > \verbatim */ | |||||
| /* > NORM is CHARACTER*1 */ | |||||
| /* > Specifies the value to be returned in CLANTR as described */ | |||||
| /* > above. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] UPLO */ | |||||
| /* > \verbatim */ | |||||
| /* > UPLO is CHARACTER*1 */ | |||||
| /* > Specifies whether the matrix A is upper or lower trapezoidal. */ | |||||
| /* > = 'U': Upper trapezoidal */ | |||||
| /* > = 'L': Lower trapezoidal */ | |||||
| /* > Note that A is triangular instead of trapezoidal if M = N. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] DIAG */ | |||||
| /* > \verbatim */ | |||||
| /* > DIAG is CHARACTER*1 */ | |||||
| /* > Specifies whether or not the matrix A has unit diagonal. */ | |||||
| /* > = 'N': Non-unit diagonal */ | |||||
| /* > = 'U': Unit diagonal */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] M */ | |||||
| /* > \verbatim */ | |||||
| /* > M is INTEGER */ | |||||
| /* > The number of rows of the matrix A. M >= 0, and if */ | |||||
| /* > UPLO = 'U', M <= N. When M = 0, CLANTR is set to zero. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] N */ | |||||
| /* > \verbatim */ | |||||
| /* > N is INTEGER */ | |||||
| /* > The number of columns of the matrix A. N >= 0, and if */ | |||||
| /* > UPLO = 'L', N <= M. When N = 0, CLANTR is set to zero. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] A */ | |||||
| /* > \verbatim */ | |||||
| /* > A is COMPLEX array, dimension (LDA,N) */ | |||||
| /* > The trapezoidal matrix A (A is triangular if M = N). */ | |||||
| /* > If UPLO = 'U', the leading m by n upper trapezoidal part of */ | |||||
| /* > the array A contains the upper trapezoidal matrix, and the */ | |||||
| /* > strictly lower triangular part of A is not referenced. */ | |||||
| /* > If UPLO = 'L', the leading m by n lower trapezoidal part of */ | |||||
| /* > the array A contains the lower trapezoidal matrix, and the */ | |||||
| /* > strictly upper triangular part of A is not referenced. Note */ | |||||
| /* > that when DIAG = 'U', the diagonal elements of A are not */ | |||||
| /* > referenced and are assumed to be one. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] LDA */ | |||||
| /* > \verbatim */ | |||||
| /* > LDA is INTEGER */ | |||||
| /* > The leading dimension of the array A. LDA >= f2cmax(M,1). */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] WORK */ | |||||
| /* > \verbatim */ | |||||
| /* > WORK is REAL array, dimension (MAX(1,LWORK)), */ | |||||
| /* > where LWORK >= M when NORM = 'I'; otherwise, WORK is not */ | |||||
| /* > referenced. */ | |||||
| /* > \endverbatim */ | |||||
| /* Authors: */ | |||||
| /* ======== */ | |||||
| /* > \author Univ. of Tennessee */ | |||||
| /* > \author Univ. of California Berkeley */ | |||||
| /* > \author Univ. of Colorado Denver */ | |||||
| /* > \author NAG Ltd. */ | |||||
| /* > \date December 2016 */ | |||||
| /* > \ingroup complexOTHERauxiliary */ | |||||
| /* ===================================================================== */ | |||||
| real clantr_(char *norm, char *uplo, char *diag, integer *m, integer *n, | |||||
| complex *a, integer *lda, real *work) | |||||
| { | |||||
| /* System generated locals */ | |||||
| integer a_dim1, a_offset, i__1, i__2, i__3, i__4; | |||||
| real ret_val; | |||||
| /* Local variables */ | |||||
| extern /* Subroutine */ int scombssq_(real *, real *); | |||||
| integer i__, j; | |||||
| logical udiag; | |||||
| extern logical lsame_(char *, char *); | |||||
| real value; | |||||
| extern /* Subroutine */ int classq_(integer *, complex *, integer *, real | |||||
| *, real *); | |||||
| extern logical sisnan_(real *); | |||||
| real colssq[2], sum, ssq[2]; | |||||
| /* -- LAPACK auxiliary routine (version 3.7.0) -- */ | |||||
| /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ | |||||
| /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ | |||||
| /* December 2016 */ | |||||
| /* ===================================================================== */ | |||||
| /* Parameter adjustments */ | |||||
| a_dim1 = *lda; | |||||
| a_offset = 1 + a_dim1 * 1; | |||||
| a -= a_offset; | |||||
| --work; | |||||
| /* Function Body */ | |||||
| if (f2cmin(*m,*n) == 0) { | |||||
| value = 0.f; | |||||
| } else if (lsame_(norm, "M")) { | |||||
| /* Find f2cmax(abs(A(i,j))). */ | |||||
| if (lsame_(diag, "U")) { | |||||
| value = 1.f; | |||||
| if (lsame_(uplo, "U")) { | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| /* Computing MIN */ | |||||
| i__3 = *m, i__4 = j - 1; | |||||
| i__2 = f2cmin(i__3,i__4); | |||||
| for (i__ = 1; i__ <= i__2; ++i__) { | |||||
| sum = c_abs(&a[i__ + j * a_dim1]); | |||||
| if (value < sum || sisnan_(&sum)) { | |||||
| value = sum; | |||||
| } | |||||
| /* L10: */ | |||||
| } | |||||
| /* L20: */ | |||||
| } | |||||
| } else { | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| i__2 = *m; | |||||
| for (i__ = j + 1; i__ <= i__2; ++i__) { | |||||
| sum = c_abs(&a[i__ + j * a_dim1]); | |||||
| if (value < sum || sisnan_(&sum)) { | |||||
| value = sum; | |||||
| } | |||||
| /* L30: */ | |||||
| } | |||||
| /* L40: */ | |||||
| } | |||||
| } | |||||
| } else { | |||||
| value = 0.f; | |||||
| if (lsame_(uplo, "U")) { | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| i__2 = f2cmin(*m,j); | |||||
| for (i__ = 1; i__ <= i__2; ++i__) { | |||||
| sum = c_abs(&a[i__ + j * a_dim1]); | |||||
| if (value < sum || sisnan_(&sum)) { | |||||
| value = sum; | |||||
| } | |||||
| /* L50: */ | |||||
| } | |||||
| /* L60: */ | |||||
| } | |||||
| } else { | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| i__2 = *m; | |||||
| for (i__ = j; i__ <= i__2; ++i__) { | |||||
| sum = c_abs(&a[i__ + j * a_dim1]); | |||||
| if (value < sum || sisnan_(&sum)) { | |||||
| value = sum; | |||||
| } | |||||
| /* L70: */ | |||||
| } | |||||
| /* L80: */ | |||||
| } | |||||
| } | |||||
| } | |||||
| } else if (lsame_(norm, "O") || *(unsigned char *) | |||||
| norm == '1') { | |||||
| /* Find norm1(A). */ | |||||
| value = 0.f; | |||||
| udiag = lsame_(diag, "U"); | |||||
| if (lsame_(uplo, "U")) { | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| if (udiag && j <= *m) { | |||||
| sum = 1.f; | |||||
| i__2 = j - 1; | |||||
| for (i__ = 1; i__ <= i__2; ++i__) { | |||||
| sum += c_abs(&a[i__ + j * a_dim1]); | |||||
| /* L90: */ | |||||
| } | |||||
| } else { | |||||
| sum = 0.f; | |||||
| i__2 = f2cmin(*m,j); | |||||
| for (i__ = 1; i__ <= i__2; ++i__) { | |||||
| sum += c_abs(&a[i__ + j * a_dim1]); | |||||
| /* L100: */ | |||||
| } | |||||
| } | |||||
| if (value < sum || sisnan_(&sum)) { | |||||
| value = sum; | |||||
| } | |||||
| /* L110: */ | |||||
| } | |||||
| } else { | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| if (udiag) { | |||||
| sum = 1.f; | |||||
| i__2 = *m; | |||||
| for (i__ = j + 1; i__ <= i__2; ++i__) { | |||||
| sum += c_abs(&a[i__ + j * a_dim1]); | |||||
| /* L120: */ | |||||
| } | |||||
| } else { | |||||
| sum = 0.f; | |||||
| i__2 = *m; | |||||
| for (i__ = j; i__ <= i__2; ++i__) { | |||||
| sum += c_abs(&a[i__ + j * a_dim1]); | |||||
| /* L130: */ | |||||
| } | |||||
| } | |||||
| if (value < sum || sisnan_(&sum)) { | |||||
| value = sum; | |||||
| } | |||||
| /* L140: */ | |||||
| } | |||||
| } | |||||
| } else if (lsame_(norm, "I")) { | |||||
| /* Find normI(A). */ | |||||
| if (lsame_(uplo, "U")) { | |||||
| if (lsame_(diag, "U")) { | |||||
| i__1 = *m; | |||||
| for (i__ = 1; i__ <= i__1; ++i__) { | |||||
| work[i__] = 1.f; | |||||
| /* L150: */ | |||||
| } | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| /* Computing MIN */ | |||||
| i__3 = *m, i__4 = j - 1; | |||||
| i__2 = f2cmin(i__3,i__4); | |||||
| for (i__ = 1; i__ <= i__2; ++i__) { | |||||
| work[i__] += c_abs(&a[i__ + j * a_dim1]); | |||||
| /* L160: */ | |||||
| } | |||||
| /* L170: */ | |||||
| } | |||||
| } else { | |||||
| i__1 = *m; | |||||
| for (i__ = 1; i__ <= i__1; ++i__) { | |||||
| work[i__] = 0.f; | |||||
| /* L180: */ | |||||
| } | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| i__2 = f2cmin(*m,j); | |||||
| for (i__ = 1; i__ <= i__2; ++i__) { | |||||
| work[i__] += c_abs(&a[i__ + j * a_dim1]); | |||||
| /* L190: */ | |||||
| } | |||||
| /* L200: */ | |||||
| } | |||||
| } | |||||
| } else { | |||||
| if (lsame_(diag, "U")) { | |||||
| i__1 = f2cmin(*m,*n); | |||||
| for (i__ = 1; i__ <= i__1; ++i__) { | |||||
| work[i__] = 1.f; | |||||
| /* L210: */ | |||||
| } | |||||
| i__1 = *m; | |||||
| for (i__ = *n + 1; i__ <= i__1; ++i__) { | |||||
| work[i__] = 0.f; | |||||
| /* L220: */ | |||||
| } | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| i__2 = *m; | |||||
| for (i__ = j + 1; i__ <= i__2; ++i__) { | |||||
| work[i__] += c_abs(&a[i__ + j * a_dim1]); | |||||
| /* L230: */ | |||||
| } | |||||
| /* L240: */ | |||||
| } | |||||
| } else { | |||||
| i__1 = *m; | |||||
| for (i__ = 1; i__ <= i__1; ++i__) { | |||||
| work[i__] = 0.f; | |||||
| /* L250: */ | |||||
| } | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| i__2 = *m; | |||||
| for (i__ = j; i__ <= i__2; ++i__) { | |||||
| work[i__] += c_abs(&a[i__ + j * a_dim1]); | |||||
| /* L260: */ | |||||
| } | |||||
| /* L270: */ | |||||
| } | |||||
| } | |||||
| } | |||||
| value = 0.f; | |||||
| i__1 = *m; | |||||
| for (i__ = 1; i__ <= i__1; ++i__) { | |||||
| sum = work[i__]; | |||||
| if (value < sum || sisnan_(&sum)) { | |||||
| value = sum; | |||||
| } | |||||
| /* L280: */ | |||||
| } | |||||
| } else if (lsame_(norm, "F") || lsame_(norm, "E")) { | |||||
| /* Find normF(A). */ | |||||
| /* SSQ(1) is scale */ | |||||
| /* SSQ(2) is sum-of-squares */ | |||||
| /* For better accuracy, sum each column separately. */ | |||||
| if (lsame_(uplo, "U")) { | |||||
| if (lsame_(diag, "U")) { | |||||
| ssq[0] = 1.f; | |||||
| ssq[1] = (real) f2cmin(*m,*n); | |||||
| i__1 = *n; | |||||
| for (j = 2; j <= i__1; ++j) { | |||||
| colssq[0] = 0.f; | |||||
| colssq[1] = 1.f; | |||||
| /* Computing MIN */ | |||||
| i__3 = *m, i__4 = j - 1; | |||||
| i__2 = f2cmin(i__3,i__4); | |||||
| classq_(&i__2, &a[j * a_dim1 + 1], &c__1, colssq, &colssq[ | |||||
| 1]); | |||||
| scombssq_(ssq, colssq); | |||||
| /* L290: */ | |||||
| } | |||||
| } else { | |||||
| ssq[0] = 0.f; | |||||
| ssq[1] = 1.f; | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| colssq[0] = 0.f; | |||||
| colssq[1] = 1.f; | |||||
| i__2 = f2cmin(*m,j); | |||||
| classq_(&i__2, &a[j * a_dim1 + 1], &c__1, colssq, &colssq[ | |||||
| 1]); | |||||
| scombssq_(ssq, colssq); | |||||
| /* L300: */ | |||||
| } | |||||
| } | |||||
| } else { | |||||
| if (lsame_(diag, "U")) { | |||||
| ssq[0] = 1.f; | |||||
| ssq[1] = (real) f2cmin(*m,*n); | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| colssq[0] = 0.f; | |||||
| colssq[1] = 1.f; | |||||
| i__2 = *m - j; | |||||
| /* Computing MIN */ | |||||
| i__3 = *m, i__4 = j + 1; | |||||
| classq_(&i__2, &a[f2cmin(i__3,i__4) + j * a_dim1], &c__1, | |||||
| colssq, &colssq[1]); | |||||
| scombssq_(ssq, colssq); | |||||
| /* L310: */ | |||||
| } | |||||
| } else { | |||||
| ssq[0] = 0.f; | |||||
| ssq[1] = 1.f; | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| colssq[0] = 0.f; | |||||
| colssq[1] = 1.f; | |||||
| i__2 = *m - j + 1; | |||||
| classq_(&i__2, &a[j + j * a_dim1], &c__1, colssq, &colssq[ | |||||
| 1]); | |||||
| scombssq_(ssq, colssq); | |||||
| /* L320: */ | |||||
| } | |||||
| } | |||||
| } | |||||
| value = ssq[0] * sqrt(ssq[1]); | |||||
| } | |||||
| ret_val = value; | |||||
| return ret_val; | |||||
| /* End of CLANTR */ | |||||
| } /* clantr_ */ | |||||
| @@ -0,0 +1,565 @@ | |||||
| /* f2c.h -- Standard Fortran to C header file */ | |||||
| /** barf [ba:rf] 2. "He suggested using FORTRAN, and everybody barfed." | |||||
| - From The Shogakukan DICTIONARY OF NEW ENGLISH (Second edition) */ | |||||
| #ifndef F2C_INCLUDE | |||||
| #define F2C_INCLUDE | |||||
| #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 | |||||
| typedef int 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; | |||||
| 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;} | |||||
| #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)); } | |||||
| #define c_div(c, a, b) {pCf(c) = Cf(a)/Cf(b);} | |||||
| #define z_div(c, a, b) {pCd(c) = Cd(a)/Cd(b);} | |||||
| #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) = conj(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) (cimag(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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotc_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void cdotu_(complex *z, integer *n_, complex *x, integer *incx_, complex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotu_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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) | |||||
| */ | |||||
| /* > \brief \b CLAPLL measures the linear dependence of two vectors. */ | |||||
| /* =========== DOCUMENTATION =========== */ | |||||
| /* Online html documentation available at */ | |||||
| /* http://www.netlib.org/lapack/explore-html/ */ | |||||
| /* > \htmlonly */ | |||||
| /* > Download CLAPLL + dependencies */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/clapll. | |||||
| f"> */ | |||||
| /* > [TGZ]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/clapll. | |||||
| f"> */ | |||||
| /* > [ZIP]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/clapll. | |||||
| f"> */ | |||||
| /* > [TXT]</a> */ | |||||
| /* > \endhtmlonly */ | |||||
| /* Definition: */ | |||||
| /* =========== */ | |||||
| /* SUBROUTINE CLAPLL( N, X, INCX, Y, INCY, SSMIN ) */ | |||||
| /* INTEGER INCX, INCY, N */ | |||||
| /* REAL SSMIN */ | |||||
| /* COMPLEX X( * ), Y( * ) */ | |||||
| /* > \par Purpose: */ | |||||
| /* ============= */ | |||||
| /* > */ | |||||
| /* > \verbatim */ | |||||
| /* > */ | |||||
| /* > Given two column vectors X and Y, let */ | |||||
| /* > */ | |||||
| /* > A = ( X Y ). */ | |||||
| /* > */ | |||||
| /* > The subroutine first computes the QR factorization of A = Q*R, */ | |||||
| /* > and then computes the SVD of the 2-by-2 upper triangular matrix R. */ | |||||
| /* > The smaller singular value of R is returned in SSMIN, which is used */ | |||||
| /* > as the measurement of the linear dependency of the vectors X and Y. */ | |||||
| /* > \endverbatim */ | |||||
| /* Arguments: */ | |||||
| /* ========== */ | |||||
| /* > \param[in] N */ | |||||
| /* > \verbatim */ | |||||
| /* > N is INTEGER */ | |||||
| /* > The length of the vectors X and Y. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in,out] X */ | |||||
| /* > \verbatim */ | |||||
| /* > X is COMPLEX array, dimension (1+(N-1)*INCX) */ | |||||
| /* > On entry, X contains the N-vector X. */ | |||||
| /* > On exit, X is overwritten. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] INCX */ | |||||
| /* > \verbatim */ | |||||
| /* > INCX is INTEGER */ | |||||
| /* > The increment between successive elements of X. INCX > 0. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in,out] Y */ | |||||
| /* > \verbatim */ | |||||
| /* > Y is COMPLEX array, dimension (1+(N-1)*INCY) */ | |||||
| /* > On entry, Y contains the N-vector Y. */ | |||||
| /* > On exit, Y is overwritten. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] INCY */ | |||||
| /* > \verbatim */ | |||||
| /* > INCY is INTEGER */ | |||||
| /* > The increment between successive elements of Y. INCY > 0. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] SSMIN */ | |||||
| /* > \verbatim */ | |||||
| /* > SSMIN is REAL */ | |||||
| /* > The smallest singular value of the N-by-2 matrix A = ( X Y ). */ | |||||
| /* > \endverbatim */ | |||||
| /* Authors: */ | |||||
| /* ======== */ | |||||
| /* > \author Univ. of Tennessee */ | |||||
| /* > \author Univ. of California Berkeley */ | |||||
| /* > \author Univ. of Colorado Denver */ | |||||
| /* > \author NAG Ltd. */ | |||||
| /* > \date December 2016 */ | |||||
| /* > \ingroup complexOTHERauxiliary */ | |||||
| /* ===================================================================== */ | |||||
| /* Subroutine */ int clapll_(integer *n, complex *x, integer *incx, complex * | |||||
| y, integer *incy, real *ssmin) | |||||
| { | |||||
| /* System generated locals */ | |||||
| integer i__1; | |||||
| real r__1, r__2, r__3; | |||||
| complex q__1, q__2, q__3, q__4; | |||||
| /* Local variables */ | |||||
| extern /* Subroutine */ int slas2_(real *, real *, real *, real *, real *) | |||||
| ; | |||||
| complex c__; | |||||
| extern /* Complex */ VOID cdotc_(complex *, integer *, complex *, integer | |||||
| *, complex *, integer *); | |||||
| extern /* Subroutine */ int caxpy_(integer *, complex *, complex *, | |||||
| integer *, complex *, integer *); | |||||
| real ssmax; | |||||
| complex a11, a12, a22; | |||||
| extern /* Subroutine */ int clarfg_(integer *, complex *, complex *, | |||||
| integer *, complex *); | |||||
| complex tau; | |||||
| /* -- LAPACK auxiliary routine (version 3.7.0) -- */ | |||||
| /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ | |||||
| /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ | |||||
| /* December 2016 */ | |||||
| /* ===================================================================== */ | |||||
| /* Quick return if possible */ | |||||
| /* Parameter adjustments */ | |||||
| --y; | |||||
| --x; | |||||
| /* Function Body */ | |||||
| if (*n <= 1) { | |||||
| *ssmin = 0.f; | |||||
| return 0; | |||||
| } | |||||
| /* Compute the QR factorization of the N-by-2 matrix ( X Y ) */ | |||||
| clarfg_(n, &x[1], &x[*incx + 1], incx, &tau); | |||||
| a11.r = x[1].r, a11.i = x[1].i; | |||||
| x[1].r = 1.f, x[1].i = 0.f; | |||||
| r_cnjg(&q__3, &tau); | |||||
| q__2.r = -q__3.r, q__2.i = -q__3.i; | |||||
| cdotc_(&q__4, n, &x[1], incx, &y[1], incy); | |||||
| q__1.r = q__2.r * q__4.r - q__2.i * q__4.i, q__1.i = q__2.r * q__4.i + | |||||
| q__2.i * q__4.r; | |||||
| c__.r = q__1.r, c__.i = q__1.i; | |||||
| caxpy_(n, &c__, &x[1], incx, &y[1], incy); | |||||
| i__1 = *n - 1; | |||||
| clarfg_(&i__1, &y[*incy + 1], &y[(*incy << 1) + 1], incy, &tau); | |||||
| a12.r = y[1].r, a12.i = y[1].i; | |||||
| i__1 = *incy + 1; | |||||
| a22.r = y[i__1].r, a22.i = y[i__1].i; | |||||
| /* Compute the SVD of 2-by-2 Upper triangular matrix. */ | |||||
| r__1 = c_abs(&a11); | |||||
| r__2 = c_abs(&a12); | |||||
| r__3 = c_abs(&a22); | |||||
| slas2_(&r__1, &r__2, &r__3, ssmin, &ssmax); | |||||
| return 0; | |||||
| /* End of CLAPLL */ | |||||
| } /* clapll_ */ | |||||
| @@ -0,0 +1,619 @@ | |||||
| /* f2c.h -- Standard Fortran to C header file */ | |||||
| /** barf [ba:rf] 2. "He suggested using FORTRAN, and everybody barfed." | |||||
| - From The Shogakukan DICTIONARY OF NEW ENGLISH (Second edition) */ | |||||
| #ifndef F2C_INCLUDE | |||||
| #define F2C_INCLUDE | |||||
| #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 | |||||
| typedef int 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; | |||||
| 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;} | |||||
| #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)); } | |||||
| #define c_div(c, a, b) {pCf(c) = Cf(a)/Cf(b);} | |||||
| #define z_div(c, a, b) {pCd(c) = Cd(a)/Cd(b);} | |||||
| #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) = conj(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) (cimag(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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotc_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void cdotu_(complex *z, integer *n_, complex *x, integer *incx_, complex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotu_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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) | |||||
| */ | |||||
| /* > \brief \b CLAPMR rearranges rows of a matrix as specified by a permutation vector. */ | |||||
| /* =========== DOCUMENTATION =========== */ | |||||
| /* Online html documentation available at */ | |||||
| /* http://www.netlib.org/lapack/explore-html/ */ | |||||
| /* > \htmlonly */ | |||||
| /* > Download CLAPMR + dependencies */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/clapmr. | |||||
| f"> */ | |||||
| /* > [TGZ]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/clapmr. | |||||
| f"> */ | |||||
| /* > [ZIP]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/clapmr. | |||||
| f"> */ | |||||
| /* > [TXT]</a> */ | |||||
| /* > \endhtmlonly */ | |||||
| /* Definition: */ | |||||
| /* =========== */ | |||||
| /* SUBROUTINE CLAPMR( FORWRD, M, N, X, LDX, K ) */ | |||||
| /* LOGICAL FORWRD */ | |||||
| /* INTEGER LDX, M, N */ | |||||
| /* INTEGER K( * ) */ | |||||
| /* COMPLEX X( LDX, * ) */ | |||||
| /* > \par Purpose: */ | |||||
| /* ============= */ | |||||
| /* > */ | |||||
| /* > \verbatim */ | |||||
| /* > */ | |||||
| /* > CLAPMR rearranges the rows of the M by N matrix X as specified */ | |||||
| /* > by the permutation K(1),K(2),...,K(M) of the integers 1,...,M. */ | |||||
| /* > If FORWRD = .TRUE., forward permutation: */ | |||||
| /* > */ | |||||
| /* > X(K(I),*) is moved X(I,*) for I = 1,2,...,M. */ | |||||
| /* > */ | |||||
| /* > If FORWRD = .FALSE., backward permutation: */ | |||||
| /* > */ | |||||
| /* > X(I,*) is moved to X(K(I),*) for I = 1,2,...,M. */ | |||||
| /* > \endverbatim */ | |||||
| /* Arguments: */ | |||||
| /* ========== */ | |||||
| /* > \param[in] FORWRD */ | |||||
| /* > \verbatim */ | |||||
| /* > FORWRD is LOGICAL */ | |||||
| /* > = .TRUE., forward permutation */ | |||||
| /* > = .FALSE., backward permutation */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] M */ | |||||
| /* > \verbatim */ | |||||
| /* > M is INTEGER */ | |||||
| /* > The number of rows of the matrix X. M >= 0. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] N */ | |||||
| /* > \verbatim */ | |||||
| /* > N is INTEGER */ | |||||
| /* > The number of columns of the matrix X. N >= 0. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in,out] X */ | |||||
| /* > \verbatim */ | |||||
| /* > X is COMPLEX array, dimension (LDX,N) */ | |||||
| /* > On entry, the M by N matrix X. */ | |||||
| /* > On exit, X contains the permuted matrix X. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] LDX */ | |||||
| /* > \verbatim */ | |||||
| /* > LDX is INTEGER */ | |||||
| /* > The leading dimension of the array X, LDX >= MAX(1,M). */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in,out] K */ | |||||
| /* > \verbatim */ | |||||
| /* > K is INTEGER array, dimension (M) */ | |||||
| /* > On entry, K contains the permutation vector. K is used as */ | |||||
| /* > internal workspace, but reset to its original value on */ | |||||
| /* > output. */ | |||||
| /* > \endverbatim */ | |||||
| /* Authors: */ | |||||
| /* ======== */ | |||||
| /* > \author Univ. of Tennessee */ | |||||
| /* > \author Univ. of California Berkeley */ | |||||
| /* > \author Univ. of Colorado Denver */ | |||||
| /* > \author NAG Ltd. */ | |||||
| /* > \date December 2016 */ | |||||
| /* > \ingroup complexOTHERauxiliary */ | |||||
| /* ===================================================================== */ | |||||
| /* Subroutine */ int clapmr_(logical *forwrd, integer *m, integer *n, complex | |||||
| *x, integer *ldx, integer *k) | |||||
| { | |||||
| /* System generated locals */ | |||||
| integer x_dim1, x_offset, i__1, i__2, i__3, i__4; | |||||
| /* Local variables */ | |||||
| complex temp; | |||||
| integer i__, j, jj, in; | |||||
| /* -- LAPACK auxiliary routine (version 3.7.0) -- */ | |||||
| /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ | |||||
| /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ | |||||
| /* December 2016 */ | |||||
| /* ===================================================================== */ | |||||
| /* Parameter adjustments */ | |||||
| x_dim1 = *ldx; | |||||
| x_offset = 1 + x_dim1 * 1; | |||||
| x -= x_offset; | |||||
| --k; | |||||
| /* Function Body */ | |||||
| if (*m <= 1) { | |||||
| return 0; | |||||
| } | |||||
| i__1 = *m; | |||||
| for (i__ = 1; i__ <= i__1; ++i__) { | |||||
| k[i__] = -k[i__]; | |||||
| /* L10: */ | |||||
| } | |||||
| if (*forwrd) { | |||||
| /* Forward permutation */ | |||||
| i__1 = *m; | |||||
| for (i__ = 1; i__ <= i__1; ++i__) { | |||||
| if (k[i__] > 0) { | |||||
| goto L40; | |||||
| } | |||||
| j = i__; | |||||
| k[j] = -k[j]; | |||||
| in = k[j]; | |||||
| L20: | |||||
| if (k[in] > 0) { | |||||
| goto L40; | |||||
| } | |||||
| i__2 = *n; | |||||
| for (jj = 1; jj <= i__2; ++jj) { | |||||
| i__3 = j + jj * x_dim1; | |||||
| temp.r = x[i__3].r, temp.i = x[i__3].i; | |||||
| i__3 = j + jj * x_dim1; | |||||
| i__4 = in + jj * x_dim1; | |||||
| x[i__3].r = x[i__4].r, x[i__3].i = x[i__4].i; | |||||
| i__3 = in + jj * x_dim1; | |||||
| x[i__3].r = temp.r, x[i__3].i = temp.i; | |||||
| /* L30: */ | |||||
| } | |||||
| k[in] = -k[in]; | |||||
| j = in; | |||||
| in = k[in]; | |||||
| goto L20; | |||||
| L40: | |||||
| /* L50: */ | |||||
| ; | |||||
| } | |||||
| } else { | |||||
| /* Backward permutation */ | |||||
| i__1 = *m; | |||||
| for (i__ = 1; i__ <= i__1; ++i__) { | |||||
| if (k[i__] > 0) { | |||||
| goto L80; | |||||
| } | |||||
| k[i__] = -k[i__]; | |||||
| j = k[i__]; | |||||
| L60: | |||||
| if (j == i__) { | |||||
| goto L80; | |||||
| } | |||||
| i__2 = *n; | |||||
| for (jj = 1; jj <= i__2; ++jj) { | |||||
| i__3 = i__ + jj * x_dim1; | |||||
| temp.r = x[i__3].r, temp.i = x[i__3].i; | |||||
| i__3 = i__ + jj * x_dim1; | |||||
| i__4 = j + jj * x_dim1; | |||||
| x[i__3].r = x[i__4].r, x[i__3].i = x[i__4].i; | |||||
| i__3 = j + jj * x_dim1; | |||||
| x[i__3].r = temp.r, x[i__3].i = temp.i; | |||||
| /* L70: */ | |||||
| } | |||||
| k[j] = -k[j]; | |||||
| j = k[j]; | |||||
| goto L60; | |||||
| L80: | |||||
| /* L90: */ | |||||
| ; | |||||
| } | |||||
| } | |||||
| return 0; | |||||
| /* End of ZLAPMT */ | |||||
| } /* clapmr_ */ | |||||
| @@ -0,0 +1,618 @@ | |||||
| /* f2c.h -- Standard Fortran to C header file */ | |||||
| /** barf [ba:rf] 2. "He suggested using FORTRAN, and everybody barfed." | |||||
| - From The Shogakukan DICTIONARY OF NEW ENGLISH (Second edition) */ | |||||
| #ifndef F2C_INCLUDE | |||||
| #define F2C_INCLUDE | |||||
| #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 | |||||
| typedef int 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; | |||||
| 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;} | |||||
| #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)); } | |||||
| #define c_div(c, a, b) {pCf(c) = Cf(a)/Cf(b);} | |||||
| #define z_div(c, a, b) {pCd(c) = Cd(a)/Cd(b);} | |||||
| #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) = conj(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) (cimag(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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotc_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void cdotu_(complex *z, integer *n_, complex *x, integer *incx_, complex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotu_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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) | |||||
| */ | |||||
| /* > \brief \b CLAPMT performs a forward or backward permutation of the columns of a matrix. */ | |||||
| /* =========== DOCUMENTATION =========== */ | |||||
| /* Online html documentation available at */ | |||||
| /* http://www.netlib.org/lapack/explore-html/ */ | |||||
| /* > \htmlonly */ | |||||
| /* > Download CLAPMT + dependencies */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/clapmt. | |||||
| f"> */ | |||||
| /* > [TGZ]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/clapmt. | |||||
| f"> */ | |||||
| /* > [ZIP]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/clapmt. | |||||
| f"> */ | |||||
| /* > [TXT]</a> */ | |||||
| /* > \endhtmlonly */ | |||||
| /* Definition: */ | |||||
| /* =========== */ | |||||
| /* SUBROUTINE CLAPMT( FORWRD, M, N, X, LDX, K ) */ | |||||
| /* LOGICAL FORWRD */ | |||||
| /* INTEGER LDX, M, N */ | |||||
| /* INTEGER K( * ) */ | |||||
| /* COMPLEX X( LDX, * ) */ | |||||
| /* > \par Purpose: */ | |||||
| /* ============= */ | |||||
| /* > */ | |||||
| /* > \verbatim */ | |||||
| /* > */ | |||||
| /* > CLAPMT rearranges the columns of the M by N matrix X as specified */ | |||||
| /* > by the permutation K(1),K(2),...,K(N) of the integers 1,...,N. */ | |||||
| /* > If FORWRD = .TRUE., forward permutation: */ | |||||
| /* > */ | |||||
| /* > X(*,K(J)) is moved X(*,J) for J = 1,2,...,N. */ | |||||
| /* > */ | |||||
| /* > If FORWRD = .FALSE., backward permutation: */ | |||||
| /* > */ | |||||
| /* > X(*,J) is moved to X(*,K(J)) for J = 1,2,...,N. */ | |||||
| /* > \endverbatim */ | |||||
| /* Arguments: */ | |||||
| /* ========== */ | |||||
| /* > \param[in] FORWRD */ | |||||
| /* > \verbatim */ | |||||
| /* > FORWRD is LOGICAL */ | |||||
| /* > = .TRUE., forward permutation */ | |||||
| /* > = .FALSE., backward permutation */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] M */ | |||||
| /* > \verbatim */ | |||||
| /* > M is INTEGER */ | |||||
| /* > The number of rows of the matrix X. M >= 0. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] N */ | |||||
| /* > \verbatim */ | |||||
| /* > N is INTEGER */ | |||||
| /* > The number of columns of the matrix X. N >= 0. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in,out] X */ | |||||
| /* > \verbatim */ | |||||
| /* > X is COMPLEX array, dimension (LDX,N) */ | |||||
| /* > On entry, the M by N matrix X. */ | |||||
| /* > On exit, X contains the permuted matrix X. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] LDX */ | |||||
| /* > \verbatim */ | |||||
| /* > LDX is INTEGER */ | |||||
| /* > The leading dimension of the array X, LDX >= MAX(1,M). */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in,out] K */ | |||||
| /* > \verbatim */ | |||||
| /* > K is INTEGER array, dimension (N) */ | |||||
| /* > On entry, K contains the permutation vector. K is used as */ | |||||
| /* > internal workspace, but reset to its original value on */ | |||||
| /* > output. */ | |||||
| /* > \endverbatim */ | |||||
| /* Authors: */ | |||||
| /* ======== */ | |||||
| /* > \author Univ. of Tennessee */ | |||||
| /* > \author Univ. of California Berkeley */ | |||||
| /* > \author Univ. of Colorado Denver */ | |||||
| /* > \author NAG Ltd. */ | |||||
| /* > \date December 2016 */ | |||||
| /* > \ingroup complexOTHERauxiliary */ | |||||
| /* ===================================================================== */ | |||||
| /* Subroutine */ int clapmt_(logical *forwrd, integer *m, integer *n, complex | |||||
| *x, integer *ldx, integer *k) | |||||
| { | |||||
| /* System generated locals */ | |||||
| integer x_dim1, x_offset, i__1, i__2, i__3, i__4; | |||||
| /* Local variables */ | |||||
| complex temp; | |||||
| integer i__, j, ii, in; | |||||
| /* -- LAPACK auxiliary routine (version 3.7.0) -- */ | |||||
| /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ | |||||
| /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ | |||||
| /* December 2016 */ | |||||
| /* ===================================================================== */ | |||||
| /* Parameter adjustments */ | |||||
| x_dim1 = *ldx; | |||||
| x_offset = 1 + x_dim1 * 1; | |||||
| x -= x_offset; | |||||
| --k; | |||||
| /* Function Body */ | |||||
| if (*n <= 1) { | |||||
| return 0; | |||||
| } | |||||
| i__1 = *n; | |||||
| for (i__ = 1; i__ <= i__1; ++i__) { | |||||
| k[i__] = -k[i__]; | |||||
| /* L10: */ | |||||
| } | |||||
| if (*forwrd) { | |||||
| /* Forward permutation */ | |||||
| i__1 = *n; | |||||
| for (i__ = 1; i__ <= i__1; ++i__) { | |||||
| if (k[i__] > 0) { | |||||
| goto L40; | |||||
| } | |||||
| j = i__; | |||||
| k[j] = -k[j]; | |||||
| in = k[j]; | |||||
| L20: | |||||
| if (k[in] > 0) { | |||||
| goto L40; | |||||
| } | |||||
| i__2 = *m; | |||||
| for (ii = 1; ii <= i__2; ++ii) { | |||||
| i__3 = ii + j * x_dim1; | |||||
| temp.r = x[i__3].r, temp.i = x[i__3].i; | |||||
| i__3 = ii + j * x_dim1; | |||||
| i__4 = ii + in * x_dim1; | |||||
| x[i__3].r = x[i__4].r, x[i__3].i = x[i__4].i; | |||||
| i__3 = ii + in * x_dim1; | |||||
| x[i__3].r = temp.r, x[i__3].i = temp.i; | |||||
| /* L30: */ | |||||
| } | |||||
| k[in] = -k[in]; | |||||
| j = in; | |||||
| in = k[in]; | |||||
| goto L20; | |||||
| L40: | |||||
| /* L60: */ | |||||
| ; | |||||
| } | |||||
| } else { | |||||
| /* Backward permutation */ | |||||
| i__1 = *n; | |||||
| for (i__ = 1; i__ <= i__1; ++i__) { | |||||
| if (k[i__] > 0) { | |||||
| goto L100; | |||||
| } | |||||
| k[i__] = -k[i__]; | |||||
| j = k[i__]; | |||||
| L80: | |||||
| if (j == i__) { | |||||
| goto L100; | |||||
| } | |||||
| i__2 = *m; | |||||
| for (ii = 1; ii <= i__2; ++ii) { | |||||
| i__3 = ii + i__ * x_dim1; | |||||
| temp.r = x[i__3].r, temp.i = x[i__3].i; | |||||
| i__3 = ii + i__ * x_dim1; | |||||
| i__4 = ii + j * x_dim1; | |||||
| x[i__3].r = x[i__4].r, x[i__3].i = x[i__4].i; | |||||
| i__3 = ii + j * x_dim1; | |||||
| x[i__3].r = temp.r, x[i__3].i = temp.i; | |||||
| /* L90: */ | |||||
| } | |||||
| k[j] = -k[j]; | |||||
| j = k[j]; | |||||
| goto L80; | |||||
| L100: | |||||
| /* L110: */ | |||||
| ; | |||||
| } | |||||
| } | |||||
| return 0; | |||||
| /* End of CLAPMT */ | |||||
| } /* clapmt_ */ | |||||
| @@ -0,0 +1,677 @@ | |||||
| /* f2c.h -- Standard Fortran to C header file */ | |||||
| /** barf [ba:rf] 2. "He suggested using FORTRAN, and everybody barfed." | |||||
| - From The Shogakukan DICTIONARY OF NEW ENGLISH (Second edition) */ | |||||
| #ifndef F2C_INCLUDE | |||||
| #define F2C_INCLUDE | |||||
| #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 | |||||
| typedef int 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; | |||||
| 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;} | |||||
| #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)); } | |||||
| #define c_div(c, a, b) {pCf(c) = Cf(a)/Cf(b);} | |||||
| #define z_div(c, a, b) {pCd(c) = Cd(a)/Cd(b);} | |||||
| #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) = conj(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) (cimag(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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotc_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void cdotu_(complex *z, integer *n_, complex *x, integer *incx_, complex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotu_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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) | |||||
| */ | |||||
| /* > \brief \b CLAQGB scales a general band matrix, using row and column scaling factors computed by sgbequ. | |||||
| */ | |||||
| /* =========== DOCUMENTATION =========== */ | |||||
| /* Online html documentation available at */ | |||||
| /* http://www.netlib.org/lapack/explore-html/ */ | |||||
| /* > \htmlonly */ | |||||
| /* > Download CLAQGB + dependencies */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/claqgb. | |||||
| f"> */ | |||||
| /* > [TGZ]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/claqgb. | |||||
| f"> */ | |||||
| /* > [ZIP]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/claqgb. | |||||
| f"> */ | |||||
| /* > [TXT]</a> */ | |||||
| /* > \endhtmlonly */ | |||||
| /* Definition: */ | |||||
| /* =========== */ | |||||
| /* SUBROUTINE CLAQGB( M, N, KL, KU, AB, LDAB, R, C, ROWCND, COLCND, */ | |||||
| /* AMAX, EQUED ) */ | |||||
| /* CHARACTER EQUED */ | |||||
| /* INTEGER KL, KU, LDAB, M, N */ | |||||
| /* REAL AMAX, COLCND, ROWCND */ | |||||
| /* REAL C( * ), R( * ) */ | |||||
| /* COMPLEX AB( LDAB, * ) */ | |||||
| /* > \par Purpose: */ | |||||
| /* ============= */ | |||||
| /* > */ | |||||
| /* > \verbatim */ | |||||
| /* > */ | |||||
| /* > CLAQGB equilibrates a general M by N band matrix A with KL */ | |||||
| /* > subdiagonals and KU superdiagonals using the row and scaling factors */ | |||||
| /* > in the vectors R and C. */ | |||||
| /* > \endverbatim */ | |||||
| /* Arguments: */ | |||||
| /* ========== */ | |||||
| /* > \param[in] M */ | |||||
| /* > \verbatim */ | |||||
| /* > M is INTEGER */ | |||||
| /* > The number of rows of the matrix A. M >= 0. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] N */ | |||||
| /* > \verbatim */ | |||||
| /* > N is INTEGER */ | |||||
| /* > The number of columns of the matrix A. N >= 0. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] KL */ | |||||
| /* > \verbatim */ | |||||
| /* > KL is INTEGER */ | |||||
| /* > The number of subdiagonals within the band of A. KL >= 0. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] KU */ | |||||
| /* > \verbatim */ | |||||
| /* > KU is INTEGER */ | |||||
| /* > The number of superdiagonals within the band of A. KU >= 0. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in,out] AB */ | |||||
| /* > \verbatim */ | |||||
| /* > AB is COMPLEX array, dimension (LDAB,N) */ | |||||
| /* > On entry, the matrix A in band storage, in rows 1 to KL+KU+1. */ | |||||
| /* > The j-th column of A is stored in the j-th column of the */ | |||||
| /* > array AB as follows: */ | |||||
| /* > AB(ku+1+i-j,j) = A(i,j) for f2cmax(1,j-ku)<=i<=f2cmin(m,j+kl) */ | |||||
| /* > */ | |||||
| /* > On exit, the equilibrated matrix, in the same storage format */ | |||||
| /* > as A. See EQUED for the form of the equilibrated matrix. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] LDAB */ | |||||
| /* > \verbatim */ | |||||
| /* > LDAB is INTEGER */ | |||||
| /* > The leading dimension of the array AB. LDA >= KL+KU+1. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] R */ | |||||
| /* > \verbatim */ | |||||
| /* > R is REAL array, dimension (M) */ | |||||
| /* > The row scale factors for A. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] C */ | |||||
| /* > \verbatim */ | |||||
| /* > C is REAL array, dimension (N) */ | |||||
| /* > The column scale factors for A. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] ROWCND */ | |||||
| /* > \verbatim */ | |||||
| /* > ROWCND is REAL */ | |||||
| /* > Ratio of the smallest R(i) to the largest R(i). */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] COLCND */ | |||||
| /* > \verbatim */ | |||||
| /* > COLCND is REAL */ | |||||
| /* > Ratio of the smallest C(i) to the largest C(i). */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] AMAX */ | |||||
| /* > \verbatim */ | |||||
| /* > AMAX is REAL */ | |||||
| /* > Absolute value of largest matrix entry. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] EQUED */ | |||||
| /* > \verbatim */ | |||||
| /* > EQUED is CHARACTER*1 */ | |||||
| /* > Specifies the form of equilibration that was done. */ | |||||
| /* > = 'N': No equilibration */ | |||||
| /* > = 'R': Row equilibration, i.e., A has been premultiplied by */ | |||||
| /* > diag(R). */ | |||||
| /* > = 'C': Column equilibration, i.e., A has been postmultiplied */ | |||||
| /* > by diag(C). */ | |||||
| /* > = 'B': Both row and column equilibration, i.e., A has been */ | |||||
| /* > replaced by diag(R) * A * diag(C). */ | |||||
| /* > \endverbatim */ | |||||
| /* > \par Internal Parameters: */ | |||||
| /* ========================= */ | |||||
| /* > */ | |||||
| /* > \verbatim */ | |||||
| /* > THRESH is a threshold value used to decide if row or column scaling */ | |||||
| /* > should be done based on the ratio of the row or column scaling */ | |||||
| /* > factors. If ROWCND < THRESH, row scaling is done, and if */ | |||||
| /* > COLCND < THRESH, column scaling is done. */ | |||||
| /* > */ | |||||
| /* > LARGE and SMALL are threshold values used to decide if row scaling */ | |||||
| /* > should be done based on the absolute size of the largest matrix */ | |||||
| /* > element. If AMAX > LARGE or AMAX < SMALL, row scaling is done. */ | |||||
| /* > \endverbatim */ | |||||
| /* Authors: */ | |||||
| /* ======== */ | |||||
| /* > \author Univ. of Tennessee */ | |||||
| /* > \author Univ. of California Berkeley */ | |||||
| /* > \author Univ. of Colorado Denver */ | |||||
| /* > \author NAG Ltd. */ | |||||
| /* > \date December 2016 */ | |||||
| /* > \ingroup complexGBauxiliary */ | |||||
| /* ===================================================================== */ | |||||
| /* Subroutine */ int claqgb_(integer *m, integer *n, integer *kl, integer *ku, | |||||
| complex *ab, integer *ldab, real *r__, real *c__, real *rowcnd, real | |||||
| *colcnd, real *amax, char *equed) | |||||
| { | |||||
| /* System generated locals */ | |||||
| integer ab_dim1, ab_offset, i__1, i__2, i__3, i__4, i__5, i__6; | |||||
| real r__1; | |||||
| complex q__1; | |||||
| /* Local variables */ | |||||
| integer i__, j; | |||||
| real large, small, cj; | |||||
| extern real slamch_(char *); | |||||
| /* -- LAPACK auxiliary routine (version 3.7.0) -- */ | |||||
| /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ | |||||
| /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ | |||||
| /* December 2016 */ | |||||
| /* ===================================================================== */ | |||||
| /* Quick return if possible */ | |||||
| /* Parameter adjustments */ | |||||
| ab_dim1 = *ldab; | |||||
| ab_offset = 1 + ab_dim1 * 1; | |||||
| ab -= ab_offset; | |||||
| --r__; | |||||
| --c__; | |||||
| /* Function Body */ | |||||
| if (*m <= 0 || *n <= 0) { | |||||
| *(unsigned char *)equed = 'N'; | |||||
| return 0; | |||||
| } | |||||
| /* Initialize LARGE and SMALL. */ | |||||
| small = slamch_("Safe minimum") / slamch_("Precision"); | |||||
| large = 1.f / small; | |||||
| if (*rowcnd >= .1f && *amax >= small && *amax <= large) { | |||||
| /* No row scaling */ | |||||
| if (*colcnd >= .1f) { | |||||
| /* No column scaling */ | |||||
| *(unsigned char *)equed = 'N'; | |||||
| } else { | |||||
| /* Column scaling */ | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| cj = c__[j]; | |||||
| /* Computing MAX */ | |||||
| i__2 = 1, i__3 = j - *ku; | |||||
| /* Computing MIN */ | |||||
| i__5 = *m, i__6 = j + *kl; | |||||
| i__4 = f2cmin(i__5,i__6); | |||||
| for (i__ = f2cmax(i__2,i__3); i__ <= i__4; ++i__) { | |||||
| i__2 = *ku + 1 + i__ - j + j * ab_dim1; | |||||
| i__3 = *ku + 1 + i__ - j + j * ab_dim1; | |||||
| q__1.r = cj * ab[i__3].r, q__1.i = cj * ab[i__3].i; | |||||
| ab[i__2].r = q__1.r, ab[i__2].i = q__1.i; | |||||
| /* L10: */ | |||||
| } | |||||
| /* L20: */ | |||||
| } | |||||
| *(unsigned char *)equed = 'C'; | |||||
| } | |||||
| } else if (*colcnd >= .1f) { | |||||
| /* Row scaling, no column scaling */ | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| /* Computing MAX */ | |||||
| i__4 = 1, i__2 = j - *ku; | |||||
| /* Computing MIN */ | |||||
| i__5 = *m, i__6 = j + *kl; | |||||
| i__3 = f2cmin(i__5,i__6); | |||||
| for (i__ = f2cmax(i__4,i__2); i__ <= i__3; ++i__) { | |||||
| i__4 = *ku + 1 + i__ - j + j * ab_dim1; | |||||
| i__2 = i__; | |||||
| i__5 = *ku + 1 + i__ - j + j * ab_dim1; | |||||
| q__1.r = r__[i__2] * ab[i__5].r, q__1.i = r__[i__2] * ab[i__5] | |||||
| .i; | |||||
| ab[i__4].r = q__1.r, ab[i__4].i = q__1.i; | |||||
| /* L30: */ | |||||
| } | |||||
| /* L40: */ | |||||
| } | |||||
| *(unsigned char *)equed = 'R'; | |||||
| } else { | |||||
| /* Row and column scaling */ | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| cj = c__[j]; | |||||
| /* Computing MAX */ | |||||
| i__3 = 1, i__4 = j - *ku; | |||||
| /* Computing MIN */ | |||||
| i__5 = *m, i__6 = j + *kl; | |||||
| i__2 = f2cmin(i__5,i__6); | |||||
| for (i__ = f2cmax(i__3,i__4); i__ <= i__2; ++i__) { | |||||
| i__3 = *ku + 1 + i__ - j + j * ab_dim1; | |||||
| r__1 = cj * r__[i__]; | |||||
| i__4 = *ku + 1 + i__ - j + j * ab_dim1; | |||||
| q__1.r = r__1 * ab[i__4].r, q__1.i = r__1 * ab[i__4].i; | |||||
| ab[i__3].r = q__1.r, ab[i__3].i = q__1.i; | |||||
| /* L50: */ | |||||
| } | |||||
| /* L60: */ | |||||
| } | |||||
| *(unsigned char *)equed = 'B'; | |||||
| } | |||||
| return 0; | |||||
| /* End of CLAQGB */ | |||||
| } /* claqgb_ */ | |||||
| @@ -0,0 +1,648 @@ | |||||
| /* f2c.h -- Standard Fortran to C header file */ | |||||
| /** barf [ba:rf] 2. "He suggested using FORTRAN, and everybody barfed." | |||||
| - From The Shogakukan DICTIONARY OF NEW ENGLISH (Second edition) */ | |||||
| #ifndef F2C_INCLUDE | |||||
| #define F2C_INCLUDE | |||||
| #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 | |||||
| typedef int 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; | |||||
| 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;} | |||||
| #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)); } | |||||
| #define c_div(c, a, b) {pCf(c) = Cf(a)/Cf(b);} | |||||
| #define z_div(c, a, b) {pCd(c) = Cd(a)/Cd(b);} | |||||
| #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) = conj(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) (cimag(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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotc_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void cdotu_(complex *z, integer *n_, complex *x, integer *incx_, complex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotu_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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) | |||||
| */ | |||||
| /* > \brief \b CLAQGE scales a general rectangular matrix, using row and column scaling factors computed by sg | |||||
| eequ. */ | |||||
| /* =========== DOCUMENTATION =========== */ | |||||
| /* Online html documentation available at */ | |||||
| /* http://www.netlib.org/lapack/explore-html/ */ | |||||
| /* > \htmlonly */ | |||||
| /* > Download CLAQGE + dependencies */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/claqge. | |||||
| f"> */ | |||||
| /* > [TGZ]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/claqge. | |||||
| f"> */ | |||||
| /* > [ZIP]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/claqge. | |||||
| f"> */ | |||||
| /* > [TXT]</a> */ | |||||
| /* > \endhtmlonly */ | |||||
| /* Definition: */ | |||||
| /* =========== */ | |||||
| /* SUBROUTINE CLAQGE( M, N, A, LDA, R, C, ROWCND, COLCND, AMAX, */ | |||||
| /* EQUED ) */ | |||||
| /* CHARACTER EQUED */ | |||||
| /* INTEGER LDA, M, N */ | |||||
| /* REAL AMAX, COLCND, ROWCND */ | |||||
| /* REAL C( * ), R( * ) */ | |||||
| /* COMPLEX A( LDA, * ) */ | |||||
| /* > \par Purpose: */ | |||||
| /* ============= */ | |||||
| /* > */ | |||||
| /* > \verbatim */ | |||||
| /* > */ | |||||
| /* > CLAQGE equilibrates a general M by N matrix A using the row and */ | |||||
| /* > column scaling factors in the vectors R and C. */ | |||||
| /* > \endverbatim */ | |||||
| /* Arguments: */ | |||||
| /* ========== */ | |||||
| /* > \param[in] M */ | |||||
| /* > \verbatim */ | |||||
| /* > M is INTEGER */ | |||||
| /* > The number of rows of the matrix A. M >= 0. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] N */ | |||||
| /* > \verbatim */ | |||||
| /* > N is INTEGER */ | |||||
| /* > The number of columns of the matrix A. N >= 0. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in,out] A */ | |||||
| /* > \verbatim */ | |||||
| /* > A is COMPLEX array, dimension (LDA,N) */ | |||||
| /* > On entry, the M by N matrix A. */ | |||||
| /* > On exit, the equilibrated matrix. See EQUED for the form of */ | |||||
| /* > the equilibrated matrix. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] LDA */ | |||||
| /* > \verbatim */ | |||||
| /* > LDA is INTEGER */ | |||||
| /* > The leading dimension of the array A. LDA >= f2cmax(M,1). */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] R */ | |||||
| /* > \verbatim */ | |||||
| /* > R is REAL array, dimension (M) */ | |||||
| /* > The row scale factors for A. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] C */ | |||||
| /* > \verbatim */ | |||||
| /* > C is REAL array, dimension (N) */ | |||||
| /* > The column scale factors for A. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] ROWCND */ | |||||
| /* > \verbatim */ | |||||
| /* > ROWCND is REAL */ | |||||
| /* > Ratio of the smallest R(i) to the largest R(i). */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] COLCND */ | |||||
| /* > \verbatim */ | |||||
| /* > COLCND is REAL */ | |||||
| /* > Ratio of the smallest C(i) to the largest C(i). */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] AMAX */ | |||||
| /* > \verbatim */ | |||||
| /* > AMAX is REAL */ | |||||
| /* > Absolute value of largest matrix entry. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] EQUED */ | |||||
| /* > \verbatim */ | |||||
| /* > EQUED is CHARACTER*1 */ | |||||
| /* > Specifies the form of equilibration that was done. */ | |||||
| /* > = 'N': No equilibration */ | |||||
| /* > = 'R': Row equilibration, i.e., A has been premultiplied by */ | |||||
| /* > diag(R). */ | |||||
| /* > = 'C': Column equilibration, i.e., A has been postmultiplied */ | |||||
| /* > by diag(C). */ | |||||
| /* > = 'B': Both row and column equilibration, i.e., A has been */ | |||||
| /* > replaced by diag(R) * A * diag(C). */ | |||||
| /* > \endverbatim */ | |||||
| /* > \par Internal Parameters: */ | |||||
| /* ========================= */ | |||||
| /* > */ | |||||
| /* > \verbatim */ | |||||
| /* > THRESH is a threshold value used to decide if row or column scaling */ | |||||
| /* > should be done based on the ratio of the row or column scaling */ | |||||
| /* > factors. If ROWCND < THRESH, row scaling is done, and if */ | |||||
| /* > COLCND < THRESH, column scaling is done. */ | |||||
| /* > */ | |||||
| /* > LARGE and SMALL are threshold values used to decide if row scaling */ | |||||
| /* > should be done based on the absolute size of the largest matrix */ | |||||
| /* > element. If AMAX > LARGE or AMAX < SMALL, row scaling is done. */ | |||||
| /* > \endverbatim */ | |||||
| /* Authors: */ | |||||
| /* ======== */ | |||||
| /* > \author Univ. of Tennessee */ | |||||
| /* > \author Univ. of California Berkeley */ | |||||
| /* > \author Univ. of Colorado Denver */ | |||||
| /* > \author NAG Ltd. */ | |||||
| /* > \date December 2016 */ | |||||
| /* > \ingroup complexGEauxiliary */ | |||||
| /* ===================================================================== */ | |||||
| /* Subroutine */ int claqge_(integer *m, integer *n, complex *a, integer *lda, | |||||
| real *r__, real *c__, real *rowcnd, real *colcnd, real *amax, char * | |||||
| equed) | |||||
| { | |||||
| /* System generated locals */ | |||||
| integer a_dim1, a_offset, i__1, i__2, i__3, i__4, i__5; | |||||
| real r__1; | |||||
| complex q__1; | |||||
| /* Local variables */ | |||||
| integer i__, j; | |||||
| real large, small, cj; | |||||
| extern real slamch_(char *); | |||||
| /* -- LAPACK auxiliary routine (version 3.7.0) -- */ | |||||
| /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ | |||||
| /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ | |||||
| /* December 2016 */ | |||||
| /* ===================================================================== */ | |||||
| /* Quick return if possible */ | |||||
| /* Parameter adjustments */ | |||||
| a_dim1 = *lda; | |||||
| a_offset = 1 + a_dim1 * 1; | |||||
| a -= a_offset; | |||||
| --r__; | |||||
| --c__; | |||||
| /* Function Body */ | |||||
| if (*m <= 0 || *n <= 0) { | |||||
| *(unsigned char *)equed = 'N'; | |||||
| return 0; | |||||
| } | |||||
| /* Initialize LARGE and SMALL. */ | |||||
| small = slamch_("Safe minimum") / slamch_("Precision"); | |||||
| large = 1.f / small; | |||||
| if (*rowcnd >= .1f && *amax >= small && *amax <= large) { | |||||
| /* No row scaling */ | |||||
| if (*colcnd >= .1f) { | |||||
| /* No column scaling */ | |||||
| *(unsigned char *)equed = 'N'; | |||||
| } else { | |||||
| /* Column scaling */ | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| cj = c__[j]; | |||||
| i__2 = *m; | |||||
| for (i__ = 1; i__ <= i__2; ++i__) { | |||||
| i__3 = i__ + j * a_dim1; | |||||
| i__4 = i__ + j * a_dim1; | |||||
| q__1.r = cj * a[i__4].r, q__1.i = cj * a[i__4].i; | |||||
| a[i__3].r = q__1.r, a[i__3].i = q__1.i; | |||||
| /* L10: */ | |||||
| } | |||||
| /* L20: */ | |||||
| } | |||||
| *(unsigned char *)equed = 'C'; | |||||
| } | |||||
| } else if (*colcnd >= .1f) { | |||||
| /* Row scaling, no column scaling */ | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| i__2 = *m; | |||||
| for (i__ = 1; i__ <= i__2; ++i__) { | |||||
| i__3 = i__ + j * a_dim1; | |||||
| i__4 = i__; | |||||
| i__5 = i__ + j * a_dim1; | |||||
| q__1.r = r__[i__4] * a[i__5].r, q__1.i = r__[i__4] * a[i__5] | |||||
| .i; | |||||
| a[i__3].r = q__1.r, a[i__3].i = q__1.i; | |||||
| /* L30: */ | |||||
| } | |||||
| /* L40: */ | |||||
| } | |||||
| *(unsigned char *)equed = 'R'; | |||||
| } else { | |||||
| /* Row and column scaling */ | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| cj = c__[j]; | |||||
| i__2 = *m; | |||||
| for (i__ = 1; i__ <= i__2; ++i__) { | |||||
| i__3 = i__ + j * a_dim1; | |||||
| r__1 = cj * r__[i__]; | |||||
| i__4 = i__ + j * a_dim1; | |||||
| q__1.r = r__1 * a[i__4].r, q__1.i = r__1 * a[i__4].i; | |||||
| a[i__3].r = q__1.r, a[i__3].i = q__1.i; | |||||
| /* L50: */ | |||||
| } | |||||
| /* L60: */ | |||||
| } | |||||
| *(unsigned char *)equed = 'B'; | |||||
| } | |||||
| return 0; | |||||
| /* End of CLAQGE */ | |||||
| } /* claqge_ */ | |||||
| @@ -0,0 +1,639 @@ | |||||
| /* f2c.h -- Standard Fortran to C header file */ | |||||
| /** barf [ba:rf] 2. "He suggested using FORTRAN, and everybody barfed." | |||||
| - From The Shogakukan DICTIONARY OF NEW ENGLISH (Second edition) */ | |||||
| #ifndef F2C_INCLUDE | |||||
| #define F2C_INCLUDE | |||||
| #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 | |||||
| typedef int 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; | |||||
| 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;} | |||||
| #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)); } | |||||
| #define c_div(c, a, b) {pCf(c) = Cf(a)/Cf(b);} | |||||
| #define z_div(c, a, b) {pCd(c) = Cd(a)/Cd(b);} | |||||
| #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) = conj(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) (cimag(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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotc_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void cdotu_(complex *z, integer *n_, complex *x, integer *incx_, complex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotu_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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) | |||||
| */ | |||||
| /* > \brief \b CLAQHB scales a Hermitian band matrix, using scaling factors computed by cpbequ. */ | |||||
| /* =========== DOCUMENTATION =========== */ | |||||
| /* Online html documentation available at */ | |||||
| /* http://www.netlib.org/lapack/explore-html/ */ | |||||
| /* > \htmlonly */ | |||||
| /* > Download CLAQHB + dependencies */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/claqhb. | |||||
| f"> */ | |||||
| /* > [TGZ]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/claqhb. | |||||
| f"> */ | |||||
| /* > [ZIP]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/claqhb. | |||||
| f"> */ | |||||
| /* > [TXT]</a> */ | |||||
| /* > \endhtmlonly */ | |||||
| /* Definition: */ | |||||
| /* =========== */ | |||||
| /* SUBROUTINE CLAQHB( UPLO, N, KD, AB, LDAB, S, SCOND, AMAX, EQUED ) */ | |||||
| /* CHARACTER EQUED, UPLO */ | |||||
| /* INTEGER KD, LDAB, N */ | |||||
| /* REAL AMAX, SCOND */ | |||||
| /* REAL S( * ) */ | |||||
| /* COMPLEX AB( LDAB, * ) */ | |||||
| /* > \par Purpose: */ | |||||
| /* ============= */ | |||||
| /* > */ | |||||
| /* > \verbatim */ | |||||
| /* > */ | |||||
| /* > CLAQHB equilibrates an Hermitian band matrix A using the scaling */ | |||||
| /* > factors in the vector S. */ | |||||
| /* > \endverbatim */ | |||||
| /* Arguments: */ | |||||
| /* ========== */ | |||||
| /* > \param[in] UPLO */ | |||||
| /* > \verbatim */ | |||||
| /* > UPLO is CHARACTER*1 */ | |||||
| /* > Specifies whether the upper or lower triangular part of the */ | |||||
| /* > symmetric matrix A is stored. */ | |||||
| /* > = 'U': Upper triangular */ | |||||
| /* > = 'L': Lower triangular */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] N */ | |||||
| /* > \verbatim */ | |||||
| /* > N is INTEGER */ | |||||
| /* > The order of the matrix A. N >= 0. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] KD */ | |||||
| /* > \verbatim */ | |||||
| /* > KD is INTEGER */ | |||||
| /* > The number of super-diagonals of the matrix A if UPLO = 'U', */ | |||||
| /* > or the number of sub-diagonals if UPLO = 'L'. KD >= 0. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in,out] AB */ | |||||
| /* > \verbatim */ | |||||
| /* > AB is COMPLEX array, dimension (LDAB,N) */ | |||||
| /* > On entry, the upper or lower triangle of the symmetric band */ | |||||
| /* > matrix A, stored in the first KD+1 rows of the array. The */ | |||||
| /* > j-th column of A is stored in the j-th column of the array AB */ | |||||
| /* > as follows: */ | |||||
| /* > if UPLO = 'U', AB(kd+1+i-j,j) = A(i,j) for f2cmax(1,j-kd)<=i<=j; */ | |||||
| /* > if UPLO = 'L', AB(1+i-j,j) = A(i,j) for j<=i<=f2cmin(n,j+kd). */ | |||||
| /* > */ | |||||
| /* > On exit, if INFO = 0, the triangular factor U or L from the */ | |||||
| /* > Cholesky factorization A = U**H *U or A = L*L**H of the band */ | |||||
| /* > matrix A, in the same storage format as A. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] LDAB */ | |||||
| /* > \verbatim */ | |||||
| /* > LDAB is INTEGER */ | |||||
| /* > The leading dimension of the array AB. LDAB >= KD+1. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] S */ | |||||
| /* > \verbatim */ | |||||
| /* > S is REAL array, dimension (N) */ | |||||
| /* > The scale factors for A. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] SCOND */ | |||||
| /* > \verbatim */ | |||||
| /* > SCOND is REAL */ | |||||
| /* > Ratio of the smallest S(i) to the largest S(i). */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] AMAX */ | |||||
| /* > \verbatim */ | |||||
| /* > AMAX is REAL */ | |||||
| /* > Absolute value of largest matrix entry. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] EQUED */ | |||||
| /* > \verbatim */ | |||||
| /* > EQUED is CHARACTER*1 */ | |||||
| /* > Specifies whether or not equilibration was done. */ | |||||
| /* > = 'N': No equilibration. */ | |||||
| /* > = 'Y': Equilibration was done, i.e., A has been replaced by */ | |||||
| /* > diag(S) * A * diag(S). */ | |||||
| /* > \endverbatim */ | |||||
| /* > \par Internal Parameters: */ | |||||
| /* ========================= */ | |||||
| /* > */ | |||||
| /* > \verbatim */ | |||||
| /* > THRESH is a threshold value used to decide if scaling should be done */ | |||||
| /* > based on the ratio of the scaling factors. If SCOND < THRESH, */ | |||||
| /* > scaling is done. */ | |||||
| /* > */ | |||||
| /* > LARGE and SMALL are threshold values used to decide if scaling should */ | |||||
| /* > be done based on the absolute size of the largest matrix element. */ | |||||
| /* > If AMAX > LARGE or AMAX < SMALL, scaling is done. */ | |||||
| /* > \endverbatim */ | |||||
| /* Authors: */ | |||||
| /* ======== */ | |||||
| /* > \author Univ. of Tennessee */ | |||||
| /* > \author Univ. of California Berkeley */ | |||||
| /* > \author Univ. of Colorado Denver */ | |||||
| /* > \author NAG Ltd. */ | |||||
| /* > \date December 2016 */ | |||||
| /* > \ingroup complexOTHERauxiliary */ | |||||
| /* ===================================================================== */ | |||||
| /* Subroutine */ int claqhb_(char *uplo, integer *n, integer *kd, complex *ab, | |||||
| integer *ldab, real *s, real *scond, real *amax, char *equed) | |||||
| { | |||||
| /* System generated locals */ | |||||
| integer ab_dim1, ab_offset, i__1, i__2, i__3, i__4; | |||||
| real r__1; | |||||
| complex q__1; | |||||
| /* Local variables */ | |||||
| integer i__, j; | |||||
| real large; | |||||
| extern logical lsame_(char *, char *); | |||||
| real small, cj; | |||||
| extern real slamch_(char *); | |||||
| /* -- LAPACK auxiliary routine (version 3.7.0) -- */ | |||||
| /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ | |||||
| /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ | |||||
| /* December 2016 */ | |||||
| /* ===================================================================== */ | |||||
| /* Quick return if possible */ | |||||
| /* Parameter adjustments */ | |||||
| ab_dim1 = *ldab; | |||||
| ab_offset = 1 + ab_dim1 * 1; | |||||
| ab -= ab_offset; | |||||
| --s; | |||||
| /* Function Body */ | |||||
| if (*n <= 0) { | |||||
| *(unsigned char *)equed = 'N'; | |||||
| return 0; | |||||
| } | |||||
| /* Initialize LARGE and SMALL. */ | |||||
| small = slamch_("Safe minimum") / slamch_("Precision"); | |||||
| large = 1.f / small; | |||||
| if (*scond >= .1f && *amax >= small && *amax <= large) { | |||||
| /* No equilibration */ | |||||
| *(unsigned char *)equed = 'N'; | |||||
| } else { | |||||
| /* Replace A by diag(S) * A * diag(S). */ | |||||
| if (lsame_(uplo, "U")) { | |||||
| /* Upper triangle of A is stored in band format. */ | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| cj = s[j]; | |||||
| /* Computing MAX */ | |||||
| i__2 = 1, i__3 = j - *kd; | |||||
| i__4 = j - 1; | |||||
| for (i__ = f2cmax(i__2,i__3); i__ <= i__4; ++i__) { | |||||
| i__2 = *kd + 1 + i__ - j + j * ab_dim1; | |||||
| r__1 = cj * s[i__]; | |||||
| i__3 = *kd + 1 + i__ - j + j * ab_dim1; | |||||
| q__1.r = r__1 * ab[i__3].r, q__1.i = r__1 * ab[i__3].i; | |||||
| ab[i__2].r = q__1.r, ab[i__2].i = q__1.i; | |||||
| /* L10: */ | |||||
| } | |||||
| i__4 = *kd + 1 + j * ab_dim1; | |||||
| i__2 = *kd + 1 + j * ab_dim1; | |||||
| r__1 = cj * cj * ab[i__2].r; | |||||
| ab[i__4].r = r__1, ab[i__4].i = 0.f; | |||||
| /* L20: */ | |||||
| } | |||||
| } else { | |||||
| /* Lower triangle of A is stored. */ | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| cj = s[j]; | |||||
| i__4 = j * ab_dim1 + 1; | |||||
| i__2 = j * ab_dim1 + 1; | |||||
| r__1 = cj * cj * ab[i__2].r; | |||||
| ab[i__4].r = r__1, ab[i__4].i = 0.f; | |||||
| /* Computing MIN */ | |||||
| i__2 = *n, i__3 = j + *kd; | |||||
| i__4 = f2cmin(i__2,i__3); | |||||
| for (i__ = j + 1; i__ <= i__4; ++i__) { | |||||
| i__2 = i__ + 1 - j + j * ab_dim1; | |||||
| r__1 = cj * s[i__]; | |||||
| i__3 = i__ + 1 - j + j * ab_dim1; | |||||
| q__1.r = r__1 * ab[i__3].r, q__1.i = r__1 * ab[i__3].i; | |||||
| ab[i__2].r = q__1.r, ab[i__2].i = q__1.i; | |||||
| /* L30: */ | |||||
| } | |||||
| /* L40: */ | |||||
| } | |||||
| } | |||||
| *(unsigned char *)equed = 'Y'; | |||||
| } | |||||
| return 0; | |||||
| /* End of CLAQHB */ | |||||
| } /* claqhb_ */ | |||||
| @@ -0,0 +1,628 @@ | |||||
| /* f2c.h -- Standard Fortran to C header file */ | |||||
| /** barf [ba:rf] 2. "He suggested using FORTRAN, and everybody barfed." | |||||
| - From The Shogakukan DICTIONARY OF NEW ENGLISH (Second edition) */ | |||||
| #ifndef F2C_INCLUDE | |||||
| #define F2C_INCLUDE | |||||
| #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 | |||||
| typedef int 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; | |||||
| 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;} | |||||
| #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)); } | |||||
| #define c_div(c, a, b) {pCf(c) = Cf(a)/Cf(b);} | |||||
| #define z_div(c, a, b) {pCd(c) = Cd(a)/Cd(b);} | |||||
| #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) = conj(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) (cimag(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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotc_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void cdotu_(complex *z, integer *n_, complex *x, integer *incx_, complex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotu_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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) | |||||
| */ | |||||
| /* > \brief \b CLAQHE scales a Hermitian matrix. */ | |||||
| /* =========== DOCUMENTATION =========== */ | |||||
| /* Online html documentation available at */ | |||||
| /* http://www.netlib.org/lapack/explore-html/ */ | |||||
| /* > \htmlonly */ | |||||
| /* > Download CLAQHE + dependencies */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/claqhe. | |||||
| f"> */ | |||||
| /* > [TGZ]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/claqhe. | |||||
| f"> */ | |||||
| /* > [ZIP]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/claqhe. | |||||
| f"> */ | |||||
| /* > [TXT]</a> */ | |||||
| /* > \endhtmlonly */ | |||||
| /* Definition: */ | |||||
| /* =========== */ | |||||
| /* SUBROUTINE CLAQHE( UPLO, N, A, LDA, S, SCOND, AMAX, EQUED ) */ | |||||
| /* CHARACTER EQUED, UPLO */ | |||||
| /* INTEGER LDA, N */ | |||||
| /* REAL AMAX, SCOND */ | |||||
| /* REAL S( * ) */ | |||||
| /* COMPLEX A( LDA, * ) */ | |||||
| /* > \par Purpose: */ | |||||
| /* ============= */ | |||||
| /* > */ | |||||
| /* > \verbatim */ | |||||
| /* > */ | |||||
| /* > CLAQHE equilibrates a Hermitian matrix A using the scaling factors */ | |||||
| /* > in the vector S. */ | |||||
| /* > \endverbatim */ | |||||
| /* Arguments: */ | |||||
| /* ========== */ | |||||
| /* > \param[in] UPLO */ | |||||
| /* > \verbatim */ | |||||
| /* > UPLO is CHARACTER*1 */ | |||||
| /* > Specifies whether the upper or lower triangular part of the */ | |||||
| /* > Hermitian matrix A is stored. */ | |||||
| /* > = 'U': Upper triangular */ | |||||
| /* > = 'L': Lower triangular */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] N */ | |||||
| /* > \verbatim */ | |||||
| /* > N is INTEGER */ | |||||
| /* > The order of the matrix A. N >= 0. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in,out] A */ | |||||
| /* > \verbatim */ | |||||
| /* > A is COMPLEX array, dimension (LDA,N) */ | |||||
| /* > On entry, the Hermitian matrix A. If UPLO = 'U', the leading */ | |||||
| /* > n by n upper triangular part of A contains the upper */ | |||||
| /* > triangular part of the matrix A, and the strictly lower */ | |||||
| /* > triangular part of A is not referenced. If UPLO = 'L', the */ | |||||
| /* > leading n by n lower triangular part of A contains the lower */ | |||||
| /* > triangular part of the matrix A, and the strictly upper */ | |||||
| /* > triangular part of A is not referenced. */ | |||||
| /* > */ | |||||
| /* > On exit, if EQUED = 'Y', the equilibrated matrix: */ | |||||
| /* > diag(S) * A * diag(S). */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] LDA */ | |||||
| /* > \verbatim */ | |||||
| /* > LDA is INTEGER */ | |||||
| /* > The leading dimension of the array A. LDA >= f2cmax(N,1). */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] S */ | |||||
| /* > \verbatim */ | |||||
| /* > S is REAL array, dimension (N) */ | |||||
| /* > The scale factors for A. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] SCOND */ | |||||
| /* > \verbatim */ | |||||
| /* > SCOND is REAL */ | |||||
| /* > Ratio of the smallest S(i) to the largest S(i). */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] AMAX */ | |||||
| /* > \verbatim */ | |||||
| /* > AMAX is REAL */ | |||||
| /* > Absolute value of largest matrix entry. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] EQUED */ | |||||
| /* > \verbatim */ | |||||
| /* > EQUED is CHARACTER*1 */ | |||||
| /* > Specifies whether or not equilibration was done. */ | |||||
| /* > = 'N': No equilibration. */ | |||||
| /* > = 'Y': Equilibration was done, i.e., A has been replaced by */ | |||||
| /* > diag(S) * A * diag(S). */ | |||||
| /* > \endverbatim */ | |||||
| /* > \par Internal Parameters: */ | |||||
| /* ========================= */ | |||||
| /* > */ | |||||
| /* > \verbatim */ | |||||
| /* > THRESH is a threshold value used to decide if scaling should be done */ | |||||
| /* > based on the ratio of the scaling factors. If SCOND < THRESH, */ | |||||
| /* > scaling is done. */ | |||||
| /* > */ | |||||
| /* > LARGE and SMALL are threshold values used to decide if scaling should */ | |||||
| /* > be done based on the absolute size of the largest matrix element. */ | |||||
| /* > If AMAX > LARGE or AMAX < SMALL, scaling is done. */ | |||||
| /* > \endverbatim */ | |||||
| /* Authors: */ | |||||
| /* ======== */ | |||||
| /* > \author Univ. of Tennessee */ | |||||
| /* > \author Univ. of California Berkeley */ | |||||
| /* > \author Univ. of Colorado Denver */ | |||||
| /* > \author NAG Ltd. */ | |||||
| /* > \date December 2016 */ | |||||
| /* > \ingroup complexHEauxiliary */ | |||||
| /* ===================================================================== */ | |||||
| /* Subroutine */ int claqhe_(char *uplo, integer *n, complex *a, integer *lda, | |||||
| real *s, real *scond, real *amax, char *equed) | |||||
| { | |||||
| /* System generated locals */ | |||||
| integer a_dim1, a_offset, i__1, i__2, i__3, i__4; | |||||
| real r__1; | |||||
| complex q__1; | |||||
| /* Local variables */ | |||||
| integer i__, j; | |||||
| real large; | |||||
| extern logical lsame_(char *, char *); | |||||
| real small, cj; | |||||
| extern real slamch_(char *); | |||||
| /* -- LAPACK auxiliary routine (version 3.7.0) -- */ | |||||
| /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ | |||||
| /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ | |||||
| /* December 2016 */ | |||||
| /* ===================================================================== */ | |||||
| /* Quick return if possible */ | |||||
| /* Parameter adjustments */ | |||||
| a_dim1 = *lda; | |||||
| a_offset = 1 + a_dim1 * 1; | |||||
| a -= a_offset; | |||||
| --s; | |||||
| /* Function Body */ | |||||
| if (*n <= 0) { | |||||
| *(unsigned char *)equed = 'N'; | |||||
| return 0; | |||||
| } | |||||
| /* Initialize LARGE and SMALL. */ | |||||
| small = slamch_("Safe minimum") / slamch_("Precision"); | |||||
| large = 1.f / small; | |||||
| if (*scond >= .1f && *amax >= small && *amax <= large) { | |||||
| /* No equilibration */ | |||||
| *(unsigned char *)equed = 'N'; | |||||
| } else { | |||||
| /* Replace A by diag(S) * A * diag(S). */ | |||||
| if (lsame_(uplo, "U")) { | |||||
| /* Upper triangle of A is stored. */ | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| cj = s[j]; | |||||
| i__2 = j - 1; | |||||
| for (i__ = 1; i__ <= i__2; ++i__) { | |||||
| i__3 = i__ + j * a_dim1; | |||||
| r__1 = cj * s[i__]; | |||||
| i__4 = i__ + j * a_dim1; | |||||
| q__1.r = r__1 * a[i__4].r, q__1.i = r__1 * a[i__4].i; | |||||
| a[i__3].r = q__1.r, a[i__3].i = q__1.i; | |||||
| /* L10: */ | |||||
| } | |||||
| i__2 = j + j * a_dim1; | |||||
| i__3 = j + j * a_dim1; | |||||
| r__1 = cj * cj * a[i__3].r; | |||||
| a[i__2].r = r__1, a[i__2].i = 0.f; | |||||
| /* L20: */ | |||||
| } | |||||
| } else { | |||||
| /* Lower triangle of A is stored. */ | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| cj = s[j]; | |||||
| i__2 = j + j * a_dim1; | |||||
| i__3 = j + j * a_dim1; | |||||
| r__1 = cj * cj * a[i__3].r; | |||||
| a[i__2].r = r__1, a[i__2].i = 0.f; | |||||
| i__2 = *n; | |||||
| for (i__ = j + 1; i__ <= i__2; ++i__) { | |||||
| i__3 = i__ + j * a_dim1; | |||||
| r__1 = cj * s[i__]; | |||||
| i__4 = i__ + j * a_dim1; | |||||
| q__1.r = r__1 * a[i__4].r, q__1.i = r__1 * a[i__4].i; | |||||
| a[i__3].r = q__1.r, a[i__3].i = q__1.i; | |||||
| /* L30: */ | |||||
| } | |||||
| /* L40: */ | |||||
| } | |||||
| } | |||||
| *(unsigned char *)equed = 'Y'; | |||||
| } | |||||
| return 0; | |||||
| /* End of CLAQHE */ | |||||
| } /* claqhe_ */ | |||||
| @@ -0,0 +1,624 @@ | |||||
| /* f2c.h -- Standard Fortran to C header file */ | |||||
| /** barf [ba:rf] 2. "He suggested using FORTRAN, and everybody barfed." | |||||
| - From The Shogakukan DICTIONARY OF NEW ENGLISH (Second edition) */ | |||||
| #ifndef F2C_INCLUDE | |||||
| #define F2C_INCLUDE | |||||
| #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 | |||||
| typedef int 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; | |||||
| 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;} | |||||
| #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)); } | |||||
| #define c_div(c, a, b) {pCf(c) = Cf(a)/Cf(b);} | |||||
| #define z_div(c, a, b) {pCd(c) = Cd(a)/Cd(b);} | |||||
| #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) = conj(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) (cimag(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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotc_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void cdotu_(complex *z, integer *n_, complex *x, integer *incx_, complex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotu_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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) | |||||
| */ | |||||
| /* > \brief \b CLAQHP scales a Hermitian matrix stored in packed form. */ | |||||
| /* =========== DOCUMENTATION =========== */ | |||||
| /* Online html documentation available at */ | |||||
| /* http://www.netlib.org/lapack/explore-html/ */ | |||||
| /* > \htmlonly */ | |||||
| /* > Download CLAQHP + dependencies */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/claqhp. | |||||
| f"> */ | |||||
| /* > [TGZ]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/claqhp. | |||||
| f"> */ | |||||
| /* > [ZIP]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/claqhp. | |||||
| f"> */ | |||||
| /* > [TXT]</a> */ | |||||
| /* > \endhtmlonly */ | |||||
| /* Definition: */ | |||||
| /* =========== */ | |||||
| /* SUBROUTINE CLAQHP( UPLO, N, AP, S, SCOND, AMAX, EQUED ) */ | |||||
| /* CHARACTER EQUED, UPLO */ | |||||
| /* INTEGER N */ | |||||
| /* REAL AMAX, SCOND */ | |||||
| /* REAL S( * ) */ | |||||
| /* COMPLEX AP( * ) */ | |||||
| /* > \par Purpose: */ | |||||
| /* ============= */ | |||||
| /* > */ | |||||
| /* > \verbatim */ | |||||
| /* > */ | |||||
| /* > CLAQHP equilibrates a Hermitian matrix A using the scaling factors */ | |||||
| /* > in the vector S. */ | |||||
| /* > \endverbatim */ | |||||
| /* Arguments: */ | |||||
| /* ========== */ | |||||
| /* > \param[in] UPLO */ | |||||
| /* > \verbatim */ | |||||
| /* > UPLO is CHARACTER*1 */ | |||||
| /* > Specifies whether the upper or lower triangular part of the */ | |||||
| /* > Hermitian matrix A is stored. */ | |||||
| /* > = 'U': Upper triangular */ | |||||
| /* > = 'L': Lower triangular */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] N */ | |||||
| /* > \verbatim */ | |||||
| /* > N is INTEGER */ | |||||
| /* > The order of the matrix A. N >= 0. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in,out] AP */ | |||||
| /* > \verbatim */ | |||||
| /* > AP is COMPLEX array, dimension (N*(N+1)/2) */ | |||||
| /* > On entry, the upper or lower triangle of the Hermitian matrix */ | |||||
| /* > A, packed columnwise in a linear array. The j-th column of A */ | |||||
| /* > is stored in the array AP as follows: */ | |||||
| /* > if UPLO = 'U', AP(i + (j-1)*j/2) = A(i,j) for 1<=i<=j; */ | |||||
| /* > if UPLO = 'L', AP(i + (j-1)*(2n-j)/2) = A(i,j) for j<=i<=n. */ | |||||
| /* > */ | |||||
| /* > On exit, the equilibrated matrix: diag(S) * A * diag(S), in */ | |||||
| /* > the same storage format as A. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] S */ | |||||
| /* > \verbatim */ | |||||
| /* > S is REAL array, dimension (N) */ | |||||
| /* > The scale factors for A. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] SCOND */ | |||||
| /* > \verbatim */ | |||||
| /* > SCOND is REAL */ | |||||
| /* > Ratio of the smallest S(i) to the largest S(i). */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] AMAX */ | |||||
| /* > \verbatim */ | |||||
| /* > AMAX is REAL */ | |||||
| /* > Absolute value of largest matrix entry. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] EQUED */ | |||||
| /* > \verbatim */ | |||||
| /* > EQUED is CHARACTER*1 */ | |||||
| /* > Specifies whether or not equilibration was done. */ | |||||
| /* > = 'N': No equilibration. */ | |||||
| /* > = 'Y': Equilibration was done, i.e., A has been replaced by */ | |||||
| /* > diag(S) * A * diag(S). */ | |||||
| /* > \endverbatim */ | |||||
| /* > \par Internal Parameters: */ | |||||
| /* ========================= */ | |||||
| /* > */ | |||||
| /* > \verbatim */ | |||||
| /* > THRESH is a threshold value used to decide if scaling should be done */ | |||||
| /* > based on the ratio of the scaling factors. If SCOND < THRESH, */ | |||||
| /* > scaling is done. */ | |||||
| /* > */ | |||||
| /* > LARGE and SMALL are threshold values used to decide if scaling should */ | |||||
| /* > be done based on the absolute size of the largest matrix element. */ | |||||
| /* > If AMAX > LARGE or AMAX < SMALL, scaling is done. */ | |||||
| /* > \endverbatim */ | |||||
| /* Authors: */ | |||||
| /* ======== */ | |||||
| /* > \author Univ. of Tennessee */ | |||||
| /* > \author Univ. of California Berkeley */ | |||||
| /* > \author Univ. of Colorado Denver */ | |||||
| /* > \author NAG Ltd. */ | |||||
| /* > \date December 2016 */ | |||||
| /* > \ingroup complexOTHERauxiliary */ | |||||
| /* ===================================================================== */ | |||||
| /* Subroutine */ int claqhp_(char *uplo, integer *n, complex *ap, real *s, | |||||
| real *scond, real *amax, char *equed) | |||||
| { | |||||
| /* System generated locals */ | |||||
| integer i__1, i__2, i__3, i__4; | |||||
| real r__1; | |||||
| complex q__1; | |||||
| /* Local variables */ | |||||
| integer i__, j; | |||||
| real large; | |||||
| extern logical lsame_(char *, char *); | |||||
| real small; | |||||
| integer jc; | |||||
| real cj; | |||||
| extern real slamch_(char *); | |||||
| /* -- LAPACK auxiliary routine (version 3.7.0) -- */ | |||||
| /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ | |||||
| /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ | |||||
| /* December 2016 */ | |||||
| /* ===================================================================== */ | |||||
| /* Quick return if possible */ | |||||
| /* Parameter adjustments */ | |||||
| --s; | |||||
| --ap; | |||||
| /* Function Body */ | |||||
| if (*n <= 0) { | |||||
| *(unsigned char *)equed = 'N'; | |||||
| return 0; | |||||
| } | |||||
| /* Initialize LARGE and SMALL. */ | |||||
| small = slamch_("Safe minimum") / slamch_("Precision"); | |||||
| large = 1.f / small; | |||||
| if (*scond >= .1f && *amax >= small && *amax <= large) { | |||||
| /* No equilibration */ | |||||
| *(unsigned char *)equed = 'N'; | |||||
| } else { | |||||
| /* Replace A by diag(S) * A * diag(S). */ | |||||
| if (lsame_(uplo, "U")) { | |||||
| /* Upper triangle of A is stored. */ | |||||
| jc = 1; | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| cj = s[j]; | |||||
| i__2 = j - 1; | |||||
| for (i__ = 1; i__ <= i__2; ++i__) { | |||||
| i__3 = jc + i__ - 1; | |||||
| r__1 = cj * s[i__]; | |||||
| i__4 = jc + i__ - 1; | |||||
| q__1.r = r__1 * ap[i__4].r, q__1.i = r__1 * ap[i__4].i; | |||||
| ap[i__3].r = q__1.r, ap[i__3].i = q__1.i; | |||||
| /* L10: */ | |||||
| } | |||||
| i__2 = jc + j - 1; | |||||
| i__3 = jc + j - 1; | |||||
| r__1 = cj * cj * ap[i__3].r; | |||||
| ap[i__2].r = r__1, ap[i__2].i = 0.f; | |||||
| jc += j; | |||||
| /* L20: */ | |||||
| } | |||||
| } else { | |||||
| /* Lower triangle of A is stored. */ | |||||
| jc = 1; | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| cj = s[j]; | |||||
| i__2 = jc; | |||||
| i__3 = jc; | |||||
| r__1 = cj * cj * ap[i__3].r; | |||||
| ap[i__2].r = r__1, ap[i__2].i = 0.f; | |||||
| i__2 = *n; | |||||
| for (i__ = j + 1; i__ <= i__2; ++i__) { | |||||
| i__3 = jc + i__ - j; | |||||
| r__1 = cj * s[i__]; | |||||
| i__4 = jc + i__ - j; | |||||
| q__1.r = r__1 * ap[i__4].r, q__1.i = r__1 * ap[i__4].i; | |||||
| ap[i__3].r = q__1.r, ap[i__3].i = q__1.i; | |||||
| /* L30: */ | |||||
| } | |||||
| jc = jc + *n - j + 1; | |||||
| /* L40: */ | |||||
| } | |||||
| } | |||||
| *(unsigned char *)equed = 'Y'; | |||||
| } | |||||
| return 0; | |||||
| /* End of CLAQHP */ | |||||
| } /* claqhp_ */ | |||||
| @@ -0,0 +1,685 @@ | |||||
| /* f2c.h -- Standard Fortran to C header file */ | |||||
| /** barf [ba:rf] 2. "He suggested using FORTRAN, and everybody barfed." | |||||
| - From The Shogakukan DICTIONARY OF NEW ENGLISH (Second edition) */ | |||||
| #ifndef F2C_INCLUDE | |||||
| #define F2C_INCLUDE | |||||
| #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 | |||||
| typedef int 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; | |||||
| 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;} | |||||
| #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)); } | |||||
| #define c_div(c, a, b) {pCf(c) = Cf(a)/Cf(b);} | |||||
| #define z_div(c, a, b) {pCd(c) = Cd(a)/Cd(b);} | |||||
| #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) = conj(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) (cimag(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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotc_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void cdotu_(complex *z, integer *n_, complex *x, integer *incx_, complex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotu_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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) | |||||
| */ | |||||
| /* Table of constant values */ | |||||
| static integer c__1 = 1; | |||||
| /* > \brief \b CLAQP2 computes a QR factorization with column pivoting of the matrix block. */ | |||||
| /* =========== DOCUMENTATION =========== */ | |||||
| /* Online html documentation available at */ | |||||
| /* http://www.netlib.org/lapack/explore-html/ */ | |||||
| /* > \htmlonly */ | |||||
| /* > Download CLAQP2 + dependencies */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/claqp2. | |||||
| f"> */ | |||||
| /* > [TGZ]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/claqp2. | |||||
| f"> */ | |||||
| /* > [ZIP]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/claqp2. | |||||
| f"> */ | |||||
| /* > [TXT]</a> */ | |||||
| /* > \endhtmlonly */ | |||||
| /* Definition: */ | |||||
| /* =========== */ | |||||
| /* SUBROUTINE CLAQP2( M, N, OFFSET, A, LDA, JPVT, TAU, VN1, VN2, */ | |||||
| /* WORK ) */ | |||||
| /* INTEGER LDA, M, N, OFFSET */ | |||||
| /* INTEGER JPVT( * ) */ | |||||
| /* REAL VN1( * ), VN2( * ) */ | |||||
| /* COMPLEX A( LDA, * ), TAU( * ), WORK( * ) */ | |||||
| /* > \par Purpose: */ | |||||
| /* ============= */ | |||||
| /* > */ | |||||
| /* > \verbatim */ | |||||
| /* > */ | |||||
| /* > CLAQP2 computes a QR factorization with column pivoting of */ | |||||
| /* > the block A(OFFSET+1:M,1:N). */ | |||||
| /* > The block A(1:OFFSET,1:N) is accordingly pivoted, but not factorized. */ | |||||
| /* > \endverbatim */ | |||||
| /* Arguments: */ | |||||
| /* ========== */ | |||||
| /* > \param[in] M */ | |||||
| /* > \verbatim */ | |||||
| /* > M is INTEGER */ | |||||
| /* > The number of rows of the matrix A. M >= 0. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] N */ | |||||
| /* > \verbatim */ | |||||
| /* > N is INTEGER */ | |||||
| /* > The number of columns of the matrix A. N >= 0. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] OFFSET */ | |||||
| /* > \verbatim */ | |||||
| /* > OFFSET is INTEGER */ | |||||
| /* > The number of rows of the matrix A that must be pivoted */ | |||||
| /* > but no factorized. OFFSET >= 0. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in,out] A */ | |||||
| /* > \verbatim */ | |||||
| /* > A is COMPLEX array, dimension (LDA,N) */ | |||||
| /* > On entry, the M-by-N matrix A. */ | |||||
| /* > On exit, the upper triangle of block A(OFFSET+1:M,1:N) is */ | |||||
| /* > the triangular factor obtained; the elements in block */ | |||||
| /* > A(OFFSET+1:M,1:N) below the diagonal, together with the */ | |||||
| /* > array TAU, represent the orthogonal matrix Q as a product of */ | |||||
| /* > elementary reflectors. Block A(1:OFFSET,1:N) has been */ | |||||
| /* > accordingly pivoted, but no factorized. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] LDA */ | |||||
| /* > \verbatim */ | |||||
| /* > LDA is INTEGER */ | |||||
| /* > The leading dimension of the array A. LDA >= f2cmax(1,M). */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in,out] JPVT */ | |||||
| /* > \verbatim */ | |||||
| /* > JPVT is INTEGER array, dimension (N) */ | |||||
| /* > On entry, if JPVT(i) .ne. 0, the i-th column of A is permuted */ | |||||
| /* > to the front of A*P (a leading column); if JPVT(i) = 0, */ | |||||
| /* > the i-th column of A is a free column. */ | |||||
| /* > On exit, if JPVT(i) = k, then the i-th column of A*P */ | |||||
| /* > was the k-th column of A. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] TAU */ | |||||
| /* > \verbatim */ | |||||
| /* > TAU is COMPLEX array, dimension (f2cmin(M,N)) */ | |||||
| /* > The scalar factors of the elementary reflectors. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in,out] VN1 */ | |||||
| /* > \verbatim */ | |||||
| /* > VN1 is REAL array, dimension (N) */ | |||||
| /* > The vector with the partial column norms. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in,out] VN2 */ | |||||
| /* > \verbatim */ | |||||
| /* > VN2 is REAL array, dimension (N) */ | |||||
| /* > The vector with the exact column norms. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] WORK */ | |||||
| /* > \verbatim */ | |||||
| /* > WORK is COMPLEX array, dimension (N) */ | |||||
| /* > \endverbatim */ | |||||
| /* Authors: */ | |||||
| /* ======== */ | |||||
| /* > \author Univ. of Tennessee */ | |||||
| /* > \author Univ. of California Berkeley */ | |||||
| /* > \author Univ. of Colorado Denver */ | |||||
| /* > \author NAG Ltd. */ | |||||
| /* > \date December 2016 */ | |||||
| /* > \ingroup complexOTHERauxiliary */ | |||||
| /* > \par Contributors: */ | |||||
| /* ================== */ | |||||
| /* > */ | |||||
| /* > G. Quintana-Orti, Depto. de Informatica, Universidad Jaime I, Spain */ | |||||
| /* > X. Sun, Computer Science Dept., Duke University, USA */ | |||||
| /* > \n */ | |||||
| /* > Partial column norm updating strategy modified on April 2011 */ | |||||
| /* > Z. Drmac and Z. Bujanovic, Dept. of Mathematics, */ | |||||
| /* > University of Zagreb, Croatia. */ | |||||
| /* > \par References: */ | |||||
| /* ================ */ | |||||
| /* > */ | |||||
| /* > LAPACK Working Note 176 */ | |||||
| /* > \htmlonly */ | |||||
| /* > <a href="http://www.netlib.org/lapack/lawnspdf/lawn176.pdf">[PDF]</a> */ | |||||
| /* > \endhtmlonly */ | |||||
| /* ===================================================================== */ | |||||
| /* Subroutine */ int claqp2_(integer *m, integer *n, integer *offset, complex | |||||
| *a, integer *lda, integer *jpvt, complex *tau, real *vn1, real *vn2, | |||||
| complex *work) | |||||
| { | |||||
| /* System generated locals */ | |||||
| integer a_dim1, a_offset, i__1, i__2, i__3; | |||||
| real r__1; | |||||
| complex q__1; | |||||
| /* Local variables */ | |||||
| real temp, temp2; | |||||
| integer i__, j; | |||||
| real tol3z; | |||||
| extern /* Subroutine */ int clarf_(char *, integer *, integer *, complex * | |||||
| , integer *, complex *, complex *, integer *, complex *); | |||||
| integer offpi; | |||||
| extern /* Subroutine */ int cswap_(integer *, complex *, integer *, | |||||
| complex *, integer *); | |||||
| integer itemp; | |||||
| extern real scnrm2_(integer *, complex *, integer *); | |||||
| integer mn; | |||||
| extern /* Subroutine */ int clarfg_(integer *, complex *, complex *, | |||||
| integer *, complex *); | |||||
| extern real slamch_(char *); | |||||
| extern integer isamax_(integer *, real *, integer *); | |||||
| complex aii; | |||||
| integer pvt; | |||||
| /* -- LAPACK auxiliary routine (version 3.7.0) -- */ | |||||
| /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ | |||||
| /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ | |||||
| /* December 2016 */ | |||||
| /* ===================================================================== */ | |||||
| /* Parameter adjustments */ | |||||
| a_dim1 = *lda; | |||||
| a_offset = 1 + a_dim1 * 1; | |||||
| a -= a_offset; | |||||
| --jpvt; | |||||
| --tau; | |||||
| --vn1; | |||||
| --vn2; | |||||
| --work; | |||||
| /* Function Body */ | |||||
| /* Computing MIN */ | |||||
| i__1 = *m - *offset; | |||||
| mn = f2cmin(i__1,*n); | |||||
| tol3z = sqrt(slamch_("Epsilon")); | |||||
| /* Compute factorization. */ | |||||
| i__1 = mn; | |||||
| for (i__ = 1; i__ <= i__1; ++i__) { | |||||
| offpi = *offset + i__; | |||||
| /* Determine ith pivot column and swap if necessary. */ | |||||
| i__2 = *n - i__ + 1; | |||||
| pvt = i__ - 1 + isamax_(&i__2, &vn1[i__], &c__1); | |||||
| if (pvt != i__) { | |||||
| cswap_(m, &a[pvt * a_dim1 + 1], &c__1, &a[i__ * a_dim1 + 1], & | |||||
| c__1); | |||||
| itemp = jpvt[pvt]; | |||||
| jpvt[pvt] = jpvt[i__]; | |||||
| jpvt[i__] = itemp; | |||||
| vn1[pvt] = vn1[i__]; | |||||
| vn2[pvt] = vn2[i__]; | |||||
| } | |||||
| /* Generate elementary reflector H(i). */ | |||||
| if (offpi < *m) { | |||||
| i__2 = *m - offpi + 1; | |||||
| clarfg_(&i__2, &a[offpi + i__ * a_dim1], &a[offpi + 1 + i__ * | |||||
| a_dim1], &c__1, &tau[i__]); | |||||
| } else { | |||||
| clarfg_(&c__1, &a[*m + i__ * a_dim1], &a[*m + i__ * a_dim1], & | |||||
| c__1, &tau[i__]); | |||||
| } | |||||
| if (i__ < *n) { | |||||
| /* Apply H(i)**H to A(offset+i:m,i+1:n) from the left. */ | |||||
| i__2 = offpi + i__ * a_dim1; | |||||
| aii.r = a[i__2].r, aii.i = a[i__2].i; | |||||
| i__2 = offpi + i__ * a_dim1; | |||||
| a[i__2].r = 1.f, a[i__2].i = 0.f; | |||||
| i__2 = *m - offpi + 1; | |||||
| i__3 = *n - i__; | |||||
| r_cnjg(&q__1, &tau[i__]); | |||||
| clarf_("Left", &i__2, &i__3, &a[offpi + i__ * a_dim1], &c__1, & | |||||
| q__1, &a[offpi + (i__ + 1) * a_dim1], lda, &work[1]); | |||||
| i__2 = offpi + i__ * a_dim1; | |||||
| a[i__2].r = aii.r, a[i__2].i = aii.i; | |||||
| } | |||||
| /* Update partial column norms. */ | |||||
| i__2 = *n; | |||||
| for (j = i__ + 1; j <= i__2; ++j) { | |||||
| if (vn1[j] != 0.f) { | |||||
| /* NOTE: The following 4 lines follow from the analysis in */ | |||||
| /* Lapack Working Note 176. */ | |||||
| /* Computing 2nd power */ | |||||
| r__1 = c_abs(&a[offpi + 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) { | |||||
| if (offpi < *m) { | |||||
| i__3 = *m - offpi; | |||||
| vn1[j] = scnrm2_(&i__3, &a[offpi + 1 + j * a_dim1], & | |||||
| c__1); | |||||
| vn2[j] = vn1[j]; | |||||
| } else { | |||||
| vn1[j] = 0.f; | |||||
| vn2[j] = 0.f; | |||||
| } | |||||
| } else { | |||||
| vn1[j] *= sqrt(temp); | |||||
| } | |||||
| } | |||||
| /* L10: */ | |||||
| } | |||||
| /* L20: */ | |||||
| } | |||||
| return 0; | |||||
| /* End of CLAQP2 */ | |||||
| } /* claqp2_ */ | |||||
| @@ -0,0 +1,821 @@ | |||||
| /* f2c.h -- Standard Fortran to C header file */ | |||||
| /** barf [ba:rf] 2. "He suggested using FORTRAN, and everybody barfed." | |||||
| - From The Shogakukan DICTIONARY OF NEW ENGLISH (Second edition) */ | |||||
| #ifndef F2C_INCLUDE | |||||
| #define F2C_INCLUDE | |||||
| #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 | |||||
| typedef int 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; | |||||
| 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;} | |||||
| #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)); } | |||||
| #define c_div(c, a, b) {pCf(c) = Cf(a)/Cf(b);} | |||||
| #define z_div(c, a, b) {pCd(c) = Cd(a)/Cd(b);} | |||||
| #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) = conj(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) (cimag(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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotc_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void cdotu_(complex *z, integer *n_, complex *x, integer *incx_, complex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotu_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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) | |||||
| */ | |||||
| /* Table of constant values */ | |||||
| static complex c_b1 = {0.f,0.f}; | |||||
| static complex c_b2 = {1.f,0.f}; | |||||
| static integer c__1 = 1; | |||||
| /* > \brief \b CLAQPS computes a step of QR factorization with column pivoting of a real m-by-n matrix A by us | |||||
| ing BLAS level 3. */ | |||||
| /* =========== DOCUMENTATION =========== */ | |||||
| /* Online html documentation available at */ | |||||
| /* http://www.netlib.org/lapack/explore-html/ */ | |||||
| /* > \htmlonly */ | |||||
| /* > Download CLAQPS + dependencies */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/claqps. | |||||
| f"> */ | |||||
| /* > [TGZ]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/claqps. | |||||
| f"> */ | |||||
| /* > [ZIP]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/claqps. | |||||
| f"> */ | |||||
| /* > [TXT]</a> */ | |||||
| /* > \endhtmlonly */ | |||||
| /* Definition: */ | |||||
| /* =========== */ | |||||
| /* SUBROUTINE CLAQPS( M, N, OFFSET, NB, KB, A, LDA, JPVT, TAU, VN1, */ | |||||
| /* VN2, AUXV, F, LDF ) */ | |||||
| /* INTEGER KB, LDA, LDF, M, N, NB, OFFSET */ | |||||
| /* INTEGER JPVT( * ) */ | |||||
| /* REAL VN1( * ), VN2( * ) */ | |||||
| /* COMPLEX A( LDA, * ), AUXV( * ), F( LDF, * ), TAU( * ) */ | |||||
| /* > \par Purpose: */ | |||||
| /* ============= */ | |||||
| /* > */ | |||||
| /* > \verbatim */ | |||||
| /* > */ | |||||
| /* > CLAQPS computes a step of QR factorization with column pivoting */ | |||||
| /* > of a complex M-by-N matrix A by using Blas-3. It tries to factorize */ | |||||
| /* > NB columns from A starting from the row OFFSET+1, and updates all */ | |||||
| /* > of the matrix with Blas-3 xGEMM. */ | |||||
| /* > */ | |||||
| /* > In some cases, due to catastrophic cancellations, it cannot */ | |||||
| /* > factorize NB columns. Hence, the actual number of factorized */ | |||||
| /* > columns is returned in KB. */ | |||||
| /* > */ | |||||
| /* > Block A(1:OFFSET,1:N) is accordingly pivoted, but not factorized. */ | |||||
| /* > \endverbatim */ | |||||
| /* Arguments: */ | |||||
| /* ========== */ | |||||
| /* > \param[in] M */ | |||||
| /* > \verbatim */ | |||||
| /* > M is INTEGER */ | |||||
| /* > The number of rows of the matrix A. M >= 0. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] N */ | |||||
| /* > \verbatim */ | |||||
| /* > N is INTEGER */ | |||||
| /* > The number of columns of the matrix A. N >= 0 */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] OFFSET */ | |||||
| /* > \verbatim */ | |||||
| /* > OFFSET is INTEGER */ | |||||
| /* > The number of rows of A that have been factorized in */ | |||||
| /* > previous steps. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] NB */ | |||||
| /* > \verbatim */ | |||||
| /* > NB is INTEGER */ | |||||
| /* > The number of columns to factorize. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] KB */ | |||||
| /* > \verbatim */ | |||||
| /* > KB is INTEGER */ | |||||
| /* > The number of columns actually factorized. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in,out] A */ | |||||
| /* > \verbatim */ | |||||
| /* > A is COMPLEX array, dimension (LDA,N) */ | |||||
| /* > On entry, the M-by-N matrix A. */ | |||||
| /* > On exit, block A(OFFSET+1:M,1:KB) is the triangular */ | |||||
| /* > factor obtained and block A(1:OFFSET,1:N) has been */ | |||||
| /* > accordingly pivoted, but no factorized. */ | |||||
| /* > The rest of the matrix, block A(OFFSET+1:M,KB+1:N) has */ | |||||
| /* > been updated. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] LDA */ | |||||
| /* > \verbatim */ | |||||
| /* > LDA is INTEGER */ | |||||
| /* > The leading dimension of the array A. LDA >= f2cmax(1,M). */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in,out] JPVT */ | |||||
| /* > \verbatim */ | |||||
| /* > JPVT is INTEGER array, dimension (N) */ | |||||
| /* > JPVT(I) = K <==> Column K of the full matrix A has been */ | |||||
| /* > permuted into position I in AP. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] TAU */ | |||||
| /* > \verbatim */ | |||||
| /* > TAU is COMPLEX array, dimension (KB) */ | |||||
| /* > The scalar factors of the elementary reflectors. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in,out] VN1 */ | |||||
| /* > \verbatim */ | |||||
| /* > VN1 is REAL array, dimension (N) */ | |||||
| /* > The vector with the partial column norms. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in,out] VN2 */ | |||||
| /* > \verbatim */ | |||||
| /* > VN2 is REAL array, dimension (N) */ | |||||
| /* > The vector with the exact column norms. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in,out] AUXV */ | |||||
| /* > \verbatim */ | |||||
| /* > AUXV is COMPLEX array, dimension (NB) */ | |||||
| /* > Auxiliary vector. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in,out] F */ | |||||
| /* > \verbatim */ | |||||
| /* > F is COMPLEX array, dimension (LDF,NB) */ | |||||
| /* > Matrix F**H = L * Y**H * A. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] LDF */ | |||||
| /* > \verbatim */ | |||||
| /* > LDF is INTEGER */ | |||||
| /* > The leading dimension of the array F. LDF >= f2cmax(1,N). */ | |||||
| /* > \endverbatim */ | |||||
| /* Authors: */ | |||||
| /* ======== */ | |||||
| /* > \author Univ. of Tennessee */ | |||||
| /* > \author Univ. of California Berkeley */ | |||||
| /* > \author Univ. of Colorado Denver */ | |||||
| /* > \author NAG Ltd. */ | |||||
| /* > \date December 2016 */ | |||||
| /* > \ingroup complexOTHERauxiliary */ | |||||
| /* > \par Contributors: */ | |||||
| /* ================== */ | |||||
| /* > */ | |||||
| /* > G. Quintana-Orti, Depto. de Informatica, Universidad Jaime I, Spain */ | |||||
| /* > X. Sun, Computer Science Dept., Duke University, USA */ | |||||
| /* > */ | |||||
| /* > \n */ | |||||
| /* > Partial column norm updating strategy modified on April 2011 */ | |||||
| /* > Z. Drmac and Z. Bujanovic, Dept. of Mathematics, */ | |||||
| /* > University of Zagreb, Croatia. */ | |||||
| /* > \par References: */ | |||||
| /* ================ */ | |||||
| /* > */ | |||||
| /* > LAPACK Working Note 176 */ | |||||
| /* > \htmlonly */ | |||||
| /* > <a href="http://www.netlib.org/lapack/lawnspdf/lawn176.pdf">[PDF]</a> */ | |||||
| /* > \endhtmlonly */ | |||||
| /* ===================================================================== */ | |||||
| /* Subroutine */ int claqps_(integer *m, integer *n, integer *offset, integer | |||||
| *nb, integer *kb, complex *a, integer *lda, integer *jpvt, complex * | |||||
| tau, real *vn1, real *vn2, complex *auxv, complex *f, integer *ldf) | |||||
| { | |||||
| /* System generated locals */ | |||||
| integer a_dim1, a_offset, f_dim1, f_offset, i__1, i__2, i__3; | |||||
| real r__1, r__2; | |||||
| complex q__1; | |||||
| /* Local variables */ | |||||
| real temp, temp2; | |||||
| integer j, k; | |||||
| real tol3z; | |||||
| extern /* Subroutine */ int cgemm_(char *, char *, integer *, integer *, | |||||
| integer *, complex *, complex *, integer *, complex *, integer *, | |||||
| complex *, complex *, integer *), cgemv_(char *, | |||||
| integer *, integer *, complex *, complex *, integer *, complex *, | |||||
| integer *, complex *, complex *, integer *), cswap_( | |||||
| integer *, complex *, integer *, complex *, integer *); | |||||
| integer itemp; | |||||
| extern real scnrm2_(integer *, complex *, integer *); | |||||
| integer rk; | |||||
| extern /* Subroutine */ int clarfg_(integer *, complex *, complex *, | |||||
| integer *, complex *); | |||||
| extern real slamch_(char *); | |||||
| integer lsticc; | |||||
| extern integer isamax_(integer *, real *, integer *); | |||||
| integer lastrk; | |||||
| complex akk; | |||||
| integer pvt; | |||||
| /* -- LAPACK auxiliary routine (version 3.7.0) -- */ | |||||
| /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ | |||||
| /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ | |||||
| /* December 2016 */ | |||||
| /* ===================================================================== */ | |||||
| /* Parameter adjustments */ | |||||
| a_dim1 = *lda; | |||||
| a_offset = 1 + a_dim1 * 1; | |||||
| a -= a_offset; | |||||
| --jpvt; | |||||
| --tau; | |||||
| --vn1; | |||||
| --vn2; | |||||
| --auxv; | |||||
| f_dim1 = *ldf; | |||||
| f_offset = 1 + f_dim1 * 1; | |||||
| f -= f_offset; | |||||
| /* Function Body */ | |||||
| /* Computing MIN */ | |||||
| i__1 = *m, i__2 = *n + *offset; | |||||
| lastrk = f2cmin(i__1,i__2); | |||||
| lsticc = 0; | |||||
| k = 0; | |||||
| tol3z = sqrt(slamch_("Epsilon")); | |||||
| /* Beginning of while loop. */ | |||||
| L10: | |||||
| if (k < *nb && lsticc == 0) { | |||||
| ++k; | |||||
| rk = *offset + k; | |||||
| /* Determine ith pivot column and swap if necessary */ | |||||
| i__1 = *n - k + 1; | |||||
| pvt = k - 1 + isamax_(&i__1, &vn1[k], &c__1); | |||||
| if (pvt != k) { | |||||
| cswap_(m, &a[pvt * a_dim1 + 1], &c__1, &a[k * a_dim1 + 1], &c__1); | |||||
| i__1 = k - 1; | |||||
| cswap_(&i__1, &f[pvt + f_dim1], ldf, &f[k + f_dim1], ldf); | |||||
| itemp = jpvt[pvt]; | |||||
| jpvt[pvt] = jpvt[k]; | |||||
| jpvt[k] = itemp; | |||||
| vn1[pvt] = vn1[k]; | |||||
| vn2[pvt] = vn2[k]; | |||||
| } | |||||
| /* Apply previous Householder reflectors to column K: */ | |||||
| /* A(RK:M,K) := A(RK:M,K) - A(RK:M,1:K-1)*F(K,1:K-1)**H. */ | |||||
| if (k > 1) { | |||||
| i__1 = k - 1; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| i__2 = k + j * f_dim1; | |||||
| r_cnjg(&q__1, &f[k + j * f_dim1]); | |||||
| f[i__2].r = q__1.r, f[i__2].i = q__1.i; | |||||
| /* L20: */ | |||||
| } | |||||
| i__1 = *m - rk + 1; | |||||
| i__2 = k - 1; | |||||
| q__1.r = -1.f, q__1.i = 0.f; | |||||
| cgemv_("No transpose", &i__1, &i__2, &q__1, &a[rk + a_dim1], lda, | |||||
| &f[k + f_dim1], ldf, &c_b2, &a[rk + k * a_dim1], &c__1); | |||||
| i__1 = k - 1; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| i__2 = k + j * f_dim1; | |||||
| r_cnjg(&q__1, &f[k + j * f_dim1]); | |||||
| f[i__2].r = q__1.r, f[i__2].i = q__1.i; | |||||
| /* L30: */ | |||||
| } | |||||
| } | |||||
| /* Generate elementary reflector H(k). */ | |||||
| if (rk < *m) { | |||||
| i__1 = *m - rk + 1; | |||||
| clarfg_(&i__1, &a[rk + k * a_dim1], &a[rk + 1 + k * a_dim1], & | |||||
| c__1, &tau[k]); | |||||
| } else { | |||||
| clarfg_(&c__1, &a[rk + k * a_dim1], &a[rk + k * a_dim1], &c__1, & | |||||
| tau[k]); | |||||
| } | |||||
| i__1 = rk + k * a_dim1; | |||||
| akk.r = a[i__1].r, akk.i = a[i__1].i; | |||||
| i__1 = rk + k * a_dim1; | |||||
| a[i__1].r = 1.f, a[i__1].i = 0.f; | |||||
| /* Compute Kth column of F: */ | |||||
| /* Compute F(K+1:N,K) := tau(K)*A(RK:M,K+1:N)**H*A(RK:M,K). */ | |||||
| if (k < *n) { | |||||
| i__1 = *m - rk + 1; | |||||
| i__2 = *n - k; | |||||
| cgemv_("Conjugate transpose", &i__1, &i__2, &tau[k], &a[rk + (k + | |||||
| 1) * a_dim1], lda, &a[rk + k * a_dim1], &c__1, &c_b1, &f[ | |||||
| k + 1 + k * f_dim1], &c__1); | |||||
| } | |||||
| /* Padding F(1:K,K) with zeros. */ | |||||
| i__1 = k; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| i__2 = j + k * f_dim1; | |||||
| f[i__2].r = 0.f, f[i__2].i = 0.f; | |||||
| /* L40: */ | |||||
| } | |||||
| /* Incremental updating of F: */ | |||||
| /* F(1:N,K) := F(1:N,K) - tau(K)*F(1:N,1:K-1)*A(RK:M,1:K-1)**H */ | |||||
| /* *A(RK:M,K). */ | |||||
| if (k > 1) { | |||||
| i__1 = *m - rk + 1; | |||||
| i__2 = k - 1; | |||||
| i__3 = k; | |||||
| q__1.r = -tau[i__3].r, q__1.i = -tau[i__3].i; | |||||
| cgemv_("Conjugate transpose", &i__1, &i__2, &q__1, &a[rk + a_dim1] | |||||
| , lda, &a[rk + k * a_dim1], &c__1, &c_b1, &auxv[1], &c__1); | |||||
| i__1 = k - 1; | |||||
| cgemv_("No transpose", n, &i__1, &c_b2, &f[f_dim1 + 1], ldf, & | |||||
| auxv[1], &c__1, &c_b2, &f[k * f_dim1 + 1], &c__1); | |||||
| } | |||||
| /* Update the current row of A: */ | |||||
| /* A(RK,K+1:N) := A(RK,K+1:N) - A(RK,1:K)*F(K+1:N,1:K)**H. */ | |||||
| if (k < *n) { | |||||
| i__1 = *n - k; | |||||
| q__1.r = -1.f, q__1.i = 0.f; | |||||
| cgemm_("No transpose", "Conjugate transpose", &c__1, &i__1, &k, & | |||||
| q__1, &a[rk + a_dim1], lda, &f[k + 1 + f_dim1], ldf, & | |||||
| c_b2, &a[rk + (k + 1) * a_dim1], lda); | |||||
| } | |||||
| /* Update partial column norms. */ | |||||
| if (rk < lastrk) { | |||||
| i__1 = *n; | |||||
| for (j = k + 1; j <= i__1; ++j) { | |||||
| if (vn1[j] != 0.f) { | |||||
| /* NOTE: The following 4 lines follow from the analysis in */ | |||||
| /* Lapack Working Note 176. */ | |||||
| temp = c_abs(&a[rk + j * a_dim1]) / vn1[j]; | |||||
| /* Computing MAX */ | |||||
| r__1 = 0.f, r__2 = (temp + 1.f) * (1.f - temp); | |||||
| temp = f2cmax(r__1,r__2); | |||||
| /* Computing 2nd power */ | |||||
| r__1 = vn1[j] / vn2[j]; | |||||
| temp2 = temp * (r__1 * r__1); | |||||
| if (temp2 <= tol3z) { | |||||
| vn2[j] = (real) lsticc; | |||||
| lsticc = j; | |||||
| } else { | |||||
| vn1[j] *= sqrt(temp); | |||||
| } | |||||
| } | |||||
| /* L50: */ | |||||
| } | |||||
| } | |||||
| i__1 = rk + k * a_dim1; | |||||
| a[i__1].r = akk.r, a[i__1].i = akk.i; | |||||
| /* End of while loop. */ | |||||
| goto L10; | |||||
| } | |||||
| *kb = k; | |||||
| rk = *offset + *kb; | |||||
| /* Apply the block reflector to the rest of the matrix: */ | |||||
| /* A(OFFSET+KB+1:M,KB+1:N) := A(OFFSET+KB+1:M,KB+1:N) - */ | |||||
| /* A(OFFSET+KB+1:M,1:KB)*F(KB+1:N,1:KB)**H. */ | |||||
| /* Computing MIN */ | |||||
| i__1 = *n, i__2 = *m - *offset; | |||||
| if (*kb < f2cmin(i__1,i__2)) { | |||||
| i__1 = *m - rk; | |||||
| i__2 = *n - *kb; | |||||
| q__1.r = -1.f, q__1.i = 0.f; | |||||
| cgemm_("No transpose", "Conjugate transpose", &i__1, &i__2, kb, &q__1, | |||||
| &a[rk + 1 + a_dim1], lda, &f[*kb + 1 + f_dim1], ldf, &c_b2, & | |||||
| a[rk + 1 + (*kb + 1) * a_dim1], lda); | |||||
| } | |||||
| /* Recomputation of difficult columns. */ | |||||
| L60: | |||||
| if (lsticc > 0) { | |||||
| itemp = i_nint(&vn2[lsticc]); | |||||
| i__1 = *m - rk; | |||||
| vn1[lsticc] = scnrm2_(&i__1, &a[rk + 1 + lsticc * a_dim1], &c__1); | |||||
| /* NOTE: The computation of VN1( LSTICC ) relies on the fact that */ | |||||
| /* SNRM2 does not fail on vectors with norm below the value of */ | |||||
| /* SQRT(DLAMCH('S')) */ | |||||
| vn2[lsticc] = vn1[lsticc]; | |||||
| lsticc = itemp; | |||||
| goto L60; | |||||
| } | |||||
| return 0; | |||||
| /* End of CLAQPS */ | |||||
| } /* claqps_ */ | |||||
| @@ -0,0 +1,635 @@ | |||||
| /* f2c.h -- Standard Fortran to C header file */ | |||||
| /** barf [ba:rf] 2. "He suggested using FORTRAN, and everybody barfed." | |||||
| - From The Shogakukan DICTIONARY OF NEW ENGLISH (Second edition) */ | |||||
| #ifndef F2C_INCLUDE | |||||
| #define F2C_INCLUDE | |||||
| #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 | |||||
| typedef int 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; | |||||
| 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;} | |||||
| #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)); } | |||||
| #define c_div(c, a, b) {pCf(c) = Cf(a)/Cf(b);} | |||||
| #define z_div(c, a, b) {pCd(c) = Cd(a)/Cd(b);} | |||||
| #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) = conj(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) (cimag(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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotc_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void cdotu_(complex *z, integer *n_, complex *x, integer *incx_, complex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotu_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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) | |||||
| */ | |||||
| /* > \brief \b CLAQR1 sets a scalar multiple of the first column of the product of 2-by-2 or 3-by-3 matrix H a | |||||
| nd specified shifts. */ | |||||
| /* =========== DOCUMENTATION =========== */ | |||||
| /* Online html documentation available at */ | |||||
| /* http://www.netlib.org/lapack/explore-html/ */ | |||||
| /* > \htmlonly */ | |||||
| /* > Download CLAQR1 + dependencies */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/claqr1. | |||||
| f"> */ | |||||
| /* > [TGZ]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/claqr1. | |||||
| f"> */ | |||||
| /* > [ZIP]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/claqr1. | |||||
| f"> */ | |||||
| /* > [TXT]</a> */ | |||||
| /* > \endhtmlonly */ | |||||
| /* Definition: */ | |||||
| /* =========== */ | |||||
| /* SUBROUTINE CLAQR1( N, H, LDH, S1, S2, V ) */ | |||||
| /* COMPLEX S1, S2 */ | |||||
| /* INTEGER LDH, N */ | |||||
| /* COMPLEX H( LDH, * ), V( * ) */ | |||||
| /* > \par Purpose: */ | |||||
| /* ============= */ | |||||
| /* > */ | |||||
| /* > \verbatim */ | |||||
| /* > */ | |||||
| /* > Given a 2-by-2 or 3-by-3 matrix H, CLAQR1 sets v to a */ | |||||
| /* > scalar multiple of the first column of the product */ | |||||
| /* > */ | |||||
| /* > (*) K = (H - s1*I)*(H - s2*I) */ | |||||
| /* > */ | |||||
| /* > scaling to avoid overflows and most underflows. */ | |||||
| /* > */ | |||||
| /* > This is useful for starting double implicit shift bulges */ | |||||
| /* > in the QR algorithm. */ | |||||
| /* > \endverbatim */ | |||||
| /* Arguments: */ | |||||
| /* ========== */ | |||||
| /* > \param[in] N */ | |||||
| /* > \verbatim */ | |||||
| /* > N is INTEGER */ | |||||
| /* > Order of the matrix H. N must be either 2 or 3. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] H */ | |||||
| /* > \verbatim */ | |||||
| /* > H is COMPLEX array, dimension (LDH,N) */ | |||||
| /* > The 2-by-2 or 3-by-3 matrix H in (*). */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] LDH */ | |||||
| /* > \verbatim */ | |||||
| /* > LDH is INTEGER */ | |||||
| /* > The leading dimension of H as declared in */ | |||||
| /* > the calling procedure. LDH >= N */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] S1 */ | |||||
| /* > \verbatim */ | |||||
| /* > S1 is COMPLEX */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] S2 */ | |||||
| /* > \verbatim */ | |||||
| /* > S2 is COMPLEX */ | |||||
| /* > */ | |||||
| /* > S1 and S2 are the shifts defining K in (*) above. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] V */ | |||||
| /* > \verbatim */ | |||||
| /* > V is COMPLEX array, dimension (N) */ | |||||
| /* > A scalar multiple of the first column of the */ | |||||
| /* > matrix K in (*). */ | |||||
| /* > \endverbatim */ | |||||
| /* Authors: */ | |||||
| /* ======== */ | |||||
| /* > \author Univ. of Tennessee */ | |||||
| /* > \author Univ. of California Berkeley */ | |||||
| /* > \author Univ. of Colorado Denver */ | |||||
| /* > \author NAG Ltd. */ | |||||
| /* > \date June 2017 */ | |||||
| /* > \ingroup complexOTHERauxiliary */ | |||||
| /* > \par Contributors: */ | |||||
| /* ================== */ | |||||
| /* > */ | |||||
| /* > Karen Braman and Ralph Byers, Department of Mathematics, */ | |||||
| /* > University of Kansas, USA */ | |||||
| /* > */ | |||||
| /* ===================================================================== */ | |||||
| /* Subroutine */ int claqr1_(integer *n, complex *h__, integer *ldh, complex * | |||||
| s1, complex *s2, complex *v) | |||||
| { | |||||
| /* System generated locals */ | |||||
| integer h_dim1, h_offset, i__1, i__2, i__3, i__4; | |||||
| real r__1, r__2, r__3, r__4, r__5, r__6; | |||||
| complex q__1, q__2, q__3, q__4, q__5, q__6, q__7, q__8; | |||||
| /* Local variables */ | |||||
| real s; | |||||
| complex h21s, h31s; | |||||
| /* -- LAPACK auxiliary routine (version 3.7.1) -- */ | |||||
| /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ | |||||
| /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ | |||||
| /* June 2017 */ | |||||
| /* ================================================================ */ | |||||
| /* Quick return if possible */ | |||||
| /* Parameter adjustments */ | |||||
| h_dim1 = *ldh; | |||||
| h_offset = 1 + h_dim1 * 1; | |||||
| h__ -= h_offset; | |||||
| --v; | |||||
| /* Function Body */ | |||||
| if (*n != 2 && *n != 3) { | |||||
| return 0; | |||||
| } | |||||
| if (*n == 2) { | |||||
| i__1 = h_dim1 + 1; | |||||
| q__2.r = h__[i__1].r - s2->r, q__2.i = h__[i__1].i - s2->i; | |||||
| q__1.r = q__2.r, q__1.i = q__2.i; | |||||
| i__2 = h_dim1 + 2; | |||||
| s = (r__1 = q__1.r, abs(r__1)) + (r__2 = r_imag(&q__1), abs(r__2)) + ( | |||||
| (r__3 = h__[i__2].r, abs(r__3)) + (r__4 = r_imag(&h__[h_dim1 | |||||
| + 2]), abs(r__4))); | |||||
| if (s == 0.f) { | |||||
| v[1].r = 0.f, v[1].i = 0.f; | |||||
| v[2].r = 0.f, v[2].i = 0.f; | |||||
| } else { | |||||
| i__1 = h_dim1 + 2; | |||||
| q__1.r = h__[i__1].r / s, q__1.i = h__[i__1].i / s; | |||||
| h21s.r = q__1.r, h21s.i = q__1.i; | |||||
| i__1 = (h_dim1 << 1) + 1; | |||||
| q__2.r = h21s.r * h__[i__1].r - h21s.i * h__[i__1].i, q__2.i = | |||||
| h21s.r * h__[i__1].i + h21s.i * h__[i__1].r; | |||||
| i__2 = h_dim1 + 1; | |||||
| q__4.r = h__[i__2].r - s1->r, q__4.i = h__[i__2].i - s1->i; | |||||
| i__3 = h_dim1 + 1; | |||||
| q__6.r = h__[i__3].r - s2->r, q__6.i = h__[i__3].i - s2->i; | |||||
| q__5.r = q__6.r / s, q__5.i = q__6.i / s; | |||||
| q__3.r = q__4.r * q__5.r - q__4.i * q__5.i, q__3.i = q__4.r * | |||||
| q__5.i + q__4.i * q__5.r; | |||||
| q__1.r = q__2.r + q__3.r, q__1.i = q__2.i + q__3.i; | |||||
| v[1].r = q__1.r, v[1].i = q__1.i; | |||||
| i__1 = h_dim1 + 1; | |||||
| i__2 = (h_dim1 << 1) + 2; | |||||
| q__4.r = h__[i__1].r + h__[i__2].r, q__4.i = h__[i__1].i + h__[ | |||||
| i__2].i; | |||||
| q__3.r = q__4.r - s1->r, q__3.i = q__4.i - s1->i; | |||||
| q__2.r = q__3.r - s2->r, q__2.i = q__3.i - s2->i; | |||||
| q__1.r = h21s.r * q__2.r - h21s.i * q__2.i, q__1.i = h21s.r * | |||||
| q__2.i + h21s.i * q__2.r; | |||||
| v[2].r = q__1.r, v[2].i = q__1.i; | |||||
| } | |||||
| } else { | |||||
| i__1 = h_dim1 + 1; | |||||
| q__2.r = h__[i__1].r - s2->r, q__2.i = h__[i__1].i - s2->i; | |||||
| q__1.r = q__2.r, q__1.i = q__2.i; | |||||
| i__2 = h_dim1 + 2; | |||||
| i__3 = h_dim1 + 3; | |||||
| s = (r__1 = q__1.r, abs(r__1)) + (r__2 = r_imag(&q__1), abs(r__2)) + ( | |||||
| (r__3 = h__[i__2].r, abs(r__3)) + (r__4 = r_imag(&h__[h_dim1 | |||||
| + 2]), abs(r__4))) + ((r__5 = h__[i__3].r, abs(r__5)) + (r__6 | |||||
| = r_imag(&h__[h_dim1 + 3]), abs(r__6))); | |||||
| if (s == 0.f) { | |||||
| v[1].r = 0.f, v[1].i = 0.f; | |||||
| v[2].r = 0.f, v[2].i = 0.f; | |||||
| v[3].r = 0.f, v[3].i = 0.f; | |||||
| } else { | |||||
| i__1 = h_dim1 + 2; | |||||
| q__1.r = h__[i__1].r / s, q__1.i = h__[i__1].i / s; | |||||
| h21s.r = q__1.r, h21s.i = q__1.i; | |||||
| i__1 = h_dim1 + 3; | |||||
| q__1.r = h__[i__1].r / s, q__1.i = h__[i__1].i / s; | |||||
| h31s.r = q__1.r, h31s.i = q__1.i; | |||||
| i__1 = h_dim1 + 1; | |||||
| q__4.r = h__[i__1].r - s1->r, q__4.i = h__[i__1].i - s1->i; | |||||
| i__2 = h_dim1 + 1; | |||||
| q__6.r = h__[i__2].r - s2->r, q__6.i = h__[i__2].i - s2->i; | |||||
| q__5.r = q__6.r / s, q__5.i = q__6.i / s; | |||||
| q__3.r = q__4.r * q__5.r - q__4.i * q__5.i, q__3.i = q__4.r * | |||||
| q__5.i + q__4.i * q__5.r; | |||||
| i__3 = (h_dim1 << 1) + 1; | |||||
| q__7.r = h__[i__3].r * h21s.r - h__[i__3].i * h21s.i, q__7.i = | |||||
| h__[i__3].r * h21s.i + h__[i__3].i * h21s.r; | |||||
| q__2.r = q__3.r + q__7.r, q__2.i = q__3.i + q__7.i; | |||||
| i__4 = h_dim1 * 3 + 1; | |||||
| q__8.r = h__[i__4].r * h31s.r - h__[i__4].i * h31s.i, q__8.i = | |||||
| h__[i__4].r * h31s.i + h__[i__4].i * h31s.r; | |||||
| q__1.r = q__2.r + q__8.r, q__1.i = q__2.i + q__8.i; | |||||
| v[1].r = q__1.r, v[1].i = q__1.i; | |||||
| i__1 = h_dim1 + 1; | |||||
| i__2 = (h_dim1 << 1) + 2; | |||||
| q__5.r = h__[i__1].r + h__[i__2].r, q__5.i = h__[i__1].i + h__[ | |||||
| i__2].i; | |||||
| q__4.r = q__5.r - s1->r, q__4.i = q__5.i - s1->i; | |||||
| q__3.r = q__4.r - s2->r, q__3.i = q__4.i - s2->i; | |||||
| q__2.r = h21s.r * q__3.r - h21s.i * q__3.i, q__2.i = h21s.r * | |||||
| q__3.i + h21s.i * q__3.r; | |||||
| i__3 = h_dim1 * 3 + 2; | |||||
| q__6.r = h__[i__3].r * h31s.r - h__[i__3].i * h31s.i, q__6.i = | |||||
| h__[i__3].r * h31s.i + h__[i__3].i * h31s.r; | |||||
| q__1.r = q__2.r + q__6.r, q__1.i = q__2.i + q__6.i; | |||||
| v[2].r = q__1.r, v[2].i = q__1.i; | |||||
| i__1 = h_dim1 + 1; | |||||
| i__2 = h_dim1 * 3 + 3; | |||||
| q__5.r = h__[i__1].r + h__[i__2].r, q__5.i = h__[i__1].i + h__[ | |||||
| i__2].i; | |||||
| q__4.r = q__5.r - s1->r, q__4.i = q__5.i - s1->i; | |||||
| q__3.r = q__4.r - s2->r, q__3.i = q__4.i - s2->i; | |||||
| q__2.r = h31s.r * q__3.r - h31s.i * q__3.i, q__2.i = h31s.r * | |||||
| q__3.i + h31s.i * q__3.r; | |||||
| i__3 = (h_dim1 << 1) + 3; | |||||
| q__6.r = h21s.r * h__[i__3].r - h21s.i * h__[i__3].i, q__6.i = | |||||
| h21s.r * h__[i__3].i + h21s.i * h__[i__3].r; | |||||
| q__1.r = q__2.r + q__6.r, q__1.i = q__2.i + q__6.i; | |||||
| v[3].r = q__1.r, v[3].i = q__1.i; | |||||
| } | |||||
| } | |||||
| return 0; | |||||
| } /* claqr1_ */ | |||||
| @@ -0,0 +1,631 @@ | |||||
| /* f2c.h -- Standard Fortran to C header file */ | |||||
| /** barf [ba:rf] 2. "He suggested using FORTRAN, and everybody barfed." | |||||
| - From The Shogakukan DICTIONARY OF NEW ENGLISH (Second edition) */ | |||||
| #ifndef F2C_INCLUDE | |||||
| #define F2C_INCLUDE | |||||
| #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 | |||||
| typedef int 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; | |||||
| 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;} | |||||
| #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)); } | |||||
| #define c_div(c, a, b) {pCf(c) = Cf(a)/Cf(b);} | |||||
| #define z_div(c, a, b) {pCd(c) = Cd(a)/Cd(b);} | |||||
| #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) = conj(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) (cimag(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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotc_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void cdotu_(complex *z, integer *n_, complex *x, integer *incx_, complex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotu_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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) | |||||
| */ | |||||
| /* > \brief \b CLAQSB scales a symmetric/Hermitian band matrix, using scaling factors computed by spbequ. */ | |||||
| /* =========== DOCUMENTATION =========== */ | |||||
| /* Online html documentation available at */ | |||||
| /* http://www.netlib.org/lapack/explore-html/ */ | |||||
| /* > \htmlonly */ | |||||
| /* > Download CLAQSB + dependencies */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/claqsb. | |||||
| f"> */ | |||||
| /* > [TGZ]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/claqsb. | |||||
| f"> */ | |||||
| /* > [ZIP]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/claqsb. | |||||
| f"> */ | |||||
| /* > [TXT]</a> */ | |||||
| /* > \endhtmlonly */ | |||||
| /* Definition: */ | |||||
| /* =========== */ | |||||
| /* SUBROUTINE CLAQSB( UPLO, N, KD, AB, LDAB, S, SCOND, AMAX, EQUED ) */ | |||||
| /* CHARACTER EQUED, UPLO */ | |||||
| /* INTEGER KD, LDAB, N */ | |||||
| /* REAL AMAX, SCOND */ | |||||
| /* REAL S( * ) */ | |||||
| /* COMPLEX AB( LDAB, * ) */ | |||||
| /* > \par Purpose: */ | |||||
| /* ============= */ | |||||
| /* > */ | |||||
| /* > \verbatim */ | |||||
| /* > */ | |||||
| /* > CLAQSB equilibrates a symmetric band matrix A using the scaling */ | |||||
| /* > factors in the vector S. */ | |||||
| /* > \endverbatim */ | |||||
| /* Arguments: */ | |||||
| /* ========== */ | |||||
| /* > \param[in] UPLO */ | |||||
| /* > \verbatim */ | |||||
| /* > UPLO is CHARACTER*1 */ | |||||
| /* > Specifies whether the upper or lower triangular part of the */ | |||||
| /* > symmetric matrix A is stored. */ | |||||
| /* > = 'U': Upper triangular */ | |||||
| /* > = 'L': Lower triangular */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] N */ | |||||
| /* > \verbatim */ | |||||
| /* > N is INTEGER */ | |||||
| /* > The order of the matrix A. N >= 0. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] KD */ | |||||
| /* > \verbatim */ | |||||
| /* > KD is INTEGER */ | |||||
| /* > The number of super-diagonals of the matrix A if UPLO = 'U', */ | |||||
| /* > or the number of sub-diagonals if UPLO = 'L'. KD >= 0. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in,out] AB */ | |||||
| /* > \verbatim */ | |||||
| /* > AB is COMPLEX array, dimension (LDAB,N) */ | |||||
| /* > On entry, the upper or lower triangle of the symmetric band */ | |||||
| /* > matrix A, stored in the first KD+1 rows of the array. The */ | |||||
| /* > j-th column of A is stored in the j-th column of the array AB */ | |||||
| /* > as follows: */ | |||||
| /* > if UPLO = 'U', AB(kd+1+i-j,j) = A(i,j) for f2cmax(1,j-kd)<=i<=j; */ | |||||
| /* > if UPLO = 'L', AB(1+i-j,j) = A(i,j) for j<=i<=f2cmin(n,j+kd). */ | |||||
| /* > */ | |||||
| /* > On exit, if INFO = 0, the triangular factor U or L from the */ | |||||
| /* > Cholesky factorization A = U**H *U or A = L*L**H of the band */ | |||||
| /* > matrix A, in the same storage format as A. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] LDAB */ | |||||
| /* > \verbatim */ | |||||
| /* > LDAB is INTEGER */ | |||||
| /* > The leading dimension of the array AB. LDAB >= KD+1. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] S */ | |||||
| /* > \verbatim */ | |||||
| /* > S is REAL array, dimension (N) */ | |||||
| /* > The scale factors for A. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] SCOND */ | |||||
| /* > \verbatim */ | |||||
| /* > SCOND is REAL */ | |||||
| /* > Ratio of the smallest S(i) to the largest S(i). */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] AMAX */ | |||||
| /* > \verbatim */ | |||||
| /* > AMAX is REAL */ | |||||
| /* > Absolute value of largest matrix entry. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] EQUED */ | |||||
| /* > \verbatim */ | |||||
| /* > EQUED is CHARACTER*1 */ | |||||
| /* > Specifies whether or not equilibration was done. */ | |||||
| /* > = 'N': No equilibration. */ | |||||
| /* > = 'Y': Equilibration was done, i.e., A has been replaced by */ | |||||
| /* > diag(S) * A * diag(S). */ | |||||
| /* > \endverbatim */ | |||||
| /* > \par Internal Parameters: */ | |||||
| /* ========================= */ | |||||
| /* > */ | |||||
| /* > \verbatim */ | |||||
| /* > THRESH is a threshold value used to decide if scaling should be done */ | |||||
| /* > based on the ratio of the scaling factors. If SCOND < THRESH, */ | |||||
| /* > scaling is done. */ | |||||
| /* > */ | |||||
| /* > LARGE and SMALL are threshold values used to decide if scaling should */ | |||||
| /* > be done based on the absolute size of the largest matrix element. */ | |||||
| /* > If AMAX > LARGE or AMAX < SMALL, scaling is done. */ | |||||
| /* > \endverbatim */ | |||||
| /* Authors: */ | |||||
| /* ======== */ | |||||
| /* > \author Univ. of Tennessee */ | |||||
| /* > \author Univ. of California Berkeley */ | |||||
| /* > \author Univ. of Colorado Denver */ | |||||
| /* > \author NAG Ltd. */ | |||||
| /* > \date December 2016 */ | |||||
| /* > \ingroup complexOTHERauxiliary */ | |||||
| /* ===================================================================== */ | |||||
| /* Subroutine */ int claqsb_(char *uplo, integer *n, integer *kd, complex *ab, | |||||
| integer *ldab, real *s, real *scond, real *amax, char *equed) | |||||
| { | |||||
| /* System generated locals */ | |||||
| integer ab_dim1, ab_offset, i__1, i__2, i__3, i__4; | |||||
| real r__1; | |||||
| complex q__1; | |||||
| /* Local variables */ | |||||
| integer i__, j; | |||||
| real large; | |||||
| extern logical lsame_(char *, char *); | |||||
| real small, cj; | |||||
| extern real slamch_(char *); | |||||
| /* -- LAPACK auxiliary routine (version 3.7.0) -- */ | |||||
| /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ | |||||
| /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ | |||||
| /* December 2016 */ | |||||
| /* ===================================================================== */ | |||||
| /* Quick return if possible */ | |||||
| /* Parameter adjustments */ | |||||
| ab_dim1 = *ldab; | |||||
| ab_offset = 1 + ab_dim1 * 1; | |||||
| ab -= ab_offset; | |||||
| --s; | |||||
| /* Function Body */ | |||||
| if (*n <= 0) { | |||||
| *(unsigned char *)equed = 'N'; | |||||
| return 0; | |||||
| } | |||||
| /* Initialize LARGE and SMALL. */ | |||||
| small = slamch_("Safe minimum") / slamch_("Precision"); | |||||
| large = 1.f / small; | |||||
| if (*scond >= .1f && *amax >= small && *amax <= large) { | |||||
| /* No equilibration */ | |||||
| *(unsigned char *)equed = 'N'; | |||||
| } else { | |||||
| /* Replace A by diag(S) * A * diag(S). */ | |||||
| if (lsame_(uplo, "U")) { | |||||
| /* Upper triangle of A is stored in band format. */ | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| cj = s[j]; | |||||
| /* Computing MAX */ | |||||
| i__2 = 1, i__3 = j - *kd; | |||||
| i__4 = j; | |||||
| for (i__ = f2cmax(i__2,i__3); i__ <= i__4; ++i__) { | |||||
| i__2 = *kd + 1 + i__ - j + j * ab_dim1; | |||||
| r__1 = cj * s[i__]; | |||||
| i__3 = *kd + 1 + i__ - j + j * ab_dim1; | |||||
| q__1.r = r__1 * ab[i__3].r, q__1.i = r__1 * ab[i__3].i; | |||||
| ab[i__2].r = q__1.r, ab[i__2].i = q__1.i; | |||||
| /* L10: */ | |||||
| } | |||||
| /* L20: */ | |||||
| } | |||||
| } else { | |||||
| /* Lower triangle of A is stored. */ | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| cj = s[j]; | |||||
| /* Computing MIN */ | |||||
| i__2 = *n, i__3 = j + *kd; | |||||
| i__4 = f2cmin(i__2,i__3); | |||||
| for (i__ = j; i__ <= i__4; ++i__) { | |||||
| i__2 = i__ + 1 - j + j * ab_dim1; | |||||
| r__1 = cj * s[i__]; | |||||
| i__3 = i__ + 1 - j + j * ab_dim1; | |||||
| q__1.r = r__1 * ab[i__3].r, q__1.i = r__1 * ab[i__3].i; | |||||
| ab[i__2].r = q__1.r, ab[i__2].i = q__1.i; | |||||
| /* L30: */ | |||||
| } | |||||
| /* L40: */ | |||||
| } | |||||
| } | |||||
| *(unsigned char *)equed = 'Y'; | |||||
| } | |||||
| return 0; | |||||
| /* End of CLAQSB */ | |||||
| } /* claqsb_ */ | |||||
| @@ -0,0 +1,617 @@ | |||||
| /* f2c.h -- Standard Fortran to C header file */ | |||||
| /** barf [ba:rf] 2. "He suggested using FORTRAN, and everybody barfed." | |||||
| - From The Shogakukan DICTIONARY OF NEW ENGLISH (Second edition) */ | |||||
| #ifndef F2C_INCLUDE | |||||
| #define F2C_INCLUDE | |||||
| #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 | |||||
| typedef int 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; | |||||
| 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;} | |||||
| #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)); } | |||||
| #define c_div(c, a, b) {pCf(c) = Cf(a)/Cf(b);} | |||||
| #define z_div(c, a, b) {pCd(c) = Cd(a)/Cd(b);} | |||||
| #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) = conj(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) (cimag(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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotc_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void cdotu_(complex *z, integer *n_, complex *x, integer *incx_, complex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotu_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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) | |||||
| */ | |||||
| /* > \brief \b CLAQSP scales a symmetric/Hermitian matrix in packed storage, using scaling factors computed by | |||||
| sppequ. */ | |||||
| /* =========== DOCUMENTATION =========== */ | |||||
| /* Online html documentation available at */ | |||||
| /* http://www.netlib.org/lapack/explore-html/ */ | |||||
| /* > \htmlonly */ | |||||
| /* > Download CLAQSP + dependencies */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/claqsp. | |||||
| f"> */ | |||||
| /* > [TGZ]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/claqsp. | |||||
| f"> */ | |||||
| /* > [ZIP]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/claqsp. | |||||
| f"> */ | |||||
| /* > [TXT]</a> */ | |||||
| /* > \endhtmlonly */ | |||||
| /* Definition: */ | |||||
| /* =========== */ | |||||
| /* SUBROUTINE CLAQSP( UPLO, N, AP, S, SCOND, AMAX, EQUED ) */ | |||||
| /* CHARACTER EQUED, UPLO */ | |||||
| /* INTEGER N */ | |||||
| /* REAL AMAX, SCOND */ | |||||
| /* REAL S( * ) */ | |||||
| /* COMPLEX AP( * ) */ | |||||
| /* > \par Purpose: */ | |||||
| /* ============= */ | |||||
| /* > */ | |||||
| /* > \verbatim */ | |||||
| /* > */ | |||||
| /* > CLAQSP equilibrates a symmetric matrix A using the scaling factors */ | |||||
| /* > in the vector S. */ | |||||
| /* > \endverbatim */ | |||||
| /* Arguments: */ | |||||
| /* ========== */ | |||||
| /* > \param[in] UPLO */ | |||||
| /* > \verbatim */ | |||||
| /* > UPLO is CHARACTER*1 */ | |||||
| /* > Specifies whether the upper or lower triangular part of the */ | |||||
| /* > symmetric matrix A is stored. */ | |||||
| /* > = 'U': Upper triangular */ | |||||
| /* > = 'L': Lower triangular */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] N */ | |||||
| /* > \verbatim */ | |||||
| /* > N is INTEGER */ | |||||
| /* > The order of the matrix A. N >= 0. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in,out] AP */ | |||||
| /* > \verbatim */ | |||||
| /* > AP is COMPLEX array, dimension (N*(N+1)/2) */ | |||||
| /* > On entry, the upper or lower triangle of the symmetric matrix */ | |||||
| /* > A, packed columnwise in a linear array. The j-th column of A */ | |||||
| /* > is stored in the array AP as follows: */ | |||||
| /* > if UPLO = 'U', AP(i + (j-1)*j/2) = A(i,j) for 1<=i<=j; */ | |||||
| /* > if UPLO = 'L', AP(i + (j-1)*(2n-j)/2) = A(i,j) for j<=i<=n. */ | |||||
| /* > */ | |||||
| /* > On exit, the equilibrated matrix: diag(S) * A * diag(S), in */ | |||||
| /* > the same storage format as A. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] S */ | |||||
| /* > \verbatim */ | |||||
| /* > S is REAL array, dimension (N) */ | |||||
| /* > The scale factors for A. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] SCOND */ | |||||
| /* > \verbatim */ | |||||
| /* > SCOND is REAL */ | |||||
| /* > Ratio of the smallest S(i) to the largest S(i). */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] AMAX */ | |||||
| /* > \verbatim */ | |||||
| /* > AMAX is REAL */ | |||||
| /* > Absolute value of largest matrix entry. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] EQUED */ | |||||
| /* > \verbatim */ | |||||
| /* > EQUED is CHARACTER*1 */ | |||||
| /* > Specifies whether or not equilibration was done. */ | |||||
| /* > = 'N': No equilibration. */ | |||||
| /* > = 'Y': Equilibration was done, i.e., A has been replaced by */ | |||||
| /* > diag(S) * A * diag(S). */ | |||||
| /* > \endverbatim */ | |||||
| /* > \par Internal Parameters: */ | |||||
| /* ========================= */ | |||||
| /* > */ | |||||
| /* > \verbatim */ | |||||
| /* > THRESH is a threshold value used to decide if scaling should be done */ | |||||
| /* > based on the ratio of the scaling factors. If SCOND < THRESH, */ | |||||
| /* > scaling is done. */ | |||||
| /* > */ | |||||
| /* > LARGE and SMALL are threshold values used to decide if scaling should */ | |||||
| /* > be done based on the absolute size of the largest matrix element. */ | |||||
| /* > If AMAX > LARGE or AMAX < SMALL, scaling is done. */ | |||||
| /* > \endverbatim */ | |||||
| /* Authors: */ | |||||
| /* ======== */ | |||||
| /* > \author Univ. of Tennessee */ | |||||
| /* > \author Univ. of California Berkeley */ | |||||
| /* > \author Univ. of Colorado Denver */ | |||||
| /* > \author NAG Ltd. */ | |||||
| /* > \date December 2016 */ | |||||
| /* > \ingroup complexOTHERauxiliary */ | |||||
| /* ===================================================================== */ | |||||
| /* Subroutine */ int claqsp_(char *uplo, integer *n, complex *ap, real *s, | |||||
| real *scond, real *amax, char *equed) | |||||
| { | |||||
| /* System generated locals */ | |||||
| integer i__1, i__2, i__3, i__4; | |||||
| real r__1; | |||||
| complex q__1; | |||||
| /* Local variables */ | |||||
| integer i__, j; | |||||
| real large; | |||||
| extern logical lsame_(char *, char *); | |||||
| real small; | |||||
| integer jc; | |||||
| real cj; | |||||
| extern real slamch_(char *); | |||||
| /* -- LAPACK auxiliary routine (version 3.7.0) -- */ | |||||
| /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ | |||||
| /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ | |||||
| /* December 2016 */ | |||||
| /* ===================================================================== */ | |||||
| /* Quick return if possible */ | |||||
| /* Parameter adjustments */ | |||||
| --s; | |||||
| --ap; | |||||
| /* Function Body */ | |||||
| if (*n <= 0) { | |||||
| *(unsigned char *)equed = 'N'; | |||||
| return 0; | |||||
| } | |||||
| /* Initialize LARGE and SMALL. */ | |||||
| small = slamch_("Safe minimum") / slamch_("Precision"); | |||||
| large = 1.f / small; | |||||
| if (*scond >= .1f && *amax >= small && *amax <= large) { | |||||
| /* No equilibration */ | |||||
| *(unsigned char *)equed = 'N'; | |||||
| } else { | |||||
| /* Replace A by diag(S) * A * diag(S). */ | |||||
| if (lsame_(uplo, "U")) { | |||||
| /* Upper triangle of A is stored. */ | |||||
| jc = 1; | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| cj = s[j]; | |||||
| i__2 = j; | |||||
| for (i__ = 1; i__ <= i__2; ++i__) { | |||||
| i__3 = jc + i__ - 1; | |||||
| r__1 = cj * s[i__]; | |||||
| i__4 = jc + i__ - 1; | |||||
| q__1.r = r__1 * ap[i__4].r, q__1.i = r__1 * ap[i__4].i; | |||||
| ap[i__3].r = q__1.r, ap[i__3].i = q__1.i; | |||||
| /* L10: */ | |||||
| } | |||||
| jc += j; | |||||
| /* L20: */ | |||||
| } | |||||
| } else { | |||||
| /* Lower triangle of A is stored. */ | |||||
| jc = 1; | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| cj = s[j]; | |||||
| i__2 = *n; | |||||
| for (i__ = j; i__ <= i__2; ++i__) { | |||||
| i__3 = jc + i__ - j; | |||||
| r__1 = cj * s[i__]; | |||||
| i__4 = jc + i__ - j; | |||||
| q__1.r = r__1 * ap[i__4].r, q__1.i = r__1 * ap[i__4].i; | |||||
| ap[i__3].r = q__1.r, ap[i__3].i = q__1.i; | |||||
| /* L30: */ | |||||
| } | |||||
| jc = jc + *n - j + 1; | |||||
| /* L40: */ | |||||
| } | |||||
| } | |||||
| *(unsigned char *)equed = 'Y'; | |||||
| } | |||||
| return 0; | |||||
| /* End of CLAQSP */ | |||||
| } /* claqsp_ */ | |||||
| @@ -0,0 +1,620 @@ | |||||
| /* f2c.h -- Standard Fortran to C header file */ | |||||
| /** barf [ba:rf] 2. "He suggested using FORTRAN, and everybody barfed." | |||||
| - From The Shogakukan DICTIONARY OF NEW ENGLISH (Second edition) */ | |||||
| #ifndef F2C_INCLUDE | |||||
| #define F2C_INCLUDE | |||||
| #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 | |||||
| typedef int 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; | |||||
| 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;} | |||||
| #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)); } | |||||
| #define c_div(c, a, b) {pCf(c) = Cf(a)/Cf(b);} | |||||
| #define z_div(c, a, b) {pCd(c) = Cd(a)/Cd(b);} | |||||
| #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) = conj(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) (cimag(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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotc_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void cdotu_(complex *z, integer *n_, complex *x, integer *incx_, complex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotu_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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) | |||||
| */ | |||||
| /* > \brief \b CLAQSY scales a symmetric/Hermitian matrix, using scaling factors computed by spoequ. */ | |||||
| /* =========== DOCUMENTATION =========== */ | |||||
| /* Online html documentation available at */ | |||||
| /* http://www.netlib.org/lapack/explore-html/ */ | |||||
| /* > \htmlonly */ | |||||
| /* > Download CLAQSY + dependencies */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/claqsy. | |||||
| f"> */ | |||||
| /* > [TGZ]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/claqsy. | |||||
| f"> */ | |||||
| /* > [ZIP]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/claqsy. | |||||
| f"> */ | |||||
| /* > [TXT]</a> */ | |||||
| /* > \endhtmlonly */ | |||||
| /* Definition: */ | |||||
| /* =========== */ | |||||
| /* SUBROUTINE CLAQSY( UPLO, N, A, LDA, S, SCOND, AMAX, EQUED ) */ | |||||
| /* CHARACTER EQUED, UPLO */ | |||||
| /* INTEGER LDA, N */ | |||||
| /* REAL AMAX, SCOND */ | |||||
| /* REAL S( * ) */ | |||||
| /* COMPLEX A( LDA, * ) */ | |||||
| /* > \par Purpose: */ | |||||
| /* ============= */ | |||||
| /* > */ | |||||
| /* > \verbatim */ | |||||
| /* > */ | |||||
| /* > CLAQSY equilibrates a symmetric matrix A using the scaling factors */ | |||||
| /* > in the vector S. */ | |||||
| /* > \endverbatim */ | |||||
| /* Arguments: */ | |||||
| /* ========== */ | |||||
| /* > \param[in] UPLO */ | |||||
| /* > \verbatim */ | |||||
| /* > UPLO is CHARACTER*1 */ | |||||
| /* > Specifies whether the upper or lower triangular part of the */ | |||||
| /* > symmetric matrix A is stored. */ | |||||
| /* > = 'U': Upper triangular */ | |||||
| /* > = 'L': Lower triangular */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] N */ | |||||
| /* > \verbatim */ | |||||
| /* > N is INTEGER */ | |||||
| /* > The order of the matrix A. N >= 0. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in,out] A */ | |||||
| /* > \verbatim */ | |||||
| /* > A is COMPLEX array, dimension (LDA,N) */ | |||||
| /* > On entry, the symmetric matrix A. If UPLO = 'U', the leading */ | |||||
| /* > n by n upper triangular part of A contains the upper */ | |||||
| /* > triangular part of the matrix A, and the strictly lower */ | |||||
| /* > triangular part of A is not referenced. If UPLO = 'L', the */ | |||||
| /* > leading n by n lower triangular part of A contains the lower */ | |||||
| /* > triangular part of the matrix A, and the strictly upper */ | |||||
| /* > triangular part of A is not referenced. */ | |||||
| /* > */ | |||||
| /* > On exit, if EQUED = 'Y', the equilibrated matrix: */ | |||||
| /* > diag(S) * A * diag(S). */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] LDA */ | |||||
| /* > \verbatim */ | |||||
| /* > LDA is INTEGER */ | |||||
| /* > The leading dimension of the array A. LDA >= f2cmax(N,1). */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] S */ | |||||
| /* > \verbatim */ | |||||
| /* > S is REAL array, dimension (N) */ | |||||
| /* > The scale factors for A. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] SCOND */ | |||||
| /* > \verbatim */ | |||||
| /* > SCOND is REAL */ | |||||
| /* > Ratio of the smallest S(i) to the largest S(i). */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] AMAX */ | |||||
| /* > \verbatim */ | |||||
| /* > AMAX is REAL */ | |||||
| /* > Absolute value of largest matrix entry. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] EQUED */ | |||||
| /* > \verbatim */ | |||||
| /* > EQUED is CHARACTER*1 */ | |||||
| /* > Specifies whether or not equilibration was done. */ | |||||
| /* > = 'N': No equilibration. */ | |||||
| /* > = 'Y': Equilibration was done, i.e., A has been replaced by */ | |||||
| /* > diag(S) * A * diag(S). */ | |||||
| /* > \endverbatim */ | |||||
| /* > \par Internal Parameters: */ | |||||
| /* ========================= */ | |||||
| /* > */ | |||||
| /* > \verbatim */ | |||||
| /* > THRESH is a threshold value used to decide if scaling should be done */ | |||||
| /* > based on the ratio of the scaling factors. If SCOND < THRESH, */ | |||||
| /* > scaling is done. */ | |||||
| /* > */ | |||||
| /* > LARGE and SMALL are threshold values used to decide if scaling should */ | |||||
| /* > be done based on the absolute size of the largest matrix element. */ | |||||
| /* > If AMAX > LARGE or AMAX < SMALL, scaling is done. */ | |||||
| /* > \endverbatim */ | |||||
| /* Authors: */ | |||||
| /* ======== */ | |||||
| /* > \author Univ. of Tennessee */ | |||||
| /* > \author Univ. of California Berkeley */ | |||||
| /* > \author Univ. of Colorado Denver */ | |||||
| /* > \author NAG Ltd. */ | |||||
| /* > \date December 2016 */ | |||||
| /* > \ingroup complexSYauxiliary */ | |||||
| /* ===================================================================== */ | |||||
| /* Subroutine */ int claqsy_(char *uplo, integer *n, complex *a, integer *lda, | |||||
| real *s, real *scond, real *amax, char *equed) | |||||
| { | |||||
| /* System generated locals */ | |||||
| integer a_dim1, a_offset, i__1, i__2, i__3, i__4; | |||||
| real r__1; | |||||
| complex q__1; | |||||
| /* Local variables */ | |||||
| integer i__, j; | |||||
| real large; | |||||
| extern logical lsame_(char *, char *); | |||||
| real small, cj; | |||||
| extern real slamch_(char *); | |||||
| /* -- LAPACK auxiliary routine (version 3.7.0) -- */ | |||||
| /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ | |||||
| /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ | |||||
| /* December 2016 */ | |||||
| /* ===================================================================== */ | |||||
| /* Quick return if possible */ | |||||
| /* Parameter adjustments */ | |||||
| a_dim1 = *lda; | |||||
| a_offset = 1 + a_dim1 * 1; | |||||
| a -= a_offset; | |||||
| --s; | |||||
| /* Function Body */ | |||||
| if (*n <= 0) { | |||||
| *(unsigned char *)equed = 'N'; | |||||
| return 0; | |||||
| } | |||||
| /* Initialize LARGE and SMALL. */ | |||||
| small = slamch_("Safe minimum") / slamch_("Precision"); | |||||
| large = 1.f / small; | |||||
| if (*scond >= .1f && *amax >= small && *amax <= large) { | |||||
| /* No equilibration */ | |||||
| *(unsigned char *)equed = 'N'; | |||||
| } else { | |||||
| /* Replace A by diag(S) * A * diag(S). */ | |||||
| if (lsame_(uplo, "U")) { | |||||
| /* Upper triangle of A is stored. */ | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| cj = s[j]; | |||||
| i__2 = j; | |||||
| for (i__ = 1; i__ <= i__2; ++i__) { | |||||
| i__3 = i__ + j * a_dim1; | |||||
| r__1 = cj * s[i__]; | |||||
| i__4 = i__ + j * a_dim1; | |||||
| q__1.r = r__1 * a[i__4].r, q__1.i = r__1 * a[i__4].i; | |||||
| a[i__3].r = q__1.r, a[i__3].i = q__1.i; | |||||
| /* L10: */ | |||||
| } | |||||
| /* L20: */ | |||||
| } | |||||
| } else { | |||||
| /* Lower triangle of A is stored. */ | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| cj = s[j]; | |||||
| i__2 = *n; | |||||
| for (i__ = j; i__ <= i__2; ++i__) { | |||||
| i__3 = i__ + j * a_dim1; | |||||
| r__1 = cj * s[i__]; | |||||
| i__4 = i__ + j * a_dim1; | |||||
| q__1.r = r__1 * a[i__4].r, q__1.i = r__1 * a[i__4].i; | |||||
| a[i__3].r = q__1.r, a[i__3].i = q__1.i; | |||||
| /* L30: */ | |||||
| } | |||||
| /* L40: */ | |||||
| } | |||||
| } | |||||
| *(unsigned char *)equed = 'Y'; | |||||
| } | |||||
| return 0; | |||||
| /* End of CLAQSY */ | |||||
| } /* claqsy_ */ | |||||
| @@ -0,0 +1,974 @@ | |||||
| /* f2c.h -- Standard Fortran to C header file */ | |||||
| /** barf [ba:rf] 2. "He suggested using FORTRAN, and everybody barfed." | |||||
| - From The Shogakukan DICTIONARY OF NEW ENGLISH (Second edition) */ | |||||
| #ifndef F2C_INCLUDE | |||||
| #define F2C_INCLUDE | |||||
| #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 | |||||
| typedef int 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; | |||||
| 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;} | |||||
| #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)); } | |||||
| #define c_div(c, a, b) {pCf(c) = Cf(a)/Cf(b);} | |||||
| #define z_div(c, a, b) {pCd(c) = Cd(a)/Cd(b);} | |||||
| #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) = conj(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) (cimag(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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotc_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void cdotu_(complex *z, integer *n_, complex *x, integer *incx_, complex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotu_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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) | |||||
| */ | |||||
| /* > \brief \b CLAR1V computes the (scaled) r-th column of the inverse of the submatrix in rows b1 through bn | |||||
| of the tridiagonal matrix LDLT - λI. */ | |||||
| /* =========== DOCUMENTATION =========== */ | |||||
| /* Online html documentation available at */ | |||||
| /* http://www.netlib.org/lapack/explore-html/ */ | |||||
| /* > \htmlonly */ | |||||
| /* > Download CLAR1V + dependencies */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/clar1v. | |||||
| f"> */ | |||||
| /* > [TGZ]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/clar1v. | |||||
| f"> */ | |||||
| /* > [ZIP]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/clar1v. | |||||
| f"> */ | |||||
| /* > [TXT]</a> */ | |||||
| /* > \endhtmlonly */ | |||||
| /* Definition: */ | |||||
| /* =========== */ | |||||
| /* SUBROUTINE CLAR1V( N, B1, BN, LAMBDA, D, L, LD, LLD, */ | |||||
| /* PIVMIN, GAPTOL, Z, WANTNC, NEGCNT, ZTZ, MINGMA, */ | |||||
| /* R, ISUPPZ, NRMINV, RESID, RQCORR, WORK ) */ | |||||
| /* LOGICAL WANTNC */ | |||||
| /* INTEGER B1, BN, N, NEGCNT, R */ | |||||
| /* REAL GAPTOL, LAMBDA, MINGMA, NRMINV, PIVMIN, RESID, */ | |||||
| /* $ RQCORR, ZTZ */ | |||||
| /* INTEGER ISUPPZ( * ) */ | |||||
| /* REAL D( * ), L( * ), LD( * ), LLD( * ), */ | |||||
| /* $ WORK( * ) */ | |||||
| /* COMPLEX Z( * ) */ | |||||
| /* > \par Purpose: */ | |||||
| /* ============= */ | |||||
| /* > */ | |||||
| /* > \verbatim */ | |||||
| /* > */ | |||||
| /* > CLAR1V computes the (scaled) r-th column of the inverse of */ | |||||
| /* > the sumbmatrix in rows B1 through BN of the tridiagonal matrix */ | |||||
| /* > L D L**T - sigma I. When sigma is close to an eigenvalue, the */ | |||||
| /* > computed vector is an accurate eigenvector. Usually, r corresponds */ | |||||
| /* > to the index where the eigenvector is largest in magnitude. */ | |||||
| /* > The following steps accomplish this computation : */ | |||||
| /* > (a) Stationary qd transform, L D L**T - sigma I = L(+) D(+) L(+)**T, */ | |||||
| /* > (b) Progressive qd transform, L D L**T - sigma I = U(-) D(-) U(-)**T, */ | |||||
| /* > (c) Computation of the diagonal elements of the inverse of */ | |||||
| /* > L D L**T - sigma I by combining the above transforms, and choosing */ | |||||
| /* > r as the index where the diagonal of the inverse is (one of the) */ | |||||
| /* > largest in magnitude. */ | |||||
| /* > (d) Computation of the (scaled) r-th column of the inverse using the */ | |||||
| /* > twisted factorization obtained by combining the top part of the */ | |||||
| /* > the stationary and the bottom part of the progressive transform. */ | |||||
| /* > \endverbatim */ | |||||
| /* Arguments: */ | |||||
| /* ========== */ | |||||
| /* > \param[in] N */ | |||||
| /* > \verbatim */ | |||||
| /* > N is INTEGER */ | |||||
| /* > The order of the matrix L D L**T. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] B1 */ | |||||
| /* > \verbatim */ | |||||
| /* > B1 is INTEGER */ | |||||
| /* > First index of the submatrix of L D L**T. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] BN */ | |||||
| /* > \verbatim */ | |||||
| /* > BN is INTEGER */ | |||||
| /* > Last index of the submatrix of L D L**T. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] LAMBDA */ | |||||
| /* > \verbatim */ | |||||
| /* > LAMBDA is REAL */ | |||||
| /* > The shift. In order to compute an accurate eigenvector, */ | |||||
| /* > LAMBDA should be a good approximation to an eigenvalue */ | |||||
| /* > of L D L**T. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] L */ | |||||
| /* > \verbatim */ | |||||
| /* > L is REAL array, dimension (N-1) */ | |||||
| /* > The (n-1) subdiagonal elements of the unit bidiagonal matrix */ | |||||
| /* > L, in elements 1 to N-1. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] D */ | |||||
| /* > \verbatim */ | |||||
| /* > D is REAL array, dimension (N) */ | |||||
| /* > The n diagonal elements of the diagonal matrix D. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] LD */ | |||||
| /* > \verbatim */ | |||||
| /* > LD is REAL array, dimension (N-1) */ | |||||
| /* > The n-1 elements L(i)*D(i). */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] LLD */ | |||||
| /* > \verbatim */ | |||||
| /* > LLD is REAL array, dimension (N-1) */ | |||||
| /* > The n-1 elements L(i)*L(i)*D(i). */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] PIVMIN */ | |||||
| /* > \verbatim */ | |||||
| /* > PIVMIN is REAL */ | |||||
| /* > The minimum pivot in the Sturm sequence. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] GAPTOL */ | |||||
| /* > \verbatim */ | |||||
| /* > GAPTOL is REAL */ | |||||
| /* > Tolerance that indicates when eigenvector entries are negligible */ | |||||
| /* > w.r.t. their contribution to the residual. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in,out] Z */ | |||||
| /* > \verbatim */ | |||||
| /* > Z is COMPLEX array, dimension (N) */ | |||||
| /* > On input, all entries of Z must be set to 0. */ | |||||
| /* > On output, Z contains the (scaled) r-th column of the */ | |||||
| /* > inverse. The scaling is such that Z(R) equals 1. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] WANTNC */ | |||||
| /* > \verbatim */ | |||||
| /* > WANTNC is LOGICAL */ | |||||
| /* > Specifies whether NEGCNT has to be computed. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] NEGCNT */ | |||||
| /* > \verbatim */ | |||||
| /* > NEGCNT is INTEGER */ | |||||
| /* > If WANTNC is .TRUE. then NEGCNT = the number of pivots < pivmin */ | |||||
| /* > in the matrix factorization L D L**T, and NEGCNT = -1 otherwise. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] ZTZ */ | |||||
| /* > \verbatim */ | |||||
| /* > ZTZ is REAL */ | |||||
| /* > The square of the 2-norm of Z. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] MINGMA */ | |||||
| /* > \verbatim */ | |||||
| /* > MINGMA is REAL */ | |||||
| /* > The reciprocal of the largest (in magnitude) diagonal */ | |||||
| /* > element of the inverse of L D L**T - sigma I. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in,out] R */ | |||||
| /* > \verbatim */ | |||||
| /* > R is INTEGER */ | |||||
| /* > The twist index for the twisted factorization used to */ | |||||
| /* > compute Z. */ | |||||
| /* > On input, 0 <= R <= N. If R is input as 0, R is set to */ | |||||
| /* > the index where (L D L**T - sigma I)^{-1} is largest */ | |||||
| /* > in magnitude. If 1 <= R <= N, R is unchanged. */ | |||||
| /* > On output, R contains the twist index used to compute Z. */ | |||||
| /* > Ideally, R designates the position of the maximum entry in the */ | |||||
| /* > eigenvector. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] ISUPPZ */ | |||||
| /* > \verbatim */ | |||||
| /* > ISUPPZ is INTEGER array, dimension (2) */ | |||||
| /* > The support of the vector in Z, i.e., the vector Z is */ | |||||
| /* > nonzero only in elements ISUPPZ(1) through ISUPPZ( 2 ). */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] NRMINV */ | |||||
| /* > \verbatim */ | |||||
| /* > NRMINV is REAL */ | |||||
| /* > NRMINV = 1/SQRT( ZTZ ) */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] RESID */ | |||||
| /* > \verbatim */ | |||||
| /* > RESID is REAL */ | |||||
| /* > The residual of the FP vector. */ | |||||
| /* > RESID = ABS( MINGMA )/SQRT( ZTZ ) */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] RQCORR */ | |||||
| /* > \verbatim */ | |||||
| /* > RQCORR is REAL */ | |||||
| /* > The Rayleigh Quotient correction to LAMBDA. */ | |||||
| /* > RQCORR = MINGMA*TMP */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] WORK */ | |||||
| /* > \verbatim */ | |||||
| /* > WORK is REAL array, dimension (4*N) */ | |||||
| /* > \endverbatim */ | |||||
| /* Authors: */ | |||||
| /* ======== */ | |||||
| /* > \author Univ. of Tennessee */ | |||||
| /* > \author Univ. of California Berkeley */ | |||||
| /* > \author Univ. of Colorado Denver */ | |||||
| /* > \author NAG Ltd. */ | |||||
| /* > \date December 2016 */ | |||||
| /* > \ingroup complexOTHERauxiliary */ | |||||
| /* > \par Contributors: */ | |||||
| /* ================== */ | |||||
| /* > */ | |||||
| /* > Beresford Parlett, University of California, Berkeley, USA \n */ | |||||
| /* > Jim Demmel, University of California, Berkeley, USA \n */ | |||||
| /* > Inderjit Dhillon, University of Texas, Austin, USA \n */ | |||||
| /* > Osni Marques, LBNL/NERSC, USA \n */ | |||||
| /* > Christof Voemel, University of California, Berkeley, USA */ | |||||
| /* ===================================================================== */ | |||||
| /* Subroutine */ int clar1v_(integer *n, integer *b1, integer *bn, real * | |||||
| lambda, real *d__, real *l, real *ld, real *lld, real *pivmin, real * | |||||
| gaptol, complex *z__, logical *wantnc, integer *negcnt, real *ztz, | |||||
| real *mingma, integer *r__, integer *isuppz, real *nrminv, real * | |||||
| resid, real *rqcorr, real *work) | |||||
| { | |||||
| /* System generated locals */ | |||||
| integer i__1, i__2, i__3, i__4; | |||||
| real r__1; | |||||
| complex q__1, q__2; | |||||
| /* Local variables */ | |||||
| integer indp, inds, i__; | |||||
| real s, dplus; | |||||
| integer r1, r2; | |||||
| extern real slamch_(char *); | |||||
| integer indlpl, indumn; | |||||
| extern logical sisnan_(real *); | |||||
| real dminus; | |||||
| logical sawnan1, sawnan2; | |||||
| real eps, tmp; | |||||
| integer neg1, neg2; | |||||
| /* -- LAPACK auxiliary routine (version 3.7.0) -- */ | |||||
| /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ | |||||
| /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ | |||||
| /* December 2016 */ | |||||
| /* ===================================================================== */ | |||||
| /* Parameter adjustments */ | |||||
| --work; | |||||
| --isuppz; | |||||
| --z__; | |||||
| --lld; | |||||
| --ld; | |||||
| --l; | |||||
| --d__; | |||||
| /* Function Body */ | |||||
| eps = slamch_("Precision"); | |||||
| if (*r__ == 0) { | |||||
| r1 = *b1; | |||||
| r2 = *bn; | |||||
| } else { | |||||
| r1 = *r__; | |||||
| r2 = *r__; | |||||
| } | |||||
| /* Storage for LPLUS */ | |||||
| indlpl = 0; | |||||
| /* Storage for UMINUS */ | |||||
| indumn = *n; | |||||
| inds = (*n << 1) + 1; | |||||
| indp = *n * 3 + 1; | |||||
| if (*b1 == 1) { | |||||
| work[inds] = 0.f; | |||||
| } else { | |||||
| work[inds + *b1 - 1] = lld[*b1 - 1]; | |||||
| } | |||||
| /* Compute the stationary transform (using the differential form) */ | |||||
| /* until the index R2. */ | |||||
| sawnan1 = FALSE_; | |||||
| neg1 = 0; | |||||
| s = work[inds + *b1 - 1] - *lambda; | |||||
| i__1 = r1 - 1; | |||||
| for (i__ = *b1; i__ <= i__1; ++i__) { | |||||
| dplus = d__[i__] + s; | |||||
| work[indlpl + i__] = ld[i__] / dplus; | |||||
| if (dplus < 0.f) { | |||||
| ++neg1; | |||||
| } | |||||
| work[inds + i__] = s * work[indlpl + i__] * l[i__]; | |||||
| s = work[inds + i__] - *lambda; | |||||
| /* L50: */ | |||||
| } | |||||
| sawnan1 = sisnan_(&s); | |||||
| if (sawnan1) { | |||||
| goto L60; | |||||
| } | |||||
| i__1 = r2 - 1; | |||||
| for (i__ = r1; i__ <= i__1; ++i__) { | |||||
| dplus = d__[i__] + s; | |||||
| work[indlpl + i__] = ld[i__] / dplus; | |||||
| work[inds + i__] = s * work[indlpl + i__] * l[i__]; | |||||
| s = work[inds + i__] - *lambda; | |||||
| /* L51: */ | |||||
| } | |||||
| sawnan1 = sisnan_(&s); | |||||
| L60: | |||||
| if (sawnan1) { | |||||
| /* Runs a slower version of the above loop if a NaN is detected */ | |||||
| neg1 = 0; | |||||
| s = work[inds + *b1 - 1] - *lambda; | |||||
| i__1 = r1 - 1; | |||||
| for (i__ = *b1; i__ <= i__1; ++i__) { | |||||
| dplus = d__[i__] + s; | |||||
| if (abs(dplus) < *pivmin) { | |||||
| dplus = -(*pivmin); | |||||
| } | |||||
| work[indlpl + i__] = ld[i__] / dplus; | |||||
| if (dplus < 0.f) { | |||||
| ++neg1; | |||||
| } | |||||
| work[inds + i__] = s * work[indlpl + i__] * l[i__]; | |||||
| if (work[indlpl + i__] == 0.f) { | |||||
| work[inds + i__] = lld[i__]; | |||||
| } | |||||
| s = work[inds + i__] - *lambda; | |||||
| /* L70: */ | |||||
| } | |||||
| i__1 = r2 - 1; | |||||
| for (i__ = r1; i__ <= i__1; ++i__) { | |||||
| dplus = d__[i__] + s; | |||||
| if (abs(dplus) < *pivmin) { | |||||
| dplus = -(*pivmin); | |||||
| } | |||||
| work[indlpl + i__] = ld[i__] / dplus; | |||||
| work[inds + i__] = s * work[indlpl + i__] * l[i__]; | |||||
| if (work[indlpl + i__] == 0.f) { | |||||
| work[inds + i__] = lld[i__]; | |||||
| } | |||||
| s = work[inds + i__] - *lambda; | |||||
| /* L71: */ | |||||
| } | |||||
| } | |||||
| /* Compute the progressive transform (using the differential form) */ | |||||
| /* until the index R1 */ | |||||
| sawnan2 = FALSE_; | |||||
| neg2 = 0; | |||||
| work[indp + *bn - 1] = d__[*bn] - *lambda; | |||||
| i__1 = r1; | |||||
| for (i__ = *bn - 1; i__ >= i__1; --i__) { | |||||
| dminus = lld[i__] + work[indp + i__]; | |||||
| tmp = d__[i__] / dminus; | |||||
| if (dminus < 0.f) { | |||||
| ++neg2; | |||||
| } | |||||
| work[indumn + i__] = l[i__] * tmp; | |||||
| work[indp + i__ - 1] = work[indp + i__] * tmp - *lambda; | |||||
| /* L80: */ | |||||
| } | |||||
| tmp = work[indp + r1 - 1]; | |||||
| sawnan2 = sisnan_(&tmp); | |||||
| if (sawnan2) { | |||||
| /* Runs a slower version of the above loop if a NaN is detected */ | |||||
| neg2 = 0; | |||||
| i__1 = r1; | |||||
| for (i__ = *bn - 1; i__ >= i__1; --i__) { | |||||
| dminus = lld[i__] + work[indp + i__]; | |||||
| if (abs(dminus) < *pivmin) { | |||||
| dminus = -(*pivmin); | |||||
| } | |||||
| tmp = d__[i__] / dminus; | |||||
| if (dminus < 0.f) { | |||||
| ++neg2; | |||||
| } | |||||
| work[indumn + i__] = l[i__] * tmp; | |||||
| work[indp + i__ - 1] = work[indp + i__] * tmp - *lambda; | |||||
| if (tmp == 0.f) { | |||||
| work[indp + i__ - 1] = d__[i__] - *lambda; | |||||
| } | |||||
| /* L100: */ | |||||
| } | |||||
| } | |||||
| /* Find the index (from R1 to R2) of the largest (in magnitude) */ | |||||
| /* diagonal element of the inverse */ | |||||
| *mingma = work[inds + r1 - 1] + work[indp + r1 - 1]; | |||||
| if (*mingma < 0.f) { | |||||
| ++neg1; | |||||
| } | |||||
| if (*wantnc) { | |||||
| *negcnt = neg1 + neg2; | |||||
| } else { | |||||
| *negcnt = -1; | |||||
| } | |||||
| if (abs(*mingma) == 0.f) { | |||||
| *mingma = eps * work[inds + r1 - 1]; | |||||
| } | |||||
| *r__ = r1; | |||||
| i__1 = r2 - 1; | |||||
| for (i__ = r1; i__ <= i__1; ++i__) { | |||||
| tmp = work[inds + i__] + work[indp + i__]; | |||||
| if (tmp == 0.f) { | |||||
| tmp = eps * work[inds + i__]; | |||||
| } | |||||
| if (abs(tmp) <= abs(*mingma)) { | |||||
| *mingma = tmp; | |||||
| *r__ = i__ + 1; | |||||
| } | |||||
| /* L110: */ | |||||
| } | |||||
| /* Compute the FP vector: solve N^T v = e_r */ | |||||
| isuppz[1] = *b1; | |||||
| isuppz[2] = *bn; | |||||
| i__1 = *r__; | |||||
| z__[i__1].r = 1.f, z__[i__1].i = 0.f; | |||||
| *ztz = 1.f; | |||||
| /* Compute the FP vector upwards from R */ | |||||
| if (! sawnan1 && ! sawnan2) { | |||||
| i__1 = *b1; | |||||
| for (i__ = *r__ - 1; i__ >= i__1; --i__) { | |||||
| i__2 = i__; | |||||
| i__3 = indlpl + i__; | |||||
| i__4 = i__ + 1; | |||||
| q__2.r = work[i__3] * z__[i__4].r, q__2.i = work[i__3] * z__[i__4] | |||||
| .i; | |||||
| q__1.r = -q__2.r, q__1.i = -q__2.i; | |||||
| z__[i__2].r = q__1.r, z__[i__2].i = q__1.i; | |||||
| if ((c_abs(&z__[i__]) + c_abs(&z__[i__ + 1])) * (r__1 = ld[i__], | |||||
| abs(r__1)) < *gaptol) { | |||||
| i__2 = i__; | |||||
| z__[i__2].r = 0.f, z__[i__2].i = 0.f; | |||||
| isuppz[1] = i__ + 1; | |||||
| goto L220; | |||||
| } | |||||
| i__2 = i__; | |||||
| i__3 = i__; | |||||
| q__1.r = z__[i__2].r * z__[i__3].r - z__[i__2].i * z__[i__3].i, | |||||
| q__1.i = z__[i__2].r * z__[i__3].i + z__[i__2].i * z__[ | |||||
| i__3].r; | |||||
| *ztz += q__1.r; | |||||
| /* L210: */ | |||||
| } | |||||
| L220: | |||||
| ; | |||||
| } else { | |||||
| /* Run slower loop if NaN occurred. */ | |||||
| i__1 = *b1; | |||||
| for (i__ = *r__ - 1; i__ >= i__1; --i__) { | |||||
| i__2 = i__ + 1; | |||||
| if (z__[i__2].r == 0.f && z__[i__2].i == 0.f) { | |||||
| i__2 = i__; | |||||
| r__1 = -(ld[i__ + 1] / ld[i__]); | |||||
| i__3 = i__ + 2; | |||||
| q__1.r = r__1 * z__[i__3].r, q__1.i = r__1 * z__[i__3].i; | |||||
| z__[i__2].r = q__1.r, z__[i__2].i = q__1.i; | |||||
| } else { | |||||
| i__2 = i__; | |||||
| i__3 = indlpl + i__; | |||||
| i__4 = i__ + 1; | |||||
| q__2.r = work[i__3] * z__[i__4].r, q__2.i = work[i__3] * z__[ | |||||
| i__4].i; | |||||
| q__1.r = -q__2.r, q__1.i = -q__2.i; | |||||
| z__[i__2].r = q__1.r, z__[i__2].i = q__1.i; | |||||
| } | |||||
| if ((c_abs(&z__[i__]) + c_abs(&z__[i__ + 1])) * (r__1 = ld[i__], | |||||
| abs(r__1)) < *gaptol) { | |||||
| i__2 = i__; | |||||
| z__[i__2].r = 0.f, z__[i__2].i = 0.f; | |||||
| isuppz[1] = i__ + 1; | |||||
| goto L240; | |||||
| } | |||||
| i__2 = i__; | |||||
| i__3 = i__; | |||||
| q__1.r = z__[i__2].r * z__[i__3].r - z__[i__2].i * z__[i__3].i, | |||||
| q__1.i = z__[i__2].r * z__[i__3].i + z__[i__2].i * z__[ | |||||
| i__3].r; | |||||
| *ztz += q__1.r; | |||||
| /* L230: */ | |||||
| } | |||||
| L240: | |||||
| ; | |||||
| } | |||||
| /* Compute the FP vector downwards from R in blocks of size BLKSIZ */ | |||||
| if (! sawnan1 && ! sawnan2) { | |||||
| i__1 = *bn - 1; | |||||
| for (i__ = *r__; i__ <= i__1; ++i__) { | |||||
| i__2 = i__ + 1; | |||||
| i__3 = indumn + i__; | |||||
| i__4 = i__; | |||||
| q__2.r = work[i__3] * z__[i__4].r, q__2.i = work[i__3] * z__[i__4] | |||||
| .i; | |||||
| q__1.r = -q__2.r, q__1.i = -q__2.i; | |||||
| z__[i__2].r = q__1.r, z__[i__2].i = q__1.i; | |||||
| if ((c_abs(&z__[i__]) + c_abs(&z__[i__ + 1])) * (r__1 = ld[i__], | |||||
| abs(r__1)) < *gaptol) { | |||||
| i__2 = i__ + 1; | |||||
| z__[i__2].r = 0.f, z__[i__2].i = 0.f; | |||||
| isuppz[2] = i__; | |||||
| goto L260; | |||||
| } | |||||
| i__2 = i__ + 1; | |||||
| i__3 = i__ + 1; | |||||
| q__1.r = z__[i__2].r * z__[i__3].r - z__[i__2].i * z__[i__3].i, | |||||
| q__1.i = z__[i__2].r * z__[i__3].i + z__[i__2].i * z__[ | |||||
| i__3].r; | |||||
| *ztz += q__1.r; | |||||
| /* L250: */ | |||||
| } | |||||
| L260: | |||||
| ; | |||||
| } else { | |||||
| /* Run slower loop if NaN occurred. */ | |||||
| i__1 = *bn - 1; | |||||
| for (i__ = *r__; i__ <= i__1; ++i__) { | |||||
| i__2 = i__; | |||||
| if (z__[i__2].r == 0.f && z__[i__2].i == 0.f) { | |||||
| i__2 = i__ + 1; | |||||
| r__1 = -(ld[i__ - 1] / ld[i__]); | |||||
| i__3 = i__ - 1; | |||||
| q__1.r = r__1 * z__[i__3].r, q__1.i = r__1 * z__[i__3].i; | |||||
| z__[i__2].r = q__1.r, z__[i__2].i = q__1.i; | |||||
| } else { | |||||
| i__2 = i__ + 1; | |||||
| i__3 = indumn + i__; | |||||
| i__4 = i__; | |||||
| q__2.r = work[i__3] * z__[i__4].r, q__2.i = work[i__3] * z__[ | |||||
| i__4].i; | |||||
| q__1.r = -q__2.r, q__1.i = -q__2.i; | |||||
| z__[i__2].r = q__1.r, z__[i__2].i = q__1.i; | |||||
| } | |||||
| if ((c_abs(&z__[i__]) + c_abs(&z__[i__ + 1])) * (r__1 = ld[i__], | |||||
| abs(r__1)) < *gaptol) { | |||||
| i__2 = i__ + 1; | |||||
| z__[i__2].r = 0.f, z__[i__2].i = 0.f; | |||||
| isuppz[2] = i__; | |||||
| goto L280; | |||||
| } | |||||
| i__2 = i__ + 1; | |||||
| i__3 = i__ + 1; | |||||
| q__1.r = z__[i__2].r * z__[i__3].r - z__[i__2].i * z__[i__3].i, | |||||
| q__1.i = z__[i__2].r * z__[i__3].i + z__[i__2].i * z__[ | |||||
| i__3].r; | |||||
| *ztz += q__1.r; | |||||
| /* L270: */ | |||||
| } | |||||
| L280: | |||||
| ; | |||||
| } | |||||
| /* Compute quantities for convergence test */ | |||||
| tmp = 1.f / *ztz; | |||||
| *nrminv = sqrt(tmp); | |||||
| *resid = abs(*mingma) * *nrminv; | |||||
| *rqcorr = *mingma * tmp; | |||||
| return 0; | |||||
| /* End of CLAR1V */ | |||||
| } /* clar1v_ */ | |||||
| @@ -0,0 +1,592 @@ | |||||
| /* f2c.h -- Standard Fortran to C header file */ | |||||
| /** barf [ba:rf] 2. "He suggested using FORTRAN, and everybody barfed." | |||||
| - From The Shogakukan DICTIONARY OF NEW ENGLISH (Second edition) */ | |||||
| #ifndef F2C_INCLUDE | |||||
| #define F2C_INCLUDE | |||||
| #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 | |||||
| typedef int 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; | |||||
| 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;} | |||||
| #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)); } | |||||
| #define c_div(c, a, b) {pCf(c) = Cf(a)/Cf(b);} | |||||
| #define z_div(c, a, b) {pCd(c) = Cd(a)/Cd(b);} | |||||
| #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) = conj(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) (cimag(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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotc_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void cdotu_(complex *z, integer *n_, complex *x, integer *incx_, complex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotu_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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) | |||||
| */ | |||||
| /* > \brief \b CLAR2V applies a vector of plane rotations with real cosines and complex sines from both sides | |||||
| to a sequence of 2-by-2 symmetric/Hermitian matrices. */ | |||||
| /* =========== DOCUMENTATION =========== */ | |||||
| /* Online html documentation available at */ | |||||
| /* http://www.netlib.org/lapack/explore-html/ */ | |||||
| /* > \htmlonly */ | |||||
| /* > Download CLAR2V + dependencies */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/clar2v. | |||||
| f"> */ | |||||
| /* > [TGZ]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/clar2v. | |||||
| f"> */ | |||||
| /* > [ZIP]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/clar2v. | |||||
| f"> */ | |||||
| /* > [TXT]</a> */ | |||||
| /* > \endhtmlonly */ | |||||
| /* Definition: */ | |||||
| /* =========== */ | |||||
| /* SUBROUTINE CLAR2V( N, X, Y, Z, INCX, C, S, INCC ) */ | |||||
| /* INTEGER INCC, INCX, N */ | |||||
| /* REAL C( * ) */ | |||||
| /* COMPLEX S( * ), X( * ), Y( * ), Z( * ) */ | |||||
| /* > \par Purpose: */ | |||||
| /* ============= */ | |||||
| /* > */ | |||||
| /* > \verbatim */ | |||||
| /* > */ | |||||
| /* > CLAR2V applies a vector of complex plane rotations with real cosines */ | |||||
| /* > from both sides to a sequence of 2-by-2 complex Hermitian matrices, */ | |||||
| /* > defined by the elements of the vectors x, y and z. For i = 1,2,...,n */ | |||||
| /* > */ | |||||
| /* > ( x(i) z(i) ) := */ | |||||
| /* > ( conjg(z(i)) y(i) ) */ | |||||
| /* > */ | |||||
| /* > ( c(i) conjg(s(i)) ) ( x(i) z(i) ) ( c(i) -conjg(s(i)) ) */ | |||||
| /* > ( -s(i) c(i) ) ( conjg(z(i)) y(i) ) ( s(i) c(i) ) */ | |||||
| /* > \endverbatim */ | |||||
| /* Arguments: */ | |||||
| /* ========== */ | |||||
| /* > \param[in] N */ | |||||
| /* > \verbatim */ | |||||
| /* > N is INTEGER */ | |||||
| /* > The number of plane rotations to be applied. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in,out] X */ | |||||
| /* > \verbatim */ | |||||
| /* > X is COMPLEX array, dimension (1+(N-1)*INCX) */ | |||||
| /* > The vector x; the elements of x are assumed to be real. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in,out] Y */ | |||||
| /* > \verbatim */ | |||||
| /* > Y is COMPLEX array, dimension (1+(N-1)*INCX) */ | |||||
| /* > The vector y; the elements of y are assumed to be real. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in,out] Z */ | |||||
| /* > \verbatim */ | |||||
| /* > Z is COMPLEX array, dimension (1+(N-1)*INCX) */ | |||||
| /* > The vector z. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] INCX */ | |||||
| /* > \verbatim */ | |||||
| /* > INCX is INTEGER */ | |||||
| /* > The increment between elements of X, Y and Z. INCX > 0. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] C */ | |||||
| /* > \verbatim */ | |||||
| /* > C is REAL array, dimension (1+(N-1)*INCC) */ | |||||
| /* > The cosines of the plane rotations. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] S */ | |||||
| /* > \verbatim */ | |||||
| /* > S is COMPLEX array, dimension (1+(N-1)*INCC) */ | |||||
| /* > The sines of the plane rotations. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] INCC */ | |||||
| /* > \verbatim */ | |||||
| /* > INCC is INTEGER */ | |||||
| /* > The increment between elements of C and S. INCC > 0. */ | |||||
| /* > \endverbatim */ | |||||
| /* Authors: */ | |||||
| /* ======== */ | |||||
| /* > \author Univ. of Tennessee */ | |||||
| /* > \author Univ. of California Berkeley */ | |||||
| /* > \author Univ. of Colorado Denver */ | |||||
| /* > \author NAG Ltd. */ | |||||
| /* > \date December 2016 */ | |||||
| /* > \ingroup complexOTHERauxiliary */ | |||||
| /* ===================================================================== */ | |||||
| /* Subroutine */ int clar2v_(integer *n, complex *x, complex *y, complex *z__, | |||||
| integer *incx, real *c__, complex *s, integer *incc) | |||||
| { | |||||
| /* System generated locals */ | |||||
| integer i__1, i__2; | |||||
| real r__1; | |||||
| complex q__1, q__2, q__3, q__4, q__5; | |||||
| /* Local variables */ | |||||
| integer i__; | |||||
| complex t2, t3, t4; | |||||
| real t5, t6; | |||||
| integer ic; | |||||
| real ci; | |||||
| complex si; | |||||
| integer ix; | |||||
| real xi, yi; | |||||
| complex zi; | |||||
| real t1i, t1r, sii, zii, sir, zir; | |||||
| /* -- LAPACK auxiliary routine (version 3.7.0) -- */ | |||||
| /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ | |||||
| /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ | |||||
| /* December 2016 */ | |||||
| /* ===================================================================== */ | |||||
| /* Parameter adjustments */ | |||||
| --s; | |||||
| --c__; | |||||
| --z__; | |||||
| --y; | |||||
| --x; | |||||
| /* Function Body */ | |||||
| ix = 1; | |||||
| ic = 1; | |||||
| i__1 = *n; | |||||
| for (i__ = 1; i__ <= i__1; ++i__) { | |||||
| i__2 = ix; | |||||
| xi = x[i__2].r; | |||||
| i__2 = ix; | |||||
| yi = y[i__2].r; | |||||
| i__2 = ix; | |||||
| zi.r = z__[i__2].r, zi.i = z__[i__2].i; | |||||
| zir = zi.r; | |||||
| zii = r_imag(&zi); | |||||
| ci = c__[ic]; | |||||
| i__2 = ic; | |||||
| si.r = s[i__2].r, si.i = s[i__2].i; | |||||
| sir = si.r; | |||||
| sii = r_imag(&si); | |||||
| t1r = sir * zir - sii * zii; | |||||
| t1i = sir * zii + sii * zir; | |||||
| q__1.r = ci * zi.r, q__1.i = ci * zi.i; | |||||
| t2.r = q__1.r, t2.i = q__1.i; | |||||
| r_cnjg(&q__3, &si); | |||||
| q__2.r = xi * q__3.r, q__2.i = xi * q__3.i; | |||||
| q__1.r = t2.r - q__2.r, q__1.i = t2.i - q__2.i; | |||||
| t3.r = q__1.r, t3.i = q__1.i; | |||||
| r_cnjg(&q__2, &t2); | |||||
| q__3.r = yi * si.r, q__3.i = yi * si.i; | |||||
| q__1.r = q__2.r + q__3.r, q__1.i = q__2.i + q__3.i; | |||||
| t4.r = q__1.r, t4.i = q__1.i; | |||||
| t5 = ci * xi + t1r; | |||||
| t6 = ci * yi - t1r; | |||||
| i__2 = ix; | |||||
| r__1 = ci * t5 + (sir * t4.r + sii * r_imag(&t4)); | |||||
| x[i__2].r = r__1, x[i__2].i = 0.f; | |||||
| i__2 = ix; | |||||
| r__1 = ci * t6 - (sir * t3.r - sii * r_imag(&t3)); | |||||
| y[i__2].r = r__1, y[i__2].i = 0.f; | |||||
| i__2 = ix; | |||||
| q__2.r = ci * t3.r, q__2.i = ci * t3.i; | |||||
| r_cnjg(&q__4, &si); | |||||
| q__5.r = t6, q__5.i = t1i; | |||||
| q__3.r = q__4.r * q__5.r - q__4.i * q__5.i, q__3.i = q__4.r * q__5.i | |||||
| + q__4.i * q__5.r; | |||||
| q__1.r = q__2.r + q__3.r, q__1.i = q__2.i + q__3.i; | |||||
| z__[i__2].r = q__1.r, z__[i__2].i = q__1.i; | |||||
| ix += *incx; | |||||
| ic += *incc; | |||||
| /* L10: */ | |||||
| } | |||||
| return 0; | |||||
| /* End of CLAR2V */ | |||||
| } /* clar2v_ */ | |||||
| @@ -0,0 +1,608 @@ | |||||
| /* f2c.h -- Standard Fortran to C header file */ | |||||
| /** barf [ba:rf] 2. "He suggested using FORTRAN, and everybody barfed." | |||||
| - From The Shogakukan DICTIONARY OF NEW ENGLISH (Second edition) */ | |||||
| #ifndef F2C_INCLUDE | |||||
| #define F2C_INCLUDE | |||||
| #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 | |||||
| typedef int 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; | |||||
| 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;} | |||||
| #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)); } | |||||
| #define c_div(c, a, b) {pCf(c) = Cf(a)/Cf(b);} | |||||
| #define z_div(c, a, b) {pCd(c) = Cd(a)/Cd(b);} | |||||
| #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) = conj(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) (cimag(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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotc_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void cdotu_(complex *z, integer *n_, complex *x, integer *incx_, complex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotu_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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) | |||||
| */ | |||||
| /* Table of constant values */ | |||||
| static real c_b6 = 1.f; | |||||
| static real c_b7 = 0.f; | |||||
| /* > \brief \b CLARCM copies all or part of a real two-dimensional array to a complex array. */ | |||||
| /* =========== DOCUMENTATION =========== */ | |||||
| /* Online html documentation available at */ | |||||
| /* http://www.netlib.org/lapack/explore-html/ */ | |||||
| /* > \htmlonly */ | |||||
| /* > Download CLARCM + dependencies */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/clarcm. | |||||
| f"> */ | |||||
| /* > [TGZ]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/clarcm. | |||||
| f"> */ | |||||
| /* > [ZIP]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/clarcm. | |||||
| f"> */ | |||||
| /* > [TXT]</a> */ | |||||
| /* > \endhtmlonly */ | |||||
| /* Definition: */ | |||||
| /* =========== */ | |||||
| /* SUBROUTINE CLARCM( M, N, A, LDA, B, LDB, C, LDC, RWORK ) */ | |||||
| /* INTEGER LDA, LDB, LDC, M, N */ | |||||
| /* REAL A( LDA, * ), RWORK( * ) */ | |||||
| /* COMPLEX B( LDB, * ), C( LDC, * ) */ | |||||
| /* > \par Purpose: */ | |||||
| /* ============= */ | |||||
| /* > */ | |||||
| /* > \verbatim */ | |||||
| /* > */ | |||||
| /* > CLARCM performs a very simple matrix-matrix multiplication: */ | |||||
| /* > C := A * B, */ | |||||
| /* > where A is M by M and real; B is M by N and complex; */ | |||||
| /* > C is M by N and complex. */ | |||||
| /* > \endverbatim */ | |||||
| /* Arguments: */ | |||||
| /* ========== */ | |||||
| /* > \param[in] M */ | |||||
| /* > \verbatim */ | |||||
| /* > M is INTEGER */ | |||||
| /* > The number of rows of the matrix A and of the matrix C. */ | |||||
| /* > M >= 0. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] N */ | |||||
| /* > \verbatim */ | |||||
| /* > N is INTEGER */ | |||||
| /* > The number of columns and rows of the matrix B and */ | |||||
| /* > the number of columns of the matrix C. */ | |||||
| /* > N >= 0. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] A */ | |||||
| /* > \verbatim */ | |||||
| /* > A is REAL array, dimension (LDA, M) */ | |||||
| /* > On entry, A contains the M by M matrix A. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] LDA */ | |||||
| /* > \verbatim */ | |||||
| /* > LDA is INTEGER */ | |||||
| /* > The leading dimension of the array A. LDA >=f2cmax(1,M). */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] B */ | |||||
| /* > \verbatim */ | |||||
| /* > B is COMPLEX array, dimension (LDB, N) */ | |||||
| /* > On entry, B contains the M by N matrix B. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] LDB */ | |||||
| /* > \verbatim */ | |||||
| /* > LDB is INTEGER */ | |||||
| /* > The leading dimension of the array B. LDB >=f2cmax(1,M). */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] C */ | |||||
| /* > \verbatim */ | |||||
| /* > C is COMPLEX array, dimension (LDC, N) */ | |||||
| /* > On exit, C contains the M by N matrix C. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] LDC */ | |||||
| /* > \verbatim */ | |||||
| /* > LDC is INTEGER */ | |||||
| /* > The leading dimension of the array C. LDC >=f2cmax(1,M). */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] RWORK */ | |||||
| /* > \verbatim */ | |||||
| /* > RWORK is REAL array, dimension (2*M*N) */ | |||||
| /* > \endverbatim */ | |||||
| /* Authors: */ | |||||
| /* ======== */ | |||||
| /* > \author Univ. of Tennessee */ | |||||
| /* > \author Univ. of California Berkeley */ | |||||
| /* > \author Univ. of Colorado Denver */ | |||||
| /* > \author NAG Ltd. */ | |||||
| /* > \date June 2016 */ | |||||
| /* > \ingroup complexOTHERauxiliary */ | |||||
| /* ===================================================================== */ | |||||
| /* Subroutine */ int clarcm_(integer *m, integer *n, real *a, integer *lda, | |||||
| complex *b, integer *ldb, complex *c__, integer *ldc, real *rwork) | |||||
| { | |||||
| /* System generated locals */ | |||||
| integer a_dim1, a_offset, b_dim1, b_offset, c_dim1, c_offset, i__1, i__2, | |||||
| i__3, i__4, i__5; | |||||
| real r__1; | |||||
| complex q__1; | |||||
| /* Local variables */ | |||||
| integer i__, j, l; | |||||
| extern /* Subroutine */ int sgemm_(char *, char *, integer *, integer *, | |||||
| integer *, real *, real *, integer *, real *, integer *, real *, | |||||
| real *, integer *); | |||||
| /* -- LAPACK auxiliary routine (version 3.7.0) -- */ | |||||
| /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ | |||||
| /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ | |||||
| /* June 2016 */ | |||||
| /* ===================================================================== */ | |||||
| /* Quick return if possible. */ | |||||
| /* Parameter adjustments */ | |||||
| a_dim1 = *lda; | |||||
| a_offset = 1 + a_dim1 * 1; | |||||
| a -= a_offset; | |||||
| b_dim1 = *ldb; | |||||
| b_offset = 1 + b_dim1 * 1; | |||||
| b -= b_offset; | |||||
| c_dim1 = *ldc; | |||||
| c_offset = 1 + c_dim1 * 1; | |||||
| c__ -= c_offset; | |||||
| --rwork; | |||||
| /* Function Body */ | |||||
| if (*m == 0 || *n == 0) { | |||||
| return 0; | |||||
| } | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| i__2 = *m; | |||||
| for (i__ = 1; i__ <= i__2; ++i__) { | |||||
| i__3 = i__ + j * b_dim1; | |||||
| rwork[(j - 1) * *m + i__] = b[i__3].r; | |||||
| /* L10: */ | |||||
| } | |||||
| /* L20: */ | |||||
| } | |||||
| l = *m * *n + 1; | |||||
| sgemm_("N", "N", m, n, m, &c_b6, &a[a_offset], lda, &rwork[1], m, &c_b7, & | |||||
| rwork[l], m); | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| i__2 = *m; | |||||
| for (i__ = 1; i__ <= i__2; ++i__) { | |||||
| i__3 = i__ + j * c_dim1; | |||||
| i__4 = l + (j - 1) * *m + i__ - 1; | |||||
| c__[i__3].r = rwork[i__4], c__[i__3].i = 0.f; | |||||
| /* L30: */ | |||||
| } | |||||
| /* L40: */ | |||||
| } | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| i__2 = *m; | |||||
| for (i__ = 1; i__ <= i__2; ++i__) { | |||||
| rwork[(j - 1) * *m + i__] = r_imag(&b[i__ + j * b_dim1]); | |||||
| /* L50: */ | |||||
| } | |||||
| /* L60: */ | |||||
| } | |||||
| sgemm_("N", "N", m, n, m, &c_b6, &a[a_offset], lda, &rwork[1], m, &c_b7, & | |||||
| rwork[l], m); | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| i__2 = *m; | |||||
| for (i__ = 1; i__ <= i__2; ++i__) { | |||||
| i__3 = i__ + j * c_dim1; | |||||
| i__4 = i__ + j * c_dim1; | |||||
| r__1 = c__[i__4].r; | |||||
| i__5 = l + (j - 1) * *m + i__ - 1; | |||||
| q__1.r = r__1, q__1.i = rwork[i__5]; | |||||
| c__[i__3].r = q__1.r, c__[i__3].i = q__1.i; | |||||
| /* L70: */ | |||||
| } | |||||
| /* L80: */ | |||||
| } | |||||
| return 0; | |||||
| /* End of CLARCM */ | |||||
| } /* clarcm_ */ | |||||
| @@ -0,0 +1,634 @@ | |||||
| /* f2c.h -- Standard Fortran to C header file */ | |||||
| /** barf [ba:rf] 2. "He suggested using FORTRAN, and everybody barfed." | |||||
| - From The Shogakukan DICTIONARY OF NEW ENGLISH (Second edition) */ | |||||
| #ifndef F2C_INCLUDE | |||||
| #define F2C_INCLUDE | |||||
| #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 | |||||
| typedef int 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; | |||||
| 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;} | |||||
| #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)); } | |||||
| #define c_div(c, a, b) {pCf(c) = Cf(a)/Cf(b);} | |||||
| #define z_div(c, a, b) {pCd(c) = Cd(a)/Cd(b);} | |||||
| #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) = conj(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) (cimag(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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotc_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void cdotu_(complex *z, integer *n_, complex *x, integer *incx_, complex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotu_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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) | |||||
| */ | |||||
| /* Table of constant values */ | |||||
| static complex c_b1 = {1.f,0.f}; | |||||
| static complex c_b2 = {0.f,0.f}; | |||||
| static integer c__1 = 1; | |||||
| /* > \brief \b CLARF applies an elementary reflector to a general rectangular matrix. */ | |||||
| /* =========== DOCUMENTATION =========== */ | |||||
| /* Online html documentation available at */ | |||||
| /* http://www.netlib.org/lapack/explore-html/ */ | |||||
| /* > \htmlonly */ | |||||
| /* > Download CLARF + dependencies */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/clarf.f | |||||
| "> */ | |||||
| /* > [TGZ]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/clarf.f | |||||
| "> */ | |||||
| /* > [ZIP]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/clarf.f | |||||
| "> */ | |||||
| /* > [TXT]</a> */ | |||||
| /* > \endhtmlonly */ | |||||
| /* Definition: */ | |||||
| /* =========== */ | |||||
| /* SUBROUTINE CLARF( SIDE, M, N, V, INCV, TAU, C, LDC, WORK ) */ | |||||
| /* CHARACTER SIDE */ | |||||
| /* INTEGER INCV, LDC, M, N */ | |||||
| /* COMPLEX TAU */ | |||||
| /* COMPLEX C( LDC, * ), V( * ), WORK( * ) */ | |||||
| /* > \par Purpose: */ | |||||
| /* ============= */ | |||||
| /* > */ | |||||
| /* > \verbatim */ | |||||
| /* > */ | |||||
| /* > CLARF applies a complex elementary reflector H to a complex M-by-N */ | |||||
| /* > matrix C, from either the left or the right. H is represented in the */ | |||||
| /* > form */ | |||||
| /* > */ | |||||
| /* > H = I - tau * v * v**H */ | |||||
| /* > */ | |||||
| /* > where tau is a complex scalar and v is a complex vector. */ | |||||
| /* > */ | |||||
| /* > If tau = 0, then H is taken to be the unit matrix. */ | |||||
| /* > */ | |||||
| /* > To apply H**H (the conjugate transpose of H), supply conjg(tau) instead */ | |||||
| /* > tau. */ | |||||
| /* > \endverbatim */ | |||||
| /* Arguments: */ | |||||
| /* ========== */ | |||||
| /* > \param[in] SIDE */ | |||||
| /* > \verbatim */ | |||||
| /* > SIDE is CHARACTER*1 */ | |||||
| /* > = 'L': form H * C */ | |||||
| /* > = 'R': form C * H */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] M */ | |||||
| /* > \verbatim */ | |||||
| /* > M is INTEGER */ | |||||
| /* > The number of rows of the matrix C. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] N */ | |||||
| /* > \verbatim */ | |||||
| /* > N is INTEGER */ | |||||
| /* > The number of columns of the matrix C. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] V */ | |||||
| /* > \verbatim */ | |||||
| /* > V is COMPLEX array, dimension */ | |||||
| /* > (1 + (M-1)*abs(INCV)) if SIDE = 'L' */ | |||||
| /* > or (1 + (N-1)*abs(INCV)) if SIDE = 'R' */ | |||||
| /* > The vector v in the representation of H. V is not used if */ | |||||
| /* > TAU = 0. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] INCV */ | |||||
| /* > \verbatim */ | |||||
| /* > INCV is INTEGER */ | |||||
| /* > The increment between elements of v. INCV <> 0. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] TAU */ | |||||
| /* > \verbatim */ | |||||
| /* > TAU is COMPLEX */ | |||||
| /* > The value tau in the representation of H. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in,out] C */ | |||||
| /* > \verbatim */ | |||||
| /* > C is COMPLEX array, dimension (LDC,N) */ | |||||
| /* > On entry, the M-by-N matrix C. */ | |||||
| /* > On exit, C is overwritten by the matrix H * C if SIDE = 'L', */ | |||||
| /* > or C * H if SIDE = 'R'. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] LDC */ | |||||
| /* > \verbatim */ | |||||
| /* > LDC is INTEGER */ | |||||
| /* > The leading dimension of the array C. LDC >= f2cmax(1,M). */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] WORK */ | |||||
| /* > \verbatim */ | |||||
| /* > WORK is COMPLEX array, dimension */ | |||||
| /* > (N) if SIDE = 'L' */ | |||||
| /* > or (M) if SIDE = 'R' */ | |||||
| /* > \endverbatim */ | |||||
| /* Authors: */ | |||||
| /* ======== */ | |||||
| /* > \author Univ. of Tennessee */ | |||||
| /* > \author Univ. of California Berkeley */ | |||||
| /* > \author Univ. of Colorado Denver */ | |||||
| /* > \author NAG Ltd. */ | |||||
| /* > \date December 2016 */ | |||||
| /* > \ingroup complexOTHERauxiliary */ | |||||
| /* ===================================================================== */ | |||||
| /* Subroutine */ int clarf_(char *side, integer *m, integer *n, complex *v, | |||||
| integer *incv, complex *tau, complex *c__, integer *ldc, complex * | |||||
| work) | |||||
| { | |||||
| /* System generated locals */ | |||||
| integer c_dim1, c_offset, i__1; | |||||
| complex q__1; | |||||
| /* Local variables */ | |||||
| integer i__; | |||||
| extern /* Subroutine */ int cgerc_(integer *, integer *, complex *, | |||||
| complex *, integer *, complex *, integer *, complex *, integer *), | |||||
| cgemv_(char *, integer *, integer *, complex *, complex *, | |||||
| integer *, complex *, integer *, complex *, complex *, integer *); | |||||
| extern logical lsame_(char *, char *); | |||||
| integer lastc, lastv; | |||||
| logical applyleft; | |||||
| extern integer ilaclc_(integer *, integer *, complex *, integer *), | |||||
| ilaclr_(integer *, integer *, complex *, integer *); | |||||
| /* -- LAPACK auxiliary routine (version 3.7.0) -- */ | |||||
| /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ | |||||
| /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ | |||||
| /* December 2016 */ | |||||
| /* ===================================================================== */ | |||||
| /* Parameter adjustments */ | |||||
| --v; | |||||
| c_dim1 = *ldc; | |||||
| c_offset = 1 + c_dim1 * 1; | |||||
| c__ -= c_offset; | |||||
| --work; | |||||
| /* Function Body */ | |||||
| applyleft = lsame_(side, "L"); | |||||
| lastv = 0; | |||||
| lastc = 0; | |||||
| if (tau->r != 0.f || tau->i != 0.f) { | |||||
| /* Set up variables for scanning V. LASTV begins pointing to the end */ | |||||
| /* of V. */ | |||||
| if (applyleft) { | |||||
| lastv = *m; | |||||
| } else { | |||||
| lastv = *n; | |||||
| } | |||||
| if (*incv > 0) { | |||||
| i__ = (lastv - 1) * *incv + 1; | |||||
| } else { | |||||
| i__ = 1; | |||||
| } | |||||
| /* Look for the last non-zero row in V. */ | |||||
| for(;;) { /* while(complicated condition) */ | |||||
| i__1 = i__; | |||||
| if (!(lastv > 0 && (v[i__1].r == 0.f && v[i__1].i == 0.f))) | |||||
| break; | |||||
| --lastv; | |||||
| i__ -= *incv; | |||||
| } | |||||
| if (applyleft) { | |||||
| /* Scan for the last non-zero column in C(1:lastv,:). */ | |||||
| lastc = ilaclc_(&lastv, n, &c__[c_offset], ldc); | |||||
| } else { | |||||
| /* Scan for the last non-zero row in C(:,1:lastv). */ | |||||
| lastc = ilaclr_(m, &lastv, &c__[c_offset], ldc); | |||||
| } | |||||
| } | |||||
| /* Note that lastc.eq.0 renders the BLAS operations null; no special */ | |||||
| /* case is needed at this level. */ | |||||
| if (applyleft) { | |||||
| /* Form H * C */ | |||||
| if (lastv > 0) { | |||||
| /* w(1:lastc,1) := C(1:lastv,1:lastc)**H * v(1:lastv,1) */ | |||||
| cgemv_("Conjugate transpose", &lastv, &lastc, &c_b1, &c__[ | |||||
| c_offset], ldc, &v[1], incv, &c_b2, &work[1], &c__1); | |||||
| /* C(1:lastv,1:lastc) := C(...) - v(1:lastv,1) * w(1:lastc,1)**H */ | |||||
| q__1.r = -tau->r, q__1.i = -tau->i; | |||||
| cgerc_(&lastv, &lastc, &q__1, &v[1], incv, &work[1], &c__1, &c__[ | |||||
| c_offset], ldc); | |||||
| } | |||||
| } else { | |||||
| /* Form C * H */ | |||||
| if (lastv > 0) { | |||||
| /* w(1:lastc,1) := C(1:lastc,1:lastv) * v(1:lastv,1) */ | |||||
| cgemv_("No transpose", &lastc, &lastv, &c_b1, &c__[c_offset], ldc, | |||||
| &v[1], incv, &c_b2, &work[1], &c__1); | |||||
| /* C(1:lastc,1:lastv) := C(...) - w(1:lastc,1) * v(1:lastv,1)**H */ | |||||
| q__1.r = -tau->r, q__1.i = -tau->i; | |||||
| cgerc_(&lastc, &lastv, &q__1, &work[1], &c__1, &v[1], incv, &c__[ | |||||
| c_offset], ldc); | |||||
| } | |||||
| } | |||||
| return 0; | |||||
| /* End of CLARF */ | |||||
| } /* clarf_ */ | |||||
| @@ -0,0 +1,609 @@ | |||||
| /* f2c.h -- Standard Fortran to C header file */ | |||||
| /** barf [ba:rf] 2. "He suggested using FORTRAN, and everybody barfed." | |||||
| - From The Shogakukan DICTIONARY OF NEW ENGLISH (Second edition) */ | |||||
| #ifndef F2C_INCLUDE | |||||
| #define F2C_INCLUDE | |||||
| #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 | |||||
| typedef int 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; | |||||
| 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;} | |||||
| #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)); } | |||||
| #define c_div(c, a, b) {pCf(c) = Cf(a)/Cf(b);} | |||||
| #define z_div(c, a, b) {pCd(c) = Cd(a)/Cd(b);} | |||||
| #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) = conj(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) (cimag(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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotc_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void cdotu_(complex *z, integer *n_, complex *x, integer *incx_, complex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotu_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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) | |||||
| */ | |||||
| /* Table of constant values */ | |||||
| static complex c_b5 = {1.f,0.f}; | |||||
| /* > \brief \b CLARFG generates an elementary reflector (Householder matrix). */ | |||||
| /* =========== DOCUMENTATION =========== */ | |||||
| /* Online html documentation available at */ | |||||
| /* http://www.netlib.org/lapack/explore-html/ */ | |||||
| /* > \htmlonly */ | |||||
| /* > Download CLARFG + dependencies */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/clarfg. | |||||
| f"> */ | |||||
| /* > [TGZ]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/clarfg. | |||||
| f"> */ | |||||
| /* > [ZIP]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/clarfg. | |||||
| f"> */ | |||||
| /* > [TXT]</a> */ | |||||
| /* > \endhtmlonly */ | |||||
| /* Definition: */ | |||||
| /* =========== */ | |||||
| /* SUBROUTINE CLARFG( N, ALPHA, X, INCX, TAU ) */ | |||||
| /* INTEGER INCX, N */ | |||||
| /* COMPLEX ALPHA, TAU */ | |||||
| /* COMPLEX X( * ) */ | |||||
| /* > \par Purpose: */ | |||||
| /* ============= */ | |||||
| /* > */ | |||||
| /* > \verbatim */ | |||||
| /* > */ | |||||
| /* > CLARFG generates a complex elementary reflector H of order n, such */ | |||||
| /* > that */ | |||||
| /* > */ | |||||
| /* > H**H * ( alpha ) = ( beta ), H**H * H = I. */ | |||||
| /* > ( x ) ( 0 ) */ | |||||
| /* > */ | |||||
| /* > where alpha and beta are scalars, with beta real, and x is an */ | |||||
| /* > (n-1)-element complex vector. H is represented in the form */ | |||||
| /* > */ | |||||
| /* > H = I - tau * ( 1 ) * ( 1 v**H ) , */ | |||||
| /* > ( v ) */ | |||||
| /* > */ | |||||
| /* > where tau is a complex scalar and v is a complex (n-1)-element */ | |||||
| /* > vector. Note that H is not hermitian. */ | |||||
| /* > */ | |||||
| /* > If the elements of x are all zero and alpha is real, then tau = 0 */ | |||||
| /* > and H is taken to be the unit matrix. */ | |||||
| /* > */ | |||||
| /* > Otherwise 1 <= real(tau) <= 2 and abs(tau-1) <= 1 . */ | |||||
| /* > \endverbatim */ | |||||
| /* Arguments: */ | |||||
| /* ========== */ | |||||
| /* > \param[in] N */ | |||||
| /* > \verbatim */ | |||||
| /* > N is INTEGER */ | |||||
| /* > The order of the elementary reflector. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in,out] ALPHA */ | |||||
| /* > \verbatim */ | |||||
| /* > ALPHA is COMPLEX */ | |||||
| /* > On entry, the value alpha. */ | |||||
| /* > On exit, it is overwritten with the value beta. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in,out] X */ | |||||
| /* > \verbatim */ | |||||
| /* > X is COMPLEX array, dimension */ | |||||
| /* > (1+(N-2)*abs(INCX)) */ | |||||
| /* > On entry, the vector x. */ | |||||
| /* > On exit, it is overwritten with the vector v. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] INCX */ | |||||
| /* > \verbatim */ | |||||
| /* > INCX is INTEGER */ | |||||
| /* > The increment between elements of X. INCX > 0. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] TAU */ | |||||
| /* > \verbatim */ | |||||
| /* > TAU is COMPLEX */ | |||||
| /* > The value tau. */ | |||||
| /* > \endverbatim */ | |||||
| /* Authors: */ | |||||
| /* ======== */ | |||||
| /* > \author Univ. of Tennessee */ | |||||
| /* > \author Univ. of California Berkeley */ | |||||
| /* > \author Univ. of Colorado Denver */ | |||||
| /* > \author NAG Ltd. */ | |||||
| /* > \date November 2017 */ | |||||
| /* > \ingroup complexOTHERauxiliary */ | |||||
| /* ===================================================================== */ | |||||
| /* Subroutine */ int clarfg_(integer *n, complex *alpha, complex *x, integer * | |||||
| incx, complex *tau) | |||||
| { | |||||
| /* System generated locals */ | |||||
| integer i__1; | |||||
| real r__1, r__2; | |||||
| complex q__1, q__2; | |||||
| /* Local variables */ | |||||
| real beta; | |||||
| integer j; | |||||
| extern /* Subroutine */ int cscal_(integer *, complex *, complex *, | |||||
| integer *); | |||||
| real alphi, alphr, xnorm; | |||||
| extern real scnrm2_(integer *, complex *, integer *), slapy3_(real *, | |||||
| real *, real *); | |||||
| extern /* Complex */ VOID cladiv_(complex *, complex *, complex *); | |||||
| extern real slamch_(char *); | |||||
| extern /* Subroutine */ int csscal_(integer *, real *, complex *, integer | |||||
| *); | |||||
| real safmin, rsafmn; | |||||
| integer knt; | |||||
| /* -- LAPACK auxiliary routine (version 3.8.0) -- */ | |||||
| /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ | |||||
| /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ | |||||
| /* November 2017 */ | |||||
| /* ===================================================================== */ | |||||
| /* Parameter adjustments */ | |||||
| --x; | |||||
| /* Function Body */ | |||||
| if (*n <= 0) { | |||||
| tau->r = 0.f, tau->i = 0.f; | |||||
| return 0; | |||||
| } | |||||
| i__1 = *n - 1; | |||||
| xnorm = scnrm2_(&i__1, &x[1], incx); | |||||
| alphr = alpha->r; | |||||
| alphi = r_imag(alpha); | |||||
| if (xnorm == 0.f && alphi == 0.f) { | |||||
| /* H = I */ | |||||
| tau->r = 0.f, tau->i = 0.f; | |||||
| } else { | |||||
| /* general case */ | |||||
| r__1 = slapy3_(&alphr, &alphi, &xnorm); | |||||
| beta = -r_sign(&r__1, &alphr); | |||||
| safmin = slamch_("S") / slamch_("E"); | |||||
| rsafmn = 1.f / safmin; | |||||
| knt = 0; | |||||
| if (abs(beta) < safmin) { | |||||
| /* XNORM, BETA may be inaccurate; scale X and recompute them */ | |||||
| L10: | |||||
| ++knt; | |||||
| i__1 = *n - 1; | |||||
| csscal_(&i__1, &rsafmn, &x[1], incx); | |||||
| beta *= rsafmn; | |||||
| alphi *= rsafmn; | |||||
| alphr *= rsafmn; | |||||
| if (abs(beta) < safmin && knt < 20) { | |||||
| goto L10; | |||||
| } | |||||
| /* New BETA is at most 1, at least SAFMIN */ | |||||
| i__1 = *n - 1; | |||||
| xnorm = scnrm2_(&i__1, &x[1], incx); | |||||
| q__1.r = alphr, q__1.i = alphi; | |||||
| alpha->r = q__1.r, alpha->i = q__1.i; | |||||
| r__1 = slapy3_(&alphr, &alphi, &xnorm); | |||||
| beta = -r_sign(&r__1, &alphr); | |||||
| } | |||||
| r__1 = (beta - alphr) / beta; | |||||
| r__2 = -alphi / beta; | |||||
| q__1.r = r__1, q__1.i = r__2; | |||||
| tau->r = q__1.r, tau->i = q__1.i; | |||||
| q__2.r = alpha->r - beta, q__2.i = alpha->i; | |||||
| cladiv_(&q__1, &c_b5, &q__2); | |||||
| alpha->r = q__1.r, alpha->i = q__1.i; | |||||
| i__1 = *n - 1; | |||||
| cscal_(&i__1, alpha, &x[1], incx); | |||||
| /* If ALPHA is subnormal, it may lose relative accuracy */ | |||||
| i__1 = knt; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| beta *= safmin; | |||||
| /* L20: */ | |||||
| } | |||||
| alpha->r = beta, alpha->i = 0.f; | |||||
| } | |||||
| return 0; | |||||
| /* End of CLARFG */ | |||||
| } /* clarfg_ */ | |||||
| @@ -0,0 +1,699 @@ | |||||
| /* f2c.h -- Standard Fortran to C header file */ | |||||
| /** barf [ba:rf] 2. "He suggested using FORTRAN, and everybody barfed." | |||||
| - From The Shogakukan DICTIONARY OF NEW ENGLISH (Second edition) */ | |||||
| #ifndef F2C_INCLUDE | |||||
| #define F2C_INCLUDE | |||||
| #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 | |||||
| typedef int 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; | |||||
| 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;} | |||||
| #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)); } | |||||
| #define c_div(c, a, b) {pCf(c) = Cf(a)/Cf(b);} | |||||
| #define z_div(c, a, b) {pCd(c) = Cd(a)/Cd(b);} | |||||
| #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) = conj(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) (cimag(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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotc_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void cdotu_(complex *z, integer *n_, complex *x, integer *incx_, complex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotu_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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) | |||||
| */ | |||||
| /* Table of constant values */ | |||||
| static complex c_b5 = {1.f,0.f}; | |||||
| /* > \brief \b CLARFGP generates an elementary reflector (Householder matrix) with non-negative beta. */ | |||||
| /* =========== DOCUMENTATION =========== */ | |||||
| /* Online html documentation available at */ | |||||
| /* http://www.netlib.org/lapack/explore-html/ */ | |||||
| /* > \htmlonly */ | |||||
| /* > Download CLARFGP + dependencies */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/clarfgp | |||||
| .f"> */ | |||||
| /* > [TGZ]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/clarfgp | |||||
| .f"> */ | |||||
| /* > [ZIP]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/clarfgp | |||||
| .f"> */ | |||||
| /* > [TXT]</a> */ | |||||
| /* > \endhtmlonly */ | |||||
| /* Definition: */ | |||||
| /* =========== */ | |||||
| /* SUBROUTINE CLARFGP( N, ALPHA, X, INCX, TAU ) */ | |||||
| /* INTEGER INCX, N */ | |||||
| /* COMPLEX ALPHA, TAU */ | |||||
| /* COMPLEX X( * ) */ | |||||
| /* > \par Purpose: */ | |||||
| /* ============= */ | |||||
| /* > */ | |||||
| /* > \verbatim */ | |||||
| /* > */ | |||||
| /* > CLARFGP generates a complex elementary reflector H of order n, such */ | |||||
| /* > that */ | |||||
| /* > */ | |||||
| /* > H**H * ( alpha ) = ( beta ), H**H * H = I. */ | |||||
| /* > ( x ) ( 0 ) */ | |||||
| /* > */ | |||||
| /* > where alpha and beta are scalars, beta is real and non-negative, and */ | |||||
| /* > x is an (n-1)-element complex vector. H is represented in the form */ | |||||
| /* > */ | |||||
| /* > H = I - tau * ( 1 ) * ( 1 v**H ) , */ | |||||
| /* > ( v ) */ | |||||
| /* > */ | |||||
| /* > where tau is a complex scalar and v is a complex (n-1)-element */ | |||||
| /* > vector. Note that H is not hermitian. */ | |||||
| /* > */ | |||||
| /* > If the elements of x are all zero and alpha is real, then tau = 0 */ | |||||
| /* > and H is taken to be the unit matrix. */ | |||||
| /* > \endverbatim */ | |||||
| /* Arguments: */ | |||||
| /* ========== */ | |||||
| /* > \param[in] N */ | |||||
| /* > \verbatim */ | |||||
| /* > N is INTEGER */ | |||||
| /* > The order of the elementary reflector. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in,out] ALPHA */ | |||||
| /* > \verbatim */ | |||||
| /* > ALPHA is COMPLEX */ | |||||
| /* > On entry, the value alpha. */ | |||||
| /* > On exit, it is overwritten with the value beta. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in,out] X */ | |||||
| /* > \verbatim */ | |||||
| /* > X is COMPLEX array, dimension */ | |||||
| /* > (1+(N-2)*abs(INCX)) */ | |||||
| /* > On entry, the vector x. */ | |||||
| /* > On exit, it is overwritten with the vector v. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] INCX */ | |||||
| /* > \verbatim */ | |||||
| /* > INCX is INTEGER */ | |||||
| /* > The increment between elements of X. INCX > 0. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] TAU */ | |||||
| /* > \verbatim */ | |||||
| /* > TAU is COMPLEX */ | |||||
| /* > The value tau. */ | |||||
| /* > \endverbatim */ | |||||
| /* Authors: */ | |||||
| /* ======== */ | |||||
| /* > \author Univ. of Tennessee */ | |||||
| /* > \author Univ. of California Berkeley */ | |||||
| /* > \author Univ. of Colorado Denver */ | |||||
| /* > \author NAG Ltd. */ | |||||
| /* > \date November 2017 */ | |||||
| /* > \ingroup complexOTHERauxiliary */ | |||||
| /* ===================================================================== */ | |||||
| /* Subroutine */ int clarfgp_(integer *n, complex *alpha, complex *x, integer | |||||
| *incx, complex *tau) | |||||
| { | |||||
| /* System generated locals */ | |||||
| integer i__1, i__2; | |||||
| real r__1, r__2; | |||||
| complex q__1, q__2; | |||||
| /* Local variables */ | |||||
| real beta; | |||||
| integer j; | |||||
| extern /* Subroutine */ int cscal_(integer *, complex *, complex *, | |||||
| integer *); | |||||
| real alphi, alphr; | |||||
| complex savealpha; | |||||
| real xnorm; | |||||
| extern real scnrm2_(integer *, complex *, integer *), slapy2_(real *, | |||||
| real *), slapy3_(real *, real *, real *); | |||||
| extern /* Complex */ VOID cladiv_(complex *, complex *, complex *); | |||||
| extern real slamch_(char *); | |||||
| extern /* Subroutine */ int csscal_(integer *, real *, complex *, integer | |||||
| *); | |||||
| real bignum, smlnum; | |||||
| integer knt; | |||||
| /* -- LAPACK auxiliary routine (version 3.8.0) -- */ | |||||
| /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ | |||||
| /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ | |||||
| /* November 2017 */ | |||||
| /* ===================================================================== */ | |||||
| /* Parameter adjustments */ | |||||
| --x; | |||||
| /* Function Body */ | |||||
| if (*n <= 0) { | |||||
| tau->r = 0.f, tau->i = 0.f; | |||||
| return 0; | |||||
| } | |||||
| i__1 = *n - 1; | |||||
| xnorm = scnrm2_(&i__1, &x[1], incx); | |||||
| alphr = alpha->r; | |||||
| alphi = r_imag(alpha); | |||||
| if (xnorm == 0.f) { | |||||
| /* H = [1-alpha/abs(alpha) 0; 0 I], sign chosen so ALPHA >= 0. */ | |||||
| if (alphi == 0.f) { | |||||
| if (alphr >= 0.f) { | |||||
| /* When TAU.eq.ZERO, the vector is special-cased to be */ | |||||
| /* all zeros in the application routines. We do not need */ | |||||
| /* to clear it. */ | |||||
| tau->r = 0.f, tau->i = 0.f; | |||||
| } else { | |||||
| /* However, the application routines rely on explicit */ | |||||
| /* zero checks when TAU.ne.ZERO, and we must clear X. */ | |||||
| tau->r = 2.f, tau->i = 0.f; | |||||
| i__1 = *n - 1; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| i__2 = (j - 1) * *incx + 1; | |||||
| x[i__2].r = 0.f, x[i__2].i = 0.f; | |||||
| } | |||||
| q__1.r = -alpha->r, q__1.i = -alpha->i; | |||||
| alpha->r = q__1.r, alpha->i = q__1.i; | |||||
| } | |||||
| } else { | |||||
| /* Only "reflecting" the diagonal entry to be real and non-negative. */ | |||||
| xnorm = slapy2_(&alphr, &alphi); | |||||
| r__1 = 1.f - alphr / xnorm; | |||||
| r__2 = -alphi / xnorm; | |||||
| q__1.r = r__1, q__1.i = r__2; | |||||
| tau->r = q__1.r, tau->i = q__1.i; | |||||
| i__1 = *n - 1; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| i__2 = (j - 1) * *incx + 1; | |||||
| x[i__2].r = 0.f, x[i__2].i = 0.f; | |||||
| } | |||||
| alpha->r = xnorm, alpha->i = 0.f; | |||||
| } | |||||
| } else { | |||||
| /* general case */ | |||||
| r__1 = slapy3_(&alphr, &alphi, &xnorm); | |||||
| beta = r_sign(&r__1, &alphr); | |||||
| smlnum = slamch_("S") / slamch_("E"); | |||||
| bignum = 1.f / smlnum; | |||||
| knt = 0; | |||||
| if (abs(beta) < smlnum) { | |||||
| /* XNORM, BETA may be inaccurate; scale X and recompute them */ | |||||
| L10: | |||||
| ++knt; | |||||
| i__1 = *n - 1; | |||||
| csscal_(&i__1, &bignum, &x[1], incx); | |||||
| beta *= bignum; | |||||
| alphi *= bignum; | |||||
| alphr *= bignum; | |||||
| if (abs(beta) < smlnum && knt < 20) { | |||||
| goto L10; | |||||
| } | |||||
| /* New BETA is at most 1, at least SMLNUM */ | |||||
| i__1 = *n - 1; | |||||
| xnorm = scnrm2_(&i__1, &x[1], incx); | |||||
| q__1.r = alphr, q__1.i = alphi; | |||||
| alpha->r = q__1.r, alpha->i = q__1.i; | |||||
| r__1 = slapy3_(&alphr, &alphi, &xnorm); | |||||
| beta = r_sign(&r__1, &alphr); | |||||
| } | |||||
| savealpha.r = alpha->r, savealpha.i = alpha->i; | |||||
| q__1.r = alpha->r + beta, q__1.i = alpha->i; | |||||
| alpha->r = q__1.r, alpha->i = q__1.i; | |||||
| if (beta < 0.f) { | |||||
| beta = -beta; | |||||
| q__2.r = -alpha->r, q__2.i = -alpha->i; | |||||
| q__1.r = q__2.r / beta, q__1.i = q__2.i / beta; | |||||
| tau->r = q__1.r, tau->i = q__1.i; | |||||
| } else { | |||||
| alphr = alphi * (alphi / alpha->r); | |||||
| alphr += xnorm * (xnorm / alpha->r); | |||||
| r__1 = alphr / beta; | |||||
| r__2 = -alphi / beta; | |||||
| q__1.r = r__1, q__1.i = r__2; | |||||
| tau->r = q__1.r, tau->i = q__1.i; | |||||
| r__1 = -alphr; | |||||
| q__1.r = r__1, q__1.i = alphi; | |||||
| alpha->r = q__1.r, alpha->i = q__1.i; | |||||
| } | |||||
| cladiv_(&q__1, &c_b5, alpha); | |||||
| alpha->r = q__1.r, alpha->i = q__1.i; | |||||
| if (c_abs(tau) <= smlnum) { | |||||
| /* In the case where the computed TAU ends up being a denormalized number, */ | |||||
| /* it loses relative accuracy. This is a BIG problem. Solution: flush TAU */ | |||||
| /* to ZERO (or TWO or whatever makes a nonnegative real number for BETA). */ | |||||
| /* (Bug report provided by Pat Quillen from MathWorks on Jul 29, 2009.) */ | |||||
| /* (Thanks Pat. Thanks MathWorks.) */ | |||||
| alphr = savealpha.r; | |||||
| alphi = r_imag(&savealpha); | |||||
| if (alphi == 0.f) { | |||||
| if (alphr >= 0.f) { | |||||
| tau->r = 0.f, tau->i = 0.f; | |||||
| } else { | |||||
| tau->r = 2.f, tau->i = 0.f; | |||||
| i__1 = *n - 1; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| i__2 = (j - 1) * *incx + 1; | |||||
| x[i__2].r = 0.f, x[i__2].i = 0.f; | |||||
| } | |||||
| q__1.r = -savealpha.r, q__1.i = -savealpha.i; | |||||
| beta = q__1.r; | |||||
| } | |||||
| } else { | |||||
| xnorm = slapy2_(&alphr, &alphi); | |||||
| r__1 = 1.f - alphr / xnorm; | |||||
| r__2 = -alphi / xnorm; | |||||
| q__1.r = r__1, q__1.i = r__2; | |||||
| tau->r = q__1.r, tau->i = q__1.i; | |||||
| i__1 = *n - 1; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| i__2 = (j - 1) * *incx + 1; | |||||
| x[i__2].r = 0.f, x[i__2].i = 0.f; | |||||
| } | |||||
| beta = xnorm; | |||||
| } | |||||
| } else { | |||||
| /* This is the general case. */ | |||||
| i__1 = *n - 1; | |||||
| cscal_(&i__1, alpha, &x[1], incx); | |||||
| } | |||||
| /* If BETA is subnormal, it may lose relative accuracy */ | |||||
| i__1 = knt; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| beta *= smlnum; | |||||
| /* L20: */ | |||||
| } | |||||
| alpha->r = beta, alpha->i = 0.f; | |||||
| } | |||||
| return 0; | |||||
| /* End of CLARFGP */ | |||||
| } /* clarfgp_ */ | |||||
| @@ -0,0 +1,807 @@ | |||||
| /* f2c.h -- Standard Fortran to C header file */ | |||||
| /** barf [ba:rf] 2. "He suggested using FORTRAN, and everybody barfed." | |||||
| - From The Shogakukan DICTIONARY OF NEW ENGLISH (Second edition) */ | |||||
| #ifndef F2C_INCLUDE | |||||
| #define F2C_INCLUDE | |||||
| #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 | |||||
| typedef int 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; | |||||
| 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;} | |||||
| #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)); } | |||||
| #define c_div(c, a, b) {pCf(c) = Cf(a)/Cf(b);} | |||||
| #define z_div(c, a, b) {pCd(c) = Cd(a)/Cd(b);} | |||||
| #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) = conj(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) (cimag(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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotc_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void cdotu_(complex *z, integer *n_, complex *x, integer *incx_, complex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotu_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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) | |||||
| */ | |||||
| /* Table of constant values */ | |||||
| static complex c_b1 = {1.f,0.f}; | |||||
| static integer c__1 = 1; | |||||
| /* > \brief \b CLARFT forms the triangular factor T of a block reflector H = I - vtvH */ | |||||
| /* =========== DOCUMENTATION =========== */ | |||||
| /* Online html documentation available at */ | |||||
| /* http://www.netlib.org/lapack/explore-html/ */ | |||||
| /* > \htmlonly */ | |||||
| /* > Download CLARFT + dependencies */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/clarft. | |||||
| f"> */ | |||||
| /* > [TGZ]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/clarft. | |||||
| f"> */ | |||||
| /* > [ZIP]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/clarft. | |||||
| f"> */ | |||||
| /* > [TXT]</a> */ | |||||
| /* > \endhtmlonly */ | |||||
| /* Definition: */ | |||||
| /* =========== */ | |||||
| /* SUBROUTINE CLARFT( DIRECT, STOREV, N, K, V, LDV, TAU, T, LDT ) */ | |||||
| /* CHARACTER DIRECT, STOREV */ | |||||
| /* INTEGER K, LDT, LDV, N */ | |||||
| /* COMPLEX T( LDT, * ), TAU( * ), V( LDV, * ) */ | |||||
| /* > \par Purpose: */ | |||||
| /* ============= */ | |||||
| /* > */ | |||||
| /* > \verbatim */ | |||||
| /* > */ | |||||
| /* > CLARFT forms the triangular factor T of a complex block reflector H */ | |||||
| /* > of order n, which is defined as a product of k elementary reflectors. */ | |||||
| /* > */ | |||||
| /* > If DIRECT = 'F', H = H(1) H(2) . . . H(k) and T is upper triangular; */ | |||||
| /* > */ | |||||
| /* > If DIRECT = 'B', H = H(k) . . . H(2) H(1) and T is lower triangular. */ | |||||
| /* > */ | |||||
| /* > If STOREV = 'C', the vector which defines the elementary reflector */ | |||||
| /* > H(i) is stored in the i-th column of the array V, and */ | |||||
| /* > */ | |||||
| /* > H = I - V * T * V**H */ | |||||
| /* > */ | |||||
| /* > If STOREV = 'R', the vector which defines the elementary reflector */ | |||||
| /* > H(i) is stored in the i-th row of the array V, and */ | |||||
| /* > */ | |||||
| /* > H = I - V**H * T * V */ | |||||
| /* > \endverbatim */ | |||||
| /* Arguments: */ | |||||
| /* ========== */ | |||||
| /* > \param[in] DIRECT */ | |||||
| /* > \verbatim */ | |||||
| /* > DIRECT is CHARACTER*1 */ | |||||
| /* > Specifies the order in which the elementary reflectors are */ | |||||
| /* > multiplied to form the block reflector: */ | |||||
| /* > = 'F': H = H(1) H(2) . . . H(k) (Forward) */ | |||||
| /* > = 'B': H = H(k) . . . H(2) H(1) (Backward) */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] STOREV */ | |||||
| /* > \verbatim */ | |||||
| /* > STOREV is CHARACTER*1 */ | |||||
| /* > Specifies how the vectors which define the elementary */ | |||||
| /* > reflectors are stored (see also Further Details): */ | |||||
| /* > = 'C': columnwise */ | |||||
| /* > = 'R': rowwise */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] N */ | |||||
| /* > \verbatim */ | |||||
| /* > N is INTEGER */ | |||||
| /* > The order of the block reflector H. N >= 0. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] K */ | |||||
| /* > \verbatim */ | |||||
| /* > K is INTEGER */ | |||||
| /* > The order of the triangular factor T (= the number of */ | |||||
| /* > elementary reflectors). K >= 1. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] V */ | |||||
| /* > \verbatim */ | |||||
| /* > V is COMPLEX array, dimension */ | |||||
| /* > (LDV,K) if STOREV = 'C' */ | |||||
| /* > (LDV,N) if STOREV = 'R' */ | |||||
| /* > The matrix V. See further details. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] LDV */ | |||||
| /* > \verbatim */ | |||||
| /* > LDV is INTEGER */ | |||||
| /* > The leading dimension of the array V. */ | |||||
| /* > If STOREV = 'C', LDV >= f2cmax(1,N); if STOREV = 'R', LDV >= K. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] TAU */ | |||||
| /* > \verbatim */ | |||||
| /* > TAU is COMPLEX array, dimension (K) */ | |||||
| /* > TAU(i) must contain the scalar factor of the elementary */ | |||||
| /* > reflector H(i). */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] T */ | |||||
| /* > \verbatim */ | |||||
| /* > T is COMPLEX array, dimension (LDT,K) */ | |||||
| /* > The k by k triangular factor T of the block reflector. */ | |||||
| /* > If DIRECT = 'F', T is upper triangular; if DIRECT = 'B', T is */ | |||||
| /* > lower triangular. The rest of the array is not used. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] LDT */ | |||||
| /* > \verbatim */ | |||||
| /* > LDT is INTEGER */ | |||||
| /* > The leading dimension of the array T. LDT >= K. */ | |||||
| /* > \endverbatim */ | |||||
| /* Authors: */ | |||||
| /* ======== */ | |||||
| /* > \author Univ. of Tennessee */ | |||||
| /* > \author Univ. of California Berkeley */ | |||||
| /* > \author Univ. of Colorado Denver */ | |||||
| /* > \author NAG Ltd. */ | |||||
| /* > \date December 2016 */ | |||||
| /* > \ingroup complexOTHERauxiliary */ | |||||
| /* > \par Further Details: */ | |||||
| /* ===================== */ | |||||
| /* > */ | |||||
| /* > \verbatim */ | |||||
| /* > */ | |||||
| /* > The shape of the matrix V and the storage of the vectors which define */ | |||||
| /* > the H(i) is best illustrated by the following example with n = 5 and */ | |||||
| /* > k = 3. The elements equal to 1 are not stored. */ | |||||
| /* > */ | |||||
| /* > DIRECT = 'F' and STOREV = 'C': DIRECT = 'F' and STOREV = 'R': */ | |||||
| /* > */ | |||||
| /* > V = ( 1 ) V = ( 1 v1 v1 v1 v1 ) */ | |||||
| /* > ( v1 1 ) ( 1 v2 v2 v2 ) */ | |||||
| /* > ( v1 v2 1 ) ( 1 v3 v3 ) */ | |||||
| /* > ( v1 v2 v3 ) */ | |||||
| /* > ( v1 v2 v3 ) */ | |||||
| /* > */ | |||||
| /* > DIRECT = 'B' and STOREV = 'C': DIRECT = 'B' and STOREV = 'R': */ | |||||
| /* > */ | |||||
| /* > V = ( v1 v2 v3 ) V = ( v1 v1 1 ) */ | |||||
| /* > ( v1 v2 v3 ) ( v2 v2 v2 1 ) */ | |||||
| /* > ( 1 v2 v3 ) ( v3 v3 v3 v3 1 ) */ | |||||
| /* > ( 1 v3 ) */ | |||||
| /* > ( 1 ) */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* ===================================================================== */ | |||||
| /* Subroutine */ int clarft_(char *direct, char *storev, integer *n, integer * | |||||
| k, complex *v, integer *ldv, complex *tau, complex *t, integer *ldt) | |||||
| { | |||||
| /* System generated locals */ | |||||
| integer t_dim1, t_offset, v_dim1, v_offset, i__1, i__2, i__3, i__4, i__5; | |||||
| complex q__1, q__2, q__3; | |||||
| /* Local variables */ | |||||
| integer i__, j; | |||||
| extern /* Subroutine */ int cgemm_(char *, char *, integer *, integer *, | |||||
| integer *, complex *, complex *, integer *, complex *, integer *, | |||||
| complex *, complex *, integer *), cgemv_(char *, | |||||
| integer *, integer *, complex *, complex *, integer *, complex *, | |||||
| integer *, complex *, complex *, integer *); | |||||
| extern logical lsame_(char *, char *); | |||||
| integer lastv; | |||||
| extern /* Subroutine */ int ctrmv_(char *, char *, char *, integer *, | |||||
| complex *, integer *, complex *, integer *); | |||||
| integer prevlastv; | |||||
| extern /* Subroutine */ int mecago_(); | |||||
| /* -- LAPACK auxiliary routine (version 3.7.0) -- */ | |||||
| /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ | |||||
| /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ | |||||
| /* December 2016 */ | |||||
| /* ===================================================================== */ | |||||
| /* Quick return if possible */ | |||||
| /* Parameter adjustments */ | |||||
| v_dim1 = *ldv; | |||||
| v_offset = 1 + v_dim1 * 1; | |||||
| v -= v_offset; | |||||
| --tau; | |||||
| t_dim1 = *ldt; | |||||
| t_offset = 1 + t_dim1 * 1; | |||||
| t -= t_offset; | |||||
| /* Function Body */ | |||||
| if (*n == 0) { | |||||
| return 0; | |||||
| } | |||||
| if (lsame_(direct, "F")) { | |||||
| prevlastv = *n; | |||||
| i__1 = *k; | |||||
| for (i__ = 1; i__ <= i__1; ++i__) { | |||||
| prevlastv = f2cmax(prevlastv,i__); | |||||
| i__2 = i__; | |||||
| if (tau[i__2].r == 0.f && tau[i__2].i == 0.f) { | |||||
| /* H(i) = I */ | |||||
| i__2 = i__; | |||||
| for (j = 1; j <= i__2; ++j) { | |||||
| i__3 = j + i__ * t_dim1; | |||||
| t[i__3].r = 0.f, t[i__3].i = 0.f; | |||||
| } | |||||
| } else { | |||||
| /* general case */ | |||||
| if (lsame_(storev, "C")) { | |||||
| /* Skip any trailing zeros. */ | |||||
| i__2 = i__ + 1; | |||||
| for (lastv = *n; lastv >= i__2; --lastv) { | |||||
| i__3 = lastv + i__ * v_dim1; | |||||
| if (v[i__3].r != 0.f || v[i__3].i != 0.f) { | |||||
| myexit_(); | |||||
| } | |||||
| } | |||||
| i__2 = i__ - 1; | |||||
| for (j = 1; j <= i__2; ++j) { | |||||
| i__3 = j + i__ * t_dim1; | |||||
| i__4 = i__; | |||||
| q__2.r = -tau[i__4].r, q__2.i = -tau[i__4].i; | |||||
| r_cnjg(&q__3, &v[i__ + j * v_dim1]); | |||||
| q__1.r = q__2.r * q__3.r - q__2.i * q__3.i, q__1.i = | |||||
| q__2.r * q__3.i + q__2.i * q__3.r; | |||||
| t[i__3].r = q__1.r, t[i__3].i = q__1.i; | |||||
| } | |||||
| j = f2cmin(lastv,prevlastv); | |||||
| /* T(1:i-1,i) := - tau(i) * V(i:j,1:i-1)**H * V(i:j,i) */ | |||||
| i__2 = j - i__; | |||||
| i__3 = i__ - 1; | |||||
| i__4 = i__; | |||||
| q__1.r = -tau[i__4].r, q__1.i = -tau[i__4].i; | |||||
| cgemv_("Conjugate transpose", &i__2, &i__3, &q__1, &v[i__ | |||||
| + 1 + v_dim1], ldv, &v[i__ + 1 + i__ * v_dim1], & | |||||
| c__1, &c_b1, &t[i__ * t_dim1 + 1], &c__1); | |||||
| } else { | |||||
| /* Skip any trailing zeros. */ | |||||
| i__2 = i__ + 1; | |||||
| for (lastv = *n; lastv >= i__2; --lastv) { | |||||
| i__3 = i__ + lastv * v_dim1; | |||||
| if (v[i__3].r != 0.f || v[i__3].i != 0.f) { | |||||
| myexit_(); | |||||
| } | |||||
| } | |||||
| i__2 = i__ - 1; | |||||
| for (j = 1; j <= i__2; ++j) { | |||||
| i__3 = j + i__ * t_dim1; | |||||
| i__4 = i__; | |||||
| q__2.r = -tau[i__4].r, q__2.i = -tau[i__4].i; | |||||
| i__5 = j + i__ * v_dim1; | |||||
| q__1.r = q__2.r * v[i__5].r - q__2.i * v[i__5].i, | |||||
| q__1.i = q__2.r * v[i__5].i + q__2.i * v[i__5] | |||||
| .r; | |||||
| t[i__3].r = q__1.r, t[i__3].i = q__1.i; | |||||
| } | |||||
| j = f2cmin(lastv,prevlastv); | |||||
| /* T(1:i-1,i) := - tau(i) * V(1:i-1,i:j) * V(i,i:j)**H */ | |||||
| i__2 = i__ - 1; | |||||
| i__3 = j - i__; | |||||
| i__4 = i__; | |||||
| q__1.r = -tau[i__4].r, q__1.i = -tau[i__4].i; | |||||
| cgemm_("N", "C", &i__2, &c__1, &i__3, &q__1, &v[(i__ + 1) | |||||
| * v_dim1 + 1], ldv, &v[i__ + (i__ + 1) * v_dim1], | |||||
| ldv, &c_b1, &t[i__ * t_dim1 + 1], ldt); | |||||
| } | |||||
| /* T(1:i-1,i) := T(1:i-1,1:i-1) * T(1:i-1,i) */ | |||||
| i__2 = i__ - 1; | |||||
| ctrmv_("Upper", "No transpose", "Non-unit", &i__2, &t[ | |||||
| t_offset], ldt, &t[i__ * t_dim1 + 1], &c__1); | |||||
| i__2 = i__ + i__ * t_dim1; | |||||
| i__3 = i__; | |||||
| t[i__2].r = tau[i__3].r, t[i__2].i = tau[i__3].i; | |||||
| if (i__ > 1) { | |||||
| prevlastv = f2cmax(prevlastv,lastv); | |||||
| } else { | |||||
| prevlastv = lastv; | |||||
| } | |||||
| } | |||||
| } | |||||
| } else { | |||||
| prevlastv = 1; | |||||
| for (i__ = *k; i__ >= 1; --i__) { | |||||
| i__1 = i__; | |||||
| if (tau[i__1].r == 0.f && tau[i__1].i == 0.f) { | |||||
| /* H(i) = I */ | |||||
| i__1 = *k; | |||||
| for (j = i__; j <= i__1; ++j) { | |||||
| i__2 = j + i__ * t_dim1; | |||||
| t[i__2].r = 0.f, t[i__2].i = 0.f; | |||||
| } | |||||
| } else { | |||||
| /* general case */ | |||||
| if (i__ < *k) { | |||||
| if (lsame_(storev, "C")) { | |||||
| /* Skip any leading zeros. */ | |||||
| i__1 = i__ - 1; | |||||
| for (lastv = 1; lastv <= i__1; ++lastv) { | |||||
| i__2 = lastv + i__ * v_dim1; | |||||
| if (v[i__2].r != 0.f || v[i__2].i != 0.f) { | |||||
| myexit_(); | |||||
| } | |||||
| } | |||||
| i__1 = *k; | |||||
| for (j = i__ + 1; j <= i__1; ++j) { | |||||
| i__2 = j + i__ * t_dim1; | |||||
| i__3 = i__; | |||||
| q__2.r = -tau[i__3].r, q__2.i = -tau[i__3].i; | |||||
| r_cnjg(&q__3, &v[*n - *k + i__ + j * v_dim1]); | |||||
| q__1.r = q__2.r * q__3.r - q__2.i * q__3.i, | |||||
| q__1.i = q__2.r * q__3.i + q__2.i * | |||||
| q__3.r; | |||||
| t[i__2].r = q__1.r, t[i__2].i = q__1.i; | |||||
| } | |||||
| j = f2cmax(lastv,prevlastv); | |||||
| /* T(i+1:k,i) = -tau(i) * V(j:n-k+i,i+1:k)**H * V(j:n-k+i,i) */ | |||||
| i__1 = *n - *k + i__ - j; | |||||
| i__2 = *k - i__; | |||||
| i__3 = i__; | |||||
| q__1.r = -tau[i__3].r, q__1.i = -tau[i__3].i; | |||||
| cgemv_("Conjugate transpose", &i__1, &i__2, &q__1, &v[ | |||||
| j + (i__ + 1) * v_dim1], ldv, &v[j + i__ * | |||||
| v_dim1], &c__1, &c_b1, &t[i__ + 1 + i__ * | |||||
| t_dim1], &c__1); | |||||
| } else { | |||||
| /* Skip any leading zeros. */ | |||||
| i__1 = i__ - 1; | |||||
| for (lastv = 1; lastv <= i__1; ++lastv) { | |||||
| i__2 = i__ + lastv * v_dim1; | |||||
| if (v[i__2].r != 0.f || v[i__2].i != 0.f) { | |||||
| myexit_(); | |||||
| } | |||||
| } | |||||
| i__1 = *k; | |||||
| for (j = i__ + 1; j <= i__1; ++j) { | |||||
| i__2 = j + i__ * t_dim1; | |||||
| i__3 = i__; | |||||
| q__2.r = -tau[i__3].r, q__2.i = -tau[i__3].i; | |||||
| i__4 = j + (*n - *k + i__) * v_dim1; | |||||
| q__1.r = q__2.r * v[i__4].r - q__2.i * v[i__4].i, | |||||
| q__1.i = q__2.r * v[i__4].i + q__2.i * v[ | |||||
| i__4].r; | |||||
| t[i__2].r = q__1.r, t[i__2].i = q__1.i; | |||||
| } | |||||
| j = f2cmax(lastv,prevlastv); | |||||
| /* T(i+1:k,i) = -tau(i) * V(i+1:k,j:n-k+i) * V(i,j:n-k+i)**H */ | |||||
| i__1 = *k - i__; | |||||
| i__2 = *n - *k + i__ - j; | |||||
| i__3 = i__; | |||||
| q__1.r = -tau[i__3].r, q__1.i = -tau[i__3].i; | |||||
| cgemm_("N", "C", &i__1, &c__1, &i__2, &q__1, &v[i__ + | |||||
| 1 + j * v_dim1], ldv, &v[i__ + j * v_dim1], | |||||
| ldv, &c_b1, &t[i__ + 1 + i__ * t_dim1], ldt); | |||||
| } | |||||
| /* T(i+1:k,i) := T(i+1:k,i+1:k) * T(i+1:k,i) */ | |||||
| i__1 = *k - i__; | |||||
| ctrmv_("Lower", "No transpose", "Non-unit", &i__1, &t[i__ | |||||
| + 1 + (i__ + 1) * t_dim1], ldt, &t[i__ + 1 + i__ * | |||||
| t_dim1], &c__1) | |||||
| ; | |||||
| if (i__ > 1) { | |||||
| prevlastv = f2cmin(prevlastv,lastv); | |||||
| } else { | |||||
| prevlastv = lastv; | |||||
| } | |||||
| } | |||||
| i__1 = i__ + i__ * t_dim1; | |||||
| i__2 = i__; | |||||
| t[i__1].r = tau[i__2].r, t[i__1].i = tau[i__2].i; | |||||
| } | |||||
| } | |||||
| } | |||||
| return 0; | |||||
| /* End of CLARFT */ | |||||
| } /* clarft_ */ | |||||
| @@ -0,0 +1,563 @@ | |||||
| /* f2c.h -- Standard Fortran to C header file */ | |||||
| /** barf [ba:rf] 2. "He suggested using FORTRAN, and everybody barfed." | |||||
| - From The Shogakukan DICTIONARY OF NEW ENGLISH (Second edition) */ | |||||
| #ifndef F2C_INCLUDE | |||||
| #define F2C_INCLUDE | |||||
| #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 | |||||
| typedef int 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; | |||||
| 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;} | |||||
| #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)); } | |||||
| #define c_div(c, a, b) {pCf(c) = Cf(a)/Cf(b);} | |||||
| #define z_div(c, a, b) {pCd(c) = Cd(a)/Cd(b);} | |||||
| #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) = conj(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) (cimag(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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotc_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void cdotu_(complex *z, integer *n_, complex *x, integer *incx_, complex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotu_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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) | |||||
| */ | |||||
| /* Table of constant values */ | |||||
| static complex c_b1 = {1.f,0.f}; | |||||
| static complex c_b2 = {0.f,0.f}; | |||||
| static integer c__1 = 1; | |||||
| /* > \brief \b CLARFY */ | |||||
| /* =========== DOCUMENTATION =========== */ | |||||
| /* Online html documentation available at */ | |||||
| /* http://www.netlib.org/lapack/explore-html/ */ | |||||
| /* Definition: */ | |||||
| /* =========== */ | |||||
| /* SUBROUTINE CLARFY( UPLO, N, V, INCV, TAU, C, LDC, WORK ) */ | |||||
| /* CHARACTER UPLO */ | |||||
| /* INTEGER INCV, LDC, N */ | |||||
| /* COMPLEX TAU */ | |||||
| /* COMPLEX C( LDC, * ), V( * ), WORK( * ) */ | |||||
| /* > \par Purpose: */ | |||||
| /* ============= */ | |||||
| /* > */ | |||||
| /* > \verbatim */ | |||||
| /* > */ | |||||
| /* > CLARFY applies an elementary reflector, or Householder matrix, H, */ | |||||
| /* > to an n x n Hermitian matrix C, from both the left and the right. */ | |||||
| /* > */ | |||||
| /* > H is represented in the form */ | |||||
| /* > */ | |||||
| /* > H = I - tau * v * v' */ | |||||
| /* > */ | |||||
| /* > where tau is a scalar and v is a vector. */ | |||||
| /* > */ | |||||
| /* > If tau is zero, then H is taken to be the unit matrix. */ | |||||
| /* > \endverbatim */ | |||||
| /* Arguments: */ | |||||
| /* ========== */ | |||||
| /* > \param[in] UPLO */ | |||||
| /* > \verbatim */ | |||||
| /* > UPLO is CHARACTER*1 */ | |||||
| /* > Specifies whether the upper or lower triangular part of the */ | |||||
| /* > Hermitian matrix C is stored. */ | |||||
| /* > = 'U': Upper triangle */ | |||||
| /* > = 'L': Lower triangle */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] N */ | |||||
| /* > \verbatim */ | |||||
| /* > N is INTEGER */ | |||||
| /* > The number of rows and columns of the matrix C. N >= 0. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] V */ | |||||
| /* > \verbatim */ | |||||
| /* > V is COMPLEX array, dimension */ | |||||
| /* > (1 + (N-1)*abs(INCV)) */ | |||||
| /* > The vector v as described above. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] INCV */ | |||||
| /* > \verbatim */ | |||||
| /* > INCV is INTEGER */ | |||||
| /* > The increment between successive elements of v. INCV must */ | |||||
| /* > not be zero. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] TAU */ | |||||
| /* > \verbatim */ | |||||
| /* > TAU is COMPLEX */ | |||||
| /* > The value tau as described above. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in,out] C */ | |||||
| /* > \verbatim */ | |||||
| /* > C is COMPLEX array, dimension (LDC, N) */ | |||||
| /* > On entry, the matrix C. */ | |||||
| /* > On exit, C is overwritten by H * C * H'. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] LDC */ | |||||
| /* > \verbatim */ | |||||
| /* > LDC is INTEGER */ | |||||
| /* > The leading dimension of the array C. LDC >= f2cmax( 1, N ). */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] WORK */ | |||||
| /* > \verbatim */ | |||||
| /* > WORK is COMPLEX array, dimension (N) */ | |||||
| /* > \endverbatim */ | |||||
| /* Authors: */ | |||||
| /* ======== */ | |||||
| /* > \author Univ. of Tennessee */ | |||||
| /* > \author Univ. of California Berkeley */ | |||||
| /* > \author Univ. of Colorado Denver */ | |||||
| /* > \author NAG Ltd. */ | |||||
| /* > \date December 2016 */ | |||||
| /* > \ingroup complexOTHERauxiliary */ | |||||
| /* ===================================================================== */ | |||||
| /* Subroutine */ int clarfy_(char *uplo, integer *n, complex *v, integer * | |||||
| incv, complex *tau, complex *c__, integer *ldc, complex *work) | |||||
| { | |||||
| /* System generated locals */ | |||||
| integer c_dim1, c_offset; | |||||
| complex q__1, q__2, q__3, q__4; | |||||
| /* Local variables */ | |||||
| extern /* Subroutine */ int cher2_(char *, integer *, complex *, complex * | |||||
| , integer *, complex *, integer *, complex *, integer *); | |||||
| complex alpha; | |||||
| extern /* Complex */ VOID cdotc_(complex *, integer *, complex *, integer | |||||
| *, complex *, integer *); | |||||
| extern /* Subroutine */ int chemv_(char *, integer *, complex *, complex * | |||||
| , integer *, complex *, integer *, complex *, complex *, integer * | |||||
| ), caxpy_(integer *, complex *, complex *, integer *, | |||||
| complex *, integer *); | |||||
| /* -- LAPACK test routine (version 3.7.0) -- */ | |||||
| /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ | |||||
| /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ | |||||
| /* December 2016 */ | |||||
| /* ===================================================================== */ | |||||
| /* Parameter adjustments */ | |||||
| --v; | |||||
| c_dim1 = *ldc; | |||||
| c_offset = 1 + c_dim1 * 1; | |||||
| c__ -= c_offset; | |||||
| --work; | |||||
| /* Function Body */ | |||||
| if (tau->r == 0.f && tau->i == 0.f) { | |||||
| return 0; | |||||
| } | |||||
| /* Form w:= C * v */ | |||||
| chemv_(uplo, n, &c_b1, &c__[c_offset], ldc, &v[1], incv, &c_b2, &work[1], | |||||
| &c__1); | |||||
| q__3.r = -.5f, q__3.i = 0.f; | |||||
| q__2.r = q__3.r * tau->r - q__3.i * tau->i, q__2.i = q__3.r * tau->i + | |||||
| q__3.i * tau->r; | |||||
| cdotc_(&q__4, n, &work[1], &c__1, &v[1], incv); | |||||
| q__1.r = q__2.r * q__4.r - q__2.i * q__4.i, q__1.i = q__2.r * q__4.i + | |||||
| q__2.i * q__4.r; | |||||
| alpha.r = q__1.r, alpha.i = q__1.i; | |||||
| caxpy_(n, &alpha, &v[1], incv, &work[1], &c__1); | |||||
| /* C := C - v * w' - w * v' */ | |||||
| q__1.r = -tau->r, q__1.i = -tau->i; | |||||
| cher2_(uplo, n, &q__1, &v[1], incv, &work[1], &c__1, &c__[c_offset], ldc); | |||||
| return 0; | |||||
| /* End of CLARFY */ | |||||
| } /* clarfy_ */ | |||||
| @@ -0,0 +1,753 @@ | |||||
| /* f2c.h -- Standard Fortran to C header file */ | |||||
| /** barf [ba:rf] 2. "He suggested using FORTRAN, and everybody barfed." | |||||
| - From The Shogakukan DICTIONARY OF NEW ENGLISH (Second edition) */ | |||||
| #ifndef F2C_INCLUDE | |||||
| #define F2C_INCLUDE | |||||
| #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 | |||||
| typedef int 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; | |||||
| 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;} | |||||
| #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)); } | |||||
| #define c_div(c, a, b) {pCf(c) = Cf(a)/Cf(b);} | |||||
| #define z_div(c, a, b) {pCd(c) = Cd(a)/Cd(b);} | |||||
| #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) = conj(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) (cimag(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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotc_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void cdotu_(complex *z, integer *n_, complex *x, integer *incx_, complex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotu_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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) | |||||
| */ | |||||
| /* > \brief \b CLARGV generates a vector of plane rotations with real cosines and complex sines. */ | |||||
| /* =========== DOCUMENTATION =========== */ | |||||
| /* Online html documentation available at */ | |||||
| /* http://www.netlib.org/lapack/explore-html/ */ | |||||
| /* > \htmlonly */ | |||||
| /* > Download CLARGV + dependencies */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/clargv. | |||||
| f"> */ | |||||
| /* > [TGZ]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/clargv. | |||||
| f"> */ | |||||
| /* > [ZIP]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/clargv. | |||||
| f"> */ | |||||
| /* > [TXT]</a> */ | |||||
| /* > \endhtmlonly */ | |||||
| /* Definition: */ | |||||
| /* =========== */ | |||||
| /* SUBROUTINE CLARGV( N, X, INCX, Y, INCY, C, INCC ) */ | |||||
| /* INTEGER INCC, INCX, INCY, N */ | |||||
| /* REAL C( * ) */ | |||||
| /* COMPLEX X( * ), Y( * ) */ | |||||
| /* > \par Purpose: */ | |||||
| /* ============= */ | |||||
| /* > */ | |||||
| /* > \verbatim */ | |||||
| /* > */ | |||||
| /* > CLARGV generates a vector of complex plane rotations with real */ | |||||
| /* > cosines, determined by elements of the complex vectors x and y. */ | |||||
| /* > For i = 1,2,...,n */ | |||||
| /* > */ | |||||
| /* > ( c(i) s(i) ) ( x(i) ) = ( r(i) ) */ | |||||
| /* > ( -conjg(s(i)) c(i) ) ( y(i) ) = ( 0 ) */ | |||||
| /* > */ | |||||
| /* > where c(i)**2 + ABS(s(i))**2 = 1 */ | |||||
| /* > */ | |||||
| /* > The following conventions are used (these are the same as in CLARTG, */ | |||||
| /* > but differ from the BLAS1 routine CROTG): */ | |||||
| /* > If y(i)=0, then c(i)=1 and s(i)=0. */ | |||||
| /* > If x(i)=0, then c(i)=0 and s(i) is chosen so that r(i) is real. */ | |||||
| /* > \endverbatim */ | |||||
| /* Arguments: */ | |||||
| /* ========== */ | |||||
| /* > \param[in] N */ | |||||
| /* > \verbatim */ | |||||
| /* > N is INTEGER */ | |||||
| /* > The number of plane rotations to be generated. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in,out] X */ | |||||
| /* > \verbatim */ | |||||
| /* > X is COMPLEX array, dimension (1+(N-1)*INCX) */ | |||||
| /* > On entry, the vector x. */ | |||||
| /* > On exit, x(i) is overwritten by r(i), for i = 1,...,n. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] INCX */ | |||||
| /* > \verbatim */ | |||||
| /* > INCX is INTEGER */ | |||||
| /* > The increment between elements of X. INCX > 0. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in,out] Y */ | |||||
| /* > \verbatim */ | |||||
| /* > Y is COMPLEX array, dimension (1+(N-1)*INCY) */ | |||||
| /* > On entry, the vector y. */ | |||||
| /* > On exit, the sines of the plane rotations. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] INCY */ | |||||
| /* > \verbatim */ | |||||
| /* > INCY is INTEGER */ | |||||
| /* > The increment between elements of Y. INCY > 0. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] C */ | |||||
| /* > \verbatim */ | |||||
| /* > C is REAL array, dimension (1+(N-1)*INCC) */ | |||||
| /* > The cosines of the plane rotations. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] INCC */ | |||||
| /* > \verbatim */ | |||||
| /* > INCC is INTEGER */ | |||||
| /* > The increment between elements of C. INCC > 0. */ | |||||
| /* > \endverbatim */ | |||||
| /* Authors: */ | |||||
| /* ======== */ | |||||
| /* > \author Univ. of Tennessee */ | |||||
| /* > \author Univ. of California Berkeley */ | |||||
| /* > \author Univ. of Colorado Denver */ | |||||
| /* > \author NAG Ltd. */ | |||||
| /* > \date December 2016 */ | |||||
| /* > \ingroup complexOTHERauxiliary */ | |||||
| /* > \par Further Details: */ | |||||
| /* ===================== */ | |||||
| /* > */ | |||||
| /* > \verbatim */ | |||||
| /* > */ | |||||
| /* > 6-6-96 - Modified with a new algorithm by W. Kahan and J. Demmel */ | |||||
| /* > */ | |||||
| /* > This version has a few statements commented out for thread safety */ | |||||
| /* > (machine parameters are computed on each entry). 10 feb 03, SJH. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* ===================================================================== */ | |||||
| /* Subroutine */ int clargv_(integer *n, complex *x, integer *incx, complex * | |||||
| y, integer *incy, real *c__, integer *incc) | |||||
| { | |||||
| /* System generated locals */ | |||||
| integer i__1, i__2; | |||||
| real r__1, r__2, r__3, r__4, r__5, r__6, r__7, r__8, r__9, r__10; | |||||
| complex q__1, q__2, q__3; | |||||
| /* Local variables */ | |||||
| real d__; | |||||
| complex f, g; | |||||
| integer i__, j; | |||||
| complex r__; | |||||
| real scale; | |||||
| integer count; | |||||
| real f2, g2, safmn2, safmx2; | |||||
| extern real slapy2_(real *, real *); | |||||
| integer ic; | |||||
| real di; | |||||
| complex ff; | |||||
| real cs, dr; | |||||
| complex fs, gs; | |||||
| integer ix, iy; | |||||
| complex sn; | |||||
| extern real slamch_(char *); | |||||
| real safmin, f2s, g2s, eps; | |||||
| /* -- LAPACK auxiliary routine (version 3.7.0) -- */ | |||||
| /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ | |||||
| /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ | |||||
| /* December 2016 */ | |||||
| /* ===================================================================== */ | |||||
| /* LOGICAL FIRST */ | |||||
| /* SAVE FIRST, SAFMX2, SAFMIN, SAFMN2 */ | |||||
| /* DATA FIRST / .TRUE. / */ | |||||
| /* IF( FIRST ) THEN */ | |||||
| /* FIRST = .FALSE. */ | |||||
| /* Parameter adjustments */ | |||||
| --c__; | |||||
| --y; | |||||
| --x; | |||||
| /* Function Body */ | |||||
| safmin = slamch_("S"); | |||||
| eps = slamch_("E"); | |||||
| r__1 = slamch_("B"); | |||||
| i__1 = (integer) (log(safmin / eps) / log(slamch_("B")) / 2.f); | |||||
| safmn2 = pow_ri(&r__1, &i__1); | |||||
| safmx2 = 1.f / safmn2; | |||||
| /* END IF */ | |||||
| ix = 1; | |||||
| iy = 1; | |||||
| ic = 1; | |||||
| i__1 = *n; | |||||
| for (i__ = 1; i__ <= i__1; ++i__) { | |||||
| i__2 = ix; | |||||
| f.r = x[i__2].r, f.i = x[i__2].i; | |||||
| i__2 = iy; | |||||
| g.r = y[i__2].r, g.i = y[i__2].i; | |||||
| /* Use identical algorithm as in CLARTG */ | |||||
| /* Computing MAX */ | |||||
| /* Computing MAX */ | |||||
| r__7 = (r__1 = f.r, abs(r__1)), r__8 = (r__2 = r_imag(&f), abs(r__2)); | |||||
| /* Computing MAX */ | |||||
| r__9 = (r__3 = g.r, abs(r__3)), r__10 = (r__4 = r_imag(&g), abs(r__4)) | |||||
| ; | |||||
| r__5 = f2cmax(r__7,r__8), r__6 = f2cmax(r__9,r__10); | |||||
| scale = f2cmax(r__5,r__6); | |||||
| fs.r = f.r, fs.i = f.i; | |||||
| gs.r = g.r, gs.i = g.i; | |||||
| count = 0; | |||||
| if (scale >= safmx2) { | |||||
| L10: | |||||
| ++count; | |||||
| q__1.r = safmn2 * fs.r, q__1.i = safmn2 * fs.i; | |||||
| fs.r = q__1.r, fs.i = q__1.i; | |||||
| q__1.r = safmn2 * gs.r, q__1.i = safmn2 * gs.i; | |||||
| gs.r = q__1.r, gs.i = q__1.i; | |||||
| scale *= safmn2; | |||||
| if (scale >= safmx2 && count < 20) { | |||||
| goto L10; | |||||
| } | |||||
| } else if (scale <= safmn2) { | |||||
| if (g.r == 0.f && g.i == 0.f) { | |||||
| cs = 1.f; | |||||
| sn.r = 0.f, sn.i = 0.f; | |||||
| r__.r = f.r, r__.i = f.i; | |||||
| goto L50; | |||||
| } | |||||
| L20: | |||||
| --count; | |||||
| q__1.r = safmx2 * fs.r, q__1.i = safmx2 * fs.i; | |||||
| fs.r = q__1.r, fs.i = q__1.i; | |||||
| q__1.r = safmx2 * gs.r, q__1.i = safmx2 * gs.i; | |||||
| gs.r = q__1.r, gs.i = q__1.i; | |||||
| scale *= safmx2; | |||||
| if (scale <= safmn2) { | |||||
| goto L20; | |||||
| } | |||||
| } | |||||
| /* Computing 2nd power */ | |||||
| r__1 = fs.r; | |||||
| /* Computing 2nd power */ | |||||
| r__2 = r_imag(&fs); | |||||
| f2 = r__1 * r__1 + r__2 * r__2; | |||||
| /* Computing 2nd power */ | |||||
| r__1 = gs.r; | |||||
| /* Computing 2nd power */ | |||||
| r__2 = r_imag(&gs); | |||||
| g2 = r__1 * r__1 + r__2 * r__2; | |||||
| if (f2 <= f2cmax(g2,1.f) * safmin) { | |||||
| /* This is a rare case: F is very small. */ | |||||
| if (f.r == 0.f && f.i == 0.f) { | |||||
| cs = 0.f; | |||||
| r__2 = g.r; | |||||
| r__3 = r_imag(&g); | |||||
| r__1 = slapy2_(&r__2, &r__3); | |||||
| r__.r = r__1, r__.i = 0.f; | |||||
| /* Do complex/real division explicitly with two real */ | |||||
| /* divisions */ | |||||
| r__1 = gs.r; | |||||
| r__2 = r_imag(&gs); | |||||
| d__ = slapy2_(&r__1, &r__2); | |||||
| r__1 = gs.r / d__; | |||||
| r__2 = -r_imag(&gs) / d__; | |||||
| q__1.r = r__1, q__1.i = r__2; | |||||
| sn.r = q__1.r, sn.i = q__1.i; | |||||
| goto L50; | |||||
| } | |||||
| r__1 = fs.r; | |||||
| r__2 = r_imag(&fs); | |||||
| f2s = slapy2_(&r__1, &r__2); | |||||
| /* G2 and G2S are accurate */ | |||||
| /* G2 is at least SAFMIN, and G2S is at least SAFMN2 */ | |||||
| g2s = sqrt(g2); | |||||
| /* Error in CS from underflow in F2S is at most */ | |||||
| /* UNFL / SAFMN2 .lt. sqrt(UNFL*EPS) .lt. EPS */ | |||||
| /* If MAX(G2,ONE)=G2, then F2 .lt. G2*SAFMIN, */ | |||||
| /* and so CS .lt. sqrt(SAFMIN) */ | |||||
| /* If MAX(G2,ONE)=ONE, then F2 .lt. SAFMIN */ | |||||
| /* and so CS .lt. sqrt(SAFMIN)/SAFMN2 = sqrt(EPS) */ | |||||
| /* Therefore, CS = F2S/G2S / sqrt( 1 + (F2S/G2S)**2 ) = F2S/G2S */ | |||||
| cs = f2s / g2s; | |||||
| /* Make sure abs(FF) = 1 */ | |||||
| /* Do complex/real division explicitly with 2 real divisions */ | |||||
| /* Computing MAX */ | |||||
| r__3 = (r__1 = f.r, abs(r__1)), r__4 = (r__2 = r_imag(&f), abs( | |||||
| r__2)); | |||||
| if (f2cmax(r__3,r__4) > 1.f) { | |||||
| r__1 = f.r; | |||||
| r__2 = r_imag(&f); | |||||
| d__ = slapy2_(&r__1, &r__2); | |||||
| r__1 = f.r / d__; | |||||
| r__2 = r_imag(&f) / d__; | |||||
| q__1.r = r__1, q__1.i = r__2; | |||||
| ff.r = q__1.r, ff.i = q__1.i; | |||||
| } else { | |||||
| dr = safmx2 * f.r; | |||||
| di = safmx2 * r_imag(&f); | |||||
| d__ = slapy2_(&dr, &di); | |||||
| r__1 = dr / d__; | |||||
| r__2 = di / d__; | |||||
| q__1.r = r__1, q__1.i = r__2; | |||||
| ff.r = q__1.r, ff.i = q__1.i; | |||||
| } | |||||
| r__1 = gs.r / g2s; | |||||
| r__2 = -r_imag(&gs) / g2s; | |||||
| q__2.r = r__1, q__2.i = r__2; | |||||
| q__1.r = ff.r * q__2.r - ff.i * q__2.i, q__1.i = ff.r * q__2.i + | |||||
| ff.i * q__2.r; | |||||
| sn.r = q__1.r, sn.i = q__1.i; | |||||
| q__2.r = cs * f.r, q__2.i = cs * f.i; | |||||
| q__3.r = sn.r * g.r - sn.i * g.i, q__3.i = sn.r * g.i + sn.i * | |||||
| g.r; | |||||
| q__1.r = q__2.r + q__3.r, q__1.i = q__2.i + q__3.i; | |||||
| r__.r = q__1.r, r__.i = q__1.i; | |||||
| } else { | |||||
| /* This is the most common case. */ | |||||
| /* Neither F2 nor F2/G2 are less than SAFMIN */ | |||||
| /* F2S cannot overflow, and it is accurate */ | |||||
| f2s = sqrt(g2 / f2 + 1.f); | |||||
| /* Do the F2S(real)*FS(complex) multiply with two real */ | |||||
| /* multiplies */ | |||||
| r__1 = f2s * fs.r; | |||||
| r__2 = f2s * r_imag(&fs); | |||||
| q__1.r = r__1, q__1.i = r__2; | |||||
| r__.r = q__1.r, r__.i = q__1.i; | |||||
| cs = 1.f / f2s; | |||||
| d__ = f2 + g2; | |||||
| /* Do complex/real division explicitly with two real divisions */ | |||||
| r__1 = r__.r / d__; | |||||
| r__2 = r_imag(&r__) / d__; | |||||
| q__1.r = r__1, q__1.i = r__2; | |||||
| sn.r = q__1.r, sn.i = q__1.i; | |||||
| r_cnjg(&q__2, &gs); | |||||
| q__1.r = sn.r * q__2.r - sn.i * q__2.i, q__1.i = sn.r * q__2.i + | |||||
| sn.i * q__2.r; | |||||
| sn.r = q__1.r, sn.i = q__1.i; | |||||
| if (count != 0) { | |||||
| if (count > 0) { | |||||
| i__2 = count; | |||||
| for (j = 1; j <= i__2; ++j) { | |||||
| q__1.r = safmx2 * r__.r, q__1.i = safmx2 * r__.i; | |||||
| r__.r = q__1.r, r__.i = q__1.i; | |||||
| /* L30: */ | |||||
| } | |||||
| } else { | |||||
| i__2 = -count; | |||||
| for (j = 1; j <= i__2; ++j) { | |||||
| q__1.r = safmn2 * r__.r, q__1.i = safmn2 * r__.i; | |||||
| r__.r = q__1.r, r__.i = q__1.i; | |||||
| /* L40: */ | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| L50: | |||||
| c__[ic] = cs; | |||||
| i__2 = iy; | |||||
| y[i__2].r = sn.r, y[i__2].i = sn.i; | |||||
| i__2 = ix; | |||||
| x[i__2].r = r__.r, x[i__2].i = r__.i; | |||||
| ic += *incc; | |||||
| iy += *incy; | |||||
| ix += *incx; | |||||
| /* L60: */ | |||||
| } | |||||
| return 0; | |||||
| /* End of CLARGV */ | |||||
| } /* clargv_ */ | |||||
| @@ -0,0 +1,607 @@ | |||||
| /* f2c.h -- Standard Fortran to C header file */ | |||||
| /** barf [ba:rf] 2. "He suggested using FORTRAN, and everybody barfed." | |||||
| - From The Shogakukan DICTIONARY OF NEW ENGLISH (Second edition) */ | |||||
| #ifndef F2C_INCLUDE | |||||
| #define F2C_INCLUDE | |||||
| #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 | |||||
| typedef int 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; | |||||
| 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;} | |||||
| #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)); } | |||||
| #define c_div(c, a, b) {pCf(c) = Cf(a)/Cf(b);} | |||||
| #define z_div(c, a, b) {pCd(c) = Cd(a)/Cd(b);} | |||||
| #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) = conj(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) (cimag(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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotc_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void cdotu_(complex *z, integer *n_, complex *x, integer *incx_, complex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotu_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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) | |||||
| */ | |||||
| /* > \brief \b CLARNV returns a vector of random numbers from a uniform or normal distribution. */ | |||||
| /* =========== DOCUMENTATION =========== */ | |||||
| /* Online html documentation available at */ | |||||
| /* http://www.netlib.org/lapack/explore-html/ */ | |||||
| /* > \htmlonly */ | |||||
| /* > Download CLARNV + dependencies */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/clarnv. | |||||
| f"> */ | |||||
| /* > [TGZ]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/clarnv. | |||||
| f"> */ | |||||
| /* > [ZIP]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/clarnv. | |||||
| f"> */ | |||||
| /* > [TXT]</a> */ | |||||
| /* > \endhtmlonly */ | |||||
| /* Definition: */ | |||||
| /* =========== */ | |||||
| /* SUBROUTINE CLARNV( IDIST, ISEED, N, X ) */ | |||||
| /* INTEGER IDIST, N */ | |||||
| /* INTEGER ISEED( 4 ) */ | |||||
| /* COMPLEX X( * ) */ | |||||
| /* > \par Purpose: */ | |||||
| /* ============= */ | |||||
| /* > */ | |||||
| /* > \verbatim */ | |||||
| /* > */ | |||||
| /* > CLARNV returns a vector of n random complex numbers from a uniform or */ | |||||
| /* > normal distribution. */ | |||||
| /* > \endverbatim */ | |||||
| /* Arguments: */ | |||||
| /* ========== */ | |||||
| /* > \param[in] IDIST */ | |||||
| /* > \verbatim */ | |||||
| /* > IDIST is INTEGER */ | |||||
| /* > Specifies the distribution of the random numbers: */ | |||||
| /* > = 1: real and imaginary parts each uniform (0,1) */ | |||||
| /* > = 2: real and imaginary parts each uniform (-1,1) */ | |||||
| /* > = 3: real and imaginary parts each normal (0,1) */ | |||||
| /* > = 4: uniformly distributed on the disc abs(z) < 1 */ | |||||
| /* > = 5: uniformly distributed on the circle abs(z) = 1 */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in,out] ISEED */ | |||||
| /* > \verbatim */ | |||||
| /* > ISEED is INTEGER array, dimension (4) */ | |||||
| /* > On entry, the seed of the random number generator; the array */ | |||||
| /* > elements must be between 0 and 4095, and ISEED(4) must be */ | |||||
| /* > odd. */ | |||||
| /* > On exit, the seed is updated. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] N */ | |||||
| /* > \verbatim */ | |||||
| /* > N is INTEGER */ | |||||
| /* > The number of random numbers to be generated. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] X */ | |||||
| /* > \verbatim */ | |||||
| /* > X is COMPLEX array, dimension (N) */ | |||||
| /* > The generated random numbers. */ | |||||
| /* > \endverbatim */ | |||||
| /* Authors: */ | |||||
| /* ======== */ | |||||
| /* > \author Univ. of Tennessee */ | |||||
| /* > \author Univ. of California Berkeley */ | |||||
| /* > \author Univ. of Colorado Denver */ | |||||
| /* > \author NAG Ltd. */ | |||||
| /* > \date December 2016 */ | |||||
| /* > \ingroup complexOTHERauxiliary */ | |||||
| /* > \par Further Details: */ | |||||
| /* ===================== */ | |||||
| /* > */ | |||||
| /* > \verbatim */ | |||||
| /* > */ | |||||
| /* > This routine calls the auxiliary routine SLARUV to generate random */ | |||||
| /* > real numbers from a uniform (0,1) distribution, in batches of up to */ | |||||
| /* > 128 using vectorisable code. The Box-Muller method is used to */ | |||||
| /* > transform numbers from a uniform to a normal distribution. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* ===================================================================== */ | |||||
| /* Subroutine */ int clarnv_(integer *idist, integer *iseed, integer *n, | |||||
| complex *x) | |||||
| { | |||||
| /* System generated locals */ | |||||
| integer i__1, i__2, i__3, i__4, i__5; | |||||
| real r__1, r__2; | |||||
| complex q__1, q__2, q__3; | |||||
| /* Local variables */ | |||||
| integer i__; | |||||
| real u[128]; | |||||
| integer il, iv; | |||||
| extern /* Subroutine */ int slaruv_(integer *, integer *, real *); | |||||
| /* -- LAPACK auxiliary routine (version 3.7.0) -- */ | |||||
| /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ | |||||
| /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ | |||||
| /* December 2016 */ | |||||
| /* ===================================================================== */ | |||||
| /* Parameter adjustments */ | |||||
| --x; | |||||
| --iseed; | |||||
| /* Function Body */ | |||||
| i__1 = *n; | |||||
| for (iv = 1; iv <= i__1; iv += 64) { | |||||
| /* Computing MIN */ | |||||
| i__2 = 64, i__3 = *n - iv + 1; | |||||
| il = f2cmin(i__2,i__3); | |||||
| /* Call SLARUV to generate 2*IL real numbers from a uniform (0,1) */ | |||||
| /* distribution (2*IL <= LV) */ | |||||
| i__2 = il << 1; | |||||
| slaruv_(&iseed[1], &i__2, u); | |||||
| if (*idist == 1) { | |||||
| /* Copy generated numbers */ | |||||
| i__2 = il; | |||||
| for (i__ = 1; i__ <= i__2; ++i__) { | |||||
| i__3 = iv + i__ - 1; | |||||
| i__4 = (i__ << 1) - 2; | |||||
| i__5 = (i__ << 1) - 1; | |||||
| q__1.r = u[i__4], q__1.i = u[i__5]; | |||||
| x[i__3].r = q__1.r, x[i__3].i = q__1.i; | |||||
| /* L10: */ | |||||
| } | |||||
| } else if (*idist == 2) { | |||||
| /* Convert generated numbers to uniform (-1,1) distribution */ | |||||
| i__2 = il; | |||||
| for (i__ = 1; i__ <= i__2; ++i__) { | |||||
| i__3 = iv + i__ - 1; | |||||
| r__1 = u[(i__ << 1) - 2] * 2.f - 1.f; | |||||
| r__2 = u[(i__ << 1) - 1] * 2.f - 1.f; | |||||
| q__1.r = r__1, q__1.i = r__2; | |||||
| x[i__3].r = q__1.r, x[i__3].i = q__1.i; | |||||
| /* L20: */ | |||||
| } | |||||
| } else if (*idist == 3) { | |||||
| /* Convert generated numbers to normal (0,1) distribution */ | |||||
| i__2 = il; | |||||
| for (i__ = 1; i__ <= i__2; ++i__) { | |||||
| i__3 = iv + i__ - 1; | |||||
| r__1 = sqrt(log(u[(i__ << 1) - 2]) * -2.f); | |||||
| r__2 = u[(i__ << 1) - 1] * 6.2831853071795864769252867663f; | |||||
| q__3.r = 0.f, q__3.i = r__2; | |||||
| c_exp(&q__2, &q__3); | |||||
| q__1.r = r__1 * q__2.r, q__1.i = r__1 * q__2.i; | |||||
| x[i__3].r = q__1.r, x[i__3].i = q__1.i; | |||||
| /* L30: */ | |||||
| } | |||||
| } else if (*idist == 4) { | |||||
| /* Convert generated numbers to complex numbers uniformly */ | |||||
| /* distributed on the unit disk */ | |||||
| i__2 = il; | |||||
| for (i__ = 1; i__ <= i__2; ++i__) { | |||||
| i__3 = iv + i__ - 1; | |||||
| r__1 = sqrt(u[(i__ << 1) - 2]); | |||||
| r__2 = u[(i__ << 1) - 1] * 6.2831853071795864769252867663f; | |||||
| q__3.r = 0.f, q__3.i = r__2; | |||||
| c_exp(&q__2, &q__3); | |||||
| q__1.r = r__1 * q__2.r, q__1.i = r__1 * q__2.i; | |||||
| x[i__3].r = q__1.r, x[i__3].i = q__1.i; | |||||
| /* L40: */ | |||||
| } | |||||
| } else if (*idist == 5) { | |||||
| /* Convert generated numbers to complex numbers uniformly */ | |||||
| /* distributed on the unit circle */ | |||||
| i__2 = il; | |||||
| for (i__ = 1; i__ <= i__2; ++i__) { | |||||
| i__3 = iv + i__ - 1; | |||||
| r__1 = u[(i__ << 1) - 1] * 6.2831853071795864769252867663f; | |||||
| q__2.r = 0.f, q__2.i = r__1; | |||||
| c_exp(&q__1, &q__2); | |||||
| x[i__3].r = q__1.r, x[i__3].i = q__1.i; | |||||
| /* L50: */ | |||||
| } | |||||
| } | |||||
| /* L60: */ | |||||
| } | |||||
| return 0; | |||||
| /* End of CLARNV */ | |||||
| } /* clarnv_ */ | |||||
| @@ -0,0 +1,519 @@ | |||||
| /* f2c.h -- Standard Fortran to C header file */ | |||||
| /** barf [ba:rf] 2. "He suggested using FORTRAN, and everybody barfed." | |||||
| - From The Shogakukan DICTIONARY OF NEW ENGLISH (Second edition) */ | |||||
| #ifndef F2C_INCLUDE | |||||
| #define F2C_INCLUDE | |||||
| #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 | |||||
| typedef int 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; | |||||
| 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;} | |||||
| #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)); } | |||||
| #define c_div(c, a, b) {pCf(c) = Cf(a)/Cf(b);} | |||||
| #define z_div(c, a, b) {pCd(c) = Cd(a)/Cd(b);} | |||||
| #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) = conj(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) (cimag(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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotc_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void cdotu_(complex *z, integer *n_, complex *x, integer *incx_, complex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotu_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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) | |||||
| */ | |||||
| /* > \brief \b CLARSCL2 performs reciprocal diagonal scaling on a vector. */ | |||||
| /* =========== DOCUMENTATION =========== */ | |||||
| /* Online html documentation available at */ | |||||
| /* http://www.netlib.org/lapack/explore-html/ */ | |||||
| /* > \htmlonly */ | |||||
| /* > Download CLARSCL2 + dependencies */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/clarscl | |||||
| 2.f"> */ | |||||
| /* > [TGZ]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/clarscl | |||||
| 2.f"> */ | |||||
| /* > [ZIP]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/clarscl | |||||
| 2.f"> */ | |||||
| /* > [TXT]</a> */ | |||||
| /* > \endhtmlonly */ | |||||
| /* Definition: */ | |||||
| /* =========== */ | |||||
| /* SUBROUTINE CLARSCL2 ( M, N, D, X, LDX ) */ | |||||
| /* INTEGER M, N, LDX */ | |||||
| /* COMPLEX X( LDX, * ) */ | |||||
| /* REAL D( * ) */ | |||||
| /* > \par Purpose: */ | |||||
| /* ============= */ | |||||
| /* > */ | |||||
| /* > \verbatim */ | |||||
| /* > */ | |||||
| /* > CLARSCL2 performs a reciprocal diagonal scaling on an vector: */ | |||||
| /* > x <-- inv(D) * x */ | |||||
| /* > where the REAL diagonal matrix D is stored as a vector. */ | |||||
| /* > */ | |||||
| /* > Eventually to be replaced by BLAS_cge_diag_scale in the new BLAS */ | |||||
| /* > standard. */ | |||||
| /* > \endverbatim */ | |||||
| /* Arguments: */ | |||||
| /* ========== */ | |||||
| /* > \param[in] M */ | |||||
| /* > \verbatim */ | |||||
| /* > M is INTEGER */ | |||||
| /* > The number of rows of D and X. M >= 0. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] N */ | |||||
| /* > \verbatim */ | |||||
| /* > N is INTEGER */ | |||||
| /* > The number of columns of X. N >= 0. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] D */ | |||||
| /* > \verbatim */ | |||||
| /* > D is REAL array, length M */ | |||||
| /* > Diagonal matrix D, stored as a vector of length M. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in,out] X */ | |||||
| /* > \verbatim */ | |||||
| /* > X is COMPLEX array, dimension (LDX,N) */ | |||||
| /* > On entry, the vector X to be scaled by D. */ | |||||
| /* > On exit, the scaled vector. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] LDX */ | |||||
| /* > \verbatim */ | |||||
| /* > LDX is INTEGER */ | |||||
| /* > The leading dimension of the vector X. LDX >= M. */ | |||||
| /* > \endverbatim */ | |||||
| /* Authors: */ | |||||
| /* ======== */ | |||||
| /* > \author Univ. of Tennessee */ | |||||
| /* > \author Univ. of California Berkeley */ | |||||
| /* > \author Univ. of Colorado Denver */ | |||||
| /* > \author NAG Ltd. */ | |||||
| /* > \date June 2016 */ | |||||
| /* > \ingroup complexOTHERcomputational */ | |||||
| /* ===================================================================== */ | |||||
| /* Subroutine */ int clarscl2_(integer *m, integer *n, real *d__, complex *x, | |||||
| integer *ldx) | |||||
| { | |||||
| /* System generated locals */ | |||||
| integer x_dim1, x_offset, i__1, i__2, i__3, i__4, i__5; | |||||
| complex q__1; | |||||
| /* Local variables */ | |||||
| integer i__, j; | |||||
| /* -- LAPACK computational routine (version 3.7.0) -- */ | |||||
| /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ | |||||
| /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ | |||||
| /* June 2016 */ | |||||
| /* ===================================================================== */ | |||||
| /* Parameter adjustments */ | |||||
| --d__; | |||||
| x_dim1 = *ldx; | |||||
| x_offset = 1 + x_dim1 * 1; | |||||
| x -= x_offset; | |||||
| /* Function Body */ | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| i__2 = *m; | |||||
| for (i__ = 1; i__ <= i__2; ++i__) { | |||||
| i__3 = i__ + j * x_dim1; | |||||
| i__4 = i__ + j * x_dim1; | |||||
| i__5 = i__; | |||||
| q__1.r = x[i__4].r / d__[i__5], q__1.i = x[i__4].i / d__[i__5]; | |||||
| x[i__3].r = q__1.r, x[i__3].i = q__1.i; | |||||
| } | |||||
| } | |||||
| return 0; | |||||
| } /* clarscl2_ */ | |||||
| @@ -0,0 +1,695 @@ | |||||
| /* f2c.h -- Standard Fortran to C header file */ | |||||
| /** barf [ba:rf] 2. "He suggested using FORTRAN, and everybody barfed." | |||||
| - From The Shogakukan DICTIONARY OF NEW ENGLISH (Second edition) */ | |||||
| #ifndef F2C_INCLUDE | |||||
| #define F2C_INCLUDE | |||||
| #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 | |||||
| typedef int 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; | |||||
| 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;} | |||||
| #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)); } | |||||
| #define c_div(c, a, b) {pCf(c) = Cf(a)/Cf(b);} | |||||
| #define z_div(c, a, b) {pCd(c) = Cd(a)/Cd(b);} | |||||
| #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) = conj(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) (cimag(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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotc_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void cdotu_(complex *z, integer *n_, complex *x, integer *incx_, complex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotu_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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) | |||||
| */ | |||||
| /* > \brief \b CLARTG generates a plane rotation with real cosine and complex sine. */ | |||||
| /* =========== DOCUMENTATION =========== */ | |||||
| /* Online html documentation available at */ | |||||
| /* http://www.netlib.org/lapack/explore-html/ */ | |||||
| /* > \htmlonly */ | |||||
| /* > Download CLARTG + dependencies */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/clartg. | |||||
| f"> */ | |||||
| /* > [TGZ]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/clartg. | |||||
| f"> */ | |||||
| /* > [ZIP]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/clartg. | |||||
| f"> */ | |||||
| /* > [TXT]</a> */ | |||||
| /* > \endhtmlonly */ | |||||
| /* Definition: */ | |||||
| /* =========== */ | |||||
| /* SUBROUTINE CLARTG( F, G, CS, SN, R ) */ | |||||
| /* REAL CS */ | |||||
| /* COMPLEX F, G, R, SN */ | |||||
| /* > \par Purpose: */ | |||||
| /* ============= */ | |||||
| /* > */ | |||||
| /* > \verbatim */ | |||||
| /* > */ | |||||
| /* > CLARTG generates a plane rotation so that */ | |||||
| /* > */ | |||||
| /* > [ CS SN ] [ F ] [ R ] */ | |||||
| /* > [ __ ] . [ ] = [ ] where CS**2 + |SN|**2 = 1. */ | |||||
| /* > [ -SN CS ] [ G ] [ 0 ] */ | |||||
| /* > */ | |||||
| /* > This is a faster version of the BLAS1 routine CROTG, except for */ | |||||
| /* > the following differences: */ | |||||
| /* > F and G are unchanged on return. */ | |||||
| /* > If G=0, then CS=1 and SN=0. */ | |||||
| /* > If F=0, then CS=0 and SN is chosen so that R is real. */ | |||||
| /* > \endverbatim */ | |||||
| /* Arguments: */ | |||||
| /* ========== */ | |||||
| /* > \param[in] F */ | |||||
| /* > \verbatim */ | |||||
| /* > F is COMPLEX */ | |||||
| /* > The first component of vector to be rotated. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] G */ | |||||
| /* > \verbatim */ | |||||
| /* > G is COMPLEX */ | |||||
| /* > The second component of vector to be rotated. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] CS */ | |||||
| /* > \verbatim */ | |||||
| /* > CS is REAL */ | |||||
| /* > The cosine of the rotation. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] SN */ | |||||
| /* > \verbatim */ | |||||
| /* > SN is COMPLEX */ | |||||
| /* > The sine of the rotation. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] R */ | |||||
| /* > \verbatim */ | |||||
| /* > R is COMPLEX */ | |||||
| /* > The nonzero component of the rotated vector. */ | |||||
| /* > \endverbatim */ | |||||
| /* Authors: */ | |||||
| /* ======== */ | |||||
| /* > \author Univ. of Tennessee */ | |||||
| /* > \author Univ. of California Berkeley */ | |||||
| /* > \author Univ. of Colorado Denver */ | |||||
| /* > \author NAG Ltd. */ | |||||
| /* > \date December 2016 */ | |||||
| /* > \ingroup complexOTHERauxiliary */ | |||||
| /* > \par Further Details: */ | |||||
| /* ===================== */ | |||||
| /* > */ | |||||
| /* > \verbatim */ | |||||
| /* > */ | |||||
| /* > 3-5-96 - Modified with a new algorithm by W. Kahan and J. Demmel */ | |||||
| /* > */ | |||||
| /* > This version has a few statements commented out for thread safety */ | |||||
| /* > (machine parameters are computed on each entry). 10 feb 03, SJH. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* ===================================================================== */ | |||||
| /* Subroutine */ int clartg_(complex *f, complex *g, real *cs, complex *sn, | |||||
| complex *r__) | |||||
| { | |||||
| /* System generated locals */ | |||||
| integer i__1; | |||||
| real r__1, r__2, r__3, r__4, r__5, r__6, r__7, r__8, r__9, r__10; | |||||
| complex q__1, q__2, q__3; | |||||
| /* Local variables */ | |||||
| real d__; | |||||
| integer i__; | |||||
| real scale; | |||||
| integer count; | |||||
| real f2, g2, safmn2, safmx2; | |||||
| extern real slapy2_(real *, real *); | |||||
| complex ff; | |||||
| real di, dr; | |||||
| complex fs, gs; | |||||
| extern real slamch_(char *); | |||||
| real safmin; | |||||
| extern logical sisnan_(real *); | |||||
| real f2s, g2s, eps; | |||||
| /* -- LAPACK auxiliary routine (version 3.7.0) -- */ | |||||
| /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ | |||||
| /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ | |||||
| /* December 2016 */ | |||||
| /* ===================================================================== */ | |||||
| /* LOGICAL FIRST */ | |||||
| safmin = slamch_("S"); | |||||
| eps = slamch_("E"); | |||||
| r__1 = slamch_("B"); | |||||
| i__1 = (integer) (log(safmin / eps) / log(slamch_("B")) / 2.f); | |||||
| safmn2 = pow_ri(&r__1, &i__1); | |||||
| safmx2 = 1.f / safmn2; | |||||
| /* Computing MAX */ | |||||
| /* Computing MAX */ | |||||
| r__7 = (r__1 = f->r, abs(r__1)), r__8 = (r__2 = r_imag(f), abs(r__2)); | |||||
| /* Computing MAX */ | |||||
| r__9 = (r__3 = g->r, abs(r__3)), r__10 = (r__4 = r_imag(g), abs(r__4)); | |||||
| r__5 = f2cmax(r__7,r__8), r__6 = f2cmax(r__9,r__10); | |||||
| scale = f2cmax(r__5,r__6); | |||||
| fs.r = f->r, fs.i = f->i; | |||||
| gs.r = g->r, gs.i = g->i; | |||||
| count = 0; | |||||
| if (scale >= safmx2) { | |||||
| L10: | |||||
| ++count; | |||||
| q__1.r = safmn2 * fs.r, q__1.i = safmn2 * fs.i; | |||||
| fs.r = q__1.r, fs.i = q__1.i; | |||||
| q__1.r = safmn2 * gs.r, q__1.i = safmn2 * gs.i; | |||||
| gs.r = q__1.r, gs.i = q__1.i; | |||||
| scale *= safmn2; | |||||
| if (scale >= safmx2 && count < 20) { | |||||
| goto L10; | |||||
| } | |||||
| } else if (scale <= safmn2) { | |||||
| r__1 = c_abs(g); | |||||
| if (g->r == 0.f && g->i == 0.f || sisnan_(&r__1)) { | |||||
| *cs = 1.f; | |||||
| sn->r = 0.f, sn->i = 0.f; | |||||
| r__->r = f->r, r__->i = f->i; | |||||
| return 0; | |||||
| } | |||||
| L20: | |||||
| --count; | |||||
| q__1.r = safmx2 * fs.r, q__1.i = safmx2 * fs.i; | |||||
| fs.r = q__1.r, fs.i = q__1.i; | |||||
| q__1.r = safmx2 * gs.r, q__1.i = safmx2 * gs.i; | |||||
| gs.r = q__1.r, gs.i = q__1.i; | |||||
| scale *= safmx2; | |||||
| if (scale <= safmn2) { | |||||
| goto L20; | |||||
| } | |||||
| } | |||||
| /* Computing 2nd power */ | |||||
| r__1 = fs.r; | |||||
| /* Computing 2nd power */ | |||||
| r__2 = r_imag(&fs); | |||||
| f2 = r__1 * r__1 + r__2 * r__2; | |||||
| /* Computing 2nd power */ | |||||
| r__1 = gs.r; | |||||
| /* Computing 2nd power */ | |||||
| r__2 = r_imag(&gs); | |||||
| g2 = r__1 * r__1 + r__2 * r__2; | |||||
| if (f2 <= f2cmax(g2,1.f) * safmin) { | |||||
| /* This is a rare case: F is very small. */ | |||||
| if (f->r == 0.f && f->i == 0.f) { | |||||
| *cs = 0.f; | |||||
| r__2 = g->r; | |||||
| r__3 = r_imag(g); | |||||
| r__1 = slapy2_(&r__2, &r__3); | |||||
| r__->r = r__1, r__->i = 0.f; | |||||
| /* Do complex/real division explicitly with two real divisions */ | |||||
| r__1 = gs.r; | |||||
| r__2 = r_imag(&gs); | |||||
| d__ = slapy2_(&r__1, &r__2); | |||||
| r__1 = gs.r / d__; | |||||
| r__2 = -r_imag(&gs) / d__; | |||||
| q__1.r = r__1, q__1.i = r__2; | |||||
| sn->r = q__1.r, sn->i = q__1.i; | |||||
| return 0; | |||||
| } | |||||
| r__1 = fs.r; | |||||
| r__2 = r_imag(&fs); | |||||
| f2s = slapy2_(&r__1, &r__2); | |||||
| /* G2 and G2S are accurate */ | |||||
| /* G2 is at least SAFMIN, and G2S is at least SAFMN2 */ | |||||
| g2s = sqrt(g2); | |||||
| /* Error in CS from underflow in F2S is at most */ | |||||
| /* UNFL / SAFMN2 .lt. sqrt(UNFL*EPS) .lt. EPS */ | |||||
| /* If MAX(G2,ONE)=G2, then F2 .lt. G2*SAFMIN, */ | |||||
| /* and so CS .lt. sqrt(SAFMIN) */ | |||||
| /* If MAX(G2,ONE)=ONE, then F2 .lt. SAFMIN */ | |||||
| /* and so CS .lt. sqrt(SAFMIN)/SAFMN2 = sqrt(EPS) */ | |||||
| /* Therefore, CS = F2S/G2S / sqrt( 1 + (F2S/G2S)**2 ) = F2S/G2S */ | |||||
| *cs = f2s / g2s; | |||||
| /* Make sure abs(FF) = 1 */ | |||||
| /* Do complex/real division explicitly with 2 real divisions */ | |||||
| /* Computing MAX */ | |||||
| r__3 = (r__1 = f->r, abs(r__1)), r__4 = (r__2 = r_imag(f), abs(r__2)); | |||||
| if (f2cmax(r__3,r__4) > 1.f) { | |||||
| r__1 = f->r; | |||||
| r__2 = r_imag(f); | |||||
| d__ = slapy2_(&r__1, &r__2); | |||||
| r__1 = f->r / d__; | |||||
| r__2 = r_imag(f) / d__; | |||||
| q__1.r = r__1, q__1.i = r__2; | |||||
| ff.r = q__1.r, ff.i = q__1.i; | |||||
| } else { | |||||
| dr = safmx2 * f->r; | |||||
| di = safmx2 * r_imag(f); | |||||
| d__ = slapy2_(&dr, &di); | |||||
| r__1 = dr / d__; | |||||
| r__2 = di / d__; | |||||
| q__1.r = r__1, q__1.i = r__2; | |||||
| ff.r = q__1.r, ff.i = q__1.i; | |||||
| } | |||||
| r__1 = gs.r / g2s; | |||||
| r__2 = -r_imag(&gs) / g2s; | |||||
| q__2.r = r__1, q__2.i = r__2; | |||||
| q__1.r = ff.r * q__2.r - ff.i * q__2.i, q__1.i = ff.r * q__2.i + ff.i | |||||
| * q__2.r; | |||||
| sn->r = q__1.r, sn->i = q__1.i; | |||||
| q__2.r = *cs * f->r, q__2.i = *cs * f->i; | |||||
| q__3.r = sn->r * g->r - sn->i * g->i, q__3.i = sn->r * g->i + sn->i * | |||||
| g->r; | |||||
| q__1.r = q__2.r + q__3.r, q__1.i = q__2.i + q__3.i; | |||||
| r__->r = q__1.r, r__->i = q__1.i; | |||||
| } else { | |||||
| /* This is the most common case. */ | |||||
| /* Neither F2 nor F2/G2 are less than SAFMIN */ | |||||
| /* F2S cannot overflow, and it is accurate */ | |||||
| f2s = sqrt(g2 / f2 + 1.f); | |||||
| /* Do the F2S(real)*FS(complex) multiply with two real multiplies */ | |||||
| r__1 = f2s * fs.r; | |||||
| r__2 = f2s * r_imag(&fs); | |||||
| q__1.r = r__1, q__1.i = r__2; | |||||
| r__->r = q__1.r, r__->i = q__1.i; | |||||
| *cs = 1.f / f2s; | |||||
| d__ = f2 + g2; | |||||
| /* Do complex/real division explicitly with two real divisions */ | |||||
| r__1 = r__->r / d__; | |||||
| r__2 = r_imag(r__) / d__; | |||||
| q__1.r = r__1, q__1.i = r__2; | |||||
| sn->r = q__1.r, sn->i = q__1.i; | |||||
| r_cnjg(&q__2, &gs); | |||||
| q__1.r = sn->r * q__2.r - sn->i * q__2.i, q__1.i = sn->r * q__2.i + | |||||
| sn->i * q__2.r; | |||||
| sn->r = q__1.r, sn->i = q__1.i; | |||||
| if (count != 0) { | |||||
| if (count > 0) { | |||||
| i__1 = count; | |||||
| for (i__ = 1; i__ <= i__1; ++i__) { | |||||
| q__1.r = safmx2 * r__->r, q__1.i = safmx2 * r__->i; | |||||
| r__->r = q__1.r, r__->i = q__1.i; | |||||
| /* L30: */ | |||||
| } | |||||
| } else { | |||||
| i__1 = -count; | |||||
| for (i__ = 1; i__ <= i__1; ++i__) { | |||||
| q__1.r = safmn2 * r__->r, q__1.i = safmn2 * r__->i; | |||||
| r__->r = q__1.r, r__->i = q__1.i; | |||||
| /* L40: */ | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| return 0; | |||||
| /* End of CLARTG */ | |||||
| } /* clartg_ */ | |||||
| @@ -0,0 +1,559 @@ | |||||
| /* f2c.h -- Standard Fortran to C header file */ | |||||
| /** barf [ba:rf] 2. "He suggested using FORTRAN, and everybody barfed." | |||||
| - From The Shogakukan DICTIONARY OF NEW ENGLISH (Second edition) */ | |||||
| #ifndef F2C_INCLUDE | |||||
| #define F2C_INCLUDE | |||||
| #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 | |||||
| typedef int 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; | |||||
| 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;} | |||||
| #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)); } | |||||
| #define c_div(c, a, b) {pCf(c) = Cf(a)/Cf(b);} | |||||
| #define z_div(c, a, b) {pCd(c) = Cd(a)/Cd(b);} | |||||
| #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) = conj(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) (cimag(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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotc_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void cdotu_(complex *z, integer *n_, complex *x, integer *incx_, complex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotu_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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) | |||||
| */ | |||||
| /* > \brief \b CLARTV applies a vector of plane rotations with real cosines and complex sines to the elements | |||||
| of a pair of vectors. */ | |||||
| /* =========== DOCUMENTATION =========== */ | |||||
| /* Online html documentation available at */ | |||||
| /* http://www.netlib.org/lapack/explore-html/ */ | |||||
| /* > \htmlonly */ | |||||
| /* > Download CLARTV + dependencies */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/clartv. | |||||
| f"> */ | |||||
| /* > [TGZ]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/clartv. | |||||
| f"> */ | |||||
| /* > [ZIP]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/clartv. | |||||
| f"> */ | |||||
| /* > [TXT]</a> */ | |||||
| /* > \endhtmlonly */ | |||||
| /* Definition: */ | |||||
| /* =========== */ | |||||
| /* SUBROUTINE CLARTV( N, X, INCX, Y, INCY, C, S, INCC ) */ | |||||
| /* INTEGER INCC, INCX, INCY, N */ | |||||
| /* REAL C( * ) */ | |||||
| /* COMPLEX S( * ), X( * ), Y( * ) */ | |||||
| /* > \par Purpose: */ | |||||
| /* ============= */ | |||||
| /* > */ | |||||
| /* > \verbatim */ | |||||
| /* > */ | |||||
| /* > CLARTV applies a vector of complex plane rotations with real cosines */ | |||||
| /* > to elements of the complex vectors x and y. For i = 1,2,...,n */ | |||||
| /* > */ | |||||
| /* > ( x(i) ) := ( c(i) s(i) ) ( x(i) ) */ | |||||
| /* > ( y(i) ) ( -conjg(s(i)) c(i) ) ( y(i) ) */ | |||||
| /* > \endverbatim */ | |||||
| /* Arguments: */ | |||||
| /* ========== */ | |||||
| /* > \param[in] N */ | |||||
| /* > \verbatim */ | |||||
| /* > N is INTEGER */ | |||||
| /* > The number of plane rotations to be applied. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in,out] X */ | |||||
| /* > \verbatim */ | |||||
| /* > X is COMPLEX array, dimension (1+(N-1)*INCX) */ | |||||
| /* > The vector x. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] INCX */ | |||||
| /* > \verbatim */ | |||||
| /* > INCX is INTEGER */ | |||||
| /* > The increment between elements of X. INCX > 0. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in,out] Y */ | |||||
| /* > \verbatim */ | |||||
| /* > Y is COMPLEX array, dimension (1+(N-1)*INCY) */ | |||||
| /* > The vector y. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] INCY */ | |||||
| /* > \verbatim */ | |||||
| /* > INCY is INTEGER */ | |||||
| /* > The increment between elements of Y. INCY > 0. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] C */ | |||||
| /* > \verbatim */ | |||||
| /* > C is REAL array, dimension (1+(N-1)*INCC) */ | |||||
| /* > The cosines of the plane rotations. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] S */ | |||||
| /* > \verbatim */ | |||||
| /* > S is COMPLEX array, dimension (1+(N-1)*INCC) */ | |||||
| /* > The sines of the plane rotations. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] INCC */ | |||||
| /* > \verbatim */ | |||||
| /* > INCC is INTEGER */ | |||||
| /* > The increment between elements of C and S. INCC > 0. */ | |||||
| /* > \endverbatim */ | |||||
| /* Authors: */ | |||||
| /* ======== */ | |||||
| /* > \author Univ. of Tennessee */ | |||||
| /* > \author Univ. of California Berkeley */ | |||||
| /* > \author Univ. of Colorado Denver */ | |||||
| /* > \author NAG Ltd. */ | |||||
| /* > \date December 2016 */ | |||||
| /* > \ingroup complexOTHERauxiliary */ | |||||
| /* ===================================================================== */ | |||||
| /* Subroutine */ int clartv_(integer *n, complex *x, integer *incx, complex * | |||||
| y, integer *incy, real *c__, complex *s, integer *incc) | |||||
| { | |||||
| /* System generated locals */ | |||||
| integer i__1, i__2, i__3, i__4; | |||||
| complex q__1, q__2, q__3, q__4; | |||||
| /* Local variables */ | |||||
| integer i__, ic, ix, iy; | |||||
| complex xi, yi; | |||||
| /* -- LAPACK auxiliary routine (version 3.7.0) -- */ | |||||
| /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ | |||||
| /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ | |||||
| /* December 2016 */ | |||||
| /* ===================================================================== */ | |||||
| /* Parameter adjustments */ | |||||
| --s; | |||||
| --c__; | |||||
| --y; | |||||
| --x; | |||||
| /* Function Body */ | |||||
| ix = 1; | |||||
| iy = 1; | |||||
| ic = 1; | |||||
| i__1 = *n; | |||||
| for (i__ = 1; i__ <= i__1; ++i__) { | |||||
| i__2 = ix; | |||||
| xi.r = x[i__2].r, xi.i = x[i__2].i; | |||||
| i__2 = iy; | |||||
| yi.r = y[i__2].r, yi.i = y[i__2].i; | |||||
| i__2 = ix; | |||||
| i__3 = ic; | |||||
| q__2.r = c__[i__3] * xi.r, q__2.i = c__[i__3] * xi.i; | |||||
| i__4 = ic; | |||||
| q__3.r = s[i__4].r * yi.r - s[i__4].i * yi.i, q__3.i = s[i__4].r * | |||||
| yi.i + s[i__4].i * yi.r; | |||||
| q__1.r = q__2.r + q__3.r, q__1.i = q__2.i + q__3.i; | |||||
| x[i__2].r = q__1.r, x[i__2].i = q__1.i; | |||||
| i__2 = iy; | |||||
| i__3 = ic; | |||||
| q__2.r = c__[i__3] * yi.r, q__2.i = c__[i__3] * yi.i; | |||||
| r_cnjg(&q__4, &s[ic]); | |||||
| q__3.r = q__4.r * xi.r - q__4.i * xi.i, q__3.i = q__4.r * xi.i + | |||||
| q__4.i * xi.r; | |||||
| q__1.r = q__2.r - q__3.r, q__1.i = q__2.i - q__3.i; | |||||
| y[i__2].r = q__1.r, y[i__2].i = q__1.i; | |||||
| ix += *incx; | |||||
| iy += *incy; | |||||
| ic += *incc; | |||||
| /* L10: */ | |||||
| } | |||||
| return 0; | |||||
| /* End of CLARTV */ | |||||
| } /* clartv_ */ | |||||
| @@ -0,0 +1,644 @@ | |||||
| /* f2c.h -- Standard Fortran to C header file */ | |||||
| /** barf [ba:rf] 2. "He suggested using FORTRAN, and everybody barfed." | |||||
| - From The Shogakukan DICTIONARY OF NEW ENGLISH (Second edition) */ | |||||
| #ifndef F2C_INCLUDE | |||||
| #define F2C_INCLUDE | |||||
| #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 | |||||
| typedef int 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; | |||||
| 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;} | |||||
| #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)); } | |||||
| #define c_div(c, a, b) {pCf(c) = Cf(a)/Cf(b);} | |||||
| #define z_div(c, a, b) {pCd(c) = Cd(a)/Cd(b);} | |||||
| #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) = conj(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) (cimag(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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotc_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void cdotu_(complex *z, integer *n_, complex *x, integer *incx_, complex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotu_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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) | |||||
| */ | |||||
| /* Table of constant values */ | |||||
| static complex c_b1 = {1.f,0.f}; | |||||
| static integer c__1 = 1; | |||||
| /* > \brief \b CLARZ applies an elementary reflector (as returned by stzrzf) to a general matrix. */ | |||||
| /* =========== DOCUMENTATION =========== */ | |||||
| /* Online html documentation available at */ | |||||
| /* http://www.netlib.org/lapack/explore-html/ */ | |||||
| /* > \htmlonly */ | |||||
| /* > Download CLARZ + dependencies */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/clarz.f | |||||
| "> */ | |||||
| /* > [TGZ]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/clarz.f | |||||
| "> */ | |||||
| /* > [ZIP]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/clarz.f | |||||
| "> */ | |||||
| /* > [TXT]</a> */ | |||||
| /* > \endhtmlonly */ | |||||
| /* Definition: */ | |||||
| /* =========== */ | |||||
| /* SUBROUTINE CLARZ( SIDE, M, N, L, V, INCV, TAU, C, LDC, WORK ) */ | |||||
| /* CHARACTER SIDE */ | |||||
| /* INTEGER INCV, L, LDC, M, N */ | |||||
| /* COMPLEX TAU */ | |||||
| /* COMPLEX C( LDC, * ), V( * ), WORK( * ) */ | |||||
| /* > \par Purpose: */ | |||||
| /* ============= */ | |||||
| /* > */ | |||||
| /* > \verbatim */ | |||||
| /* > */ | |||||
| /* > CLARZ applies a complex elementary reflector H to a complex */ | |||||
| /* > M-by-N matrix C, from either the left or the right. H is represented */ | |||||
| /* > in the form */ | |||||
| /* > */ | |||||
| /* > H = I - tau * v * v**H */ | |||||
| /* > */ | |||||
| /* > where tau is a complex scalar and v is a complex vector. */ | |||||
| /* > */ | |||||
| /* > If tau = 0, then H is taken to be the unit matrix. */ | |||||
| /* > */ | |||||
| /* > To apply H**H (the conjugate transpose of H), supply conjg(tau) instead */ | |||||
| /* > tau. */ | |||||
| /* > */ | |||||
| /* > H is a product of k elementary reflectors as returned by CTZRZF. */ | |||||
| /* > \endverbatim */ | |||||
| /* Arguments: */ | |||||
| /* ========== */ | |||||
| /* > \param[in] SIDE */ | |||||
| /* > \verbatim */ | |||||
| /* > SIDE is CHARACTER*1 */ | |||||
| /* > = 'L': form H * C */ | |||||
| /* > = 'R': form C * H */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] M */ | |||||
| /* > \verbatim */ | |||||
| /* > M is INTEGER */ | |||||
| /* > The number of rows of the matrix C. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] N */ | |||||
| /* > \verbatim */ | |||||
| /* > N is INTEGER */ | |||||
| /* > The number of columns of the matrix C. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] L */ | |||||
| /* > \verbatim */ | |||||
| /* > L is INTEGER */ | |||||
| /* > The number of entries of the vector V containing */ | |||||
| /* > the meaningful part of the Householder vectors. */ | |||||
| /* > If SIDE = 'L', M >= L >= 0, if SIDE = 'R', N >= L >= 0. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] V */ | |||||
| /* > \verbatim */ | |||||
| /* > V is COMPLEX array, dimension (1+(L-1)*abs(INCV)) */ | |||||
| /* > The vector v in the representation of H as returned by */ | |||||
| /* > CTZRZF. V is not used if TAU = 0. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] INCV */ | |||||
| /* > \verbatim */ | |||||
| /* > INCV is INTEGER */ | |||||
| /* > The increment between elements of v. INCV <> 0. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] TAU */ | |||||
| /* > \verbatim */ | |||||
| /* > TAU is COMPLEX */ | |||||
| /* > The value tau in the representation of H. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in,out] C */ | |||||
| /* > \verbatim */ | |||||
| /* > C is COMPLEX array, dimension (LDC,N) */ | |||||
| /* > On entry, the M-by-N matrix C. */ | |||||
| /* > On exit, C is overwritten by the matrix H * C if SIDE = 'L', */ | |||||
| /* > or C * H if SIDE = 'R'. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] LDC */ | |||||
| /* > \verbatim */ | |||||
| /* > LDC is INTEGER */ | |||||
| /* > The leading dimension of the array C. LDC >= f2cmax(1,M). */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] WORK */ | |||||
| /* > \verbatim */ | |||||
| /* > WORK is COMPLEX array, dimension */ | |||||
| /* > (N) if SIDE = 'L' */ | |||||
| /* > or (M) if SIDE = 'R' */ | |||||
| /* > \endverbatim */ | |||||
| /* Authors: */ | |||||
| /* ======== */ | |||||
| /* > \author Univ. of Tennessee */ | |||||
| /* > \author Univ. of California Berkeley */ | |||||
| /* > \author Univ. of Colorado Denver */ | |||||
| /* > \author NAG Ltd. */ | |||||
| /* > \date December 2016 */ | |||||
| /* > \ingroup complexOTHERcomputational */ | |||||
| /* > \par Contributors: */ | |||||
| /* ================== */ | |||||
| /* > */ | |||||
| /* > A. Petitet, Computer Science Dept., Univ. of Tenn., Knoxville, USA */ | |||||
| /* > \par Further Details: */ | |||||
| /* ===================== */ | |||||
| /* > */ | |||||
| /* > \verbatim */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* ===================================================================== */ | |||||
| /* Subroutine */ int clarz_(char *side, integer *m, integer *n, integer *l, | |||||
| complex *v, integer *incv, complex *tau, complex *c__, integer *ldc, | |||||
| complex *work) | |||||
| { | |||||
| /* System generated locals */ | |||||
| integer c_dim1, c_offset; | |||||
| complex q__1; | |||||
| /* Local variables */ | |||||
| extern /* Subroutine */ int cgerc_(integer *, integer *, complex *, | |||||
| complex *, integer *, complex *, integer *, complex *, integer *), | |||||
| cgemv_(char *, integer *, integer *, complex *, complex *, | |||||
| integer *, complex *, integer *, complex *, complex *, integer *); | |||||
| extern logical lsame_(char *, char *); | |||||
| extern /* Subroutine */ int cgeru_(integer *, integer *, complex *, | |||||
| complex *, integer *, complex *, integer *, complex *, integer *), | |||||
| ccopy_(integer *, complex *, integer *, complex *, integer *), | |||||
| caxpy_(integer *, complex *, complex *, integer *, complex *, | |||||
| integer *), clacgv_(integer *, complex *, integer *); | |||||
| /* -- LAPACK computational routine (version 3.7.0) -- */ | |||||
| /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ | |||||
| /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ | |||||
| /* December 2016 */ | |||||
| /* ===================================================================== */ | |||||
| /* Parameter adjustments */ | |||||
| --v; | |||||
| c_dim1 = *ldc; | |||||
| c_offset = 1 + c_dim1 * 1; | |||||
| c__ -= c_offset; | |||||
| --work; | |||||
| /* Function Body */ | |||||
| if (lsame_(side, "L")) { | |||||
| /* Form H * C */ | |||||
| if (tau->r != 0.f || tau->i != 0.f) { | |||||
| /* w( 1:n ) = conjg( C( 1, 1:n ) ) */ | |||||
| ccopy_(n, &c__[c_offset], ldc, &work[1], &c__1); | |||||
| clacgv_(n, &work[1], &c__1); | |||||
| /* w( 1:n ) = conjg( w( 1:n ) + C( m-l+1:m, 1:n )**H * v( 1:l ) ) */ | |||||
| cgemv_("Conjugate transpose", l, n, &c_b1, &c__[*m - *l + 1 + | |||||
| c_dim1], ldc, &v[1], incv, &c_b1, &work[1], &c__1); | |||||
| clacgv_(n, &work[1], &c__1); | |||||
| /* C( 1, 1:n ) = C( 1, 1:n ) - tau * w( 1:n ) */ | |||||
| q__1.r = -tau->r, q__1.i = -tau->i; | |||||
| caxpy_(n, &q__1, &work[1], &c__1, &c__[c_offset], ldc); | |||||
| /* C( m-l+1:m, 1:n ) = C( m-l+1:m, 1:n ) - ... */ | |||||
| /* tau * v( 1:l ) * w( 1:n )**H */ | |||||
| q__1.r = -tau->r, q__1.i = -tau->i; | |||||
| cgeru_(l, n, &q__1, &v[1], incv, &work[1], &c__1, &c__[*m - *l + | |||||
| 1 + c_dim1], ldc); | |||||
| } | |||||
| } else { | |||||
| /* Form C * H */ | |||||
| if (tau->r != 0.f || tau->i != 0.f) { | |||||
| /* w( 1:m ) = C( 1:m, 1 ) */ | |||||
| ccopy_(m, &c__[c_offset], &c__1, &work[1], &c__1); | |||||
| /* w( 1:m ) = w( 1:m ) + C( 1:m, n-l+1:n, 1:n ) * v( 1:l ) */ | |||||
| cgemv_("No transpose", m, l, &c_b1, &c__[(*n - *l + 1) * c_dim1 + | |||||
| 1], ldc, &v[1], incv, &c_b1, &work[1], &c__1); | |||||
| /* C( 1:m, 1 ) = C( 1:m, 1 ) - tau * w( 1:m ) */ | |||||
| q__1.r = -tau->r, q__1.i = -tau->i; | |||||
| caxpy_(m, &q__1, &work[1], &c__1, &c__[c_offset], &c__1); | |||||
| /* C( 1:m, n-l+1:n ) = C( 1:m, n-l+1:n ) - ... */ | |||||
| /* tau * w( 1:m ) * v( 1:l )**H */ | |||||
| q__1.r = -tau->r, q__1.i = -tau->i; | |||||
| cgerc_(m, l, &q__1, &work[1], &c__1, &v[1], incv, &c__[(*n - *l + | |||||
| 1) * c_dim1 + 1], ldc); | |||||
| } | |||||
| } | |||||
| return 0; | |||||
| /* End of CLARZ */ | |||||
| } /* clarz_ */ | |||||
| @@ -0,0 +1,786 @@ | |||||
| /* f2c.h -- Standard Fortran to C header file */ | |||||
| /** barf [ba:rf] 2. "He suggested using FORTRAN, and everybody barfed." | |||||
| - From The Shogakukan DICTIONARY OF NEW ENGLISH (Second edition) */ | |||||
| #ifndef F2C_INCLUDE | |||||
| #define F2C_INCLUDE | |||||
| #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 | |||||
| typedef int 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; | |||||
| 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;} | |||||
| #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)); } | |||||
| #define c_div(c, a, b) {pCf(c) = Cf(a)/Cf(b);} | |||||
| #define z_div(c, a, b) {pCd(c) = Cd(a)/Cd(b);} | |||||
| #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) = conj(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) (cimag(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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotc_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void cdotu_(complex *z, integer *n_, complex *x, integer *incx_, complex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotu_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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) | |||||
| */ | |||||
| /* Table of constant values */ | |||||
| static complex c_b1 = {1.f,0.f}; | |||||
| static integer c__1 = 1; | |||||
| /* > \brief \b CLARZB applies a block reflector or its conjugate-transpose to a general matrix. */ | |||||
| /* =========== DOCUMENTATION =========== */ | |||||
| /* Online html documentation available at */ | |||||
| /* http://www.netlib.org/lapack/explore-html/ */ | |||||
| /* > \htmlonly */ | |||||
| /* > Download CLARZB + dependencies */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/clarzb. | |||||
| f"> */ | |||||
| /* > [TGZ]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/clarzb. | |||||
| f"> */ | |||||
| /* > [ZIP]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/clarzb. | |||||
| f"> */ | |||||
| /* > [TXT]</a> */ | |||||
| /* > \endhtmlonly */ | |||||
| /* Definition: */ | |||||
| /* =========== */ | |||||
| /* SUBROUTINE CLARZB( SIDE, TRANS, DIRECT, STOREV, M, N, K, L, V, */ | |||||
| /* LDV, T, LDT, C, LDC, WORK, LDWORK ) */ | |||||
| /* CHARACTER DIRECT, SIDE, STOREV, TRANS */ | |||||
| /* INTEGER K, L, LDC, LDT, LDV, LDWORK, M, N */ | |||||
| /* COMPLEX C( LDC, * ), T( LDT, * ), V( LDV, * ), */ | |||||
| /* $ WORK( LDWORK, * ) */ | |||||
| /* > \par Purpose: */ | |||||
| /* ============= */ | |||||
| /* > */ | |||||
| /* > \verbatim */ | |||||
| /* > */ | |||||
| /* > CLARZB applies a complex block reflector H or its transpose H**H */ | |||||
| /* > to a complex distributed M-by-N C from the left or the right. */ | |||||
| /* > */ | |||||
| /* > Currently, only STOREV = 'R' and DIRECT = 'B' are supported. */ | |||||
| /* > \endverbatim */ | |||||
| /* Arguments: */ | |||||
| /* ========== */ | |||||
| /* > \param[in] SIDE */ | |||||
| /* > \verbatim */ | |||||
| /* > SIDE is CHARACTER*1 */ | |||||
| /* > = 'L': apply H or H**H from the Left */ | |||||
| /* > = 'R': apply H or H**H from the Right */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] TRANS */ | |||||
| /* > \verbatim */ | |||||
| /* > TRANS is CHARACTER*1 */ | |||||
| /* > = 'N': apply H (No transpose) */ | |||||
| /* > = 'C': apply H**H (Conjugate transpose) */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] DIRECT */ | |||||
| /* > \verbatim */ | |||||
| /* > DIRECT is CHARACTER*1 */ | |||||
| /* > Indicates how H is formed from a product of elementary */ | |||||
| /* > reflectors */ | |||||
| /* > = 'F': H = H(1) H(2) . . . H(k) (Forward, not supported yet) */ | |||||
| /* > = 'B': H = H(k) . . . H(2) H(1) (Backward) */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] STOREV */ | |||||
| /* > \verbatim */ | |||||
| /* > STOREV is CHARACTER*1 */ | |||||
| /* > Indicates how the vectors which define the elementary */ | |||||
| /* > reflectors are stored: */ | |||||
| /* > = 'C': Columnwise (not supported yet) */ | |||||
| /* > = 'R': Rowwise */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] M */ | |||||
| /* > \verbatim */ | |||||
| /* > M is INTEGER */ | |||||
| /* > The number of rows of the matrix C. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] N */ | |||||
| /* > \verbatim */ | |||||
| /* > N is INTEGER */ | |||||
| /* > The number of columns of the matrix C. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] K */ | |||||
| /* > \verbatim */ | |||||
| /* > K is INTEGER */ | |||||
| /* > The order of the matrix T (= the number of elementary */ | |||||
| /* > reflectors whose product defines the block reflector). */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] L */ | |||||
| /* > \verbatim */ | |||||
| /* > L is INTEGER */ | |||||
| /* > The number of columns of the matrix V containing the */ | |||||
| /* > meaningful part of the Householder reflectors. */ | |||||
| /* > If SIDE = 'L', M >= L >= 0, if SIDE = 'R', N >= L >= 0. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] V */ | |||||
| /* > \verbatim */ | |||||
| /* > V is COMPLEX array, dimension (LDV,NV). */ | |||||
| /* > If STOREV = 'C', NV = K; if STOREV = 'R', NV = L. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] LDV */ | |||||
| /* > \verbatim */ | |||||
| /* > LDV is INTEGER */ | |||||
| /* > The leading dimension of the array V. */ | |||||
| /* > If STOREV = 'C', LDV >= L; if STOREV = 'R', LDV >= K. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] T */ | |||||
| /* > \verbatim */ | |||||
| /* > T is COMPLEX array, dimension (LDT,K) */ | |||||
| /* > The triangular K-by-K matrix T in the representation of the */ | |||||
| /* > block reflector. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] LDT */ | |||||
| /* > \verbatim */ | |||||
| /* > LDT is INTEGER */ | |||||
| /* > The leading dimension of the array T. LDT >= K. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in,out] C */ | |||||
| /* > \verbatim */ | |||||
| /* > C is COMPLEX array, dimension (LDC,N) */ | |||||
| /* > On entry, the M-by-N matrix C. */ | |||||
| /* > On exit, C is overwritten by H*C or H**H*C or C*H or C*H**H. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] LDC */ | |||||
| /* > \verbatim */ | |||||
| /* > LDC is INTEGER */ | |||||
| /* > The leading dimension of the array C. LDC >= f2cmax(1,M). */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] WORK */ | |||||
| /* > \verbatim */ | |||||
| /* > WORK is COMPLEX array, dimension (LDWORK,K) */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] LDWORK */ | |||||
| /* > \verbatim */ | |||||
| /* > LDWORK is INTEGER */ | |||||
| /* > The leading dimension of the array WORK. */ | |||||
| /* > If SIDE = 'L', LDWORK >= f2cmax(1,N); */ | |||||
| /* > if SIDE = 'R', LDWORK >= f2cmax(1,M). */ | |||||
| /* > \endverbatim */ | |||||
| /* Authors: */ | |||||
| /* ======== */ | |||||
| /* > \author Univ. of Tennessee */ | |||||
| /* > \author Univ. of California Berkeley */ | |||||
| /* > \author Univ. of Colorado Denver */ | |||||
| /* > \author NAG Ltd. */ | |||||
| /* > \date December 2016 */ | |||||
| /* > \ingroup complexOTHERcomputational */ | |||||
| /* > \par Contributors: */ | |||||
| /* ================== */ | |||||
| /* > */ | |||||
| /* > A. Petitet, Computer Science Dept., Univ. of Tenn., Knoxville, USA */ | |||||
| /* > \par Further Details: */ | |||||
| /* ===================== */ | |||||
| /* > */ | |||||
| /* > \verbatim */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* ===================================================================== */ | |||||
| /* Subroutine */ int clarzb_(char *side, char *trans, char *direct, char * | |||||
| storev, integer *m, integer *n, integer *k, integer *l, complex *v, | |||||
| integer *ldv, complex *t, integer *ldt, complex *c__, integer *ldc, | |||||
| complex *work, integer *ldwork) | |||||
| { | |||||
| /* System generated locals */ | |||||
| integer c_dim1, c_offset, t_dim1, t_offset, v_dim1, v_offset, work_dim1, | |||||
| work_offset, i__1, i__2, i__3, i__4, i__5; | |||||
| complex q__1; | |||||
| /* Local variables */ | |||||
| integer info, i__, j; | |||||
| extern /* Subroutine */ int cgemm_(char *, char *, integer *, integer *, | |||||
| integer *, complex *, complex *, integer *, complex *, integer *, | |||||
| complex *, complex *, integer *); | |||||
| extern logical lsame_(char *, char *); | |||||
| extern /* Subroutine */ int ccopy_(integer *, complex *, integer *, | |||||
| complex *, integer *), ctrmm_(char *, char *, char *, char *, | |||||
| integer *, integer *, complex *, complex *, integer *, complex *, | |||||
| integer *), clacgv_(integer *, | |||||
| complex *, integer *), xerbla_(char *, integer *, ftnlen); | |||||
| char transt[1]; | |||||
| /* -- LAPACK computational routine (version 3.7.0) -- */ | |||||
| /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ | |||||
| /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ | |||||
| /* December 2016 */ | |||||
| /* ===================================================================== */ | |||||
| /* Quick return if possible */ | |||||
| /* Parameter adjustments */ | |||||
| v_dim1 = *ldv; | |||||
| v_offset = 1 + v_dim1 * 1; | |||||
| v -= v_offset; | |||||
| t_dim1 = *ldt; | |||||
| t_offset = 1 + t_dim1 * 1; | |||||
| t -= t_offset; | |||||
| c_dim1 = *ldc; | |||||
| c_offset = 1 + c_dim1 * 1; | |||||
| c__ -= c_offset; | |||||
| work_dim1 = *ldwork; | |||||
| work_offset = 1 + work_dim1 * 1; | |||||
| work -= work_offset; | |||||
| /* Function Body */ | |||||
| if (*m <= 0 || *n <= 0) { | |||||
| return 0; | |||||
| } | |||||
| /* Check for currently supported options */ | |||||
| info = 0; | |||||
| if (! lsame_(direct, "B")) { | |||||
| info = -3; | |||||
| } else if (! lsame_(storev, "R")) { | |||||
| info = -4; | |||||
| } | |||||
| if (info != 0) { | |||||
| i__1 = -info; | |||||
| xerbla_("CLARZB", &i__1, (ftnlen)6); | |||||
| return 0; | |||||
| } | |||||
| if (lsame_(trans, "N")) { | |||||
| *(unsigned char *)transt = 'C'; | |||||
| } else { | |||||
| *(unsigned char *)transt = 'N'; | |||||
| } | |||||
| if (lsame_(side, "L")) { | |||||
| /* Form H * C or H**H * C */ | |||||
| /* W( 1:n, 1:k ) = C( 1:k, 1:n )**H */ | |||||
| i__1 = *k; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| ccopy_(n, &c__[j + c_dim1], ldc, &work[j * work_dim1 + 1], &c__1); | |||||
| /* L10: */ | |||||
| } | |||||
| /* W( 1:n, 1:k ) = W( 1:n, 1:k ) + ... */ | |||||
| /* C( m-l+1:m, 1:n )**H * V( 1:k, 1:l )**T */ | |||||
| if (*l > 0) { | |||||
| cgemm_("Transpose", "Conjugate transpose", n, k, l, &c_b1, &c__[* | |||||
| m - *l + 1 + c_dim1], ldc, &v[v_offset], ldv, &c_b1, & | |||||
| work[work_offset], ldwork); | |||||
| } | |||||
| /* W( 1:n, 1:k ) = W( 1:n, 1:k ) * T**T or W( 1:m, 1:k ) * T */ | |||||
| ctrmm_("Right", "Lower", transt, "Non-unit", n, k, &c_b1, &t[t_offset] | |||||
| , ldt, &work[work_offset], ldwork); | |||||
| /* C( 1:k, 1:n ) = C( 1:k, 1:n ) - W( 1:n, 1:k )**H */ | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| i__2 = *k; | |||||
| for (i__ = 1; i__ <= i__2; ++i__) { | |||||
| i__3 = i__ + j * c_dim1; | |||||
| i__4 = i__ + j * c_dim1; | |||||
| i__5 = j + i__ * work_dim1; | |||||
| q__1.r = c__[i__4].r - work[i__5].r, q__1.i = c__[i__4].i - | |||||
| work[i__5].i; | |||||
| c__[i__3].r = q__1.r, c__[i__3].i = q__1.i; | |||||
| /* L20: */ | |||||
| } | |||||
| /* L30: */ | |||||
| } | |||||
| /* C( m-l+1:m, 1:n ) = C( m-l+1:m, 1:n ) - ... */ | |||||
| /* V( 1:k, 1:l )**H * W( 1:n, 1:k )**H */ | |||||
| if (*l > 0) { | |||||
| q__1.r = -1.f, q__1.i = 0.f; | |||||
| cgemm_("Transpose", "Transpose", l, n, k, &q__1, &v[v_offset], | |||||
| ldv, &work[work_offset], ldwork, &c_b1, &c__[*m - *l + 1 | |||||
| + c_dim1], ldc); | |||||
| } | |||||
| } else if (lsame_(side, "R")) { | |||||
| /* Form C * H or C * H**H */ | |||||
| /* W( 1:m, 1:k ) = C( 1:m, 1:k ) */ | |||||
| i__1 = *k; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| ccopy_(m, &c__[j * c_dim1 + 1], &c__1, &work[j * work_dim1 + 1], & | |||||
| c__1); | |||||
| /* L40: */ | |||||
| } | |||||
| /* W( 1:m, 1:k ) = W( 1:m, 1:k ) + ... */ | |||||
| /* C( 1:m, n-l+1:n ) * V( 1:k, 1:l )**H */ | |||||
| if (*l > 0) { | |||||
| cgemm_("No transpose", "Transpose", m, k, l, &c_b1, &c__[(*n - *l | |||||
| + 1) * c_dim1 + 1], ldc, &v[v_offset], ldv, &c_b1, &work[ | |||||
| work_offset], ldwork); | |||||
| } | |||||
| /* W( 1:m, 1:k ) = W( 1:m, 1:k ) * conjg( T ) or */ | |||||
| /* W( 1:m, 1:k ) * T**H */ | |||||
| i__1 = *k; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| i__2 = *k - j + 1; | |||||
| clacgv_(&i__2, &t[j + j * t_dim1], &c__1); | |||||
| /* L50: */ | |||||
| } | |||||
| ctrmm_("Right", "Lower", trans, "Non-unit", m, k, &c_b1, &t[t_offset], | |||||
| ldt, &work[work_offset], ldwork); | |||||
| i__1 = *k; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| i__2 = *k - j + 1; | |||||
| clacgv_(&i__2, &t[j + j * t_dim1], &c__1); | |||||
| /* L60: */ | |||||
| } | |||||
| /* C( 1:m, 1:k ) = C( 1:m, 1:k ) - W( 1:m, 1:k ) */ | |||||
| i__1 = *k; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| i__2 = *m; | |||||
| for (i__ = 1; i__ <= i__2; ++i__) { | |||||
| i__3 = i__ + j * c_dim1; | |||||
| i__4 = i__ + j * c_dim1; | |||||
| i__5 = i__ + j * work_dim1; | |||||
| q__1.r = c__[i__4].r - work[i__5].r, q__1.i = c__[i__4].i - | |||||
| work[i__5].i; | |||||
| c__[i__3].r = q__1.r, c__[i__3].i = q__1.i; | |||||
| /* L70: */ | |||||
| } | |||||
| /* L80: */ | |||||
| } | |||||
| /* C( 1:m, n-l+1:n ) = C( 1:m, n-l+1:n ) - ... */ | |||||
| /* W( 1:m, 1:k ) * conjg( V( 1:k, 1:l ) ) */ | |||||
| i__1 = *l; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| clacgv_(k, &v[j * v_dim1 + 1], &c__1); | |||||
| /* L90: */ | |||||
| } | |||||
| if (*l > 0) { | |||||
| q__1.r = -1.f, q__1.i = 0.f; | |||||
| cgemm_("No transpose", "No transpose", m, l, k, &q__1, &work[ | |||||
| work_offset], ldwork, &v[v_offset], ldv, &c_b1, &c__[(*n | |||||
| - *l + 1) * c_dim1 + 1], ldc); | |||||
| } | |||||
| i__1 = *l; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| clacgv_(k, &v[j * v_dim1 + 1], &c__1); | |||||
| /* L100: */ | |||||
| } | |||||
| } | |||||
| return 0; | |||||
| /* End of CLARZB */ | |||||
| } /* clarzb_ */ | |||||
| @@ -0,0 +1,676 @@ | |||||
| /* f2c.h -- Standard Fortran to C header file */ | |||||
| /** barf [ba:rf] 2. "He suggested using FORTRAN, and everybody barfed." | |||||
| - From The Shogakukan DICTIONARY OF NEW ENGLISH (Second edition) */ | |||||
| #ifndef F2C_INCLUDE | |||||
| #define F2C_INCLUDE | |||||
| #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 | |||||
| typedef int 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; | |||||
| 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;} | |||||
| #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)); } | |||||
| #define c_div(c, a, b) {pCf(c) = Cf(a)/Cf(b);} | |||||
| #define z_div(c, a, b) {pCd(c) = Cd(a)/Cd(b);} | |||||
| #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) = conj(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) (cimag(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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotc_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void cdotu_(complex *z, integer *n_, complex *x, integer *incx_, complex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotu_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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) | |||||
| */ | |||||
| /* Table of constant values */ | |||||
| static complex c_b1 = {0.f,0.f}; | |||||
| static integer c__1 = 1; | |||||
| /* > \brief \b CLARZT forms the triangular factor T of a block reflector H = I - vtvH. */ | |||||
| /* =========== DOCUMENTATION =========== */ | |||||
| /* Online html documentation available at */ | |||||
| /* http://www.netlib.org/lapack/explore-html/ */ | |||||
| /* > \htmlonly */ | |||||
| /* > Download CLARZT + dependencies */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/clarzt. | |||||
| f"> */ | |||||
| /* > [TGZ]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/clarzt. | |||||
| f"> */ | |||||
| /* > [ZIP]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/clarzt. | |||||
| f"> */ | |||||
| /* > [TXT]</a> */ | |||||
| /* > \endhtmlonly */ | |||||
| /* Definition: */ | |||||
| /* =========== */ | |||||
| /* SUBROUTINE CLARZT( DIRECT, STOREV, N, K, V, LDV, TAU, T, LDT ) */ | |||||
| /* CHARACTER DIRECT, STOREV */ | |||||
| /* INTEGER K, LDT, LDV, N */ | |||||
| /* COMPLEX T( LDT, * ), TAU( * ), V( LDV, * ) */ | |||||
| /* > \par Purpose: */ | |||||
| /* ============= */ | |||||
| /* > */ | |||||
| /* > \verbatim */ | |||||
| /* > */ | |||||
| /* > CLARZT forms the triangular factor T of a complex block reflector */ | |||||
| /* > H of order > n, which is defined as a product of k elementary */ | |||||
| /* > reflectors. */ | |||||
| /* > */ | |||||
| /* > If DIRECT = 'F', H = H(1) H(2) . . . H(k) and T is upper triangular; */ | |||||
| /* > */ | |||||
| /* > If DIRECT = 'B', H = H(k) . . . H(2) H(1) and T is lower triangular. */ | |||||
| /* > */ | |||||
| /* > If STOREV = 'C', the vector which defines the elementary reflector */ | |||||
| /* > H(i) is stored in the i-th column of the array V, and */ | |||||
| /* > */ | |||||
| /* > H = I - V * T * V**H */ | |||||
| /* > */ | |||||
| /* > If STOREV = 'R', the vector which defines the elementary reflector */ | |||||
| /* > H(i) is stored in the i-th row of the array V, and */ | |||||
| /* > */ | |||||
| /* > H = I - V**H * T * V */ | |||||
| /* > */ | |||||
| /* > Currently, only STOREV = 'R' and DIRECT = 'B' are supported. */ | |||||
| /* > \endverbatim */ | |||||
| /* Arguments: */ | |||||
| /* ========== */ | |||||
| /* > \param[in] DIRECT */ | |||||
| /* > \verbatim */ | |||||
| /* > DIRECT is CHARACTER*1 */ | |||||
| /* > Specifies the order in which the elementary reflectors are */ | |||||
| /* > multiplied to form the block reflector: */ | |||||
| /* > = 'F': H = H(1) H(2) . . . H(k) (Forward, not supported yet) */ | |||||
| /* > = 'B': H = H(k) . . . H(2) H(1) (Backward) */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] STOREV */ | |||||
| /* > \verbatim */ | |||||
| /* > STOREV is CHARACTER*1 */ | |||||
| /* > Specifies how the vectors which define the elementary */ | |||||
| /* > reflectors are stored (see also Further Details): */ | |||||
| /* > = 'C': columnwise (not supported yet) */ | |||||
| /* > = 'R': rowwise */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] N */ | |||||
| /* > \verbatim */ | |||||
| /* > N is INTEGER */ | |||||
| /* > The order of the block reflector H. N >= 0. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] K */ | |||||
| /* > \verbatim */ | |||||
| /* > K is INTEGER */ | |||||
| /* > The order of the triangular factor T (= the number of */ | |||||
| /* > elementary reflectors). K >= 1. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in,out] V */ | |||||
| /* > \verbatim */ | |||||
| /* > V is COMPLEX array, dimension */ | |||||
| /* > (LDV,K) if STOREV = 'C' */ | |||||
| /* > (LDV,N) if STOREV = 'R' */ | |||||
| /* > The matrix V. See further details. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] LDV */ | |||||
| /* > \verbatim */ | |||||
| /* > LDV is INTEGER */ | |||||
| /* > The leading dimension of the array V. */ | |||||
| /* > If STOREV = 'C', LDV >= f2cmax(1,N); if STOREV = 'R', LDV >= K. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] TAU */ | |||||
| /* > \verbatim */ | |||||
| /* > TAU is COMPLEX array, dimension (K) */ | |||||
| /* > TAU(i) must contain the scalar factor of the elementary */ | |||||
| /* > reflector H(i). */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] T */ | |||||
| /* > \verbatim */ | |||||
| /* > T is COMPLEX array, dimension (LDT,K) */ | |||||
| /* > The k by k triangular factor T of the block reflector. */ | |||||
| /* > If DIRECT = 'F', T is upper triangular; if DIRECT = 'B', T is */ | |||||
| /* > lower triangular. The rest of the array is not used. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] LDT */ | |||||
| /* > \verbatim */ | |||||
| /* > LDT is INTEGER */ | |||||
| /* > The leading dimension of the array T. LDT >= K. */ | |||||
| /* > \endverbatim */ | |||||
| /* Authors: */ | |||||
| /* ======== */ | |||||
| /* > \author Univ. of Tennessee */ | |||||
| /* > \author Univ. of California Berkeley */ | |||||
| /* > \author Univ. of Colorado Denver */ | |||||
| /* > \author NAG Ltd. */ | |||||
| /* > \date December 2016 */ | |||||
| /* > \ingroup complexOTHERcomputational */ | |||||
| /* > \par Contributors: */ | |||||
| /* ================== */ | |||||
| /* > */ | |||||
| /* > A. Petitet, Computer Science Dept., Univ. of Tenn., Knoxville, USA */ | |||||
| /* > \par Further Details: */ | |||||
| /* ===================== */ | |||||
| /* > */ | |||||
| /* > \verbatim */ | |||||
| /* > */ | |||||
| /* > The shape of the matrix V and the storage of the vectors which define */ | |||||
| /* > the H(i) is best illustrated by the following example with n = 5 and */ | |||||
| /* > k = 3. The elements equal to 1 are not stored; the corresponding */ | |||||
| /* > array elements are modified but restored on exit. The rest of the */ | |||||
| /* > array is not used. */ | |||||
| /* > */ | |||||
| /* > DIRECT = 'F' and STOREV = 'C': DIRECT = 'F' and STOREV = 'R': */ | |||||
| /* > */ | |||||
| /* > ______V_____ */ | |||||
| /* > ( v1 v2 v3 ) / \ */ | |||||
| /* > ( v1 v2 v3 ) ( v1 v1 v1 v1 v1 . . . . 1 ) */ | |||||
| /* > V = ( v1 v2 v3 ) ( v2 v2 v2 v2 v2 . . . 1 ) */ | |||||
| /* > ( v1 v2 v3 ) ( v3 v3 v3 v3 v3 . . 1 ) */ | |||||
| /* > ( v1 v2 v3 ) */ | |||||
| /* > . . . */ | |||||
| /* > . . . */ | |||||
| /* > 1 . . */ | |||||
| /* > 1 . */ | |||||
| /* > 1 */ | |||||
| /* > */ | |||||
| /* > DIRECT = 'B' and STOREV = 'C': DIRECT = 'B' and STOREV = 'R': */ | |||||
| /* > */ | |||||
| /* > ______V_____ */ | |||||
| /* > 1 / \ */ | |||||
| /* > . 1 ( 1 . . . . v1 v1 v1 v1 v1 ) */ | |||||
| /* > . . 1 ( . 1 . . . v2 v2 v2 v2 v2 ) */ | |||||
| /* > . . . ( . . 1 . . v3 v3 v3 v3 v3 ) */ | |||||
| /* > . . . */ | |||||
| /* > ( v1 v2 v3 ) */ | |||||
| /* > ( v1 v2 v3 ) */ | |||||
| /* > V = ( v1 v2 v3 ) */ | |||||
| /* > ( v1 v2 v3 ) */ | |||||
| /* > ( v1 v2 v3 ) */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* ===================================================================== */ | |||||
| /* Subroutine */ int clarzt_(char *direct, char *storev, integer *n, integer * | |||||
| k, complex *v, integer *ldv, complex *tau, complex *t, integer *ldt) | |||||
| { | |||||
| /* System generated locals */ | |||||
| integer t_dim1, t_offset, v_dim1, v_offset, i__1, i__2; | |||||
| complex q__1; | |||||
| /* Local variables */ | |||||
| integer info, i__, j; | |||||
| extern /* Subroutine */ int cgemv_(char *, integer *, integer *, complex * | |||||
| , complex *, integer *, complex *, integer *, complex *, complex * | |||||
| , integer *); | |||||
| extern logical lsame_(char *, char *); | |||||
| extern /* Subroutine */ int ctrmv_(char *, char *, char *, integer *, | |||||
| complex *, integer *, complex *, integer *), clacgv_(integer *, complex *, integer *), xerbla_(char *, | |||||
| integer *, ftnlen); | |||||
| /* -- LAPACK computational routine (version 3.7.0) -- */ | |||||
| /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ | |||||
| /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ | |||||
| /* December 2016 */ | |||||
| /* ===================================================================== */ | |||||
| /* Check for currently supported options */ | |||||
| /* Parameter adjustments */ | |||||
| v_dim1 = *ldv; | |||||
| v_offset = 1 + v_dim1 * 1; | |||||
| v -= v_offset; | |||||
| --tau; | |||||
| t_dim1 = *ldt; | |||||
| t_offset = 1 + t_dim1 * 1; | |||||
| t -= t_offset; | |||||
| /* Function Body */ | |||||
| info = 0; | |||||
| if (! lsame_(direct, "B")) { | |||||
| info = -1; | |||||
| } else if (! lsame_(storev, "R")) { | |||||
| info = -2; | |||||
| } | |||||
| if (info != 0) { | |||||
| i__1 = -info; | |||||
| xerbla_("CLARZT", &i__1, (ftnlen)6); | |||||
| return 0; | |||||
| } | |||||
| for (i__ = *k; i__ >= 1; --i__) { | |||||
| i__1 = i__; | |||||
| if (tau[i__1].r == 0.f && tau[i__1].i == 0.f) { | |||||
| /* H(i) = I */ | |||||
| i__1 = *k; | |||||
| for (j = i__; j <= i__1; ++j) { | |||||
| i__2 = j + i__ * t_dim1; | |||||
| t[i__2].r = 0.f, t[i__2].i = 0.f; | |||||
| /* L10: */ | |||||
| } | |||||
| } else { | |||||
| /* general case */ | |||||
| if (i__ < *k) { | |||||
| /* T(i+1:k,i) = - tau(i) * V(i+1:k,1:n) * V(i,1:n)**H */ | |||||
| clacgv_(n, &v[i__ + v_dim1], ldv); | |||||
| i__1 = *k - i__; | |||||
| i__2 = i__; | |||||
| q__1.r = -tau[i__2].r, q__1.i = -tau[i__2].i; | |||||
| cgemv_("No transpose", &i__1, n, &q__1, &v[i__ + 1 + v_dim1], | |||||
| ldv, &v[i__ + v_dim1], ldv, &c_b1, &t[i__ + 1 + i__ * | |||||
| t_dim1], &c__1); | |||||
| clacgv_(n, &v[i__ + v_dim1], ldv); | |||||
| /* T(i+1:k,i) = T(i+1:k,i+1:k) * T(i+1:k,i) */ | |||||
| i__1 = *k - i__; | |||||
| ctrmv_("Lower", "No transpose", "Non-unit", &i__1, &t[i__ + 1 | |||||
| + (i__ + 1) * t_dim1], ldt, &t[i__ + 1 + i__ * t_dim1] | |||||
| , &c__1); | |||||
| } | |||||
| i__1 = i__ + i__ * t_dim1; | |||||
| i__2 = i__; | |||||
| t[i__1].r = tau[i__2].r, t[i__1].i = tau[i__2].i; | |||||
| } | |||||
| /* L20: */ | |||||
| } | |||||
| return 0; | |||||
| /* End of CLARZT */ | |||||
| } /* clarzt_ */ | |||||
| @@ -0,0 +1,819 @@ | |||||
| /* f2c.h -- Standard Fortran to C header file */ | |||||
| /** barf [ba:rf] 2. "He suggested using FORTRAN, and everybody barfed." | |||||
| - From The Shogakukan DICTIONARY OF NEW ENGLISH (Second edition) */ | |||||
| #ifndef F2C_INCLUDE | |||||
| #define F2C_INCLUDE | |||||
| #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 | |||||
| typedef int 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; | |||||
| 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;} | |||||
| #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)); } | |||||
| #define c_div(c, a, b) {pCf(c) = Cf(a)/Cf(b);} | |||||
| #define z_div(c, a, b) {pCd(c) = Cd(a)/Cd(b);} | |||||
| #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) = conj(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) (cimag(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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotc_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void cdotu_(complex *z, integer *n_, complex *x, integer *incx_, complex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotu_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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) | |||||
| */ | |||||
| /* > \brief \b CLASCL multiplies a general rectangular matrix by a real scalar defined as cto/cfrom. */ | |||||
| /* =========== DOCUMENTATION =========== */ | |||||
| /* Online html documentation available at */ | |||||
| /* http://www.netlib.org/lapack/explore-html/ */ | |||||
| /* > \htmlonly */ | |||||
| /* > Download CLASCL + dependencies */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/clascl. | |||||
| f"> */ | |||||
| /* > [TGZ]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/clascl. | |||||
| f"> */ | |||||
| /* > [ZIP]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/clascl. | |||||
| f"> */ | |||||
| /* > [TXT]</a> */ | |||||
| /* > \endhtmlonly */ | |||||
| /* Definition: */ | |||||
| /* =========== */ | |||||
| /* SUBROUTINE CLASCL( TYPE, KL, KU, CFROM, CTO, M, N, A, LDA, INFO ) */ | |||||
| /* CHARACTER TYPE */ | |||||
| /* INTEGER INFO, KL, KU, LDA, M, N */ | |||||
| /* REAL CFROM, CTO */ | |||||
| /* COMPLEX A( LDA, * ) */ | |||||
| /* > \par Purpose: */ | |||||
| /* ============= */ | |||||
| /* > */ | |||||
| /* > \verbatim */ | |||||
| /* > */ | |||||
| /* > CLASCL multiplies the M by N complex matrix A by the real scalar */ | |||||
| /* > CTO/CFROM. This is done without over/underflow as long as the final */ | |||||
| /* > result CTO*A(I,J)/CFROM does not over/underflow. TYPE specifies that */ | |||||
| /* > A may be full, upper triangular, lower triangular, upper Hessenberg, */ | |||||
| /* > or banded. */ | |||||
| /* > \endverbatim */ | |||||
| /* Arguments: */ | |||||
| /* ========== */ | |||||
| /* > \param[in] TYPE */ | |||||
| /* > \verbatim */ | |||||
| /* > TYPE is CHARACTER*1 */ | |||||
| /* > TYPE indices the storage type of the input matrix. */ | |||||
| /* > = 'G': A is a full matrix. */ | |||||
| /* > = 'L': A is a lower triangular matrix. */ | |||||
| /* > = 'U': A is an upper triangular matrix. */ | |||||
| /* > = 'H': A is an upper Hessenberg matrix. */ | |||||
| /* > = 'B': A is a symmetric band matrix with lower bandwidth KL */ | |||||
| /* > and upper bandwidth KU and with the only the lower */ | |||||
| /* > half stored. */ | |||||
| /* > = 'Q': A is a symmetric band matrix with lower bandwidth KL */ | |||||
| /* > and upper bandwidth KU and with the only the upper */ | |||||
| /* > half stored. */ | |||||
| /* > = 'Z': A is a band matrix with lower bandwidth KL and upper */ | |||||
| /* > bandwidth KU. See CGBTRF for storage details. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] KL */ | |||||
| /* > \verbatim */ | |||||
| /* > KL is INTEGER */ | |||||
| /* > The lower bandwidth of A. Referenced only if TYPE = 'B', */ | |||||
| /* > 'Q' or 'Z'. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] KU */ | |||||
| /* > \verbatim */ | |||||
| /* > KU is INTEGER */ | |||||
| /* > The upper bandwidth of A. Referenced only if TYPE = 'B', */ | |||||
| /* > 'Q' or 'Z'. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] CFROM */ | |||||
| /* > \verbatim */ | |||||
| /* > CFROM is REAL */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] CTO */ | |||||
| /* > \verbatim */ | |||||
| /* > CTO is REAL */ | |||||
| /* > */ | |||||
| /* > The matrix A is multiplied by CTO/CFROM. A(I,J) is computed */ | |||||
| /* > without over/underflow if the final result CTO*A(I,J)/CFROM */ | |||||
| /* > can be represented without over/underflow. CFROM must be */ | |||||
| /* > nonzero. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] M */ | |||||
| /* > \verbatim */ | |||||
| /* > M is INTEGER */ | |||||
| /* > The number of rows of the matrix A. M >= 0. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] N */ | |||||
| /* > \verbatim */ | |||||
| /* > N is INTEGER */ | |||||
| /* > The number of columns of the matrix A. N >= 0. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in,out] A */ | |||||
| /* > \verbatim */ | |||||
| /* > A is COMPLEX array, dimension (LDA,N) */ | |||||
| /* > The matrix to be multiplied by CTO/CFROM. See TYPE for the */ | |||||
| /* > storage type. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] LDA */ | |||||
| /* > \verbatim */ | |||||
| /* > LDA is INTEGER */ | |||||
| /* > The leading dimension of the array A. */ | |||||
| /* > If TYPE = 'G', 'L', 'U', 'H', LDA >= f2cmax(1,M); */ | |||||
| /* > TYPE = 'B', LDA >= KL+1; */ | |||||
| /* > TYPE = 'Q', LDA >= KU+1; */ | |||||
| /* > TYPE = 'Z', LDA >= 2*KL+KU+1. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] INFO */ | |||||
| /* > \verbatim */ | |||||
| /* > INFO is INTEGER */ | |||||
| /* > 0 - successful exit */ | |||||
| /* > <0 - if INFO = -i, the i-th argument had an illegal value. */ | |||||
| /* > \endverbatim */ | |||||
| /* Authors: */ | |||||
| /* ======== */ | |||||
| /* > \author Univ. of Tennessee */ | |||||
| /* > \author Univ. of California Berkeley */ | |||||
| /* > \author Univ. of Colorado Denver */ | |||||
| /* > \author NAG Ltd. */ | |||||
| /* > \date June 2016 */ | |||||
| /* > \ingroup complexOTHERauxiliary */ | |||||
| /* ===================================================================== */ | |||||
| /* Subroutine */ int clascl_(char *type__, integer *kl, integer *ku, real * | |||||
| cfrom, real *cto, integer *m, integer *n, complex *a, integer *lda, | |||||
| integer *info) | |||||
| { | |||||
| /* System generated locals */ | |||||
| integer a_dim1, a_offset, i__1, i__2, i__3, i__4, i__5; | |||||
| complex q__1; | |||||
| /* Local variables */ | |||||
| logical done; | |||||
| real ctoc; | |||||
| integer i__, j; | |||||
| extern logical lsame_(char *, char *); | |||||
| integer itype, k1, k2, k3, k4; | |||||
| real cfrom1; | |||||
| extern real slamch_(char *); | |||||
| real cfromc; | |||||
| extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); | |||||
| real bignum; | |||||
| extern logical sisnan_(real *); | |||||
| real smlnum, mul, cto1; | |||||
| /* -- LAPACK auxiliary routine (version 3.7.0) -- */ | |||||
| /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ | |||||
| /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ | |||||
| /* June 2016 */ | |||||
| /* ===================================================================== */ | |||||
| /* Test the input arguments */ | |||||
| /* Parameter adjustments */ | |||||
| a_dim1 = *lda; | |||||
| a_offset = 1 + a_dim1 * 1; | |||||
| a -= a_offset; | |||||
| /* Function Body */ | |||||
| *info = 0; | |||||
| if (lsame_(type__, "G")) { | |||||
| itype = 0; | |||||
| } else if (lsame_(type__, "L")) { | |||||
| itype = 1; | |||||
| } else if (lsame_(type__, "U")) { | |||||
| itype = 2; | |||||
| } else if (lsame_(type__, "H")) { | |||||
| itype = 3; | |||||
| } else if (lsame_(type__, "B")) { | |||||
| itype = 4; | |||||
| } else if (lsame_(type__, "Q")) { | |||||
| itype = 5; | |||||
| } else if (lsame_(type__, "Z")) { | |||||
| itype = 6; | |||||
| } else { | |||||
| itype = -1; | |||||
| } | |||||
| if (itype == -1) { | |||||
| *info = -1; | |||||
| } else if (*cfrom == 0.f || sisnan_(cfrom)) { | |||||
| *info = -4; | |||||
| } else if (sisnan_(cto)) { | |||||
| *info = -5; | |||||
| } else if (*m < 0) { | |||||
| *info = -6; | |||||
| } else if (*n < 0 || itype == 4 && *n != *m || itype == 5 && *n != *m) { | |||||
| *info = -7; | |||||
| } else if (itype <= 3 && *lda < f2cmax(1,*m)) { | |||||
| *info = -9; | |||||
| } else if (itype >= 4) { | |||||
| /* Computing MAX */ | |||||
| i__1 = *m - 1; | |||||
| if (*kl < 0 || *kl > f2cmax(i__1,0)) { | |||||
| *info = -2; | |||||
| } else /* if(complicated condition) */ { | |||||
| /* Computing MAX */ | |||||
| i__1 = *n - 1; | |||||
| if (*ku < 0 || *ku > f2cmax(i__1,0) || (itype == 4 || itype == 5) && | |||||
| *kl != *ku) { | |||||
| *info = -3; | |||||
| } else if (itype == 4 && *lda < *kl + 1 || itype == 5 && *lda < * | |||||
| ku + 1 || itype == 6 && *lda < (*kl << 1) + *ku + 1) { | |||||
| *info = -9; | |||||
| } | |||||
| } | |||||
| } | |||||
| if (*info != 0) { | |||||
| i__1 = -(*info); | |||||
| xerbla_("CLASCL", &i__1, (ftnlen)6); | |||||
| return 0; | |||||
| } | |||||
| /* Quick return if possible */ | |||||
| if (*n == 0 || *m == 0) { | |||||
| return 0; | |||||
| } | |||||
| /* Get machine parameters */ | |||||
| smlnum = slamch_("S"); | |||||
| bignum = 1.f / smlnum; | |||||
| cfromc = *cfrom; | |||||
| ctoc = *cto; | |||||
| L10: | |||||
| cfrom1 = cfromc * smlnum; | |||||
| if (cfrom1 == cfromc) { | |||||
| /* CFROMC is an inf. Multiply by a correctly signed zero for */ | |||||
| /* finite CTOC, or a NaN if CTOC is infinite. */ | |||||
| mul = ctoc / cfromc; | |||||
| done = TRUE_; | |||||
| cto1 = ctoc; | |||||
| } else { | |||||
| cto1 = ctoc / bignum; | |||||
| if (cto1 == ctoc) { | |||||
| /* CTOC is either 0 or an inf. In both cases, CTOC itself */ | |||||
| /* serves as the correct multiplication factor. */ | |||||
| mul = ctoc; | |||||
| done = TRUE_; | |||||
| cfromc = 1.f; | |||||
| } else if (abs(cfrom1) > abs(ctoc) && ctoc != 0.f) { | |||||
| mul = smlnum; | |||||
| done = FALSE_; | |||||
| cfromc = cfrom1; | |||||
| } else if (abs(cto1) > abs(cfromc)) { | |||||
| mul = bignum; | |||||
| done = FALSE_; | |||||
| ctoc = cto1; | |||||
| } else { | |||||
| mul = ctoc / cfromc; | |||||
| done = TRUE_; | |||||
| } | |||||
| } | |||||
| if (itype == 0) { | |||||
| /* Full matrix */ | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| i__2 = *m; | |||||
| for (i__ = 1; i__ <= i__2; ++i__) { | |||||
| i__3 = i__ + j * a_dim1; | |||||
| i__4 = i__ + j * a_dim1; | |||||
| q__1.r = mul * a[i__4].r, q__1.i = mul * a[i__4].i; | |||||
| a[i__3].r = q__1.r, a[i__3].i = q__1.i; | |||||
| /* L20: */ | |||||
| } | |||||
| /* L30: */ | |||||
| } | |||||
| } else if (itype == 1) { | |||||
| /* Lower triangular matrix */ | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| i__2 = *m; | |||||
| for (i__ = j; i__ <= i__2; ++i__) { | |||||
| i__3 = i__ + j * a_dim1; | |||||
| i__4 = i__ + j * a_dim1; | |||||
| q__1.r = mul * a[i__4].r, q__1.i = mul * a[i__4].i; | |||||
| a[i__3].r = q__1.r, a[i__3].i = q__1.i; | |||||
| /* L40: */ | |||||
| } | |||||
| /* L50: */ | |||||
| } | |||||
| } else if (itype == 2) { | |||||
| /* Upper triangular matrix */ | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| i__2 = f2cmin(j,*m); | |||||
| for (i__ = 1; i__ <= i__2; ++i__) { | |||||
| i__3 = i__ + j * a_dim1; | |||||
| i__4 = i__ + j * a_dim1; | |||||
| q__1.r = mul * a[i__4].r, q__1.i = mul * a[i__4].i; | |||||
| a[i__3].r = q__1.r, a[i__3].i = q__1.i; | |||||
| /* L60: */ | |||||
| } | |||||
| /* L70: */ | |||||
| } | |||||
| } else if (itype == 3) { | |||||
| /* Upper Hessenberg matrix */ | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| /* Computing MIN */ | |||||
| i__3 = j + 1; | |||||
| i__2 = f2cmin(i__3,*m); | |||||
| for (i__ = 1; i__ <= i__2; ++i__) { | |||||
| i__3 = i__ + j * a_dim1; | |||||
| i__4 = i__ + j * a_dim1; | |||||
| q__1.r = mul * a[i__4].r, q__1.i = mul * a[i__4].i; | |||||
| a[i__3].r = q__1.r, a[i__3].i = q__1.i; | |||||
| /* L80: */ | |||||
| } | |||||
| /* L90: */ | |||||
| } | |||||
| } else if (itype == 4) { | |||||
| /* Lower half of a symmetric band matrix */ | |||||
| k3 = *kl + 1; | |||||
| k4 = *n + 1; | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| /* Computing MIN */ | |||||
| i__3 = k3, i__4 = k4 - j; | |||||
| i__2 = f2cmin(i__3,i__4); | |||||
| for (i__ = 1; i__ <= i__2; ++i__) { | |||||
| i__3 = i__ + j * a_dim1; | |||||
| i__4 = i__ + j * a_dim1; | |||||
| q__1.r = mul * a[i__4].r, q__1.i = mul * a[i__4].i; | |||||
| a[i__3].r = q__1.r, a[i__3].i = q__1.i; | |||||
| /* L100: */ | |||||
| } | |||||
| /* L110: */ | |||||
| } | |||||
| } else if (itype == 5) { | |||||
| /* Upper half of a symmetric band matrix */ | |||||
| k1 = *ku + 2; | |||||
| k3 = *ku + 1; | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| /* Computing MAX */ | |||||
| i__2 = k1 - j; | |||||
| i__3 = k3; | |||||
| for (i__ = f2cmax(i__2,1); i__ <= i__3; ++i__) { | |||||
| i__2 = i__ + j * a_dim1; | |||||
| i__4 = i__ + j * a_dim1; | |||||
| q__1.r = mul * a[i__4].r, q__1.i = mul * a[i__4].i; | |||||
| a[i__2].r = q__1.r, a[i__2].i = q__1.i; | |||||
| /* L120: */ | |||||
| } | |||||
| /* L130: */ | |||||
| } | |||||
| } else if (itype == 6) { | |||||
| /* Band matrix */ | |||||
| k1 = *kl + *ku + 2; | |||||
| k2 = *kl + 1; | |||||
| k3 = (*kl << 1) + *ku + 1; | |||||
| k4 = *kl + *ku + 1 + *m; | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| /* Computing MAX */ | |||||
| i__3 = k1 - j; | |||||
| /* Computing MIN */ | |||||
| i__4 = k3, i__5 = k4 - j; | |||||
| i__2 = f2cmin(i__4,i__5); | |||||
| for (i__ = f2cmax(i__3,k2); i__ <= i__2; ++i__) { | |||||
| i__3 = i__ + j * a_dim1; | |||||
| i__4 = i__ + j * a_dim1; | |||||
| q__1.r = mul * a[i__4].r, q__1.i = mul * a[i__4].i; | |||||
| a[i__3].r = q__1.r, a[i__3].i = q__1.i; | |||||
| /* L140: */ | |||||
| } | |||||
| /* L150: */ | |||||
| } | |||||
| } | |||||
| if (! done) { | |||||
| goto L10; | |||||
| } | |||||
| return 0; | |||||
| /* End of CLASCL */ | |||||
| } /* clascl_ */ | |||||
| @@ -0,0 +1,519 @@ | |||||
| /* f2c.h -- Standard Fortran to C header file */ | |||||
| /** barf [ba:rf] 2. "He suggested using FORTRAN, and everybody barfed." | |||||
| - From The Shogakukan DICTIONARY OF NEW ENGLISH (Second edition) */ | |||||
| #ifndef F2C_INCLUDE | |||||
| #define F2C_INCLUDE | |||||
| #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 | |||||
| typedef int 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; | |||||
| 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;} | |||||
| #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)); } | |||||
| #define c_div(c, a, b) {pCf(c) = Cf(a)/Cf(b);} | |||||
| #define z_div(c, a, b) {pCd(c) = Cd(a)/Cd(b);} | |||||
| #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) = conj(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) (cimag(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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotc_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void cdotu_(complex *z, integer *n_, complex *x, integer *incx_, complex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotu_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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) | |||||
| */ | |||||
| /* > \brief \b CLASCL2 performs diagonal scaling on a vector. */ | |||||
| /* =========== DOCUMENTATION =========== */ | |||||
| /* Online html documentation available at */ | |||||
| /* http://www.netlib.org/lapack/explore-html/ */ | |||||
| /* > \htmlonly */ | |||||
| /* > Download CLASCL2 + dependencies */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/clascl2 | |||||
| .f"> */ | |||||
| /* > [TGZ]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/clascl2 | |||||
| .f"> */ | |||||
| /* > [ZIP]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/clascl2 | |||||
| .f"> */ | |||||
| /* > [TXT]</a> */ | |||||
| /* > \endhtmlonly */ | |||||
| /* Definition: */ | |||||
| /* =========== */ | |||||
| /* SUBROUTINE CLASCL2 ( M, N, D, X, LDX ) */ | |||||
| /* INTEGER M, N, LDX */ | |||||
| /* REAL D( * ) */ | |||||
| /* COMPLEX X( LDX, * ) */ | |||||
| /* > \par Purpose: */ | |||||
| /* ============= */ | |||||
| /* > */ | |||||
| /* > \verbatim */ | |||||
| /* > */ | |||||
| /* > CLASCL2 performs a diagonal scaling on a vector: */ | |||||
| /* > x <-- D * x */ | |||||
| /* > where the diagonal REAL matrix D is stored as a vector. */ | |||||
| /* > */ | |||||
| /* > Eventually to be replaced by BLAS_cge_diag_scale in the new BLAS */ | |||||
| /* > standard. */ | |||||
| /* > \endverbatim */ | |||||
| /* Arguments: */ | |||||
| /* ========== */ | |||||
| /* > \param[in] M */ | |||||
| /* > \verbatim */ | |||||
| /* > M is INTEGER */ | |||||
| /* > The number of rows of D and X. M >= 0. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] N */ | |||||
| /* > \verbatim */ | |||||
| /* > N is INTEGER */ | |||||
| /* > The number of columns of X. N >= 0. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] D */ | |||||
| /* > \verbatim */ | |||||
| /* > D is REAL array, length M */ | |||||
| /* > Diagonal matrix D, stored as a vector of length M. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in,out] X */ | |||||
| /* > \verbatim */ | |||||
| /* > X is COMPLEX array, dimension (LDX,N) */ | |||||
| /* > On entry, the vector X to be scaled by D. */ | |||||
| /* > On exit, the scaled vector. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] LDX */ | |||||
| /* > \verbatim */ | |||||
| /* > LDX is INTEGER */ | |||||
| /* > The leading dimension of the vector X. LDX >= M. */ | |||||
| /* > \endverbatim */ | |||||
| /* Authors: */ | |||||
| /* ======== */ | |||||
| /* > \author Univ. of Tennessee */ | |||||
| /* > \author Univ. of California Berkeley */ | |||||
| /* > \author Univ. of Colorado Denver */ | |||||
| /* > \author NAG Ltd. */ | |||||
| /* > \date June 2016 */ | |||||
| /* > \ingroup complexOTHERcomputational */ | |||||
| /* ===================================================================== */ | |||||
| /* Subroutine */ int clascl2_(integer *m, integer *n, real *d__, complex *x, | |||||
| integer *ldx) | |||||
| { | |||||
| /* System generated locals */ | |||||
| integer x_dim1, x_offset, i__1, i__2, i__3, i__4, i__5; | |||||
| complex q__1; | |||||
| /* Local variables */ | |||||
| integer i__, j; | |||||
| /* -- LAPACK computational routine (version 3.7.0) -- */ | |||||
| /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ | |||||
| /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ | |||||
| /* June 2016 */ | |||||
| /* ===================================================================== */ | |||||
| /* Parameter adjustments */ | |||||
| --d__; | |||||
| x_dim1 = *ldx; | |||||
| x_offset = 1 + x_dim1 * 1; | |||||
| x -= x_offset; | |||||
| /* Function Body */ | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| i__2 = *m; | |||||
| for (i__ = 1; i__ <= i__2; ++i__) { | |||||
| i__3 = i__ + j * x_dim1; | |||||
| i__4 = i__ + j * x_dim1; | |||||
| i__5 = i__; | |||||
| q__1.r = d__[i__5] * x[i__4].r, q__1.i = d__[i__5] * x[i__4].i; | |||||
| x[i__3].r = q__1.r, x[i__3].i = q__1.i; | |||||
| } | |||||
| } | |||||
| return 0; | |||||
| } /* clascl2_ */ | |||||
| @@ -0,0 +1,595 @@ | |||||
| /* f2c.h -- Standard Fortran to C header file */ | |||||
| /** barf [ba:rf] 2. "He suggested using FORTRAN, and everybody barfed." | |||||
| - From The Shogakukan DICTIONARY OF NEW ENGLISH (Second edition) */ | |||||
| #ifndef F2C_INCLUDE | |||||
| #define F2C_INCLUDE | |||||
| #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 | |||||
| typedef int 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; | |||||
| 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;} | |||||
| #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)); } | |||||
| #define c_div(c, a, b) {pCf(c) = Cf(a)/Cf(b);} | |||||
| #define z_div(c, a, b) {pCd(c) = Cd(a)/Cd(b);} | |||||
| #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) = conj(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) (cimag(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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotc_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void cdotu_(complex *z, integer *n_, complex *x, integer *incx_, complex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotu_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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) | |||||
| */ | |||||
| /* > \brief \b CLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given val | |||||
| ues. */ | |||||
| /* =========== DOCUMENTATION =========== */ | |||||
| /* Online html documentation available at */ | |||||
| /* http://www.netlib.org/lapack/explore-html/ */ | |||||
| /* > \htmlonly */ | |||||
| /* > Download CLASET + dependencies */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/claset. | |||||
| f"> */ | |||||
| /* > [TGZ]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/claset. | |||||
| f"> */ | |||||
| /* > [ZIP]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/claset. | |||||
| f"> */ | |||||
| /* > [TXT]</a> */ | |||||
| /* > \endhtmlonly */ | |||||
| /* Definition: */ | |||||
| /* =========== */ | |||||
| /* SUBROUTINE CLASET( UPLO, M, N, ALPHA, BETA, A, LDA ) */ | |||||
| /* CHARACTER UPLO */ | |||||
| /* INTEGER LDA, M, N */ | |||||
| /* COMPLEX ALPHA, BETA */ | |||||
| /* COMPLEX A( LDA, * ) */ | |||||
| /* > \par Purpose: */ | |||||
| /* ============= */ | |||||
| /* > */ | |||||
| /* > \verbatim */ | |||||
| /* > */ | |||||
| /* > CLASET initializes a 2-D array A to BETA on the diagonal and */ | |||||
| /* > ALPHA on the offdiagonals. */ | |||||
| /* > \endverbatim */ | |||||
| /* Arguments: */ | |||||
| /* ========== */ | |||||
| /* > \param[in] UPLO */ | |||||
| /* > \verbatim */ | |||||
| /* > UPLO is CHARACTER*1 */ | |||||
| /* > Specifies the part of the matrix A to be set. */ | |||||
| /* > = 'U': Upper triangular part is set. The lower triangle */ | |||||
| /* > is unchanged. */ | |||||
| /* > = 'L': Lower triangular part is set. The upper triangle */ | |||||
| /* > is unchanged. */ | |||||
| /* > Otherwise: All of the matrix A is set. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] M */ | |||||
| /* > \verbatim */ | |||||
| /* > M is INTEGER */ | |||||
| /* > On entry, M specifies the number of rows of A. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] N */ | |||||
| /* > \verbatim */ | |||||
| /* > N is INTEGER */ | |||||
| /* > On entry, N specifies the number of columns of A. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] ALPHA */ | |||||
| /* > \verbatim */ | |||||
| /* > ALPHA is COMPLEX */ | |||||
| /* > All the offdiagonal array elements are set to ALPHA. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] BETA */ | |||||
| /* > \verbatim */ | |||||
| /* > BETA is COMPLEX */ | |||||
| /* > All the diagonal array elements are set to BETA. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[out] A */ | |||||
| /* > \verbatim */ | |||||
| /* > A is COMPLEX array, dimension (LDA,N) */ | |||||
| /* > On entry, the m by n matrix A. */ | |||||
| /* > On exit, A(i,j) = ALPHA, 1 <= i <= m, 1 <= j <= n, i.ne.j; */ | |||||
| /* > A(i,i) = BETA , 1 <= i <= f2cmin(m,n) */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] LDA */ | |||||
| /* > \verbatim */ | |||||
| /* > LDA is INTEGER */ | |||||
| /* > The leading dimension of the array A. LDA >= f2cmax(1,M). */ | |||||
| /* > \endverbatim */ | |||||
| /* Authors: */ | |||||
| /* ======== */ | |||||
| /* > \author Univ. of Tennessee */ | |||||
| /* > \author Univ. of California Berkeley */ | |||||
| /* > \author Univ. of Colorado Denver */ | |||||
| /* > \author NAG Ltd. */ | |||||
| /* > \date December 2016 */ | |||||
| /* > \ingroup complexOTHERauxiliary */ | |||||
| /* ===================================================================== */ | |||||
| /* Subroutine */ int claset_(char *uplo, integer *m, integer *n, complex * | |||||
| alpha, complex *beta, complex *a, integer *lda) | |||||
| { | |||||
| /* System generated locals */ | |||||
| integer a_dim1, a_offset, i__1, i__2, i__3; | |||||
| /* Local variables */ | |||||
| integer i__, j; | |||||
| extern logical lsame_(char *, char *); | |||||
| /* -- LAPACK auxiliary routine (version 3.7.0) -- */ | |||||
| /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ | |||||
| /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ | |||||
| /* December 2016 */ | |||||
| /* ===================================================================== */ | |||||
| /* Parameter adjustments */ | |||||
| a_dim1 = *lda; | |||||
| a_offset = 1 + a_dim1 * 1; | |||||
| a -= a_offset; | |||||
| /* Function Body */ | |||||
| if (lsame_(uplo, "U")) { | |||||
| /* Set the diagonal to BETA and the strictly upper triangular */ | |||||
| /* part of the array to ALPHA. */ | |||||
| i__1 = *n; | |||||
| for (j = 2; j <= i__1; ++j) { | |||||
| /* Computing MIN */ | |||||
| i__3 = j - 1; | |||||
| i__2 = f2cmin(i__3,*m); | |||||
| for (i__ = 1; i__ <= i__2; ++i__) { | |||||
| i__3 = i__ + j * a_dim1; | |||||
| a[i__3].r = alpha->r, a[i__3].i = alpha->i; | |||||
| /* L10: */ | |||||
| } | |||||
| /* L20: */ | |||||
| } | |||||
| i__1 = f2cmin(*n,*m); | |||||
| for (i__ = 1; i__ <= i__1; ++i__) { | |||||
| i__2 = i__ + i__ * a_dim1; | |||||
| a[i__2].r = beta->r, a[i__2].i = beta->i; | |||||
| /* L30: */ | |||||
| } | |||||
| } else if (lsame_(uplo, "L")) { | |||||
| /* Set the diagonal to BETA and the strictly lower triangular */ | |||||
| /* part of the array to ALPHA. */ | |||||
| i__1 = f2cmin(*m,*n); | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| i__2 = *m; | |||||
| for (i__ = j + 1; i__ <= i__2; ++i__) { | |||||
| i__3 = i__ + j * a_dim1; | |||||
| a[i__3].r = alpha->r, a[i__3].i = alpha->i; | |||||
| /* L40: */ | |||||
| } | |||||
| /* L50: */ | |||||
| } | |||||
| i__1 = f2cmin(*n,*m); | |||||
| for (i__ = 1; i__ <= i__1; ++i__) { | |||||
| i__2 = i__ + i__ * a_dim1; | |||||
| a[i__2].r = beta->r, a[i__2].i = beta->i; | |||||
| /* L60: */ | |||||
| } | |||||
| } else { | |||||
| /* Set the array to BETA on the diagonal and ALPHA on the */ | |||||
| /* offdiagonal. */ | |||||
| i__1 = *n; | |||||
| for (j = 1; j <= i__1; ++j) { | |||||
| i__2 = *m; | |||||
| for (i__ = 1; i__ <= i__2; ++i__) { | |||||
| i__3 = i__ + j * a_dim1; | |||||
| a[i__3].r = alpha->r, a[i__3].i = alpha->i; | |||||
| /* L70: */ | |||||
| } | |||||
| /* L80: */ | |||||
| } | |||||
| i__1 = f2cmin(*m,*n); | |||||
| for (i__ = 1; i__ <= i__1; ++i__) { | |||||
| i__2 = i__ + i__ * a_dim1; | |||||
| a[i__2].r = beta->r, a[i__2].i = beta->i; | |||||
| /* L90: */ | |||||
| } | |||||
| } | |||||
| return 0; | |||||
| /* End of CLASET */ | |||||
| } /* claset_ */ | |||||
| @@ -0,0 +1,560 @@ | |||||
| /* f2c.h -- Standard Fortran to C header file */ | |||||
| /** barf [ba:rf] 2. "He suggested using FORTRAN, and everybody barfed." | |||||
| - From The Shogakukan DICTIONARY OF NEW ENGLISH (Second edition) */ | |||||
| #ifndef F2C_INCLUDE | |||||
| #define F2C_INCLUDE | |||||
| #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 | |||||
| typedef int 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; | |||||
| 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;} | |||||
| #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)); } | |||||
| #define c_div(c, a, b) {pCf(c) = Cf(a)/Cf(b);} | |||||
| #define z_div(c, a, b) {pCd(c) = Cd(a)/Cd(b);} | |||||
| #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) = conj(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) (cimag(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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| } | |||||
| 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; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotc_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void cdotu_(complex *z, integer *n_, complex *x, integer *incx_, complex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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; | |||||
| } | |||||
| static inline void zdotu_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||||
| integer n = *n_, incx = *incx_, incy = *incy_, i; | |||||
| _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) | |||||
| */ | |||||
| /* > \brief \b CLASSQ updates a sum of squares represented in scaled form. */ | |||||
| /* =========== DOCUMENTATION =========== */ | |||||
| /* Online html documentation available at */ | |||||
| /* http://www.netlib.org/lapack/explore-html/ */ | |||||
| /* > \htmlonly */ | |||||
| /* > Download CLASSQ + dependencies */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/classq. | |||||
| f"> */ | |||||
| /* > [TGZ]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/classq. | |||||
| f"> */ | |||||
| /* > [ZIP]</a> */ | |||||
| /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/classq. | |||||
| f"> */ | |||||
| /* > [TXT]</a> */ | |||||
| /* > \endhtmlonly */ | |||||
| /* Definition: */ | |||||
| /* =========== */ | |||||
| /* SUBROUTINE CLASSQ( N, X, INCX, SCALE, SUMSQ ) */ | |||||
| /* INTEGER INCX, N */ | |||||
| /* REAL SCALE, SUMSQ */ | |||||
| /* COMPLEX X( * ) */ | |||||
| /* > \par Purpose: */ | |||||
| /* ============= */ | |||||
| /* > */ | |||||
| /* > \verbatim */ | |||||
| /* > */ | |||||
| /* > CLASSQ returns the values scl and ssq such that */ | |||||
| /* > */ | |||||
| /* > ( scl**2 )*ssq = x( 1 )**2 +...+ x( n )**2 + ( scale**2 )*sumsq, */ | |||||
| /* > */ | |||||
| /* > where x( i ) = abs( X( 1 + ( i - 1 )*INCX ) ). The value of sumsq is */ | |||||
| /* > assumed to be at least unity and the value of ssq will then satisfy */ | |||||
| /* > */ | |||||
| /* > 1.0 <= ssq <= ( sumsq + 2*n ). */ | |||||
| /* > */ | |||||
| /* > scale is assumed to be non-negative and scl returns the value */ | |||||
| /* > */ | |||||
| /* > scl = f2cmax( scale, abs( real( x( i ) ) ), abs( aimag( x( i ) ) ) ), */ | |||||
| /* > i */ | |||||
| /* > */ | |||||
| /* > scale and sumsq must be supplied in SCALE and SUMSQ respectively. */ | |||||
| /* > SCALE and SUMSQ are overwritten by scl and ssq respectively. */ | |||||
| /* > */ | |||||
| /* > The routine makes only one pass through the vector X. */ | |||||
| /* > \endverbatim */ | |||||
| /* Arguments: */ | |||||
| /* ========== */ | |||||
| /* > \param[in] N */ | |||||
| /* > \verbatim */ | |||||
| /* > N is INTEGER */ | |||||
| /* > The number of elements to be used from the vector X. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] X */ | |||||
| /* > \verbatim */ | |||||
| /* > X is COMPLEX array, dimension (1+(N-1)*INCX) */ | |||||
| /* > The vector x as described above. */ | |||||
| /* > x( i ) = X( 1 + ( i - 1 )*INCX ), 1 <= i <= n. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in] INCX */ | |||||
| /* > \verbatim */ | |||||
| /* > INCX is INTEGER */ | |||||
| /* > The increment between successive values of the vector X. */ | |||||
| /* > INCX > 0. */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in,out] SCALE */ | |||||
| /* > \verbatim */ | |||||
| /* > SCALE is REAL */ | |||||
| /* > On entry, the value scale in the equation above. */ | |||||
| /* > On exit, SCALE is overwritten with the value scl . */ | |||||
| /* > \endverbatim */ | |||||
| /* > */ | |||||
| /* > \param[in,out] SUMSQ */ | |||||
| /* > \verbatim */ | |||||
| /* > SUMSQ is REAL */ | |||||
| /* > On entry, the value sumsq in the equation above. */ | |||||
| /* > On exit, SUMSQ is overwritten with the value ssq . */ | |||||
| /* > \endverbatim */ | |||||
| /* Authors: */ | |||||
| /* ======== */ | |||||
| /* > \author Univ. of Tennessee */ | |||||
| /* > \author Univ. of California Berkeley */ | |||||
| /* > \author Univ. of Colorado Denver */ | |||||
| /* > \author NAG Ltd. */ | |||||
| /* > \date December 2016 */ | |||||
| /* > \ingroup complexOTHERauxiliary */ | |||||
| /* ===================================================================== */ | |||||
| /* Subroutine */ int classq_(integer *n, complex *x, integer *incx, real * | |||||
| scale, real *sumsq) | |||||
| { | |||||
| /* System generated locals */ | |||||
| integer i__1, i__2, i__3; | |||||
| real r__1; | |||||
| /* Local variables */ | |||||
| real temp1; | |||||
| integer ix; | |||||
| extern logical sisnan_(real *); | |||||
| /* -- LAPACK auxiliary routine (version 3.7.0) -- */ | |||||
| /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ | |||||
| /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ | |||||
| /* December 2016 */ | |||||
| /* ===================================================================== */ | |||||
| /* Parameter adjustments */ | |||||
| --x; | |||||
| /* Function Body */ | |||||
| if (*n > 0) { | |||||
| i__1 = (*n - 1) * *incx + 1; | |||||
| i__2 = *incx; | |||||
| for (ix = 1; i__2 < 0 ? ix >= i__1 : ix <= i__1; ix += i__2) { | |||||
| i__3 = ix; | |||||
| temp1 = (r__1 = x[i__3].r, abs(r__1)); | |||||
| if (temp1 > 0.f || sisnan_(&temp1)) { | |||||
| if (*scale < temp1) { | |||||
| /* Computing 2nd power */ | |||||
| r__1 = *scale / temp1; | |||||
| *sumsq = *sumsq * (r__1 * r__1) + 1; | |||||
| *scale = temp1; | |||||
| } else { | |||||
| /* Computing 2nd power */ | |||||
| r__1 = temp1 / *scale; | |||||
| *sumsq += r__1 * r__1; | |||||
| } | |||||
| } | |||||
| temp1 = (r__1 = r_imag(&x[ix]), abs(r__1)); | |||||
| if (temp1 > 0.f || sisnan_(&temp1)) { | |||||
| if (*scale < temp1 || sisnan_(&temp1)) { | |||||
| /* Computing 2nd power */ | |||||
| r__1 = *scale / temp1; | |||||
| *sumsq = *sumsq * (r__1 * r__1) + 1; | |||||
| *scale = temp1; | |||||
| } else { | |||||
| /* Computing 2nd power */ | |||||
| r__1 = temp1 / *scale; | |||||
| *sumsq += r__1 * r__1; | |||||
| } | |||||
| } | |||||
| /* L10: */ | |||||
| } | |||||
| } | |||||
| return 0; | |||||
| /* End of CLASSQ */ | |||||
| } /* classq_ */ | |||||