2022-04-10 04:38:58 +08:00
# 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 ;
2022-04-17 23:49:38 +08:00
# 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
2022-04-10 04:38:58 +08:00
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 ; }
2022-04-17 23:49:38 +08:00
# endif
2022-04-10 04:38:58 +08:00
# define pCf(z) (*_pCf(z))
# define pCd(z) (*_pCd(z))
2024-04-04 07:32:37 +08:00
typedef blasint logical ;
2022-04-10 04:38:58 +08:00
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)); }
2022-04-17 23:49:38 +08:00
# ifdef _MSC_VER
2025-12-21 01:02:28 +08:00
# define c_div(c, a, b) {float nenn=crealf(_FCmulcc(Cf(b),conjf(Cf(b)))); _Fcomplex zaehl=_FCmulcc(Cf(a),conjf(Cf(b))); pCf(c)=_FCbuild(crealf(zaehl) / nenn,cimagf(zaehl) / nenn);}
# define z_div(c, a, b) {double nenn=creal(_Cmulcc(Cd(b),conj(Cd(b)))); _Dcomplex zaehl=_Cmulcc(Cd(a),conj(Cd(b))); pCd(c)=_Cbuild(creal(zaehl) / nenn,cimag(zaehl) / nenn);}
2022-04-17 23:49:38 +08:00
# else
2022-04-10 04:38:58 +08:00
# define c_div(c, a, b) {pCf(c) = Cf(a) / Cf(b);}
# define z_div(c, a, b) {pCd(c) = Cd(a) / Cd(b);}
2022-04-17 23:49:38 +08:00
# endif
2022-04-10 04:38:58 +08:00
# 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)); }
2022-04-17 23:49:38 +08:00
# define r_cnjg(R, Z) { pCf(R) = conjf(Cf(Z)); }
2022-04-10 04:38:58 +08:00
# 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)))
2022-04-17 23:49:38 +08:00
# define r_imag(z) (cimagf(Cf(z)))
2022-04-10 04:38:58 +08:00
# 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++ */
2024-04-04 07:32:37 +08:00
2022-04-10 04:38:58 +08:00
# 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 ;
}
2022-04-17 23:49:38 +08:00
# 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
2022-04-10 04:38:58 +08:00
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 ;
}
2022-04-17 23:49:38 +08:00
# 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
2022-04-10 04:38:58 +08:00
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 ;
}
2022-04-17 23:49:38 +08:00
# endif
2022-04-10 04:38:58 +08:00
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 ;
}
2025-12-12 05:39:11 +08:00
2022-04-10 04:38:58 +08:00
static inline void cdotc_ ( complex * z , integer * n_ , complex * x , integer * incx_ , complex * y , integer * incy_ ) {
integer n = * n_ , incx = * incx_ , incy = * incy_ , i ;
2022-04-17 23:49:38 +08:00
# 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) */
2025-12-12 05:39:11 +08:00
zdotc . _Val [ 0 ] + = Cf ( & x [ i ] ) . _Val [ 0 ] * Cf ( & y [ i ] ) . _Val [ 0 ]
+ Cf ( & x [ i ] ) . _Val [ 1 ] * Cf ( & y [ i ] ) . _Val [ 1 ] ;
zdotc . _Val [ 1 ] - = Cf ( & x [ i ] ) . _Val [ 1 ] * Cf ( & y [ i ] ) . _Val [ 0 ]
- Cf ( & x [ i ] ) . _Val [ 0 ] * Cf ( & y [ i ] ) . _Val [ 1 ] ;
2022-04-17 23:49:38 +08:00
}
} else {
for ( i = 0 ; i < n ; i + + ) { /* zdotc = zdotc + dconjg(x(i))* y(i) */
2025-12-12 05:39:11 +08:00
zdotc . _Val [ 0 ] + = Cf ( & x [ i * incx ] ) . _Val [ 0 ] * Cf ( & y [ i * incy ] ) . _Val [ 0 ]
+ Cf ( & x [ i * incx ] ) . _Val [ 1 ] * Cf ( & y [ i * incy ] ) . _Val [ 1 ] ;
zdotc . _Val [ 1 ] - = Cf ( & x [ i * incx ] ) . _Val [ 1 ] * Cf ( & y [ i * incy ] ) . _Val [ 1 ]
- Cf ( & x [ i * incx ] ) . _Val [ 0 ] * Cf ( & y [ i * incy ] ) . _Val [ 1 ] ;
2022-04-17 23:49:38 +08:00
}
}
pCf ( z ) = zdotc ;
}
# else
2022-04-10 04:38:58 +08:00
_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 ;
}
2022-04-17 23:49:38 +08:00
# endif
2022-04-10 04:38:58 +08:00
static inline void zdotc_ ( doublecomplex * z , integer * n_ , doublecomplex * x , integer * incx_ , doublecomplex * y , integer * incy_ ) {
integer n = * n_ , incx = * incx_ , incy = * incy_ , i ;
2022-04-17 23:49:38 +08:00
# 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) */
2025-12-12 05:39:11 +08:00
zdotc . _Val [ 0 ] + = conj ( Cd ( & x [ i ] ) ) . _Val [ 0 ] * Cd ( & y [ i ] ) . _Val [ 0 ]
+ Cd ( & x [ i * incx ] ) . _Val [ 1 ] * Cd ( & y [ i * incy ] ) . _Val [ 1 ] ;
zdotc . _Val [ 1 ] + = conj ( Cd ( & x [ i ] ) ) . _Val [ 1 ] * Cd ( & y [ i ] ) . _Val [ 1 ]
- Cd ( & x [ i ] ) . _Val [ 0 ] * Cd ( & y [ i ] ) . _Val [ 1 ] ;
2022-04-17 23:49:38 +08:00
}
} else {
for ( i = 0 ; i < n ; i + + ) { /* zdotc = zdotc + dconjg(x(i))* y(i) */
2025-12-12 05:39:11 +08:00
zdotc . _Val [ 0 ] + = conj ( Cd ( & x [ i * incx ] ) ) . _Val [ 0 ] * Cd ( & y [ i * incy ] ) . _Val [ 0 ]
+ Cd ( & x [ i * incx ] ) . _Val [ 1 ] * Cd ( & y [ i * incy ] ) . _Val [ 1 ] ;
zdotc . _Val [ 1 ] + = conj ( Cd ( & x [ i * incx ] ) ) . _Val [ 1 ] * Cd ( & y [ i * incy ] ) . _Val [ 1 ]
- Cd ( & x [ i * incx ] ) . _Val [ 0 ] * Cd ( & y [ i * incy ] ) . _Val [ 1 ] ;
2022-04-17 23:49:38 +08:00
}
}
pCd ( z ) = zdotc ;
}
# else
2022-04-10 04:38:58 +08:00
_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 ;
2022-04-17 23:49:38 +08:00
}
# endif
2022-04-10 04:38:58 +08:00
static inline void cdotu_ ( complex * z , integer * n_ , complex * x , integer * incx_ , complex * y , integer * incy_ ) {
integer n = * n_ , incx = * incx_ , incy = * incy_ , i ;
2022-04-17 23:49:38 +08:00
# 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) */
2025-12-12 05:39:11 +08:00
zdotc . _Val [ 0 ] + = Cf ( & x [ i ] ) . _Val [ 0 ] * Cf ( & y [ i ] ) . _Val [ 0 ]
- Cf ( & x [ i ] ) . _Val [ 1 ] * Cf ( & y [ i ] ) . _Val [ 1 ] ;
zdotc . _Val [ 1 ] + = Cf ( & x [ i ] ) . _Val [ 1 ] * Cf ( & y [ i ] ) . _Val [ 1 ]
+ Cf ( & x [ i ] ) . _Val [ 0 ] * Cf ( & y [ i ] ) . _Val [ 1 ] ;
2022-04-17 23:49:38 +08:00
}
} else {
for ( i = 0 ; i < n ; i + + ) { /* zdotc = zdotc + dconjg(x(i))* y(i) */
2025-12-12 05:39:11 +08:00
zdotc . _Val [ 0 ] + = Cf ( & x [ i * incx ] ) . _Val [ 0 ] * Cf ( & y [ i * incy ] ) . _Val [ 0 ]
- Cf ( & x [ i * incx ] ) . _Val [ 1 ] * Cf ( & y [ i * incy ] ) . _Val [ 1 ] ;
zdotc . _Val [ 1 ] + = Cf ( & x [ i * incx ] ) . _Val [ 1 ] * Cf ( & y [ i * incy ] ) . _Val [ 1 ]
+ Cf ( & x [ i * incx ] ) . _Val [ 0 ] * Cf ( & y [ i * incy ] ) . _Val [ 1 ] ;
2022-04-17 23:49:38 +08:00
}
}
pCf ( z ) = zdotc ;
}
# else
2022-04-10 04:38:58 +08:00
_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 ;
}
2022-04-17 23:49:38 +08:00
# endif
2022-04-10 04:38:58 +08:00
static inline void zdotu_ ( doublecomplex * z , integer * n_ , doublecomplex * x , integer * incx_ , doublecomplex * y , integer * incy_ ) {
integer n = * n_ , incx = * incx_ , incy = * incy_ , i ;
2022-04-17 23:49:38 +08:00
# 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) */
2025-12-12 05:39:11 +08:00
zdotc . _Val [ 0 ] + = Cd ( & x [ i ] ) . _Val [ 0 ] * Cd ( & y [ i ] ) . _Val [ 0 ]
- Cd ( & x [ i ] ) . _Val [ 1 ] * Cd ( & y [ i ] ) . _Val [ 1 ] ;
zdotc . _Val [ 1 ] + = Cd ( & x [ i ] ) . _Val [ 1 ] * Cd ( & y [ i ] ) . _Val [ 1 ]
+ Cd ( & x [ i ] ) . _Val [ 0 ] * Cd ( & y [ i ] ) . _Val [ 1 ] ;
2022-04-17 23:49:38 +08:00
}
} else {
for ( i = 0 ; i < n ; i + + ) { /* zdotc = zdotc + dconjg(x(i))* y(i) */
2025-12-12 05:39:11 +08:00
zdotc . _Val [ 0 ] + = Cd ( & x [ i * incx ] ) . _Val [ 0 ] * Cd ( & y [ i * incy ] ) . _Val [ 0 ]
- Cd ( & x [ i * incx ] ) . _Val [ 1 ] * Cd ( & y [ i * incy ] ) . _Val [ 1 ] ;
zdotc . _Val [ 1 ] + = Cd ( & x [ i * incx ] ) . _Val [ 1 ] * Cd ( & y [ i * incy ] ) . _Val [ 1 ]
+ Cd ( & x [ i * incx ] ) . _Val [ 0 ] * Cd ( & y [ i * incy ] ) . _Val [ 1 ] ;
2022-04-17 23:49:38 +08:00
}
}
pCd ( z ) = zdotc ;
}
# else
2022-04-10 04:38:58 +08:00
_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 )
*/
2022-04-17 23:49:38 +08:00
2022-04-10 04:38:58 +08:00
/* Table of constant values */
static integer c__1 = 1 ;
/* > \brief <b> CPPSVX computes the solution to system of linear equations A * X = B for OTHER matrices</b> */
/* =========== DOCUMENTATION =========== */
/* Online html documentation available at */
/* http://www.netlib.org/lapack/explore-html/ */
/* > \htmlonly */
/* > Download CPPSVX + dependencies */
/* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/cppsvx.
f " > */
/* > [TGZ]</a> */
/* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/cppsvx.
f " > */
/* > [ZIP]</a> */
/* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/cppsvx.
f " > */
/* > [TXT]</a> */
/* > \endhtmlonly */
/* Definition: */
/* =========== */
/* SUBROUTINE CPPSVX( FACT, UPLO, N, NRHS, AP, AFP, EQUED, S, B, LDB, */
/* X, LDX, RCOND, FERR, BERR, WORK, RWORK, INFO ) */
/* CHARACTER EQUED, FACT, UPLO */
/* INTEGER INFO, LDB, LDX, N, NRHS */
/* REAL RCOND */
/* REAL BERR( * ), FERR( * ), RWORK( * ), S( * ) */
/* COMPLEX AFP( * ), AP( * ), B( LDB, * ), WORK( * ), */
/* $ X( LDX, * ) */
/* > \par Purpose: */
/* ============= */
/* > */
/* > \verbatim */
/* > */
/* > CPPSVX uses the Cholesky factorization A = U**H*U or A = L*L**H to */
/* > compute the solution to a complex system of linear equations */
/* > A * X = B, */
/* > where A is an N-by-N Hermitian positive definite matrix stored in */
/* > packed format and X and B are N-by-NRHS matrices. */
/* > */
/* > Error bounds on the solution and a condition estimate are also */
/* > provided. */
/* > \endverbatim */
/* > \par Description: */
/* ================= */
/* > */
/* > \verbatim */
/* > */
/* > The following steps are performed: */
/* > */
/* > 1. If FACT = 'E', real scaling factors are computed to equilibrate */
/* > the system: */
/* > diag(S) * A * diag(S) * inv(diag(S)) * X = diag(S) * B */
/* > Whether or not the system will be equilibrated depends on the */
/* > scaling of the matrix A, but if equilibration is used, A is */
/* > overwritten by diag(S)*A*diag(S) and B by diag(S)*B. */
/* > */
/* > 2. If FACT = 'N' or 'E', the Cholesky decomposition is used to */
/* > factor the matrix A (after equilibration if FACT = 'E') as */
/* > A = U**H * U , if UPLO = 'U', or */
/* > A = L * L**H, if UPLO = 'L', */
/* > where U is an upper triangular matrix, L is a lower triangular */
/* > matrix, and **H indicates conjugate transpose. */
/* > */
/* > 3. If the leading i-by-i principal minor is not positive definite, */
/* > then the routine returns with INFO = i. Otherwise, the factored */
/* > form of A is used to estimate the condition number of the matrix */
/* > A. If the reciprocal of the condition number is less than machine */
/* > precision, INFO = N+1 is returned as a warning, but the routine */
/* > still goes on to solve for X and compute error bounds as */
/* > described below. */
/* > */
/* > 4. The system of equations is solved for X using the factored form */
/* > of A. */
/* > */
/* > 5. Iterative refinement is applied to improve the computed solution */
/* > matrix and calculate error bounds and backward error estimates */
/* > for it. */
/* > */
/* > 6. If equilibration was used, the matrix X is premultiplied by */
/* > diag(S) so that it solves the original system before */
/* > equilibration. */
/* > \endverbatim */
/* Arguments: */
/* ========== */
/* > \param[in] FACT */
/* > \verbatim */
/* > FACT is CHARACTER*1 */
/* > Specifies whether or not the factored form of the matrix A is */
/* > supplied on entry, and if not, whether the matrix A should be */
/* > equilibrated before it is factored. */
/* > = 'F': On entry, AFP contains the factored form of A. */
/* > If EQUED = 'Y', the matrix A has been equilibrated */
/* > with scaling factors given by S. AP and AFP will not */
/* > be modified. */
/* > = 'N': The matrix A will be copied to AFP and factored. */
/* > = 'E': The matrix A will be equilibrated if necessary, then */
/* > copied to AFP and factored. */
/* > \endverbatim */
/* > */
/* > \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] N */
/* > \verbatim */
/* > N is INTEGER */
/* > The number of linear equations, i.e., the order of the */
/* > matrix A. N >= 0. */
/* > \endverbatim */
/* > */
/* > \param[in] NRHS */
/* > \verbatim */
/* > NRHS is INTEGER */
/* > The number of right hand sides, i.e., the number of columns */
/* > of the matrices B and X. NRHS >= 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, except if FACT = 'F' */
/* > and EQUED = 'Y', then A must contain the equilibrated matrix */
/* > diag(S)*A*diag(S). 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. */
/* > See below for further details. A is not modified if */
/* > FACT = 'F' or 'N', or if FACT = 'E' and EQUED = 'N' on exit. */
/* > */
/* > On exit, if FACT = 'E' and EQUED = 'Y', A is overwritten by */
/* > diag(S)*A*diag(S). */
/* > \endverbatim */
/* > */
/* > \param[in,out] AFP */
/* > \verbatim */
/* > AFP is COMPLEX array, dimension (N*(N+1)/2) */
/* > If FACT = 'F', then AFP is an input argument and on entry */
/* > contains the triangular factor U or L from the Cholesky */
/* > factorization A = U**H*U or A = L*L**H, in the same storage */
/* > format as A. If EQUED .ne. 'N', then AFP is the factored */
/* > form of the equilibrated matrix A. */
/* > */
/* > If FACT = 'N', then AFP is an output argument and on exit */
/* > returns the triangular factor U or L from the Cholesky */
/* > factorization A = U**H * U or A = L * L**H of the original */
/* > matrix A. */
/* > */
/* > If FACT = 'E', then AFP is an output argument and on exit */
/* > returns the triangular factor U or L from the Cholesky */
/* > factorization A = U**H*U or A = L*L**H of the equilibrated */
/* > matrix A (see the description of AP for the form of the */
/* > equilibrated matrix). */
/* > \endverbatim */
/* > */
/* > \param[in,out] EQUED */
/* > \verbatim */
/* > EQUED is CHARACTER*1 */
/* > Specifies the form of equilibration that was done. */
/* > = 'N': No equilibration (always true if FACT = 'N'). */
/* > = 'Y': Equilibration was done, i.e., A has been replaced by */
/* > diag(S) * A * diag(S). */
/* > EQUED is an input argument if FACT = 'F'; otherwise, it is an */
/* > output argument. */
/* > \endverbatim */
/* > */
/* > \param[in,out] S */
/* > \verbatim */
/* > S is REAL array, dimension (N) */
/* > The scale factors for A; not accessed if EQUED = 'N'. S is */
/* > an input argument if FACT = 'F'; otherwise, S is an output */
/* > argument. If FACT = 'F' and EQUED = 'Y', each element of S */
/* > must be positive. */
/* > \endverbatim */
/* > */
/* > \param[in,out] B */
/* > \verbatim */
/* > B is COMPLEX array, dimension (LDB,NRHS) */
/* > On entry, the N-by-NRHS right hand side matrix B. */
/* > On exit, if EQUED = 'N', B is not modified; if EQUED = 'Y', */
/* > B is overwritten by diag(S) * B. */
/* > \endverbatim */
/* > */
/* > \param[in] LDB */
/* > \verbatim */
/* > LDB is INTEGER */
/* > The leading dimension of the array B. LDB >= f2cmax(1,N). */
/* > \endverbatim */
/* > */
/* > \param[out] X */
/* > \verbatim */
/* > X is COMPLEX array, dimension (LDX,NRHS) */
/* > If INFO = 0 or INFO = N+1, the N-by-NRHS solution matrix X to */
/* > the original system of equations. Note that if EQUED = 'Y', */
/* > A and B are modified on exit, and the solution to the */
/* > equilibrated system is inv(diag(S))*X. */
/* > \endverbatim */
/* > */
/* > \param[in] LDX */
/* > \verbatim */
/* > LDX is INTEGER */
/* > The leading dimension of the array X. LDX >= f2cmax(1,N). */
/* > \endverbatim */
/* > */
/* > \param[out] RCOND */
/* > \verbatim */
/* > RCOND is REAL */
/* > The estimate of the reciprocal condition number of the matrix */
/* > A after equilibration (if done). If RCOND is less than the */
/* > machine precision (in particular, if RCOND = 0), the matrix */
/* > is singular to working precision. This condition is */
/* > indicated by a return code of INFO > 0. */
/* > \endverbatim */
/* > */
/* > \param[out] FERR */
/* > \verbatim */
/* > FERR is REAL array, dimension (NRHS) */
/* > The estimated forward error bound for each solution vector */
/* > X(j) (the j-th column of the solution matrix X). */
/* > If XTRUE is the true solution corresponding to X(j), FERR(j) */
/* > is an estimated upper bound for the magnitude of the largest */
/* > element in (X(j) - XTRUE) divided by the magnitude of the */
/* > largest element in X(j). The estimate is as reliable as */
/* > the estimate for RCOND, and is almost always a slight */
/* > overestimate of the true error. */
/* > \endverbatim */
/* > */
/* > \param[out] BERR */
/* > \verbatim */
/* > BERR is REAL array, dimension (NRHS) */
/* > The componentwise relative backward error of each solution */
/* > vector X(j) (i.e., the smallest relative change in */
/* > any element of A or B that makes X(j) an exact solution). */
/* > \endverbatim */
/* > */
/* > \param[out] WORK */
/* > \verbatim */
/* > WORK is COMPLEX array, dimension (2*N) */
/* > \endverbatim */
/* > */
/* > \param[out] RWORK */
/* > \verbatim */
/* > RWORK is REAL array, dimension (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: if INFO = i, and i is */
/* > <= N: the leading minor of order i of A is */
/* > not positive definite, so the factorization */
/* > could not be completed, and the solution has not */
/* > been computed. RCOND = 0 is returned. */
/* > = N+1: U is nonsingular, but RCOND is less than machine */
/* > precision, meaning that the matrix is singular */
/* > to working precision. Nevertheless, the */
/* > solution and error bounds are computed because */
/* > there are a number of situations where the */
/* > computed solution can be more accurate than the */
/* > value of RCOND would suggest. */
/* > \endverbatim */
/* Authors: */
/* ======== */
/* > \author Univ. of Tennessee */
/* > \author Univ. of California Berkeley */
/* > \author Univ. of Colorado Denver */
/* > \author NAG Ltd. */
/* > \date April 2012 */
/* > \ingroup complexOTHERsolve */
/* > \par Further Details: */
/* ===================== */
/* > */
/* > \verbatim */
/* > */
/* > The packed storage scheme is illustrated by the following example */
/* > when N = 4, UPLO = 'U': */
/* > */
/* > Two-dimensional storage of the Hermitian matrix A: */
/* > */
/* > a11 a12 a13 a14 */
/* > a22 a23 a24 */
/* > a33 a34 (aij = conjg(aji)) */
/* > a44 */
/* > */
/* > Packed storage of the upper triangle of A: */
/* > */
/* > AP = [ a11, a12, a22, a13, a23, a33, a14, a24, a34, a44 ] */
/* > \endverbatim */
/* > */
/* ===================================================================== */
2022-12-14 21:06:55 +08:00
/* Subroutine */ void cppsvx_ ( char * fact , char * uplo , integer * n , integer *
2022-04-10 04:38:58 +08:00
nrhs , complex * ap , complex * afp , char * equed , real * s , complex * b ,
integer * ldb , complex * x , integer * ldx , real * rcond , real * ferr , real
* berr , complex * work , real * rwork , integer * info )
{
/* System generated locals */
integer b_dim1 , b_offset , x_dim1 , x_offset , i__1 , i__2 , i__3 , i__4 , i__5 ;
2025-12-12 05:39:11 +08:00
real r__1 = 0. , r__2 = 0. ;
complex q__1 = { 0. , 0. } ;
2022-04-10 04:38:58 +08:00
/* Local variables */
real amax , smin , smax ;
integer i__ , j ;
extern logical lsame_ ( char * , char * ) ;
real scond , anorm ;
2022-12-14 21:06:55 +08:00
extern /* Subroutine */ void ccopy_ ( integer * , complex * , integer * ,
2022-04-10 04:38:58 +08:00
complex * , integer * ) ;
logical equil , rcequ ;
extern real clanhp_ ( char * , char * , integer * , complex * , real * ) , slamch_ ( char * ) ;
2022-12-14 21:06:55 +08:00
extern /* Subroutine */ void claqhp_ ( char * , integer * , complex * , real * ,
2022-04-10 04:38:58 +08:00
real * , real * , char * ) ;
logical nofact ;
2022-12-14 21:06:55 +08:00
extern /* Subroutine */ void clacpy_ ( char * , integer * , integer * , complex
* , integer * , complex * , integer * ) ;
extern int xerbla_ ( char * , integer * , ftnlen ) ;
2022-04-10 04:38:58 +08:00
real bignum ;
2022-12-14 21:06:55 +08:00
extern /* Subroutine */ void cppcon_ ( char * , integer * , complex * , real * ,
2022-04-10 04:38:58 +08:00
real * , complex * , real * , integer * ) ;
integer infequ ;
2022-12-14 21:06:55 +08:00
extern /* Subroutine */ void cppequ_ ( char * , integer * , complex * , real * ,
2022-04-10 04:38:58 +08:00
real * , real * , integer * ) , cpprfs_ ( char * , integer * ,
integer * , complex * , complex * , complex * , integer * , complex * ,
integer * , real * , real * , complex * , real * , integer * ) ,
cpptrf_ ( char * , integer * , complex * , integer * ) ;
real smlnum ;
2022-12-14 21:06:55 +08:00
extern /* Subroutine */ void cpptrs_ ( char * , integer * , integer * , complex
2022-04-10 04:38:58 +08:00
* , complex * , integer * , integer * ) ;
/* -- LAPACK driver 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..-- */
/* April 2012 */
/* ===================================================================== */
/* Parameter adjustments */
- - ap ;
- - afp ;
- - s ;
b_dim1 = * ldb ;
b_offset = 1 + b_dim1 * 1 ;
b - = b_offset ;
x_dim1 = * ldx ;
x_offset = 1 + x_dim1 * 1 ;
x - = x_offset ;
- - ferr ;
- - berr ;
- - work ;
- - rwork ;
/* Function Body */
* info = 0 ;
nofact = lsame_ ( fact , " N " ) ;
equil = lsame_ ( fact , " E " ) ;
if ( nofact | | equil ) {
* ( unsigned char * ) equed = ' N ' ;
rcequ = FALSE_ ;
} else {
rcequ = lsame_ ( equed , " Y " ) ;
smlnum = slamch_ ( " Safe minimum " ) ;
bignum = 1.f / smlnum ;
}
/* Test the input parameters. */
if ( ! nofact & & ! equil & & ! lsame_ ( fact , " F " ) ) {
* info = - 1 ;
} else if ( ! lsame_ ( uplo , " U " ) & & ! lsame_ ( uplo ,
" L " ) ) {
* info = - 2 ;
} else if ( * n < 0 ) {
* info = - 3 ;
} else if ( * nrhs < 0 ) {
* info = - 4 ;
} else if ( lsame_ ( fact , " F " ) & & ! ( rcequ | | lsame_ (
equed , " N " ) ) ) {
* info = - 7 ;
} else {
if ( rcequ ) {
smin = bignum ;
smax = 0.f ;
i__1 = * n ;
for ( j = 1 ; j < = i__1 ; + + j ) {
/* Computing MIN */
r__1 = smin , r__2 = s [ j ] ;
smin = f2cmin ( r__1 , r__2 ) ;
/* Computing MAX */
r__1 = smax , r__2 = s [ j ] ;
smax = f2cmax ( r__1 , r__2 ) ;
/* L10: */
}
if ( smin < = 0.f ) {
* info = - 8 ;
} else if ( * n > 0 ) {
scond = f2cmax ( smin , smlnum ) / f2cmin ( smax , bignum ) ;
} else {
scond = 1.f ;
}
}
if ( * info = = 0 ) {
if ( * ldb < f2cmax ( 1 , * n ) ) {
* info = - 10 ;
} else if ( * ldx < f2cmax ( 1 , * n ) ) {
* info = - 12 ;
}
}
}
if ( * info ! = 0 ) {
i__1 = - ( * info ) ;
xerbla_ ( " CPPSVX " , & i__1 , ( ftnlen ) 6 ) ;
2022-12-14 21:06:55 +08:00
return ;
2022-04-10 04:38:58 +08:00
}
if ( equil ) {
/* Compute row and column scalings to equilibrate the matrix A. */
cppequ_ ( uplo , n , & ap [ 1 ] , & s [ 1 ] , & scond , & amax , & infequ ) ;
if ( infequ = = 0 ) {
/* Equilibrate the matrix. */
claqhp_ ( uplo , n , & ap [ 1 ] , & s [ 1 ] , & scond , & amax , equed ) ;
rcequ = lsame_ ( equed , " Y " ) ;
}
}
/* Scale the right-hand side. */
if ( rcequ ) {
i__1 = * nrhs ;
for ( j = 1 ; j < = i__1 ; + + j ) {
i__2 = * n ;
for ( i__ = 1 ; i__ < = i__2 ; + + i__ ) {
i__3 = i__ + j * b_dim1 ;
i__4 = i__ ;
i__5 = i__ + j * b_dim1 ;
q__1 . r = s [ i__4 ] * b [ i__5 ] . r , q__1 . i = s [ i__4 ] * b [ i__5 ] . i ;
b [ i__3 ] . r = q__1 . r , b [ i__3 ] . i = q__1 . i ;
/* L20: */
}
/* L30: */
}
}
if ( nofact | | equil ) {
/* Compute the Cholesky factorization A = U**H * U or A = L * L**H. */
i__1 = * n * ( * n + 1 ) / 2 ;
ccopy_ ( & i__1 , & ap [ 1 ] , & c__1 , & afp [ 1 ] , & c__1 ) ;
cpptrf_ ( uplo , n , & afp [ 1 ] , info ) ;
/* Return if INFO is non-zero. */
if ( * info > 0 ) {
* rcond = 0.f ;
2022-12-14 21:06:55 +08:00
return ;
2022-04-10 04:38:58 +08:00
}
}
/* Compute the norm of the matrix A. */
anorm = clanhp_ ( " I " , uplo , n , & ap [ 1 ] , & rwork [ 1 ] ) ;
/* Compute the reciprocal of the condition number of A. */
cppcon_ ( uplo , n , & afp [ 1 ] , & anorm , rcond , & work [ 1 ] , & rwork [ 1 ] , info ) ;
/* Compute the solution matrix X. */
clacpy_ ( " Full " , n , nrhs , & b [ b_offset ] , ldb , & x [ x_offset ] , ldx ) ;
cpptrs_ ( uplo , n , nrhs , & afp [ 1 ] , & x [ x_offset ] , ldx , info ) ;
/* Use iterative refinement to improve the computed solution and */
/* compute error bounds and backward error estimates for it. */
cpprfs_ ( uplo , n , nrhs , & ap [ 1 ] , & afp [ 1 ] , & b [ b_offset ] , ldb , & x [ x_offset ] ,
ldx , & ferr [ 1 ] , & berr [ 1 ] , & work [ 1 ] , & rwork [ 1 ] , info ) ;
/* Transform the solution matrix X to a solution of the original */
/* system. */
if ( rcequ ) {
i__1 = * nrhs ;
for ( j = 1 ; j < = i__1 ; + + j ) {
i__2 = * n ;
for ( i__ = 1 ; i__ < = i__2 ; + + i__ ) {
i__3 = i__ + j * x_dim1 ;
i__4 = i__ ;
i__5 = i__ + j * x_dim1 ;
q__1 . r = s [ i__4 ] * x [ i__5 ] . r , q__1 . i = s [ i__4 ] * x [ i__5 ] . i ;
x [ i__3 ] . r = q__1 . r , x [ i__3 ] . i = q__1 . i ;
/* L40: */
}
/* L50: */
}
i__1 = * nrhs ;
for ( j = 1 ; j < = i__1 ; + + j ) {
ferr [ j ] / = scond ;
/* L60: */
}
}
/* Set INFO = N+1 if the matrix is singular to working precision. */
if ( * rcond < slamch_ ( " Epsilon " ) ) {
* info = * n + 1 ;
}
2022-12-14 21:06:55 +08:00
return ;
2022-04-10 04:38:58 +08:00
/* End of CPPSVX */
} /* cppsvx_ */