Changeset 1414
- Timestamp:
- 07/29/09 15:29:34 (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk/src/c/parallel/diagnostic_core_nonlinear.cpp
r1413 r1414 22 22 Vec KU=NULL; 23 23 Vec KUF=NULL; 24 Vec KUold=NULL; 25 Vec KUoldF=NULL; 24 26 25 27 /*intermediary: */ … … 38 40 double ndu,nduinf,nu; 39 41 double nKUF; 42 double nKUoldF; 40 43 double nF; 41 double residue;44 double solver_residue,mechanical_residue; 42 45 43 46 /*parameters:*/ … … 113 116 if (debug) _printf_(" solving\n"); 114 117 Solverx(&uf, Kff, pf, old_uf, solver_string); 115 116 /*Compute residue*/117 //compute KUF = KU - F = K*U - F118 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 residue121 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 anymore126 MatFree(&Kff);VecFree(&pf);127 118 128 119 if (debug) _printf_(" merging solution from f to g set\n"); … … 134 125 if (old_ug) inputs->Add("old_velocity",old_ug,numberofdofspernode,numberofnodes); 135 126 inputs->Add("velocity",ug,numberofdofspernode,numberofnodes); 136 137 127 PenaltyConstraintsx(&constraints_converged, &num_unstable_constraints, fem->elements,fem->nodes,loads,fem->materials,inputs,analysis_type,sub_analysis_type); 138 128 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)*/ 140 156 VecDuplicate(old_ug,&dug);VecCopy(old_ug,dug); VecAYPX(dug,-1.0,ug); 141 157 VecNorm(dug,NORM_2,&ndu);VecNorm(old_ug,NORM_2,&nu);VecNorm(dug,NORM_INFINITY,&nduinf); VecFree(&dug); 142 158 if (isnan(ndu) || isnan(nu)) throw ErrorException(__FUNCT__,exprintf("convergence criterion is NaN! ")); 143 144 //residue145 if (debug) _printf_("%s%g\n"," Convergence criterion: norm(KU-F)/norm(F)=",residue);146 147 //relative criterion148 159 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," \%"); 150 161 converged=1; 151 162 } 152 163 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," \%"); 154 165 converged=0; 155 166 } 156 167 157 / /Absolute criterion (Optional)168 /*Absolute criterion (Optional) = max(du)*/ 158 169 if (!isnan(eps_abs)){ 159 170 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"); 161 172 } 162 173 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"); 164 175 converged=0; 165 176 } … … 172 183 count++; 173 184 if(converged==1)break; 174 185 186 //no need for Kff and pf anymore 187 MatFree(&Kff);VecFree(&pf); 175 188 } 176 189
Note:
See TracChangeset
for help on using the changeset viewer.