Changeset 11313 for issm/trunk-jpl/src/c/solutions/gradient_core.cpp
- Timestamp:
- 02/03/12 07:55:52 (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
TabularUnified issm/trunk-jpl/src/c/solutions/gradient_core.cpp ¶
r11310 r11313 14 14 15 15 void gradient_core(FemModel* femmodel,int step,bool orthogonalize){ 16 17 /*parameters: */18 bool control_steady;19 int num_controls;20 int *control_type = NULL;21 double *optscal_list = NULL;22 double optscal=1.e+100,norm_grad;23 16 24 17 /*Intermediaries*/ 25 Vec new_gradient=NULL; 26 Vec gradient=NULL; 27 Vec old_gradient=NULL; 18 double norm_inf; 19 double *norm_list = NULL; 20 Vec new_gradient = NULL; 21 Vec gradient = NULL; 22 Vec old_gradient = NULL; 28 23 29 /*retrieve parameters:*/ 30 femmodel->parameters->FindParam(&control_steady,ControlSteadyEnum); 31 femmodel->parameters->FindParam(&num_controls,InversionNumControlParametersEnum); 32 femmodel->parameters->FindParam(&control_type,NULL,InversionControlParametersEnum); 33 femmodel->parameters->FindParam(&optscal_list,NULL,NULL,InversionGradientScalingEnum); 24 /*Compute gradient*/ 25 _printf_(VerboseControl()," compute cost function gradient\n"); 26 Gradjx(&gradient,&norm_list,femmodel->elements,femmodel->nodes, femmodel->vertices,femmodel->loads, femmodel->materials,femmodel->parameters); 34 27 35 /*Compute and norm gradient of all controls*/ 36 for (int i=0;i<num_controls;i++){ 37 38 _printf_(VerboseControl()," compute gradient of J with respect to %s\n",EnumToStringx(control_type[i])); 39 Gradjx(&gradient,&norm_grad,femmodel->elements,femmodel->nodes, femmodel->vertices,femmodel->loads, femmodel->materials,femmodel->parameters,i); 40 41 if (orthogonalize){ 42 _printf_(VerboseControl()," orthogonalization\n"); 43 ControlInputGetGradientx(&old_gradient,femmodel->elements,femmodel->nodes, femmodel->vertices,femmodel->loads, femmodel->materials,femmodel->parameters,control_type[i]); 44 Orthx(&new_gradient,gradient,old_gradient); VecFree(&old_gradient); VecFree(&gradient); 45 } 46 else{ 47 new_gradient=gradient; 48 } 49 50 /*Get scaling factor of current control:*/ 51 VecNorm(new_gradient,NORM_INFINITY,&norm_grad); 52 if(norm_grad<=0) _error_("||∂J/∂α||∞ = 0 gradient norm of J with respect to %s is zero",EnumToStringx(control_type[i])); 53 if(isnan(norm_grad))_error_("||∂J/∂α||∞ = NaN gradient norm of J with respect to %s is NaN" ,EnumToStringx(control_type[i])); 54 optscal=min(optscal,optscal_list[num_controls*step+i]/norm_grad); 55 56 /*plug back into inputs: */ 57 ControlInputSetGradientx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,control_type[i],new_gradient); 58 VecFree(&new_gradient); 28 if (orthogonalize){ 29 _printf_(VerboseControl()," orthogonalization\n"); 30 ControlInputGetGradientx(&old_gradient,femmodel->elements,femmodel->nodes, femmodel->vertices,femmodel->loads, femmodel->materials,femmodel->parameters); 31 Orthx(&new_gradient,gradient,old_gradient); VecFree(&old_gradient); VecFree(&gradient); 32 } 33 else{ 34 new_gradient=gradient; 59 35 } 60 36 37 /*Check that gradient is clean*/ 38 VecNorm(new_gradient,NORM_INFINITY,&norm_inf); 39 if(norm_inf<=0) _error_("||∂J/∂α||∞ = 0 gradient norm is zero"); 40 if(isnan(norm_inf))_error_("||∂J/∂α||∞ = NaN gradient norm is NaN"); 41 42 /*plug back into inputs: */ 43 ControlInputSetGradientx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,new_gradient); 44 VecFree(&new_gradient); 45 61 46 /*Scale Gradients*/ 62 for (int i=0;i<num_controls;i++) ControlInputScaleGradientx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,control_type[i],optscal);47 ControlInputScaleGradientx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,norm_list,step); 63 48 64 49 /*Clean up and return*/ 65 xfree((void**)&control_type); 66 xfree((void**)&optscal_list); 50 xfree((void**)&norm_list); 67 51 }
Note:
See TracChangeset
for help on using the changeset viewer.