Changeset 25836 for issm/trunk/src/c/analyses/AdjointHorizAnalysis.cpp
- Timestamp:
- 12/08/20 08:45:53 (4 years ago)
- Location:
- issm/trunk
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk
- Property svn:mergeinfo changed
-
issm/trunk/src
- Property svn:mergeinfo changed
-
issm/trunk/src/c
- Property svn:ignore
-
old new 23 23 issm_ocean 24 24 issm_dakota 25 issm_post
-
- Property svn:ignore
-
issm/trunk/src/c/analyses/AdjointHorizAnalysis.cpp
r24686 r25836 4 4 #include "../shared/shared.h" 5 5 #include "../modules/modules.h" 6 #include "../classes/Inputs 2/DatasetInput2.h"6 #include "../classes/Inputs/DatasetInput.h" 7 7 8 8 /*Model processing*/ … … 19 19 _error_("not implemented"); 20 20 }/*}}}*/ 21 void AdjointHorizAnalysis::UpdateElements(Elements* elements,Inputs 2* inputs2,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/21 void AdjointHorizAnalysis::UpdateElements(Elements* elements,Inputs* inputs,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/ 22 22 _error_("not implemented yet"); 23 23 }/*}}}*/ … … 87 87 /*Retrieve all inputs and parameters*/ 88 88 element->GetVerticesCoordinates(&xyz_list); 89 Input 2* vx_input = element->GetInput2(VxEnum);_assert_(vx_input);90 Input 2* vy_input = element->GetInput2(VyEnum);_assert_(vy_input);91 Input 2* vz_input = NULL;89 Input* vx_input = element->GetInput(VxEnum);_assert_(vx_input); 90 Input* vy_input = element->GetInput(VyEnum);_assert_(vy_input); 91 Input* vz_input = NULL; 92 92 if(dim==3){ 93 vz_input = element->GetInput 2(VzEnum);93 vz_input = element->GetInput(VzEnum); 94 94 } 95 95 else{ … … 102 102 /* Start looping on the number of gaussian points: */ 103 103 Gauss* gauss=element->NewGauss(5); 104 for(int ig=gauss->begin();ig<gauss->end();ig++){ 105 gauss->GaussPoint(ig); 104 while(gauss->next()){ 106 105 107 106 element->JacobianDeterminant(&Jdet,xyz_list,gauss); … … 171 170 /*Retrieve all inputs and parameters*/ 172 171 element->GetVerticesCoordinates(&xyz_list); 173 Input 2* vx_input = element->GetInput2(VxEnum); _assert_(vx_input);174 Input 2* vy_input = element->GetInput2(VyEnum); _assert_(vy_input);172 Input* vx_input = element->GetInput(VxEnum); _assert_(vx_input); 173 Input* vy_input = element->GetInput(VyEnum); _assert_(vy_input); 175 174 176 175 /*Allocate dbasis*/ … … 179 178 /* Start looping on the number of gaussian points: */ 180 179 Gauss* gauss=element->NewGauss(5); 181 for(int ig=gauss->begin();ig<gauss->end();ig++){ 182 gauss->GaussPoint(ig); 180 while(gauss->next()){ 183 181 184 182 element->JacobianDeterminant(&Jdet,xyz_list,gauss); … … 249 247 case Domain3DEnum: 250 248 if(!element->IsOnBase()) return NULL; 251 basalelement = element->SpawnBasalElement( );249 basalelement = element->SpawnBasalElement(true); 252 250 break; 253 251 default: _error_("mesh "<<EnumToStringx(domaintype)<<" not supported yet"); … … 276 274 /*Retrieve all inputs and parameters*/ 277 275 basalelement->GetVerticesCoordinates(&xyz_list); 278 Input 2* vx_input = basalelement->GetInput2(VxEnum); _assert_(vx_input);279 Input 2* vy_input = basalelement->GetInput2(VyEnum); _assert_(vy_input);280 Input 2* thickness_input = basalelement->GetInput2(ThicknessEnum); _assert_(thickness_input);276 Input* vx_input = basalelement->GetInput(VxEnum); _assert_(vx_input); 277 Input* vy_input = basalelement->GetInput(VyEnum); _assert_(vy_input); 278 Input* thickness_input = basalelement->GetInput(ThicknessEnum); _assert_(thickness_input); 281 279 282 280 /*Allocate dbasis*/ … … 285 283 /* Start looping on the number of gaussian points: */ 286 284 Gauss* gauss=basalelement->NewGauss(2); 287 for(int ig=gauss->begin();ig<gauss->end();ig++){ 288 gauss->GaussPoint(ig); 285 while(gauss->next()){ 289 286 290 287 basalelement->JacobianDeterminant(&Jdet,xyz_list,gauss); … … 375 372 element->FindParam(&num_responses,InversionNumCostFunctionsEnum); 376 373 element->FindParam(&responses,NULL,InversionCostFunctionsEnum); 377 DatasetInput 2* weights_input = element->GetDatasetInput2(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);378 Input 2* vx_input = element->GetInput2(VxEnum);_assert_(vx_input);379 Input 2* vxobs_input = element->GetInput2(InversionVxObsEnum);_assert_(vxobs_input);380 Input 2* vy_input = NULL;381 Input 2* vyobs_input = NULL;374 DatasetInput* weights_input = element->GetDatasetInput(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input); 375 Input* vx_input = element->GetInput(VxEnum); _assert_(vx_input); 376 Input* vxobs_input = element->GetInput(InversionVxObsEnum); _assert_(vxobs_input); 377 Input* vy_input = NULL; 378 Input* vyobs_input = NULL; 382 379 if(domaintype!=Domain2DverticalEnum){ 383 vy_input = element->GetInput 2(VyEnum);_assert_(vy_input);384 vyobs_input = element->GetInput 2(InversionVyObsEnum);_assert_(vyobs_input);380 vy_input = element->GetInput(VyEnum); _assert_(vy_input); 381 vyobs_input = element->GetInput(InversionVyObsEnum); _assert_(vyobs_input); 385 382 } 386 383 IssmDouble epsvel = 2.220446049250313e-16; … … 388 385 389 386 /*Get Surface if required by one response*/ 387 Input* S_input = NULL; 390 388 for(int resp=0;resp<num_responses;resp++){ 391 389 if(responses[resp]==SurfaceAverageVelMisfitEnum){ 392 element->GetInputValue(&S,SurfaceAreaEnum); break;390 S_input = element->GetInput(SurfaceAreaEnum); _assert_(S_input); break; 393 391 } 394 392 } … … 396 394 /* Start looping on the number of gaussian points: */ 397 395 Gauss* gauss=element->NewGaussTop(4); 398 for(int ig=gauss->begin();ig<gauss->end();ig++){ 399 gauss->GaussPoint(ig); 396 while(gauss->next()){ 400 397 401 398 element->JacobianDeterminantTop(&Jdet,xyz_list_top,gauss); … … 507 504 * du S 2 sqrt(...) obs 508 505 */ 506 S_input->GetInputValue(&S,gauss); 509 507 for(i=0;i<vnumnodes;i++){ 510 508 if (domaintype!=Domain2DverticalEnum){ … … 612 610 element->FindParam(&num_responses,InversionNumCostFunctionsEnum); 613 611 element->FindParam(&responses,NULL,InversionCostFunctionsEnum); 614 DatasetInput 2* weights_input = element->GetDatasetInput2(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);615 Input 2* vx_input = element->GetInput2(VxEnum); _assert_(vx_input);616 Input 2* vxobs_input = element->GetInput2(InversionVxObsEnum); _assert_(vxobs_input);617 Input 2* vy_input=NULL;618 Input 2* vyobs_input=NULL;612 DatasetInput* weights_input = element->GetDatasetInput(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input); 613 Input* vx_input = element->GetInput(VxEnum); _assert_(vx_input); 614 Input* vxobs_input = element->GetInput(InversionVxObsEnum); _assert_(vxobs_input); 615 Input* vy_input=NULL; 616 Input* vyobs_input=NULL; 619 617 if(domaintype!=Domain2DverticalEnum){ 620 vy_input = element->GetInput 2(VyEnum); _assert_(vy_input);621 vyobs_input = element->GetInput 2(InversionVyObsEnum); _assert_(vyobs_input);618 vy_input = element->GetInput(VyEnum); _assert_(vy_input); 619 vyobs_input = element->GetInput(InversionVyObsEnum); _assert_(vyobs_input); 622 620 } 623 621 IssmDouble epsvel = 2.220446049250313e-16; … … 625 623 626 624 /*Get Surface if required by one response*/ 625 Input* S_input = NULL; 627 626 for(int resp=0;resp<num_responses;resp++){ 628 627 if(responses[resp]==SurfaceAverageVelMisfitEnum){ 629 element->GetInputValue(&S,SurfaceAreaEnum); break;628 S_input = element->GetInput(SurfaceAreaEnum); _assert_(S_input); break; 630 629 } 631 630 } … … 633 632 /* Start looping on the number of gaussian points: */ 634 633 Gauss* gauss=element->NewGaussTop(4); 635 for(int ig=gauss->begin();ig<gauss->end();ig++){ 636 gauss->GaussPoint(ig); 634 while(gauss->next()){ 637 635 638 636 element->JacobianDeterminantTop(&Jdet,xyz_list_top,gauss); … … 742 740 * du S 2 sqrt(...) obs 743 741 */ 742 S_input->GetInputValue(&S,gauss); 744 743 for(i=0;i<numnodes;i++){ 745 744 if(domaintype!=Domain2DverticalEnum){ … … 839 838 case Domain3DEnum: 840 839 if(!element->IsOnBase()) return NULL; 841 basalelement = element->SpawnBasalElement( );840 basalelement = element->SpawnBasalElement(true); 842 841 break; 843 842 default: _error_("mesh "<<EnumToStringx(domaintype)<<" not supported yet"); … … 863 862 basalelement->FindParam(&num_responses,InversionNumCostFunctionsEnum); 864 863 basalelement->FindParam(&responses,NULL,InversionCostFunctionsEnum); 865 DatasetInput 2* weights_input = basalelement->GetDatasetInput2(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);866 Input 2* vx_input = basalelement->GetInput2(VxEnum); _assert_(vx_input);867 Input 2* vxobs_input = basalelement->GetInput2(InversionVxObsEnum); _assert_(vxobs_input);868 Input 2* vy_input=NULL;869 Input 2* vyobs_input=NULL;864 DatasetInput* weights_input = basalelement->GetDatasetInput(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input); 865 Input* vx_input = basalelement->GetInput(VxEnum); _assert_(vx_input); 866 Input* vxobs_input = basalelement->GetInput(InversionVxObsEnum); _assert_(vxobs_input); 867 Input* vy_input=NULL; 868 Input* vyobs_input=NULL; 870 869 if(domaintype!=Domain2DverticalEnum){ 871 vy_input = basalelement->GetInput 2(VyEnum); _assert_(vy_input);872 vyobs_input = basalelement->GetInput 2(InversionVyObsEnum); _assert_(vyobs_input);870 vy_input = basalelement->GetInput(VyEnum); _assert_(vy_input); 871 vyobs_input = basalelement->GetInput(InversionVyObsEnum); _assert_(vyobs_input); 873 872 } 874 873 IssmDouble epsvel = 2.220446049250313e-16; … … 876 875 877 876 /*Get Surface if required by one response*/ 877 Input* S_input = NULL; 878 878 for(int resp=0;resp<num_responses;resp++){ 879 879 if(responses[resp]==SurfaceAverageVelMisfitEnum){ 880 basalelement->GetInputValue(&S,SurfaceAreaEnum); break;880 S_input = element->GetInput(SurfaceAreaEnum); _assert_(S_input); break; 881 881 } 882 882 } … … 884 884 /* Start looping on the number of gaussian points: */ 885 885 Gauss* gauss=basalelement->NewGauss(4); 886 for(int ig=gauss->begin();ig<gauss->end();ig++){ 887 gauss->GaussPoint(ig); 886 while(gauss->next()){ 888 887 889 888 basalelement->JacobianDeterminant(&Jdet,xyz_list,gauss); … … 993 992 * du S 2 sqrt(...) obs 994 993 */ 994 S_input->GetInputValue(&S,gauss); 995 995 for(i=0;i<numnodes;i++){ 996 996 if(domaintype!=Domain2DverticalEnum){ … … 1072 1072 _error_("not implemented yet"); 1073 1073 }/*}}}*/ 1074 void AdjointHorizAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/1074 void AdjointHorizAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_interp,int control_index){/*{{{*/ 1075 1075 /*The gradient of the cost function is calculated in 2 parts. 1076 1076 * … … 1097 1097 if(control_type!=MaterialsRheologyBbarEnum && 1098 1098 control_type!=FrictionCoefficientEnum && 1099 control_type!=FrictionAsEnum && 1099 control_type!=FrictionCEnum && 1100 control_type!=FrictionAsEnum && 1100 1101 control_type!=DamageDbarEnum && 1101 1102 control_type!=MaterialsRheologyBEnum){ … … 1110 1111 case SurfaceLogVxVyMisfitEnum: /*Nothing, \partial J/\partial k = 0*/ break; 1111 1112 case SurfaceAverageVelMisfitEnum: /*Nothing, \partial J/\partial k = 0*/ break; 1112 case DragCoefficientAbsGradientEnum: GradientJDragGradient(element,gradient,control_index); break;1113 case RheologyBbarAbsGradientEnum: GradientJBbarGradient(element,gradient,control_index); break;1114 case RheologyBAbsGradientEnum: GradientJBGradient(element,gradient,control_index); break;1115 case RheologyBInitialguessMisfitEnum: GradientJBinitial(element,gradient,control_in dex);break;1113 case DragCoefficientAbsGradientEnum: GradientJDragGradient(element,gradient,control_interp,control_index); break; 1114 case RheologyBbarAbsGradientEnum: GradientJBbarGradient(element,gradient,control_interp,control_index); break; 1115 case RheologyBAbsGradientEnum: GradientJBGradient(element,gradient,control_interp,control_index); break; 1116 case RheologyBInitialguessMisfitEnum: GradientJBinitial(element,gradient,control_interp,control_index); break; 1116 1117 default: _error_("response " << EnumToStringx(responses[resp]) << " not supported yet"); 1117 1118 } … … 1120 1121 switch(control_type){ 1121 1122 case FrictionCoefficientEnum: 1123 case FrictionCEnum: 1122 1124 switch(approximation){ 1123 case SSAApproximationEnum: GradientJDragSSA(element,gradient,control_in dex); break;1124 case L1L2ApproximationEnum:GradientJDragL1L2(element,gradient,control_in dex); break;1125 case HOApproximationEnum: GradientJDragHO( element,gradient,control_in dex); break;1126 case FSApproximationEnum: GradientJDragFS( element,gradient,control_in dex); break;1125 case SSAApproximationEnum: GradientJDragSSA(element,gradient,control_interp,control_index); break; 1126 case L1L2ApproximationEnum:GradientJDragL1L2(element,gradient,control_interp,control_index); break; 1127 case HOApproximationEnum: GradientJDragHO( element,gradient,control_interp,control_index); break; 1128 case FSApproximationEnum: GradientJDragFS( element,gradient,control_interp,control_index); break; 1127 1129 case NoneApproximationEnum: /*Gradient is 0*/ break; 1128 1130 default: _error_("approximation " << EnumToStringx(approximation) << " not supported yet"); … … 1131 1133 case FrictionAsEnum: 1132 1134 switch(approximation){ 1133 case SSAApproximationEnum: GradientJDragHydroSSA(element,gradient,control_in dex); break;1134 case L1L2ApproximationEnum:GradientJDragHydroL1L2(element,gradient,control_in dex); break;1135 case HOApproximationEnum: GradientJDragHydroHO( element,gradient,control_in dex); break;1136 case FSApproximationEnum: GradientJDragHydroFS( element,gradient,control_in dex); break;1135 case SSAApproximationEnum: GradientJDragHydroSSA(element,gradient,control_interp,control_index); break; 1136 case L1L2ApproximationEnum:GradientJDragHydroL1L2(element,gradient,control_interp,control_index); break; 1137 case HOApproximationEnum: GradientJDragHydroHO( element,gradient,control_interp,control_index); break; 1138 case FSApproximationEnum: GradientJDragHydroFS( element,gradient,control_interp,control_index); break; 1137 1139 case NoneApproximationEnum: /*Gradient is 0*/ break; 1138 1140 default: _error_("approximation " << EnumToStringx(approximation) << " not supported yet"); … … 1141 1143 case MaterialsRheologyBbarEnum: 1142 1144 switch(approximation){ 1143 case SSAApproximationEnum: GradientJBbarSSA(element,gradient,control_in dex); break;1144 case L1L2ApproximationEnum:GradientJBbarL1L2(element,gradient,control_in dex); break;1145 case HOApproximationEnum: GradientJBbarHO( element,gradient,control_in dex); break;1146 case FSApproximationEnum: GradientJBbarFS( element,gradient,control_in dex); break;1145 case SSAApproximationEnum: GradientJBbarSSA(element,gradient,control_interp,control_index); break; 1146 case L1L2ApproximationEnum:GradientJBbarL1L2(element,gradient,control_interp,control_index); break; 1147 case HOApproximationEnum: GradientJBbarHO( element,gradient,control_interp,control_index); break; 1148 case FSApproximationEnum: GradientJBbarFS( element,gradient,control_interp,control_index); break; 1147 1149 case NoneApproximationEnum: /*Gradient is 0*/ break; 1148 1150 default: _error_("approximation " << EnumToStringx(approximation) << " not supported yet"); … … 1151 1153 case MaterialsRheologyBEnum: 1152 1154 switch(approximation){ 1153 case SSAApproximationEnum: GradientJBSSA(element,gradient,control_in dex); break;1154 case HOApproximationEnum: GradientJBHO( element,gradient,control_in dex); break;1155 case FSApproximationEnum: GradientJBFS( element,gradient,control_in dex); break;1155 case SSAApproximationEnum: GradientJBSSA(element,gradient,control_interp,control_index); break; 1156 case HOApproximationEnum: GradientJBHO( element,gradient,control_interp,control_index); break; 1157 case FSApproximationEnum: GradientJBFS( element,gradient,control_interp,control_index); break; 1156 1158 case NoneApproximationEnum: /*Gradient is 0*/ break; 1157 1159 default: _error_("approximation " << EnumToStringx(approximation) << " not supported yet"); … … 1160 1162 case DamageDbarEnum: 1161 1163 switch(approximation){ 1162 case SSAApproximationEnum: GradientJDSSA(element,gradient,control_in dex); break;1164 case SSAApproximationEnum: GradientJDSSA(element,gradient,control_interp,control_index); break; 1163 1165 case NoneApproximationEnum: /*Gradient is 0*/ break; 1164 1166 default: _error_("approximation " << EnumToStringx(approximation) << " not supported yet"); … … 1172 1174 1173 1175 }/*}}}*/ 1174 void AdjointHorizAnalysis::GradientJBbarFS(Element* element,Vector<IssmDouble>* gradient,int control_in dex){/*{{{*/1176 void AdjointHorizAnalysis::GradientJBbarFS(Element* element,Vector<IssmDouble>* gradient,int control_interp,int control_index){/*{{{*/ 1175 1177 /*WARNING: We use SSA as an estimate for now*/ 1176 this->GradientJBbarSSA(element,gradient,control_in dex);1177 }/*}}}*/ 1178 void AdjointHorizAnalysis::GradientJBbarGradient(Element* element,Vector<IssmDouble>* gradient,int control_in dex){/*{{{*/1178 this->GradientJBbarSSA(element,gradient,control_interp,control_index); 1179 }/*}}}*/ 1180 void AdjointHorizAnalysis::GradientJBbarGradient(Element* element,Vector<IssmDouble>* gradient,int control_interp,int control_index){/*{{{*/ 1179 1181 1180 1182 /*Intermediaries*/ … … 1194 1196 case Domain3DEnum: 1195 1197 if(!element->IsOnBase()) return; 1196 basalelement = element->SpawnBasalElement( );1198 basalelement = element->SpawnBasalElement(true); 1197 1199 break; 1198 1200 default: _error_("mesh "<<EnumToStringx(domaintype)<<" not supported yet"); … … 1215 1217 basalelement->GetVerticesCoordinates(&xyz_list); 1216 1218 basalelement->GradientIndexing(&vertexpidlist[0],control_index); 1217 Input 2* rheologyb_input = basalelement->GetInput2(MaterialsRheologyBbarEnum); _assert_(rheologyb_input);1218 DatasetInput 2* weights_input = basalelement->GetDatasetInput2(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);1219 Input* rheologyb_input = basalelement->GetInput(MaterialsRheologyBbarEnum); _assert_(rheologyb_input); 1220 DatasetInput* weights_input = basalelement->GetDatasetInput(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input); 1219 1221 1220 1222 /* Start looping on the number of gaussian points: */ 1221 1223 Gauss* gauss=basalelement->NewGauss(2); 1222 for(int ig=gauss->begin();ig<gauss->end();ig++){ 1223 gauss->GaussPoint(ig); 1224 while(gauss->next()){ 1224 1225 1225 1226 basalelement->JacobianDeterminant(&Jdet,xyz_list,gauss); … … 1251 1252 if(domaintype!=Domain2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;}; 1252 1253 }/*}}}*/ 1253 void AdjointHorizAnalysis::GradientJBbarL1L2(Element* element,Vector<IssmDouble>* gradient,int control_in dex){/*{{{*/1254 void AdjointHorizAnalysis::GradientJBbarL1L2(Element* element,Vector<IssmDouble>* gradient,int control_interp,int control_index){/*{{{*/ 1254 1255 1255 1256 /*Same as SSA*/ 1256 return this->GradientJBbarSSA(element,gradient,control_in dex);1257 }/*}}}*/ 1258 void AdjointHorizAnalysis::GradientJBbarHO(Element* element,Vector<IssmDouble>* gradient,int control_in dex){/*{{{*/1257 return this->GradientJBbarSSA(element,gradient,control_interp,control_index); 1258 }/*}}}*/ 1259 void AdjointHorizAnalysis::GradientJBbarHO(Element* element,Vector<IssmDouble>* gradient,int control_interp,int control_index){/*{{{*/ 1259 1260 1260 1261 /*WARNING: We use SSA as an estimate for now*/ 1261 this->GradientJBbarSSA(element,gradient,control_in dex);1262 }/*}}}*/ 1263 void AdjointHorizAnalysis::GradientJBbarSSA(Element* element,Vector<IssmDouble>* gradient,int control_in dex){/*{{{*/1262 this->GradientJBbarSSA(element,gradient,control_interp,control_index); 1263 }/*}}}*/ 1264 void AdjointHorizAnalysis::GradientJBbarSSA(Element* element,Vector<IssmDouble>* gradient,int control_interp,int control_index){/*{{{*/ 1264 1265 1265 1266 /*Intermediaries*/ … … 1281 1282 case Domain3DEnum: 1282 1283 if(!element->IsOnBase()) return; 1283 basalelement = element->SpawnBasalElement( );1284 basalelement = element->SpawnBasalElement(true); 1284 1285 dim = 2; 1285 1286 break; … … 1304 1305 basalelement->GetVerticesCoordinates(&xyz_list); 1305 1306 basalelement->GradientIndexing(&vertexpidlist[0],control_index); 1306 Input 2* thickness_input = basalelement->GetInput2(ThicknessEnum); _assert_(thickness_input);1307 Input 2* vx_input = basalelement->GetInput2(VxEnum); _assert_(vx_input);1308 Input 2* vy_input = basalelement->GetInput2(VyEnum); _assert_(vy_input);1309 Input 2* adjointx_input = basalelement->GetInput2(AdjointxEnum); _assert_(adjointx_input);1310 Input 2* adjointy_input = basalelement->GetInput2(AdjointyEnum); _assert_(adjointy_input);1311 Input 2* rheologyb_input = basalelement->GetInput2(MaterialsRheologyBbarEnum); _assert_(rheologyb_input);1307 Input* thickness_input = basalelement->GetInput(ThicknessEnum); _assert_(thickness_input); 1308 Input* vx_input = basalelement->GetInput(VxEnum); _assert_(vx_input); 1309 Input* vy_input = basalelement->GetInput(VyEnum); _assert_(vy_input); 1310 Input* adjointx_input = basalelement->GetInput(AdjointxEnum); _assert_(adjointx_input); 1311 Input* adjointy_input = basalelement->GetInput(AdjointyEnum); _assert_(adjointy_input); 1312 Input* rheologyb_input = basalelement->GetInput(MaterialsRheologyBbarEnum); _assert_(rheologyb_input); 1312 1313 1313 1314 /* Start looping on the number of gaussian points: */ 1314 1315 Gauss* gauss=basalelement->NewGauss(4); 1315 for(int ig=gauss->begin();ig<gauss->end();ig++){ 1316 gauss->GaussPoint(ig); 1316 while(gauss->next()){ 1317 1317 1318 1318 thickness_input->GetInputValue(&thickness,gauss); … … 1328 1328 1329 1329 /*Build gradient vector (actually -dJ/dB): */ 1330 for(int i=0;i<numvertices;i++){ 1331 ge[i]+=-dmudB*thickness*( 1330 if(control_interp==P1Enum){ 1331 for(int i=0;i<numvertices;i++){ 1332 ge[i]+=-dmudB*thickness*( 1333 (2*dvx[0]+dvy[1])*2*dadjx[0]+(dvx[1]+dvy[0])*(dadjx[1]+dadjy[0])+(2*dvy[1]+dvx[0])*2*dadjy[1] 1334 )*Jdet*gauss->weight*basis[i]; 1335 _assert_(!xIsNan<IssmDouble>(ge[i])); 1336 } 1337 } 1338 else if(control_interp==P0Enum){ 1339 ge[0]+=-dmudB*thickness*( 1332 1340 (2*dvx[0]+dvy[1])*2*dadjx[0]+(dvx[1]+dvy[0])*(dadjx[1]+dadjy[0])+(2*dvy[1]+dvx[0])*2*dadjy[1] 1333 )*Jdet*gauss->weight*basis[i]; 1334 _assert_(!xIsNan<IssmDouble>(ge[i])); 1335 } 1336 } 1337 gradient->SetValues(numvertices,vertexpidlist,ge,ADD_VAL); 1341 )*Jdet*gauss->weight; 1342 _assert_(!xIsNan<IssmDouble>(ge[0])); 1343 } 1344 else{ 1345 _error_("not supported"); 1346 } 1347 } 1348 if(control_interp==P1Enum){ 1349 gradient->SetValues(numvertices,vertexpidlist,ge,ADD_VAL); 1350 } 1351 else if(control_interp==P0Enum){ 1352 gradient->SetValue(vertexpidlist[0],ge[0],ADD_VAL); 1353 } 1354 else{ 1355 _error_("not supported"); 1356 } 1338 1357 1339 1358 /*Clean up and return*/ … … 1345 1364 if(domaintype!=Domain2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;}; 1346 1365 }/*}}}*/ 1347 void AdjointHorizAnalysis::GradientJBFS(Element* element,Vector<IssmDouble>* gradient,int control_in dex){/*{{{*/1366 void AdjointHorizAnalysis::GradientJBFS(Element* element,Vector<IssmDouble>* gradient,int control_interp,int control_index){/*{{{*/ 1348 1367 /*WARNING: We use HO as an estimate for now*/ 1349 this->GradientJBHO(element,gradient,control_in dex);1350 }/*}}}*/ 1351 void AdjointHorizAnalysis::GradientJBGradient(Element* element,Vector<IssmDouble>* gradient,int control_in dex){/*{{{*/1368 this->GradientJBHO(element,gradient,control_interp,control_index); 1369 }/*}}}*/ 1370 void AdjointHorizAnalysis::GradientJBGradient(Element* element,Vector<IssmDouble>* gradient,int control_interp,int control_index){/*{{{*/ 1352 1371 1353 1372 /*Intermediaries*/ … … 1382 1401 element->GetVerticesCoordinates(&xyz_list); 1383 1402 element->GradientIndexing(&vertexpidlist[0],control_index); 1384 Input 2* rheology_input = element->GetInput2(MaterialsRheologyBEnum); _assert_(rheology_input);1385 DatasetInput 2* weights_input = element->GetDatasetInput2(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);1403 Input* rheology_input = element->GetInput(MaterialsRheologyBEnum); _assert_(rheology_input); 1404 DatasetInput* weights_input = element->GetDatasetInput(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input); 1386 1405 /* Start looping on the number of gaussian points: */ 1387 1406 Gauss* gauss=element->NewGauss(2); 1388 for(int ig=gauss->begin();ig<gauss->end();ig++){ 1389 gauss->GaussPoint(ig); 1407 while(gauss->next()){ 1390 1408 element->JacobianDeterminant(&Jdet,xyz_list,gauss); 1391 1409 element->NodalFunctionsP1Derivatives(dbasis,xyz_list,gauss); … … 1415 1433 delete gauss; 1416 1434 }/*}}}*/ 1417 void AdjointHorizAnalysis::GradientJBinitial(Element* element,Vector<IssmDouble>* gradient,int control_in dex){/*{{{*/1435 void AdjointHorizAnalysis::GradientJBinitial(Element* element,Vector<IssmDouble>* gradient,int control_interp,int control_index){/*{{{*/ 1418 1436 1419 1437 /*Intermediaries*/ … … 1448 1466 element->GetVerticesCoordinates(&xyz_list); 1449 1467 element->GradientIndexing(&vertexpidlist[0],control_index); 1450 Input 2* rheology_input = element->GetInput2(MaterialsRheologyBbarEnum); _assert_(rheology_input);1451 Input 2* rheology0_input = element->GetInput2(RheologyBInitialguessEnum); _assert_(rheology0_input);1452 DatasetInput 2* weights_input = element->GetDatasetInput2(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);1468 Input* rheology_input = element->GetInput(MaterialsRheologyBbarEnum); _assert_(rheology_input); 1469 Input* rheology0_input = element->GetInput(RheologyBInitialguessEnum); _assert_(rheology0_input); 1470 DatasetInput* weights_input = element->GetDatasetInput(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input); 1453 1471 1454 1472 /* Start looping on the number of gaussian points: */ 1455 1473 Gauss* gauss=element->NewGauss(2); 1456 for(int ig=gauss->begin();ig<gauss->end();ig++){ 1457 gauss->GaussPoint(ig); 1474 while(gauss->next()){ 1458 1475 element->JacobianDeterminant(&Jdet,xyz_list,gauss); 1459 1476 element->NodalFunctionsP1(basis,gauss); … … 1479 1496 delete gauss; 1480 1497 }/*}}}*/ 1481 void AdjointHorizAnalysis::GradientJBHO(Element* element,Vector<IssmDouble>* gradient,int control_in dex){/*{{{*/1498 void AdjointHorizAnalysis::GradientJBHO(Element* element,Vector<IssmDouble>* gradient,int control_interp,int control_index){/*{{{*/ 1482 1499 /*Intermediaries*/ 1483 1500 int domaintype,dim; … … 1503 1520 element->GetVerticesCoordinates(&xyz_list); 1504 1521 element->GradientIndexing(&vertexpidlist[0],control_index); 1505 Input 2* thickness_input = element->GetInput2(ThicknessEnum); _assert_(thickness_input);1506 Input 2* vx_input = element->GetInput2(VxEnum); _assert_(vx_input);1507 Input 2* vy_input = NULL;1508 Input 2* adjointx_input = element->GetInput2(AdjointxEnum); _assert_(adjointx_input);1509 Input 2* adjointy_input = NULL;1510 Input 2* rheologyb_input = element->GetInput2(MaterialsRheologyBEnum); _assert_(rheologyb_input);1522 Input* thickness_input = element->GetInput(ThicknessEnum); _assert_(thickness_input); 1523 Input* vx_input = element->GetInput(VxEnum); _assert_(vx_input); 1524 Input* vy_input = NULL; 1525 Input* adjointx_input = element->GetInput(AdjointxEnum); _assert_(adjointx_input); 1526 Input* adjointy_input = NULL; 1527 Input* rheologyb_input = element->GetInput(MaterialsRheologyBEnum); _assert_(rheologyb_input); 1511 1528 if(domaintype!=Domain2DverticalEnum){ 1512 vy_input = element->GetInput 2(VyEnum); _assert_(vy_input);1513 adjointy_input = element->GetInput 2(AdjointyEnum); _assert_(adjointy_input);1529 vy_input = element->GetInput(VyEnum); _assert_(vy_input); 1530 adjointy_input = element->GetInput(AdjointyEnum); _assert_(adjointy_input); 1514 1531 } 1515 1532 /* Start looping on the number of gaussian points: */ 1516 1533 Gauss* gauss=element->NewGauss(4); 1517 for(int ig=gauss->begin();ig<gauss->end();ig++){ 1518 gauss->GaussPoint(ig); 1534 while(gauss->next()){ 1519 1535 1520 1536 thickness_input->GetInputValue(&thickness,gauss); … … 1555 1571 delete gauss; 1556 1572 }/*}}}*/ 1557 void AdjointHorizAnalysis::GradientJBSSA(Element* element,Vector<IssmDouble>* gradient,int control_in dex){/*{{{*/1573 void AdjointHorizAnalysis::GradientJBSSA(Element* element,Vector<IssmDouble>* gradient,int control_interp,int control_index){/*{{{*/ 1558 1574 1559 1575 /*Intermediaries*/ … … 1598 1614 basalelement->GetVerticesCoordinates(&xyz_list); 1599 1615 basalelement->GradientIndexing(&vertexpidlist[0],control_index); 1600 Input 2* thickness_input = basalelement->GetInput2(ThicknessEnum); _assert_(thickness_input);1601 Input 2* vx_input = basalelement->GetInput2(VxEnum); _assert_(vx_input);1602 Input 2* vy_input = basalelement->GetInput2(VyEnum); _assert_(vy_input);1603 Input 2* adjointx_input = basalelement->GetInput2(AdjointxEnum); _assert_(adjointx_input);1604 Input 2* adjointy_input = basalelement->GetInput2(AdjointyEnum); _assert_(adjointy_input);1605 Input 2* rheologyb_input = basalelement->GetInput2(MaterialsRheologyBEnum); _assert_(rheologyb_input);1616 Input* thickness_input = basalelement->GetInput(ThicknessEnum); _assert_(thickness_input); 1617 Input* vx_input = basalelement->GetInput(VxEnum); _assert_(vx_input); 1618 Input* vy_input = basalelement->GetInput(VyEnum); _assert_(vy_input); 1619 Input* adjointx_input = basalelement->GetInput(AdjointxEnum); _assert_(adjointx_input); 1620 Input* adjointy_input = basalelement->GetInput(AdjointyEnum); _assert_(adjointy_input); 1621 Input* rheologyb_input = basalelement->GetInput(MaterialsRheologyBEnum); _assert_(rheologyb_input); 1606 1622 1607 1623 /* Start looping on the number of gaussian points: */ 1608 1624 Gauss* gauss=basalelement->NewGauss(4); 1609 for(int ig=gauss->begin();ig<gauss->end();ig++){ 1610 gauss->GaussPoint(ig); 1625 while(gauss->next()){ 1611 1626 1612 1627 thickness_input->GetInputValue(&thickness,gauss); … … 1639 1654 if(domaintype!=Domain2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;}; 1640 1655 }/*}}}*/ 1641 void AdjointHorizAnalysis::GradientJDragGradient(Element* element,Vector<IssmDouble>* gradient,int control_in dex){/*{{{*/1656 void AdjointHorizAnalysis::GradientJDragGradient(Element* element,Vector<IssmDouble>* gradient,int control_interp,int control_index){/*{{{*/ 1642 1657 1643 1658 /*return if floating (gradient is 0)*/ … … 1646 1661 /*Intermediaries*/ 1647 1662 int domaintype,dim; 1663 int frictionlaw; 1648 1664 Element* basalelement; 1649 1665 … … 1684 1700 basalelement->GetVerticesCoordinates(&xyz_list); 1685 1701 basalelement->GradientIndexing(&vertexpidlist[0],control_index); 1686 Input2* dragcoefficient_input = basalelement->GetInput2(FrictionCoefficientEnum); _assert_(dragcoefficient_input); 1687 DatasetInput2* weights_input = basalelement->GetDatasetInput2(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input); 1702 1703 /* get the friction law: if 2-Weertman, 11-Schoof, use a special name for the coefficient*/ 1704 element->FindParam(&frictionlaw, FrictionLawEnum); 1705 Input* dragcoefficient_input; 1706 switch(frictionlaw) { 1707 case 2: 1708 case 11: 1709 dragcoefficient_input = basalelement->GetInput(FrictionCEnum); _assert_(dragcoefficient_input); 1710 break; 1711 default: 1712 dragcoefficient_input = basalelement->GetInput(FrictionCoefficientEnum); _assert_(dragcoefficient_input); 1713 } 1714 1715 DatasetInput* weights_input = basalelement->GetDatasetInput(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input); 1688 1716 1689 1717 /* Start looping on the number of gaussian points: */ 1690 1718 Gauss* gauss=basalelement->NewGauss(2); 1691 for(int ig=gauss->begin();ig<gauss->end();ig++){ 1692 gauss->GaussPoint(ig); 1719 while(gauss->next()){ 1693 1720 1694 1721 basalelement->JacobianDeterminant(&Jdet,xyz_list,gauss); … … 1721 1748 1722 1749 }/*}}}*/ 1723 void AdjointHorizAnalysis::GradientJDragFS(Element* element,Vector<IssmDouble>* gradient,int control_in dex){/*{{{*/1750 void AdjointHorizAnalysis::GradientJDragFS(Element* element,Vector<IssmDouble>* gradient,int control_interp,int control_index){/*{{{*/ 1724 1751 1725 1752 /*return if floating or not on bed (gradient is 0)*/ … … 1753 1780 element->GetVerticesCoordinatesBase(&xyz_list_base); 1754 1781 element->GradientIndexing(&vertexpidlist[0],control_index); 1755 Input 2* vx_input = element->GetInput2(VxEnum); _assert_(vx_input);1756 Input 2* vy_input = element->GetInput2(VyEnum); _assert_(vy_input);1757 Input 2* adjointx_input = element->GetInput2(AdjointxEnum); _assert_(adjointx_input);1758 Input 2* adjointy_input = element->GetInput2(AdjointyEnum); _assert_(adjointy_input);1759 Input 2* vz_input = NULL;1760 Input 2* adjointz_input = NULL;1782 Input* vx_input = element->GetInput(VxEnum); _assert_(vx_input); 1783 Input* vy_input = element->GetInput(VyEnum); _assert_(vy_input); 1784 Input* adjointx_input = element->GetInput(AdjointxEnum); _assert_(adjointx_input); 1785 Input* adjointy_input = element->GetInput(AdjointyEnum); _assert_(adjointy_input); 1786 Input* vz_input = NULL; 1787 Input* adjointz_input = NULL; 1761 1788 if(domaintype!=Domain2DverticalEnum){ 1762 vz_input = element->GetInput 2(VzEnum); _assert_(vy_input);1763 adjointz_input = element->GetInput 2(AdjointzEnum); _assert_(adjointz_input);1764 } 1765 Input 2* dragcoeff_input = element->GetInput2(FrictionCoefficientEnum); _assert_(dragcoeff_input);1789 vz_input = element->GetInput(VzEnum); _assert_(vy_input); 1790 adjointz_input = element->GetInput(AdjointzEnum); _assert_(adjointz_input); 1791 } 1792 Input* dragcoeff_input = element->GetInput(FrictionCoefficientEnum); _assert_(dragcoeff_input); 1766 1793 1767 1794 /* Start looping on the number of gaussian points: */ 1768 1795 Gauss* gauss=element->NewGaussBase(4); 1769 for(int ig=gauss->begin();ig<gauss->end();ig++){ 1770 gauss->GaussPoint(ig); 1796 while(gauss->next()){ 1771 1797 1772 1798 adjointx_input->GetInputValue(&lambda, gauss); … … 1817 1843 delete friction; 1818 1844 }/*}}}*/ 1819 void AdjointHorizAnalysis::GradientJDragL1L2(Element* element,Vector<IssmDouble>* gradient,int control_in dex){/*{{{*/1845 void AdjointHorizAnalysis::GradientJDragL1L2(Element* element,Vector<IssmDouble>* gradient,int control_interp,int control_index){/*{{{*/ 1820 1846 1821 1847 /*Same as SSA*/ 1822 return this->GradientJDragSSA(element,gradient,control_in dex);1823 }/*}}}*/ 1824 void AdjointHorizAnalysis::GradientJDragHO(Element* element,Vector<IssmDouble>* gradient,int control_in dex){/*{{{*/1848 return this->GradientJDragSSA(element,gradient,control_interp,control_index); 1849 }/*}}}*/ 1850 void AdjointHorizAnalysis::GradientJDragHO(Element* element,Vector<IssmDouble>* gradient,int control_interp,int control_index){/*{{{*/ 1825 1851 1826 1852 /*return if floating or not on bed (gradient is 0)*/ … … 1852 1878 element->GetVerticesCoordinatesBase(&xyz_list_base); 1853 1879 element->GradientIndexing(&vertexpidlist[0],control_index); 1854 Input 2* vx_input = element->GetInput2(VxEnum); _assert_(vx_input);1855 Input 2* vy_input = NULL;1856 Input 2* adjointx_input = element->GetInput2(AdjointxEnum); _assert_(adjointx_input);1857 Input 2* adjointy_input = NULL;1858 Input 2* dragcoeff_input = element->GetInput2(FrictionCoefficientEnum); _assert_(dragcoeff_input);1880 Input* vx_input = element->GetInput(VxEnum); _assert_(vx_input); 1881 Input* vy_input = NULL; 1882 Input* adjointx_input = element->GetInput(AdjointxEnum); _assert_(adjointx_input); 1883 Input* adjointy_input = NULL; 1884 Input* dragcoeff_input = element->GetInput(FrictionCoefficientEnum); _assert_(dragcoeff_input); 1859 1885 if(domaintype!=Domain2DverticalEnum){ 1860 vy_input = element->GetInput 2(VyEnum); _assert_(vy_input);1861 adjointy_input = element->GetInput 2(AdjointyEnum); _assert_(adjointy_input);1886 vy_input = element->GetInput(VyEnum); _assert_(vy_input); 1887 adjointy_input = element->GetInput(AdjointyEnum); _assert_(adjointy_input); 1862 1888 } 1863 1889 /* Start looping on the number of gaussian points: */ 1864 1890 Gauss* gauss=element->NewGaussBase(4); 1865 for(int ig=gauss->begin();ig<gauss->end();ig++){ 1866 gauss->GaussPoint(ig); 1891 while(gauss->next()){ 1867 1892 1868 1893 adjointx_input->GetInputValue(&lambda, gauss); … … 1896 1921 delete friction; 1897 1922 }/*}}}*/ 1898 void AdjointHorizAnalysis::GradientJDragSSA(Element* element,Vector<IssmDouble>* gradient,int control_in dex){/*{{{*/1923 void AdjointHorizAnalysis::GradientJDragSSA(Element* element,Vector<IssmDouble>* gradient,int control_interp,int control_index){/*{{{*/ 1899 1924 1900 1925 /*return if floating (gradient is 0)*/ … … 1933 1958 /*Fetch number of vertices for this finite element*/ 1934 1959 int numvertices = basalelement->GetNumberOfVertices(); 1960 int frictionlaw; 1935 1961 1936 1962 /*Initialize some vectors*/ … … 1945 1971 basalelement->GetVerticesCoordinates(&xyz_list); 1946 1972 basalelement->GradientIndexing(&vertexpidlist[0],control_index); 1947 Input2* vx_input = basalelement->GetInput2(VxEnum); _assert_(vx_input); 1948 Input2* vy_input = basalelement->GetInput2(VyEnum); _assert_(vy_input); 1949 Input2* adjointx_input = basalelement->GetInput2(AdjointxEnum); _assert_(adjointx_input); 1950 Input2* adjointy_input = basalelement->GetInput2(AdjointyEnum); _assert_(adjointy_input); 1951 Input2* dragcoeff_input = basalelement->GetInput2(FrictionCoefficientEnum); _assert_(dragcoeff_input); 1973 Input* vx_input = basalelement->GetInput(VxEnum); _assert_(vx_input); 1974 Input* vy_input = basalelement->GetInput(VyEnum); _assert_(vy_input); 1975 Input* adjointx_input = basalelement->GetInput(AdjointxEnum); _assert_(adjointx_input); 1976 Input* adjointy_input = basalelement->GetInput(AdjointyEnum); _assert_(adjointy_input); 1977 1978 /* get the friction law: 1- Budd, 11-Schoof*/ 1979 element->FindParam(&frictionlaw, FrictionLawEnum); 1980 Input* dragcoeff_input; 1981 switch(frictionlaw) { 1982 case 1: 1983 dragcoeff_input = basalelement->GetInput(FrictionCoefficientEnum); _assert_(dragcoeff_input); 1984 break; 1985 case 2: 1986 case 11: 1987 dragcoeff_input = basalelement->GetInput(FrictionCEnum); _assert_(dragcoeff_input); 1988 break; 1989 default: 1990 _error_("Friction law "<< frictionlaw <<" not supported in the inversion."); 1991 } 1952 1992 1953 1993 /* Start looping on the number of gaussian points: */ 1954 1994 Gauss* gauss=basalelement->NewGauss(4); 1955 for(int ig=gauss->begin();ig<gauss->end();ig++){ 1956 gauss->GaussPoint(ig); 1995 while(gauss->next()){ 1957 1996 1958 1997 adjointx_input->GetInputValue(&lambda, gauss); … … 1984 2023 if(domaintype!=Domain2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;}; 1985 2024 }/*}}}*/ 1986 1987 void AdjointHorizAnalysis::GradientJDragHydroFS(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/ 2025 void AdjointHorizAnalysis::GradientJDragHydroFS(Element* element,Vector<IssmDouble>* gradient,int control_interp,int control_index){/*{{{*/ 1988 2026 1989 2027 /*return if floating or not on bed (gradient is 0)*/ … … 2017 2055 element->GetVerticesCoordinatesBase(&xyz_list_base); 2018 2056 element->GradientIndexing(&vertexpidlist[0],control_index); 2019 Input 2* vx_input = element->GetInput2(VxEnum); _assert_(vx_input);2020 Input 2* vy_input = element->GetInput2(VyEnum); _assert_(vy_input);2021 Input 2* adjointx_input = element->GetInput2(AdjointxEnum); _assert_(adjointx_input);2022 Input 2* adjointy_input = element->GetInput2(AdjointyEnum); _assert_(adjointy_input);2023 Input 2* vz_input = NULL;2024 Input 2* adjointz_input = NULL;2057 Input* vx_input = element->GetInput(VxEnum); _assert_(vx_input); 2058 Input* vy_input = element->GetInput(VyEnum); _assert_(vy_input); 2059 Input* adjointx_input = element->GetInput(AdjointxEnum); _assert_(adjointx_input); 2060 Input* adjointy_input = element->GetInput(AdjointyEnum); _assert_(adjointy_input); 2061 Input* vz_input = NULL; 2062 Input* adjointz_input = NULL; 2025 2063 if(domaintype!=Domain2DverticalEnum){ 2026 vz_input = element->GetInput 2(VzEnum); _assert_(vy_input);2027 adjointz_input = element->GetInput 2(AdjointzEnum); _assert_(adjointz_input);2064 vz_input = element->GetInput(VzEnum); _assert_(vy_input); 2065 adjointz_input = element->GetInput(AdjointzEnum); _assert_(adjointz_input); 2028 2066 } 2029 2067 2030 2068 /* Start looping on the number of gaussian points: */ 2031 2069 Gauss* gauss=element->NewGaussBase(4); 2032 for(int ig=gauss->begin();ig<gauss->end();ig++){ 2033 gauss->GaussPoint(ig); 2070 while(gauss->next()){ 2034 2071 2035 2072 adjointx_input->GetInputValue(&lambda, gauss); … … 2079 2116 delete friction; 2080 2117 }/*}}}*/ 2081 void AdjointHorizAnalysis::GradientJDragHydroL1L2(Element* element,Vector<IssmDouble>* gradient,int control_in dex){/*{{{*/2118 void AdjointHorizAnalysis::GradientJDragHydroL1L2(Element* element,Vector<IssmDouble>* gradient,int control_interp,int control_index){/*{{{*/ 2082 2119 2083 2120 /*Same as SSA*/ 2084 return this->GradientJDragSSA(element,gradient,control_in dex);2085 }/*}}}*/ 2086 void AdjointHorizAnalysis::GradientJDragHydroHO(Element* element,Vector<IssmDouble>* gradient,int control_in dex){/*{{{*/2121 return this->GradientJDragSSA(element,gradient,control_interp,control_index); 2122 }/*}}}*/ 2123 void AdjointHorizAnalysis::GradientJDragHydroHO(Element* element,Vector<IssmDouble>* gradient,int control_interp,int control_index){/*{{{*/ 2087 2124 2088 2125 /*return if floating or not on bed (gradient is 0)*/ … … 2114 2151 element->GetVerticesCoordinatesBase(&xyz_list_base); 2115 2152 element->GradientIndexing(&vertexpidlist[0],control_index); 2116 Input 2* vx_input = element->GetInput2(VxEnum); _assert_(vx_input);2117 Input 2* vy_input = NULL;2118 Input 2* adjointx_input = element->GetInput2(AdjointxEnum); _assert_(adjointx_input);2119 Input 2* adjointy_input = NULL;2153 Input* vx_input = element->GetInput(VxEnum); _assert_(vx_input); 2154 Input* vy_input = NULL; 2155 Input* adjointx_input = element->GetInput(AdjointxEnum); _assert_(adjointx_input); 2156 Input* adjointy_input = NULL; 2120 2157 if(domaintype!=Domain2DverticalEnum){ 2121 vy_input = element->GetInput 2(VyEnum); _assert_(vy_input);2122 adjointy_input = element->GetInput 2(AdjointyEnum); _assert_(adjointy_input);2158 vy_input = element->GetInput(VyEnum); _assert_(vy_input); 2159 adjointy_input = element->GetInput(AdjointyEnum); _assert_(adjointy_input); 2123 2160 } 2124 2161 /* Start looping on the number of gaussian points: */ 2125 2162 Gauss* gauss=element->NewGaussBase(4); 2126 for(int ig=gauss->begin();ig<gauss->end();ig++){ 2127 gauss->GaussPoint(ig); 2163 while(gauss->next()){ 2128 2164 2129 2165 adjointx_input->GetInputValue(&lambda, gauss); … … 2156 2192 delete friction; 2157 2193 }/*}}}*/ 2158 2159 void AdjointHorizAnalysis::GradientJDragHydroSSA(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/ 2194 void AdjointHorizAnalysis::GradientJDragHydroSSA(Element* element,Vector<IssmDouble>* gradient,int control_interp,int control_index){/*{{{*/ 2160 2195 2161 2196 /*return if floating (gradient is 0)*/ … … 2207 2242 basalelement->GetVerticesCoordinates(&xyz_list); 2208 2243 basalelement->GradientIndexing(&vertexpidlist[0],control_index); 2209 Input 2* vx_input = basalelement->GetInput2(VxEnum); _assert_(vx_input);2210 Input 2* vy_input = basalelement->GetInput2(VyEnum); _assert_(vy_input);2211 Input 2* adjointx_input = basalelement->GetInput2(AdjointxEnum); _assert_(adjointx_input);2212 Input 2* adjointy_input = basalelement->GetInput2(AdjointyEnum); _assert_(adjointy_input);2244 Input* vx_input = basalelement->GetInput(VxEnum); _assert_(vx_input); 2245 Input* vy_input = basalelement->GetInput(VyEnum); _assert_(vy_input); 2246 Input* adjointx_input = basalelement->GetInput(AdjointxEnum); _assert_(adjointx_input); 2247 Input* adjointy_input = basalelement->GetInput(AdjointyEnum); _assert_(adjointy_input); 2213 2248 2214 2249 IssmDouble q_exp; … … 2223 2258 2224 2259 /*Recover parameters: */ 2225 Input 2* qinput = basalelement->GetInput2(FrictionQEnum);2226 Input 2* cinput = basalelement->GetInput2(FrictionCEnum);2227 Input 2* Asinput = basalelement->GetInput2(FrictionAsEnum);2228 Input 2* nInput =basalelement->GetInput2(MaterialsRheologyNEnum);2229 Input 2* Ninput = basalelement->GetInput2(FrictionEffectivePressureEnum);2260 Input* qinput = basalelement->GetInput(FrictionQEnum); 2261 Input* cinput = basalelement->GetInput(FrictionCEnum); 2262 Input* Asinput = basalelement->GetInput(FrictionAsEnum); 2263 Input* nInput =basalelement->GetInput(MaterialsRheologyNEnum); 2264 Input* Ninput = basalelement->GetInput(FrictionEffectivePressureEnum); 2230 2265 /* Start looping on the number of gaussian points: */ 2231 2266 Gauss* gauss=basalelement->NewGauss(4); 2232 for(int ig=gauss->begin();ig<gauss->end();ig++){ 2233 gauss->GaussPoint(ig); 2267 while(gauss->next()){ 2234 2268 2235 2269 adjointx_input->GetInputValue(&lambda, gauss); … … 2282 2316 if(domaintype!=Domain2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;}; 2283 2317 }/*}}}*/ 2284 2285 void AdjointHorizAnalysis::GradientJDSSA(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/ 2318 void AdjointHorizAnalysis::GradientJDSSA(Element* element,Vector<IssmDouble>* gradient,int control_interp,int control_index){/*{{{*/ 2286 2319 2287 2320 /*Intermediaries*/ … … 2303 2336 case Domain3DEnum: 2304 2337 if(!element->IsOnBase()) return; 2305 basalelement = element->SpawnBasalElement( );2338 basalelement = element->SpawnBasalElement(true); 2306 2339 dim = 2; 2307 2340 break; … … 2326 2359 basalelement->GetVerticesCoordinates(&xyz_list); 2327 2360 basalelement->GradientIndexing(&vertexpidlist[0],control_index); 2328 Input 2* thickness_input = basalelement->GetInput2(ThicknessEnum); _assert_(thickness_input);2329 Input 2* vx_input = basalelement->GetInput2(VxEnum); _assert_(vx_input);2330 Input 2* vy_input = basalelement->GetInput2(VyEnum); _assert_(vy_input);2331 Input 2* adjointx_input = basalelement->GetInput2(AdjointxEnum); _assert_(adjointx_input);2332 Input 2* adjointy_input = basalelement->GetInput2(AdjointyEnum); _assert_(adjointy_input);2333 Input 2* rheologyb_input = basalelement->GetInput2(MaterialsRheologyBbarEnum); _assert_(rheologyb_input);2361 Input* thickness_input = basalelement->GetInput(ThicknessEnum); _assert_(thickness_input); 2362 Input* vx_input = basalelement->GetInput(VxEnum); _assert_(vx_input); 2363 Input* vy_input = basalelement->GetInput(VyEnum); _assert_(vy_input); 2364 Input* adjointx_input = basalelement->GetInput(AdjointxEnum); _assert_(adjointx_input); 2365 Input* adjointy_input = basalelement->GetInput(AdjointyEnum); _assert_(adjointy_input); 2366 Input* rheologyb_input = basalelement->GetInput(MaterialsRheologyBbarEnum); _assert_(rheologyb_input); 2334 2367 2335 2368 /* Start looping on the number of gaussian points: */ 2336 2369 Gauss* gauss=basalelement->NewGauss(4); 2337 for(int ig=gauss->begin();ig<gauss->end();ig++){ 2338 gauss->GaussPoint(ig); 2370 while(gauss->next()){ 2339 2371 2340 2372 thickness_input->GetInputValue(&thickness,gauss); … … 2451 2483 2452 2484 /*Add vx and vy as inputs to the tria element: */ 2453 element->AddInput 2(AdjointxEnum,lambdax,element->VelocityInterpolation());2454 element->AddInput 2(AdjointyEnum,lambday,element->VelocityInterpolation());2455 if(domaintype!=Domain2DverticalEnum) element->AddInput 2(AdjointzEnum,lambdaz,element->VelocityInterpolation());2485 element->AddInput(AdjointxEnum,lambdax,element->VelocityInterpolation()); 2486 element->AddInput(AdjointyEnum,lambday,element->VelocityInterpolation()); 2487 if(domaintype!=Domain2DverticalEnum) element->AddInput(AdjointzEnum,lambdaz,element->VelocityInterpolation()); 2456 2488 2457 2489 element->FindParam(&fe_FS,FlowequationFeFSEnum); 2458 2490 if(fe_FS!=LATaylorHoodEnum && fe_FS!=LACrouzeixRaviartEnum) 2459 element->AddInput 2(AdjointpEnum,lambdap,element->PressureInterpolation());2491 element->AddInput(AdjointpEnum,lambdap,element->PressureInterpolation()); 2460 2492 2461 2493 /*Free ressources:*/ … … 2496 2528 for(i=0;i<numnodes;i++){ 2497 2529 if(domaintype!=Domain2DverticalEnum){ 2498 lambdax[i]=values[i* NDOF2+0];2499 lambday[i]=values[i* NDOF2+1];2530 lambdax[i]=values[i*2+0]; 2531 lambday[i]=values[i*2+1]; 2500 2532 } 2501 2533 else {lambdax[i]=values[i];lambday[i]=0;} … … 2508 2540 2509 2541 /*Add vx and vy as inputs to the tria element: */ 2510 element->AddInput 2(AdjointxEnum,lambdax,element->GetElementType());2511 element->AddInput 2(AdjointyEnum,lambday,element->GetElementType());2542 element->AddInput(AdjointxEnum,lambdax,element->GetElementType()); 2543 element->AddInput(AdjointyEnum,lambday,element->GetElementType()); 2512 2544 2513 2545 /*Free ressources:*/
Note:
See TracChangeset
for help on using the changeset viewer.