SEP Solver Library  1.0
 All Classes Namespaces Files Functions Variables Typedefs Macros
CGStep_tmp.cpp
Go to the documentation of this file.
1 #include "CGStep.h"
2 #include "math.h"
3 #include <iostream>
4 #include "Vector.h"
5 #include "inCoreFloat.h"
6 #include "DataInCoreFloat.h"
7 
8 void SEP::CGStep::Alloc_step(Vector *mod, Vector *data){
9 // std::cout << "in alloc";
10  fprintf(stderr,"In alloc \n");
11  //Vector v2 = v1.clone();
12  *s=mod->clone();fprintf(stderr,"In alloc \n");
13  //s=mod.clone();fprintf(stderr,"In alloc \n");
14  *ss=data->clone();
15 }
16 
17 bool SEP::CGStep::Step(int iter, Vector *m, Vector *g, Vector *rr, Vector *gg, double *res){
18 
19  double alpha,beta=0,small=1e-20;
20  std::cout << "in cgstep";
21  double gg_gg=gg->innerProd(gg);
22  double gg_rr=-gg->innerProd(rr);
23 
24 
25  if(iter==0){
26  alpha = -gg_rr/gg_gg;
27  if(fabs(gg_gg) < small){
28  fprintf(stderr,"Zero dot product in first CG step \n");
29  return false;
30  }
31  }
32  else{
33 
34  double ss_ss=ss->innerProd(ss);
35  double gg_ss=gg->innerProd(ss);
36  if(fabs(gg_gg) < small || fabs(ss_ss) < small){
37  fprintf(stderr,"Zero dot product in CG step \n");
38  return false;
39  }
40 
41  double determ=gg_gg*ss_ss*( (1.-gg_ss/gg_gg)*(gg_ss/ss_ss) );
42  double ss_rr=-ss->innerProd(rr);
43  alpha = (ss_ss*gg_rr - gg_ss*ss_rr)/determ;
44  beta = (-gg_ss*gg_rr + gg_gg*ss_rr)/determ;
45  }
46 
47  s->linearCombo(beta,g,alpha); //Update solution step alpha*g+beta*s
48  ss->linearCombo(beta,gg,alpha); //Update residual step
49 
50  m->linearCombo(1.0,s,1.0); //Update solution
51  rr->linearCombo(1.0,ss,1.0); //Update residual
52 
53  *res=rr->innerProd(rr);
54 
55  fprintf(stderr,"Residual is %g \n",*res);
56 
57  return true;
58 
59 }