Changeset 1414


Ignore:
Timestamp:
07/29/09 15:29:34 (16 years ago)
Author:
Mathieu Morlighem
Message:

Added mechanical residue criterion

File:
1 edited

Legend:

Unmodified
Added
Removed
  • issm/trunk/src/c/parallel/diagnostic_core_nonlinear.cpp

    r1413 r1414  
    2222        Vec KU=NULL;
    2323        Vec KUF=NULL;
     24        Vec KUold=NULL;
     25        Vec KUoldF=NULL;
    2426
    2527        /*intermediary: */
     
    3840        double ndu,nduinf,nu;
    3941        double nKUF;
     42        double nKUoldF;
    4043        double nF;
    41         double residue;
     44        double solver_residue,mechanical_residue;
    4245
    4346        /*parameters:*/
     
    113116                if (debug) _printf_("   solving\n");
    114117                Solverx(&uf, Kff, pf, old_uf, solver_string);
    115 
    116                 /*Compute residue*/
    117                 //compute KUF = KU - F = K*U - F
    118                 VecDuplicate(uf,&KU); MatMultPatch(Kff,uf,KU);
    119                 VecDuplicate(KU,&KUF);VecCopy(KU,KUF); VecAYPX(KUF,-1.0,pf);
    120                 //comput norm(KUF), norm(F) and residue
    121                 VecNorm(KUF,NORM_2,&nKUF); VecFree(&KUF);
    122                 VecNorm(pf,NORM_2,&nF);
    123                 residue=nKUF/nF;
    124        
    125                 //no need for Kff and pf anymore
    126                 MatFree(&Kff);VecFree(&pf);
    127118               
    128119                if (debug) _printf_("   merging solution from f to g set\n");
     
    134125                if (old_ug) inputs->Add("old_velocity",old_ug,numberofdofspernode,numberofnodes);
    135126                inputs->Add("velocity",ug,numberofdofspernode,numberofnodes);
    136                
    137127                PenaltyConstraintsx(&constraints_converged, &num_unstable_constraints, fem->elements,fem->nodes,loads,fem->materials,inputs,analysis_type,sub_analysis_type);
    138128
    139                 //Figure out if convergence is reached.
     129                /*Figure out if convergence is reached.*/
     130
     131                /*solver residue = norm(KU-F)/norm(F)*/
     132                //compute KUF = KU - F = K*U - F
     133                VecDuplicate(uf,&KU); MatMultPatch(Kff,uf,KU);
     134                VecDuplicate(KU,&KUF);VecCopy(KU,KUF); VecAYPX(KUF,-1.0,pf);
     135                //compute norm(KUF), norm(F) and residue
     136                VecNorm(KUF,NORM_2,&nKUF); VecFree(&KUF);
     137                VecNorm(pf,NORM_2,&nF);
     138                solver_residue=nKUF/nF;
     139                if (debug) _printf_("%-50s%g\n","   Convergence criterion: norm(KU-F)/norm(F)",solver_residue);
     140
     141                /*mechanical residue = norm(KUold-F)/norm(F)*/
     142                if (count>1){
     143                        //compute KUoldF = KUold - F = K*Uold - F
     144                        VecDuplicate(uf,&KUold); MatMultPatch(Kff,old_uf,KUold);
     145                        VecDuplicate(KUold,&KUoldF);VecCopy(KUold,KUoldF); VecAYPX(KUoldF,-1.0,pf);
     146                        //compute norm(KUF), norm(F) and residue
     147                        VecNorm(KUoldF,NORM_2,&nKUoldF); VecFree(&KUoldF);
     148                        mechanical_residue=nKUoldF/nF;
     149                }
     150                else{
     151                        mechanical_residue=nKUoldF/nF;
     152                }
     153                if (debug) _printf_("%-50s%g%s\n","   Convergence criterion: norm(KUold-F)/norm(F)",mechanical_residue*100," \%");
     154
     155                /*relative criterion = norm(du)/norm(u)*/
    140156                VecDuplicate(old_ug,&dug);VecCopy(old_ug,dug); VecAYPX(dug,-1.0,ug);
    141157                VecNorm(dug,NORM_2,&ndu);VecNorm(old_ug,NORM_2,&nu);VecNorm(dug,NORM_INFINITY,&nduinf); VecFree(&dug);
    142158                if (isnan(ndu) || isnan(nu)) throw ErrorException(__FUNCT__,exprintf("convergence criterion is NaN! "));
    143 
    144                 //residue
    145                 if (debug) _printf_("%s%g\n","   Convergence criterion: norm(KU-F)/norm(F)=",residue);
    146 
    147                 //relative criterion
    148159                if((ndu/nu)<eps_rel){
    149                         if (debug) _printf_("%s%g%s%g\n","   Convergence criterion: norm(du)/norm(u)=",ndu/nu," < ",eps_rel);
     160                        if (debug) _printf_("%-50s%g%s%g%s\n","   Convergence criterion: norm(du)/norm(u)",ndu/nu*100," < ",eps_rel*100," \%");
    150161                        converged=1;
    151162                }
    152163                else{
    153                         if (debug) _printf_("%s%g%s%g\n","   Convergence criterion: norm(du)/norm(u)=",ndu/nu," > ",eps_rel);
     164                        if (debug) _printf_("%-50s%g%s%g%s\n","   Convergence criterion: norm(du)/norm(u)",ndu/nu*100," > ",eps_rel*100," \%");
    154165                        converged=0;
    155166                }
    156167
    157                 //Absolute criterion (Optional)
     168                /*Absolute criterion (Optional) = max(du)*/
    158169                if (!isnan(eps_abs)){
    159170                        if ((nduinf*yts)<eps_abs){
    160                                 if (debug) _printf_("%s%g%s%g\n","   Convergence criterion: max(du)=",nduinf*yts," < ",eps_abs);
     171                                if (debug) _printf_("%-50s%g%s%g%s\n","   Convergence criterion: max(du)",nduinf*yts," < ",eps_abs," m/yr");
    161172                        }
    162173                        else{
    163                                 if (debug) _printf_("%s%g%s%g\n","   Convergence criterion: max(du)=",nduinf*yts," > ",eps_abs);
     174                                if (debug) _printf_("%-50s%g%s%g%s\n","   Convergence criterion: max(du)",nduinf*yts," > ",eps_abs," m/yr");
    164175                                converged=0;
    165176                        }
     
    172183                count++;
    173184                if(converged==1)break;
    174 
     185       
     186                //no need for Kff and pf anymore
     187                MatFree(&Kff);VecFree(&pf);
    175188        }
    176189
Note: See TracChangeset for help on using the changeset viewer.