Changeset 11310
- Timestamp:
- 02/02/12 13:59:41 (13 years ago)
- Location:
- issm/trunk-jpl/src
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/modules/Gradjx/Gradjx.cpp
r9719 r11310 10 10 #include "../../EnumDefinitions/EnumDefinitions.h" 11 11 12 void Gradjx( Vec* pgradient, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters,int control_type){12 void Gradjx( Vec* pgradient,double* pnorm_grad, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters,int control_index){ 13 13 14 int i; 15 int dim; 16 int numberofvertices; 17 Vec gradient = NULL; 14 int i; 15 int numberofvertices; 16 double norm_grad; 17 int *control_type = NULL; 18 Vec gradient = NULL; 18 19 19 20 /*retrieve some parameters: */ 20 parameters->FindParam(& dim,MeshDimensionEnum);21 parameters->FindParam(&control_type,NULL,InversionControlParametersEnum); 21 22 numberofvertices=vertices->NumberOfVertices(); 22 23 … … 27 28 for (i=0;i<elements->Size();i++){ 28 29 Element* element=(Element*)elements->GetObjectByOffset(i); 29 element->Gradj(gradient,control_type );30 element->Gradj(gradient,control_type[control_index]); 30 31 } 31 32 … … 34 35 VecAssemblyEnd(gradient); 35 36 36 /*Assign output pointers: */ 37 /*Clean up and return*/ 38 xfree((void**)&control_type); 39 if(pnorm_grad){ 40 VecNorm(gradient,NORM_INFINITY,&norm_grad); 41 *pnorm_grad=norm_grad; 42 } 37 43 *pgradient=gradient; 38 44 } -
issm/trunk-jpl/src/c/modules/Gradjx/Gradjx.h
r4236 r11310 10 10 11 11 /* local prototypes: */ 12 void Gradjx(Vec* pgrad_g, 12 void Gradjx(Vec* pgrad_g,double* pgrad_norm,Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters, int control_type); 13 13 14 14 #endif /* _GRADJX_H */ -
issm/trunk-jpl/src/c/solutions/controltao_core.cpp
r11297 r11310 85 85 adjointdiagnostic_core(user->femmodel); 86 86 //Gradjx(&gradient,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,MaterialsRheologyBbarEnum); 87 Gradjx(&gradient, femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,FrictionCoefficientEnum);87 Gradjx(&gradient,NULL,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,0); 88 88 VecScale(gradient,-1.); 89 89 VecCopy(gradient,G); -
issm/trunk-jpl/src/c/solutions/gradient_core.cpp
r11306 r11310 20 20 int *control_type = NULL; 21 21 double *optscal_list = NULL; 22 double optscal ,norm_grad;22 double optscal=1.e+100,norm_grad; 23 23 24 24 /*Intermediaries*/ … … 37 37 38 38 _printf_(VerboseControl()," compute gradient of J with respect to %s\n",EnumToStringx(control_type[i])); 39 Gradjx(&gradient, femmodel->elements,femmodel->nodes, femmodel->vertices,femmodel->loads, femmodel->materials,femmodel->parameters, control_type[i]);39 Gradjx(&gradient,&norm_grad,femmodel->elements,femmodel->nodes, femmodel->vertices,femmodel->loads, femmodel->materials,femmodel->parameters,i); 40 40 41 41 if (orthogonalize){ … … 52 52 if(norm_grad<=0) _error_("||∂J/∂α||∞ = 0 gradient norm of J with respect to %s is zero",EnumToStringx(control_type[i])); 53 53 if(isnan(norm_grad))_error_("||∂J/∂α||∞ = NaN gradient norm of J with respect to %s is NaN" ,EnumToStringx(control_type[i])); 54 optscal= optscal_list[num_controls*step+i]/norm_grad;54 optscal=min(optscal,optscal_list[num_controls*step+i]/norm_grad); 55 55 56 56 /*plug back into inputs: */ 57 ControlInputSetGradientx(femmodel-> elements,femmodel-> nodes, femmodel-> vertices,femmodel-> loads, femmodel-> materials,femmodel->parameters,control_type[i],new_gradient);57 ControlInputSetGradientx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,control_type[i],new_gradient); 58 58 VecFree(&new_gradient); 59 59 } 60 60 61 61 /*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);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); 63 63 64 64 /*Clean up and return*/ -
issm/trunk-jpl/src/m/solutions/gradient_core.m
r11306 r11310 20 20 end 21 21 22 %recover parameters common to all solutions 23 num_controls=femmodel.parameters.InversionNumControlParameters; 24 control_type=femmodel.parameters.InversionControlParameters; 25 control_steady=femmodel.parameters.ControlSteady; 26 gradient_scaling_list=femmodel.parameters.InversionGradientScaling; 22 %recover parameters common to all solutions 23 num_controls=femmodel.parameters.InversionNumControlParameters; 24 control_type=femmodel.parameters.InversionControlParameters; 25 control_steady=femmodel.parameters.ControlSteady; 26 gradient_scaling_list=femmodel.parameters.InversionGradientScaling; 27 gradient_scaling=10^100; 27 28 28 29 for i=1:num_controls, 29 30 30 31 grad=Gradj(femmodel.elements,femmodel.nodes,femmodel.vertices,femmodel.loads,femmodel.materials,femmodel.parameters,control_type(i));31 issmprintf(VerboseControl,[' compute gradient of J with respect to %s'],EnumToString(control_type(i))); 32 [grad norm_grad]=Gradj(femmodel.elements,femmodel.nodes,femmodel.vertices,femmodel.loads,femmodel.materials,femmodel.parameters,i-1); 32 33 33 if orthogonalize, 34 issmprintf(VerboseControl,'%s',[' orthogonalization']); 35 old_gradient=ControlInputGetGradient(femmodel.elements,femmodel.nodes, femmodel.vertices,femmodel.loads, femmodel.materials,femmodel.parameters,control_type(i)); 36 new_gradient=Orth(grad,old_gradient); 37 else 38 new_gradient=grad; 39 end 40 41 %Get scaling factor of current control: 42 norm_grad=norm(new_gradient,inf); 43 if(norm_grad<=0), error(['||∂J/∂α||∞ = 0 gradient norm of J with respect to ' EnumToString(control_type(i)) ' is zero']); end 44 if(isnan(norm_grad)), error(['||∂J/∂α||∞ = NaN gradient norm of J with respect to ' EnumToString(control_type(i)) ' is NaN' ]); end 45 gradient_scaling=gradient_scaling_list(step,i)/norm_grad; 46 47 %plug back into inputs: 48 [femmodel.elements,femmodel.nodes,femmodel.vertices,femmodel.loads,femmodel.materials,femmodel.parameters]=ControlInputSetGradient(femmodel.elements,femmodel.nodes, femmodel.vertices,femmodel.loads, femmodel.materials, femmodel.parameters,control_type(i),new_gradient); 34 if orthogonalize, 35 issmprintf(VerboseControl,'%s',[' orthogonalization']); 36 old_gradient=ControlInputGetGradient(femmodel.elements,femmodel.nodes, femmodel.vertices,femmodel.loads, femmodel.materials,femmodel.parameters,control_type(i)); 37 new_gradient=Orth(grad,old_gradient); 38 else 39 new_gradient=grad; 49 40 end 50 41 51 %Scale all gradients 52 for i=1:num_controls, 53 [femmodel.elements,femmodel.nodes,femmodel.vertices,femmodel.loads,femmodel.materials,femmodel.parameters]=ControlInputScaleGradient(femmodel.elements,femmodel.nodes, femmodel.vertices,femmodel.loads, femmodel.materials, femmodel.parameters,control_type(i),gradient_scaling); 54 end 42 %Get scaling factor of current control: 43 norm_grad=norm(new_gradient,inf); 44 if(norm_grad<=0), error(['||∂J/∂α||∞ = 0 gradient norm of J with respect to ' EnumToString(control_type(i)) ' is zero']); end 45 if(isnan(norm_grad)), error(['||∂J/∂α||∞ = NaN gradient norm of J with respect to ' EnumToString(control_type(i)) ' is NaN' ]); end 46 gradient_scaling=min(gradient_scaling,gradient_scaling_list(step,i)/norm_grad); 47 48 %plug back into inputs: 49 [femmodel.elements,femmodel.nodes,femmodel.vertices,femmodel.loads,femmodel.materials,femmodel.parameters]=ControlInputSetGradient(femmodel.elements,femmodel.nodes, femmodel.vertices,femmodel.loads, femmodel.materials, femmodel.parameters,control_type(i),new_gradient); 50 51 end 52 53 %Scale all gradients 54 for i=1:num_controls, 55 [femmodel.elements,femmodel.nodes,femmodel.vertices,femmodel.loads,femmodel.materials,femmodel.parameters]=ControlInputScaleGradient(femmodel.elements,femmodel.nodes, femmodel.vertices,femmodel.loads, femmodel.materials, femmodel.parameters,control_type(i),gradient_scaling); 56 end -
issm/trunk-jpl/src/mex/Gradj/Gradj.cpp
r8910 r11310 8 8 9 9 /*input datasets: */ 10 int control_type; 10 int control_index; 11 double grad_norm; 11 12 Elements *elements = NULL; 12 13 Nodes *nodes = NULL; … … 32 33 FetchMatlabData((DataSet**)&materials,MATERIALS); 33 34 FetchMatlabData(¶meters,PARAMETERS); 34 FetchMatlabData(&control_ type,CONTROLTYPE);35 FetchMatlabData(&control_index,CONTROLINDEX); 35 36 36 37 /*configure: */ … … 40 41 41 42 /*!Call core code: */ 42 Gradjx(&gradient, elements,nodes, vertices,loads, materials,parameters, control_type);43 Gradjx(&gradient,&grad_norm,elements,nodes, vertices,loads, materials,parameters, control_index); 43 44 44 45 /*write output : */ 46 WriteMatlabData(GRADNORM,grad_norm); 45 47 WriteMatlabData(GRADG,gradient); 46 48 -
issm/trunk-jpl/src/mex/Gradj/Gradj.h
r6261 r11310 24 24 #define MATERIALS (mxArray*)prhs[4] 25 25 #define PARAMETERS (mxArray*)prhs[5] 26 #define CONTROL TYPE(mxArray*)prhs[6]26 #define CONTROLINDEX (mxArray*)prhs[6] 27 27 28 28 /* serial output macros: */ 29 29 #define GRADG (mxArray**)&plhs[0] 30 #define GRADNORM (mxArray**)&plhs[1] 30 31 31 32 /* serial arg counts: */ 32 33 #undef NLHS 33 #define NLHS 134 #define NLHS 2 34 35 #undef NRHS 35 36 #define NRHS 7
Note:
See TracChangeset
for help on using the changeset viewer.