Changeset 17971
- Timestamp:
- 05/09/14 11:30:18 (11 years ago)
- Location:
- issm/trunk-jpl/src/c
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/analyses/AdjointHorizAnalysis.cpp
r17969 r17971 332 332 /*Prepare coordinate system list*/ 333 333 int* cs_list = xNew<int>(vnumnodes+pnumnodes); 334 for(i=0;i<vnumnodes;i++) cs_list[i] = XYZEnum; 334 if(dim==2) for(i=0;i<vnumnodes;i++) cs_list[i] = XYEnum; 335 else for(i=0;i<vnumnodes;i++) cs_list[i] = XYZEnum; 335 336 for(i=0;i<pnumnodes;i++) cs_list[vnumnodes+i] = PressureEnum; 336 337 … … 513 514 delete gauss; 514 515 return pe; 515 _error_("S");516 516 }/*}}}*/ 517 517 ElementVector* AdjointHorizAnalysis::CreatePVectorHO(Element* element){/*{{{*/ … … 951 951 }/*}}}*/ 952 952 void AdjointHorizAnalysis::InputUpdateFromSolutionFS(IssmDouble* solution,Element* element){/*{{{*/ 953 int i ;953 int i,dim; 954 954 int* vdoflist=NULL; 955 955 int* pdoflist=NULL; 956 956 IssmDouble FSreconditioning; 957 957 958 element->FindParam(&dim,DomainDimensionEnum); 959 958 960 /*Fetch number of nodes and dof for this finite element*/ 959 961 int vnumnodes = element->NumberofNodesVelocity(); 960 962 int pnumnodes = element->NumberofNodesPressure(); 961 int vnumdof = vnumnodes* 3;963 int vnumdof = vnumnodes*dim; 962 964 int pnumdof = pnumnodes*1; 963 965 … … 970 972 971 973 int* cs_list = xNew<int>(vnumnodes+pnumnodes); 972 for(i=0;i<vnumnodes;i++) cs_list[i] = XYZEnum; 974 if(dim==2) for(i=0;i<vnumnodes;i++) cs_list[i] = XYEnum; 975 else for(i=0;i<vnumnodes;i++) cs_list[i] = XYZEnum; 973 976 for(i=0;i<pnumnodes;i++) cs_list[vnumnodes+i] = PressureEnum; 974 977 -
issm/trunk-jpl/src/c/classes/Elements/Seg.cpp
r17962 r17971 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 void Seg::GradjDragFS(Vector<IssmDouble>* gradient,int control_index){/*{{{*/ 132 133 int i; 134 int analysis_type; 135 int vertexpidlist[NUMVERTICES]; 136 int connectivity[NUMVERTICES]; 137 IssmDouble vx,lambda,alpha_complement,drag,Jdet; 138 IssmDouble xyz_list[NUMVERTICES][3]; 139 IssmDouble dk[NDOF2]; 140 IssmDouble grade_g[NUMVERTICES]={0.0}; 141 IssmDouble grade_g_gaussian[NUMVERTICES]; 142 IssmDouble basis[3]; 143 Friction* friction=NULL; 144 GaussSeg *gauss=NULL; 145 146 if(IsFloating())return; 147 148 /*retrive parameters: */ 149 parameters->FindParam(&analysis_type,AnalysisTypeEnum); 150 ::GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES); 151 GradientIndexing(&vertexpidlist[0],control_index); 152 this->GetVerticesConnectivityList(&connectivity[0]); 153 154 /*Build frictoin element, needed later: */ 155 friction=new Friction(this,1); 156 157 /*Retrieve all inputs we will be needing: */ 158 Input* adjointx_input=inputs->GetInput(AdjointxEnum); _assert_(adjointx_input); 159 Input* vx_input=inputs->GetInput(VxEnum); _assert_(vx_input); 160 Input* dragcoefficient_input=inputs->GetInput(FrictionCoefficientEnum); _assert_(dragcoefficient_input); 161 162 /* Start looping on the number of gaussian points: */ 163 gauss=new GaussSeg(4); 164 for(int ig=gauss->begin();ig<gauss->end();ig++){ 165 166 gauss->GaussPoint(ig); 167 168 GetJacobianDeterminant(&Jdet, &xyz_list[0][0],gauss); 169 GetNodalFunctions(basis, gauss); 170 171 /*Build alpha_complement_list: */ 172 friction->GetAlphaComplement(&alpha_complement,gauss); 173 174 dragcoefficient_input->GetInputValue(&drag, gauss); 175 adjointx_input->GetInputValue(&lambda, gauss); 176 vx_input->GetInputValue(&vx,gauss); 177 dragcoefficient_input->GetInputDerivativeValue(&dk[0],&xyz_list[0][0],gauss); 178 179 /*Build gradje_g_gaussian vector (actually -dJ/ddrag): */ 180 for (i=0;i<NUMVERTICES;i++){ 181 grade_g_gaussian[i]=-2*drag*alpha_complement*(lambda*vx)*Jdet*gauss->weight*basis[i]; 182 } 183 184 /*Add gradje_g_gaussian vector to gradje_g: */ 185 for(i=0;i<NUMVERTICES;i++){ 186 _assert_(!xIsNan<IssmDouble>(grade_g[i])); 187 grade_g[i]+=grade_g_gaussian[i]; 188 } 189 } 190 gradient->SetValues(NUMVERTICES,vertexpidlist,grade_g,ADD_VAL); 191 192 /*Clean up and return*/ 193 delete gauss; 194 delete friction; 195 } 196 /*}}}*/ 118 197 bool Seg::IsIcefront(void){/*{{{*/ 119 198 -
issm/trunk-jpl/src/c/classes/Elements/Seg.h
r17926 r17971 169 169 170 170 IssmDouble DragCoefficientAbsGradient(void){_error_("not implemented yet");}; 171 void GradientIndexing(int* indexing,int control_index) {_error_("not implemented yet");};171 void GradientIndexing(int* indexing,int control_index); 172 172 void Gradj(Vector<IssmDouble>* gradient,int control_type,int control_index){_error_("not implemented yet");}; 173 173 void GradjBGradient(Vector<IssmDouble>* gradient,int control_index){_error_("not implemented yet");}; … … 176 176 void GradjDSSA(Vector<IssmDouble>* gradient,int control_index){_error_("not implemented yet");}; 177 177 void GradjDragSSA(Vector<IssmDouble>* gradient,int control_index){_error_("not implemented yet");}; 178 void GradjDragFS(Vector<IssmDouble>* gradient,int control_index) {_error_("not implemented yet");};178 void GradjDragFS(Vector<IssmDouble>* gradient,int control_index); 179 179 void GradjDragGradient(Vector<IssmDouble>* gradient,int control_index){_error_("not implemented yet");}; 180 180 void GradjDhDtBalancedthickness(Vector<IssmDouble>* gradient,int control_index){_error_("not implemented yet");}; -
issm/trunk-jpl/src/c/classes/Elements/Tria.cpp
r17962 r17971 2863 2863 /*dJ/dalpha = ∂L/∂alpha = ∂J/∂alpha + ∂/∂alpha(KU-F)*/ 2864 2864 2865 int approximation; 2866 Seg* seg=NULL; 2867 2865 2868 /*If on water, grad = 0: */ 2866 2869 if(!IsIceInElement()) return; … … 2869 2872 switch(control_type){ 2870 2873 case FrictionCoefficientEnum: 2874 inputs->GetInputValue(&approximation,ApproximationEnum); 2875 switch(approximation){ 2876 case SSAApproximationEnum: 2877 GradjDragSSA(gradient,control_index); 2878 break; 2879 case FSApproximationEnum: 2880 GradjDragFS(gradient,control_index); 2881 break; 2882 case NoneApproximationEnum: 2883 /*Gradient is 0*/ 2884 break; 2885 default: 2886 _error_("approximation " << EnumToStringx(approximation) << " not supported yet"); 2887 } 2888 break; 2871 2889 GradjDragSSA(gradient,control_index); 2872 2890 break; … … 3163 3181 delete gauss; 3164 3182 delete friction; 3183 } 3184 /*}}}*/ 3185 void Tria::GradjDragFS(Vector<IssmDouble>* gradient,int control_index){/*{{{*/ 3186 3187 /*Gradient is 0 if on shelf or not on bed*/ 3188 if(IsFloating() || !IsOnBase()) return; 3189 3190 int index1,index2; 3191 this->EdgeOnBaseIndices(&index1,&index2); 3192 Seg* seg = SpawnSeg(index1,index2); 3193 seg->GradjDragFS(gradient,control_index); 3194 seg->DeleteMaterials(); delete seg; 3165 3195 } 3166 3196 /*}}}*/ -
issm/trunk-jpl/src/c/cores/adjointstressbalance_core.cpp
r16518 r17971 38 38 if(VerboseSolution()) _printf0_(" saving results\n"); 39 39 if (isFS){ 40 int outputs[4] = {AdjointxEnum,AdjointyEnum,AdjointzEnum,AdjointpEnum}; 41 femmodel->RequestedOutputsx(&femmodel->results,&outputs[0],4); 40 //int outputs[4] = {AdjointxEnum,AdjointyEnum,AdjointzEnum,AdjointpEnum}; 41 //femmodel->RequestedOutputsx(&femmodel->results,&outputs[0],4); 42 int outputs[3] = {AdjointxEnum,AdjointyEnum,AdjointpEnum}; 43 femmodel->RequestedOutputsx(&femmodel->results,&outputs[0],3); 42 44 } 43 45 else{
Note:
See TracChangeset
for help on using the changeset viewer.