6 #include "../toolkits/toolkits.h"
7 #include "../classes/classes.h"
8 #include "../shared/shared.h"
9 #include "../modules/modules.h"
11 #ifdef _HAVE_CODIPACK_
12 extern CoDi_global codi_global;
19 #if defined(_HAVE_ADOLC_)
35 setStoreManagerControl(reCast<IssmPDouble>(gcTriggerRatio),reCast<size_t>(gcTriggerMaxSize));
38 int skipFileDeletion=1;
41 trace_on(my_rank,keepTaylors,reCast<size_t>(obufsize),reCast<size_t>(lbufsize),reCast<size_t>(cbufsize),reCast<size_t>(tbufsize),skipFileDeletion);
43 #elif defined(_HAVE_CODIPACK_)
52 auto& tape_codi = IssmDouble::getGlobalTape();
53 tape_codi.setActive();
57 tape_codi.registerInput(y_t);
60 for(
int i = 0;i < codi_allocn;++i) {
78 void simul_stoptrace2(){
80 #if defined(_HAVE_ADOLC_)
86 size_t tape_stats[15];
87 tapestats(my_rank,tape_stats);
89 int *sstats=
new int[7];
90 sstats[0]=tape_stats[NUM_OPERATIONS];
91 sstats[1]=tape_stats[OP_FILE_ACCESS];
92 sstats[2]=tape_stats[NUM_LOCATIONS];
93 sstats[3]=tape_stats[LOC_FILE_ACCESS];
94 sstats[4]=tape_stats[NUM_VALUES];
95 sstats[5]=tape_stats[VAL_FILE_ACCESS];
96 sstats[6]=tape_stats[TAY_STACK_SIZE];
98 if (my_rank==0) rstats=
new int[commSize*7];
102 int rOffset=(commSize/10)+1;
104 _printf_(
" "<<setw(offset)<<left<<
"#independents: " <<setw(12)<<right<<tape_stats[NUM_INDEPENDENTS] <<
"\n");
105 _printf_(
" "<<setw(offset)<<left<<
"#dependents: " <<setw(12)<<right<<tape_stats[NUM_DEPENDENTS] <<
"\n");
106 _printf_(
" "<<setw(offset)<<left<<
"max #live active variables: " <<setw(12)<<right<<tape_stats[NUM_MAX_LIVES] <<
"\n");
107 _printf_(
" operations: entry size "<<
sizeof(
unsigned char) <<
" Bytes \n");
108 _printf_(
" "<<setw(offset)<<left<<
" #entries in buffer (AutodiffObufsizeEnum) " <<setw(12)<<right<<tape_stats[OP_BUFFER_SIZE] <<
"\n");
109 for (
int r=0;r<commSize;++r)
110 _printf_(
" ["<<setw(rOffset)<<right<<r<<
"]"<<setw(offset-rOffset-4)<<left<<
" #entries total" <<setw(12)<<right<<rstats[r*7+0] << (rstats[r*7+1]?
" ->file":
"") <<
"\n");
111 _printf_(
" locations: entry size " <<
sizeof(locint) <<
" Bytes\n");
112 _printf_(
" "<<setw(offset)<<left<<
" #entries in buffer (AutodiffLbufsizeEnum) " <<setw(12)<<right<<tape_stats[LOC_BUFFER_SIZE] <<
"\n");
113 for (
int r=0;r<commSize;++r)
114 _printf_(
" ["<<setw(rOffset)<<right<<r<<
"]"<<setw(offset-rOffset-4)<<left<<
" #entries total" <<setw(12)<<right<<rstats[r*7+2] << (rstats[r*7+3]?
" ->file":
"") <<
"\n");
115 _printf_(
" constant values: entry size " <<
sizeof(
double) <<
" Bytes\n");
116 _printf_(
" "<<setw(offset)<<left<<
" #entries in buffer (AutodiffCbufsizeEnum) " <<setw(12)<<right<<tape_stats[VAL_BUFFER_SIZE] <<
"\n");
117 for (
int r=0;r<commSize;++r)
118 _printf_(
" ["<<setw(rOffset)<<right<<r<<
"]"<<setw(offset-rOffset-4)<<left<<
" #entries total" <<setw(12)<<right<<rstats[r*7+4] << (rstats[r*7+5]?
" ->file":
"") <<
"\n");
119 _printf_(
" Taylor stack: entry size " <<
sizeof(revreal) <<
" Bytes\n");
120 _printf_(
" "<<setw(offset)<<left<<
" #entries in buffer (AutodiffTbufsizeEnum) " <<setw(12)<<right<<tape_stats[TAY_BUFFER_SIZE] <<
"\n");
121 for (
int r=0;r<commSize;++r)
122 _printf_(
" ["<<setw(rOffset)<<right<<r<<
"]"<<setw(offset-rOffset-4)<<left<<
" #entries total" <<setw(12)<<right<<rstats[r*7+6] << (rstats[r*7+6]>tape_stats[TAY_BUFFER_SIZE]?
" ->file":
"") <<
"\n");
128 #ifdef _HAVE_CODIPACK_
129 #ifdef _AD_TAPE_ALLOC_
132 std::stringstream out_s;
133 IssmDouble::getGlobalTape().printStatistics(out_s);
134 _printf0_(
"CoDiPack Profiling::Tape Statistics :\n" << out_s.str());
138 #elif defined(_HAVE_CODIPACK_)
139 auto& tape_codi = IssmDouble::getGlobalTape();
140 tape_codi.setPassive();
145 tape_codi.printStatistics(std::cout);
146 codi_global.print(std::cout);
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);