Changeset 18061
- Timestamp:
- 05/26/14 19:42:33 (11 years ago)
- Location:
- issm/trunk-jpl/src/c/analyses
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.cpp
r18057 r18061 124 124 }/*}}}*/ 125 125 void AdjointBalancethickness2Analysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/ 126 _error_("Not implemented yet"); 126 /*The gradient of the cost function is calculated in 2 parts. 127 * 128 * dJ \partial J \partial lambda^T(KU-F) 129 * -- = ---------- + ------------------------ 130 * dk \partial k \parial k 131 * 132 * */ 133 134 /*If on water, grad = 0: */ 135 if(!element->IsIceInElement()) return; 136 137 /*Get list of cost functions*/ 138 int *responses = NULL; 139 int num_responses,resp; 140 element->FindParam(&num_responses,InversionNumCostFunctionsEnum); 141 element->FindParam(&responses,NULL,InversionCostFunctionsEnum); 142 143 /*Check that control_type is supported*/ 144 if(control_type!=BalancethicknessApparentMassbalanceEnum){ 145 _error_("Control "<<EnumToStringx(control_type)<<" not supported"); 146 } 147 148 /*Deal with first part (partial derivative a J with respect to k)*/ 149 for(resp=0;resp<num_responses;resp++) switch(responses[resp]){ 150 case Balancethickness2MisfitEnum: /*Nothing, \partial J/\partial k = 0*/ break; 151 default: _error_("response " << EnumToStringx(responses[resp]) << " not supported yet"); 152 } 153 154 /*Deal with second term*/ 155 switch(control_type){ 156 case BalancethicknessApparentMassbalanceEnum: GradientJAdot(element,gradient,control_index); break; 157 default: _error_("control type not supported yet: " << EnumToStringx(control_type)); 158 } 159 160 /*Clean up and return*/ 161 xDelete<int>(responses); 162 163 }/*}}}*/ 164 void AdjointBalancethickness2Analysis::GradientJAdot(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/ 165 166 /*Intermediaries*/ 167 IssmDouble Jdet,weight; 168 IssmDouble lambda; 169 IssmDouble *xyz_list= NULL; 170 171 /*Fetch number of vertices for this finite element*/ 172 int numvertices = element->GetNumberOfVertices(); 173 174 /*Initialize some vectors*/ 175 IssmDouble* basis = xNew<IssmDouble>(numvertices); 176 IssmDouble* ge = xNewZeroInit<IssmDouble>(numvertices); 177 int* vertexpidlist = xNew<int>(numvertices); 178 179 /*Retrieve all inputs we will be needing: */ 180 element->GetVerticesCoordinates(&xyz_list); 181 element->GradientIndexing(&vertexpidlist[0],control_index); 182 Input* adjoint_input = element->GetInput(AdjointEnum); _assert_(adjoint_input); 183 Input* weights_input = element->GetInput(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input); 184 185 Gauss* gauss=element->NewGauss(2); 186 for(int ig=gauss->begin();ig<gauss->end();ig++){ 187 gauss->GaussPoint(ig); 188 189 element->JacobianDeterminant(&Jdet,xyz_list,gauss); 190 element->NodalFunctionsP1(basis,gauss); 191 weights_input->GetInputValue(&weight,gauss,Balancethickness2MisfitEnum); 192 adjoint_input->GetInputValue(&lambda,gauss); 193 194 /*Build gradient vector (actually -dJ/da): */ 195 for(int i=0;i<numvertices;i++){ 196 ge[i]+= - weight*Jdet*gauss->weight*basis[i]*lambda; 197 _assert_(!xIsNan<IssmDouble>(ge[i])); 198 } 199 } 200 gradient->SetValues(numvertices,vertexpidlist,ge,ADD_VAL); 201 202 /*Clean up and return*/ 203 xDelete<IssmDouble>(ge); 204 xDelete<IssmDouble>(xyz_list); 205 xDelete<IssmDouble>(basis); 206 xDelete<int>(vertexpidlist); 207 delete gauss; 127 208 }/*}}}*/ 128 209 void AdjointBalancethickness2Analysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/ -
issm/trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.h
r18057 r18061 28 28 void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element); 29 29 void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index); 30 void GradientJAdot(Element* element,Vector<IssmDouble>* gradient,int control_index); 30 31 void InputUpdateFromSolution(IssmDouble* solution,Element* element); 31 32 void UpdateConstraints(FemModel* femmodel); -
issm/trunk-jpl/src/c/analyses/AdjointHorizAnalysis.cpp
r18060 r18061 1035 1035 dragcoefficient_input->GetInputDerivativeValue(&dk[0],xyz_list,gauss); 1036 1036 1037 /*Build gradient vector (actually -dJ/ddrag): */ 1038 for(int i=0;i<numvertices;i++){ 1039 if(dim==2){ 1040 ge[i]+=-weight*Jdet*gauss->weight*(dbasis[0*numvertices+i]*dk[0]+dbasis[1*numvertices+i]*dk[1]); 1041 } 1042 else{ 1043 ge[i]+=-weight*Jdet*gauss->weight*dbasis[0*numvertices+i]*dk[0]; 1044 } 1045 _assert_(!xIsNan<IssmDouble>(ge[i])); 1046 } 1047 } 1048 gradient->SetValues(numvertices,vertexpidlist,ge,ADD_VAL); 1049 1050 /*Clean up and return*/ 1051 xDelete<IssmDouble>(xyz_list); 1052 xDelete<IssmDouble>(dbasis); 1053 xDelete<IssmDouble>(ge); 1054 xDelete<int>(vertexpidlist); 1055 delete gauss; 1056 if(domaintype!=Domain2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;}; 1057 1058 }/*}}}*/ 1059 void AdjointHorizAnalysis::GradientJBGradient(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/ 1060 1061 /*Intermediaries*/ 1062 int domaintype,dim; 1063 Element* basalelement; 1064 1065 /*Get basal element*/ 1066 element->FindParam(&domaintype,DomainTypeEnum); 1067 switch(domaintype){ 1068 case Domain2DhorizontalEnum: 1069 basalelement = element; 1070 dim = 2; 1071 break; 1072 case Domain2DverticalEnum: 1073 if(!element->IsOnBase()) return; 1074 basalelement = element->SpawnBasalElement(); 1075 dim = 1; 1076 break; 1077 case Domain3DEnum: 1078 if(!element->IsOnBase()) return; 1079 basalelement = element->SpawnBasalElement(); 1080 dim = 2; 1081 break; 1082 default: _error_("mesh "<<EnumToStringx(domaintype)<<" not supported yet"); 1083 } 1084 1085 /*Intermediaries*/ 1086 IssmDouble Jdet,weight; 1087 IssmDouble dk[3]; 1088 IssmDouble *xyz_list= NULL; 1089 1090 /*Fetch number of vertices for this finite element*/ 1091 int numvertices = basalelement->GetNumberOfVertices(); 1092 1093 /*Initialize some vectors*/ 1094 IssmDouble* dbasis = xNew<IssmDouble>(2*numvertices); 1095 IssmDouble* ge = xNewZeroInit<IssmDouble>(numvertices); 1096 int* vertexpidlist = xNew<int>(numvertices); 1097 1098 /*Retrieve all inputs we will be needing: */ 1099 basalelement->GetVerticesCoordinates(&xyz_list); 1100 basalelement->GradientIndexing(&vertexpidlist[0],control_index); 1101 Input* rheologyb_input = basalelement->GetInput(MaterialsRheologyBbarEnum); _assert_(rheologyb_input); 1102 Input* weights_input = basalelement->GetInput(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input); 1103 1104 /* Start looping on the number of gaussian points: */ 1105 Gauss* gauss=basalelement->NewGauss(2); 1106 for(int ig=gauss->begin();ig<gauss->end();ig++){ 1107 gauss->GaussPoint(ig); 1108 1109 basalelement->JacobianDeterminant(&Jdet,xyz_list,gauss); 1110 basalelement->NodalFunctionsP1Derivatives(dbasis,xyz_list,gauss); 1111 weights_input->GetInputValue(&weight,gauss,RheologyBbarAbsGradientEnum); 1112 1113 /*Build alpha_complement_list: */ 1114 rheologyb_input->GetInputDerivativeValue(&dk[0],xyz_list,gauss); 1115 1037 1116 /*Build gradje_g_gaussian vector (actually -dJ/ddrag): */ 1038 1117 for(int i=0;i<numvertices;i++){ … … 1055 1134 delete gauss; 1056 1135 if(domaintype!=Domain2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;}; 1057 1058 }/*}}}*/1059 void AdjointHorizAnalysis::GradientJBGradient(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/1060 1061 /*Intermediaries*/1062 int domaintype,dim;1063 Element* basalelement;1064 1065 /*Get basal element*/1066 element->FindParam(&domaintype,DomainTypeEnum);1067 switch(domaintype){1068 case Domain2DhorizontalEnum:1069 basalelement = element;1070 dim = 2;1071 break;1072 case Domain2DverticalEnum:1073 if(!element->IsOnBase()) return;1074 basalelement = element->SpawnBasalElement();1075 dim = 1;1076 break;1077 case Domain3DEnum:1078 if(!element->IsOnBase()) return;1079 basalelement = element->SpawnBasalElement();1080 dim = 2;1081 break;1082 default: _error_("mesh "<<EnumToStringx(domaintype)<<" not supported yet");1083 }1084 1085 /*Intermediaries*/1086 IssmDouble Jdet,weight;1087 IssmDouble dk[3];1088 IssmDouble *xyz_list= NULL;1089 1090 /*Fetch number of vertices for this finite element*/1091 int numvertices = basalelement->GetNumberOfVertices();1092 1093 /*Initialize some vectors*/1094 IssmDouble* dbasis = xNew<IssmDouble>(2*numvertices);1095 IssmDouble* ge = xNewZeroInit<IssmDouble>(numvertices);1096 int* vertexpidlist = xNew<int>(numvertices);1097 1098 /*Retrieve all inputs we will be needing: */1099 basalelement->GetVerticesCoordinates(&xyz_list);1100 basalelement->GradientIndexing(&vertexpidlist[0],control_index);1101 Input* rheologyb_input = basalelement->GetInput(MaterialsRheologyBbarEnum); _assert_(rheologyb_input);1102 Input* weights_input = basalelement->GetInput(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);1103 1104 /* Start looping on the number of gaussian points: */1105 Gauss* gauss=basalelement->NewGauss(2);1106 for(int ig=gauss->begin();ig<gauss->end();ig++){1107 gauss->GaussPoint(ig);1108 1109 basalelement->JacobianDeterminant(&Jdet,xyz_list,gauss);1110 basalelement->NodalFunctionsP1Derivatives(dbasis,xyz_list,gauss);1111 weights_input->GetInputValue(&weight,gauss,RheologyBbarAbsGradientEnum);1112 1113 /*Build alpha_complement_list: */1114 rheologyb_input->GetInputDerivativeValue(&dk[0],xyz_list,gauss);1115 1116 /*Build gradje_g_gaussian vector (actually -dJ/ddrag): */1117 for(int i=0;i<numvertices;i++){1118 if(dim==2){1119 ge[i]+=-weight*Jdet*gauss->weight*(dbasis[0*numvertices+i]*dk[0]+dbasis[1*numvertices+i]*dk[1]);1120 }1121 else{1122 ge[i]+=-weight*Jdet*gauss->weight*dbasis[0*numvertices+i]*dk[0];1123 }1124 _assert_(!xIsNan<IssmDouble>(ge[i]));1125 }1126 }1127 gradient->SetValues(numvertices,vertexpidlist,ge,ADD_VAL);1128 1129 /*Clean up and return*/1130 xDelete<IssmDouble>(xyz_list);1131 xDelete<IssmDouble>(dbasis);1132 xDelete<IssmDouble>(ge);1133 xDelete<int>(vertexpidlist);1134 delete gauss;1135 if(domaintype!=Domain2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;};1136 1136 }/*}}}*/ 1137 1137 void AdjointHorizAnalysis::GradientJDragSSA(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/
Note:
See TracChangeset
for help on using the changeset viewer.