23 void contQuad(
int method,
int n, complex
double* zk) {
25 double *beta, *D, *Z, *WORK;
32 Malloc(WORK, 2*n-2,
double);
38 beta[i] = 0.5/(sqrt(1-pow(2*(i+1),-2)));
40 DSTEV(&JOBZ, &n, D, beta, Z, &n, WORK, &INFO);
42 tmp2 = I*
M_PI/2.0*(1.0-D[i]);
49 }
else if (method == 1) {
51 tmp2 =
M_PI*I*(2*(i+1)-1)/(2.0*n);
69 void ratf2p2(
int n,
int *mulp, complex
double *zk, complex
double* alp,
int m,
70 double *z,
double *xx) {
71 complex
double y, x, t;
73 for (k2=0; k2<m; k2++) {
77 x = 1.0 / (z[k2]-zk[j]);
80 for (i=k1-1;i>=k;i--) {
86 xx[k2] = 2.0*creal(y);
95 void pfe2(complex
double s1, complex
double s2,
int k1,
int k2,
96 complex
double* alp, complex
double* bet) {
99 if (cabs(s1-s2) < 1.0e-12 * (cabs(s1)+cabs(s2))) {
100 for (i=0; i<k1+k2; i++) {
104 }
else if ((k1 == 1) && (k2 == 1)) {
107 bet[k1-1] = -alp[k1-1];
110 xp = 1.0 / cpow((s1-s2),k2);
111 for (i=0; i<k1; i++) {
112 alp[k1-i-1] = d * xp;
114 d = -d * (k2+i) / (i+1.0);
117 xp = 1.0 / cpow((s2-s1),k1);
118 for (i=0; i<k2; i++) {
119 bet[k2-i-1] = d * xp;
121 d = -d * (k1+i) / (i+1.0);
129 complex
double integg2(complex
double s1, complex
double s2,
130 complex
double* alp,
int k1, complex
double* bet,
131 int k2,
double a,
double b) {
132 complex
double t, t1, t0, scal;
137 for (k=0; k<k1; k++) {
140 t0 = scal*clog((b-s1)/(a-s1));
142 t = t - (scal*1.0/k) * (1.0/cpow((b-s1),k)-1.0/cpow((a-s1),k));
145 for (k=0; k<k2; k++) {
148 t1 = scal*clog((b-s2)/(a-s2));
150 t = t - (scal*1.0/k)*(1.0/cpow((b-s2),k)-1.0/cpow((a-s2),k));
169 void weights(
int n, complex
double* zk,
int* mulp,
double lambda,
170 complex
double* omega) {
176 int i, j, ii, jj, ki, kj, n1, n2, nf=0, k1, k2;
177 complex
double s1, s2, s3, t;
178 complex
double *rhs, *A, *B, *mat, *alp, *bet;
180 for (i=0; i<n; i++) {
185 Malloc(rhs, m, complex
double);
186 Malloc(A, nf*nf, complex
double);
187 Malloc(B, nf*nf, complex
double);
188 Malloc(mat, 4*nf*nf, complex
double);
189 for(i=0; i<nf; i++) {
190 for(j=0; j<nf; j++) {
191 A[i*nf+j] = 0.0 + 0.0*I;
192 B[i*nf+j] = 0.0 + 0.0*I;
195 if (fabs(lambda) < 1.0e-12) {
199 for (ii=0; ii<n; ii++) {
204 for (i=0; i<n1; i++) {
206 rhs[ki+i] = lambda*clog((s3-1.0)/(s3+1.0));
208 rhs[ki+i] = -lambda*(1.0/(i))*(1/cpow((1.0-s3),i)-1.0/cpow((-1.0-s3),i));
211 for (jj=0; jj<n; jj++) {
214 for (i=0; i<n1; i++) {
215 for (j=0; j<n2; j++) {
217 if (cabs(s1-s3) < 1.0e-12*(cabs(s1)+cabs(s3))) {
218 Malloc(alp, i+j+2, complex
double);
219 Malloc(bet, 1, complex
double);
223 Malloc(alp, i+1, complex
double);
224 Malloc(bet, j+1, complex
double);
228 pfe2(s1, s3, k1, k2, alp, bet);
229 t =
integg2(s1, s3, alp, k1, bet, k2, -mu, mu);
230 t += (lambda-1)*
integg2(s1, s3, alp, k1, bet, k2, -1.0, 1.0);
231 A[(ki+i)*nf+kj+j] = t;
234 if (cabs(s1-s2) < 1.0e-12*(cabs(s1)+cabs(s2))) {
235 Malloc(alp, i+j+2, complex
double);
236 Malloc(bet, 1, complex
double);
240 Malloc(alp, i+1, complex
double);
241 Malloc(bet, j+1, complex
double);
245 pfe2(s1, s2, k1, k2, alp, bet);
246 t =
integg2(s1, s2, alp, k1, bet, k2, -mu, mu);
247 t += (lambda-1)*
integg2(s1, s2, alp, k1, bet, k2, -1.0, 1.0);
248 B[(ki+i)*nf+kj+j] = t;
257 for (i=nf; i<2*nf; i++) {
258 rhs[i] = conj(rhs[i-nf]);
262 for (i=0; i<nf; i++) {
263 for(j=0; j<nf; j++) {
264 mat[i+j*m] = conj(A[i*nf+j]);
267 for (i=0; i<nf; i++) {
268 for (j=nf; j<m; j++) {
269 mat[i+j*m] = conj(B[i*nf+j-nf]);
272 for (i=nf; i<m; i++) {
273 for (j=0; j<nf; j++) {
274 mat[i+j*m] = B[(i-nf)*nf+j];
277 for (i=nf; i<m; i++) {
278 for (j=nf; j<m; j++) {
279 mat[i+j*m] = A[(i-nf)*nf+j-nf];
282 ZGESV(&m, &nrhs, mat, &m, ipiv, rhs, &m, &INFO);
289 ratf2p2(n, mulp, zk, omega, 1, &aa, &scaling);
290 scaling = 0.5 / scaling;
291 for (i=0; i<nf; i++) {
314 complex
double* omegaM) {
319 for (i=0; i<n; i++) {
326 for (i=0; i<n; i++) {
327 for (j=0; j<mulp[i]; j++) {
329 omegaM[k] = omegaM[k]*cpow(h,j+1);
333 ratf2p2(n, mulp, zk, omegaM, 1, &a, &tmp);
335 for (i=0; i<nf; i++) {
336 omegaM[i] = omegaM[i] * tmp;
376 complex
double *omega;
379 int n = rat->
num, i, pow = 0, pw = rat->
pw, method = rat->
method;
380 double beta = rat->
beta;
383 Malloc(zk, n, complex
double);
384 for (i=0; i<n; i++) {
391 Malloc(omega, pow, complex
double);
394 if (check_intv(intv, stdout) < 0) {
398 aa =
max(intv[0], intv[2]); bb =
min(intv[1], intv[3]);
399 if (intv[0] < intv[2] || intv[1] > intv[3]) {
400 fprintf(stdout,
" warning [%s (%d)]: interval (%e, %e) is adjusted to (%e, %e)\n",
401 __FILE__, __LINE__, intv[0], intv[1], aa, bb);
415 weights(n, zk, mulp, beta, omega);
452 int *mulp = rat->
mulp;
454 complex
double *omega = rat->
omega;
459 double *xr, *xz, *bz, *br, *yr=NULL, *yz=NULL;
470 for (kk=0; kk<num; kk++) {
475 for (jj=kf-1; jj>=k; jj--) {
477 zkr = creal(omega[jj]);
478 zkc = cimag(omega[jj]);
480 memcpy(br, b, n*
sizeof(
double));
481 memcpy(bz, b, n*
sizeof(
double));
482 DSCAL(&n, &zkr, br, &one);
483 DSCAL(&n, &zkc, bz, &one);
485 DAXPY(&n, &done, xr, &one, br, &one);
486 DAXPY(&n, &done, xz, &one, bz, &one);
492 solve_ASigB(sol, n, br, bz, yr, yz);
498 solve_ASigB(sol, n, br, bz, xr, xz);
502 solve_ASigB(sol, n, br, bz, xr, xz);
507 DAXPY(&n, &dtwo, xr, &one, x, &one);
509 memcpy(x, xr, n*
sizeof(
double));
510 DSCAL(&n, &dtwo, x, &one);
void free_rat(ratparams *rat)
void DSTEV(char *jobz, int *n, double *diagonal, double *subdiagonal, double *V, int *ldz, double *work, int *info)
void DSCAL(int *n, double *a, double *x, int *incx)
This file contains function prototypes and constant definitions internally used in EVSL...
EVSLASIGMABSol * ASIGBsol
void weights(int n, complex double *zk, int *mulp, double lambda, complex double *omega)
Compute the LS weight for each multiple pole.
#define Malloc(base, nmem, type)
evslStat evslstat
global statistics of EVSL
user-provided function and data for solving (A - SIGMA*B) x = b
void DAXPY(int *n, double *alpha, double *x, int *incx, double *y, int *incy)
int scaleweigthts(int n, double a, double b, complex double *zk, int *mulp, complex double *omegaM)
Compute the weights and pole locations on [a, b].
Defs for blaslapack routines.
complex double integg2(complex double s1, complex double s2, complex double *alp, int k1, complex double *bet, int k2, double a, double b)
Integration of 1/[(z-s1)^k1 (z-s2)^k2] from a to b.
void pfe2(complex double s1, complex double s2, int k1, int k2, complex double *alp, complex double *bet)
Get the fraction expansion of 1/[(z-s1)^k1 (z-s2)^k2].
evslData evsldata
global variable of EVSL
void set_ratf_def(ratparams *rat)
Sets default values for ratparams struct.
int find_ratf(double *intv, ratparams *rat)
void contQuad(int method, int n, complex double *zk)
Compute the locations of the poles.
void ratf2p2(int n, int *mulp, complex double *zk, complex double *alp, int m, double *z, double *xx)
Compute the function value of the multiple pole rational filter at real locations.
void RatFiltApply(int n, ratparams *rat, double *b, double *x, double *w6)
Apply rational filter R to a vetor b.
double evsl_timer()
evsl timer for mac
parameters for rational filter
void ZGESV(int *n, int *nrow, complex double *A, int *m, int *ipiv, complex double *rhs, int *k, int *INFO)