[25834] | 1 | Index: ../trunk-jpl/src/c/cores/transient_core.cpp
|
---|
| 2 | ===================================================================
|
---|
| 3 | --- ../trunk-jpl/src/c/cores/transient_core.cpp (revision 25591)
|
---|
| 4 | +++ ../trunk-jpl/src/c/cores/transient_core.cpp (revision 25592)
|
---|
| 5 | @@ -332,11 +332,13 @@
|
---|
| 6 | transient_step(femmodel);
|
---|
| 7 |
|
---|
| 8 | /*Go through our dependent variables, and compute the response:*/
|
---|
| 9 | - DataSet* dependent_objects=((DataSetParam*)femmodel->parameters->FindParamObject(AutodiffDependentObjectsEnum))->value;
|
---|
| 10 | - for(Object* & object:dependent_objects->objects){
|
---|
| 11 | - DependentObject* dep=(DependentObject*)object;
|
---|
| 12 | - dep->Responsex(&output_value,femmodel);
|
---|
| 13 | - dep->AddValue(output_value);
|
---|
| 14 | + if(finaltime==time){
|
---|
| 15 | + DataSet* dependent_objects=((DataSetParam*)femmodel->parameters->FindParamObject(AutodiffDependentObjectsEnum))->value;
|
---|
| 16 | + for(Object* & object:dependent_objects->objects){
|
---|
| 17 | + DependentObject* dep=(DependentObject*)object;
|
---|
| 18 | + dep->Responsex(&output_value,femmodel);
|
---|
| 19 | + dep->AddValue(output_value);
|
---|
| 20 | + }
|
---|
| 21 | }
|
---|
| 22 |
|
---|
| 23 | if(VerboseSolution()) _printf0_(" counting number of active variables\n");
|
---|
| 24 | @@ -377,16 +379,11 @@
|
---|
| 25 | SetControlInputsFromVectorx(femmodel,X);
|
---|
| 26 |
|
---|
| 27 | IssmDouble J = 0.;
|
---|
| 28 | - if(0){
|
---|
| 29 | - DataSet* dependent_objects=((DataSetParam*)femmodel->parameters->FindParamObject(AutodiffDependentObjectsEnum))->value;
|
---|
| 30 | - for(Object* & object:dependent_objects->objects){
|
---|
| 31 | - DependentObject* dep=(DependentObject*)object;
|
---|
| 32 | - J += dep->GetValue();
|
---|
| 33 | - }
|
---|
| 34 | + DataSet* dependent_objects=((DataSetParam*)femmodel->parameters->FindParamObject(AutodiffDependentObjectsEnum))->value;
|
---|
| 35 | + for(Object* & object:dependent_objects->objects){
|
---|
| 36 | + DependentObject* dep=(DependentObject*)object;
|
---|
| 37 | + J += dep->GetValue();
|
---|
| 38 | }
|
---|
| 39 | - else{
|
---|
| 40 | - femmodel->IceVolumeAboveFloatationx(&J,false);
|
---|
| 41 | - }
|
---|
| 42 | tape_codi.registerOutput(J);
|
---|
| 43 |
|
---|
| 44 | tape_codi.setPassive();
|
---|
| 45 | @@ -434,6 +431,16 @@
|
---|
| 46 | <<std::fixed<<std::setprecision(2)<<thistime/yts<< " (time step: " << thisdt/yts << ")\n");
|
---|
| 47 | transient_step(femmodel);
|
---|
| 48 |
|
---|
| 49 | + /*Go through our dependent variables, and compute the response:*/
|
---|
| 50 | + if(thistime==finaltime){
|
---|
| 51 | + DataSet* dependent_objects=((DataSetParam*)femmodel->parameters->FindParamObject(AutodiffDependentObjectsEnum))->value;
|
---|
| 52 | + for(Object* & object:dependent_objects->objects){
|
---|
| 53 | + DependentObject* dep=(DependentObject*)object;
|
---|
| 54 | + dep->Responsex(&output_value,femmodel);
|
---|
| 55 | + dep->AddValue(output_value);
|
---|
| 56 | + }
|
---|
| 57 | + }
|
---|
| 58 | +
|
---|
| 59 | /*First and last segment need special treatment*/
|
---|
| 60 | if(thisstep==finalstep) break;
|
---|
| 61 | if(reverse_step==1 && ii==recording_frequency-2) break;
|
---|
| 62 | @@ -459,6 +466,8 @@
|
---|
| 63 | for(int i=0; i<Ysize_i; i++) Yb[i] = tape_codi.gradient(Yin[i]);
|
---|
| 64 | for(int i=0; i<Xsize; i++) Xb[i] += X[i].gradient();
|
---|
| 65 | }
|
---|
| 66 | + /*Clear tape*/
|
---|
| 67 | + tape_codi.reset();
|
---|
| 68 |
|
---|
| 69 | /*Broadcast gradient to other ranks (make sure to sum all gradients)*/
|
---|
| 70 | double* gradient=xNew<double>(Xsize);
|
---|