Changeset 17972
- Timestamp:
- 05/09/14 14:03:34 (11 years ago)
- Location:
- issm/trunk-jpl/src/c
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
TabularUnified issm/trunk-jpl/src/c/classes/Elements/Seg.cpp ¶
r17971 r17972 195 195 } 196 196 /*}}}*/ 197 void Seg::GradjDragGradient(Vector<IssmDouble>* gradient,int control_index){/*{{{*/ 198 199 int i; 200 int vertexpidlist[NUMVERTICES]; 201 IssmDouble Jdet,weight; 202 IssmDouble xyz_list[NUMVERTICES][3]; 203 IssmDouble dbasis[NDOF2][NUMVERTICES]; 204 IssmDouble dk[NDOF2]; 205 IssmDouble grade_g[NUMVERTICES]={0.0}; 206 GaussSeg *gauss=NULL; 207 208 /*Retrieve all inputs we will be needing: */ 209 if(IsFloating())return; 210 ::GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES); 211 GradientIndexing(&vertexpidlist[0],control_index); 212 Input* dragcoefficient_input=inputs->GetInput(FrictionCoefficientEnum); _assert_(dragcoefficient_input); 213 Input* weights_input=inputs->GetInput(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input); 214 215 /* Start looping on the number of gaussian points: */ 216 gauss=new GaussSeg(2); 217 for(int ig=gauss->begin();ig<gauss->end();ig++){ 218 219 gauss->GaussPoint(ig); 220 221 GetJacobianDeterminant(&Jdet, &xyz_list[0][0],gauss); 222 GetNodalFunctionsDerivatives(&dbasis[0][0],&xyz_list[0][0],gauss); 223 weights_input->GetInputValue(&weight,gauss,DragCoefficientAbsGradientEnum); 224 225 /*Build alpha_complement_list: */ 226 dragcoefficient_input->GetInputDerivativeValue(&dk[0],&xyz_list[0][0],gauss); 227 228 /*Build gradje_g_gaussian vector (actually -dJ/ddrag): */ 229 for (i=0;i<NUMVERTICES;i++){ 230 grade_g[i]+=-weight*Jdet*gauss->weight*dbasis[0][i]*dk[0]; 231 _assert_(!xIsNan<IssmDouble>(grade_g[i])); 232 } 233 } 234 gradient->SetValues(NUMVERTICES,vertexpidlist,grade_g,ADD_VAL); 235 236 /*Clean up and return*/ 237 delete gauss; 238 } 239 /*}}}*/ 197 240 bool Seg::IsIcefront(void){/*{{{*/ 198 241 -
TabularUnified issm/trunk-jpl/src/c/classes/Elements/Seg.h ¶
r17971 r17972 177 177 void GradjDragSSA(Vector<IssmDouble>* gradient,int control_index){_error_("not implemented yet");}; 178 178 void GradjDragFS(Vector<IssmDouble>* gradient,int control_index); 179 void GradjDragGradient(Vector<IssmDouble>* gradient,int control_index) {_error_("not implemented yet");};179 void GradjDragGradient(Vector<IssmDouble>* gradient,int control_index); 180 180 void GradjDhDtBalancedthickness(Vector<IssmDouble>* gradient,int control_index){_error_("not implemented yet");}; 181 181 void GradjVxBalancedthickness(Vector<IssmDouble>* gradient,int control_index){_error_("not implemented yet");}; -
TabularUnified issm/trunk-jpl/src/c/classes/Elements/Tria.cpp ¶
r17971 r17972 2887 2887 } 2888 2888 break; 2889 GradjDragSSA(gradient,control_index);2890 break;2891 2889 case MaterialsRheologyBbarEnum: 2892 2890 GradjBSSA(gradient,control_index); … … 2933 2931 break; 2934 2932 case DragCoefficientAbsGradientEnum: 2935 GradjDragGradient(gradient,control_index); 2933 inputs->GetInputValue(&approximation,ApproximationEnum); 2934 switch(approximation){ 2935 case SSAApproximationEnum: 2936 GradjDragGradient(gradient,control_index); 2937 break; 2938 case FSApproximationEnum:{ 2939 if(IsFloating() || !IsOnBase()) return; 2940 int index1,index2; 2941 this->EdgeOnBaseIndices(&index1,&index2); 2942 Seg* seg = SpawnSeg(index1,index2); 2943 seg->GradjDragGradient(gradient,control_index); 2944 seg->DeleteMaterials(); delete seg; 2945 break; 2946 } 2947 case NoneApproximationEnum: 2948 /*Gradient is 0*/ 2949 break; 2950 default: 2951 _error_("approximation " << EnumToStringx(approximation) << " not supported yet"); 2952 } 2936 2953 break; 2937 2954 case RheologyBbarAbsGradientEnum: -
TabularUnified issm/trunk-jpl/src/c/modules/DragCoefficientAbsGradientx/DragCoefficientAbsGradientx.cpp ¶
r16314 r17972 10 10 void DragCoefficientAbsGradientx( IssmDouble* pJ, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials,Parameters* parameters){ 11 11 12 /*Intermediary*/13 int i;14 Element* element=NULL;15 16 12 /*output: */ 17 IssmDouble J=0 ;13 IssmDouble J=0.; 18 14 IssmDouble J_sum; 19 15 20 16 /*Compute Misfit: */ 21 for (i=0;i<elements->Size();i++){22 element=dynamic_cast<Element*>(elements->GetObjectByOffset(i));23 J+= element->DragCoefficientAbsGradient();17 for(int i=0;i<elements->Size();i++){ 18 Element* element=dynamic_cast<Element*>(elements->GetObjectByOffset(i)); 19 J+=DragCoefficientAbsGradient(element); 24 20 } 25 21 … … 32 28 *pJ=J; 33 29 } 30 31 IssmDouble DragCoefficientAbsGradient(Element* element){ 32 33 int domaintype,numcomponents; 34 bool surfaceintegral; 35 IssmDouble Jelem=0.; 36 IssmDouble misfit,Jdet; 37 IssmDouble dp[2],weight; 38 IssmDouble* xyz_list = NULL; 39 40 /*Get basal element*/ 41 if(!element->IsOnBase()) return 0.; 42 43 /*If on water, return 0: */ 44 if(!element->IsIceInElement()) return 0.; 45 46 /*Get problem dimension*/ 47 element->FindParam(&domaintype,DomainTypeEnum); 48 switch(domaintype){ 49 case Domain2DverticalEnum: 50 surfaceintegral = true; 51 numcomponents = 1; 52 break; 53 case Domain3DEnum: 54 surfaceintegral = true; 55 numcomponents = 2; 56 break; 57 case Domain2DhorizontalEnum: 58 surfaceintegral = false; 59 numcomponents = 2; 60 break; 61 default: _error_("not supported yet"); 62 } 63 64 /*Spawn basal element*/ 65 Element* basalelement = element->SpawnBasalElement(); 66 67 /* Get node coordinates*/ 68 basalelement->GetVerticesCoordinates(&xyz_list); 69 70 /*Retrieve all inputs we will be needing: */ 71 Input* weights_input=basalelement->GetInput(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input); 72 Input* drag_input =basalelement->GetInput(FrictionCoefficientEnum); _assert_(drag_input); 73 74 /* Start looping on the number of gaussian points: */ 75 Gauss* gauss=basalelement->NewGauss(2); 76 for(int ig=gauss->begin();ig<gauss->end();ig++){ 77 78 gauss->GaussPoint(ig); 79 80 /* Get Jacobian determinant: */ 81 basalelement->JacobianDeterminant(&Jdet,xyz_list,gauss); 82 83 /*Get all parameters at gaussian point*/ 84 weights_input->GetInputValue(&weight,gauss,DragCoefficientAbsGradientEnum); 85 drag_input->GetInputDerivativeValue(&dp[0],xyz_list,gauss); 86 87 /*Compute Tikhonov regularization J = 1/2 ((dp/dx)^2 + (dp/dy)^2) */ 88 Jelem+=weight*.5*dp[0]*dp[0]*Jdet*gauss->weight; 89 if(numcomponents==2) Jelem+=weight*.5*dp[1]*dp[1]*Jdet*gauss->weight; 90 91 } 92 93 /*clean up and Return: */ 94 if(domaintype!=Domain2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;}; 95 xDelete<IssmDouble>(xyz_list); 96 delete gauss; 97 return Jelem; 98 } -
TabularUnified issm/trunk-jpl/src/c/modules/DragCoefficientAbsGradientx/DragCoefficientAbsGradientx.h ¶
r16314 r17972 10 10 /* local prototypes: */ 11 11 void DragCoefficientAbsGradientx( IssmDouble* pJ, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters); 12 IssmDouble DragCoefficientAbsGradient(Element* element); 12 13 13 14 #endif -
TabularUnified issm/trunk-jpl/src/c/modules/SurfaceAbsVelMisfitx/SurfaceAbsVelMisfitx.cpp ¶
r17969 r17972 10 10 void SurfaceAbsVelMisfitx( IssmDouble* pJ, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials,Parameters* parameters){ 11 11 12 /*Intermediary*/13 int i;14 Element* element=NULL;15 16 12 /*output: */ 17 IssmDouble J=0 ;13 IssmDouble J=0.; 18 14 IssmDouble J_sum; 19 15 20 16 /*Compute Misfit: */ 21 for (i=0;i<elements->Size();i++){22 element=dynamic_cast<Element*>(elements->GetObjectByOffset(i));17 for(int i=0;i<elements->Size();i++){ 18 Element* element=dynamic_cast<Element*>(elements->GetObjectByOffset(i)); 23 19 J+=SurfaceAbsVelMisfit(element); 24 20 } … … 40 36 IssmDouble misfit,Jdet; 41 37 IssmDouble vx,vy,vxobs,vyobs,weight; 42 IssmDouble* xyz_list _top= NULL;38 IssmDouble* xyz_list = NULL; 43 39 44 40 /*Get basal element*/ … … 66 62 } 67 63 64 /*Spawn surface element*/ 65 Element* topelement = element->SpawnTopElement(); 66 68 67 /* Get node coordinates*/ 69 if(surfaceintegral) element->GetVerticesCoordinatesTop(&xyz_list_top); 70 else element->GetVerticesCoordinates(&xyz_list_top); 68 topelement->GetVerticesCoordinates(&xyz_list); 71 69 72 70 /*Retrieve all inputs we will be needing: */ 73 Input* weights_input= element->GetInput(InversionCostFunctionsCoefficientsEnum);_assert_(weights_input);74 Input* vx_input = element->GetInput(VxEnum);_assert_(vx_input);75 Input* vxobs_input = element->GetInput(InversionVxObsEnum);_assert_(vxobs_input);71 Input* weights_input=topelement->GetInput(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input); 72 Input* vx_input =topelement->GetInput(VxEnum); _assert_(vx_input); 73 Input* vxobs_input =topelement->GetInput(InversionVxObsEnum); _assert_(vxobs_input); 76 74 Input* vy_input = NULL; 77 75 Input* vyobs_input = NULL; 78 76 if(numcomponents==2){ 79 vy_input = element->GetInput(VyEnum); _assert_(vy_input);80 vyobs_input = element->GetInput(InversionVyObsEnum); _assert_(vyobs_input);77 vy_input =topelement->GetInput(VyEnum); _assert_(vy_input); 78 vyobs_input =topelement->GetInput(InversionVyObsEnum); _assert_(vyobs_input); 81 79 } 82 80 83 81 /* Start looping on the number of gaussian points: */ 84 Gauss* gauss=NULL; 85 if(surfaceintegral) gauss=element->NewGaussTop(2); 86 else gauss=element->NewGauss(2); 82 Gauss* gauss=topelement->NewGauss(2); 87 83 for(int ig=gauss->begin();ig<gauss->end();ig++){ 88 84 … … 90 86 91 87 /* Get Jacobian determinant: */ 92 if(surfaceintegral) element->JacobianDeterminantTop(&Jdet,xyz_list_top,gauss); 93 else element->JacobianDeterminant(&Jdet,xyz_list_top,gauss); 88 topelement->JacobianDeterminant(&Jdet,xyz_list,gauss); 94 89 95 90 /*Get all parameters at gaussian point*/ … … 117 112 118 113 /*clean up and Return: */ 114 if(domaintype!=Domain2DhorizontalEnum){topelement->DeleteMaterials(); delete topelement;}; 115 xDelete<IssmDouble>(xyz_list); 119 116 delete gauss; 120 117 return Jelem;
Note:
See TracChangeset
for help on using the changeset viewer.