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);}
# 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);}
2026-02-19 23:53:18 +08:00
//#define mymaxloc(w,s,e,n) {dmaxloc_(w,*(s),*(e),n)}
2022-04-10 04:38:58 +08:00
/* 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 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 ] ) ;
}
}
2026-02-19 23:53:18 +08:00
z - > r = creal ( zdotc ) ; z - > i = cimag ( zdotc ) ;
2022-04-10 04:38:58 +08:00
}
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 ] ) ;
}
}
2026-02-19 23:53:18 +08:00
z - > r = creal ( zdotc ) ; z - > i = cimag ( zdotc ) ;
2022-04-10 04:38:58 +08:00
}
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 ;
static real c_b16 = - 1.f ;
/* > \brief \b CPPTRF */
/* =========== DOCUMENTATION =========== */
/* Online html documentation available at */
/* http://www.netlib.org/lapack/explore-html/ */
/* > \htmlonly */
/* > Download CPPTRF + dependencies */
/* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/cpptrf.
f " > */
/* > [TGZ]</a> */
/* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/cpptrf.
f " > */
/* > [ZIP]</a> */
/* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/cpptrf.
f " > */
/* > [TXT]</a> */
/* > \endhtmlonly */
/* Definition: */
/* =========== */
/* SUBROUTINE CPPTRF( UPLO, N, AP, INFO ) */
/* CHARACTER UPLO */
/* INTEGER INFO, N */
/* COMPLEX AP( * ) */
/* > \par Purpose: */
/* ============= */
/* > */
/* > \verbatim */
/* > */
/* > CPPTRF computes the Cholesky factorization of a complex Hermitian */
/* > positive definite matrix A stored in packed format. */
/* > */
/* > The factorization has the form */
/* > 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 lower triangular. */
/* > \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 order of the matrix A. N >= 0. */
/* > \endverbatim */
/* > */
/* > \param[in,out] AP */
/* > \verbatim */
/* > AP is COMPLEX array, dimension (N*(N+1)/2) */
/* > On entry, the upper or lower triangle of the Hermitian matrix */
/* > A, packed columnwise in a linear array. The j-th column of A */
/* > is stored in the array AP as follows: */
/* > if UPLO = 'U', AP(i + (j-1)*j/2) = A(i,j) for 1<=i<=j; */
/* > if UPLO = 'L', AP(i + (j-1)*(2n-j)/2) = A(i,j) for j<=i<=n. */
/* > See below for further details. */
/* > */
/* > On exit, if INFO = 0, 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. */
/* > \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 is not */
/* > positive definite, and the factorization could not be */
/* > completed. */
/* > \endverbatim */
/* Authors: */
/* ======== */
/* > \author Univ. of Tennessee */
/* > \author Univ. of California Berkeley */
/* > \author Univ. of Colorado Denver */
/* > \author NAG Ltd. */
/* > \date December 2016 */
/* > \ingroup complexOTHERcomputational */
/* > \par 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 cpptrf_ ( char * uplo , integer * n , complex * ap , integer *
2022-04-10 04:38:58 +08:00
info )
{
/* System generated locals */
integer i__1 , i__2 , i__3 ;
2025-12-12 05:39:11 +08:00
real r__1 = 0. ;
complex q__1 = { 0. , 0. } , q__2 = { 0. , 0. } ;
2022-04-10 04:38:58 +08:00
/* Local variables */
2022-12-14 21:06:55 +08:00
extern /* Subroutine */ void chpr_ ( char * , integer * , real * , complex * ,
2022-04-10 04:38:58 +08:00
integer * , complex * ) ;
integer j ;
extern /* Complex */ VOID cdotc_ ( complex * , integer * , complex * , integer
* , complex * , integer * ) ;
extern logical lsame_ ( char * , char * ) ;
logical upper ;
2022-12-14 21:06:55 +08:00
extern /* Subroutine */ void ctpsv_ ( char * , char * , char * , integer * ,
2022-04-10 04:38:58 +08:00
complex * , complex * , integer * ) ;
integer jc , jj ;
2022-12-14 21:06:55 +08:00
extern /* Subroutine */ void csscal_ ( integer * , real * , complex * , integer
* ) ;
extern int xerbla_ ( char * , integer * , ftnlen ) ;
2022-04-10 04:38:58 +08:00
real ajj ;
/* -- LAPACK computational routine (version 3.7.0) -- */
/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */
/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */
/* December 2016 */
/* ===================================================================== */
/* Test the input parameters. */
/* Parameter adjustments */
- - ap ;
/* Function Body */
* info = 0 ;
upper = lsame_ ( uplo , " U " ) ;
if ( ! upper & & ! lsame_ ( uplo , " L " ) ) {
* info = - 1 ;
} else if ( * n < 0 ) {
* info = - 2 ;
}
if ( * info ! = 0 ) {
i__1 = - ( * info ) ;
xerbla_ ( " CPPTRF " , & i__1 , ( ftnlen ) 6 ) ;
2022-12-14 21:06:55 +08:00
return ;
2022-04-10 04:38:58 +08:00
}
/* Quick return if possible */
if ( * n = = 0 ) {
2022-12-14 21:06:55 +08:00
return ;
2022-04-10 04:38:58 +08:00
}
if ( upper ) {
/* Compute the Cholesky factorization A = U**H * U. */
jj = 0 ;
i__1 = * n ;
for ( j = 1 ; j < = i__1 ; + + j ) {
jc = jj + 1 ;
jj + = j ;
/* Compute elements 1:J-1 of column J. */
if ( j > 1 ) {
i__2 = j - 1 ;
ctpsv_ ( " Upper " , " Conjugate transpose " , " Non-unit " , & i__2 , & ap [
1 ] , & ap [ jc ] , & c__1 ) ;
}
/* Compute U(J,J) and test for non-positive-definiteness. */
i__2 = jj ;
r__1 = ap [ i__2 ] . r ;
i__3 = j - 1 ;
cdotc_ ( & q__2 , & i__3 , & ap [ jc ] , & c__1 , & ap [ jc ] , & c__1 ) ;
q__1 . r = r__1 - q__2 . r , q__1 . i = - q__2 . i ;
ajj = q__1 . r ;
if ( ajj < = 0.f ) {
i__2 = jj ;
ap [ i__2 ] . r = ajj , ap [ i__2 ] . i = 0.f ;
goto L30 ;
}
i__2 = jj ;
r__1 = sqrt ( ajj ) ;
ap [ i__2 ] . r = r__1 , ap [ i__2 ] . i = 0.f ;
/* L10: */
}
} else {
/* Compute the Cholesky factorization A = L * L**H. */
jj = 1 ;
i__1 = * n ;
for ( j = 1 ; j < = i__1 ; + + j ) {
/* Compute L(J,J) and test for non-positive-definiteness. */
i__2 = jj ;
ajj = ap [ i__2 ] . r ;
if ( ajj < = 0.f ) {
i__2 = jj ;
ap [ i__2 ] . r = ajj , ap [ i__2 ] . i = 0.f ;
goto L30 ;
}
ajj = sqrt ( ajj ) ;
i__2 = jj ;
ap [ i__2 ] . r = ajj , ap [ i__2 ] . i = 0.f ;
/* Compute elements J+1:N of column J and update the trailing */
/* submatrix. */
if ( j < * n ) {
i__2 = * n - j ;
r__1 = 1.f / ajj ;
csscal_ ( & i__2 , & r__1 , & ap [ jj + 1 ] , & c__1 ) ;
i__2 = * n - j ;
chpr_ ( " Lower " , & i__2 , & c_b16 , & ap [ jj + 1 ] , & c__1 , & ap [ jj + * n
- j + 1 ] ) ;
jj = jj + * n - j + 1 ;
}
/* L20: */
}
}
goto L40 ;
L30 :
* info = j ;
L40 :
2022-12-14 21:06:55 +08:00
return ;
2022-04-10 04:38:58 +08:00
/* End of CPPTRF */
} /* cpptrf_ */