[19102] | 1 | Index: ../trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.cpp
|
---|
| 2 | ===================================================================
|
---|
| 3 | --- ../trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.cpp (revision 18568)
|
---|
| 4 | +++ ../trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.cpp (revision 18569)
|
---|
| 5 | @@ -136,7 +136,8 @@
|
---|
| 6 |
|
---|
| 7 | /*Deal with second term*/
|
---|
| 8 | switch(control_type){
|
---|
| 9 | - case BalancethicknessOmegaEnum: GradientJOmega(element,gradient,control_index); break;
|
---|
| 10 | + case BalancethicknessOmegaEnum: GradientJOmega(element,gradient,control_index); break;
|
---|
| 11 | + case BalancethicknessThickeningRateEnum: GradientJdHdt( element,gradient,control_index); break;
|
---|
| 12 | default: _error_("control type not supported yet: " << EnumToStringx(control_type));
|
---|
| 13 | }
|
---|
| 14 |
|
---|
| 15 | @@ -191,6 +192,30 @@
|
---|
| 16 | xDelete<int>(vertexpidlist);
|
---|
| 17 | delete gauss;
|
---|
| 18 | }/*}}}*/
|
---|
| 19 | +void AdjointBalancethickness2Analysis::GradientJdHdt(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/
|
---|
| 20 | +
|
---|
| 21 | + /*Fetch number of vertices for this finite element*/
|
---|
| 22 | + int numvertices = element->GetNumberOfVertices();
|
---|
| 23 | +
|
---|
| 24 | + /*Initialize some vectors*/
|
---|
| 25 | + IssmDouble* ge = xNewZeroInit<IssmDouble>(numvertices);
|
---|
| 26 | + IssmDouble* lambda = xNew<IssmDouble>(numvertices);
|
---|
| 27 | + int* vertexpidlist = xNew<int>(numvertices);
|
---|
| 28 | +
|
---|
| 29 | + /*Retrieve all inputs we will be needing: */
|
---|
| 30 | + element->GradientIndexing(&vertexpidlist[0],control_index);
|
---|
| 31 | + element->GetInputListOnVertices(lambda,AdjointEnum);
|
---|
| 32 | + for(int i=0;i<numvertices;i++){
|
---|
| 33 | + ge[i]= - lambda[i];
|
---|
| 34 | + _assert_(!xIsNan<IssmDouble>(ge[i]));
|
---|
| 35 | + }
|
---|
| 36 | + gradient->SetValues(numvertices,vertexpidlist,ge,INS_VAL);
|
---|
| 37 | +
|
---|
| 38 | + /*Clean up and return*/
|
---|
| 39 | + xDelete<IssmDouble>(ge);
|
---|
| 40 | + xDelete<IssmDouble>(lambda);
|
---|
| 41 | + xDelete<int>(vertexpidlist);
|
---|
| 42 | +}/*}}}*/
|
---|
| 43 | void AdjointBalancethickness2Analysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/
|
---|
| 44 | element->InputUpdateFromSolutionOneDof(solution,AdjointEnum);
|
---|
| 45 | }/*}}}*/
|
---|
| 46 | Index: ../trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.h
|
---|
| 47 | ===================================================================
|
---|
| 48 | --- ../trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.h (revision 18568)
|
---|
| 49 | +++ ../trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.h (revision 18569)
|
---|
| 50 | @@ -28,6 +28,7 @@
|
---|
| 51 | void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
|
---|
| 52 | void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
|
---|
| 53 | void GradientJOmega(Element* element,Vector<IssmDouble>* gradient,int control_index);
|
---|
| 54 | + void GradientJdHdt(Element* element,Vector<IssmDouble>* gradient,int control_index);
|
---|
| 55 | void InputUpdateFromSolution(IssmDouble* solution,Element* element);
|
---|
| 56 | void UpdateConstraints(FemModel* femmodel);
|
---|
| 57 | };
|
---|