13 bool control_analysis;
15 int control,cost_function,domaintype;
16 int num_controls,num_cost_functions;
20 int *control_enums = NULL;
21 char **controls = NULL;
22 char **cost_functions = NULL;
29 iomodel->
FindConstant(&control_analysis,
"md.inversion.iscontrol");
30 if(!control_analysis)
return;
34 iomodel->
FindConstant(&isautodiff,
"md.autodiff.isautodiff");
41 iomodel->
FindConstant(&num_controls,
"md.inversion.num_control_parameters");
42 iomodel->
FindConstant(&controls,&num_controls,
"md.inversion.control_parameters");
43 if(num_controls<1)
_error_(
"no controls found");
44 control_enums=xNew<int>(num_controls);
45 for(
int i=0;i<num_controls;i++){
50 iomodel->
FindConstant(&num_cost_functions,
"md.inversion.num_cost_functions");
51 iomodel->
FindConstant(&cost_functions,&num_cost_functions,
"md.inversion.cost_functions");
52 if(num_cost_functions<1)
_error_(
"No cost functions found");
53 int* cost_function_enums=xNew<int>(num_cost_functions);
54 for(
int i=0;i<num_cost_functions;++i){
59 iomodel->
FindConstant(&domaintype,
"md.mesh.domain_type");
61 iomodel->
FetchData(&weights,&M,&N,
"md.inversion.cost_functions_coefficients");
65 IssmDouble* weights_transp = xNew<IssmDouble>(M*N);
66 for(
int i=0;i<M;i++)
for(
int j=0;j<N;j++) weights_transp[j*M+i] = weights[i*N+j];
67 xDelete<IssmDouble>(weights);
68 weights = weights_transp;
72 for(
int i=0;i<num_cost_functions;i++){
73 cost_function=cost_function_enums[i];
85 for(
int j=0;j<elements->
Size();j++){
91 xDelete<IssmDouble>(weights);
94 iomodel->
FetchData(&independents_min,&M,&N,
"md.inversion.min_parameters");
96 iomodel->
FetchData(&independents_max,&M,&N,
"md.inversion.max_parameters");
101 IssmDouble* independents_min_transp = xNew<IssmDouble>(M*N);
102 for(
int i=0;i<M;i++)
for(
int j=0;j<N;j++) independents_min_transp[j*M+i] = independents_min[i*N+j];
103 xDelete<IssmDouble>(independents_min);
104 independents_min = independents_min_transp;
106 IssmDouble* independents_max_transp = xNew<IssmDouble>(M*N);
107 for(
int i=0;i<M;i++)
for(
int j=0;j<N;j++) independents_max_transp[j*M+i] = independents_max[i*N+j];
108 xDelete<IssmDouble>(independents_max);
109 independents_max = independents_max_transp;
112 for(
int i=0;i<num_controls;i++){
113 control = control_enums[i];
120 case VxEnum: iomodel->
FetchData(&independent,&M,&N,
"md.initialization.vx");scale = 1./yts;
break;
121 case VyEnum: iomodel->
FetchData(&independent,&M,&N,
"md.initialization.vy");scale = 1./yts;
break;
142 for(
int j=0;j<elements->
Size();j++){
146 xDelete<IssmDouble>(independent);
148 xDelete<IssmDouble>(independents_min);
149 xDelete<IssmDouble>(independents_max);
153 for(
int i=0;i<num_controls;i++){
154 switch(control_enums[i]){
174 xDelete<int>(control_enums);
175 xDelete<int>(cost_function_enums);
176 for(
int i=0;i<num_cost_functions;i++) xDelete<char>(cost_functions[i]);
177 xDelete<char*>(cost_functions);
178 for(
int i=0;i<num_controls;i++) xDelete<char>(controls[i]);
179 xDelete<char*>(controls);