180 void (*solutioncore)(
FemModel*)=NULL;
183 #if defined(_HAVE_ADOLC_)
187 for(
int i=0;i<n;i++){
191 _error_(
"not implemented yet...");
193 #elif defined(_HAVE_CODIPACK_)
196 auto& tape_codi = IssmDouble::getGlobalTape();
197 codi_global.input_indices.clear();
199 for (
int i=0;i<n;i++) {
201 tape_codi.registerInput(aX[i]);
202 codi_global.input_indices.push_back(aX[i].getGradientData());
215 DataSet* dependent_objects=NULL;
221 dependents=xNew<IssmPDouble>(num_dependents);
222 codi_global.output_indices.clear();
223 for(
int i=0;i<dependent_objects->
Size();i++){
231 _printf0_(
"=== output ="<<output_value<<
" \n");
233 tape_codi.registerOutput(output_value);
234 dependents[i] = output_value.getValue();
235 codi_global.output_indices.push_back(output_value.getGradientData());
240 _printf0_(
"Initial cost function J(x) = "<<setw(12)<<setprecision(7)<<j0<<
"\n");
245 tape_codi.setGradient(codi_global.output_indices[0],1.0);
247 tape_codi.evaluate();
250 auto in_size = codi_global.input_indices.size();
251 for(
size_t i = 0; i < in_size; ++i) {
252 G[i] = tape_codi.getGradient(codi_global.input_indices[i]);
256 void (*adjointcore)(
FemModel*) = NULL;
266 _printf0_(
"Initial cost function J(x) = "<<setw(12)<<setprecision(7)<<j0<<
"\n");
267 xDelete<IssmDouble>(jlist);
271 for(
int i=0;i<n;i++) G[i] = -G[i];
281 _printf0_(
"_________________________\n");
282 for(
int m=0;m<num;m++){
286 for(
int i=0;i<n;i++) X[i] = X0[i] +
alpha*scaling_factors[0];
292 #if defined(_HAVE_CODIPACK_)
294 for(
int i=0;i<dependent_objects->
Size();i++){
309 for(
int i=0;i<n;i++) Den +=
alpha* G[i] * scaling_factors[0];
310 Ialpha = fabs((j - j0)/Den - 1.);
313 _printf0_(
" " << setw(11) << setprecision (5)<<
alpha<<
" " << setw(11) << setprecision (5)<<Ialpha<<
"\n");
314 output[m*2+0] =
alpha;
315 output[m*2+1] = Ialpha;
321 for(
int i=0;i<2*num;i++) J_passive[i]=reCast<IssmPDouble>(output[i]);
323 xDelete<IssmPDouble>(J_passive);
325 for(
int i=0;i<n;i++) aG[i] = G[i];
327 xDelete<IssmDouble>(aG);
335 xDelete<IssmDouble>(output);
336 xDelete<IssmPDouble>(G);
337 xDelete<IssmDouble>(X);
339 xDelete<IssmDouble>(scaling_factors);