Changeset 25550
- Timestamp:
- 09/09/20 20:01:09 (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/cores/transient_core.cpp
r25536 r25550 4 4 5 5 #ifdef HAVE_CONFIG_H 6 6 #include <config.h> 7 7 #else 8 8 #error "Cannot compile with HAVE_CONFIG_H symbol! run configure first!" … … 289 289 290 290 std::vector<IssmDouble> time_all; 291 291 int Ysize = 0; 292 292 CountDoublesFunctor *hdl_countdoubles = NULL; 293 293 RegisterInputFunctor *hdl_regin = NULL; … … 314 314 hdl_countdoubles = new CountDoublesFunctor(); 315 315 femmodel->Marshall(hdl_countdoubles); 316 316 if(hdl_countdoubles->DoubleCount()>Ysize) Ysize= hdl_countdoubles->DoubleCount(); 317 317 delete hdl_countdoubles; 318 318 … … 336 336 GetVectorFromControlInputsx(&X,&Xsize,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,"value"); 337 337 338 /*Initialize model state adjoint (Yb)*/ 339 double *Yb = xNewZeroInit<double>(Ysize); 340 int *Yin = xNewZeroInit<int>(Ysize); 341 338 /*Initialize model state adjoint (Yb)*/ 339 double *Yb = xNewZeroInit<double>(Ysize); 340 int *Yin = xNewZeroInit<int>(Ysize); 341 342 /*Get final Ysize*/ 343 hdl_countdoubles = new CountDoublesFunctor(); 344 femmodel->Marshall(hdl_countdoubles); 345 int Ysize_i= hdl_countdoubles->DoubleCount(); 346 delete hdl_countdoubles; 342 347 343 348 /*Start tracing*/ … … 346 351 347 352 /*Reverse dependent (f)*/ 348 349 350 353 hdl_regin = new RegisterInputFunctor(Yin,Ysize); 354 femmodel->Marshall(hdl_regin); 355 delete hdl_regin; 351 356 for(int i=0; i < Xsize; i++) tape_codi.registerInput(X[i]); 352 357 353 358 SetControlInputsFromVectorx(femmodel,X); 354 IssmDouble J = 0.; 355 for(int i=0;i<dependent_objects->Size();i++){ 356 DependentObject* dep=(DependentObject*)dependent_objects->GetObjectByOffset(i); 357 J += dep->GetValue(); 359 IssmDouble J = 0.; 360 if(0){ 361 for(int i=0;i<dependent_objects->Size();i++){ 362 DependentObject* dep=(DependentObject*)dependent_objects->GetObjectByOffset(i); 363 J += dep->GetValue(); 364 } 365 } 366 else{ 367 femmodel->IceVolumex(&J,false); 358 368 } 359 369 if(IssmComm::GetRank()==0) tape_codi.registerOutput(J); … … 363 373 tape_codi.evaluate(); 364 374 365 /*Initialize Xb and Yb*/ 366 double *Xb = xNewZeroInit<double>(Xsize); 367 for(int i=0;i<Xsize;i++) Xb[i] += X[i].gradient(); 368 369 hdl_setadjoint = new SetAdjointFunctor(Yb,Ysize); 370 femmodel->Marshall(hdl_setadjoint); 371 delete hdl_setadjoint; 375 /*Initialize Xb and Yb*/ 376 double *Xb = xNewZeroInit<double>(Xsize); 377 for(int i=0;i<Xsize ;i++) Xb[i] += X[i].gradient(); 378 for(int i=0;i<Ysize_i;i++) Yb[i] = tape_codi.gradient(Yin[i]); 372 379 373 380 /*reverse loop for transient step (G)*/ 374 for(int reverse_step = step;reverse_step> =0; reverse_step--){381 for(int reverse_step = step;reverse_step>0; reverse_step--){ 375 382 376 383 /*Restore model from this step*/ … … 378 385 femmodel->RestartAD(reverse_step); 379 386 tape_codi.setActive(); 387 388 /*Get new Ysize*/ 389 hdl_countdoubles = new CountDoublesFunctor(); 390 femmodel->Marshall(hdl_countdoubles); 391 int Ysize_i= hdl_countdoubles->DoubleCount(); 392 delete hdl_countdoubles; 380 393 381 394 /*We need to store the CoDiPack identifier here, since y is overwritten.*/ … … 408 421 409 422 /* here we access the gradient data via the stored identifiers.*/ 410 for(int i=0; i<Ysize; i++) Yb[i] = tape_codi.gradient(Yin[i]); 411 for(int i=0; i<Xsize; i++) Xb[i] += X[i].gradient(); 423 //for(int i=0; i<Ysize_i; i++) if(tape_codi.gradient(Yin[i])!=0.) printf(" %g (%i)",tape_codi.gradient(Yin[i]),Yin[i]); 424 for(int i=0; i<Ysize_i; i++) Yb[i] = tape_codi.gradient(Yin[i]); 425 for(int i=0; i<Xsize; i++) Xb[i] += X[i].gradient(); 412 426 } 413 427
Note:
See TracChangeset
for help on using the changeset viewer.