Changeset 236


Ignore:
Timestamp:
05/05/09 11:31:00 (16 years ago)
Author:
Mathieu Morlighem
Message:

Fixed gradient orthogonalisation

File:
1 edited

Legend:

Unmodified
Added
Removed
  • issm/trunk/src/c/Orthx/Orthx.cpp

    r1 r236  
    1414
    1515        /*intermediary:*/
    16         Vec oldgradj2=NULL;
    17         double norm,dot_product;;
     16        double norm_new,norm_old,dot_product;;
    1817
     18        /*Initialize output*/
     19        VecDuplicate(gradj,&newgradj);
     20        VecCopy(gradj,newgradj);
    1921
    20         if (!oldgradj){
    21                 VecDuplicate(gradj,&oldgradj2);
    22                 VecCopy(gradj,oldgradj2);
    23                 /*scale to 1:*/
    24                 VecNorm(oldgradj2,NORM_INFINITY,&norm);
    25                 VecScale(oldgradj2,1.0/norm);
     22        /*rough orthagonalization
     23        gradient=gradient-(gradient'*oldgradient)*oldgradient /norm(oldgradient)^2; */
     24        if(oldgradj){
     25                VecNorm(oldgradj,NORM_2,&norm_old);
     26                VecDot(newgradj,oldgradj,&dot_product);
     27                VecAXPY(newgradj, -dot_product/pow(norm_old,2), oldgradj);
    2628        }
    2729
    28         /*% normalize gradient to 1:*/
    29         VecDuplicate(gradj,&newgradj);
    30         VecCopy(gradj,newgradj);
    31         VecNorm(newgradj,NORM_INFINITY,&norm);
    32         VecScale(newgradj,1.0/norm);
    33 
    34         /*rough orthagonalization
    35         gradient=gradient-(gradient'*oldgradient)*oldgradient;
    36         */
    37 
    38         if(oldgradj){
    39                 VecDot(newgradj,oldgradj,&dot_product);
    40                 VecAXPY(newgradj, -dot_product,oldgradj);
    41         }
    42         else{
    43                 VecDot(newgradj,oldgradj2,&dot_product);
    44                 VecAXPY(newgradj, -dot_product,oldgradj2);
    45         }
     30        /*scale to 1: gradient=gradient/max(abs(gradient))*/
     31        VecNorm(newgradj,NORM_INFINITY,&norm_new);
     32        VecScale(newgradj,1.0/norm_new);
    4633
    4734        /*Assign correct pointer*/
    4835        *pnewgradj=newgradj;
    49 
    50         /*Free ressources and return*/
    51         VecFree(&oldgradj2);
    5236}
Note: See TracChangeset for help on using the changeset viewer.