15 double rec(
const double a) {
return 1.0 / a; }
17 double isqrt(
const double a) {
return 1.0 / sqrt(a); }
22 void SetupBPol(
int n,
int max_deg,
double tol,
double lmin,
double lmax,
37 void SetupPolRec(
int n,
int max_deg,
double tol,
double lmin,
double lmax,
45 void SetupPolSqrt(
int n,
int max_deg,
double tol,
double lmin,
double lmax,
61 void BSolPol(
double *b,
double *x,
void *data) {
83 int apfun(
const double c,
const double h,
const double *
const xi,
84 double (*
ffun)(
double),
const int npts,
double *yi) {
86 for (i = 0; i < npts; i++) {
87 yi[i] =
ffun(c + h * xi[i]);
109 int pnav(
double *mu,
const int m,
const double cc,
const double dd,
double *v,
110 double *y,
double *w) {
114 double *vkp1 = w + n;
115 double *vkm1 = vkp1 + n;
119 const double t1 = 1.0 / dd;
120 const double t2 = 2.0 / dd;
122 memcpy(vk, v, n *
sizeof(
double));
123 memset(vkm1, 0, n *
sizeof(
double));
126 for (i = 0; i < n; i++) {
130 for (k = 1; k <= m; k++) {
132 t = k == 1 ? t1 : t2;
137 for (i = 0; i < n; i++) {
138 vkp1[i] = t * (vkp1[i] - cc * vk[i]) - vkm1[i];
169 const double a = pol->
intv[0];
170 const double b = pol->
intv[1];
171 pol->
cc = (a + b) / 2;
172 pol->
dd = (b - a) / 2;
175 const int npts = maxDeg * 4;
177 Malloc(theti, npts,
double);
180 for (i = 0; i < npts * 2; i += 2) {
181 theti[i / 2] = (i + 1) * (
PI / (2 * npts));
187 for (i = 0; i < npts; i++) {
188 xi[i] = cos(theti[i]);
198 const int ptsNrm = 50 * maxDeg;
199 Malloc(xi, ptsNrm,
double);
204 Malloc(yx, ptsNrm,
double);
211 Malloc(ya, ptsNrm,
double);
216 const double t1 = 1.0 / npts;
217 const double t2 = 2.0 / npts;
220 for (k = 0; k < maxDeg; k++) {
221 for (i = 0; i < npts; i++) {
222 yi[i] = cos(k * theti[i]);
224 const double t = k == 0 ? t1 : t2;
226 for (i = 0; i < npts; i++) {
227 sum += yi[i] * gi[i];
229 pol->
mu[k] = t * sum;
232 for (i = 0; i < ptsNrm; i++) {
233 na = (ya[i] - yx[i]) / yx[i];
236 if (nrm < pol->tol) {
258 int scalEigVec(
int n,
int nev,
double *Y,
double* sqrtdiag) {
266 for (i=0; i<nev; i++){
268 for (j=0; j<n; j++) {
269 v[j] = v[j]*sqrtdiag[j];
int lsPol(double(*ffun)(double), BSolDataPol *pol)
void SetupBPol(int n, int max_deg, double tol, double lmin, double lmax, double(*ffun)(double), BSolDataPol *data)
int chebxPltd(int m, double *mu, int npts, double *xi, double *yi)
function yi = chebxPltd computes yi = p_mu (xi),
int pnav(double *mu, const int m, const double cc, const double dd, double *v, double *y, double *w)
int apfun(const double c, const double h, const double *const xi, double(*ffun)(double), const int npts, double *yi)
#define Calloc(base, nmem, type)
This file contains function prototypes and constant definitions internally used in EVSL...
real *8 function ffun(x, y, z)
double rec(const double a)
void SetupPolSqrt(int n, int max_deg, double tol, double lmin, double lmax, BSolDataPol *data)
#define Malloc(base, nmem, type)
This file contains function prototypes and constant definitions for EVSL.
Defs for blaslapack routines.
evslData evsldata
global variable of EVSL
void linspace(double a, double b, int num, double *arr)
double isqrt(const double a)
void BSolPol(double *b, double *x, void *data)
void SetupPolRec(int n, int max_deg, double tol, double lmin, double lmax, BSolDataPol *data)
int scalEigVec(int n, int nev, double *Y, double *sqrtdiag)
void FreeBSolPolData(BSolDataPol *data)