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
/* > \brief <b> CPPSV 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 CPPSV + dependencies */
/* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/cppsv.f
" > */
/* > [TGZ]</a> */
/* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/cppsv.f
" > */
/* > [ZIP]</a> */
/* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/cppsv.f
" > */
/* > [TXT]</a> */
/* > \endhtmlonly */
/* Definition: */
/* =========== */
/* SUBROUTINE CPPSV( UPLO, N, NRHS, AP, B, LDB, INFO ) */
/* CHARACTER UPLO */
/* INTEGER INFO, LDB, N, NRHS */
/* COMPLEX AP( * ), B( LDB, * ) */
/* > \par Purpose: */
/* ============= */
/* > */
/* > \verbatim */
/* > */
/* > CPPSV computes 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. */
/* > */
/* > The Cholesky decomposition is used to factor A as */
/* > A = U**H * U, if UPLO = 'U', or */
/* > A = L * L**H, if UPLO = 'L', */
/* > where U is an upper triangular matrix and L is a lower triangular */
/* > matrix. The factored form of A is then used to solve the system of */
/* > equations A * X = B. */
/* > \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] 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 matrix B. 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. 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. */
/* > */
/* > On exit, if INFO = 0, the factor U or L from the Cholesky */
/* > factorization A = U**H*U or A = L*L**H, in the same storage */
/* > format as A. */
/* > \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 INFO = 0, the N-by-NRHS solution matrix X. */
/* > \endverbatim */
/* > */
/* > \param[in] LDB */
/* > \verbatim */
/* > LDB is INTEGER */
/* > The leading dimension of the array B. LDB >= 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: if INFO = i, 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. */
/* > \endverbatim */
/* Authors: */
/* ======== */
/* > \author Univ. of Tennessee */
/* > \author Univ. of California Berkeley */
/* > \author Univ. of Colorado Denver */
/* > \author NAG Ltd. */
/* > \date December 2016 */
/* > \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 cppsv_ ( char * uplo , integer * n , integer * nrhs , complex *
2022-04-10 04:38:58 +08:00
ap , complex * b , integer * ldb , integer * info )
{
/* System generated locals */
integer b_dim1 , b_offset , i__1 ;
/* Local variables */
extern logical lsame_ ( char * , char * ) ;
2022-12-14 21:06:55 +08:00
extern /* Subroutine */ int xerbla_ ( char * , integer * , ftnlen ) ;
extern void cpptrf_ (
2022-04-10 04:38:58 +08:00
char * , integer * , complex * , integer * ) , cpptrs_ ( char * ,
integer * , integer * , complex * , 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..-- */
/* December 2016 */
/* ===================================================================== */
/* Test the input parameters. */
/* Parameter adjustments */
- - ap ;
b_dim1 = * ldb ;
b_offset = 1 + b_dim1 * 1 ;
b - = b_offset ;
/* Function Body */
* info = 0 ;
if ( ! lsame_ ( uplo , " U " ) & & ! lsame_ ( uplo , " L " ) ) {
* info = - 1 ;
} else if ( * n < 0 ) {
* info = - 2 ;
} else if ( * nrhs < 0 ) {
* info = - 3 ;
} else if ( * ldb < f2cmax ( 1 , * n ) ) {
* info = - 6 ;
}
if ( * info ! = 0 ) {
i__1 = - ( * info ) ;
xerbla_ ( " CPPSV " , & i__1 , ( ftnlen ) 6 ) ;
2022-12-14 21:06:55 +08:00
return ;
2022-04-10 04:38:58 +08:00
}
/* Compute the Cholesky factorization A = U**H *U or A = L*L**H. */
cpptrf_ ( uplo , n , & ap [ 1 ] , info ) ;
if ( * info = = 0 ) {
/* Solve the system A*X = B, overwriting B with X. */
cpptrs_ ( uplo , n , nrhs , & ap [ 1 ] , & b [ b_offset ] , ldb , info ) ;
}
2022-12-14 21:06:55 +08:00
return ;
2022-04-10 04:38:58 +08:00
/* End of CPPSV */
} /* cppsv_ */