Add converted C versions of C/ZRSCL to fix build errors introduced by PR4126tags/v0.3.24
@@ -686,7 +686,7 @@ set(CLASRC | |||
cposv.c cposvx.c cpotrf2.c cpotri.c cpstrf.c cpstf2.c | |||
cppcon.c cppequ.c cpprfs.c cppsv.c cppsvx.c cpptrf.c cpptri.c cpptrs.c | |||
cptcon.c cpteqr.c cptrfs.c cptsv.c cptsvx.c cpttrf.c cpttrs.c cptts2.c | |||
crot.c cspcon.c csprfs.c cspsv.c | |||
crot.c crscl.c cspcon.c csprfs.c cspsv.c | |||
cspsvx.c csptrf.c csptri.c csptrs.c csrscl.c cstedc.c | |||
cstegr.c cstein.c csteqr.c csycon.c | |||
csyrfs.c csysv.c csysvx.c csytf2.c csytrf.c csytri.c | |||
@@ -878,7 +878,7 @@ set(ZLASRC | |||
zposv.c zposvx.c zpotrf2.c zpotri.c zpotrs.c zpstrf.c zpstf2.c | |||
zppcon.c zppequ.c zpprfs.c zppsv.c zppsvx.c zpptrf.c zpptri.c zpptrs.c | |||
zptcon.c zpteqr.c zptrfs.c zptsv.c zptsvx.c zpttrf.c zpttrs.c zptts2.c | |||
zrot.c zspcon.c zsprfs.c zspsv.c | |||
zrot.c zrscl.c zspcon.c zsprfs.c zspsv.c | |||
zspsvx.c zsptrf.c zsptri.c zsptrs.c zdrscl.c zstedc.c | |||
zstegr.c zstein.c zsteqr.c zsycon.c | |||
zsyrfs.c zsysv.c zsysvx.c zsytf2.c zsytrf.c zsytri.c | |||
@@ -0,0 +1,735 @@ | |||
#include <math.h> | |||
#include <stdlib.h> | |||
#include <string.h> | |||
#include <stdio.h> | |||
#include <complex.h> | |||
#ifdef complex | |||
#undef complex | |||
#endif | |||
#ifdef I | |||
#undef I | |||
#endif | |||
#if defined(_WIN64) | |||
typedef long long BLASLONG; | |||
typedef unsigned long long BLASULONG; | |||
#else | |||
typedef long BLASLONG; | |||
typedef unsigned long BLASULONG; | |||
#endif | |||
#ifdef LAPACK_ILP64 | |||
typedef BLASLONG blasint; | |||
#if defined(_WIN64) | |||
#define blasabs(x) llabs(x) | |||
#else | |||
#define blasabs(x) labs(x) | |||
#endif | |||
#else | |||
typedef int blasint; | |||
#define blasabs(x) abs(x) | |||
#endif | |||
typedef blasint integer; | |||
typedef unsigned int uinteger; | |||
typedef char *address; | |||
typedef short int shortint; | |||
typedef float real; | |||
typedef double doublereal; | |||
typedef struct { real r, i; } complex; | |||
typedef struct { doublereal r, i; } doublecomplex; | |||
#ifdef _MSC_VER | |||
static inline _Fcomplex Cf(complex *z) {_Fcomplex zz={z->r , z->i}; return zz;} | |||
static inline _Dcomplex Cd(doublecomplex *z) {_Dcomplex zz={z->r , z->i};return zz;} | |||
static inline _Fcomplex * _pCf(complex *z) {return (_Fcomplex*)z;} | |||
static inline _Dcomplex * _pCd(doublecomplex *z) {return (_Dcomplex*)z;} | |||
#else | |||
static inline _Complex float Cf(complex *z) {return z->r + z->i*_Complex_I;} | |||
static inline _Complex double Cd(doublecomplex *z) {return z->r + z->i*_Complex_I;} | |||
static inline _Complex float * _pCf(complex *z) {return (_Complex float*)z;} | |||
static inline _Complex double * _pCd(doublecomplex *z) {return (_Complex double*)z;} | |||
#endif | |||
#define pCf(z) (*_pCf(z)) | |||
#define pCd(z) (*_pCd(z)) | |||
typedef int logical; | |||
typedef short int shortlogical; | |||
typedef char logical1; | |||
typedef char integer1; | |||
#define TRUE_ (1) | |||
#define FALSE_ (0) | |||
/* Extern is for use with -E */ | |||
#ifndef Extern | |||
#define Extern extern | |||
#endif | |||
/* I/O stuff */ | |||
typedef int flag; | |||
typedef int ftnlen; | |||
typedef int ftnint; | |||
/*external read, write*/ | |||
typedef struct | |||
{ flag cierr; | |||
ftnint ciunit; | |||
flag ciend; | |||
char *cifmt; | |||
ftnint cirec; | |||
} cilist; | |||
/*internal read, write*/ | |||
typedef struct | |||
{ flag icierr; | |||
char *iciunit; | |||
flag iciend; | |||
char *icifmt; | |||
ftnint icirlen; | |||
ftnint icirnum; | |||
} icilist; | |||
/*open*/ | |||
typedef struct | |||
{ flag oerr; | |||
ftnint ounit; | |||
char *ofnm; | |||
ftnlen ofnmlen; | |||
char *osta; | |||
char *oacc; | |||
char *ofm; | |||
ftnint orl; | |||
char *oblnk; | |||
} olist; | |||
/*close*/ | |||
typedef struct | |||
{ flag cerr; | |||
ftnint cunit; | |||
char *csta; | |||
} cllist; | |||
/*rewind, backspace, endfile*/ | |||
typedef struct | |||
{ flag aerr; | |||
ftnint aunit; | |||
} alist; | |||
/* inquire */ | |||
typedef struct | |||
{ flag inerr; | |||
ftnint inunit; | |||
char *infile; | |||
ftnlen infilen; | |||
ftnint *inex; /*parameters in standard's order*/ | |||
ftnint *inopen; | |||
ftnint *innum; | |||
ftnint *innamed; | |||
char *inname; | |||
ftnlen innamlen; | |||
char *inacc; | |||
ftnlen inacclen; | |||
char *inseq; | |||
ftnlen inseqlen; | |||
char *indir; | |||
ftnlen indirlen; | |||
char *infmt; | |||
ftnlen infmtlen; | |||
char *inform; | |||
ftnint informlen; | |||
char *inunf; | |||
ftnlen inunflen; | |||
ftnint *inrecl; | |||
ftnint *innrec; | |||
char *inblank; | |||
ftnlen inblanklen; | |||
} inlist; | |||
#define VOID void | |||
union Multitype { /* for multiple entry points */ | |||
integer1 g; | |||
shortint h; | |||
integer i; | |||
/* longint j; */ | |||
real r; | |||
doublereal d; | |||
complex c; | |||
doublecomplex z; | |||
}; | |||
typedef union Multitype Multitype; | |||
struct Vardesc { /* for Namelist */ | |||
char *name; | |||
char *addr; | |||
ftnlen *dims; | |||
int type; | |||
}; | |||
typedef struct Vardesc Vardesc; | |||
struct Namelist { | |||
char *name; | |||
Vardesc **vars; | |||
int nvars; | |||
}; | |||
typedef struct Namelist Namelist; | |||
#define abs(x) ((x) >= 0 ? (x) : -(x)) | |||
#define dabs(x) (fabs(x)) | |||
#define f2cmin(a,b) ((a) <= (b) ? (a) : (b)) | |||
#define f2cmax(a,b) ((a) >= (b) ? (a) : (b)) | |||
#define dmin(a,b) (f2cmin(a,b)) | |||
#define dmax(a,b) (f2cmax(a,b)) | |||
#define bit_test(a,b) ((a) >> (b) & 1) | |||
#define bit_clear(a,b) ((a) & ~((uinteger)1 << (b))) | |||
#define bit_set(a,b) ((a) | ((uinteger)1 << (b))) | |||
#define abort_() { sig_die("Fortran abort routine called", 1); } | |||
#define c_abs(z) (cabsf(Cf(z))) | |||
#define c_cos(R,Z) { pCf(R)=ccos(Cf(Z)); } | |||
#ifdef _MSC_VER | |||
#define c_div(c, a, b) {Cf(c)._Val[0] = (Cf(a)._Val[0]/Cf(b)._Val[0]); Cf(c)._Val[1]=(Cf(a)._Val[1]/Cf(b)._Val[1]);} | |||
#define z_div(c, a, b) {Cd(c)._Val[0] = (Cd(a)._Val[0]/Cd(b)._Val[0]); Cd(c)._Val[1]=(Cd(a)._Val[1]/Cd(b)._Val[1]);} | |||
#else | |||
#define c_div(c, a, b) {pCf(c) = Cf(a)/Cf(b);} | |||
#define z_div(c, a, b) {pCd(c) = Cd(a)/Cd(b);} | |||
#endif | |||
#define c_exp(R, Z) {pCf(R) = cexpf(Cf(Z));} | |||
#define c_log(R, Z) {pCf(R) = clogf(Cf(Z));} | |||
#define c_sin(R, Z) {pCf(R) = csinf(Cf(Z));} | |||
//#define c_sqrt(R, Z) {*(R) = csqrtf(Cf(Z));} | |||
#define c_sqrt(R, Z) {pCf(R) = csqrtf(Cf(Z));} | |||
#define d_abs(x) (fabs(*(x))) | |||
#define d_acos(x) (acos(*(x))) | |||
#define d_asin(x) (asin(*(x))) | |||
#define d_atan(x) (atan(*(x))) | |||
#define d_atn2(x, y) (atan2(*(x),*(y))) | |||
#define d_cnjg(R, Z) { pCd(R) = conj(Cd(Z)); } | |||
#define r_cnjg(R, Z) { pCf(R) = conjf(Cf(Z)); } | |||
#define d_cos(x) (cos(*(x))) | |||
#define d_cosh(x) (cosh(*(x))) | |||
#define d_dim(__a, __b) ( *(__a) > *(__b) ? *(__a) - *(__b) : 0.0 ) | |||
#define d_exp(x) (exp(*(x))) | |||
#define d_imag(z) (cimag(Cd(z))) | |||
#define r_imag(z) (cimagf(Cf(z))) | |||
#define d_int(__x) (*(__x)>0 ? floor(*(__x)) : -floor(- *(__x))) | |||
#define r_int(__x) (*(__x)>0 ? floor(*(__x)) : -floor(- *(__x))) | |||
#define d_lg10(x) ( 0.43429448190325182765 * log(*(x)) ) | |||
#define r_lg10(x) ( 0.43429448190325182765 * log(*(x)) ) | |||
#define d_log(x) (log(*(x))) | |||
#define d_mod(x, y) (fmod(*(x), *(y))) | |||
#define u_nint(__x) ((__x)>=0 ? floor((__x) + .5) : -floor(.5 - (__x))) | |||
#define d_nint(x) u_nint(*(x)) | |||
#define u_sign(__a,__b) ((__b) >= 0 ? ((__a) >= 0 ? (__a) : -(__a)) : -((__a) >= 0 ? (__a) : -(__a))) | |||
#define d_sign(a,b) u_sign(*(a),*(b)) | |||
#define r_sign(a,b) u_sign(*(a),*(b)) | |||
#define d_sin(x) (sin(*(x))) | |||
#define d_sinh(x) (sinh(*(x))) | |||
#define d_sqrt(x) (sqrt(*(x))) | |||
#define d_tan(x) (tan(*(x))) | |||
#define d_tanh(x) (tanh(*(x))) | |||
#define i_abs(x) abs(*(x)) | |||
#define i_dnnt(x) ((integer)u_nint(*(x))) | |||
#define i_len(s, n) (n) | |||
#define i_nint(x) ((integer)u_nint(*(x))) | |||
#define i_sign(a,b) ((integer)u_sign((integer)*(a),(integer)*(b))) | |||
#define pow_dd(ap, bp) ( pow(*(ap), *(bp))) | |||
#define pow_si(B,E) spow_ui(*(B),*(E)) | |||
#define pow_ri(B,E) spow_ui(*(B),*(E)) | |||
#define pow_di(B,E) dpow_ui(*(B),*(E)) | |||
#define pow_zi(p, a, b) {pCd(p) = zpow_ui(Cd(a), *(b));} | |||
#define pow_ci(p, a, b) {pCf(p) = cpow_ui(Cf(a), *(b));} | |||
#define pow_zz(R,A,B) {pCd(R) = cpow(Cd(A),*(B));} | |||
#define s_cat(lpp, rpp, rnp, np, llp) { ftnlen i, nc, ll; char *f__rp, *lp; ll = (llp); lp = (lpp); for(i=0; i < (int)*(np); ++i) { nc = ll; if((rnp)[i] < nc) nc = (rnp)[i]; ll -= nc; f__rp = (rpp)[i]; while(--nc >= 0) *lp++ = *(f__rp)++; } while(--ll >= 0) *lp++ = ' '; } | |||
#define s_cmp(a,b,c,d) ((integer)strncmp((a),(b),f2cmin((c),(d)))) | |||
#define s_copy(A,B,C,D) { int __i,__m; for (__i=0, __m=f2cmin((C),(D)); __i<__m && (B)[__i] != 0; ++__i) (A)[__i] = (B)[__i]; } | |||
#define sig_die(s, kill) { exit(1); } | |||
#define s_stop(s, n) {exit(0);} | |||
static char junk[] = "\n@(#)LIBF77 VERSION 19990503\n"; | |||
#define z_abs(z) (cabs(Cd(z))) | |||
#define z_exp(R, Z) {pCd(R) = cexp(Cd(Z));} | |||
#define z_sqrt(R, Z) {pCd(R) = csqrt(Cd(Z));} | |||
#define myexit_() break; | |||
#define mycycle_() continue; | |||
#define myceiling_(w) {ceil(w)} | |||
#define myhuge_(w) {HUGE_VAL} | |||
//#define mymaxloc_(w,s,e,n) {if (sizeof(*(w)) == sizeof(double)) dmaxloc_((w),*(s),*(e),n); else dmaxloc_((w),*(s),*(e),n);} | |||
#define mymaxloc_(w,s,e,n) dmaxloc_(w,*(s),*(e),n) | |||
/* procedure parameter types for -A and -C++ */ | |||
#define F2C_proc_par_types 1 | |||
#ifdef __cplusplus | |||
typedef logical (*L_fp)(...); | |||
#else | |||
typedef logical (*L_fp)(); | |||
#endif | |||
static float spow_ui(float x, integer n) { | |||
float pow=1.0; unsigned long int u; | |||
if(n != 0) { | |||
if(n < 0) n = -n, x = 1/x; | |||
for(u = n; ; ) { | |||
if(u & 01) pow *= x; | |||
if(u >>= 1) x *= x; | |||
else break; | |||
} | |||
} | |||
return pow; | |||
} | |||
static double dpow_ui(double x, integer n) { | |||
double pow=1.0; unsigned long int u; | |||
if(n != 0) { | |||
if(n < 0) n = -n, x = 1/x; | |||
for(u = n; ; ) { | |||
if(u & 01) pow *= x; | |||
if(u >>= 1) x *= x; | |||
else break; | |||
} | |||
} | |||
return pow; | |||
} | |||
#ifdef _MSC_VER | |||
static _Fcomplex cpow_ui(complex x, integer n) { | |||
complex pow={1.0,0.0}; unsigned long int u; | |||
if(n != 0) { | |||
if(n < 0) n = -n, x.r = 1/x.r, x.i=1/x.i; | |||
for(u = n; ; ) { | |||
if(u & 01) pow.r *= x.r, pow.i *= x.i; | |||
if(u >>= 1) x.r *= x.r, x.i *= x.i; | |||
else break; | |||
} | |||
} | |||
_Fcomplex p={pow.r, pow.i}; | |||
return p; | |||
} | |||
#else | |||
static _Complex float cpow_ui(_Complex float x, integer n) { | |||
_Complex float pow=1.0; unsigned long int u; | |||
if(n != 0) { | |||
if(n < 0) n = -n, x = 1/x; | |||
for(u = n; ; ) { | |||
if(u & 01) pow *= x; | |||
if(u >>= 1) x *= x; | |||
else break; | |||
} | |||
} | |||
return pow; | |||
} | |||
#endif | |||
#ifdef _MSC_VER | |||
static _Dcomplex zpow_ui(_Dcomplex x, integer n) { | |||
_Dcomplex pow={1.0,0.0}; unsigned long int u; | |||
if(n != 0) { | |||
if(n < 0) n = -n, x._Val[0] = 1/x._Val[0], x._Val[1] =1/x._Val[1]; | |||
for(u = n; ; ) { | |||
if(u & 01) pow._Val[0] *= x._Val[0], pow._Val[1] *= x._Val[1]; | |||
if(u >>= 1) x._Val[0] *= x._Val[0], x._Val[1] *= x._Val[1]; | |||
else break; | |||
} | |||
} | |||
_Dcomplex p = {pow._Val[0], pow._Val[1]}; | |||
return p; | |||
} | |||
#else | |||
static _Complex double zpow_ui(_Complex double x, integer n) { | |||
_Complex double pow=1.0; unsigned long int u; | |||
if(n != 0) { | |||
if(n < 0) n = -n, x = 1/x; | |||
for(u = n; ; ) { | |||
if(u & 01) pow *= x; | |||
if(u >>= 1) x *= x; | |||
else break; | |||
} | |||
} | |||
return pow; | |||
} | |||
#endif | |||
static integer pow_ii(integer x, integer n) { | |||
integer pow; unsigned long int u; | |||
if (n <= 0) { | |||
if (n == 0 || x == 1) pow = 1; | |||
else if (x != -1) pow = x == 0 ? 1/x : 0; | |||
else n = -n; | |||
} | |||
if ((n > 0) || !(n == 0 || x == 1 || x != -1)) { | |||
u = n; | |||
for(pow = 1; ; ) { | |||
if(u & 01) pow *= x; | |||
if(u >>= 1) x *= x; | |||
else break; | |||
} | |||
} | |||
return pow; | |||
} | |||
static integer dmaxloc_(double *w, integer s, integer e, integer *n) | |||
{ | |||
double m; integer i, mi; | |||
for(m=w[s-1], mi=s, i=s+1; i<=e; i++) | |||
if (w[i-1]>m) mi=i ,m=w[i-1]; | |||
return mi-s+1; | |||
} | |||
static integer smaxloc_(float *w, integer s, integer e, integer *n) | |||
{ | |||
float m; integer i, mi; | |||
for(m=w[s-1], mi=s, i=s+1; i<=e; i++) | |||
if (w[i-1]>m) mi=i ,m=w[i-1]; | |||
return mi-s+1; | |||
} | |||
static inline void cdotc_(complex *z, integer *n_, complex *x, integer *incx_, complex *y, integer *incy_) { | |||
integer n = *n_, incx = *incx_, incy = *incy_, i; | |||
#ifdef _MSC_VER | |||
_Fcomplex zdotc = {0.0, 0.0}; | |||
if (incx == 1 && incy == 1) { | |||
for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */ | |||
zdotc._Val[0] += conjf(Cf(&x[i]))._Val[0] * Cf(&y[i])._Val[0]; | |||
zdotc._Val[1] += conjf(Cf(&x[i]))._Val[1] * Cf(&y[i])._Val[1]; | |||
} | |||
} else { | |||
for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */ | |||
zdotc._Val[0] += conjf(Cf(&x[i*incx]))._Val[0] * Cf(&y[i*incy])._Val[0]; | |||
zdotc._Val[1] += conjf(Cf(&x[i*incx]))._Val[1] * Cf(&y[i*incy])._Val[1]; | |||
} | |||
} | |||
pCf(z) = zdotc; | |||
} | |||
#else | |||
_Complex float zdotc = 0.0; | |||
if (incx == 1 && incy == 1) { | |||
for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */ | |||
zdotc += conjf(Cf(&x[i])) * Cf(&y[i]); | |||
} | |||
} else { | |||
for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */ | |||
zdotc += conjf(Cf(&x[i*incx])) * Cf(&y[i*incy]); | |||
} | |||
} | |||
pCf(z) = zdotc; | |||
} | |||
#endif | |||
static inline void zdotc_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||
integer n = *n_, incx = *incx_, incy = *incy_, i; | |||
#ifdef _MSC_VER | |||
_Dcomplex zdotc = {0.0, 0.0}; | |||
if (incx == 1 && incy == 1) { | |||
for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */ | |||
zdotc._Val[0] += conj(Cd(&x[i]))._Val[0] * Cd(&y[i])._Val[0]; | |||
zdotc._Val[1] += conj(Cd(&x[i]))._Val[1] * Cd(&y[i])._Val[1]; | |||
} | |||
} else { | |||
for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */ | |||
zdotc._Val[0] += conj(Cd(&x[i*incx]))._Val[0] * Cd(&y[i*incy])._Val[0]; | |||
zdotc._Val[1] += conj(Cd(&x[i*incx]))._Val[1] * Cd(&y[i*incy])._Val[1]; | |||
} | |||
} | |||
pCd(z) = zdotc; | |||
} | |||
#else | |||
_Complex double zdotc = 0.0; | |||
if (incx == 1 && incy == 1) { | |||
for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */ | |||
zdotc += conj(Cd(&x[i])) * Cd(&y[i]); | |||
} | |||
} else { | |||
for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */ | |||
zdotc += conj(Cd(&x[i*incx])) * Cd(&y[i*incy]); | |||
} | |||
} | |||
pCd(z) = zdotc; | |||
} | |||
#endif | |||
static inline void cdotu_(complex *z, integer *n_, complex *x, integer *incx_, complex *y, integer *incy_) { | |||
integer n = *n_, incx = *incx_, incy = *incy_, i; | |||
#ifdef _MSC_VER | |||
_Fcomplex zdotc = {0.0, 0.0}; | |||
if (incx == 1 && incy == 1) { | |||
for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */ | |||
zdotc._Val[0] += Cf(&x[i])._Val[0] * Cf(&y[i])._Val[0]; | |||
zdotc._Val[1] += Cf(&x[i])._Val[1] * Cf(&y[i])._Val[1]; | |||
} | |||
} else { | |||
for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */ | |||
zdotc._Val[0] += Cf(&x[i*incx])._Val[0] * Cf(&y[i*incy])._Val[0]; | |||
zdotc._Val[1] += Cf(&x[i*incx])._Val[1] * Cf(&y[i*incy])._Val[1]; | |||
} | |||
} | |||
pCf(z) = zdotc; | |||
} | |||
#else | |||
_Complex float zdotc = 0.0; | |||
if (incx == 1 && incy == 1) { | |||
for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */ | |||
zdotc += Cf(&x[i]) * Cf(&y[i]); | |||
} | |||
} else { | |||
for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */ | |||
zdotc += Cf(&x[i*incx]) * Cf(&y[i*incy]); | |||
} | |||
} | |||
pCf(z) = zdotc; | |||
} | |||
#endif | |||
static inline void zdotu_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||
integer n = *n_, incx = *incx_, incy = *incy_, i; | |||
#ifdef _MSC_VER | |||
_Dcomplex zdotc = {0.0, 0.0}; | |||
if (incx == 1 && incy == 1) { | |||
for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */ | |||
zdotc._Val[0] += Cd(&x[i])._Val[0] * Cd(&y[i])._Val[0]; | |||
zdotc._Val[1] += Cd(&x[i])._Val[1] * Cd(&y[i])._Val[1]; | |||
} | |||
} else { | |||
for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */ | |||
zdotc._Val[0] += Cd(&x[i*incx])._Val[0] * Cd(&y[i*incy])._Val[0]; | |||
zdotc._Val[1] += Cd(&x[i*incx])._Val[1] * Cd(&y[i*incy])._Val[1]; | |||
} | |||
} | |||
pCd(z) = zdotc; | |||
} | |||
#else | |||
_Complex double zdotc = 0.0; | |||
if (incx == 1 && incy == 1) { | |||
for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */ | |||
zdotc += Cd(&x[i]) * Cd(&y[i]); | |||
} | |||
} else { | |||
for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */ | |||
zdotc += Cd(&x[i*incx]) * Cd(&y[i*incy]); | |||
} | |||
} | |||
pCd(z) = zdotc; | |||
} | |||
#endif | |||
/* -- translated by f2c (version 20000121). | |||
You must link the resulting object file with the libraries: | |||
-lf2c -lm (in that order) | |||
*/ | |||
/* -- translated by f2c (version 20000121). | |||
You must link the resulting object file with the libraries: | |||
-lf2c -lm (in that order) | |||
*/ | |||
/* > \brief \b CRSCL multiplies a vector by the reciprocal of a real scalar. */ | |||
/* =========== DOCUMENTATION =========== */ | |||
/* Online html documentation available at */ | |||
/* http://www.netlib.org/lapack/explore-html/ */ | |||
/* > \htmlonly */ | |||
/* > Download CRSCL + dependencies */ | |||
/* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/crscl.f | |||
"> */ | |||
/* > [TGZ]</a> */ | |||
/* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/crscl.f | |||
"> */ | |||
/* > [ZIP]</a> */ | |||
/* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/crscl.f | |||
"> */ | |||
/* > [TXT]</a> */ | |||
/* > \endhtmlonly */ | |||
/* Definition: */ | |||
/* =========== */ | |||
/* SUBROUTINE CRSCL( N, A, X, INCX ) */ | |||
/* INTEGER INCX, N */ | |||
/* COMPLEX A */ | |||
/* COMPLEX X( * ) */ | |||
/* > \par Purpose: */ | |||
/* ============= */ | |||
/* > */ | |||
/* > \verbatim */ | |||
/* > */ | |||
/* > CRSCL multiplies an n-element complex vector x by the complex scalar */ | |||
/* > 1/a. This is done without overflow or underflow as long as */ | |||
/* > the final result x/a does not overflow or underflow. */ | |||
/* > \endverbatim */ | |||
/* Arguments: */ | |||
/* ========== */ | |||
/* > \param[in] N */ | |||
/* > \verbatim */ | |||
/* > N is INTEGER */ | |||
/* > The number of components of the vector x. */ | |||
/* > \endverbatim */ | |||
/* > */ | |||
/* > \param[in] A */ | |||
/* > \verbatim */ | |||
/* > A is COMPLEX */ | |||
/* > The scalar a which is used to divide each component of x. */ | |||
/* > A must not be 0, or the subroutine will divide by zero. */ | |||
/* > \endverbatim */ | |||
/* > */ | |||
/* > \param[in,out] X */ | |||
/* > \verbatim */ | |||
/* > X is COMPLEX array, dimension */ | |||
/* > (1+(N-1)*abs(INCX)) */ | |||
/* > The n-element vector x. */ | |||
/* > \endverbatim */ | |||
/* > */ | |||
/* > \param[in] INCX */ | |||
/* > \verbatim */ | |||
/* > INCX is INTEGER */ | |||
/* > The increment between successive values of the vector X. */ | |||
/* > > 0: X(1) = X(1) and X(1+(i-1)*INCX) = x(i), 1< i<= n */ | |||
/* > \endverbatim */ | |||
/* Authors: */ | |||
/* ======== */ | |||
/* > \author Univ. of Tennessee */ | |||
/* > \author Univ. of California Berkeley */ | |||
/* > \author Univ. of Colorado Denver */ | |||
/* > \author NAG Ltd. */ | |||
/* > \ingroup complexOTHERauxiliary */ | |||
/* ===================================================================== */ | |||
/* Subroutine */ int crscl_(integer *n, complex *a, complex *x, integer *incx) | |||
{ | |||
/* System generated locals */ | |||
real r__1, r__2; | |||
complex q__1; | |||
/* Local variables */ | |||
real absi, absr; | |||
extern /* Subroutine */ int cscal_(integer *, complex *, complex *, | |||
integer *); | |||
real ai, ar, ui, ov, ur; | |||
extern real slamch_(char *); | |||
extern /* Subroutine */ int csscal_(integer *, real *, complex *, integer | |||
*); | |||
real safmin, safmax; | |||
extern /* Subroutine */ int csrscl_(integer *, real *, complex *, integer | |||
*); | |||
/* -- LAPACK auxiliary routine -- */ | |||
/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ | |||
/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ | |||
/* ===================================================================== */ | |||
/* Quick return if possible */ | |||
/* Parameter adjustments */ | |||
--x; | |||
/* Function Body */ | |||
if (*n <= 0) { | |||
return 0; | |||
} | |||
/* Get machine parameters */ | |||
safmin = slamch_("S"); | |||
safmax = 1.f / safmin; | |||
ov = slamch_("O"); | |||
/* Initialize constants related to A. */ | |||
ar = a->r; | |||
ai = r_imag(a); | |||
absr = abs(ar); | |||
absi = abs(ai); | |||
if (ai == 0.f) { | |||
/* If alpha is real, then we can use csrscl */ | |||
csrscl_(n, &ar, &x[1], incx); | |||
} else if (ar == 0.f) { | |||
/* If alpha has a zero real part, then we follow the same rules as if */ | |||
/* alpha were real. */ | |||
if (absi > safmax) { | |||
csscal_(n, &safmin, &x[1], incx); | |||
r__1 = -safmax / ai; | |||
q__1.r = 0.f, q__1.i = r__1; | |||
cscal_(n, &q__1, &x[1], incx); | |||
} else if (absi < safmin) { | |||
r__1 = -safmin / ai; | |||
q__1.r = 0.f, q__1.i = r__1; | |||
cscal_(n, &q__1, &x[1], incx); | |||
csscal_(n, &safmax, &x[1], incx); | |||
} else { | |||
r__1 = -1.f / ai; | |||
q__1.r = 0.f, q__1.i = r__1; | |||
cscal_(n, &q__1, &x[1], incx); | |||
} | |||
} else { | |||
/* The following numbers can be computed. */ | |||
/* They are the inverse of the real and imaginary parts of 1/alpha. */ | |||
/* Note that a and b are always different from zero. */ | |||
/* NaNs are only possible if either: */ | |||
/* 1. alphaR or alphaI is NaN. */ | |||
/* 2. alphaR and alphaI are both infinite, in which case it makes sense */ | |||
/* to propagate a NaN. */ | |||
ur = ar + ai * (ai / ar); | |||
ui = ai + ar * (ar / ai); | |||
if (abs(ur) < safmin || abs(ui) < safmin) { | |||
/* This means that both alphaR and alphaI are very small. */ | |||
r__1 = safmin / ur; | |||
r__2 = -safmin / ui; | |||
q__1.r = r__1, q__1.i = r__2; | |||
cscal_(n, &q__1, &x[1], incx); | |||
csscal_(n, &safmax, &x[1], incx); | |||
} else if (abs(ur) > safmax || abs(ui) > safmax) { | |||
if (absr > ov || absi > ov) { | |||
/* This means that a and b are both Inf. No need for scaling. */ | |||
r__1 = 1.f / ur; | |||
r__2 = -1.f / ui; | |||
q__1.r = r__1, q__1.i = r__2; | |||
cscal_(n, &q__1, &x[1], incx); | |||
} else { | |||
csscal_(n, &safmin, &x[1], incx); | |||
if (abs(ur) > ov || abs(ui) > ov) { | |||
/* Infs were generated. We do proper scaling to avoid them. */ | |||
if (absr >= absi) { | |||
/* ABS( UR ) <= ABS( UI ) */ | |||
ur = safmin * ar + safmin * (ai * (ai / ar)); | |||
ui = safmin * ai + ar * (safmin * ar / ai); | |||
} else { | |||
/* ABS( UR ) > ABS( UI ) */ | |||
ur = safmin * ar + ai * (safmin * ai / ar); | |||
ui = safmin * ai + safmin * (ar * (ar / ai)); | |||
} | |||
r__1 = 1.f / ur; | |||
r__2 = -1.f / ui; | |||
q__1.r = r__1, q__1.i = r__2; | |||
cscal_(n, &q__1, &x[1], incx); | |||
} else { | |||
r__1 = safmax / ur; | |||
r__2 = -safmax / ui; | |||
q__1.r = r__1, q__1.i = r__2; | |||
cscal_(n, &q__1, &x[1], incx); | |||
} | |||
} | |||
} else { | |||
r__1 = 1.f / ur; | |||
r__2 = -1.f / ui; | |||
q__1.r = r__1, q__1.i = r__2; | |||
cscal_(n, &q__1, &x[1], incx); | |||
} | |||
} | |||
return 0; | |||
/* End of CRSCL */ | |||
} /* crscl_ */ | |||
@@ -0,0 +1,735 @@ | |||
#include <math.h> | |||
#include <stdlib.h> | |||
#include <string.h> | |||
#include <stdio.h> | |||
#include <complex.h> | |||
#ifdef complex | |||
#undef complex | |||
#endif | |||
#ifdef I | |||
#undef I | |||
#endif | |||
#if defined(_WIN64) | |||
typedef long long BLASLONG; | |||
typedef unsigned long long BLASULONG; | |||
#else | |||
typedef long BLASLONG; | |||
typedef unsigned long BLASULONG; | |||
#endif | |||
#ifdef LAPACK_ILP64 | |||
typedef BLASLONG blasint; | |||
#if defined(_WIN64) | |||
#define blasabs(x) llabs(x) | |||
#else | |||
#define blasabs(x) labs(x) | |||
#endif | |||
#else | |||
typedef int blasint; | |||
#define blasabs(x) abs(x) | |||
#endif | |||
typedef blasint integer; | |||
typedef unsigned int uinteger; | |||
typedef char *address; | |||
typedef short int shortint; | |||
typedef float real; | |||
typedef double doublereal; | |||
typedef struct { real r, i; } complex; | |||
typedef struct { doublereal r, i; } doublecomplex; | |||
#ifdef _MSC_VER | |||
static inline _Fcomplex Cf(complex *z) {_Fcomplex zz={z->r , z->i}; return zz;} | |||
static inline _Dcomplex Cd(doublecomplex *z) {_Dcomplex zz={z->r , z->i};return zz;} | |||
static inline _Fcomplex * _pCf(complex *z) {return (_Fcomplex*)z;} | |||
static inline _Dcomplex * _pCd(doublecomplex *z) {return (_Dcomplex*)z;} | |||
#else | |||
static inline _Complex float Cf(complex *z) {return z->r + z->i*_Complex_I;} | |||
static inline _Complex double Cd(doublecomplex *z) {return z->r + z->i*_Complex_I;} | |||
static inline _Complex float * _pCf(complex *z) {return (_Complex float*)z;} | |||
static inline _Complex double * _pCd(doublecomplex *z) {return (_Complex double*)z;} | |||
#endif | |||
#define pCf(z) (*_pCf(z)) | |||
#define pCd(z) (*_pCd(z)) | |||
typedef int logical; | |||
typedef short int shortlogical; | |||
typedef char logical1; | |||
typedef char integer1; | |||
#define TRUE_ (1) | |||
#define FALSE_ (0) | |||
/* Extern is for use with -E */ | |||
#ifndef Extern | |||
#define Extern extern | |||
#endif | |||
/* I/O stuff */ | |||
typedef int flag; | |||
typedef int ftnlen; | |||
typedef int ftnint; | |||
/*external read, write*/ | |||
typedef struct | |||
{ flag cierr; | |||
ftnint ciunit; | |||
flag ciend; | |||
char *cifmt; | |||
ftnint cirec; | |||
} cilist; | |||
/*internal read, write*/ | |||
typedef struct | |||
{ flag icierr; | |||
char *iciunit; | |||
flag iciend; | |||
char *icifmt; | |||
ftnint icirlen; | |||
ftnint icirnum; | |||
} icilist; | |||
/*open*/ | |||
typedef struct | |||
{ flag oerr; | |||
ftnint ounit; | |||
char *ofnm; | |||
ftnlen ofnmlen; | |||
char *osta; | |||
char *oacc; | |||
char *ofm; | |||
ftnint orl; | |||
char *oblnk; | |||
} olist; | |||
/*close*/ | |||
typedef struct | |||
{ flag cerr; | |||
ftnint cunit; | |||
char *csta; | |||
} cllist; | |||
/*rewind, backspace, endfile*/ | |||
typedef struct | |||
{ flag aerr; | |||
ftnint aunit; | |||
} alist; | |||
/* inquire */ | |||
typedef struct | |||
{ flag inerr; | |||
ftnint inunit; | |||
char *infile; | |||
ftnlen infilen; | |||
ftnint *inex; /*parameters in standard's order*/ | |||
ftnint *inopen; | |||
ftnint *innum; | |||
ftnint *innamed; | |||
char *inname; | |||
ftnlen innamlen; | |||
char *inacc; | |||
ftnlen inacclen; | |||
char *inseq; | |||
ftnlen inseqlen; | |||
char *indir; | |||
ftnlen indirlen; | |||
char *infmt; | |||
ftnlen infmtlen; | |||
char *inform; | |||
ftnint informlen; | |||
char *inunf; | |||
ftnlen inunflen; | |||
ftnint *inrecl; | |||
ftnint *innrec; | |||
char *inblank; | |||
ftnlen inblanklen; | |||
} inlist; | |||
#define VOID void | |||
union Multitype { /* for multiple entry points */ | |||
integer1 g; | |||
shortint h; | |||
integer i; | |||
/* longint j; */ | |||
real r; | |||
doublereal d; | |||
complex c; | |||
doublecomplex z; | |||
}; | |||
typedef union Multitype Multitype; | |||
struct Vardesc { /* for Namelist */ | |||
char *name; | |||
char *addr; | |||
ftnlen *dims; | |||
int type; | |||
}; | |||
typedef struct Vardesc Vardesc; | |||
struct Namelist { | |||
char *name; | |||
Vardesc **vars; | |||
int nvars; | |||
}; | |||
typedef struct Namelist Namelist; | |||
#define abs(x) ((x) >= 0 ? (x) : -(x)) | |||
#define dabs(x) (fabs(x)) | |||
#define f2cmin(a,b) ((a) <= (b) ? (a) : (b)) | |||
#define f2cmax(a,b) ((a) >= (b) ? (a) : (b)) | |||
#define dmin(a,b) (f2cmin(a,b)) | |||
#define dmax(a,b) (f2cmax(a,b)) | |||
#define bit_test(a,b) ((a) >> (b) & 1) | |||
#define bit_clear(a,b) ((a) & ~((uinteger)1 << (b))) | |||
#define bit_set(a,b) ((a) | ((uinteger)1 << (b))) | |||
#define abort_() { sig_die("Fortran abort routine called", 1); } | |||
#define c_abs(z) (cabsf(Cf(z))) | |||
#define c_cos(R,Z) { pCf(R)=ccos(Cf(Z)); } | |||
#ifdef _MSC_VER | |||
#define c_div(c, a, b) {Cf(c)._Val[0] = (Cf(a)._Val[0]/Cf(b)._Val[0]); Cf(c)._Val[1]=(Cf(a)._Val[1]/Cf(b)._Val[1]);} | |||
#define z_div(c, a, b) {Cd(c)._Val[0] = (Cd(a)._Val[0]/Cd(b)._Val[0]); Cd(c)._Val[1]=(Cd(a)._Val[1]/Cd(b)._Val[1]);} | |||
#else | |||
#define c_div(c, a, b) {pCf(c) = Cf(a)/Cf(b);} | |||
#define z_div(c, a, b) {pCd(c) = Cd(a)/Cd(b);} | |||
#endif | |||
#define c_exp(R, Z) {pCf(R) = cexpf(Cf(Z));} | |||
#define c_log(R, Z) {pCf(R) = clogf(Cf(Z));} | |||
#define c_sin(R, Z) {pCf(R) = csinf(Cf(Z));} | |||
//#define c_sqrt(R, Z) {*(R) = csqrtf(Cf(Z));} | |||
#define c_sqrt(R, Z) {pCf(R) = csqrtf(Cf(Z));} | |||
#define d_abs(x) (fabs(*(x))) | |||
#define d_acos(x) (acos(*(x))) | |||
#define d_asin(x) (asin(*(x))) | |||
#define d_atan(x) (atan(*(x))) | |||
#define d_atn2(x, y) (atan2(*(x),*(y))) | |||
#define d_cnjg(R, Z) { pCd(R) = conj(Cd(Z)); } | |||
#define r_cnjg(R, Z) { pCf(R) = conjf(Cf(Z)); } | |||
#define d_cos(x) (cos(*(x))) | |||
#define d_cosh(x) (cosh(*(x))) | |||
#define d_dim(__a, __b) ( *(__a) > *(__b) ? *(__a) - *(__b) : 0.0 ) | |||
#define d_exp(x) (exp(*(x))) | |||
#define d_imag(z) (cimag(Cd(z))) | |||
#define r_imag(z) (cimagf(Cf(z))) | |||
#define d_int(__x) (*(__x)>0 ? floor(*(__x)) : -floor(- *(__x))) | |||
#define r_int(__x) (*(__x)>0 ? floor(*(__x)) : -floor(- *(__x))) | |||
#define d_lg10(x) ( 0.43429448190325182765 * log(*(x)) ) | |||
#define r_lg10(x) ( 0.43429448190325182765 * log(*(x)) ) | |||
#define d_log(x) (log(*(x))) | |||
#define d_mod(x, y) (fmod(*(x), *(y))) | |||
#define u_nint(__x) ((__x)>=0 ? floor((__x) + .5) : -floor(.5 - (__x))) | |||
#define d_nint(x) u_nint(*(x)) | |||
#define u_sign(__a,__b) ((__b) >= 0 ? ((__a) >= 0 ? (__a) : -(__a)) : -((__a) >= 0 ? (__a) : -(__a))) | |||
#define d_sign(a,b) u_sign(*(a),*(b)) | |||
#define r_sign(a,b) u_sign(*(a),*(b)) | |||
#define d_sin(x) (sin(*(x))) | |||
#define d_sinh(x) (sinh(*(x))) | |||
#define d_sqrt(x) (sqrt(*(x))) | |||
#define d_tan(x) (tan(*(x))) | |||
#define d_tanh(x) (tanh(*(x))) | |||
#define i_abs(x) abs(*(x)) | |||
#define i_dnnt(x) ((integer)u_nint(*(x))) | |||
#define i_len(s, n) (n) | |||
#define i_nint(x) ((integer)u_nint(*(x))) | |||
#define i_sign(a,b) ((integer)u_sign((integer)*(a),(integer)*(b))) | |||
#define pow_dd(ap, bp) ( pow(*(ap), *(bp))) | |||
#define pow_si(B,E) spow_ui(*(B),*(E)) | |||
#define pow_ri(B,E) spow_ui(*(B),*(E)) | |||
#define pow_di(B,E) dpow_ui(*(B),*(E)) | |||
#define pow_zi(p, a, b) {pCd(p) = zpow_ui(Cd(a), *(b));} | |||
#define pow_ci(p, a, b) {pCf(p) = cpow_ui(Cf(a), *(b));} | |||
#define pow_zz(R,A,B) {pCd(R) = cpow(Cd(A),*(B));} | |||
#define s_cat(lpp, rpp, rnp, np, llp) { ftnlen i, nc, ll; char *f__rp, *lp; ll = (llp); lp = (lpp); for(i=0; i < (int)*(np); ++i) { nc = ll; if((rnp)[i] < nc) nc = (rnp)[i]; ll -= nc; f__rp = (rpp)[i]; while(--nc >= 0) *lp++ = *(f__rp)++; } while(--ll >= 0) *lp++ = ' '; } | |||
#define s_cmp(a,b,c,d) ((integer)strncmp((a),(b),f2cmin((c),(d)))) | |||
#define s_copy(A,B,C,D) { int __i,__m; for (__i=0, __m=f2cmin((C),(D)); __i<__m && (B)[__i] != 0; ++__i) (A)[__i] = (B)[__i]; } | |||
#define sig_die(s, kill) { exit(1); } | |||
#define s_stop(s, n) {exit(0);} | |||
static char junk[] = "\n@(#)LIBF77 VERSION 19990503\n"; | |||
#define z_abs(z) (cabs(Cd(z))) | |||
#define z_exp(R, Z) {pCd(R) = cexp(Cd(Z));} | |||
#define z_sqrt(R, Z) {pCd(R) = csqrt(Cd(Z));} | |||
#define myexit_() break; | |||
#define mycycle_() continue; | |||
#define myceiling_(w) {ceil(w)} | |||
#define myhuge_(w) {HUGE_VAL} | |||
//#define mymaxloc_(w,s,e,n) {if (sizeof(*(w)) == sizeof(double)) dmaxloc_((w),*(s),*(e),n); else dmaxloc_((w),*(s),*(e),n);} | |||
#define mymaxloc_(w,s,e,n) dmaxloc_(w,*(s),*(e),n) | |||
/* procedure parameter types for -A and -C++ */ | |||
#define F2C_proc_par_types 1 | |||
#ifdef __cplusplus | |||
typedef logical (*L_fp)(...); | |||
#else | |||
typedef logical (*L_fp)(); | |||
#endif | |||
static float spow_ui(float x, integer n) { | |||
float pow=1.0; unsigned long int u; | |||
if(n != 0) { | |||
if(n < 0) n = -n, x = 1/x; | |||
for(u = n; ; ) { | |||
if(u & 01) pow *= x; | |||
if(u >>= 1) x *= x; | |||
else break; | |||
} | |||
} | |||
return pow; | |||
} | |||
static double dpow_ui(double x, integer n) { | |||
double pow=1.0; unsigned long int u; | |||
if(n != 0) { | |||
if(n < 0) n = -n, x = 1/x; | |||
for(u = n; ; ) { | |||
if(u & 01) pow *= x; | |||
if(u >>= 1) x *= x; | |||
else break; | |||
} | |||
} | |||
return pow; | |||
} | |||
#ifdef _MSC_VER | |||
static _Fcomplex cpow_ui(complex x, integer n) { | |||
complex pow={1.0,0.0}; unsigned long int u; | |||
if(n != 0) { | |||
if(n < 0) n = -n, x.r = 1/x.r, x.i=1/x.i; | |||
for(u = n; ; ) { | |||
if(u & 01) pow.r *= x.r, pow.i *= x.i; | |||
if(u >>= 1) x.r *= x.r, x.i *= x.i; | |||
else break; | |||
} | |||
} | |||
_Fcomplex p={pow.r, pow.i}; | |||
return p; | |||
} | |||
#else | |||
static _Complex float cpow_ui(_Complex float x, integer n) { | |||
_Complex float pow=1.0; unsigned long int u; | |||
if(n != 0) { | |||
if(n < 0) n = -n, x = 1/x; | |||
for(u = n; ; ) { | |||
if(u & 01) pow *= x; | |||
if(u >>= 1) x *= x; | |||
else break; | |||
} | |||
} | |||
return pow; | |||
} | |||
#endif | |||
#ifdef _MSC_VER | |||
static _Dcomplex zpow_ui(_Dcomplex x, integer n) { | |||
_Dcomplex pow={1.0,0.0}; unsigned long int u; | |||
if(n != 0) { | |||
if(n < 0) n = -n, x._Val[0] = 1/x._Val[0], x._Val[1] =1/x._Val[1]; | |||
for(u = n; ; ) { | |||
if(u & 01) pow._Val[0] *= x._Val[0], pow._Val[1] *= x._Val[1]; | |||
if(u >>= 1) x._Val[0] *= x._Val[0], x._Val[1] *= x._Val[1]; | |||
else break; | |||
} | |||
} | |||
_Dcomplex p = {pow._Val[0], pow._Val[1]}; | |||
return p; | |||
} | |||
#else | |||
static _Complex double zpow_ui(_Complex double x, integer n) { | |||
_Complex double pow=1.0; unsigned long int u; | |||
if(n != 0) { | |||
if(n < 0) n = -n, x = 1/x; | |||
for(u = n; ; ) { | |||
if(u & 01) pow *= x; | |||
if(u >>= 1) x *= x; | |||
else break; | |||
} | |||
} | |||
return pow; | |||
} | |||
#endif | |||
static integer pow_ii(integer x, integer n) { | |||
integer pow; unsigned long int u; | |||
if (n <= 0) { | |||
if (n == 0 || x == 1) pow = 1; | |||
else if (x != -1) pow = x == 0 ? 1/x : 0; | |||
else n = -n; | |||
} | |||
if ((n > 0) || !(n == 0 || x == 1 || x != -1)) { | |||
u = n; | |||
for(pow = 1; ; ) { | |||
if(u & 01) pow *= x; | |||
if(u >>= 1) x *= x; | |||
else break; | |||
} | |||
} | |||
return pow; | |||
} | |||
static integer dmaxloc_(double *w, integer s, integer e, integer *n) | |||
{ | |||
double m; integer i, mi; | |||
for(m=w[s-1], mi=s, i=s+1; i<=e; i++) | |||
if (w[i-1]>m) mi=i ,m=w[i-1]; | |||
return mi-s+1; | |||
} | |||
static integer smaxloc_(float *w, integer s, integer e, integer *n) | |||
{ | |||
float m; integer i, mi; | |||
for(m=w[s-1], mi=s, i=s+1; i<=e; i++) | |||
if (w[i-1]>m) mi=i ,m=w[i-1]; | |||
return mi-s+1; | |||
} | |||
static inline void cdotc_(complex *z, integer *n_, complex *x, integer *incx_, complex *y, integer *incy_) { | |||
integer n = *n_, incx = *incx_, incy = *incy_, i; | |||
#ifdef _MSC_VER | |||
_Fcomplex zdotc = {0.0, 0.0}; | |||
if (incx == 1 && incy == 1) { | |||
for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */ | |||
zdotc._Val[0] += conjf(Cf(&x[i]))._Val[0] * Cf(&y[i])._Val[0]; | |||
zdotc._Val[1] += conjf(Cf(&x[i]))._Val[1] * Cf(&y[i])._Val[1]; | |||
} | |||
} else { | |||
for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */ | |||
zdotc._Val[0] += conjf(Cf(&x[i*incx]))._Val[0] * Cf(&y[i*incy])._Val[0]; | |||
zdotc._Val[1] += conjf(Cf(&x[i*incx]))._Val[1] * Cf(&y[i*incy])._Val[1]; | |||
} | |||
} | |||
pCf(z) = zdotc; | |||
} | |||
#else | |||
_Complex float zdotc = 0.0; | |||
if (incx == 1 && incy == 1) { | |||
for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */ | |||
zdotc += conjf(Cf(&x[i])) * Cf(&y[i]); | |||
} | |||
} else { | |||
for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */ | |||
zdotc += conjf(Cf(&x[i*incx])) * Cf(&y[i*incy]); | |||
} | |||
} | |||
pCf(z) = zdotc; | |||
} | |||
#endif | |||
static inline void zdotc_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||
integer n = *n_, incx = *incx_, incy = *incy_, i; | |||
#ifdef _MSC_VER | |||
_Dcomplex zdotc = {0.0, 0.0}; | |||
if (incx == 1 && incy == 1) { | |||
for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */ | |||
zdotc._Val[0] += conj(Cd(&x[i]))._Val[0] * Cd(&y[i])._Val[0]; | |||
zdotc._Val[1] += conj(Cd(&x[i]))._Val[1] * Cd(&y[i])._Val[1]; | |||
} | |||
} else { | |||
for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */ | |||
zdotc._Val[0] += conj(Cd(&x[i*incx]))._Val[0] * Cd(&y[i*incy])._Val[0]; | |||
zdotc._Val[1] += conj(Cd(&x[i*incx]))._Val[1] * Cd(&y[i*incy])._Val[1]; | |||
} | |||
} | |||
pCd(z) = zdotc; | |||
} | |||
#else | |||
_Complex double zdotc = 0.0; | |||
if (incx == 1 && incy == 1) { | |||
for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */ | |||
zdotc += conj(Cd(&x[i])) * Cd(&y[i]); | |||
} | |||
} else { | |||
for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */ | |||
zdotc += conj(Cd(&x[i*incx])) * Cd(&y[i*incy]); | |||
} | |||
} | |||
pCd(z) = zdotc; | |||
} | |||
#endif | |||
static inline void cdotu_(complex *z, integer *n_, complex *x, integer *incx_, complex *y, integer *incy_) { | |||
integer n = *n_, incx = *incx_, incy = *incy_, i; | |||
#ifdef _MSC_VER | |||
_Fcomplex zdotc = {0.0, 0.0}; | |||
if (incx == 1 && incy == 1) { | |||
for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */ | |||
zdotc._Val[0] += Cf(&x[i])._Val[0] * Cf(&y[i])._Val[0]; | |||
zdotc._Val[1] += Cf(&x[i])._Val[1] * Cf(&y[i])._Val[1]; | |||
} | |||
} else { | |||
for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */ | |||
zdotc._Val[0] += Cf(&x[i*incx])._Val[0] * Cf(&y[i*incy])._Val[0]; | |||
zdotc._Val[1] += Cf(&x[i*incx])._Val[1] * Cf(&y[i*incy])._Val[1]; | |||
} | |||
} | |||
pCf(z) = zdotc; | |||
} | |||
#else | |||
_Complex float zdotc = 0.0; | |||
if (incx == 1 && incy == 1) { | |||
for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */ | |||
zdotc += Cf(&x[i]) * Cf(&y[i]); | |||
} | |||
} else { | |||
for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */ | |||
zdotc += Cf(&x[i*incx]) * Cf(&y[i*incy]); | |||
} | |||
} | |||
pCf(z) = zdotc; | |||
} | |||
#endif | |||
static inline void zdotu_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) { | |||
integer n = *n_, incx = *incx_, incy = *incy_, i; | |||
#ifdef _MSC_VER | |||
_Dcomplex zdotc = {0.0, 0.0}; | |||
if (incx == 1 && incy == 1) { | |||
for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */ | |||
zdotc._Val[0] += Cd(&x[i])._Val[0] * Cd(&y[i])._Val[0]; | |||
zdotc._Val[1] += Cd(&x[i])._Val[1] * Cd(&y[i])._Val[1]; | |||
} | |||
} else { | |||
for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */ | |||
zdotc._Val[0] += Cd(&x[i*incx])._Val[0] * Cd(&y[i*incy])._Val[0]; | |||
zdotc._Val[1] += Cd(&x[i*incx])._Val[1] * Cd(&y[i*incy])._Val[1]; | |||
} | |||
} | |||
pCd(z) = zdotc; | |||
} | |||
#else | |||
_Complex double zdotc = 0.0; | |||
if (incx == 1 && incy == 1) { | |||
for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */ | |||
zdotc += Cd(&x[i]) * Cd(&y[i]); | |||
} | |||
} else { | |||
for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */ | |||
zdotc += Cd(&x[i*incx]) * Cd(&y[i*incy]); | |||
} | |||
} | |||
pCd(z) = zdotc; | |||
} | |||
#endif | |||
/* -- translated by f2c (version 20000121). | |||
You must link the resulting object file with the libraries: | |||
-lf2c -lm (in that order) | |||
*/ | |||
/* -- translated by f2c (version 20000121). | |||
You must link the resulting object file with the libraries: | |||
-lf2c -lm (in that order) | |||
*/ | |||
/* > \brief \b ZDRSCL multiplies a vector by the reciprocal of a real scalar. */ | |||
/* =========== DOCUMENTATION =========== */ | |||
/* Online html documentation available at */ | |||
/* http://www.netlib.org/lapack/explore-html/ */ | |||
/* > \htmlonly */ | |||
/* > Download ZDRSCL + dependencies */ | |||
/* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/zdrscl. | |||
f"> */ | |||
/* > [TGZ]</a> */ | |||
/* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/zdrscl. | |||
f"> */ | |||
/* > [ZIP]</a> */ | |||
/* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/zdrscl. | |||
f"> */ | |||
/* > [TXT]</a> */ | |||
/* > \endhtmlonly */ | |||
/* Definition: */ | |||
/* =========== */ | |||
/* SUBROUTINE ZRSCL( N, A, X, INCX ) */ | |||
/* INTEGER INCX, N */ | |||
/* COMPLEX*16 A */ | |||
/* COMPLEX*16 X( * ) */ | |||
/* > \par Purpose: */ | |||
/* ============= */ | |||
/* > */ | |||
/* > \verbatim */ | |||
/* > */ | |||
/* > ZRSCL multiplies an n-element complex vector x by the complex scalar */ | |||
/* > 1/a. This is done without overflow or underflow as long as */ | |||
/* > the final result x/a does not overflow or underflow. */ | |||
/* > \endverbatim */ | |||
/* Arguments: */ | |||
/* ========== */ | |||
/* > \param[in] N */ | |||
/* > \verbatim */ | |||
/* > N is INTEGER */ | |||
/* > The number of components of the vector x. */ | |||
/* > \endverbatim */ | |||
/* > */ | |||
/* > \param[in] A */ | |||
/* > \verbatim */ | |||
/* > A is COMPLEX*16 */ | |||
/* > The scalar a which is used to divide each component of x. */ | |||
/* > A must not be 0, or the subroutine will divide by zero. */ | |||
/* > \endverbatim */ | |||
/* > */ | |||
/* > \param[in,out] X */ | |||
/* > \verbatim */ | |||
/* > X is COMPLEX*16 array, dimension */ | |||
/* > (1+(N-1)*abs(INCX)) */ | |||
/* > The n-element vector x. */ | |||
/* > \endverbatim */ | |||
/* > */ | |||
/* > \param[in] INCX */ | |||
/* > \verbatim */ | |||
/* > INCX is INTEGER */ | |||
/* > The increment between successive values of the vector SX. */ | |||
/* > > 0: SX(1) = X(1) and SX(1+(i-1)*INCX) = x(i), 1< i<= n */ | |||
/* > \endverbatim */ | |||
/* Authors: */ | |||
/* ======== */ | |||
/* > \author Univ. of Tennessee */ | |||
/* > \author Univ. of California Berkeley */ | |||
/* > \author Univ. of Colorado Denver */ | |||
/* > \author NAG Ltd. */ | |||
/* > \ingroup complex16OTHERauxiliary */ | |||
/* ===================================================================== */ | |||
/* Subroutine */ int zrscl_(integer *n, doublecomplex *a, doublecomplex *x, | |||
integer *incx) | |||
{ | |||
/* System generated locals */ | |||
doublereal d__1, d__2; | |||
doublecomplex z__1; | |||
/* Local variables */ | |||
doublereal absi, absr; | |||
extern /* Subroutine */ int zscal_(integer *, doublecomplex *, | |||
doublecomplex *, integer *); | |||
doublereal ai, ar; | |||
extern doublereal dlamch_(char *); | |||
doublereal ui, ov, ur, safmin, safmax; | |||
extern /* Subroutine */ int zdscal_(integer *, doublereal *, | |||
doublecomplex *, integer *), zdrscl_(integer *, doublereal *, | |||
doublecomplex *, integer *); | |||
/* -- LAPACK auxiliary routine -- */ | |||
/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ | |||
/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ | |||
/* ===================================================================== */ | |||
/* Quick return if possible */ | |||
/* Parameter adjustments */ | |||
--x; | |||
/* Function Body */ | |||
if (*n <= 0) { | |||
return 0; | |||
} | |||
/* Get machine parameters */ | |||
safmin = dlamch_("S"); | |||
safmax = 1. / safmin; | |||
ov = dlamch_("O"); | |||
/* Initialize constants related to A. */ | |||
ar = a->r; | |||
ai = d_imag(a); | |||
absr = abs(ar); | |||
absi = abs(ai); | |||
if (ai == 0.) { | |||
/* If alpha is real, then we can use csrscl */ | |||
zdrscl_(n, &ar, &x[1], incx); | |||
} else if (ar == 0.) { | |||
/* If alpha has a zero real part, then we follow the same rules as if */ | |||
/* alpha were real. */ | |||
if (absi > safmax) { | |||
zdscal_(n, &safmin, &x[1], incx); | |||
d__1 = -safmax / ai; | |||
z__1.r = 0., z__1.i = d__1; | |||
zscal_(n, &z__1, &x[1], incx); | |||
} else if (absi < safmin) { | |||
d__1 = -safmin / ai; | |||
z__1.r = 0., z__1.i = d__1; | |||
zscal_(n, &z__1, &x[1], incx); | |||
zdscal_(n, &safmax, &x[1], incx); | |||
} else { | |||
d__1 = -1. / ai; | |||
z__1.r = 0., z__1.i = d__1; | |||
zscal_(n, &z__1, &x[1], incx); | |||
} | |||
} else { | |||
/* The following numbers can be computed. */ | |||
/* They are the inverse of the real and imaginary parts of 1/alpha. */ | |||
/* Note that a and b are always different from zero. */ | |||
/* NaNs are only possible if either: */ | |||
/* 1. alphaR or alphaI is NaN. */ | |||
/* 2. alphaR and alphaI are both infinite, in which case it makes sense */ | |||
/* to propagate a NaN. */ | |||
ur = ar + ai * (ai / ar); | |||
ui = ai + ar * (ar / ai); | |||
if (abs(ur) < safmin || abs(ui) < safmin) { | |||
/* This means that both alphaR and alphaI are very small. */ | |||
d__1 = safmin / ur; | |||
d__2 = -safmin / ui; | |||
z__1.r = d__1, z__1.i = d__2; | |||
zscal_(n, &z__1, &x[1], incx); | |||
zdscal_(n, &safmax, &x[1], incx); | |||
} else if (abs(ur) > safmax || abs(ui) > safmax) { | |||
if (absr > ov || absi > ov) { | |||
/* This means that a and b are both Inf. No need for scaling. */ | |||
d__1 = 1. / ur; | |||
d__2 = -1. / ui; | |||
z__1.r = d__1, z__1.i = d__2; | |||
zscal_(n, &z__1, &x[1], incx); | |||
} else { | |||
zdscal_(n, &safmin, &x[1], incx); | |||
if (abs(ur) > ov || abs(ui) > ov) { | |||
/* Infs were generated. We do proper scaling to avoid them. */ | |||
if (absr >= absi) { | |||
/* ABS( UR ) <= ABS( UI ) */ | |||
ur = safmin * ar + safmin * (ai * (ai / ar)); | |||
ui = safmin * ai + ar * (safmin * ar / ai); | |||
} else { | |||
/* ABS( UR ) > ABS( UI ) */ | |||
ur = safmin * ar + ai * (safmin * ai / ar); | |||
ui = safmin * ai + safmin * (ar * (ar / ai)); | |||
} | |||
d__1 = 1. / ur; | |||
d__2 = -1. / ui; | |||
z__1.r = d__1, z__1.i = d__2; | |||
zscal_(n, &z__1, &x[1], incx); | |||
} else { | |||
d__1 = safmax / ur; | |||
d__2 = -safmax / ui; | |||
z__1.r = d__1, z__1.i = d__2; | |||
zscal_(n, &z__1, &x[1], incx); | |||
} | |||
} | |||
} else { | |||
d__1 = 1. / ur; | |||
d__2 = -1. / ui; | |||
z__1.r = d__1, z__1.i = d__2; | |||
zscal_(n, &z__1, &x[1], incx); | |||
} | |||
} | |||
return 0; | |||
/* End of ZRSCL */ | |||
} /* zrscl_ */ | |||