Changeset 18058
- Timestamp:
- 05/25/14 18:01:37 (11 years ago)
- Location:
- issm/trunk-jpl/src/c
- Files:
-
- 9 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){/*{{{*/ -
issm/trunk-jpl/src/c/classes/Elements/Element.cpp
r18039 r18058 603 603 return z; 604 604 }/*}}}*/ 605 void Element::GradientIndexing(int* indexing,int control_index){/*{{{*/ 606 607 /*Get number of controls*/ 608 int num_controls; 609 parameters->FindParam(&num_controls,InversionNumControlParametersEnum); 610 611 /*Get number of vertices*/ 612 int numvertices = this->GetNumberOfVertices(); 613 614 /*get gradient indices*/ 615 for(int i=0;i<numvertices;i++){ 616 indexing[i]=num_controls*this->vertices[i]->Pid() + control_index; 617 } 618 619 } 620 /*}}}*/ 605 621 bool Element::HasNodeOnBase(){/*{{{*/ 606 622 return (this->inputs->Max(MeshVertexonbaseEnum)>0.); -
issm/trunk-jpl/src/c/classes/Elements/Element.h
r18001 r18058 94 94 IssmDouble GetYcoord(IssmDouble* xyz_list,Gauss* gauss); 95 95 IssmDouble GetZcoord(IssmDouble* xyz_list,Gauss* gauss); 96 void GradientIndexing(int* indexing,int control_index); 96 97 bool HasNodeOnBase(); 97 98 bool HasNodeOnSurface(); -
issm/trunk-jpl/src/c/classes/Elements/Penta.cpp
r18001 r18058 2895 2895 2896 2896 }/*}}}*/ 2897 void Penta::GradientIndexing(int* indexing,int control_index){/*{{{*/2898 2899 /*Get some parameters*/2900 int num_controls;2901 parameters->FindParam(&num_controls,InversionNumControlParametersEnum);2902 2903 /*get gradient indices*/2904 for(int i=0;i<NUMVERTICES;i++){2905 indexing[i]=num_controls*this->vertices[i]->Pid() + control_index;2906 }2907 2908 }2909 /*}}}*/2910 2897 void Penta::Gradj(Vector<IssmDouble>* gradient,int control_type,int control_index){/*{{{*/ 2911 2898 /*dJ/dalpha = ∂L/∂alpha = ∂J/∂alpha + ∂/∂alpha(KU-F)*/ -
issm/trunk-jpl/src/c/classes/Elements/Penta.h
r18001 r18058 131 131 #endif 132 132 133 void GradientIndexing(int* indexing,int control_index);134 133 void Gradj(Vector<IssmDouble>* gradient,int control_type,int control_index); 135 134 void GradjDragSSA(Vector<IssmDouble>* gradient,int control_index); -
issm/trunk-jpl/src/c/classes/Elements/Seg.cpp
r17972 r18058 116 116 117 117 }/*}}}*/ 118 void Seg::GradientIndexing(int* indexing,int control_index){/*{{{*/119 120 /*Get some parameters*/121 int num_controls;122 parameters->FindParam(&num_controls,InversionNumControlParametersEnum);123 124 /*get gradient indices*/125 for(int i=0;i<NUMVERTICES;i++){126 indexing[i]=num_controls*this->vertices[i]->Pid() + control_index;127 }128 129 }130 /*}}}*/131 118 void Seg::GradjDragFS(Vector<IssmDouble>* gradient,int control_index){/*{{{*/ 132 119 -
issm/trunk-jpl/src/c/classes/Elements/Seg.h
r18001 r18058 167 167 #endif 168 168 169 void GradientIndexing(int* indexing,int control_index);170 169 void Gradj(Vector<IssmDouble>* gradient,int control_type,int control_index){_error_("not implemented yet");}; 171 170 void GradjBGradient(Vector<IssmDouble>* gradient,int control_index){_error_("not implemented yet");}; -
issm/trunk-jpl/src/c/classes/Elements/Tria.cpp
r18056 r18058 3403 3403 } 3404 3404 /*}}}*/ 3405 void Tria::GradientIndexing(int* indexing,int control_index){/*{{{*/3406 3407 /*Get some parameters*/3408 int num_controls;3409 parameters->FindParam(&num_controls,InversionNumControlParametersEnum);3410 3411 /*get gradient indices*/3412 for(int i=0;i<NUMVERTICES;i++){3413 indexing[i]=num_controls*this->vertices[i]->Pid() + control_index;3414 }3415 3416 }3417 /*}}}*/3418 3405 void Tria::GetVectorFromControlInputs(Vector<IssmDouble>* vector,int control_enum,int control_index,const char* data){/*{{{*/ 3419 3406 -
issm/trunk-jpl/src/c/classes/Elements/Tria.h
r18003 r18058 136 136 #endif 137 137 138 void GradientIndexing(int* indexing,int control_index);139 138 void Gradj(Vector<IssmDouble>* gradient,int control_type,int control_index); 140 139 void GradjBGradient(Vector<IssmDouble>* gradient,int control_index);
Note:
See TracChangeset
for help on using the changeset viewer.