28 int num_dependents_old=0;
29 int num_independents=0;
30 bool isautodiff =
false;
50 #if defined(_HAVE_ADOLC_)
57 size_t tape_stats[15];
58 tapestats(my_rank,tape_stats);
60 int *sstats=
new int[7];
61 sstats[0]=tape_stats[NUM_OPERATIONS];
62 sstats[1]=tape_stats[OP_FILE_ACCESS];
63 sstats[2]=tape_stats[NUM_LOCATIONS];
64 sstats[3]=tape_stats[LOC_FILE_ACCESS];
65 sstats[4]=tape_stats[NUM_VALUES];
66 sstats[5]=tape_stats[VAL_FILE_ACCESS];
67 sstats[6]=tape_stats[TAY_STACK_SIZE];
69 if (my_rank==0) rstats=
new int[commSize*7];
73 int rOffset=(commSize/10)+1;
75 _printf_(
" "<<setw(offset)<<left<<
"#independents: " <<setw(12)<<right<<tape_stats[NUM_INDEPENDENTS] <<
"\n");
76 _printf_(
" "<<setw(offset)<<left<<
"#dependents: " <<setw(12)<<right<<tape_stats[NUM_DEPENDENTS] <<
"\n");
77 _printf_(
" "<<setw(offset)<<left<<
"max #live active variables: " <<setw(12)<<right<<tape_stats[NUM_MAX_LIVES] <<
"\n");
78 _printf_(
" operations: entry size "<<
sizeof(
unsigned char) <<
" Bytes \n");
79 _printf_(
" "<<setw(offset)<<left<<
" #entries in buffer (AutodiffObufsizeEnum) " <<setw(12)<<right<<tape_stats[OP_BUFFER_SIZE] <<
"\n");
80 for (
int r=0;r<commSize;++r)
81 _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");
82 _printf_(
" locations: entry size " <<
sizeof(locint) <<
" Bytes\n");
83 _printf_(
" "<<setw(offset)<<left<<
" #entries in buffer (AutodiffLbufsizeEnum) " <<setw(12)<<right<<tape_stats[LOC_BUFFER_SIZE] <<
"\n");
84 for (
int r=0;r<commSize;++r)
85 _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");
86 _printf_(
" constant values: entry size " <<
sizeof(
double) <<
" Bytes\n");
87 _printf_(
" "<<setw(offset)<<left<<
" #entries in buffer (AutodiffCbufsizeEnum) " <<setw(12)<<right<<tape_stats[VAL_BUFFER_SIZE] <<
"\n");
88 for (
int r=0;r<commSize;++r)
89 _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");
90 _printf_(
" Taylor stack: entry size " <<
sizeof(revreal) <<
" Bytes\n");
91 _printf_(
" "<<setw(offset)<<left<<
" #entries in buffer (AutodiffTbufsizeEnum) " <<setw(12)<<right<<tape_stats[TAY_BUFFER_SIZE] <<
"\n");
92 for (
int r=0;r<commSize;++r)
93 _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");
104 if(!(num_dependents*num_independents))
return;
107 num_dependents_old=num_dependents;
109 num_dependents=0; num_independents=0;
116 xp=xNew<double>(num_independents);
117 for(i=0;i<num_independents;i++){
118 xp[i]=reCast<double,IssmDouble>(axp[i]);
125 anEDF_for_solverx_p->dp_x=xNew<double>(anEDF_for_solverx_p->max_n);
126 anEDF_for_solverx_p->dp_y=xNew<double>(anEDF_for_solverx_p->max_m);
132 totalgradient=xNewZeroInit<IssmPDouble>(num_independents);
134 for(aDepIndex=0;aDepIndex<num_dependents_old;aDepIndex++){
137 aWeightVector=xNewZeroInit<IssmPDouble>(num_dependents);
138 if (my_rank==0) aWeightVector[aDepIndex]=1.0;
141 weightVectorTimesJac=xNew<IssmPDouble>(num_independents);
145 anEDF_for_solverx_p->fos_reverse=EDF_fos_reverse_for_solverx;
148 anEDF_for_solverx_p->fos_reverse_iArr=fos_reverse_mumpsSolveEDF;
151 anEDF_for_solverx_p->dp_U=xNew<IssmPDouble>(anEDF_for_solverx_p->max_m);
152 anEDF_for_solverx_p->dp_Z=xNew<IssmPDouble>(anEDF_for_solverx_p->max_n);
155 fos_reverse(my_rank,num_dependents,num_independents, aWeightVector, weightVectorTimesJac );
158 if(my_rank==0)
for(i=0;i<num_independents;i++)totalgradient[i]+=weightVectorTimesJac[i];
171 xDelete(anEDF_for_solverx_p->dp_x);
172 xDelete(anEDF_for_solverx_p->dp_X);
173 xDelete(anEDF_for_solverx_p->dpp_X);
174 xDelete(anEDF_for_solverx_p->dp_y);
175 xDelete(anEDF_for_solverx_p->dp_Y);
176 xDelete(anEDF_for_solverx_p->dpp_Y);
177 xDelete(anEDF_for_solverx_p->dp_U);
178 xDelete(anEDF_for_solverx_p->dpp_U);
179 xDelete(anEDF_for_solverx_p->dp_Z);
180 xDelete(anEDF_for_solverx_p->dpp_Z);
185 #elif defined(_HAVE_CODIPACK_)
186 fprintf(stderr,
"*** Codipack adgradient_core()\n");
188 _error_(
"Should not be requesting AD drivers when an AD library is not available!");