Changeset 25317
- Timestamp:
- 07/31/20 09:21:13 (5 years ago)
- Location:
- issm/trunk-jpl/src/c
- Files:
-
- 100 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.cpp
r24335 r25317 116 116 _error_("not implemented yet"); 117 117 }/*}}}*/ 118 void AdjointBalancethickness2Analysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/118 void AdjointBalancethickness2Analysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_interp,int control_index){/*{{{*/ 119 119 /*The gradient of the cost function is calculated in 2 parts. 120 120 * -
issm/trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.h
r24335 r25317 27 27 ElementVector* CreatePVector(Element* element); 28 28 void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element); 29 void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);29 void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_interp,int control_index); 30 30 void GradientJdHdt(Element* element,Vector<IssmDouble>* gradient,int control_index); 31 31 void GradientJOmega(Element* element,Vector<IssmDouble>* gradient,int control_index); -
issm/trunk-jpl/src/c/analyses/AdjointBalancethicknessAnalysis.cpp
r24335 r25317 156 156 _error_("not implemented yet"); 157 157 }/*}}}*/ 158 void AdjointBalancethicknessAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/158 void AdjointBalancethicknessAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_interp,int control_index){/*{{{*/ 159 159 /*The gradient of the cost function is calculated in 2 parts. 160 160 * … … 194 194 /*Deal with second term*/ 195 195 switch(control_type){ 196 case BalancethicknessSpcthicknessEnum: GradientJDirichlet(element,gradient,control_in dex); break;197 case BalancethicknessThickeningRateEnum: GradientJDhDt(element,gradient,control_in dex); break;198 case VxEnum: GradientJVx( element,gradient,control_in dex); break;199 case VyEnum: GradientJVy( element,gradient,control_in dex); break;196 case BalancethicknessSpcthicknessEnum: GradientJDirichlet(element,gradient,control_interp,control_index); break; 197 case BalancethicknessThickeningRateEnum: GradientJDhDt(element,gradient,control_interp,control_index); break; 198 case VxEnum: GradientJVx( element,gradient,control_interp,control_index); break; 199 case VyEnum: GradientJVy( element,gradient,control_interp,control_index); break; 200 200 default: _error_("control type not supported yet: " << EnumToStringx(control_type)); 201 201 } … … 205 205 206 206 }/*}}}*/ 207 void AdjointBalancethicknessAnalysis::GradientJDirichlet(Element* element,Vector<IssmDouble>* gradient,int control_in dex){/*{{{*/207 void AdjointBalancethicknessAnalysis::GradientJDirichlet(Element* element,Vector<IssmDouble>* gradient,int control_interp,int control_index){/*{{{*/ 208 208 209 209 /*Fetch number of vertices for this finite element*/ … … 242 242 delete Ke; 243 243 }/*}}}*/ 244 void AdjointBalancethicknessAnalysis::GradientJDhDt(Element* element,Vector<IssmDouble>* gradient,int control_in dex){/*{{{*/244 void AdjointBalancethicknessAnalysis::GradientJDhDt(Element* element,Vector<IssmDouble>* gradient,int control_interp,int control_index){/*{{{*/ 245 245 246 246 /*Fetch number of vertices for this finite element*/ … … 266 266 xDelete<int>(vertexpidlist); 267 267 }/*}}}*/ 268 void AdjointBalancethicknessAnalysis::GradientJVx(Element* element,Vector<IssmDouble>* gradient,int control_in dex){/*{{{*/268 void AdjointBalancethicknessAnalysis::GradientJVx(Element* element,Vector<IssmDouble>* gradient,int control_interp,int control_index){/*{{{*/ 269 269 270 270 /*Intermediaries*/ … … 313 313 delete gauss; 314 314 }/*}}}*/ 315 void AdjointBalancethicknessAnalysis::GradientJVy(Element* element,Vector<IssmDouble>* gradient,int control_in dex){/*{{{*/315 void AdjointBalancethicknessAnalysis::GradientJVy(Element* element,Vector<IssmDouble>* gradient,int control_interp,int control_index){/*{{{*/ 316 316 317 317 /*Intermediaries*/ -
issm/trunk-jpl/src/c/analyses/AdjointBalancethicknessAnalysis.h
r24335 r25317 27 27 ElementVector* CreatePVector(Element* element); 28 28 void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element); 29 void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);30 void GradientJDirichlet(Element* element,Vector<IssmDouble>* gradient,int control_in dex);31 void GradientJDhDt(Element* element,Vector<IssmDouble>* gradient,int control_in dex);32 void GradientJVx(Element* element,Vector<IssmDouble>* gradient,int control_in dex);33 void GradientJVy(Element* element,Vector<IssmDouble>* gradient,int control_in dex);29 void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_interp,int control_index); 30 void GradientJDirichlet(Element* element,Vector<IssmDouble>* gradient,int control_interp,int control_index); 31 void GradientJDhDt(Element* element,Vector<IssmDouble>* gradient,int control_interp,int control_index); 32 void GradientJVx(Element* element,Vector<IssmDouble>* gradient,int control_interp,int control_index); 33 void GradientJVy(Element* element,Vector<IssmDouble>* gradient,int control_interp,int control_index); 34 34 void InputUpdateFromSolution(IssmDouble* solution,Element* element); 35 35 void UpdateConstraints(FemModel* femmodel); -
issm/trunk-jpl/src/c/analyses/AdjointHorizAnalysis.cpp
r25240 r25317 1078 1078 _error_("not implemented yet"); 1079 1079 }/*}}}*/ 1080 void AdjointHorizAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/1080 void AdjointHorizAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_interp,int control_index){/*{{{*/ 1081 1081 /*The gradient of the cost function is calculated in 2 parts. 1082 1082 * … … 1103 1103 if(control_type!=MaterialsRheologyBbarEnum && 1104 1104 control_type!=FrictionCoefficientEnum && 1105 control_type!=FrictionCEnum &&1106 control_type!=FrictionAsEnum &&1105 control_type!=FrictionCEnum && 1106 control_type!=FrictionAsEnum && 1107 1107 control_type!=DamageDbarEnum && 1108 1108 control_type!=MaterialsRheologyBEnum){ … … 1117 1117 case SurfaceLogVxVyMisfitEnum: /*Nothing, \partial J/\partial k = 0*/ break; 1118 1118 case SurfaceAverageVelMisfitEnum: /*Nothing, \partial J/\partial k = 0*/ break; 1119 case DragCoefficientAbsGradientEnum: GradientJDragGradient(element,gradient,control_index); break;1120 case RheologyBbarAbsGradientEnum: GradientJBbarGradient(element,gradient,control_index); break;1121 case RheologyBAbsGradientEnum: GradientJBGradient(element,gradient,control_index); break;1122 case RheologyBInitialguessMisfitEnum: GradientJBinitial(element,gradient,control_in dex);break;1119 case DragCoefficientAbsGradientEnum: GradientJDragGradient(element,gradient,control_interp,control_index); break; 1120 case RheologyBbarAbsGradientEnum: GradientJBbarGradient(element,gradient,control_interp,control_index); break; 1121 case RheologyBAbsGradientEnum: GradientJBGradient(element,gradient,control_interp,control_index); break; 1122 case RheologyBInitialguessMisfitEnum: GradientJBinitial(element,gradient,control_interp,control_index); break; 1123 1123 default: _error_("response " << EnumToStringx(responses[resp]) << " not supported yet"); 1124 1124 } … … 1129 1129 case FrictionCEnum: 1130 1130 switch(approximation){ 1131 case SSAApproximationEnum: GradientJDragSSA(element,gradient,control_in dex); break;1132 case L1L2ApproximationEnum:GradientJDragL1L2(element,gradient,control_in dex); break;1133 case HOApproximationEnum: GradientJDragHO( element,gradient,control_in dex); break;1134 case FSApproximationEnum: GradientJDragFS( element,gradient,control_in dex); break;1131 case SSAApproximationEnum: GradientJDragSSA(element,gradient,control_interp,control_index); break; 1132 case L1L2ApproximationEnum:GradientJDragL1L2(element,gradient,control_interp,control_index); break; 1133 case HOApproximationEnum: GradientJDragHO( element,gradient,control_interp,control_index); break; 1134 case FSApproximationEnum: GradientJDragFS( element,gradient,control_interp,control_index); break; 1135 1135 case NoneApproximationEnum: /*Gradient is 0*/ break; 1136 1136 default: _error_("approximation " << EnumToStringx(approximation) << " not supported yet"); … … 1139 1139 case FrictionAsEnum: 1140 1140 switch(approximation){ 1141 case SSAApproximationEnum: GradientJDragHydroSSA(element,gradient,control_in dex); break;1142 case L1L2ApproximationEnum:GradientJDragHydroL1L2(element,gradient,control_in dex); break;1143 case HOApproximationEnum: GradientJDragHydroHO( element,gradient,control_in dex); break;1144 case FSApproximationEnum: GradientJDragHydroFS( element,gradient,control_in dex); break;1141 case SSAApproximationEnum: GradientJDragHydroSSA(element,gradient,control_interp,control_index); break; 1142 case L1L2ApproximationEnum:GradientJDragHydroL1L2(element,gradient,control_interp,control_index); break; 1143 case HOApproximationEnum: GradientJDragHydroHO( element,gradient,control_interp,control_index); break; 1144 case FSApproximationEnum: GradientJDragHydroFS( element,gradient,control_interp,control_index); break; 1145 1145 case NoneApproximationEnum: /*Gradient is 0*/ break; 1146 1146 default: _error_("approximation " << EnumToStringx(approximation) << " not supported yet"); … … 1149 1149 case MaterialsRheologyBbarEnum: 1150 1150 switch(approximation){ 1151 case SSAApproximationEnum: GradientJBbarSSA(element,gradient,control_in dex); break;1152 case L1L2ApproximationEnum:GradientJBbarL1L2(element,gradient,control_in dex); break;1153 case HOApproximationEnum: GradientJBbarHO( element,gradient,control_in dex); break;1154 case FSApproximationEnum: GradientJBbarFS( element,gradient,control_in dex); break;1151 case SSAApproximationEnum: GradientJBbarSSA(element,gradient,control_interp,control_index); break; 1152 case L1L2ApproximationEnum:GradientJBbarL1L2(element,gradient,control_interp,control_index); break; 1153 case HOApproximationEnum: GradientJBbarHO( element,gradient,control_interp,control_index); break; 1154 case FSApproximationEnum: GradientJBbarFS( element,gradient,control_interp,control_index); break; 1155 1155 case NoneApproximationEnum: /*Gradient is 0*/ break; 1156 1156 default: _error_("approximation " << EnumToStringx(approximation) << " not supported yet"); … … 1159 1159 case MaterialsRheologyBEnum: 1160 1160 switch(approximation){ 1161 case SSAApproximationEnum: GradientJBSSA(element,gradient,control_in dex); break;1162 case HOApproximationEnum: GradientJBHO( element,gradient,control_in dex); break;1163 case FSApproximationEnum: GradientJBFS( element,gradient,control_in dex); break;1161 case SSAApproximationEnum: GradientJBSSA(element,gradient,control_interp,control_index); break; 1162 case HOApproximationEnum: GradientJBHO( element,gradient,control_interp,control_index); break; 1163 case FSApproximationEnum: GradientJBFS( element,gradient,control_interp,control_index); break; 1164 1164 case NoneApproximationEnum: /*Gradient is 0*/ break; 1165 1165 default: _error_("approximation " << EnumToStringx(approximation) << " not supported yet"); … … 1168 1168 case DamageDbarEnum: 1169 1169 switch(approximation){ 1170 case SSAApproximationEnum: GradientJDSSA(element,gradient,control_in dex); break;1170 case SSAApproximationEnum: GradientJDSSA(element,gradient,control_interp,control_index); break; 1171 1171 case NoneApproximationEnum: /*Gradient is 0*/ break; 1172 1172 default: _error_("approximation " << EnumToStringx(approximation) << " not supported yet"); … … 1180 1180 1181 1181 }/*}}}*/ 1182 void AdjointHorizAnalysis::GradientJBbarFS(Element* element,Vector<IssmDouble>* gradient,int control_in dex){/*{{{*/1182 void AdjointHorizAnalysis::GradientJBbarFS(Element* element,Vector<IssmDouble>* gradient,int control_interp,int control_index){/*{{{*/ 1183 1183 /*WARNING: We use SSA as an estimate for now*/ 1184 this->GradientJBbarSSA(element,gradient,control_in dex);1185 }/*}}}*/ 1186 void AdjointHorizAnalysis::GradientJBbarGradient(Element* element,Vector<IssmDouble>* gradient,int control_in dex){/*{{{*/1184 this->GradientJBbarSSA(element,gradient,control_interp,control_index); 1185 }/*}}}*/ 1186 void AdjointHorizAnalysis::GradientJBbarGradient(Element* element,Vector<IssmDouble>* gradient,int control_interp,int control_index){/*{{{*/ 1187 1187 1188 1188 /*Intermediaries*/ … … 1259 1259 if(domaintype!=Domain2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;}; 1260 1260 }/*}}}*/ 1261 void AdjointHorizAnalysis::GradientJBbarL1L2(Element* element,Vector<IssmDouble>* gradient,int control_in dex){/*{{{*/1261 void AdjointHorizAnalysis::GradientJBbarL1L2(Element* element,Vector<IssmDouble>* gradient,int control_interp,int control_index){/*{{{*/ 1262 1262 1263 1263 /*Same as SSA*/ 1264 return this->GradientJBbarSSA(element,gradient,control_in dex);1265 }/*}}}*/ 1266 void AdjointHorizAnalysis::GradientJBbarHO(Element* element,Vector<IssmDouble>* gradient,int control_in dex){/*{{{*/1264 return this->GradientJBbarSSA(element,gradient,control_interp,control_index); 1265 }/*}}}*/ 1266 void AdjointHorizAnalysis::GradientJBbarHO(Element* element,Vector<IssmDouble>* gradient,int control_interp,int control_index){/*{{{*/ 1267 1267 1268 1268 /*WARNING: We use SSA as an estimate for now*/ 1269 this->GradientJBbarSSA(element,gradient,control_in dex);1270 }/*}}}*/ 1271 void AdjointHorizAnalysis::GradientJBbarSSA(Element* element,Vector<IssmDouble>* gradient,int control_in dex){/*{{{*/1269 this->GradientJBbarSSA(element,gradient,control_interp,control_index); 1270 }/*}}}*/ 1271 void AdjointHorizAnalysis::GradientJBbarSSA(Element* element,Vector<IssmDouble>* gradient,int control_interp,int control_index){/*{{{*/ 1272 1272 1273 1273 /*Intermediaries*/ … … 1336 1336 1337 1337 /*Build gradient vector (actually -dJ/dB): */ 1338 for(int i=0;i<numvertices;i++){ 1339 ge[i]+=-dmudB*thickness*( 1338 if(control_interp==P1Enum){ 1339 for(int i=0;i<numvertices;i++){ 1340 ge[i]+=-dmudB*thickness*( 1341 (2*dvx[0]+dvy[1])*2*dadjx[0]+(dvx[1]+dvy[0])*(dadjx[1]+dadjy[0])+(2*dvy[1]+dvx[0])*2*dadjy[1] 1342 )*Jdet*gauss->weight*basis[i]; 1343 _assert_(!xIsNan<IssmDouble>(ge[i])); 1344 } 1345 } 1346 else if(control_interp==P0Enum){ 1347 ge[0]+=-dmudB*thickness*( 1340 1348 (2*dvx[0]+dvy[1])*2*dadjx[0]+(dvx[1]+dvy[0])*(dadjx[1]+dadjy[0])+(2*dvy[1]+dvx[0])*2*dadjy[1] 1341 )*Jdet*gauss->weight*basis[i]; 1342 _assert_(!xIsNan<IssmDouble>(ge[i])); 1343 } 1344 } 1345 gradient->SetValues(numvertices,vertexpidlist,ge,ADD_VAL); 1349 )*Jdet*gauss->weight; 1350 _assert_(!xIsNan<IssmDouble>(ge[0])); 1351 } 1352 else{ 1353 _error_("not supported"); 1354 } 1355 } 1356 if(control_interp==P1Enum){ 1357 gradient->SetValues(numvertices,vertexpidlist,ge,ADD_VAL); 1358 } 1359 else if(control_interp==P0Enum){ 1360 gradient->SetValue(vertexpidlist[0],ge[0],ADD_VAL); 1361 } 1362 else{ 1363 _error_("not supported"); 1364 } 1346 1365 1347 1366 /*Clean up and return*/ … … 1353 1372 if(domaintype!=Domain2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;}; 1354 1373 }/*}}}*/ 1355 void AdjointHorizAnalysis::GradientJBFS(Element* element,Vector<IssmDouble>* gradient,int control_in dex){/*{{{*/1374 void AdjointHorizAnalysis::GradientJBFS(Element* element,Vector<IssmDouble>* gradient,int control_interp,int control_index){/*{{{*/ 1356 1375 /*WARNING: We use HO as an estimate for now*/ 1357 this->GradientJBHO(element,gradient,control_in dex);1358 }/*}}}*/ 1359 void AdjointHorizAnalysis::GradientJBGradient(Element* element,Vector<IssmDouble>* gradient,int control_in dex){/*{{{*/1376 this->GradientJBHO(element,gradient,control_interp,control_index); 1377 }/*}}}*/ 1378 void AdjointHorizAnalysis::GradientJBGradient(Element* element,Vector<IssmDouble>* gradient,int control_interp,int control_index){/*{{{*/ 1360 1379 1361 1380 /*Intermediaries*/ … … 1423 1442 delete gauss; 1424 1443 }/*}}}*/ 1425 void AdjointHorizAnalysis::GradientJBinitial(Element* element,Vector<IssmDouble>* gradient,int control_in dex){/*{{{*/1444 void AdjointHorizAnalysis::GradientJBinitial(Element* element,Vector<IssmDouble>* gradient,int control_interp,int control_index){/*{{{*/ 1426 1445 1427 1446 /*Intermediaries*/ … … 1487 1506 delete gauss; 1488 1507 }/*}}}*/ 1489 void AdjointHorizAnalysis::GradientJBHO(Element* element,Vector<IssmDouble>* gradient,int control_in dex){/*{{{*/1508 void AdjointHorizAnalysis::GradientJBHO(Element* element,Vector<IssmDouble>* gradient,int control_interp,int control_index){/*{{{*/ 1490 1509 /*Intermediaries*/ 1491 1510 int domaintype,dim; … … 1563 1582 delete gauss; 1564 1583 }/*}}}*/ 1565 void AdjointHorizAnalysis::GradientJBSSA(Element* element,Vector<IssmDouble>* gradient,int control_in dex){/*{{{*/1584 void AdjointHorizAnalysis::GradientJBSSA(Element* element,Vector<IssmDouble>* gradient,int control_interp,int control_index){/*{{{*/ 1566 1585 1567 1586 /*Intermediaries*/ … … 1647 1666 if(domaintype!=Domain2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;}; 1648 1667 }/*}}}*/ 1649 void AdjointHorizAnalysis::GradientJDragGradient(Element* element,Vector<IssmDouble>* gradient,int control_in dex){/*{{{*/1668 void AdjointHorizAnalysis::GradientJDragGradient(Element* element,Vector<IssmDouble>* gradient,int control_interp,int control_index){/*{{{*/ 1650 1669 1651 1670 /*return if floating (gradient is 0)*/ … … 1741 1760 1742 1761 }/*}}}*/ 1743 void AdjointHorizAnalysis::GradientJDragFS(Element* element,Vector<IssmDouble>* gradient,int control_in dex){/*{{{*/1762 void AdjointHorizAnalysis::GradientJDragFS(Element* element,Vector<IssmDouble>* gradient,int control_interp,int control_index){/*{{{*/ 1744 1763 1745 1764 /*return if floating or not on bed (gradient is 0)*/ … … 1837 1856 delete friction; 1838 1857 }/*}}}*/ 1839 void AdjointHorizAnalysis::GradientJDragL1L2(Element* element,Vector<IssmDouble>* gradient,int control_in dex){/*{{{*/1858 void AdjointHorizAnalysis::GradientJDragL1L2(Element* element,Vector<IssmDouble>* gradient,int control_interp,int control_index){/*{{{*/ 1840 1859 1841 1860 /*Same as SSA*/ 1842 return this->GradientJDragSSA(element,gradient,control_in dex);1843 }/*}}}*/ 1844 void AdjointHorizAnalysis::GradientJDragHO(Element* element,Vector<IssmDouble>* gradient,int control_in dex){/*{{{*/1861 return this->GradientJDragSSA(element,gradient,control_interp,control_index); 1862 }/*}}}*/ 1863 void AdjointHorizAnalysis::GradientJDragHO(Element* element,Vector<IssmDouble>* gradient,int control_interp,int control_index){/*{{{*/ 1845 1864 1846 1865 /*return if floating or not on bed (gradient is 0)*/ … … 1916 1935 delete friction; 1917 1936 }/*}}}*/ 1918 void AdjointHorizAnalysis::GradientJDragSSA(Element* element,Vector<IssmDouble>* gradient,int control_in dex){/*{{{*/1937 void AdjointHorizAnalysis::GradientJDragSSA(Element* element,Vector<IssmDouble>* gradient,int control_interp,int control_index){/*{{{*/ 1919 1938 1920 1939 /*return if floating (gradient is 0)*/ … … 2018 2037 if(domaintype!=Domain2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;}; 2019 2038 }/*}}}*/ 2020 2021 void AdjointHorizAnalysis::GradientJDragHydroFS(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/ 2039 void AdjointHorizAnalysis::GradientJDragHydroFS(Element* element,Vector<IssmDouble>* gradient,int control_interp,int control_index){/*{{{*/ 2022 2040 2023 2041 /*return if floating or not on bed (gradient is 0)*/ … … 2113 2131 delete friction; 2114 2132 }/*}}}*/ 2115 void AdjointHorizAnalysis::GradientJDragHydroL1L2(Element* element,Vector<IssmDouble>* gradient,int control_in dex){/*{{{*/2133 void AdjointHorizAnalysis::GradientJDragHydroL1L2(Element* element,Vector<IssmDouble>* gradient,int control_interp,int control_index){/*{{{*/ 2116 2134 2117 2135 /*Same as SSA*/ 2118 return this->GradientJDragSSA(element,gradient,control_in dex);2119 }/*}}}*/ 2120 void AdjointHorizAnalysis::GradientJDragHydroHO(Element* element,Vector<IssmDouble>* gradient,int control_in dex){/*{{{*/2136 return this->GradientJDragSSA(element,gradient,control_interp,control_index); 2137 }/*}}}*/ 2138 void AdjointHorizAnalysis::GradientJDragHydroHO(Element* element,Vector<IssmDouble>* gradient,int control_interp,int control_index){/*{{{*/ 2121 2139 2122 2140 /*return if floating or not on bed (gradient is 0)*/ … … 2190 2208 delete friction; 2191 2209 }/*}}}*/ 2192 2193 void AdjointHorizAnalysis::GradientJDragHydroSSA(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/ 2210 void AdjointHorizAnalysis::GradientJDragHydroSSA(Element* element,Vector<IssmDouble>* gradient,int control_interp,int control_index){/*{{{*/ 2194 2211 2195 2212 /*return if floating (gradient is 0)*/ … … 2316 2333 if(domaintype!=Domain2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;}; 2317 2334 }/*}}}*/ 2318 2319 void AdjointHorizAnalysis::GradientJDSSA(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/ 2335 void AdjointHorizAnalysis::GradientJDSSA(Element* element,Vector<IssmDouble>* gradient,int control_interp,int control_index){/*{{{*/ 2320 2336 2321 2337 /*Intermediaries*/ -
issm/trunk-jpl/src/c/analyses/AdjointHorizAnalysis.h
r24335 r25317 35 35 ElementVector* CreatePVectorSSA(Element* element); 36 36 void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element); 37 void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);38 void GradientJBbarFS(Element* element,Vector<IssmDouble>* gradient,int control_in dex);39 void GradientJBbarGradient(Element* element,Vector<IssmDouble>* gradient,int control_in dex);40 void GradientJBinitial(Element* element,Vector<IssmDouble>* gradient,int control_in dex);41 void GradientJBbarL1L2(Element* element,Vector<IssmDouble>* gradient,int control_in dex);42 void GradientJBbarHO(Element* element,Vector<IssmDouble>* gradient,int control_in dex);43 void GradientJBbarSSA(Element* element,Vector<IssmDouble>* gradient,int control_in dex);44 void GradientJBFS(Element* element,Vector<IssmDouble>* gradient,int control_in dex);45 void GradientJBGradient(Element* element,Vector<IssmDouble>* gradient,int control_in dex);46 void GradientJBHO(Element* element,Vector<IssmDouble>* gradient,int control_in dex);47 void GradientJBSSA(Element* element,Vector<IssmDouble>* gradient,int control_in dex);48 void GradientJDragFS(Element* element,Vector<IssmDouble>* gradient,int control_in dex);49 void GradientJDragGradient(Element* element,Vector<IssmDouble>* gradient,int control_in dex);50 void GradientJDragL1L2(Element* element,Vector<IssmDouble>* gradient,int control_in dex);51 void GradientJDragHO(Element* element,Vector<IssmDouble>* gradient,int control_in dex);52 void GradientJDragSSA(Element* element,Vector<IssmDouble>* gradient,int control_in dex);53 void GradientJDragHydroFS(Element* element,Vector<IssmDouble>* gradient,int control_in dex);54 void GradientJDragHydroL1L2(Element* element,Vector<IssmDouble>* gradient,int control_in dex);55 void GradientJDragHydroHO(Element* element,Vector<IssmDouble>* gradient,int control_in dex);56 void GradientJDragHydroSSA(Element* element,Vector<IssmDouble>* gradient,int control_in dex);57 void GradientJDSSA(Element* element,Vector<IssmDouble>* gradient,int control_in dex);37 void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_interp,int control_index); 38 void GradientJBbarFS(Element* element,Vector<IssmDouble>* gradient,int control_interp,int control_index); 39 void GradientJBbarGradient(Element* element,Vector<IssmDouble>* gradient,int control_interp,int control_index); 40 void GradientJBinitial(Element* element,Vector<IssmDouble>* gradient,int control_interp,int control_index); 41 void GradientJBbarL1L2(Element* element,Vector<IssmDouble>* gradient,int control_interp,int control_index); 42 void GradientJBbarHO(Element* element,Vector<IssmDouble>* gradient,int control_interp,int control_index); 43 void GradientJBbarSSA(Element* element,Vector<IssmDouble>* gradient,int control_interp,int control_index); 44 void GradientJBFS(Element* element,Vector<IssmDouble>* gradient,int control_interp,int control_index); 45 void GradientJBGradient(Element* element,Vector<IssmDouble>* gradient,int control_interp,int control_index); 46 void GradientJBHO(Element* element,Vector<IssmDouble>* gradient,int control_interp,int control_index); 47 void GradientJBSSA(Element* element,Vector<IssmDouble>* gradient,int control_interp,int control_index); 48 void GradientJDragFS(Element* element,Vector<IssmDouble>* gradient,int control_interp,int control_index); 49 void GradientJDragGradient(Element* element,Vector<IssmDouble>* gradient,int control_interp,int control_index); 50 void GradientJDragL1L2(Element* element,Vector<IssmDouble>* gradient,int control_interp,int control_index); 51 void GradientJDragHO(Element* element,Vector<IssmDouble>* gradient,int control_interp,int control_index); 52 void GradientJDragSSA(Element* element,Vector<IssmDouble>* gradient,int control_interp,int control_index); 53 void GradientJDragHydroFS(Element* element,Vector<IssmDouble>* gradient,int control_interp,int control_index); 54 void GradientJDragHydroL1L2(Element* element,Vector<IssmDouble>* gradient,int control_interp,int control_index); 55 void GradientJDragHydroHO(Element* element,Vector<IssmDouble>* gradient,int control_interp,int control_index); 56 void GradientJDragHydroSSA(Element* element,Vector<IssmDouble>* gradient,int control_interp,int control_index); 57 void GradientJDSSA(Element* element,Vector<IssmDouble>* gradient,int control_interp,int control_index); 58 58 void InputUpdateFromSolution(IssmDouble* solution,Element* element); 59 59 void InputUpdateFromSolutionFS(IssmDouble* solution,Element* element); -
issm/trunk-jpl/src/c/analyses/Analysis.h
r24335 r25317 49 49 virtual ElementVector* CreatePVector(Element* element)=0; 50 50 virtual void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element)=0; 51 virtual void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_in dex)=0;51 virtual void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_interp,int control_index)=0; 52 52 virtual void InputUpdateFromSolution(IssmDouble* solution,Element* element)=0; 53 53 virtual void UpdateConstraints(FemModel* femmodel)=0; -
issm/trunk-jpl/src/c/analyses/Balancethickness2Analysis.cpp
r25118 r25317 174 174 element->GetSolutionFromInputsOneDof(solution,ThicknessEnum); 175 175 }/*}}}*/ 176 void Balancethickness2Analysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/176 void Balancethickness2Analysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_interp,int control_index){/*{{{*/ 177 177 _error_("Not implemented yet"); 178 178 }/*}}}*/ -
issm/trunk-jpl/src/c/analyses/Balancethickness2Analysis.h
r24335 r25317 27 27 ElementVector* CreatePVector(Element* element); 28 28 void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element); 29 void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);29 void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_interp,int control_index); 30 30 void InputUpdateFromSolution(IssmDouble* solution,Element* element); 31 31 void UpdateConstraints(FemModel* femmodel); -
issm/trunk-jpl/src/c/analyses/BalancethicknessAnalysis.cpp
r25262 r25317 424 424 _error_("not implemented yet"); 425 425 }/*}}}*/ 426 void BalancethicknessAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/426 void BalancethicknessAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_interp,int control_index){/*{{{*/ 427 427 /* WARNING: this gradient is valid for Soft balance thickness only */ 428 428 -
issm/trunk-jpl/src/c/analyses/BalancethicknessAnalysis.h
r25262 r25317 31 31 ElementVector* CreatePVectorDG(Element* element); 32 32 void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element); 33 void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);33 void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_interp,int control_index); 34 34 void InputUpdateFromSolution(IssmDouble* solution,Element* element); 35 35 void UpdateConstraints(FemModel* femmodel); -
issm/trunk-jpl/src/c/analyses/BalancethicknessSoftAnalysis.cpp
r24335 r25317 45 45 _error_("not implemented yet"); 46 46 }/*}}}*/ 47 void BalancethicknessSoftAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/47 void BalancethicknessSoftAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_interp,int control_index){/*{{{*/ 48 48 _error_("Not implemented yet"); 49 49 }/*}}}*/ -
issm/trunk-jpl/src/c/analyses/BalancethicknessSoftAnalysis.h
r24335 r25317 27 27 ElementVector* CreatePVector(Element* element); 28 28 void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element); 29 void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);29 void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_interp,int control_index); 30 30 void InputUpdateFromSolution(IssmDouble* solution,Element* element); 31 31 void UpdateConstraints(FemModel* femmodel); -
issm/trunk-jpl/src/c/analyses/BalancevelocityAnalysis.cpp
r25118 r25317 239 239 _error_("not implemented yet"); 240 240 }/*}}}*/ 241 void BalancevelocityAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/241 void BalancevelocityAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_interp,int control_index){/*{{{*/ 242 242 _error_("Not implemented yet"); 243 243 }/*}}}*/ -
issm/trunk-jpl/src/c/analyses/BalancevelocityAnalysis.h
r24335 r25317 27 27 ElementVector* CreatePVector(Element* element); 28 28 void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element); 29 void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);29 void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_interp,int control_index); 30 30 void InputUpdateFromSolution(IssmDouble* solution,Element* element); 31 31 void UpdateConstraints(FemModel* femmodel); -
issm/trunk-jpl/src/c/analyses/DamageEvolutionAnalysis.cpp
r25263 r25317 677 677 element->GetSolutionFromInputsOneDof(solution,DamageDbarEnum); 678 678 }/*}}}*/ 679 void DamageEvolutionAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/679 void DamageEvolutionAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_interp,int control_index){/*{{{*/ 680 680 _error_("Not implemented yet"); 681 681 }/*}}}*/ -
issm/trunk-jpl/src/c/analyses/DamageEvolutionAnalysis.h
r25263 r25317 31 31 ElementVector* CreatePVector(Element* element); 32 32 void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element); 33 void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);33 void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_interp,int control_index); 34 34 void InputUpdateFromSolution(IssmDouble* solution,Element* element); 35 35 void UpdateConstraints(FemModel* femmodel); -
issm/trunk-jpl/src/c/analyses/DepthAverageAnalysis.cpp
r25265 r25317 140 140 _error_("not implemented yet"); 141 141 }/*}}}*/ 142 void DepthAverageAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/142 void DepthAverageAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_interp,int control_index){/*{{{*/ 143 143 _error_("Not implemented yet"); 144 144 }/*}}}*/ -
issm/trunk-jpl/src/c/analyses/DepthAverageAnalysis.h
r25265 r25317 27 27 ElementVector* CreatePVector(Element* element); 28 28 void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element); 29 void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);29 void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_interp,int control_index); 30 30 void InputUpdateFromSolution(IssmDouble* solution,Element* element); 31 31 void UpdateConstraints(FemModel* femmodel); -
issm/trunk-jpl/src/c/analyses/EnthalpyAnalysis.cpp
r25118 r25317 1521 1521 return (1.-waterfraction)*kappa_i + waterfraction*kappa_w; 1522 1522 }/*}}}*/ 1523 void EnthalpyAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/1523 void EnthalpyAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_interp,int control_index){/*{{{*/ 1524 1524 _error_("Not implemented yet"); 1525 1525 }/*}}}*/ -
issm/trunk-jpl/src/c/analyses/EnthalpyAnalysis.h
r24939 r25317 48 48 static int GetThermalBasalCondition(Element* element, IssmDouble enthalpy, IssmDouble enthalpy_up, IssmDouble pressure, IssmDouble pressure_up, IssmDouble watercolumn, IssmDouble meltingrate); 49 49 static IssmDouble GetWetIceConductivity(Element* element, IssmDouble enthalpy, IssmDouble pressure); 50 void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);50 void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_interp,int control_index); 51 51 void InputUpdateFromSolution(IssmDouble* solution,Element* element); 52 52 static void PostProcessing(FemModel* femmodel); -
issm/trunk-jpl/src/c/analyses/EnumToAnalysis.h
r24335 r25317 22 22 ElementVector* CreatePVector(Element* element); 23 23 void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element); 24 void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);24 void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_interp,int control_index); 25 25 void InputUpdateFromSolution(IssmDouble* solution,Element* element); 26 26 void UpdateConstraints(FemModel* femmodel); -
issm/trunk-jpl/src/c/analyses/EsaAnalysis.cpp
r25146 r25317 205 205 _error_("not implemented yet"); 206 206 }/*}}}*/ 207 void EsaAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/207 void EsaAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_interp,int control_index){/*{{{*/ 208 208 _error_("Not implemented yet"); 209 209 }/*}}}*/ -
issm/trunk-jpl/src/c/analyses/EsaAnalysis.h
r24335 r25317 27 27 ElementVector* CreatePVector(Element* element); 28 28 void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element); 29 void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);29 void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_interp,int control_index); 30 30 void InputUpdateFromSolution(IssmDouble* solution,Element* element); 31 31 void UpdateConstraints(FemModel* femmodel); -
issm/trunk-jpl/src/c/analyses/ExtrapolationAnalysis.cpp
r24433 r25317 211 211 _error_("not implemented yet"); 212 212 }/*}}}*/ 213 void ExtrapolationAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/213 void ExtrapolationAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_interp,int control_index){/*{{{*/ 214 214 _error_("Not implemented yet"); 215 215 }/*}}}*/ -
issm/trunk-jpl/src/c/analyses/ExtrapolationAnalysis.h
r24431 r25317 27 27 ElementVector* CreatePVector(Element* element); 28 28 void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element); 29 void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);29 void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_interp,int control_index); 30 30 void InputUpdateFromSolution(IssmDouble* solution,Element* element); 31 31 int GetExtrapolationCase(Element* element); -
issm/trunk-jpl/src/c/analyses/ExtrudeFromBaseAnalysis.cpp
r24335 r25317 95 95 _error_("not implemented yet"); 96 96 }/*}}}*/ 97 void ExtrudeFromBaseAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/97 void ExtrudeFromBaseAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_interp,int control_index){/*{{{*/ 98 98 _error_("Not implemented yet"); 99 99 }/*}}}*/ -
issm/trunk-jpl/src/c/analyses/ExtrudeFromBaseAnalysis.h
r24335 r25317 27 27 ElementVector* CreatePVector(Element* element); 28 28 void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element); 29 void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);29 void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_interp,int control_index); 30 30 void InputUpdateFromSolution(IssmDouble* solution,Element* element); 31 31 void UpdateConstraints(FemModel* femmodel); -
issm/trunk-jpl/src/c/analyses/ExtrudeFromTopAnalysis.cpp
r24335 r25317 95 95 _error_("not implemented yet"); 96 96 }/*}}}*/ 97 void ExtrudeFromTopAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/97 void ExtrudeFromTopAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_interp,int control_index){/*{{{*/ 98 98 _error_("Not implemented yet"); 99 99 }/*}}}*/ -
issm/trunk-jpl/src/c/analyses/ExtrudeFromTopAnalysis.h
r24335 r25317 27 27 ElementVector* CreatePVector(Element* element); 28 28 void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element); 29 void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);29 void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_interp,int control_index); 30 30 void InputUpdateFromSolution(IssmDouble* solution,Element* element); 31 31 void UpdateConstraints(FemModel* femmodel); -
issm/trunk-jpl/src/c/analyses/FreeSurfaceBaseAnalysis.cpp
r25264 r25317 348 348 _error_("not implemented yet"); 349 349 }/*}}}*/ 350 void FreeSurfaceBaseAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/350 void FreeSurfaceBaseAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_interp,int control_index){/*{{{*/ 351 351 _error_("Not implemented yet"); 352 352 }/*}}}*/ -
issm/trunk-jpl/src/c/analyses/FreeSurfaceBaseAnalysis.h
r25264 r25317 27 27 ElementVector* CreatePVector(Element* element); 28 28 void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element); 29 void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);29 void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_interp,int control_index); 30 30 void InputUpdateFromSolution(IssmDouble* solution,Element* element); 31 31 void UpdateConstraints(FemModel* femmodel); -
issm/trunk-jpl/src/c/analyses/FreeSurfaceTopAnalysis.cpp
r25264 r25317 322 322 _error_("not implemented yet"); 323 323 }/*}}}*/ 324 void FreeSurfaceTopAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/324 void FreeSurfaceTopAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_interp,int control_index){/*{{{*/ 325 325 _error_("Not implemented yet"); 326 326 }/*}}}*/ -
issm/trunk-jpl/src/c/analyses/FreeSurfaceTopAnalysis.h
r25264 r25317 27 27 ElementVector* CreatePVector(Element* element); 28 28 void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element); 29 void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);29 void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_interp,int control_index); 30 30 void InputUpdateFromSolution(IssmDouble* solution,Element* element); 31 31 void UpdateConstraints(FemModel* femmodel); -
issm/trunk-jpl/src/c/analyses/GLheightadvectionAnalysis.cpp
r25262 r25317 186 186 _error_("not implemented yet"); 187 187 }/*}}}*/ 188 void GLheightadvectionAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/188 void GLheightadvectionAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_interp,int control_index){/*{{{*/ 189 189 _error_("Not implemented yet"); 190 190 }/*}}}*/ -
issm/trunk-jpl/src/c/analyses/GLheightadvectionAnalysis.h
r25262 r25317 27 27 ElementVector* CreatePVector(Element* element); 28 28 void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element); 29 void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);29 void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_interp,int control_index); 30 30 void InputUpdateFromSolution(IssmDouble* solution,Element* element); 31 31 void UpdateConstraints(FemModel* femmodel); -
issm/trunk-jpl/src/c/analyses/GiaAnalysis.cpp
r25080 r25317 106 106 _error_("not implemented yet"); 107 107 }/*}}}*/ 108 void GiaAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/108 void GiaAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_interp,int control_index){/*{{{*/ 109 109 _error_("Not implemented yet"); 110 110 }/*}}}*/ -
issm/trunk-jpl/src/c/analyses/GiaAnalysis.h
r25066 r25317 27 27 ElementVector* CreatePVector(Element* element); 28 28 void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element); 29 void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);29 void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_interp,int control_index); 30 30 void InputUpdateFromSolution(IssmDouble* solution,Element* element); 31 31 void UpdateConstraints(FemModel* femmodel); -
issm/trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp
r25308 r25317 384 384 element->GetSolutionFromInputsOneDof(solution,EplHeadSubstepEnum); 385 385 }/*}}}*/ 386 void HydrologyDCEfficientAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/386 void HydrologyDCEfficientAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_interp,int control_index){/*{{{*/ 387 387 _error_("Not implemented yet"); 388 388 }/*}}}*/ -
issm/trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.h
r25308 r25317 30 30 ElementVector* CreatePVector(Element* element); 31 31 void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element); 32 void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_in dex);32 void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_interp,int control_index); 33 33 void InputUpdateFromSolution(IssmDouble* solution,Element* element); 34 34 void UpdateConstraints(FemModel* femmodel); -
issm/trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.cpp
r25308 r25317 450 450 element->GetSolutionFromInputsOneDof(solution,SedimentHeadSubstepEnum); 451 451 }/*}}}*/ 452 void HydrologyDCInefficientAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/452 void HydrologyDCInefficientAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_interp,int control_index){/*{{{*/ 453 453 _error_("Not implemented yet"); 454 454 }/*}}}*/ -
issm/trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.h
r25227 r25317 28 28 ElementVector* CreatePVector(Element* element); 29 29 void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element); 30 void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_in dex);30 void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_interp,int control_index); 31 31 void InputUpdateFromSolution(IssmDouble* solution,Element* element); 32 32 void UpdateConstraints(FemModel* femmodel); -
issm/trunk-jpl/src/c/analyses/HydrologyGlaDSAnalysis.cpp
r24861 r25317 430 430 431 431 }/*}}}*/ 432 void HydrologyGlaDSAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/432 void HydrologyGlaDSAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_interp,int control_index){/*{{{*/ 433 433 _error_("Not implemented yet"); 434 434 }/*}}}*/ -
issm/trunk-jpl/src/c/analyses/HydrologyGlaDSAnalysis.h
r24335 r25317 27 27 ElementVector* CreatePVector(Element* element); 28 28 void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element); 29 void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);29 void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_interp,int control_index); 30 30 void InputUpdateFromSolution(IssmDouble* solution,Element* element); 31 31 void UpdateConstraints(FemModel* femmodel); -
issm/trunk-jpl/src/c/analyses/HydrologyPismAnalysis.cpp
r24861 r25317 79 79 _error_("not implemented"); 80 80 }/*}}}*/ 81 void HydrologyPismAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/81 void HydrologyPismAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_interp,int control_index){/*{{{*/ 82 82 _error_("Not implemented yet"); 83 83 }/*}}}*/ -
issm/trunk-jpl/src/c/analyses/HydrologyPismAnalysis.h
r24335 r25317 27 27 ElementVector* CreatePVector(Element* element); 28 28 void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element); 29 void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);29 void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_interp,int control_index); 30 30 void InputUpdateFromSolution(IssmDouble* solution,Element* element); 31 31 void UpdateConstraints(FemModel* femmodel); -
issm/trunk-jpl/src/c/analyses/HydrologyShaktiAnalysis.cpp
r24861 r25317 343 343 element->GetSolutionFromInputsOneDof(solution,HydrologyHeadEnum); 344 344 }/*}}}*/ 345 void HydrologyShaktiAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/345 void HydrologyShaktiAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_interp,int control_index){/*{{{*/ 346 346 _error_("Not implemented yet"); 347 347 }/*}}}*/ -
issm/trunk-jpl/src/c/analyses/HydrologyShaktiAnalysis.h
r24335 r25317 27 27 ElementVector* CreatePVector(Element* element); 28 28 void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element); 29 void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);29 void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_interp,int control_index); 30 30 void InputUpdateFromSolution(IssmDouble* solution,Element* element); 31 31 void UpdateConstraints(FemModel* femmodel); -
issm/trunk-jpl/src/c/analyses/HydrologyShreveAnalysis.cpp
r25266 r25317 281 281 element->GetSolutionFromInputsOneDof(solution,WatercolumnEnum); 282 282 }/*}}}*/ 283 void HydrologyShreveAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/283 void HydrologyShreveAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_interp,int control_index){/*{{{*/ 284 284 _error_("Not implemented yet"); 285 285 }/*}}}*/ -
issm/trunk-jpl/src/c/analyses/HydrologyShreveAnalysis.h
r25266 r25317 28 28 ElementVector* CreatePVector(Element* element); 29 29 void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element); 30 void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);30 void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_interp,int control_index); 31 31 void InputUpdateFromSolution(IssmDouble* solution,Element* element); 32 32 void UpdateConstraints(FemModel* femmodel); -
issm/trunk-jpl/src/c/analyses/L2ProjectionBaseAnalysis.cpp
r25263 r25317 198 198 _error_("not implemented yet"); 199 199 }/*}}}*/ 200 void L2ProjectionBaseAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/200 void L2ProjectionBaseAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_interp,int control_index){/*{{{*/ 201 201 _error_("Not implemented yet"); 202 202 }/*}}}*/ -
issm/trunk-jpl/src/c/analyses/L2ProjectionBaseAnalysis.h
r24335 r25317 27 27 ElementVector* CreatePVector(Element* element); 28 28 void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element); 29 void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);29 void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_interp,int control_index); 30 30 void InputUpdateFromSolution(IssmDouble* solution,Element* element); 31 31 void UpdateConstraints(FemModel* femmodel); -
issm/trunk-jpl/src/c/analyses/L2ProjectionEPLAnalysis.cpp
r25228 r25317 223 223 _error_("not implemented yet"); 224 224 }/*}}}*/ 225 void L2ProjectionEPLAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/225 void L2ProjectionEPLAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_interp,int control_index){/*{{{*/ 226 226 _error_("Not implemented yet"); 227 227 }/*}}}*/ -
issm/trunk-jpl/src/c/analyses/L2ProjectionEPLAnalysis.h
r24335 r25317 27 27 ElementVector* CreatePVector(Element* element); 28 28 void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element); 29 void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);29 void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_interp,int control_index); 30 30 void InputUpdateFromSolution(IssmDouble* solution,Element* element); 31 31 void UpdateConstraints(FemModel* femmodel); -
issm/trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp
r24861 r25317 621 621 _error_("not implemented yet"); 622 622 }/*}}}*/ 623 void LevelsetAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/623 void LevelsetAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_interp,int control_index){/*{{{*/ 624 624 _error_("Not implemented yet"); 625 625 }/*}}}*/ -
issm/trunk-jpl/src/c/analyses/LevelsetAnalysis.h
r24429 r25317 28 28 IssmDouble GetDistanceToStraight(IssmDouble* q, IssmDouble* s0, IssmDouble* s1); 29 29 void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element); 30 void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);30 void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_interp,int control_index); 31 31 void InputUpdateFromSolution(IssmDouble* solution,Element* element); 32 32 void UpdateConstraints(FemModel* femmodel); -
issm/trunk-jpl/src/c/analyses/LoveAnalysis.cpp
r24335 r25317 67 67 _error_("not implemented yet"); 68 68 }/*}}}*/ 69 void LoveAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/69 void LoveAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_interp,int control_index){/*{{{*/ 70 70 _error_("Not implemented yet"); 71 71 }/*}}}*/ -
issm/trunk-jpl/src/c/analyses/LoveAnalysis.h
r24335 r25317 29 29 void GetBprime(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss); 30 30 void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element); 31 void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);31 void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_interp,int control_index); 32 32 void InputUpdateFromSolution(IssmDouble* solution,Element* element); 33 33 void UpdateConstraints(FemModel* femmodel); -
issm/trunk-jpl/src/c/analyses/MasstransportAnalysis.cpp
r25266 r25317 790 790 element->GetSolutionFromInputsOneDof(solution,ThicknessEnum); 791 791 }/*}}}*/ 792 void MasstransportAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/792 void MasstransportAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_interp,int control_index){/*{{{*/ 793 793 _error_("Not implemented yet"); 794 794 }/*}}}*/ -
issm/trunk-jpl/src/c/analyses/MasstransportAnalysis.h
r24730 r25317 31 31 ElementVector* CreatePVectorDG(Element* element); 32 32 void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element); 33 void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);33 void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_interp,int control_index); 34 34 void InputUpdateFromSolution(IssmDouble* solution,Element* element); 35 35 void UpdateConstraints(FemModel* femmodel); -
issm/trunk-jpl/src/c/analyses/MeltingAnalysis.cpp
r25261 r25317 125 125 _error_("not implemented yet"); 126 126 }/*}}}*/ 127 void MeltingAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/127 void MeltingAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_interp,int control_index){/*{{{*/ 128 128 _error_("Not implemented yet"); 129 129 }/*}}}*/ -
issm/trunk-jpl/src/c/analyses/MeltingAnalysis.h
r24335 r25317 27 27 ElementVector* CreatePVector(Element* element); 28 28 void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element); 29 void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);29 void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_interp,int control_index); 30 30 void InputUpdateFromSolution(IssmDouble* solution,Element* element); 31 31 void UpdateConstraints(FemModel* femmodel); -
issm/trunk-jpl/src/c/analyses/SealevelriseAnalysis.cpp
r25275 r25317 413 413 _error_("not implemented yet"); 414 414 }/*}}}*/ 415 void SealevelriseAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/415 void SealevelriseAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_interp,int control_index){/*{{{*/ 416 416 _error_("Not implemented yet"); 417 417 }/*}}}*/ -
issm/trunk-jpl/src/c/analyses/SealevelriseAnalysis.h
r24335 r25317 27 27 ElementVector* CreatePVector(Element* element); 28 28 void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element); 29 void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);29 void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_interp,int control_index); 30 30 void InputUpdateFromSolution(IssmDouble* solution,Element* element); 31 31 void UpdateConstraints(FemModel* femmodel); -
issm/trunk-jpl/src/c/analyses/SmbAnalysis.cpp
r25209 r25317 507 507 _error_("not implemented yet"); 508 508 }/*}}}*/ 509 void SmbAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/509 void SmbAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_interp,int control_index){/*{{{*/ 510 510 _error_("Not implemented yet"); 511 511 }/*}}}*/ -
issm/trunk-jpl/src/c/analyses/SmbAnalysis.h
r24335 r25317 27 27 ElementVector* CreatePVector(Element* element); 28 28 void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element); 29 void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);29 void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_interp,int control_index); 30 30 void InputUpdateFromSolution(IssmDouble* solution,Element* element); 31 31 void UpdateConstraints(FemModel* femmodel); -
issm/trunk-jpl/src/c/analyses/SmoothAnalysis.cpp
r24335 r25317 206 206 _error_("not implemented yet"); 207 207 }/*}}}*/ 208 void SmoothAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/208 void SmoothAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_interp,int control_index){/*{{{*/ 209 209 _error_("Not implemented yet"); 210 210 }/*}}}*/ -
issm/trunk-jpl/src/c/analyses/SmoothAnalysis.h
r24335 r25317 27 27 ElementVector* CreatePVector(Element* element); 28 28 void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element); 29 void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);29 void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_interp,int control_index); 30 30 void InputUpdateFromSolution(IssmDouble* solution,Element* element); 31 31 void UpdateConstraints(FemModel* femmodel); -
issm/trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp
r25239 r25317 1237 1237 xDelete<int>(doflist); 1238 1238 }/*}}}*/ 1239 void StressbalanceAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/1239 void StressbalanceAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_interp,int control_index){/*{{{*/ 1240 1240 _error_("Not implemented yet"); 1241 1241 }/*}}}*/ -
issm/trunk-jpl/src/c/analyses/StressbalanceAnalysis.h
r24335 r25317 28 28 void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element); 29 29 void GetSolutionFromInputsHoriz(Vector<IssmDouble>* solution,Element* element); 30 void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);30 void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_interp,int control_index); 31 31 void InputUpdateFromSolution(IssmDouble* solution,Element* element); 32 32 void UpdateConstraints(FemModel* femmodel); -
issm/trunk-jpl/src/c/analyses/StressbalanceSIAAnalysis.cpp
r24933 r25317 556 556 xDelete<IssmDouble>(values); 557 557 }/*}}}*/ 558 void StressbalanceSIAAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/558 void StressbalanceSIAAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_interp,int control_index){/*{{{*/ 559 559 _error_("Not implemented yet"); 560 560 }/*}}}*/ -
issm/trunk-jpl/src/c/analyses/StressbalanceSIAAnalysis.h
r24335 r25317 31 31 ElementVector* CreatePVector3D(Element* element); 32 32 void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element); 33 void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);33 void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_interp,int control_index); 34 34 void InputUpdateFromSolution(IssmDouble* solution,Element* element); 35 35 void UpdateConstraints(FemModel* femmodel); -
issm/trunk-jpl/src/c/analyses/StressbalanceVerticalAnalysis.cpp
r25118 r25317 505 505 element->GetSolutionFromInputsOneDof(solution,VzEnum); 506 506 }/*}}}*/ 507 void StressbalanceVerticalAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/507 void StressbalanceVerticalAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_interp,int control_index){/*{{{*/ 508 508 _error_("Not implemented yet"); 509 509 }/*}}}*/ -
issm/trunk-jpl/src/c/analyses/StressbalanceVerticalAnalysis.h
r24335 r25317 33 33 ElementVector* CreatePVectorVolume(Element* element); 34 34 void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element); 35 void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);35 void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_interp,int control_index); 36 36 void InputUpdateFromSolution(IssmDouble* solution,Element* element); 37 37 void UpdateConstraints(FemModel* femmodel); -
issm/trunk-jpl/src/c/analyses/ThermalAnalysis.cpp
r25265 r25317 742 742 element->GetSolutionFromInputsOneDof(solution,TemperatureEnum); 743 743 }/*}}}*/ 744 void ThermalAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/744 void ThermalAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_interp,int control_index){/*{{{*/ 745 745 _error_("Not implemented yet"); 746 746 }/*}}}*/ -
issm/trunk-jpl/src/c/analyses/ThermalAnalysis.h
r25261 r25317 32 32 ElementVector* CreatePVectorVolume(Element* element); 33 33 void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element); 34 void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);34 void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_interp,int control_index); 35 35 void InputUpdateFromSolution(IssmDouble* solution,Element* element); 36 36 void UpdateConstraints(FemModel* femmodel); -
issm/trunk-jpl/src/c/analyses/UzawaPressureAnalysis.cpp
r24429 r25317 182 182 _error_("not implemented yet"); 183 183 }/*}}}*/ 184 void UzawaPressureAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/184 void UzawaPressureAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_interp,int control_index){/*{{{*/ 185 185 _error_("Not implemented yet"); 186 186 }/*}}}*/ -
issm/trunk-jpl/src/c/analyses/UzawaPressureAnalysis.h
r24335 r25317 28 28 void GetM(IssmDouble* M,Element* element,Gauss* gauss); 29 29 void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element); 30 void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);30 void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_interp,int control_index); 31 31 void InputUpdateFromSolution(IssmDouble* solution,Element* element); 32 32 void UpdateConstraints(FemModel* femmodel); -
issm/trunk-jpl/src/c/classes/Elements/Element.cpp
r25242 r25317 1509 1509 int num_controls; 1510 1510 bool isautodiff; 1511 int* N=NULL; 1512 int* M=NULL; 1513 int* interp=NULL; 1511 1514 parameters->FindParam(&num_controls,InversionNumControlParametersEnum); 1512 parameters->FindParam(&isautodiff,AutodiffIsautodiffEnum); 1515 parameters->FindParam(&N,NULL,ControlInputSizeNEnum); 1516 parameters->FindParam(&M,NULL,ControlInputSizeMEnum); 1517 parameters->FindParam(&interp,NULL,ControlInputInterpolationEnum); 1513 1518 1514 1519 /*Get number of vertices*/ 1515 1520 const int NUM_VERTICES = this->GetNumberOfVertices(); 1516 if(isautodiff){ 1517 int* N=NULL; 1518 int* M=NULL; 1519 int start = 0; 1520 parameters->FindParam(&N,NULL,ControlInputSizeNEnum); 1521 parameters->FindParam(&M,NULL,ControlInputSizeMEnum); 1522 if(control_index>0) { 1523 for(int n=0;n<control_index;n++){ 1524 start+=N[n]*M[n]; 1525 } 1526 } 1527 1521 1522 /*Get starting index of gradient for this control*/ 1523 int start = 0; 1524 for(int n=0;n<control_index;n++) start+=N[n]*M[n]; 1525 1526 /*Create index*/ 1527 if(interp[control_index]==P1Enum){ 1528 1528 for(int n=0;n<N[control_index];n++){ 1529 1529 for(int i=0;i<NUM_VERTICES;i++){ 1530 indexing[i+n*NUM_VERTICES]= this->vertices[i]->Sid() + start + n*M[control_index];1530 indexing[i+n*NUM_VERTICES]= start + n*M[control_index] + this->vertices[i]->Sid(); 1531 1531 } 1532 1532 } 1533 1533 } 1534 else if(interp[control_index]==P0Enum){ 1535 for(int n=0;n<N[control_index];n++){ 1536 indexing[n]= start + n*M[control_index] + this->Sid(); 1537 } 1538 } 1534 1539 else{ 1535 int M; 1536 parameters->FindParam(&M,ControlInputSizeMEnum); 1537 /*get gradient indices*/ 1538 for(int i=0;i<NUM_VERTICES;i++){ 1539 indexing[i]=this->vertices[i]->Sid() + (control_index)*M; 1540 } 1541 } 1540 _error_("interpolation not supported"); 1541 } 1542 1543 xDelete<int>(M); 1544 xDelete<int>(N); 1545 xDelete<int>(interp); 1542 1546 } 1543 1547 /*}}}*/ … … 1776 1780 } 1777 1781 this->AddControlInput(input_enum,inputs2,iomodel,values,values_min,values_max,P1Enum,id); 1782 } 1783 else if(M==iomodel->numberofelements && N==1){ 1784 values[0] = vector[this->Sid()]; 1785 values_min[0] = scale*min_vector[this->Sid()]; 1786 values_max[0] = scale*max_vector[this->Sid()]; 1787 this->AddControlInput(input_enum,inputs2,iomodel,values,values_min,values_max,P0Enum,id); 1778 1788 } 1779 1789 -
issm/trunk-jpl/src/c/classes/Elements/Element.h
r25256 r25317 231 231 virtual void ComputeEsaStrainAndVorticity(void)=0; 232 232 virtual void Configure(Elements* elements,Loads* loads,Nodes* nodes,Vertices* vertices,Materials* materials,Parameters* parameters,Inputs2* inputs2in)=0; 233 virtual void ControlInputSetGradient(IssmDouble* gradient,int enum_type,int control_index,int offset,int N,int M)=0;233 virtual void ControlInputSetGradient(IssmDouble* gradient,int enum_type,int control_index,int offset,int M,int N,int interp)=0; 234 234 virtual void ControlInputSetGradient(IssmDouble* gradient,int enum_type,int control_index)=0; 235 virtual void ControlToVectors(Vector<IssmPDouble>* vector_control, Vector<IssmPDouble>* vector_gradient,int control_enum )=0;235 virtual void ControlToVectors(Vector<IssmPDouble>* vector_control, Vector<IssmPDouble>* vector_gradient,int control_enum,int control_interp)=0; 236 236 virtual void CreateDistanceInputFromSegmentlist(IssmDouble* distances,int distanceenum){_error_("not implemented yet");}; 237 237 virtual void CreateInputTimeAverage(int transientinput_enum,int averagedinput_enum,IssmDouble init_time,IssmDouble end_time,int averaging_method){_error_("not implemented yet "<<this->ObjectEnum());}; … … 335 335 virtual void SetElementInput(Inputs2* inputs2,int enum_in,IssmDouble values){_error_("not implemented yet");}; 336 336 virtual void SetElementInput(Inputs2* inputs2,int numindices,int* indices,IssmDouble* values,int enum_in){_error_("not implemented yet");}; 337 virtual void SetControlInputsFromVector(IssmDouble* vector,int control_enum,int control_index,int offset,int N,int M)=0;337 virtual void SetControlInputsFromVector(IssmDouble* vector,int control_enum,int control_index,int offset,int M,int N)=0; 338 338 virtual void SetControlInputsFromVector(IssmDouble* vector,int control_enum,int control_index)=0; 339 339 virtual void SetCurrentConfiguration(Elements* elements,Loads* loads,Nodes* nodes,Materials* materials,Parameters* parameters)=0; -
issm/trunk-jpl/src/c/classes/Elements/Penta.cpp
r25256 r25317 899 899 } 900 900 /*}}}*/ 901 void Penta::ControlInputSetGradient(IssmDouble* gradient,int enum_type,int control_index,int offset,int N,int M){/*{{{*/ 902 903 if(enum_type==MaterialsRheologyBbarEnum) enum_type = MaterialsRheologyBEnum; 904 if(enum_type==DamageDbarEnum) enum_type = DamageDEnum; 905 906 _error_("not implemented"); 907 int vertexpidlist[NUMVERTICES]; 908 IssmDouble grad_list[NUMVERTICES]; 909 Input2* grad_input=NULL; 910 Input2* input=NULL; 911 912 if(enum_type==MaterialsRheologyBbarEnum){ 913 input=this->GetInput2(MaterialsRheologyBEnum); 914 } 915 else if(enum_type==DamageDbarEnum){ 916 input=this->GetInput2(DamageDEnum); 917 } 918 else{ 919 input=this->GetInput2(enum_type); 920 } 921 if (!input) _error_("Input " << EnumToStringx(enum_type) << " not found"); 922 if(input->ObjectEnum()!=ControlInput2Enum) _error_("Input " << EnumToStringx(enum_type) << " is not a ControlInput"); 923 924 GradientIndexing(&vertexpidlist[0],control_index); 925 926 //for(int i=0;i<NUMVERTICES;i++) grad_list[i]=gradient[vertexpidlist[i]]; 927 //grad_input=new PentaInput(GradientEnum,grad_list,P1Enum); 928 //((ControlInput*)input)->SetGradient(grad_input); 929 _error_("not implemented"); 901 void Penta::ControlInputSetGradient(IssmDouble* gradient,int control_enum,int control_index,int offset,int M,int N,int interp){/*{{{*/ 902 903 IssmDouble values[NUMVERTICES]; 904 int lidlist[NUMVERTICES]; 905 int idlist[NUMVERTICES]; 906 907 if(control_enum==MaterialsRheologyBbarEnum) control_enum = MaterialsRheologyBEnum; 908 if(control_enum==DamageDbarEnum) control_enum = DamageDEnum; 909 910 ElementInput2* input=this->inputs2->GetControlInput2Data(control_enum,"gradient"); _assert_(input); 911 this->GetVerticesLidList(&lidlist[0]); 912 GradientIndexing(&idlist[0],control_index); 913 914 /*Get values on vertices*/ 915 if(input->ObjectEnum()==PentaInput2Enum && input->GetInputInterpolationType()==P1Enum){ 916 _assert_(N==1); 917 for(int i=0;i<NUMVERTICES;i++){ 918 values[i] = gradient[idlist[i]]; 919 } 920 input->SetInput(P1Enum,NUMVERTICES,&lidlist[0],&values[0]); 921 } 922 else if(input->ObjectEnum()==PentaInput2Enum && input->GetInputInterpolationType()==P0Enum){ 923 _assert_(N==1); 924 input->SetInput(P0Enum,this->lid,gradient[idlist[0]]); 925 } 926 else if(input->ObjectEnum()==TransientInput2Enum){ 927 for(int n=0;n<N;n++){ 928 _error_("not implemented"); 929 //Input* new_input = new PentaInput(control_enum,gradient,P1Enum); 930 //controlinput->SetInput(new_input,n); 931 //controlinput->Configure(parameters); 932 } 933 } 934 else _error_("Type not supported"); 930 935 931 936 } … … 946 951 this->inputs2->SetTriaControlInputGradient(enum_type,P1Enum,NUMVERTICES,&vertexlids[0],&grad_list[0]); 947 952 }/*}}}*/ 948 void Penta::ControlToVectors(Vector<IssmPDouble>* vector_control, Vector<IssmPDouble>* vector_gradient,int control_enum ){/*{{{*/953 void Penta::ControlToVectors(Vector<IssmPDouble>* vector_control, Vector<IssmPDouble>* vector_gradient,int control_enum,int control_interp){/*{{{*/ 949 954 950 955 int sidlist[NUMVERTICES]; … … 955 960 IssmDouble value,gradient; 956 961 962 /*Get relevant inputs*/ 957 963 if(control_enum==MaterialsRheologyBbarEnum) control_enum = MaterialsRheologyBEnum; 958 964 if(control_enum==DamageDbarEnum) control_enum = DamageDEnum; 959 960 this->GetVerticesConnectivityList(&connectivity[0]);961 this->GetVerticesSidList(&sidlist[0]);962 this->GetVerticesLidList(&lidlist[0]);963 964 965 ElementInput2* control_value = this->inputs2->GetControlInput2Data(control_enum,"value"); _assert_(control_value); 965 966 ElementInput2* control_gradient = this->inputs2->GetControlInput2Data(control_enum,"gradient"); _assert_(control_gradient); 966 control_value->Serve(NUMVERTICES,&lidlist[0]); 967 control_gradient->Serve(NUMVERTICES,&lidlist[0]); 968 969 GaussPenta* gauss=new GaussPenta(); 970 for (int iv=0;iv<NUMVERTICES;iv++){ 971 gauss->GaussVertex(iv); 972 973 control_value->GetInputValue(&value,gauss); 974 control_gradient->GetInputValue(&gradient,gauss); 975 976 values[iv] = reCast<IssmPDouble>(value)/reCast<IssmPDouble>(connectivity[iv]); 977 gradients[iv] = reCast<IssmPDouble>(gradient)/reCast<IssmPDouble>(connectivity[iv]); 978 } 979 delete gauss; 980 981 vector_control->SetValues(NUMVERTICES,&sidlist[0],&values[0],ADD_VAL); 982 vector_gradient->SetValues(NUMVERTICES,&sidlist[0],&gradients[0],ADD_VAL); 967 968 if(control_interp==P1Enum){ 969 _assert_(control_value->GetInputInterpolationType()==P1Enum); 970 _assert_(control_gradient->GetInputInterpolationType()==P1Enum); 971 972 this->GetVerticesConnectivityList(&connectivity[0]); 973 this->GetVerticesSidList(&sidlist[0]); 974 this->GetVerticesLidList(&lidlist[0]); 975 976 control_value->Serve(NUMVERTICES,&lidlist[0]); 977 control_gradient->Serve(NUMVERTICES,&lidlist[0]); 978 979 GaussPenta* gauss=new GaussPenta(); 980 for (int iv=0;iv<NUMVERTICES;iv++){ 981 gauss->GaussVertex(iv); 982 983 control_value->GetInputValue(&value,gauss); 984 control_gradient->GetInputValue(&gradient,gauss); 985 986 values[iv] = reCast<IssmPDouble>(value)/reCast<IssmPDouble>(connectivity[iv]); 987 gradients[iv] = reCast<IssmPDouble>(gradient)/reCast<IssmPDouble>(connectivity[iv]); 988 } 989 delete gauss; 990 991 vector_control->SetValues(NUMVERTICES,&sidlist[0],&values[0],ADD_VAL); 992 vector_gradient->SetValues(NUMVERTICES,&sidlist[0],&gradients[0],ADD_VAL); 993 } 994 else if(control_interp==P0Enum){ 995 _assert_(control_value->GetInputInterpolationType()==P0Enum); 996 _assert_(control_gradient->GetInputInterpolationType()==P0Enum); 997 998 control_value->Serve(1,&this->lid); 999 control_gradient->Serve(1,&this->lid); 1000 1001 vector_control->SetValue(this->sid,control_value->element_values[0],ADD_VAL); 1002 vector_gradient->SetValue(this->sid,control_gradient->element_values[0],ADD_VAL); 1003 } 1004 else{ 1005 _error_("not supported"); 1006 } 1007 983 1008 }/*}}}*/ 984 1009 void Penta::CreateDistanceInputFromSegmentlist(IssmDouble* distances,int distanceenum){/*{{{*/ … … 1822 1847 void Penta::GetVectorFromControlInputs(Vector<IssmDouble>* vector,int control_enum,int control_index,const char* data){/*{{{*/ 1823 1848 1824 /*Get out if this is not an element input*/ 1825 if(!IsInputEnum(control_enum)) _error_("Enum "<<EnumToStringx(control_enum)<<" is not in IsInput"); 1826 1827 /*Prepare index list*/ 1828 int idlist[NUMVERTICES]; 1829 GradientIndexing(&idlist[0],control_index); 1830 1831 /*Get input (either in element or material)*/ 1849 _error_("NOT NEEDED ANYMORE"); 1850 /*Get input*/ 1832 1851 if(control_enum==MaterialsRheologyBbarEnum) control_enum=MaterialsRheologyBEnum; 1833 1852 ElementInput2* input=this->inputs2->GetControlInput2Data(control_enum,data); _assert_(input); 1834 1853 1835 /*Intermediaries*/ 1836 int numindices; 1837 int indices[NUMVERTICES]; 1838 1839 /*Check interpolation*/ 1840 int interpolation = input->GetInterpolation(); 1841 switch(interpolation){ 1842 case P1Enum: 1843 numindices = NUMVERTICES; 1844 for(int i=0;i<NUMVERTICES;i++) indices[i] = vertices[i]->lid; 1845 input->Serve(numindices,&indices[0]); 1846 break; 1847 default: _error_("interpolation "<<EnumToStringx(interpolation)<<" not supported"); 1848 } 1849 1850 /* Start looping on the number of vertices: */ 1851 IssmDouble values[NUMVERTICES]; 1852 Gauss*gauss=this->NewGauss(); 1853 for(int iv=0;iv<NUMVERTICES;iv++){ 1854 gauss->GaussVertex(iv); 1855 input->GetInputValue(&values[iv],gauss); 1856 } 1857 delete gauss; 1858 1859 vector->SetValues(NUMVERTICES,idlist,&values[0],INS_VAL); 1860 } 1861 /*}}}*/ 1862 void Penta::GetVectorFromControlInputs(Vector<IssmDouble>* vector,int control_enum,int control_index,const char* data,int offset){/*{{{*/ 1863 1864 int* idlist = NULL; 1865 IssmDouble* values = NULL; 1866 1867 /*Get input*/ 1868 ElementInput2* input=this->inputs2->GetControlInput2Data(control_enum,data); _assert_(input); 1854 /*Lid list once for all*/ 1855 int lidlist[NUMVERTICES]; 1856 for(int i=0;i<NUMVERTICES;i++) lidlist[i] = vertices[i]->lid; 1869 1857 1870 1858 /*Check what input we are dealing with*/ 1871 1859 switch(input->ObjectEnum()){ 1872 1860 case PentaInput2Enum: 1873 { 1874 PentaInput2* pentainput = xDynamicCast<PentaInput2*>(input); 1875 if(pentainput->GetInputInterpolationType()!=P1Enum) _error_("not supported yet"); 1876 1877 /*Create list of indices and values for global vector*/ 1878 idlist = xNew<int>(NUMVERTICES); 1879 values = xNew<IssmDouble>(NUMVERTICES); 1880 GradientIndexing(&idlist[0],control_index); 1881 for(int i=0;i<NUMVERTICES;i++){ 1882 values[i] = pentainput->element_values[i]; 1861 { 1862 IssmDouble values[NUMVERTICES]; 1863 int idlist[NUMVERTICES]; 1864 1865 PentaInput2* triainput = xDynamicCast<PentaInput2*>(input); 1866 1867 /*Create list of indices and values for global vector*/ 1868 GradientIndexing(&idlist[0],control_index); 1869 1870 if(triainput->GetInputInterpolationType()==P1Enum){ 1871 input->Serve(NUMVERTICES,&lidlist[0]); 1872 for(int i=0;i<NUMVERTICES;i++) values[i] = triainput->element_values[i]; 1873 vector->SetValues(NUMVERTICES,idlist,values,INS_VAL); 1874 } 1875 else if(triainput->GetInputInterpolationType()==P0Enum){ 1876 input->Serve(1,&this->lid); 1877 vector->SetValue(idlist[0],triainput->element_values[0],INS_VAL); 1878 } 1879 else{ 1880 _error_("not supported yet"); 1881 } 1882 break; 1883 } 1884 1885 case TransientInputEnum: 1886 { 1887 TransientInput2* transientinput = xDynamicCast<TransientInput2*>(input); 1888 int N = transientinput->numtimesteps; 1889 int* M = NULL; 1890 parameters->FindParam(&M,NULL,ControlInputSizeMEnum); 1891 int* idlist = xNew<int>(NUMVERTICES*N); 1892 IssmDouble* values = xNew<IssmDouble>(NUMVERTICES*N); 1893 for(int t=0;t<transientinput->numtimesteps;t++) { 1894 IssmDouble time = transientinput->GetTimeByOffset(t); 1895 _error_("not implemented"); 1896 //PentaInput* timeinput = xDynamicCast<PentaInput*>(transientinput->GetTimeInput(time)); 1897 //if(timeinput->interpolation_type!=P1Enum) _error_("not supported yet"); 1898 //input->Serve(NUMVERTICES,&lidlist[0]); 1899 ///*Create list of indices and values for global vector*/ 1900 //for(int i=0;i<NUMVERTICES;i++){ 1901 // idlist[N*i+t] = offset + this->vertices[i]->Sid()+t*M[control_index]; 1902 // values[N*i+t] = timeinput->values[i]; 1903 //} 1883 1904 } 1905 vector->SetValues(NUMVERTICES*transientinput->numtimesteps,idlist,values,INS_VAL); 1906 xDelete<int>(M); 1907 xDelete<int>(idlist); 1908 xDelete<IssmDouble>(values); 1909 break; 1910 } 1911 default: _error_("input "<<EnumToStringx(input->ObjectEnum())<<" not supported yet"); 1912 } 1913 } 1914 /*}}}*/ 1915 void Penta::GetVectorFromControlInputs(Vector<IssmDouble>* vector,int control_enum,int control_index,const char* data,int offset){/*{{{*/ 1916 1917 /*Get input*/ 1918 if(control_enum==MaterialsRheologyBbarEnum) control_enum=MaterialsRheologyBEnum; 1919 ElementInput2* input=this->inputs2->GetControlInput2Data(control_enum,data); _assert_(input); 1920 1921 /*Lid list once for all*/ 1922 int lidlist[NUMVERTICES]; 1923 for(int i=0;i<NUMVERTICES;i++) lidlist[i] = vertices[i]->lid; 1924 1925 /*Check what input we are dealing with*/ 1926 switch(input->ObjectEnum()){ 1927 case PentaInput2Enum: 1928 { 1929 IssmDouble values[NUMVERTICES]; 1930 int idlist[NUMVERTICES]; 1931 1932 PentaInput2* triainput = xDynamicCast<PentaInput2*>(input); 1933 1934 /*Create list of indices and values for global vector*/ 1935 GradientIndexing(&idlist[0],control_index); 1936 1937 if(triainput->GetInputInterpolationType()==P1Enum){ 1938 input->Serve(NUMVERTICES,&lidlist[0]); 1939 for(int i=0;i<NUMVERTICES;i++) values[i] = triainput->element_values[i]; 1884 1940 vector->SetValues(NUMVERTICES,idlist,values,INS_VAL); 1941 } 1942 else if(triainput->GetInputInterpolationType()==P0Enum){ 1943 input->Serve(1,&this->lid); 1944 vector->SetValue(idlist[0],triainput->element_values[0],INS_VAL); 1945 } 1946 else{ 1947 _error_("not supported yet"); 1948 } 1949 break; 1950 } 1951 1952 case TransientInputEnum: 1953 { 1954 TransientInput2* transientinput = xDynamicCast<TransientInput2*>(input); 1955 int N = transientinput->numtimesteps; 1956 int* M = NULL; 1957 parameters->FindParam(&M,NULL,ControlInputSizeMEnum); 1958 int* idlist = xNew<int>(NUMVERTICES*N); 1959 IssmDouble* values = xNew<IssmDouble>(NUMVERTICES*N); 1960 for(int t=0;t<transientinput->numtimesteps;t++) { 1961 IssmDouble time = transientinput->GetTimeByOffset(t); 1962 _error_("not implemented"); 1963 //PentaInput* timeinput = xDynamicCast<PentaInput*>(transientinput->GetTimeInput(time)); 1964 //if(timeinput->interpolation_type!=P1Enum) _error_("not supported yet"); 1965 //input->Serve(NUMVERTICES,&lidlist[0]); 1966 ///*Create list of indices and values for global vector*/ 1967 //for(int i=0;i<NUMVERTICES;i++){ 1968 // idlist[N*i+t] = offset + this->vertices[i]->Sid()+t*M[control_index]; 1969 // values[N*i+t] = timeinput->values[i]; 1970 //} 1971 } 1972 vector->SetValues(NUMVERTICES*transientinput->numtimesteps,idlist,values,INS_VAL); 1973 xDelete<int>(M); 1974 xDelete<int>(idlist); 1975 xDelete<IssmDouble>(values); 1885 1976 break; 1886 } 1887 1888 case TransientInputEnum: 1889 { 1890 _error_("not implemented (see Tria)"); 1891 break; 1892 } 1893 default: _error_("input "<<input->ObjectEnum()<<" not supported yet"); 1894 1895 } 1896 xDelete<int>(idlist); 1897 xDelete<IssmDouble>(values); 1898 } 1899 /*}}}*/ 1977 } 1978 default: _error_("input "<<EnumToStringx(input->ObjectEnum())<<" not supported yet"); 1979 } 1980 }/*}}}*/ 1900 1981 void Penta::GetVerticesCoordinatesBase(IssmDouble** pxyz_list){/*{{{*/ 1901 1982 … … 3303 3384 } 3304 3385 /*}}}*/ 3305 void Penta::SetControlInputsFromVector(IssmDouble* vector,int control_enum,int control_index,int offset, int N, int M){/*{{{*/3386 void Penta::SetControlInputsFromVector(IssmDouble* vector,int control_enum,int control_index,int offset, int M, int N){/*{{{*/ 3306 3387 3307 3388 IssmDouble values[NUMVERTICES]; 3308 int vertexpidlist[NUMVERTICES],control_init; 3389 int lidlist[NUMVERTICES]; 3390 int idlist[NUMVERTICES],control_init; 3309 3391 3310 3392 /*Specific case for depth averaged quantities*/ … … 3319 3401 } 3320 3402 3403 /*Get Domain type*/ 3404 int domaintype; 3405 parameters->FindParam(&domaintype,DomainTypeEnum); 3406 3407 /*Specific case for depth averaged quantities*/ 3408 if(domaintype==Domain2DverticalEnum){ 3409 if(control_enum==MaterialsRheologyBbarEnum){ 3410 control_enum=MaterialsRheologyBEnum; 3411 if(!IsOnBase()) return; 3412 } 3413 if(control_enum==DamageDbarEnum){ 3414 control_enum=DamageDEnum; 3415 if(!IsOnBase()) return; 3416 } 3417 } 3418 3321 3419 /*Get out if this is not an element input*/ 3322 3420 if(!IsInputEnum(control_enum)) return; 3323 3421 3324 3422 /*Prepare index list*/ 3325 GradientIndexing(&vertexpidlist[0],control_index); 3423 ElementInput2* input=this->inputs2->GetControlInput2Data(control_enum,"value"); _assert_(input); 3424 this->GetVerticesLidList(&lidlist[0]); 3425 GradientIndexing(&idlist[0],control_index); 3326 3426 3327 3427 /*Get values on vertices*/ 3328 for(int i=0;i<NUMVERTICES;i++){ 3329 values[i]=vector[vertexpidlist[i]]; 3330 } 3331 _error_("not implemented"); 3332 //Input* new_input = new PentaInput(control_enum,values,P1Enum); 3333 Input2* input=(Input2*)this->GetInput2(control_enum); _assert_(input); 3334 if(input->ObjectEnum()!=ControlInputEnum){ 3335 _error_("input " << EnumToStringx(control_enum) << " is not a ControlInput"); 3336 } 3337 3338 //((ControlInput*)input)->SetInput(new_input); 3339 3428 if(input->ObjectEnum()==PentaInput2Enum && input->GetInputInterpolationType()==P1Enum){ 3429 _assert_(N==1); 3430 for(int i=0;i<NUMVERTICES;i++){ 3431 values[i] = vector[idlist[i]]; 3432 } 3433 input->SetInput(P1Enum,NUMVERTICES,&lidlist[0],&values[0]); 3434 } 3435 else if(input->ObjectEnum()==PentaInput2Enum && input->GetInputInterpolationType()==P0Enum){ 3436 _assert_(N==1); 3437 input->SetInput(P0Enum,this->lid,vector[idlist[0]]); 3438 } 3439 else if(input->ObjectEnum()==TransientInput2Enum){ 3440 for(int n=0;n<N;n++){ 3441 _error_("not implemented"); 3442 //Input* new_input = new PentaInput(control_enum,values,P1Enum); 3443 //controlinput->SetInput(new_input,n); 3444 //controlinput->Configure(parameters); 3445 } 3446 } 3447 else _error_("Type not supported"); 3448 3449 /*Extrude depending on the control*/ 3340 3450 if(control_init==MaterialsRheologyBbarEnum){ 3341 this-> InputExtrude(control_enum,-1);3451 this->ControlInputExtrude(control_enum,-1); 3342 3452 } 3343 3453 if(control_init==DamageDbarEnum){ 3344 this-> InputExtrude(control_enum,-1);3454 this->ControlInputExtrude(control_enum,-1); 3345 3455 } 3346 3456 } 3347 3457 /*}}}*/ 3348 3458 void Penta::SetControlInputsFromVector(IssmDouble* vector,int control_enum,int control_index){/*{{{*/ 3459 3460 _error_("not needed anymore?"); 3349 3461 3350 3462 IssmDouble values[NUMVERTICES]; -
issm/trunk-jpl/src/c/classes/Elements/Penta.h
r25256 r25317 63 63 void ComputeStressTensor(); 64 64 void Configure(Elements* elements,Loads* loads,Nodes* nodes,Vertices* vertices,Materials* materials,Parameters* parameters,Inputs2* inputs2in); 65 void ControlInputSetGradient(IssmDouble* gradient,int enum_type,int control_index,int offset,int N,int M);65 void ControlInputSetGradient(IssmDouble* gradient,int enum_type,int control_index,int offset,int M,int N,int interp); 66 66 void ControlInputSetGradient(IssmDouble* gradient,int enum_type,int control_index); 67 void ControlToVectors(Vector<IssmPDouble>* vector_control, Vector<IssmPDouble>* vector_gradient,int control_enum );67 void ControlToVectors(Vector<IssmPDouble>* vector_control, Vector<IssmPDouble>* vector_gradient,int control_enum,int control_interp); 68 68 void CreateDistanceInputFromSegmentlist(IssmDouble* distances,int distanceenum); 69 69 ElementMatrix* CreateBasalMassMatrix(void); … … 167 167 void SetElementInput(Inputs2* inputs2,int enum_in,IssmDouble values); 168 168 void SetElementInput(Inputs2* inputs2,int numindices,int* indices,IssmDouble* values,int enum_in); 169 void SetControlInputsFromVector(IssmDouble* vector,int control_enum,int control_index,int offset, int N,int M);169 void SetControlInputsFromVector(IssmDouble* vector,int control_enum,int control_index,int offset, int M,int N); 170 170 void SetControlInputsFromVector(IssmDouble* vector,int control_enum,int control_index); 171 171 void SetCurrentConfiguration(Elements* elements,Loads* loads,Nodes* nodes,Materials* materials,Parameters* parameters); -
issm/trunk-jpl/src/c/classes/Elements/Seg.h
r25256 r25317 50 50 void ComputeStressTensor(){_error_("not implemented yet");}; 51 51 void Configure(Elements* elements,Loads* loads,Nodes* nodesin,Vertices* verticesin,Materials* materials,Parameters* parameters,Inputs2* inputs2in){_error_("not implemented yet");}; 52 void ControlInputSetGradient(IssmDouble* gradient,int enum_type,int control_index,int offset,int N,int M){_error_("not implemented yet");};52 void ControlInputSetGradient(IssmDouble* gradient,int enum_type,int control_index,int offset,int M,int N,int interp){_error_("not implemented yet");}; 53 53 void ControlInputSetGradient(IssmDouble* gradient,int enum_type,int control_index){_error_("not implemented yet");}; 54 void ControlToVectors(Vector<IssmPDouble>* vector_control, Vector<IssmPDouble>* vector_gradient,int control_enum ){_error_("not implemented yet");};54 void ControlToVectors(Vector<IssmPDouble>* vector_control, Vector<IssmPDouble>* vector_gradient,int control_enum,int control_interp){_error_("not implemented yet");}; 55 55 void ElementResponse(IssmDouble* presponse,int response_enum){_error_("not implemented yet");}; 56 56 void ElementSizes(IssmDouble* hx,IssmDouble* hy,IssmDouble* hz){_error_("not implemented yet");}; … … 134 134 void ResetFSBasalBoundaryCondition(void){_error_("not implemented yet");}; 135 135 void ResetHooks(){_error_("not implemented yet");}; 136 void SetControlInputsFromVector(IssmDouble* vector,int control_enum,int control_index,int offset,int N,int M){_error_("not implemented yet");};136 void SetControlInputsFromVector(IssmDouble* vector,int control_enum,int control_index,int offset,int M,int N){_error_("not implemented yet");}; 137 137 void SetControlInputsFromVector(IssmDouble* vector,int control_enum,int control_index){_error_("not implemented yet");}; 138 138 void SetCurrentConfiguration(Elements* elements,Loads* loads,Nodes* nodes,Materials* materials,Parameters* parameters){_error_("not implemented yet");}; -
issm/trunk-jpl/src/c/classes/Elements/Tetra.h
r25256 r25317 48 48 void ComputeEsaStrainAndVorticity(){_error_("not implemented yet!");}; 49 49 void Configure(Elements* elements,Loads* loads,Nodes* nodesin,Vertices* verticesin,Materials* materials,Parameters* parameters,Inputs2* inputs2in); 50 void ControlInputSetGradient(IssmDouble* gradient,int enum_type,int control_index,int offset,int N,int M){_error_("not implemented yet");};50 void ControlInputSetGradient(IssmDouble* gradient,int enum_type,int control_index,int offset,int M,int N,int interp){_error_("not implemented yet");}; 51 51 void ControlInputSetGradient(IssmDouble* gradient,int enum_type,int control_index){_error_("not implemented yet");}; 52 void ControlToVectors(Vector<IssmPDouble>* vector_control, Vector<IssmPDouble>* vector_gradient,int control_enum ){_error_("not implemented yet");};52 void ControlToVectors(Vector<IssmPDouble>* vector_control, Vector<IssmPDouble>* vector_gradient,int control_enum,int control_interp){_error_("not implemented yet");}; 53 53 IssmDouble DragCoefficientAbsGradient(void){_error_("not implemented yet");}; 54 54 void ElementResponse(IssmDouble* presponse,int response_enum){_error_("not implemented yet");}; … … 140 140 void ResetHooks(); 141 141 void ReduceMatrices(ElementMatrix* Ke,ElementVector* pe); 142 void SetControlInputsFromVector(IssmDouble* vector,int control_enum,int control_index,int offset,int N, int M){_error_("not implemented yet");};142 void SetControlInputsFromVector(IssmDouble* vector,int control_enum,int control_index,int offset,int M, int N){_error_("not implemented yet");}; 143 143 void SetControlInputsFromVector(IssmDouble* vector,int control_enum,int control_index){_error_("not implemented yet");}; 144 144 void SetCurrentConfiguration(Elements* elements,Loads* loads,Nodes* nodes,Materials* materials,Parameters* parameters); -
issm/trunk-jpl/src/c/classes/Elements/Tria.cpp
r25293 r25317 222 222 /*Call inputs method*/ 223 223 switch(interpolation_enum){ 224 case P0Enum: 225 inputs2->SetTriaControlInput(input_enum,TriaInput2Enum,interpolation_enum,id,1,&this->lid,values,values_min,values_max); 226 break; 224 227 case P1Enum: 225 228 inputs2->SetTriaControlInput(input_enum,TriaInput2Enum,interpolation_enum,id,NUMVERTICES,vertexlids,values,values_min,values_max); … … 1097 1100 this->inputs2=inputs2in; 1098 1101 }/*}}}*/ 1099 void Tria::ControlInputSetGradient(IssmDouble* gradient,int enum_type,int control_index,int offset,int N, int M){/*{{{*/ 1100 1102 void Tria::ControlInputSetGradient(IssmDouble* gradient,int control_enum,int control_index,int offset,int M,int N,int interp){/*{{{*/ 1103 1104 IssmDouble values[NUMVERTICES]; 1105 int lidlist[NUMVERTICES]; 1101 1106 int idlist[NUMVERTICES]; 1102 int vertexlids[NUMVERTICES]; 1103 int gradidlist[NUMVERTICES]; 1104 IssmDouble grad_list[NUMVERTICES]; 1105 1106 GradientIndexing(&gradidlist[0],control_index); 1107 for(int i=0;i<NUMVERTICES;i++) vertexlids[i]=this->vertices[i]->lid; 1108 1109 if(N==1){ 1110 this->inputs2->SetTriaControlInputGradient(enum_type,P1Enum,NUMVERTICES,&vertexlids[0],&grad_list[0]); 1111 } 1112 else{ 1107 1108 ElementInput2* input=this->inputs2->GetControlInput2Data(control_enum,"gradient"); _assert_(input); 1109 this->GetVerticesLidList(&lidlist[0]); 1110 GradientIndexing(&idlist[0],control_index); 1111 1112 /*Get values on vertices*/ 1113 if(input->ObjectEnum()==TriaInput2Enum && input->GetInputInterpolationType()==P1Enum){ 1114 _assert_(N==1); 1115 for(int i=0;i<NUMVERTICES;i++){ 1116 values[i] = gradient[idlist[i]]; 1117 } 1118 input->SetInput(P1Enum,NUMVERTICES,&lidlist[0],&values[0]); 1119 } 1120 else if(input->ObjectEnum()==TriaInput2Enum && input->GetInputInterpolationType()==P0Enum){ 1121 _assert_(N==1); 1122 input->SetInput(P0Enum,this->lid,gradient[idlist[0]]); 1123 } 1124 else if(input->ObjectEnum()==TransientInput2Enum){ 1113 1125 for(int n=0;n<N;n++){ 1114 for(int i=0;i<NUMVERTICES;i++){1115 idlist[i] = offset + this->vertices[i]->Sid()+n*M;1116 grad_list[i]=gradient[idlist[i]];1117 }1118 this->inputs2->SetTriaControlInputGradient(enum_type,P1Enum,NUMVERTICES,&vertexlids[0],&grad_list[0],n);1119 1120 }1126 _error_("not implemented"); 1127 //Input* new_input = new TriaInput(control_enum,gradient,P1Enum); 1128 //controlinput->SetInput(new_input,n); 1129 //controlinput->Configure(parameters); 1130 } 1131 } 1132 else _error_("Type not supported"); 1121 1133 1122 1134 }/*}}}*/ 1123 1135 void Tria::ControlInputSetGradient(IssmDouble* gradient,int enum_type,int control_index){/*{{{*/ 1136 _error_("NOT NEEDED ANYMORE (remove)"); 1124 1137 1125 1138 int idlist[NUMVERTICES]; … … 1134 1147 1135 1148 }/*}}}*/ 1136 void Tria::ControlToVectors(Vector<IssmPDouble>* vector_control, Vector<IssmPDouble>* vector_gradient,int control_enum ){/*{{{*/1149 void Tria::ControlToVectors(Vector<IssmPDouble>* vector_control, Vector<IssmPDouble>* vector_gradient,int control_enum,int control_interp){/*{{{*/ 1137 1150 1138 1151 int sidlist[NUMVERTICES]; … … 1143 1156 IssmDouble value,gradient; 1144 1157 1145 this->GetVerticesConnectivityList(&connectivity[0]); 1146 this->GetVerticesSidList(&sidlist[0]); 1147 this->GetVerticesLidList(&lidlist[0]); 1148 1158 /*Get relevant inputs*/ 1149 1159 ElementInput2* control_value = this->inputs2->GetControlInput2Data(control_enum,"value"); _assert_(control_value); 1150 1160 ElementInput2* control_gradient = this->inputs2->GetControlInput2Data(control_enum,"gradient"); _assert_(control_gradient); 1151 control_value->Serve(NUMVERTICES,&lidlist[0]); 1152 control_gradient->Serve(NUMVERTICES,&lidlist[0]); 1153 1154 GaussTria* gauss=new GaussTria(); 1155 for (int iv=0;iv<NUMVERTICES;iv++){ 1156 gauss->GaussVertex(iv); 1157 1158 control_value->GetInputValue(&value,gauss); 1159 control_gradient->GetInputValue(&gradient,gauss); 1160 1161 values[iv] = reCast<IssmPDouble>(value)/reCast<IssmPDouble>(connectivity[iv]); 1162 gradients[iv] = reCast<IssmPDouble>(gradient)/reCast<IssmPDouble>(connectivity[iv]); 1163 } 1164 delete gauss; 1165 1166 vector_control->SetValues(NUMVERTICES,&sidlist[0],&values[0],ADD_VAL); 1167 vector_gradient->SetValues(NUMVERTICES,&sidlist[0],&gradients[0],ADD_VAL); 1161 1162 if(control_interp==P1Enum){ 1163 _assert_(control_value->GetInputInterpolationType()==P1Enum); 1164 _assert_(control_gradient->GetInputInterpolationType()==P1Enum); 1165 1166 this->GetVerticesConnectivityList(&connectivity[0]); 1167 this->GetVerticesSidList(&sidlist[0]); 1168 this->GetVerticesLidList(&lidlist[0]); 1169 1170 control_value->Serve(NUMVERTICES,&lidlist[0]); 1171 control_gradient->Serve(NUMVERTICES,&lidlist[0]); 1172 1173 GaussTria* gauss=new GaussTria(); 1174 for (int iv=0;iv<NUMVERTICES;iv++){ 1175 gauss->GaussVertex(iv); 1176 1177 control_value->GetInputValue(&value,gauss); 1178 control_gradient->GetInputValue(&gradient,gauss); 1179 1180 values[iv] = reCast<IssmPDouble>(value)/reCast<IssmPDouble>(connectivity[iv]); 1181 gradients[iv] = reCast<IssmPDouble>(gradient)/reCast<IssmPDouble>(connectivity[iv]); 1182 } 1183 delete gauss; 1184 1185 vector_control->SetValues(NUMVERTICES,&sidlist[0],&values[0],ADD_VAL); 1186 vector_gradient->SetValues(NUMVERTICES,&sidlist[0],&gradients[0],ADD_VAL); 1187 } 1188 else if(control_interp==P0Enum){ 1189 _assert_(control_value->GetInputInterpolationType()==P0Enum); 1190 _assert_(control_gradient->GetInputInterpolationType()==P0Enum); 1191 1192 control_value->Serve(1,&this->lid); 1193 control_gradient->Serve(1,&this->lid); 1194 1195 vector_control->SetValue(this->sid,control_value->element_values[0],ADD_VAL); 1196 vector_gradient->SetValue(this->sid,control_gradient->element_values[0],ADD_VAL); 1197 } 1198 else{ 1199 _error_("not supported"); 1200 } 1168 1201 1169 1202 }/*}}}*/ … … 2390 2423 void Tria::GetVectorFromControlInputs(Vector<IssmDouble>* vector,int control_enum,int control_index,const char* data){/*{{{*/ 2391 2424 2425 _error_("DO WE NEED THIS FUNCTION?? REALLY?? see below"); 2426 2392 2427 /*Get out if this is not an element input*/ 2393 2428 if(!IsInputEnum(control_enum)) _error_("Enum "<<EnumToStringx(control_enum)<<" is not in IsInput"); … … 2407 2442 int interpolation = input->GetInterpolation(); 2408 2443 switch(interpolation){ 2444 case P0Enum: 2445 input->Serve(1,&this->lid); 2446 break; 2409 2447 case P1Enum: 2410 2448 numindices = NUMVERTICES; … … 2449 2487 2450 2488 TriaInput2* triainput = xDynamicCast<TriaInput2*>(input); 2451 if(triainput->GetInputInterpolationType()!=P1Enum) _error_("not supported yet");2452 input->Serve(NUMVERTICES,&lidlist[0]);2453 2489 2454 2490 /*Create list of indices and values for global vector*/ 2455 2491 GradientIndexing(&idlist[0],control_index); 2456 for(int i=0;i<NUMVERTICES;i++) values[i] = triainput->element_values[i]; 2457 vector->SetValues(NUMVERTICES,idlist,values,INS_VAL); 2492 2493 if(triainput->GetInputInterpolationType()==P1Enum){ 2494 input->Serve(NUMVERTICES,&lidlist[0]); 2495 for(int i=0;i<NUMVERTICES;i++) values[i] = triainput->element_values[i]; 2496 vector->SetValues(NUMVERTICES,idlist,values,INS_VAL); 2497 } 2498 else if(triainput->GetInputInterpolationType()==P0Enum){ 2499 input->Serve(1,&this->lid); 2500 vector->SetValue(idlist[0],triainput->element_values[0],INS_VAL); 2501 } 2502 else{ 2503 _error_("not supported yet"); 2504 } 2458 2505 break; 2459 2506 } … … 2462 2509 { 2463 2510 TransientInput2* transientinput = xDynamicCast<TransientInput2*>(input); 2464 int N = transientinput->numtimesteps;2465 int* M =NULL;2511 int N = transientinput->numtimesteps; 2512 int* M = NULL; 2466 2513 parameters->FindParam(&M,NULL,ControlInputSizeMEnum); 2467 2514 int* idlist = xNew<int>(NUMVERTICES*N); … … 3907 3954 } 3908 3955 /*}}}*/ 3909 void Tria::SetControlInputsFromVector(IssmDouble* vector,int control_enum,int control_index,int offset,int N, int M){/*{{{*/3956 void Tria::SetControlInputsFromVector(IssmDouble* vector,int control_enum,int control_index,int offset,int M, int N){/*{{{*/ 3910 3957 3911 3958 IssmDouble values[NUMVERTICES]; 3912 3959 int lidlist[NUMVERTICES]; 3913 int idlist[NUMVERTICES] ,control_init;3960 int idlist[NUMVERTICES]; 3914 3961 3915 3962 /*Get Domain type*/ … … 3918 3965 3919 3966 /*Specific case for depth averaged quantities*/ 3920 control_init=control_enum;3967 int control_init=control_enum; 3921 3968 if(domaintype==Domain2DverticalEnum){ 3922 3969 if(control_enum==MaterialsRheologyBbarEnum){ … … 3933 3980 if(!IsInputEnum(control_enum)) return; 3934 3981 3982 ElementInput2* input=this->inputs2->GetControlInput2Data(control_enum,"value"); _assert_(input); 3935 3983 this->GetVerticesLidList(&lidlist[0]); 3936 ElementInput2* input=this->inputs2->GetControlInput2Data(control_enum,"value"); _assert_(input);3984 GradientIndexing(&idlist[0],control_index); 3937 3985 3938 3986 /*Get values on vertices*/ 3939 for(int n=0;n<N;n++){ 3987 if(input->ObjectEnum()==TriaInput2Enum && input->GetInputInterpolationType()==P1Enum){ 3988 _assert_(N==1); 3940 3989 for(int i=0;i<NUMVERTICES;i++){ 3941 idlist[i]=offset + this->vertices[i]->Sid()+n*M; 3942 values[i]=vector[idlist[i]]; 3943 } 3944 if(input->ObjectEnum()==TriaInput2Enum){ 3945 input->SetInput(P1Enum,NUMVERTICES,&lidlist[0],&values[0]); 3946 } 3947 else if(input->ObjectEnum()==TransientInput2Enum){ 3990 values[i] = vector[idlist[i]]; 3991 } 3992 input->SetInput(P1Enum,NUMVERTICES,&lidlist[0],&values[0]); 3993 } 3994 else if(input->ObjectEnum()==TriaInput2Enum && input->GetInputInterpolationType()==P0Enum){ 3995 _assert_(N==1); 3996 input->SetInput(P0Enum,this->lid,vector[idlist[0]]); 3997 } 3998 else if(input->ObjectEnum()==TransientInput2Enum){ 3999 for(int n=0;n<N;n++){ 3948 4000 _error_("not implemented"); 3949 4001 //Input* new_input = new TriaInput(control_enum,values,P1Enum); … … 3951 4003 //controlinput->Configure(parameters); 3952 4004 } 3953 else _error_("Type not supported");3954 }4005 } 4006 else _error_("Type not supported"); 3955 4007 } 3956 4008 /*}}}*/ -
issm/trunk-jpl/src/c/classes/Elements/Tria.h
r25256 r25317 66 66 void ComputeSurfaceNormalVelocity(); 67 67 void Configure(Elements* elements,Loads* loads,Nodes* nodesin,Vertices* verticesin,Materials* materials,Parameters* parameters,Inputs2* inputs2in); 68 void ControlInputSetGradient(IssmDouble* gradient,int enum_type,int control_index,int offset,int N, int M);68 void ControlInputSetGradient(IssmDouble* gradient,int enum_type,int control_index,int offset,int M,int N,int interp); 69 69 void ControlInputSetGradient(IssmDouble* gradient,int enum_type,int control_index); 70 void ControlToVectors(Vector<IssmPDouble>* vector_control, Vector<IssmPDouble>* vector_gradient,int control_enum );70 void ControlToVectors(Vector<IssmPDouble>* vector_control, Vector<IssmPDouble>* vector_gradient,int control_enum,int control_interp); 71 71 void CreateDistanceInputFromSegmentlist(IssmDouble* distances,int distanceenum); 72 72 int EdgeOnBaseIndex(); … … 130 130 void SetElementInput(Inputs2* inputs2,int enum_in,IssmDouble values); 131 131 void SetElementInput(Inputs2* inputs2,int numindices,int* indices,IssmDouble* values,int enum_in); 132 void SetControlInputsFromVector(IssmDouble* vector,int control_enum,int control_index,int offset,int N,int M);132 void SetControlInputsFromVector(IssmDouble* vector,int control_enum,int control_index,int offset,int M,int N); 133 133 void SetControlInputsFromVector(IssmDouble* vector,int control_enum,int control_index); 134 134 void SetCurrentConfiguration(Elements* elements,Loads* loads,Nodes* nodes,Materials* materials,Parameters* parameters); -
issm/trunk-jpl/src/c/classes/FemModel.cpp
r25139 r25317 2174 2174 int num_controls,step; 2175 2175 IssmDouble time; 2176 int *control_type = NULL; 2176 int *control_type = NULL; 2177 int *control_interp = NULL; 2178 int *M = NULL; 2179 int *N = NULL; 2177 2180 2178 2181 /*recover results*/ … … 2183 2186 this->parameters->FindParam(&num_controls,InversionNumControlParametersEnum); 2184 2187 this->parameters->FindParam(&control_type,NULL,InversionControlParametersEnum); 2188 this->parameters->FindParam(&M,NULL,ControlInputSizeMEnum); 2189 this->parameters->FindParam(&N,NULL,ControlInputSizeNEnum); 2190 this->parameters->FindParam(&control_interp,NULL,ControlInputInterpolationEnum); 2185 2191 this->parameters->FindParam(&step,StepEnum); 2186 2192 this->parameters->FindParam(&time,TimeEnum); … … 2199 2205 2200 2206 /*Allocate vector*/ 2201 Vector<IssmPDouble> *vector_control = new Vector<IssmPDouble>( this->vertices->NumberOfVertices());2202 Vector<IssmPDouble> *vector_gradient = new Vector<IssmPDouble>( this->vertices->NumberOfVertices());2207 Vector<IssmPDouble> *vector_control = new Vector<IssmPDouble>(M[i]*N[i]); 2208 Vector<IssmPDouble> *vector_gradient = new Vector<IssmPDouble>(M[i]*N[i]); 2203 2209 2204 2210 /*Fill in vector*/ 2205 2211 for(int j=0;j<elements->Size();j++){ 2206 2212 Element* element=(Element*)elements->GetObjectByOffset(j); 2207 element->ControlToVectors(vector_control,vector_gradient,control_enum );2213 element->ControlToVectors(vector_control,vector_gradient,control_enum,control_interp[i]); 2208 2214 } 2209 2215 vector_control->Assemble(); … … 2216 2222 /*Clean up and return*/ 2217 2223 xDelete<int>(control_type); 2224 xDelete<int>(control_interp); 2225 xDelete<int>(M); 2226 xDelete<int>(N); 2218 2227 } 2219 2228 /*}}}*/ -
issm/trunk-jpl/src/c/classes/Inputs2/ControlInput2.cpp
r24335 r25317 29 29 this->control_id = id; 30 30 this->layout_enum = input_layout_enum; 31 32 _assert_(interp==P1Enum);33 31 34 32 switch(this->layout_enum){ -
issm/trunk-jpl/src/c/classes/Inputs2/Inputs2.cpp
r25293 r25317 912 912 /*Create it if necessary*/ 913 913 if(this->inputs[id]){ 914 int* tenp = xNew<int>(3); 914 915 if(this->inputs[id]->ObjectEnum()!=PentaInput2Enum) _error_("cannot add Element values to a "<<EnumToStringx(this->inputs[id]->ObjectEnum())); 915 916 } -
issm/trunk-jpl/src/c/classes/Params/Parameters.cpp
r24335 r25317 386 386 387 387 /*cast to "passive"*/ 388 #ifdef _HAVE_AD_ 388 389 *pscalar=reCast<IssmPDouble>(intermediary); 390 #else 391 *pscalar=intermediary; 392 #endif 389 393 } 390 394 /*}}}*/ … … 401 405 402 406 /*Make output passive*/ 407 #ifdef _HAVE_AD_ 403 408 IssmPDouble* output = xNew<IssmPDouble>(n); 404 409 for(int i=0;i<n;i++) output[i] = reCast<IssmPDouble>(vector[i]); 410 xDelete<IssmDouble>(vector); 411 if(pvec) *pvec = output; 412 #else 413 if(pvec) *pvec = vector; 414 #endif 405 415 406 416 /*assign output pointers*/ 407 if(pvec) *pvec = output;408 417 if(pM) *pM = n; 409 418 }/*}}}*/ -
issm/trunk-jpl/src/c/cores/controlm1qn3_core.cpp
r23350 r25317 46 46 double *X = NULL; 47 47 double *G = NULL; 48 49 /*Get control sizes*/ 50 int* M = NULL; 51 int* N = NULL; 52 femmodel->parameters->FindParam(&M,NULL,ControlInputSizeMEnum); 53 femmodel->parameters->FindParam(&N,NULL,ControlInputSizeNEnum); 48 54 49 55 /*Recover some parameters*/ … … 73 79 long io = 6; /*Channel number for the output*/ 74 80 75 /*Optimization criterions */81 /*Optimization criterions (need to be cast to long for m1qn3)*/ 76 82 long niter = long(maxsteps); /*Maximum number of iterations*/ 77 long nsim = long(maxiter); /*Maximum number of function calls*/83 long nsim = long(maxiter); /*Maximum number of function calls*/ 78 84 79 85 /*Get initial guess*/ 80 86 GetPassiveVectorFromControlInputsx(&X,&intn,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,"value"); 81 _assert_(intn==numberofvertices*num_controls);82 87 83 88 /*Get problem dimension and initialize gradient and initial guess*/ … … 86 91 87 92 /*Scale control for M1QN3*/ 93 int offset = 0; 88 94 for(int c=0;c<num_controls;c++){ 89 for(int i=0;i< numberofvertices;i++){90 int index = numberofvertices*c+i;91 X[index] = X[index]/ scaling_factors[c];95 for(int i=0;i<M[c]*N[c];i++){ 96 int index = offset+i; 97 X[index] = X[index]/reCast<IssmPDouble>(scaling_factors[c]); 92 98 } 99 offset += M[c]*N[c]; 93 100 } 94 101 … … 142 149 GetPassiveVectorFromControlInputsx(&XL,NULL,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,"lowerbound"); 143 150 GetPassiveVectorFromControlInputsx(&XU,NULL,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,"upperbound"); 151 152 offset = 0; 144 153 for(int c=0;c<num_controls;c++){ 145 for(int i=0;i< numberofvertices;i++){146 int index = numberofvertices*c+i;154 for(int i=0;i<M[c]*N[c];i++){ 155 int index = offset+i; 147 156 X[index] = X[index]*scaling_factors[c]; 148 157 if(X[index]>XU[index]) X[index]=XU[index]; 149 158 if(X[index]<XL[index]) X[index]=XL[index]; 150 159 } 160 offset += M[c]*N[c]; 151 161 } 152 162 … … 179 189 180 190 /*Clean-up and return*/ 191 xDelete<int>(M); 192 xDelete<int>(N); 181 193 xDelete<double>(G); 182 194 xDelete<double>(X); … … 201 213 int num_responses,num_controls,numberofvertices,solution_type; 202 214 double* scaling_factors = NULL; 215 int* M = NULL; 216 int* N = NULL; 203 217 femmodel->parameters->FindParam(&num_responses,InversionNumCostFunctionsEnum); 218 femmodel->parameters->FindParam(&N,NULL,ControlInputSizeNEnum); 219 femmodel->parameters->FindParam(&M,NULL,ControlInputSizeNEnum); 204 220 femmodel->parameters->FindParam(&num_controls,InversionNumControlParametersEnum); 205 221 femmodel->parameters->FindParamAndMakePassive(&scaling_factors,NULL,InversionControlScalingFactorsEnum); … … 212 228 GetPassiveVectorFromControlInputsx(&XL,NULL,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,"lowerbound"); 213 229 GetPassiveVectorFromControlInputsx(&XU,NULL,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,"upperbound"); 230 231 int offset = 0; 214 232 for(int c=0;c<num_controls;c++){ 215 for(int i=0;i< numberofvertices;i++){216 int index = numberofvertices*c+i;233 for(int i=0;i<M[c]*N[c];i++){ 234 int index = offset+i; 217 235 X[index] = X[index]*scaling_factors[c]; 218 236 if(X[index]>XU[index]) X[index]=XU[index]; 219 237 if(X[index]<XL[index]) X[index]=XL[index]; 220 238 } 221 } 239 offset += M[c]*N[c]; 240 } 241 222 242 #ifdef _HAVE_AD_ 223 243 IssmDouble* aX=xNew<IssmDouble>(*n); … … 277 297 /*Constrain Gradient*/ 278 298 IssmDouble Gnorm = 0.; 299 offset = 0; 279 300 for(int c=0;c<num_controls;c++){ 280 for(int i=0;i< numberofvertices;i++){281 int index = numberofvertices*c+i;301 for(int i=0;i<M[c]*N[c];i++){ 302 int index = offset+i; 282 303 if(X[index]>=XU[index]) G[index]=0.; 283 304 if(X[index]<=XL[index]) G[index]=0.; … … 286 307 Gnorm += G[index]*G[index]; 287 308 } 309 offset += M[c]*N[c]; 288 310 } 289 311 Gnorm = sqrt(Gnorm); … … 296 318 /*Clean-up and return*/ 297 319 *Jlisti = (*Jlisti) +1; 320 xDelete<int>(M); 321 xDelete<int>(N); 298 322 xDelete<double>(XU); 299 323 xDelete<double>(XL); -
issm/trunk-jpl/src/c/modules/ControlInputSetGradientx/ControlInputSetGradientx.cpp
r22740 r25317 9 9 void ControlInputSetGradientx(Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters,IssmDouble* gradient){ 10 10 11 bool isautodiff; 12 parameters->FindParam(&isautodiff,AutodiffIsautodiffEnum); 13 if(isautodiff){ 14 /*Intermediaries*/ 15 int num_controls; 16 int *control_type = NULL; 17 int* M_all = NULL; 18 int* N_all = NULL; 11 /*Intermediaries*/ 12 int num_controls; 13 int *control_type = NULL; 14 int* M_all = NULL; 15 int* N_all = NULL; 16 int* interp_all = NULL; 19 17 20 /*Retrieve some parameters*/ 21 parameters->FindParam(&num_controls,InversionNumControlParametersEnum); 22 parameters->FindParam(&control_type,NULL,InversionControlParametersEnum); 23 parameters->FindParam(&M_all,NULL,ControlInputSizeMEnum); 24 parameters->FindParam(&N_all,NULL,ControlInputSizeNEnum); 18 /*Retrieve some parameters*/ 19 parameters->FindParam(&num_controls,InversionNumControlParametersEnum); 20 parameters->FindParam(&control_type,NULL,InversionControlParametersEnum); 21 parameters->FindParam(&M_all,NULL,ControlInputSizeMEnum); 22 parameters->FindParam(&N_all,NULL,ControlInputSizeNEnum); 23 parameters->FindParam(&interp_all,NULL,ControlInputInterpolationEnum); 25 24 26 int offset = 0; 27 for(int i=0;i<num_controls;i++){ 28 for(int j=0;j<elements->Size();j++){ 29 Element* element=(Element*)elements->GetObjectByOffset(j); 30 element->ControlInputSetGradient(gradient,control_type[i],i,offset,N_all[i],M_all[i]); 31 } 32 offset+=M_all[i]*N_all[i]; 25 int offset = 0; 26 for(int i=0;i<num_controls;i++){ 27 for(int j=0;j<elements->Size();j++){ 28 Element* element=(Element*)elements->GetObjectByOffset(j); 29 element->ControlInputSetGradient(gradient,control_type[i],i,offset,M_all[i],N_all[i],interp_all[i]); 33 30 } 31 offset+=M_all[i]*N_all[i]; 32 } 34 33 35 /*Clean up and return*/ 36 xDelete<int>(control_type); 37 } 38 else{ 39 int num_controls; 40 int *control_type = NULL; 41 42 /*Retrieve some parameters*/ 43 parameters->FindParam(&num_controls,InversionNumControlParametersEnum); 44 parameters->FindParam(&control_type,NULL,InversionControlParametersEnum); 45 46 int offset = 0; 47 for(int i=0;i<num_controls;i++){ 48 for(int j=0;j<elements->Size();j++){ 49 Element* element=(Element*)elements->GetObjectByOffset(j); 50 element->ControlInputSetGradient(gradient,control_type[i],i); 51 } 52 } 53 54 /*Clean up and return*/ 55 xDelete<int>(control_type); 56 } 34 /*Clean up and return*/ 35 xDelete<int>(control_type); 36 xDelete<int>(M_all); 37 xDelete<int>(N_all); 38 xDelete<int>(interp_all); 57 39 58 40 } … … 60 42 61 43 /*Serialize gradient*/ 62 IssmDouble* serial_gradient=NULL; 63 serial_gradient=gradient->ToMPISerial(); 44 IssmDouble* serial_gradient=gradient->ToMPISerial(); 64 45 65 46 ControlInputSetGradientx(elements,nodes,vertices, loads, materials, parameters,serial_gradient); -
issm/trunk-jpl/src/c/modules/GetVectorFromControlInputsx/GetVectorFromControlInputsx.cpp
r24335 r25317 9 9 void GetVectorFromControlInputsx(Vector<IssmDouble>** pvector, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters,const char* data){/*{{{*/ 10 10 11 bool isautodiff; 12 parameters->FindParam(&isautodiff,AutodiffIsautodiffEnum); 13 if(isautodiff){ 14 int* N = NULL; 15 int* M = NULL; 16 int num_controls; 17 int* control_type = NULL; 18 Vector<IssmDouble>* vector=NULL; 11 int num_controls; 12 int* N = NULL; 13 int* M = NULL; 14 int* control_type = NULL; 19 15 20 21 22 23 24 16 /*Retrieve some parameters*/ 17 parameters->FindParam(&num_controls,InversionNumControlParametersEnum); 18 parameters->FindParam(&control_type,NULL,InversionControlParametersEnum); 19 parameters->FindParam(&N,NULL,ControlInputSizeNEnum); 20 parameters->FindParam(&M,NULL,ControlInputSizeMEnum); 25 21 26 27 28 22 /*1. Get vector size*/ 23 int size = 0; 24 for(int i=0;i<num_controls;i++) size+=M[i]*N[i]; 29 25 30 31 26 /*2. Allocate vector*/ 27 Vector<IssmDouble>* vector=new Vector<IssmDouble>(size); 32 28 33 /*3. Populate vector*/ 34 int offset = 0; 35 for(int i=0;i<num_controls;i++){ 36 for(int j=0;j<elements->Size();j++){ 37 Element* element=(Element*)elements->GetObjectByOffset(j); 38 element->GetVectorFromControlInputs(vector,control_type[i],i,data,offset); 39 } 40 offset += M[i]*N[i]; 29 /*3. Populate vector*/ 30 int offset = 0; 31 for(int i=0;i<num_controls;i++){ 32 for(int j=0;j<elements->Size();j++){ 33 Element* element=(Element*)elements->GetObjectByOffset(j); 34 element->GetVectorFromControlInputs(vector,control_type[i],i,data,offset); 41 35 } 36 offset += M[i]*N[i]; 37 } 38 vector->Assemble(); 42 39 43 vector->Assemble(); 44 45 /*Assign output pointers:*/ 46 xDelete<int>(control_type); 47 xDelete<int>(M); 48 xDelete<int>(N); 49 50 *pvector=vector; 51 } 52 else{ 53 int num_controls; 54 int* control_type = NULL; 55 Vector<IssmDouble>* vector=NULL; 56 57 /*Retrieve some parameters*/ 58 parameters->FindParam(&num_controls,InversionNumControlParametersEnum); 59 parameters->FindParam(&control_type,NULL,InversionControlParametersEnum); 60 61 /*2. Allocate vector*/ 62 vector=new Vector<IssmDouble>(num_controls*vertices->NumberOfVertices()); 63 64 /*3. Populate vector*/ 65 int offset = 0; 66 for(int i=0;i<num_controls;i++){ 67 for(int j=0;j<elements->Size();j++){ 68 Element* element=(Element*)elements->GetObjectByOffset(j); 69 element->GetVectorFromControlInputs(vector,control_type[i],i,data); 70 } 71 } 72 vector->Assemble(); 73 74 /*Assign output pointers:*/ 75 xDelete<int>(control_type); 76 *pvector=vector; 77 } 78 40 /*Assign output pointers:*/ 41 xDelete<int>(control_type); 42 xDelete<int>(M); 43 xDelete<int>(N); 44 *pvector=vector; 79 45 }/*}}}*/ 80 46 void GetVectorFromControlInputsx( IssmDouble** pvector,int *pN, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters, const char* data){/*{{{*/ -
issm/trunk-jpl/src/c/modules/Gradjx/Gradjx.cpp
r18258 r25317 9 9 void Gradjx(Vector<IssmDouble>** pgradient,IssmDouble** pnorm_list, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters){ 10 10 11 int numberofvertices; 12 int num_controls,analysisenum; 13 IssmDouble norm_inf; 14 IssmDouble *norm_list = NULL; 15 int *control_type = NULL; 11 int numberofvertices; 12 int num_controls,analysisenum; 13 IssmDouble norm_inf; 14 IssmDouble *norm_list = NULL; 15 int *control_type = NULL; 16 int *control_interp = NULL; 17 int *M = NULL; 18 int *N = NULL; 16 19 Vector<IssmDouble> *gradient = NULL; 17 20 Vector<IssmDouble> **gradient_list = NULL; … … 21 24 22 25 /*retrieve some parameters: */ 23 parameters->FindParam(&num_controls,InversionNumControlParametersEnum); _assert_(num_controls);26 parameters->FindParam(&num_controls,InversionNumControlParametersEnum); _assert_(num_controls); 24 27 parameters->FindParam(&control_type,NULL,InversionControlParametersEnum); 28 parameters->FindParam(&control_interp,NULL,ControlInputInterpolationEnum); 29 parameters->FindParam(&M,NULL,ControlInputSizeMEnum); 30 parameters->FindParam(&N,NULL,ControlInputSizeNEnum); 25 31 numberofvertices=vertices->NumberOfVertices(); 26 32 … … 31 37 /*Allocate gradient_list */ 32 38 gradient_list = xNew<Vector<IssmDouble>*>(num_controls); 33 norm_list = xNew<IssmDouble>(num_controls); 34 for(int i=0;i<num_controls;i++){ 35 gradient_list[i]=new Vector<IssmDouble>(num_controls*numberofvertices); 36 } 37 gradient=new Vector<IssmDouble>(num_controls*numberofvertices); 39 norm_list = xNew<IssmDouble>(num_controls); 40 int totalsize = 0; 41 for(int i=0;i<num_controls;i++) totalsize += M[i]*N[i]; 42 for(int i=0;i<num_controls;i++) gradient_list[i]=new Vector<IssmDouble>(totalsize); 38 43 39 44 /*Compute all gradient_list*/ … … 41 46 for(int j=0;j<elements->Size();j++){ 42 47 Element* element=(Element*)elements->GetObjectByOffset(j); 43 analysis->GradientJ(gradient_list[i],element,control_type[i], i);48 analysis->GradientJ(gradient_list[i],element,control_type[i],control_interp[i],i); 44 49 } 45 50 gradient_list[i]->Assemble(); … … 48 53 49 54 /*Add all gradient_list together*/ 55 gradient=new Vector<IssmDouble>(totalsize); 50 56 for(int i=0;i<num_controls;i++){ 51 57 gradient->AXPY(gradient_list[i],1.0); … … 62 68 xDelete<Vector<IssmDouble>*>(gradient_list); 63 69 xDelete<int>(control_type); 70 xDelete<int>(control_interp); 71 xDelete<int>(M); 72 xDelete<int>(N); 64 73 if(pnorm_list){ 65 74 *pnorm_list=norm_list; … … 73 82 void Gradjx(IssmDouble** pgradient,IssmDouble** pnorm_list, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters){ 74 83 75 /*output: */ 76 IssmDouble* gradient=NULL; 84 /*Get gradient: */ 85 Vector<IssmDouble>* vec_gradient=NULL; 86 Gradjx(&vec_gradient,pnorm_list,elements,nodes, vertices,loads,materials,parameters); 77 87 78 /* intermediary:*/79 Vector<IssmDouble>* vec_gradient=NULL;88 /*Serialize*/ 89 IssmDouble* gradient=vec_gradient->ToMPISerial(); 80 90 81 Gradjx(&vec_gradient,pnorm_list,elements,nodes, vertices,loads,materials,parameters); 82 gradient=vec_gradient->ToMPISerial(); 83 84 /*Free ressources:*/ 91 /*Free ressources and assign output pointer*/ 85 92 delete vec_gradient; 86 87 /*Assign output pointers:*/88 93 *pgradient=gradient; 89 94 } -
issm/trunk-jpl/src/c/modules/ModelProcessorx/Control/UpdateElementsAndMaterialsControl.cpp
r25201 r25317 110 110 } 111 111 112 int* M_all = xNew<int>(num_controls); 113 int* N_all = xNew<int>(num_controls); 114 int* Interp_all = xNew<int>(num_controls); 115 116 int offset = 0; 112 117 for(int i=0;i<num_controls;i++){ 113 118 control = control_enums[i]; … … 133 138 _error_("Control " << EnumToStringx(control) << " not implemented yet"); 134 139 } 135 if(M!=iomodel->numberofvertices && N!=1) _error_("not supported yet"); 140 141 /*Transient independents not supported outside of AD*/ 142 if(N!=1) _error_("Transient controls not supported yet"); 143 N_all[i] = N; 144 M_all[i] = M; 145 146 if(M==iomodel->numberofvertices){ 147 Interp_all[i] = P1Enum; 148 } 149 else if(M==iomodel->numberofelements){ 150 Interp_all[i] = P0Enum; 151 } 152 else{ 153 _error_("Control size not supported"); 154 } 136 155 137 156 /*Special case if 3d*/ … … 143 162 for(int j=0;j<elements->Size();j++){ 144 163 Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(j)); 145 element->ControlInputCreate(independent,&independents_min[ i*iomodel->numberofvertices],&independents_max[i*iomodel->numberofvertices],inputs2,iomodel,M,N,scale,control,i+1);164 element->ControlInputCreate(independent,&independents_min[offset],&independents_max[offset],inputs2,iomodel,M,N,scale,control,i+1); 146 165 } 147 166 xDelete<IssmDouble>(independent); 148 } 167 168 offset += M*N; 169 } 170 parameters->AddObject(new IntVecParam(ControlInputSizeMEnum,M_all,num_controls)); 171 parameters->AddObject(new IntVecParam(ControlInputSizeNEnum,N_all,num_controls)); 172 parameters->AddObject(new IntVecParam(ControlInputInterpolationEnum,Interp_all,num_controls)); 173 xDelete<int>(M_all); 174 xDelete<int>(N_all); 175 xDelete<int>(Interp_all); 149 176 xDelete<IssmDouble>(independents_min); 150 177 xDelete<IssmDouble>(independents_max); 151 152 178 153 179 /*Free data: */ -
issm/trunk-jpl/src/c/modules/SetControlInputsFromVectorx/SetControlInputsFromVectorx.cpp
r23293 r25317 9 9 void SetControlInputsFromVectorx(FemModel* femmodel,IssmDouble* vector){ 10 10 11 bool isautodiff; 12 femmodel->parameters->FindParam(&isautodiff,AutodiffIsautodiffEnum); 13 if(isautodiff){ 14 int num_controls; 15 int* control_type = NULL; 16 int* M = NULL; 17 int* N = NULL; 11 int num_controls; 12 int* control_type = NULL; 13 int* M = NULL; 14 int* N = NULL; 18 15 19 20 21 22 23 16 /*Retrieve some parameters*/ 17 femmodel->parameters->FindParam(&num_controls,InversionNumControlParametersEnum); 18 femmodel->parameters->FindParam(&control_type,NULL,InversionControlParametersEnum); 19 femmodel->parameters->FindParam(&M,NULL,ControlInputSizeMEnum); 20 femmodel->parameters->FindParam(&N,NULL,ControlInputSizeNEnum); 24 21 25 26 27 28 29 element->SetControlInputsFromVector(vector,control_type[i],i,offset,N[i],M[i]);30 22 int offset = 0; 23 for(int i=0;i<num_controls;i++){ 24 for(int j=0;j<femmodel->elements->Size();j++){ 25 Element* element=(Element*)femmodel->elements->GetObjectByOffset(j); 26 element->SetControlInputsFromVector(vector,control_type[i],i,offset,M[i],N[i]); 27 } 31 28 offset += M[i]*N[i]; 32 29 } 33 30 34 xDelete<int>(control_type); 35 xDelete<int>(M); 36 xDelete<int>(N); 37 } 38 else{ 39 40 int num_controls; 41 int* control_type = NULL; 42 femmodel->parameters->FindParam(&num_controls,InversionNumControlParametersEnum); 43 femmodel->parameters->FindParam(&control_type,NULL,InversionControlParametersEnum); 44 int offset = 0; 45 for(int i=0;i<num_controls;i++){ 46 for(int j=0;j<femmodel->elements->Size();j++){ 47 Element* element=(Element*)femmodel->elements->GetObjectByOffset(j); 48 element->SetControlInputsFromVector(vector,control_type[i],i); 49 } 50 } 51 xDelete<int>(control_type); 52 } 31 xDelete<int>(control_type); 32 xDelete<int>(M); 33 xDelete<int>(N); 53 34 } 54 35 -
issm/trunk-jpl/src/c/shared/Enum/Enum.vim
r25308 r25317 111 111 syn keyword cConstant ControlInputSizeMEnum 112 112 syn keyword cConstant ControlInputSizeNEnum 113 syn keyword cConstant ControlInputInterpolationEnum 113 114 syn keyword cConstant DamageC1Enum 114 115 syn keyword cConstant DamageC2Enum -
issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
r25308 r25317 105 105 ControlInputSizeMEnum, 106 106 ControlInputSizeNEnum, 107 ControlInputInterpolationEnum, 107 108 DamageC1Enum, 108 109 DamageC2Enum, -
issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
r25308 r25317 113 113 case ControlInputSizeMEnum : return "ControlInputSizeM"; 114 114 case ControlInputSizeNEnum : return "ControlInputSizeN"; 115 case ControlInputInterpolationEnum : return "ControlInputInterpolation"; 115 116 case DamageC1Enum : return "DamageC1"; 116 117 case DamageC2Enum : return "DamageC2"; -
issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
r25308 r25317 113 113 else if (strcmp(name,"ControlInputSizeM")==0) return ControlInputSizeMEnum; 114 114 else if (strcmp(name,"ControlInputSizeN")==0) return ControlInputSizeNEnum; 115 else if (strcmp(name,"ControlInputInterpolation")==0) return ControlInputInterpolationEnum; 115 116 else if (strcmp(name,"DamageC1")==0) return DamageC1Enum; 116 117 else if (strcmp(name,"DamageC2")==0) return DamageC2Enum; … … 136 137 else if (strcmp(name,"DslComputeFingerprints")==0) return DslComputeFingerprintsEnum; 137 138 else if (strcmp(name,"EarthId")==0) return EarthIdEnum; 138 else if (strcmp(name,"EplZigZagCounter")==0) return EplZigZagCounterEnum;139 139 else stage=2; 140 140 } 141 141 if(stage==2){ 142 if (strcmp(name,"EsaHElastic")==0) return EsaHElasticEnum; 142 if (strcmp(name,"EplZigZagCounter")==0) return EplZigZagCounterEnum; 143 else if (strcmp(name,"EsaHElastic")==0) return EsaHElasticEnum; 143 144 else if (strcmp(name,"EsaHemisphere")==0) return EsaHemisphereEnum; 144 145 else if (strcmp(name,"EsaRequestedOutputs")==0) return EsaRequestedOutputsEnum; … … 259 260 else if (strcmp(name,"MasstransportRequestedOutputs")==0) return MasstransportRequestedOutputsEnum; 260 261 else if (strcmp(name,"MasstransportStabilization")==0) return MasstransportStabilizationEnum; 261 else if (strcmp(name,"MaterialsBeta")==0) return MaterialsBetaEnum;262 262 else stage=3; 263 263 } 264 264 if(stage==3){ 265 if (strcmp(name,"MaterialsEarthDensity")==0) return MaterialsEarthDensityEnum; 265 if (strcmp(name,"MaterialsBeta")==0) return MaterialsBetaEnum; 266 else if (strcmp(name,"MaterialsEarthDensity")==0) return MaterialsEarthDensityEnum; 266 267 else if (strcmp(name,"MaterialsEffectiveconductivityAveraging")==0) return MaterialsEffectiveconductivityAveragingEnum; 267 268 else if (strcmp(name,"MaterialsHeatcapacity")==0) return MaterialsHeatcapacityEnum; … … 382 383 else if (strcmp(name,"SmbIsfirnwarming")==0) return SmbIsfirnwarmingEnum; 383 384 else if (strcmp(name,"SmbIsgraingrowth")==0) return SmbIsgraingrowthEnum; 384 else if (strcmp(name,"SmbIsmelt")==0) return SmbIsmeltEnum;385 385 else stage=4; 386 386 } 387 387 if(stage==4){ 388 if (strcmp(name,"SmbIsmungsm")==0) return SmbIsmungsmEnum; 388 if (strcmp(name,"SmbIsmelt")==0) return SmbIsmeltEnum; 389 else if (strcmp(name,"SmbIsmungsm")==0) return SmbIsmungsmEnum; 389 390 else if (strcmp(name,"SmbIsprecipscaled")==0) return SmbIsprecipscaledEnum; 390 391 else if (strcmp(name,"SmbIssetpddfac")==0) return SmbIssetpddfacEnum; … … 505 506 else if (strcmp(name,"BasalforcingsPicoSubShelfOceanSalinity")==0) return BasalforcingsPicoSubShelfOceanSalinityEnum; 506 507 else if (strcmp(name,"BasalforcingsPicoSubShelfOceanTemp")==0) return BasalforcingsPicoSubShelfOceanTempEnum; 507 else if (strcmp(name,"BasalStressx")==0) return BasalStressxEnum;508 508 else stage=5; 509 509 } 510 510 if(stage==5){ 511 if (strcmp(name,"BasalStressy")==0) return BasalStressyEnum; 511 if (strcmp(name,"BasalStressx")==0) return BasalStressxEnum; 512 else if (strcmp(name,"BasalStressy")==0) return BasalStressyEnum; 512 513 else if (strcmp(name,"BasalStress")==0) return BasalStressEnum; 513 514 else if (strcmp(name,"Base")==0) return BaseEnum; … … 628 629 else if (strcmp(name,"HydrologydcSedimentTransmitivity")==0) return HydrologydcSedimentTransmitivityEnum; 629 630 else if (strcmp(name,"HydrologyDrainageRate")==0) return HydrologyDrainageRateEnum; 630 else if (strcmp(name,"HydrologyEnglacialInput")==0) return HydrologyEnglacialInputEnum;631 631 else stage=6; 632 632 } 633 633 if(stage==6){ 634 if (strcmp(name,"HydrologyGapHeight")==0) return HydrologyGapHeightEnum; 634 if (strcmp(name,"HydrologyEnglacialInput")==0) return HydrologyEnglacialInputEnum; 635 else if (strcmp(name,"HydrologyGapHeight")==0) return HydrologyGapHeightEnum; 635 636 else if (strcmp(name,"HydrologyHead")==0) return HydrologyHeadEnum; 636 637 else if (strcmp(name,"HydrologyHeadOld")==0) return HydrologyHeadOldEnum; … … 751 752 else if (strcmp(name,"SmbDzTop")==0) return SmbDzTopEnum; 752 753 else if (strcmp(name,"SmbDzini")==0) return SmbDziniEnum; 753 else if (strcmp(name,"SmbEAir")==0) return SmbEAirEnum;754 754 else stage=7; 755 755 } 756 756 if(stage==7){ 757 if (strcmp(name,"SmbEC")==0) return SmbECEnum; 757 if (strcmp(name,"SmbEAir")==0) return SmbEAirEnum; 758 else if (strcmp(name,"SmbEC")==0) return SmbECEnum; 758 759 else if (strcmp(name,"SmbECDt")==0) return SmbECDtEnum; 759 760 else if (strcmp(name,"SmbECini")==0) return SmbECiniEnum; … … 874 875 else if (strcmp(name,"VyMesh")==0) return VyMeshEnum; 875 876 else if (strcmp(name,"VyObs")==0) return VyObsEnum; 876 else if (strcmp(name,"Vz")==0) return VzEnum;877 877 else stage=8; 878 878 } 879 879 if(stage==8){ 880 if (strcmp(name,"VzFS")==0) return VzFSEnum; 880 if (strcmp(name,"Vz")==0) return VzEnum; 881 else if (strcmp(name,"VzFS")==0) return VzFSEnum; 881 882 else if (strcmp(name,"VzHO")==0) return VzHOEnum; 882 883 else if (strcmp(name,"VzMesh")==0) return VzMeshEnum; … … 997 998 else if (strcmp(name,"AggressiveMigration")==0) return AggressiveMigrationEnum; 998 999 else if (strcmp(name,"AmrBamg")==0) return AmrBamgEnum; 999 else if (strcmp(name,"AmrNeopz")==0) return AmrNeopzEnum;1000 1000 else stage=9; 1001 1001 } 1002 1002 if(stage==9){ 1003 if (strcmp(name,"AndroidFrictionCoefficient")==0) return AndroidFrictionCoefficientEnum; 1003 if (strcmp(name,"AmrNeopz")==0) return AmrNeopzEnum; 1004 else if (strcmp(name,"AndroidFrictionCoefficient")==0) return AndroidFrictionCoefficientEnum; 1004 1005 else if (strcmp(name,"Arrhenius")==0) return ArrheniusEnum; 1005 1006 else if (strcmp(name,"AutodiffJacobian")==0) return AutodiffJacobianEnum; … … 1120 1121 else if (strcmp(name,"Gset")==0) return GsetEnum; 1121 1122 else if (strcmp(name,"Gsl")==0) return GslEnum; 1122 else if (strcmp(name,"HOApproximation")==0) return HOApproximationEnum;1123 1123 else stage=10; 1124 1124 } 1125 1125 if(stage==10){ 1126 if (strcmp(name,"HOFSApproximation")==0) return HOFSApproximationEnum; 1126 if (strcmp(name,"HOApproximation")==0) return HOApproximationEnum; 1127 else if (strcmp(name,"HOFSApproximation")==0) return HOFSApproximationEnum; 1127 1128 else if (strcmp(name,"Hook")==0) return HookEnum; 1128 1129 else if (strcmp(name,"HydrologyDCEfficientAnalysis")==0) return HydrologyDCEfficientAnalysisEnum; … … 1243 1244 else if (strcmp(name,"P0Array")==0) return P0ArrayEnum; 1244 1245 else if (strcmp(name,"P0DG")==0) return P0DGEnum; 1245 else if (strcmp(name,"P1DG")==0) return P1DGEnum;1246 1246 else stage=11; 1247 1247 } 1248 1248 if(stage==11){ 1249 if (strcmp(name,"P1P1")==0) return P1P1Enum; 1249 if (strcmp(name,"P1DG")==0) return P1DGEnum; 1250 else if (strcmp(name,"P1P1")==0) return P1P1Enum; 1250 1251 else if (strcmp(name,"P1P1GLS")==0) return P1P1GLSEnum; 1251 1252 else if (strcmp(name,"P1bubble")==0) return P1bubbleEnum; … … 1366 1367 else if (strcmp(name,"BalancethicknessDiffusionCoefficient")==0) return BalancethicknessDiffusionCoefficientEnum; 1367 1368 else if (strcmp(name,"BilinearInterp")==0) return BilinearInterpEnum; 1368 else if (strcmp(name,"CalvingdevCoeff")==0) return CalvingdevCoeffEnum;1369 1369 else stage=12; 1370 1370 } 1371 1371 if(stage==12){ 1372 if (strcmp(name,"DeviatoricStress")==0) return DeviatoricStressEnum; 1372 if (strcmp(name,"CalvingdevCoeff")==0) return CalvingdevCoeffEnum; 1373 else if (strcmp(name,"DeviatoricStress")==0) return DeviatoricStressEnum; 1373 1374 else if (strcmp(name,"EtaAbsGradient")==0) return EtaAbsGradientEnum; 1374 1375 else if (strcmp(name,"MeshZ")==0) return MeshZEnum;
Note:
See TracChangeset
for help on using the changeset viewer.