35 #define MAX_VALUE_DIAG 1e-10
36 #define MAX_REITERTION 1 //50
62 for (i=x_v->
nl;i<=x_v->nh;i++) {
66 for (i=x_v->
nl;i<=x_v->nh;i++) {
68 diagonal->element[i]=(*Matrix)(i,x_v);
99 double delta,delta_new,alpha,beta,delta0;
118 for (j=x->
nl;j<=x->nh;j++){
119 y->element[j]=(*funz)(j,x);
129 for (j=y->
nl;j<=y->nh;j++) {
131 r->element[j]=b->element[j]-y->element[j];
132 if (diag->element[j]<0.0) {
133 diag->element[j]=1.0;
134 printf(
"\n Error in jacobi_preconditioned_conjugate_gradient_search function: diagonal of the matrix (%lf) is negative at %ld \n",diag->element[j],j);
140 if (diag->element[j]==0.0) {
143 d->element[j]=r->element[j]/(diag->element[j]);
146 delta_new+=r->element[j]*d->element[j];
162 for(j=q->
nl;j<=q->nh;j++) {
163 q->element[j]=(*funz)(j,d);
164 p+=q->element[j]*d->element[j];
168 for(j=x->
nl;j<=x->nh;j++) {
169 x->element[j]=x->element[j]+alpha*d->element[j];
175 for (j=y->
nl;j<=y->nh;j++) {
177 y->element[j]=(*funz)(j,x);
178 r->element[j]=b->element[j]-y->element[j];
180 r->element[j]=r->element[j]-alpha*q->element[j];
182 if (diag->element[j]==0.0) {
186 sr->element[j]=r->element[j]/diag->element[j];
189 delta_new+=sr->element[j]*r->element[j];
195 beta=delta_new/delta;
199 for (j=d->
nl;j<=d->nh;j++) {
200 d->element[j]=sr->element[j]+beta*d->element[j];