Changeset 18058 for issm/trunk-jpl/src/c/analyses/AdjointHorizAnalysis.cpp
- Timestamp:
- 05/25/14 18:01:37 (11 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/analyses/AdjointHorizAnalysis.cpp
r18057 r18058 974 974 }/*}}}*/ 975 975 void AdjointHorizAnalysis::GradientJDragGradient(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/ 976 _error_("not implemented yet"); 976 977 /*return if floating*/ 978 if(element->IsFloating())return; 979 980 /*Intermediaries*/ 981 int domaintype,dim; 982 Element* basalelement; 983 984 /*Get basal element*/ 985 element->FindParam(&domaintype,DomainTypeEnum); 986 switch(domaintype){ 987 case Domain2DhorizontalEnum: 988 basalelement = element; 989 dim = 2; 990 break; 991 case Domain2DverticalEnum: 992 if(!element->IsOnBase()) return; 993 basalelement = element->SpawnBasalElement(); 994 dim = 1; 995 break; 996 case Domain3DEnum: 997 if(!element->IsOnBase()) return; 998 basalelement = element->SpawnBasalElement(); 999 dim = 2; 1000 break; 1001 default: _error_("mesh "<<EnumToStringx(domaintype)<<" not supported yet"); 1002 } 1003 1004 /*Intermediaries*/ 1005 IssmDouble Jdet,weight; 1006 IssmDouble dk[3]; 1007 IssmDouble *xyz_list= NULL; 1008 1009 /*Fetch number of vertices for this finite element*/ 1010 int numvertices = basalelement->GetNumberOfVertices(); 1011 1012 /*Initialize some vectors*/ 1013 IssmDouble* dbasis = xNew<IssmDouble>(2*numvertices); 1014 IssmDouble* ge = xNew<IssmDouble>(numvertices); 1015 int* vertexpidlist = xNew<int>(numvertices); 1016 1017 /*Retrieve all inputs we will be needing: */ 1018 basalelement->GetVerticesCoordinates(&xyz_list); 1019 basalelement->GradientIndexing(&vertexpidlist[0],control_index); 1020 Input* dragcoefficient_input = basalelement->GetInput(FrictionCoefficientEnum); _assert_(dragcoefficient_input); 1021 Input* weights_input = basalelement->GetInput(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input); 1022 1023 /* Start looping on the number of gaussian points: */ 1024 Gauss* gauss=basalelement->NewGauss(2); 1025 for(int ig=gauss->begin();ig<gauss->end();ig++){ 1026 gauss->GaussPoint(ig); 1027 1028 basalelement->JacobianDeterminant(&Jdet,xyz_list,gauss); 1029 basalelement->NodalFunctionsP1Derivatives(dbasis,xyz_list,gauss); 1030 weights_input->GetInputValue(&weight,gauss,DragCoefficientAbsGradientEnum); 1031 1032 /*Build alpha_complement_list: */ 1033 dragcoefficient_input->GetInputDerivativeValue(&dk[0],xyz_list,gauss); 1034 1035 /*Build gradje_g_gaussian vector (actually -dJ/ddrag): */ 1036 for(int i=0;i<numvertices;i++){ 1037 if(dim==2){ 1038 ge[i]+=-weight*Jdet*gauss->weight*(dbasis[0*numvertices+i]*dk[0]+dbasis[1*numvertices+i]*dk[1]); 1039 } 1040 else{ 1041 ge[i]+=-weight*Jdet*gauss->weight*dbasis[0*numvertices+i]*dk[0]; 1042 } 1043 _assert_(!xIsNan<IssmDouble>(ge[i])); 1044 } 1045 } 1046 gradient->SetValues(numvertices,vertexpidlist,ge,ADD_VAL); 1047 1048 /*Clean up and return*/ 1049 xDelete<IssmDouble>(xyz_list); 1050 xDelete<IssmDouble>(dbasis); 1051 xDelete<IssmDouble>(ge); 1052 xDelete<int>(vertexpidlist); 1053 delete gauss; 1054 if(domaintype!=Domain2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;}; 1055 977 1056 }/*}}}*/ 978 1057 void AdjointHorizAnalysis::GradientJBGradient(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/
Note:
See TracChangeset
for help on using the changeset viewer.