[18296] | 1 | Index: ../trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.cpp
|
---|
| 2 | ===================================================================
|
---|
| 3 | --- ../trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.cpp (revision 18002)
|
---|
| 4 | +++ ../trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.cpp (revision 18003)
|
---|
| 5 | @@ -37,102 +37,72 @@
|
---|
| 6 | }/*}}}*/
|
---|
| 7 | ElementMatrix* AdjointBalancethickness2Analysis::CreateKMatrix(Element* element){/*{{{*/
|
---|
| 8 |
|
---|
| 9 | - _error_("not implemented");
|
---|
| 10 | Balancethickness2Analysis* analysis = new Balancethickness2Analysis();
|
---|
| 11 | ElementMatrix* Ke = analysis->CreateKMatrix(element);
|
---|
| 12 | delete analysis;
|
---|
| 13 |
|
---|
| 14 | - /*Transpose and return Ke*/
|
---|
| 15 | - Ke->Transpose();
|
---|
| 16 | return Ke;
|
---|
| 17 | }/*}}}*/
|
---|
| 18 | ElementVector* AdjointBalancethickness2Analysis::CreatePVector(Element* element){/*{{{*/
|
---|
| 19 |
|
---|
| 20 | - _error_("not implemented");
|
---|
| 21 | - /*Intermediaries*/
|
---|
| 22 | - int domaintype;
|
---|
| 23 | - Element* basalelement;
|
---|
| 24 | -
|
---|
| 25 | - /*Get basal element*/
|
---|
| 26 | - element->FindParam(&domaintype,DomainTypeEnum);
|
---|
| 27 | - switch(domaintype){
|
---|
| 28 | - case Domain2DhorizontalEnum:
|
---|
| 29 | - basalelement = element;
|
---|
| 30 | - break;
|
---|
| 31 | - case Domain3DEnum:
|
---|
| 32 | - if(!element->IsOnBase()) return NULL;
|
---|
| 33 | - basalelement = element->SpawnBasalElement();
|
---|
| 34 | - break;
|
---|
| 35 | - default: _error_("mesh "<<EnumToStringx(domaintype)<<" not supported yet");
|
---|
| 36 | - }
|
---|
| 37 | -
|
---|
| 38 | /*Intermediaries */
|
---|
| 39 | int num_responses,i;
|
---|
| 40 | - IssmDouble dH[2];
|
---|
| 41 | - IssmDouble vx,vy,vel,Jdet;
|
---|
| 42 | - IssmDouble thickness,thicknessobs,weight;
|
---|
| 43 | + IssmDouble hobs,hu2,weight,NUMx,NUMy,DEN,Jdet;
|
---|
| 44 | + IssmDouble vx,vy,vbar2,nux,nuy,dphi[2];
|
---|
| 45 | int *responses = NULL;
|
---|
| 46 | IssmDouble *xyz_list = NULL;
|
---|
| 47 |
|
---|
| 48 | /*Fetch number of nodes and dof for this finite element*/
|
---|
| 49 | - int numnodes = basalelement->GetNumberOfNodes();
|
---|
| 50 | + int numnodes = element->GetNumberOfNodes();
|
---|
| 51 |
|
---|
| 52 | /*Initialize Element vector and vectors*/
|
---|
| 53 | - ElementVector* pe = basalelement->NewElementVector(SSAApproximationEnum);
|
---|
| 54 | + ElementVector* pe = element->NewElementVector(SSAApproximationEnum);
|
---|
| 55 | IssmDouble* basis = xNew<IssmDouble>(numnodes);
|
---|
| 56 | IssmDouble* dbasis = xNew<IssmDouble>(2*numnodes);
|
---|
| 57 |
|
---|
| 58 | /*Retrieve all inputs and parameters*/
|
---|
| 59 | - basalelement->GetVerticesCoordinates(&xyz_list);
|
---|
| 60 | - basalelement->FindParam(&num_responses,InversionNumCostFunctionsEnum);
|
---|
| 61 | - basalelement->FindParam(&responses,NULL,InversionCostFunctionsEnum);
|
---|
| 62 | - Input* thickness_input = basalelement->GetInput(ThicknessEnum); _assert_(thickness_input);
|
---|
| 63 | - Input* thicknessobs_input = basalelement->GetInput(InversionThicknessObsEnum); _assert_(thicknessobs_input);
|
---|
| 64 | - Input* weights_input = basalelement->GetInput(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);
|
---|
| 65 | - Input* vx_input = basalelement->GetInput(VxEnum); _assert_(vx_input);
|
---|
| 66 | - Input* vy_input = basalelement->GetInput(VyEnum); _assert_(vy_input);
|
---|
| 67 | + element->GetVerticesCoordinates(&xyz_list);
|
---|
| 68 | + element->FindParam(&num_responses,InversionNumCostFunctionsEnum);
|
---|
| 69 | + element->FindParam(&responses,NULL,InversionCostFunctionsEnum);
|
---|
| 70 | + Input* thicknessobs_input = element->GetInput(InversionThicknessObsEnum); _assert_(thicknessobs_input);
|
---|
| 71 | + Input* weights_input = element->GetInput(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);
|
---|
| 72 | + Input* potential_input = element->GetInput(PotentialEnum); _assert_(potential_input);
|
---|
| 73 | + Input* vx_input = element->GetInput(BalancethicknessVxObsEnum); _assert_(vx_input);
|
---|
| 74 | + Input* vy_input = element->GetInput(BalancethicknessVyObsEnum); _assert_(vy_input);
|
---|
| 75 | + Input* nux_input = element->GetInput(BalancethicknessNuxEnum); _assert_(nux_input);
|
---|
| 76 | + Input* nuy_input = element->GetInput(BalancethicknessNuyEnum); _assert_(nuy_input);
|
---|
| 77 |
|
---|
| 78 | /* Start looping on the number of gaussian points: */
|
---|
| 79 | - Gauss* gauss=basalelement->NewGauss(2);
|
---|
| 80 | + Gauss* gauss=element->NewGauss(2);
|
---|
| 81 | for(int ig=gauss->begin();ig<gauss->end();ig++){
|
---|
| 82 | gauss->GaussPoint(ig);
|
---|
| 83 |
|
---|
| 84 | - basalelement->JacobianDeterminant(&Jdet,xyz_list,gauss);
|
---|
| 85 | - basalelement->NodalFunctions(basis,gauss);
|
---|
| 86 | - basalelement->NodalFunctionsDerivatives(dbasis,xyz_list,gauss);
|
---|
| 87 | + element->JacobianDeterminant(&Jdet,xyz_list,gauss);
|
---|
| 88 | + element->NodalFunctions(basis,gauss);
|
---|
| 89 | + element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss);
|
---|
| 90 |
|
---|
| 91 | - thickness_input->GetInputValue(&thickness, gauss);
|
---|
| 92 | - thickness_input->GetInputDerivativeValue(&dH[0],xyz_list,gauss);
|
---|
| 93 | - thicknessobs_input->GetInputValue(&thicknessobs, gauss);
|
---|
| 94 | + vx_input->GetInputValue(&vx,gauss);
|
---|
| 95 | + vy_input->GetInputValue(&vy,gauss);
|
---|
| 96 | + nux_input->GetInputValue(&nux,gauss);
|
---|
| 97 | + nuy_input->GetInputValue(&nuy,gauss);
|
---|
| 98 | + potential_input->GetInputDerivativeValue(&dphi[0],xyz_list,gauss);
|
---|
| 99 | + thicknessobs_input->GetInputValue(&hobs,gauss);
|
---|
| 100 |
|
---|
| 101 | + vbar2 = (nux*nux*vx*vx + nuy*nuy*vy*vy);
|
---|
| 102 | + hu2 = hobs*hobs*vbar2;
|
---|
| 103 | +
|
---|
| 104 | + NUMx = 2.*dbasis[0]*dphi[0]*(dphi[0]*dphi[0] + dphi[1]*dphi[1] - hu2);
|
---|
| 105 | + NUMy = 2.*dbasis[1]*dphi[1]*(dphi[0]*dphi[0] + dphi[1]*dphi[1] - hu2);
|
---|
| 106 | + DEN = vbar2*vbar2;
|
---|
| 107 | +
|
---|
| 108 | /*Loop over all requested responses*/
|
---|
| 109 | for(int resp=0;resp<num_responses;resp++){
|
---|
| 110 | weights_input->GetInputValue(&weight,gauss,responses[resp]);
|
---|
| 111 |
|
---|
| 112 | switch(responses[resp]){
|
---|
| 113 | - case ThicknessAbsMisfitEnum:
|
---|
| 114 | - for(i=0;i<numnodes;i++) pe->values[i]+=(thicknessobs-thickness)*weight*Jdet*gauss->weight*basis[i];
|
---|
| 115 | + case Balancethickness2MisfitEnum:
|
---|
| 116 | + for(i=0;i<numnodes;i++) pe->values[i]+=(NUMx+NUMy)/DEN *weight*Jdet*gauss->weight*basis[i];
|
---|
| 117 | break;
|
---|
| 118 | - case ThicknessAbsGradientEnum:
|
---|
| 119 | - for(i=0;i<numnodes;i++) pe->values[i]+= - weight*dH[0]*dbasis[0*numnodes+i]*Jdet*gauss->weight;
|
---|
| 120 | - for(i=0;i<numnodes;i++) pe->values[i]+= - weight*dH[1]*dbasis[1*numnodes+i]*Jdet*gauss->weight;
|
---|
| 121 | - break;
|
---|
| 122 | - case ThicknessAlongGradientEnum:
|
---|
| 123 | - vx_input->GetInputValue(&vx,gauss);
|
---|
| 124 | - vy_input->GetInputValue(&vy,gauss);
|
---|
| 125 | - vel = sqrt(vx*vx+vy*vy);
|
---|
| 126 | - vx = vx/(vel+1.e-9);
|
---|
| 127 | - vy = vy/(vel+1.e-9);
|
---|
| 128 | - for(i=0;i<numnodes;i++) pe->values[i]+= - weight*(dH[0]*vx+dH[1]*vy)*(dbasis[0*numnodes+i]*vx+dbasis[1*numnodes+i]*vy)*Jdet*gauss->weight;
|
---|
| 129 | - break;
|
---|
| 130 | - case ThicknessAcrossGradientEnum:
|
---|
| 131 | - vx_input->GetInputValue(&vx,gauss);
|
---|
| 132 | - vy_input->GetInputValue(&vy,gauss);
|
---|
| 133 | - vel = sqrt(vx*vx+vy*vy);
|
---|
| 134 | - vx = vx/(vel+1.e-9);
|
---|
| 135 | - vy = vy/(vel+1.e-9);
|
---|
| 136 | - for(i=0;i<numnodes;i++) pe->values[i]+= - weight*(dH[0]*(-vy)+dH[1]*vx)*(dbasis[0*numnodes+i]*(-vy)+dbasis[1*numnodes+i]*vx)*Jdet*gauss->weight;
|
---|
| 137 | - break;
|
---|
| 138 | default:
|
---|
| 139 | _error_("response " << EnumToStringx(responses[resp]) << " not supported yet");
|
---|
| 140 | }
|
---|
| 141 | @@ -144,7 +114,6 @@
|
---|
| 142 | xDelete<IssmDouble>(xyz_list);
|
---|
| 143 | xDelete<IssmDouble>(basis);
|
---|
| 144 | xDelete<IssmDouble>(dbasis);
|
---|
| 145 | - if(domaintype!=Domain2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;};
|
---|
| 146 | delete gauss;
|
---|
| 147 | return pe;
|
---|
| 148 | }/*}}}*/
|
---|
| 149 | Index: ../trunk-jpl/src/c/analyses/Balancethickness2Analysis.cpp
|
---|
| 150 | ===================================================================
|
---|
| 151 | --- ../trunk-jpl/src/c/analyses/Balancethickness2Analysis.cpp (revision 18002)
|
---|
| 152 | +++ ../trunk-jpl/src/c/analyses/Balancethickness2Analysis.cpp (revision 18003)
|
---|
| 153 | @@ -182,7 +182,7 @@
|
---|
| 154 | element->JacobianDeterminantSurface(&Jdet,xyz_list_front,gauss);
|
---|
| 155 | element->NodalFunctions(basis,gauss);
|
---|
| 156 |
|
---|
| 157 | - for(int i=0;i<numnodes;i++) pe->values[i] += - Jdet*gauss->weight*thickness*(vx*normal[0] + vy*normal[1])*basis[i];
|
---|
| 158 | + for(int i=0;i<numnodes;i++) pe->values[i] += Jdet*gauss->weight*thickness*(vx*normal[0] + vy*normal[1])*basis[i];
|
---|
| 159 | }
|
---|
| 160 |
|
---|
| 161 | /*Clean up and return*/
|
---|
| 162 | Index: ../trunk-jpl/src/c/modules/ModelProcessorx/Control/UpdateElementsAndMaterialsControl.cpp
|
---|
| 163 | ===================================================================
|
---|
| 164 | --- ../trunk-jpl/src/c/modules/ModelProcessorx/Control/UpdateElementsAndMaterialsControl.cpp (revision 18002)
|
---|
| 165 | +++ ../trunk-jpl/src/c/modules/ModelProcessorx/Control/UpdateElementsAndMaterialsControl.cpp (revision 18003)
|
---|
| 166 | @@ -11,8 +11,7 @@
|
---|
| 167 | void UpdateElementsAndMaterialsControl(Elements* elements,Materials* materials, IoModel* iomodel){
|
---|
| 168 |
|
---|
| 169 | /*Intermediary*/
|
---|
| 170 | - int i;
|
---|
| 171 | - int counter;
|
---|
| 172 | + int control;
|
---|
| 173 | Element *element = NULL;
|
---|
| 174 | Material *material = NULL;
|
---|
| 175 | int num_control_type;
|
---|
| 176 | @@ -32,8 +31,8 @@
|
---|
| 177 |
|
---|
| 178 | iomodel->FetchData(5,InversionControlParametersEnum,InversionCostFunctionsEnum,InversionCostFunctionsCoefficientsEnum,InversionMinParametersEnum,InversionMaxParametersEnum);
|
---|
| 179 |
|
---|
| 180 | - for(i=0;i<num_control_type;i++){
|
---|
| 181 | - int control = reCast<int,IssmDouble>(iomodel->Data(InversionControlParametersEnum)[i]);
|
---|
| 182 | + for(int i=0;i<num_control_type;i++){
|
---|
| 183 | + control = reCast<int,IssmDouble>(iomodel->Data(InversionControlParametersEnum)[i]);
|
---|
| 184 | switch(control){
|
---|
| 185 | /*List of supported controls*/
|
---|
| 186 | case BalancethicknessThickeningRateEnum:
|
---|
| 187 | @@ -43,6 +42,7 @@
|
---|
| 188 | case FrictionCoefficientEnum:
|
---|
| 189 | case BalancethicknessNuxEnum:
|
---|
| 190 | case BalancethicknessNuyEnum:
|
---|
| 191 | + case BalancethicknessApparentMassbalanceEnum:
|
---|
| 192 | iomodel->FetchData(1,control);
|
---|
| 193 | break;
|
---|
| 194 |
|
---|
| 195 | @@ -55,8 +55,8 @@
|
---|
| 196 | }
|
---|
| 197 |
|
---|
| 198 | /*Update elements: */
|
---|
| 199 | - counter=0;
|
---|
| 200 | - for (i=0;i<iomodel->numberofelements;i++){
|
---|
| 201 | + int counter=0;
|
---|
| 202 | + for(int i=0;i<iomodel->numberofelements;i++){
|
---|
| 203 | if(iomodel->my_elements[i]){
|
---|
| 204 | element=(Element*)elements->GetObjectByOffset(counter);
|
---|
| 205 | element->InputUpdateFromIoModel(i,iomodel); //we need i to index into elements.
|
---|
| 206 | @@ -65,5 +65,15 @@
|
---|
| 207 | }
|
---|
| 208 |
|
---|
| 209 | /*Free data: */
|
---|
| 210 | - iomodel->DeleteData(5+7,InversionControlParametersEnum,InversionCostFunctionsCoefficientsEnum,InversionCostFunctionsEnum,InversionMinParametersEnum,InversionMaxParametersEnum,BalancethicknessThickeningRateEnum,VxEnum,VyEnum,ThicknessEnum,FrictionCoefficientEnum,MaterialsRheologyBEnum,DamageDEnum);
|
---|
| 211 | + for(int i=0;i<num_control_type;i++){
|
---|
| 212 | + control = reCast<int,IssmDouble>(iomodel->Data(InversionControlParametersEnum)[i]);
|
---|
| 213 | + switch(control){
|
---|
| 214 | + case MaterialsRheologyBbarEnum: iomodel->DeleteData(1,MaterialsRheologyBEnum); break;
|
---|
| 215 | + case DamageDbarEnum: iomodel->DeleteData(1,DamageDEnum); break;
|
---|
| 216 | + default: iomodel->DeleteData(1,control);
|
---|
| 217 | + }
|
---|
| 218 | + }
|
---|
| 219 | + iomodel->DeleteData(5,InversionControlParametersEnum,InversionCostFunctionsCoefficientsEnum,InversionCostFunctionsEnum,InversionMinParametersEnum,InversionMaxParametersEnum);
|
---|
| 220 | +
|
---|
| 221 | +
|
---|
| 222 | }
|
---|
| 223 | Index: ../trunk-jpl/src/c/cores/control_core.cpp
|
---|
| 224 | ===================================================================
|
---|
| 225 | --- ../trunk-jpl/src/c/cores/control_core.cpp (revision 18002)
|
---|
| 226 | +++ ../trunk-jpl/src/c/cores/control_core.cpp (revision 18003)
|
---|
| 227 | @@ -144,18 +144,23 @@
|
---|
| 228 | femmodel->parameters->FindParam(&solution_type,SolutionTypeEnum);
|
---|
| 229 |
|
---|
| 230 | /*set analysis type to compute velocity: */
|
---|
| 231 | - if (solution_type==SteadystateSolutionEnum || solution_type==StressbalanceSolutionEnum){
|
---|
| 232 | - femmodel->SetCurrentConfiguration(StressbalanceAnalysisEnum);
|
---|
| 233 | + switch(solution_type){
|
---|
| 234 | + case SteadystateSolutionEnum:
|
---|
| 235 | + case StressbalanceSolutionEnum:
|
---|
| 236 | + femmodel->SetCurrentConfiguration(StressbalanceAnalysisEnum);
|
---|
| 237 | + break;
|
---|
| 238 | + case BalancethicknessSolutionEnum:
|
---|
| 239 | + femmodel->SetCurrentConfiguration(BalancethicknessAnalysisEnum);
|
---|
| 240 | + break;
|
---|
| 241 | + case BalancethicknessSoftSolutionEnum:
|
---|
| 242 | + femmodel->SetCurrentConfiguration(BalancethicknessAnalysisEnum);
|
---|
| 243 | + break;
|
---|
| 244 | + case Balancethickness2SolutionEnum:
|
---|
| 245 | + femmodel->SetCurrentConfiguration(Balancethickness2AnalysisEnum);
|
---|
| 246 | + break;
|
---|
| 247 | + default:
|
---|
| 248 | + _error_("Solution " << EnumToStringx(solution_type) << " not implemented yet");
|
---|
| 249 | }
|
---|
| 250 | - else if (solution_type==BalancethicknessSolutionEnum){
|
---|
| 251 | - femmodel->SetCurrentConfiguration(BalancethicknessAnalysisEnum);
|
---|
| 252 | - }
|
---|
| 253 | - else if (solution_type==BalancethicknessSoftSolutionEnum){
|
---|
| 254 | - femmodel->SetCurrentConfiguration(BalancethicknessAnalysisEnum);
|
---|
| 255 | - }
|
---|
| 256 | - else{
|
---|
| 257 | - _error_("Solution " << EnumToStringx(solution_type) << " not implemented yet");
|
---|
| 258 | - }
|
---|
| 259 |
|
---|
| 260 | /*update parameter according to scalar: */ //false means: do not save control
|
---|
| 261 | InputControlUpdatex(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,search_scalar,false);
|
---|
| 262 | @@ -170,6 +175,9 @@
|
---|
| 263 | else if (solution_type==BalancethicknessSolutionEnum){
|
---|
| 264 | solutionsequence_linear(femmodel);
|
---|
| 265 | }
|
---|
| 266 | + else if (solution_type==Balancethickness2SolutionEnum){
|
---|
| 267 | + solutionsequence_linear(femmodel);
|
---|
| 268 | + }
|
---|
| 269 | else if (solution_type==BalancethicknessSoftSolutionEnum){
|
---|
| 270 | /*Don't do anything*/
|
---|
| 271 | }
|
---|
| 272 | Index: ../trunk-jpl/src/c/classes/FemModel.cpp
|
---|
| 273 | ===================================================================
|
---|
| 274 | --- ../trunk-jpl/src/c/classes/FemModel.cpp (revision 18002)
|
---|
| 275 | +++ ../trunk-jpl/src/c/classes/FemModel.cpp (revision 18003)
|
---|
| 276 | @@ -435,17 +435,17 @@
|
---|
| 277 | case IceVolumeEnum: this->IceVolumex(responses); break;
|
---|
| 278 | case IceVolumeAboveFloatationEnum: this->IceVolumeAboveFloatationx(responses); break;
|
---|
| 279 | case MinVelEnum: this->MinVelx(responses); break;
|
---|
| 280 | - case MaxVelEnum: this->MaxVelx( responses); break;
|
---|
| 281 | + case MaxVelEnum: this->MaxVelx(responses); break;
|
---|
| 282 | case MinVxEnum: this->MinVxx(responses); break;
|
---|
| 283 | - case MaxVxEnum: this->MaxVxx( responses); break;
|
---|
| 284 | - case MaxAbsVxEnum: this->MaxAbsVxx( responses); break;
|
---|
| 285 | + case MaxVxEnum: this->MaxVxx(responses); break;
|
---|
| 286 | + case MaxAbsVxEnum: this->MaxAbsVxx(responses); break;
|
---|
| 287 | case MinVyEnum: this->MinVyx(responses); break;
|
---|
| 288 | - case MaxVyEnum: this->MaxVyx( responses); break;
|
---|
| 289 | - case MaxAbsVyEnum: this->MaxAbsVyx( responses); break;
|
---|
| 290 | + case MaxVyEnum: this->MaxVyx(responses); break;
|
---|
| 291 | + case MaxAbsVyEnum: this->MaxAbsVyx(responses); break;
|
---|
| 292 | case MinVzEnum: this->MinVzx(responses); break;
|
---|
| 293 | - case MaxVzEnum: this->MaxVzx( responses); break;
|
---|
| 294 | - case MaxAbsVzEnum: this->MaxAbsVzx( responses); break;
|
---|
| 295 | - case MassFluxEnum: this->MassFluxx( responses); break;
|
---|
| 296 | + case MaxVzEnum: this->MaxVzx(responses); break;
|
---|
| 297 | + case MaxAbsVzEnum: this->MaxAbsVzx(responses); break;
|
---|
| 298 | + case MassFluxEnum: this->MassFluxx(responses); break;
|
---|
| 299 | case SurfaceAbsVelMisfitEnum: SurfaceAbsVelMisfitx(responses, elements,nodes, vertices, loads, materials,parameters); break;
|
---|
| 300 | case SurfaceRelVelMisfitEnum: SurfaceRelVelMisfitx(responses, elements,nodes, vertices, loads, materials,parameters); break;
|
---|
| 301 | case SurfaceLogVelMisfitEnum: SurfaceLogVelMisfitx(responses, elements,nodes, vertices, loads, materials,parameters); break;
|
---|
| 302 | @@ -458,6 +458,7 @@
|
---|
| 303 | case RheologyBbarAbsGradientEnum: RheologyBbarAbsGradientx(responses, elements,nodes, vertices, loads, materials, parameters); break;
|
---|
| 304 | case DragCoefficientAbsGradientEnum:DragCoefficientAbsGradientx(responses, elements,nodes, vertices, loads, materials, parameters); break;
|
---|
| 305 | case BalancethicknessMisfitEnum: BalancethicknessMisfitx(responses); break;
|
---|
| 306 | + case Balancethickness2MisfitEnum: Balancethickness2Misfitx(responses); break;
|
---|
| 307 | case TotalSmbEnum: this->TotalSmbx(responses); break;
|
---|
| 308 | case MaterialsRheologyBbarEnum: this->ElementResponsex(responses,MaterialsRheologyBbarEnum); break;
|
---|
| 309 | case VelEnum: this->ElementResponsex(responses,VelEnum); break;
|
---|
| 310 | @@ -1199,6 +1200,61 @@
|
---|
| 311 | *presponse=J;
|
---|
| 312 |
|
---|
| 313 | }/*}}}*/
|
---|
| 314 | +void FemModel::Balancethickness2Misfitx(IssmDouble* presponse){/*{{{*/
|
---|
| 315 | +
|
---|
| 316 | + /*output: */
|
---|
| 317 | + IssmDouble J=0.;
|
---|
| 318 | + IssmDouble J_sum;
|
---|
| 319 | +
|
---|
| 320 | + IssmDouble weight,thicknessobs,thickness;
|
---|
| 321 | + IssmDouble Jdet;
|
---|
| 322 | + IssmDouble* xyz_list = NULL;
|
---|
| 323 | +
|
---|
| 324 | + /*Compute Misfit: */
|
---|
| 325 | + for(int i=0;i<elements->Size();i++){
|
---|
| 326 | + Element* element=dynamic_cast<Element*>(elements->GetObjectByOffset(i));
|
---|
| 327 | +
|
---|
| 328 | + /*If on water, return 0: */
|
---|
| 329 | + if(!element->IsIceInElement()) continue;
|
---|
| 330 | +
|
---|
| 331 | + /* Get node coordinates*/
|
---|
| 332 | + element->GetVerticesCoordinates(&xyz_list);
|
---|
| 333 | + Input* weights_input =element->GetInput(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);
|
---|
| 334 | + Input* thickness_input =element->GetInput(ThicknessEnum); _assert_(thickness_input);
|
---|
| 335 | + Input* thicknessobs_input=element->GetInput(InversionThicknessObsEnum); _assert_(thicknessobs_input);
|
---|
| 336 | +
|
---|
| 337 | + /* Start looping on the number of gaussian points: */
|
---|
| 338 | + Gauss* gauss=element->NewGauss(2);
|
---|
| 339 | + for(int ig=gauss->begin();ig<gauss->end();ig++){
|
---|
| 340 | +
|
---|
| 341 | + gauss->GaussPoint(ig);
|
---|
| 342 | +
|
---|
| 343 | + /* Get Jacobian determinant: */
|
---|
| 344 | + element->JacobianDeterminant(&Jdet,xyz_list,gauss);
|
---|
| 345 | +
|
---|
| 346 | + /*Get all parameters at gaussian point*/
|
---|
| 347 | + weights_input->GetInputValue(&weight,gauss,Balancethickness2MisfitEnum);
|
---|
| 348 | + thickness_input->GetInputValue(&thickness,gauss);
|
---|
| 349 | + thicknessobs_input->GetInputValue(&thicknessobs,gauss);
|
---|
| 350 | + gauss->GaussPoint(ig);
|
---|
| 351 | +
|
---|
| 352 | + J +=0.5*(thickness*thickness - thicknessobs*thicknessobs)*weight*Jdet*gauss->weight;
|
---|
| 353 | + }
|
---|
| 354 | +
|
---|
| 355 | + /*clean up and Return: */
|
---|
| 356 | + xDelete<IssmDouble>(xyz_list);
|
---|
| 357 | + delete gauss;
|
---|
| 358 | + }
|
---|
| 359 | +
|
---|
| 360 | + /*Sum all J from all cpus of the cluster:*/
|
---|
| 361 | + ISSM_MPI_Reduce (&J,&J_sum,1,ISSM_MPI_DOUBLE,ISSM_MPI_SUM,0,IssmComm::GetComm() );
|
---|
| 362 | + ISSM_MPI_Bcast(&J_sum,1,ISSM_MPI_DOUBLE,0,IssmComm::GetComm());
|
---|
| 363 | + J=J_sum;
|
---|
| 364 | +
|
---|
| 365 | + /*Assign output pointers: */
|
---|
| 366 | + *presponse=J;
|
---|
| 367 | +
|
---|
| 368 | +}/*}}}*/
|
---|
| 369 | void FemModel::ThicknessAbsGradientx( IssmDouble* pJ){/*{{{*/
|
---|
| 370 |
|
---|
| 371 | /*output: */
|
---|
| 372 | Index: ../trunk-jpl/src/c/classes/Elements/Tria.cpp
|
---|
| 373 | ===================================================================
|
---|
| 374 | --- ../trunk-jpl/src/c/classes/Elements/Tria.cpp (revision 18002)
|
---|
| 375 | +++ ../trunk-jpl/src/c/classes/Elements/Tria.cpp (revision 18003)
|
---|
| 376 | @@ -990,6 +990,7 @@
|
---|
| 377 | switch(control){
|
---|
| 378 | /*yts conversion*/
|
---|
| 379 | case BalancethicknessThickeningRateEnum:
|
---|
| 380 | + case BalancethicknessApparentMassbalanceEnum:
|
---|
| 381 | case VxEnum:
|
---|
| 382 | case VyEnum:
|
---|
| 383 | if(iomodel->Data(control)){
|
---|
| 384 | @@ -2802,8 +2803,11 @@
|
---|
| 385 | case ThicknessEnum:
|
---|
| 386 | GradjThicknessBalancethicknessSoft(gradient,control_index);
|
---|
| 387 | break;
|
---|
| 388 | + case BalancethicknessApparentMassbalanceEnum:
|
---|
| 389 | + GradjAdotBulancethickness2(gradient,control_index);
|
---|
| 390 | + break;
|
---|
| 391 | default:
|
---|
| 392 | - _error_("control type not supported yet: " << control_type);
|
---|
| 393 | + _error_("control type not supported yet: " << EnumToStringx(control_type));
|
---|
| 394 | }
|
---|
| 395 |
|
---|
| 396 | /*Now deal with ∂J/∂alpha*/
|
---|
| 397 | @@ -2820,6 +2824,7 @@
|
---|
| 398 | case ThicknessAlongGradientEnum:
|
---|
| 399 | case ThicknessAcrossGradientEnum:
|
---|
| 400 | case BalancethicknessMisfitEnum:
|
---|
| 401 | + case Balancethickness2MisfitEnum:
|
---|
| 402 | case SurfaceAbsVelMisfitEnum:
|
---|
| 403 | case SurfaceRelVelMisfitEnum:
|
---|
| 404 | case SurfaceLogVelMisfitEnum:
|
---|
| 405 | @@ -3167,6 +3172,21 @@
|
---|
| 406 | gradient->SetValues(NUMVERTICES,vertexpidlist,gradient_g,INS_VAL);
|
---|
| 407 | }
|
---|
| 408 | /*}}}*/
|
---|
| 409 | +void Tria::GradjAdotBulancethickness2(Vector<IssmDouble>* gradient,int control_index){/*{{{*/
|
---|
| 410 | +
|
---|
| 411 | + /*Intermediaries*/
|
---|
| 412 | + int vertexpidlist[NUMVERTICES];
|
---|
| 413 | + IssmDouble lambda[NUMVERTICES];
|
---|
| 414 | + IssmDouble gradient_g[NUMVERTICES];
|
---|
| 415 | +
|
---|
| 416 | + /*Compute Gradient*/
|
---|
| 417 | + GradientIndexing(&vertexpidlist[0],control_index);
|
---|
| 418 | + GetInputListOnVertices(&lambda[0],AdjointEnum);
|
---|
| 419 | + for(int i=0;i<NUMVERTICES;i++) gradient_g[i]=lambda[i];
|
---|
| 420 | +
|
---|
| 421 | + gradient->SetValues(NUMVERTICES,vertexpidlist,gradient_g,INS_VAL);
|
---|
| 422 | +}
|
---|
| 423 | +/*}}}*/
|
---|
| 424 | void Tria::GradjVxBalancedthickness(Vector<IssmDouble>* gradient,int control_index){/*{{{*/
|
---|
| 425 |
|
---|
| 426 | /*Intermediaries*/
|
---|
| 427 | Index: ../trunk-jpl/src/c/classes/Elements/Tria.h
|
---|
| 428 | ===================================================================
|
---|
| 429 | --- ../trunk-jpl/src/c/classes/Elements/Tria.h (revision 18002)
|
---|
| 430 | +++ ../trunk-jpl/src/c/classes/Elements/Tria.h (revision 18003)
|
---|
| 431 | @@ -148,6 +148,7 @@
|
---|
| 432 | void GradjVxBalancedthickness(Vector<IssmDouble>* gradient,int control_index);
|
---|
| 433 | void GradjVyBalancedthickness(Vector<IssmDouble>* gradient,int control_index);
|
---|
| 434 | void GradjThicknessBalancethicknessSoft(Vector<IssmDouble>* gradient,int control_index);
|
---|
| 435 | + void GradjAdotBulancethickness2(Vector<IssmDouble>* gradient,int control_index);
|
---|
| 436 | void GetVectorFromControlInputs(Vector<IssmDouble>* gradient,int control_enum,int control_index,const char* data);
|
---|
| 437 | void SetControlInputsFromVector(IssmDouble* vector,int control_enum,int control_index);
|
---|
| 438 | void ControlInputGetGradient(Vector<IssmDouble>* gradient,int enum_type,int control_index);
|
---|
| 439 | Index: ../trunk-jpl/src/c/classes/FemModel.h
|
---|
| 440 | ===================================================================
|
---|
| 441 | --- ../trunk-jpl/src/c/classes/FemModel.h (revision 18002)
|
---|
| 442 | +++ ../trunk-jpl/src/c/classes/FemModel.h (revision 18003)
|
---|
| 443 | @@ -76,6 +76,7 @@
|
---|
| 444 | void IceVolumeAboveFloatationx(IssmDouble* pV);
|
---|
| 445 | void ElementResponsex(IssmDouble* presponse,int response_enum);
|
---|
| 446 | void BalancethicknessMisfitx(IssmDouble* pV);
|
---|
| 447 | + void Balancethickness2Misfitx(IssmDouble* pV);
|
---|
| 448 | #ifdef _HAVE_DAKOTA_
|
---|
| 449 | void DakotaResponsesx(double* d_responses,char** responses_descriptors,int numresponsedescriptors,int d_numresponses);
|
---|
| 450 | #endif
|
---|