Changeset 3673741 in tol


Ignore:
Timestamp:
Jan 19, 2010, 2:27:45 PM (17 years ago)
Author:
Víctor de Buen <vdebuen@…>
Branches:
1941-docker-image-to-test, devel, master
Children:
4f21bb0
Parents:
d6488fb
Message:

Fixes #846
Fixes #754

git-svn-id: ​https://www.tol-project.org/svn/tolp/trunk@1983 be4846ae-f051-483a-831f-b64e7d08527f

File:
1 edited

Legend:

Unmodified
Added
Removed
  • tol/btol/vmatrix_type/vmat_iterative.cpp

    rd6488fb r3673741  
    7979  double advance;
    8080  double relAdv;
    81   double oldR;
    8281  double R=r.FrobeniusNorm();
     82  double oldR=R*2.0;
    8383  BDat xNorm=x.FrobeniusNorm();
    8484  BDat oldxNorm;
    … …  
    107107    pa = p*a;
    108108    oldMaxpa = maxpa;
    109     oldR = R;
    110     R = r.FrobeniusNorm();
    111109    oldxNorm = xNorm;
    112110    x = x+pa;
    113111    xNorm = x.FrobeniusNorm();
    114112    xNormAdvance = xNorm-oldxNorm;
    115 
    116113    maxpa = 0;
    117114    for(i=0; i<cols; i++)
    … …  
    123120      }
    124121    }
    125 
     122    r = r - q*a;
     123    oldR = R;
     124    R = r.FrobeniusNorm();
    126125    advance = R-oldR;
    127126    relAdv = advance/oldR;
    128     if(k)
    129     {
    130       if(S.IsUnknown()                    ) { break; }
    131       if(maxpa.IsUnknown()                ) { break; }
    132       if(advance             >=  0        ) { break; }
    133       if(S                   <= tolerance ) { break; }
    134       if(1+maxpa-1           == 0         ) { break; }
    135 /*
    136       if(maxpa               <= chop ) { break; }
    137       if(fabs(advance)       <= chop ) { break; }
    138       if(fabs(relAdv)        <= chop ) { break; }
    139       if(fabs(R)             <= chop ) { break; }
    140       if(oldMaxpa            <= tol  ) { break; }
    141       if(maxpa               <= tol  ) { break; }
    142       if(fabs(advance)       <= tol  ) { break; }
    143       if(xNormAdvance.Abs()  <= tol  ) { break; }
    144 */
    145     }
    146     r = r - q*a;
    147127  //s  = At*r;
    148128    s = (r.T()*A).T();
    149129    oldS = S;
    150130    S  = s.SquaredSum();
     131    if(S                   <= tolerance ) { break; }
     132    if(S.IsUnknown()                    ) { break; }
     133    if(maxpa.IsUnknown()                ) { break; }
     134    if(advance             >=  0        ) { break; }
     135    if(1+maxpa-1           == 0         ) { break; }
     136/*
     137    if(maxpa               <= chop ) { break; }
     138    if(fabs(advance)       <= chop ) { break; }
     139    if(fabs(relAdv)        <= chop ) { break; }
     140    if(fabs(R)             <= chop ) { break; }
     141    if(oldMaxpa            <= tol  ) { break; }
     142    if(maxpa               <= tol  ) { break; }
     143    if(fabs(advance)       <= tol  ) { break; }
     144    if(xNormAdvance.Abs()  <= tol  ) { break; }
     145*/
    151146    b  = S.Value()/oldS.Value();
    152147    p = p*b+s;
    … …  
    238233  int i, k;
    239234  BVMat x, r;
    240   if(!CheckOprProd(A,funName)) { return(x); }
    241235  r.Convert(b0,ESC_blasRdense);
    242236  if(!x0.Rows())
    … …  
    246240  else
    247241  {
    248     x .Convert(x0,ESC_blasRdense);
     242    x.Convert(x0,ESC_blasRdense);
    249243  }
    250244  BVMat q;
    … …  
    259253  int rows = q.Rows();
    260254  int cols = p.Rows();
    261   //PRECONDITIONS: ENSURING DIMENSIONS
     255  /* PRECONDITIONS: ENSURING DIMENSIONS */
    262256  if(!rows||!cols||!r.Columns()||!x.Columns()||
    263257     (rows<cols)||(rows!=r.Rows())||(cols!=x.Rows()))
    … …  
    265259    return(x);
    266260  }
    267  
     261
    268262  if(chop<0) { chop = sqrt(DEpsilon()/cols); }
    269263  double tolerance = chop*chop;
    270264  if((rows<cols)||(rows!=r.Rows())) { return(x); }
    271 
     265//BVMat At = A.T();
     266//BVMat s = At*r;
    272267  BVMat pa;
    273268  BVMat rpa;
    … …  
    277272  double advance;
    278273  double relAdv;
    279   double oldR;
    280274  double R=r.FrobeniusNorm();
     275  double oldR=R*2.0;
    281276  BDat xNorm=x.FrobeniusNorm();
    282277  BDat oldxNorm;
    … …  
    290285  for(k=0; k<maxIter;  k++)
    291286  {
     287/*
    292288    if(k && !(k%cols))
    293289    {
    … …  
    298294        " advance="+advance);
    299295    }
    300     OprProd(A,p,false,q);
     296*/
     297    OprProd(A,x,false, q);
    301298    q2 = q.SquaredSum();
    302299    a = S.Value()/q2;
    303300    pa = p*a;
    304301    oldMaxpa = maxpa;
    305     oldR = R;
    306     R = r.FrobeniusNorm();
    307302    oldxNorm = xNorm;
    308303    x = x+pa;
    309304    xNorm = x.FrobeniusNorm();
    310305    xNormAdvance = xNorm-oldxNorm;
    311 
    312306    maxpa = 0;
    313307    for(i=0; i<cols; i++)
    … …  
    319313      }
    320314    }
    321 
     315    r = r - q*a;
     316    oldR = R;
     317    R = r.FrobeniusNorm();
    322318    advance = R-oldR;
    323319    relAdv = advance/oldR;
    324     if(k)
    325     {
    326       if(S.IsUnknown()    )
    327       { break; }
    328       if(maxpa.IsUnknown())
    329       { break; }
    330       if(S <= tolerance   )
    331       { break; }
    332 /* */
    333       if(1+maxpa-1 == 0   )
    334       { break; }
    335       if(advance >   0    )
    336       { break; }
    337 /* */
    338     }
    339     r = r - q*a;
    340320  //s  = At*r;
    341321    OprProd(A,r,true,s);
    342322    oldS = S;
    343323    S  = s.SquaredSum();
     324    if(S                   <= tolerance ) { break; }
     325    if(S.IsUnknown()                    ) { break; }
     326    if(maxpa.IsUnknown()                ) { break; }
     327    if(advance             >=  0        ) { break; }
     328    if(1+maxpa-1           == 0         ) { break; }
     329/*
     330    if(maxpa               <= chop ) { break; }
     331    if(fabs(advance)       <= chop ) { break; }
     332    if(fabs(relAdv)        <= chop ) { break; }
     333    if(fabs(R)             <= chop ) { break; }
     334    if(oldMaxpa            <= tol  ) { break; }
     335    if(maxpa               <= tol  ) { break; }
     336    if(fabs(advance)       <= tol  ) { break; }
     337    if(xNormAdvance.Abs()  <= tol  ) { break; }
     338*/
    344339    b  = S.Value()/oldS.Value();
    345340    p = p*b+s;
Note: See TracChangeset for help on using the changeset viewer.