Changeset 6131
- Timestamp:
- 10/04/10 08:00:41 (14 years ago)
- Location:
- issm/trunk/src/c
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk/src/c/modules/ModelProcessorx/Balancedthickness/UpdateElementsBalancedthickness.cpp
r5358 r6131 39 39 IoModelFetchData(&iomodel->thickness_obs,NULL,NULL,iomodel_handle,"thickness_obs"); 40 40 IoModelFetchData(&iomodel->weights,NULL,NULL,iomodel_handle,"weights"); 41 if(iomodel->control_type==DhDtEnum ){41 if(iomodel->control_type==DhDtEnum || iomodel->control_type==VxEnum || iomodel->control_type==VyEnum){ 42 42 IoModelFetchData(&iomodel->control_parameter,NULL,NULL,iomodel_handle,EnumToModelField(iomodel->control_type)); //copy the control parameter in iomodel 43 43 } -
issm/trunk/src/c/modules/ModelProcessorx/Control/CreateParametersControl.cpp
r5631 r6131 26 26 27 27 /*What control type?*/ 28 if (iomodel->control_type!=DragCoefficientEnum && iomodel->control_type!=RheologyBbarEnum && iomodel->control_type!=DhDtEnum){ 28 if (iomodel->control_type!=DragCoefficientEnum && 29 iomodel->control_type!=RheologyBbarEnum && 30 iomodel->control_type!=DhDtEnum && 31 iomodel->control_type!=VxEnum && 32 iomodel->control_type!=VyEnum 33 ){ 29 34 ISSMERROR("control_type %s not supported yet!",EnumToString(iomodel->control_type)); 30 35 } -
issm/trunk/src/c/objects/Elements/Tria.cpp
r6130 r6131 673 673 } 674 674 else if (control_type==RheologyBbarEnum){ 675 Input* Bbar_input=matice->inputs->GetInput(RheologyBbarEnum); ISSMASSERT(Bbar_input); 676 Bbar_input->GetParameterDerivativeValue(&dB[0], &xyz_list[0][0], gauss); 677 //Jelem+=cm_noisedmp*1/2*(pow(dB[0],2)+pow(dB[1],2))*Jdet*gauss->weight; 675 //nothing 678 676 } 679 677 else if (control_type==DhDtEnum){ 680 Input* dhdt_input=inputs->GetInput(DhDtEnum); ISSMASSERT(dhdt_input); 681 dhdt_input->GetParameterDerivativeValue(&dB[0], &xyz_list[0][0], gauss); 682 //Jelem+=cm_noisedmp*1/2*(pow(dB[0],2)+pow(dB[1],2))*Jdet*gauss->weight; 678 //nothing 679 } 680 else if (control_type==VxEnum){ 681 //nothing 682 } 683 else if (control_type==VyEnum){ 684 //nothing 683 685 } 684 686 else{ 685 ISSMERROR(" %s%i","unsupported control type: ",control_type);687 ISSMERROR("unsupported control type: %s",EnumToString(control_type)); 686 688 } 687 689 } … … 882 884 GradjDhDt(gradient); 883 885 break; 886 case VxEnum: 887 GradjVx(gradient); 888 break; 889 case VyEnum: 890 GradjVy(gradient); 891 break; 884 892 default: 885 893 ISSMERROR("%s%i","control type not supported yet: ",control_type); … … 964 972 965 973 int i; 966 967 /* node data: */ 974 int ig; 975 968 976 double xyz_list[NUMVERTICES][3]; 969 977 int doflist1[NUMVERTICES]; 970 978 double dh1dh3[NDOF2][NUMVERTICES]; 971 972 /* gaussian points: */973 int ig;974 979 GaussTria *gauss=NULL; 975 976 /* parameters: */977 980 double dk[NDOF2]; 978 981 double vx,vy; … … 983 986 double drag; 984 987 Friction* friction=NULL; 985 986 /*element vector at the gaussian points: */987 988 double grade_g[NUMVERTICES]={0.0}; 988 989 double grade_g_gaussian[NUMVERTICES]; 989 990 /* Jacobian: */991 990 double Jdet; 992 993 /*nodal functions: */994 991 double l1l2l3[3]; 995 996 /* strain rate: */997 992 double epsilon[3]; /* epsilon=[exx,eyy,exy];*/ 998 999 /*parameters: */1000 993 double cm_noisedmp; 1001 994 int analysis_type; … … 1100 1093 } 1101 1094 /*}}}*/ 1095 /*FUNCTION Tria::GradjVx{{{1*/ 1096 void Tria::GradjVx(Vec gradient){ 1097 1098 /*Intermediaries*/ 1099 int i,ig; 1100 int doflist1[NUMVERTICES]; 1101 double l1l2l3[3]; 1102 double thickness,Jdet; 1103 double Dlambda[2]; 1104 double xyz_list[NUMVERTICES][3]; 1105 GaussTria *gauss = NULL; 1106 double grade_g[NUMVERTICES] = {0.0}; 1107 1108 /* Get node coordinates and dof list: */ 1109 GetVerticesCoordinates(&xyz_list[0][0], nodes, NUMVERTICES); 1110 GetDofList1(&doflist1[0]); 1111 1112 /*Retrieve all inputs we will be needing: */ 1113 Input* adjoint_input=inputs->GetInput(AdjointEnum); ISSMASSERT(adjoint_input); 1114 Input* thickness_input=inputs->GetInput(ThicknessEnum); ISSMASSERT(thickness_input); 1115 1116 /* Start looping on the number of gaussian points: */ 1117 gauss=new GaussTria(2); 1118 for (ig=gauss->begin();ig<gauss->end();ig++){ 1119 1120 gauss->GaussPoint(ig); 1121 1122 adjoint_input->GetParameterDerivativeValue(&Dlambda[0],&xyz_list[0][0],gauss); 1123 thickness_input->GetParameterValue(&thickness, gauss); 1124 1125 GetJacobianDeterminant2d(&Jdet, &xyz_list[0][0],gauss); 1126 GetNodalFunctions(l1l2l3, gauss); 1127 1128 for(i=0;i<NUMVERTICES;i++) grade_g[i]=thickness*Dlambda[0]*Jdet*gauss->weight*l1l2l3[i]; 1129 } 1130 1131 VecSetValues(gradient,NUMVERTICES,doflist1,(const double*)grade_g,ADD_VALUES); 1132 1133 /*Clean up and return*/ 1134 delete gauss; 1135 } 1136 /*}}}*/ 1137 /*FUNCTION Tria::GradjVy{{{1*/ 1138 void Tria::GradjVy(Vec gradient){ 1139 1140 /*Intermediaries*/ 1141 int i,ig; 1142 int doflist1[NUMVERTICES]; 1143 double thickness,Jdet; 1144 double l1l2l3[3]; 1145 double Dlambda[2]; 1146 double xyz_list[NUMVERTICES][3]; 1147 GaussTria *gauss = NULL; 1148 double grade_g[NUMVERTICES] = {0.0}; 1149 1150 /* Get node coordinates and dof list: */ 1151 GetVerticesCoordinates(&xyz_list[0][0], nodes, NUMVERTICES); 1152 GetDofList1(&doflist1[0]); 1153 1154 /*Retrieve all inputs we will be needing: */ 1155 Input* adjoint_input=inputs->GetInput(AdjointEnum); ISSMASSERT(adjoint_input); 1156 Input* thickness_input=inputs->GetInput(ThicknessEnum); ISSMASSERT(thickness_input); 1157 1158 /* Start looping on the number of gaussian points: */ 1159 gauss=new GaussTria(2); 1160 for (ig=gauss->begin();ig<gauss->end();ig++){ 1161 1162 gauss->GaussPoint(ig); 1163 1164 adjoint_input->GetParameterDerivativeValue(&Dlambda[0],&xyz_list[0][0],gauss); 1165 thickness_input->GetParameterValue(&thickness, gauss); 1166 1167 GetJacobianDeterminant2d(&Jdet, &xyz_list[0][0],gauss); 1168 GetNodalFunctions(l1l2l3, gauss); 1169 1170 for(i=0;i<NUMVERTICES;i++) grade_g[i]=thickness*Dlambda[1]*Jdet*gauss->weight*l1l2l3[i]; 1171 } 1172 1173 VecSetValues(gradient,NUMVERTICES,doflist1,(const double*)grade_g,ADD_VALUES); 1174 1175 /*Clean up and return*/ 1176 delete gauss; 1177 } 1178 /*}}}*/ 1102 1179 /*FUNCTION Tria::InputControlUpdate{{{1*/ 1103 1180 void Tria::InputControlUpdate(double scalar,bool save_parameter){ … … 1114 1191 1115 1192 /*Rheology*/ 1116 if(control_type==RheologyBbarEnum){ 1117 1118 /*First, get revert to previous parameter value (kept in ControlParameter input)*/ 1119 matice->inputs->DuplicateInput(ControlParameterEnum,RheologyBbarEnum); 1120 1121 /*Now, update using the gradient new = old + scalar * gradient*/ 1122 //matice->inputs->AXPY(RheologyBbarEnum,scalar,GradientEnum); 1123 // For now: Gradient is in element (TO BE CHANGED) and parameter in matice 1124 Input* input_B =(Input*)matice->inputs->GetInput(RheologyBbarEnum); ISSMASSERT(input_B); 1125 Input* input_Grad=(Input*)this->inputs->GetInput(GradientEnum); ISSMASSERT(input_Grad); 1126 input_B->AXPY(input_Grad,scalar); 1127 1128 /*Constrain constrain input*/ 1129 input=(Input*)matice->inputs->GetInput(RheologyBbarEnum); ISSMASSERT(input); 1130 input->Constrain(cm_min,cm_max); 1131 1132 /*Finally: save input if requested*/ 1133 if (save_parameter) matice->inputs->DuplicateInput(RheologyBbarEnum,ControlParameterEnum); 1134 1135 } 1136 else if(control_type==DragCoefficientEnum){ 1137 1138 /*First, get revert to previous parameter value (kept in ControlParameter input)*/ 1139 this->inputs->DuplicateInput(ControlParameterEnum,DragCoefficientEnum); 1140 1141 /*Now, update using the gradient new = old + scalar * gradient*/ 1142 this->inputs->AXPY(DragCoefficientEnum,scalar,GradientEnum); 1143 1144 /*Constrain input*/ 1145 input=(Input*)this->inputs->GetInput(DragCoefficientEnum); ISSMASSERT(input); 1146 input->Constrain(cm_min,cm_max); 1147 1148 /*Finally: save input if requested*/ 1149 if (save_parameter) inputs->DuplicateInput(DragCoefficientEnum,ControlParameterEnum); 1150 1151 } 1152 else if(control_type==DhDtEnum){ 1153 1154 /*First, get revert to previous parameter value (kept in ControlParameter input)*/ 1155 this->inputs->DuplicateInput(ControlParameterEnum,DhDtEnum); 1156 1157 /*Now, update using the gradient new = old + scalar * gradient*/ 1158 this->inputs->AXPY(DhDtEnum,scalar,GradientEnum); 1159 1160 /*Constrain input*/ 1161 input=(Input*)this->inputs->GetInput(DhDtEnum); ISSMASSERT(input); 1162 input->Constrain(cm_min,cm_max); 1163 1164 /*Finally: save input if requested*/ 1165 if (save_parameter) inputs->DuplicateInput(DhDtEnum,ControlParameterEnum); 1166 1167 } 1168 else{ 1169 ISSMERROR("control type %s not implemented yet",EnumToString(control_type)); 1193 switch(control_type){ 1194 1195 case RheologyBbarEnum:{ 1196 1197 /*First, get revert to previous parameter value (kept in ControlParameter input)*/ 1198 matice->inputs->DuplicateInput(ControlParameterEnum,RheologyBbarEnum); 1199 1200 /*Now, update using the gradient new = old + scalar * gradient*/ 1201 //matice->inputs->AXPY(RheologyBbarEnum,scalar,GradientEnum); 1202 // For now: Gradient is in element (TO BE CHANGED) and parameter in matice 1203 Input* input_B =(Input*)matice->inputs->GetInput(RheologyBbarEnum); ISSMASSERT(input_B); 1204 Input* input_Grad=(Input*)this->inputs->GetInput(GradientEnum); ISSMASSERT(input_Grad); 1205 input_B->AXPY(input_Grad,scalar); 1206 1207 /*Constrain constrain input*/ 1208 input=(Input*)matice->inputs->GetInput(RheologyBbarEnum); ISSMASSERT(input); 1209 input->Constrain(cm_min,cm_max); 1210 1211 /*Finally: save input if requested*/ 1212 if (save_parameter) matice->inputs->DuplicateInput(RheologyBbarEnum,ControlParameterEnum); 1213 } 1214 break; 1215 1216 case DragCoefficientEnum:{ 1217 this->inputs->DuplicateInput(ControlParameterEnum,DragCoefficientEnum); 1218 this->inputs->AXPY(DragCoefficientEnum,scalar,GradientEnum); 1219 input=(Input*)this->inputs->GetInput(DragCoefficientEnum); ISSMASSERT(input); 1220 input->Constrain(cm_min,cm_max); 1221 if (save_parameter) inputs->DuplicateInput(DragCoefficientEnum,ControlParameterEnum); 1222 } 1223 break; 1224 case DhDtEnum:{ 1225 this->inputs->DuplicateInput(ControlParameterEnum,DhDtEnum); 1226 this->inputs->AXPY(DhDtEnum,scalar,GradientEnum); 1227 input=(Input*)this->inputs->GetInput(DhDtEnum); ISSMASSERT(input); 1228 input->Constrain(cm_min,cm_max); 1229 if (save_parameter) inputs->DuplicateInput(DhDtEnum,ControlParameterEnum); 1230 } 1231 break; 1232 case VxEnum:{ 1233 this->inputs->DuplicateInput(ControlParameterEnum,VxEnum); 1234 this->inputs->AXPY(VxEnum,scalar,GradientEnum); 1235 input=(Input*)this->inputs->GetInput(VxEnum); ISSMASSERT(input); 1236 input->Constrain(cm_min,cm_max); 1237 if (save_parameter) inputs->DuplicateInput(VxEnum,ControlParameterEnum); 1238 } 1239 break; 1240 case VyEnum:{ 1241 this->inputs->DuplicateInput(ControlParameterEnum,VyEnum); 1242 this->inputs->AXPY(VyEnum,scalar,GradientEnum); 1243 input=(Input*)this->inputs->GetInput(VyEnum); ISSMASSERT(input); 1244 input->Constrain(cm_min,cm_max); 1245 if (save_parameter) inputs->DuplicateInput(VyEnum,ControlParameterEnum); 1246 } 1247 break; 1248 default: 1249 ISSMERROR("control type %s not implemented yet",EnumToString(control_type)); 1170 1250 } 1171 1251 … … 3894 3974 * 2 [ obs obs ] 3895 3975 * 3896 * dJ 23976 * dJ 3897 3977 * DU = - -- = (u - u ) 3898 3978 * du obs -
issm/trunk/src/c/objects/Elements/Tria.h
r6130 r6131 86 86 void GradjDrag(Vec gradient); 87 87 void GradjDhDt(Vec gradient); 88 void GradjVx(Vec gradient); 89 void GradjVy(Vec gradient); 88 90 void InputControlUpdate(double scalar,bool save_parameter); 89 91 void InputArtificialNoise(int enum_type,double min, double max); -
issm/trunk/src/c/solutions/adjointbalancedthickness_core.cpp
r5414 r6131 38 38 39 39 /*Save results*/ 40 if(solution_type==AdjointSolutionEnum && !control_analysis){40 //if(solution_type==AdjointSolutionEnum && !control_analysis){ 41 41 if(verbose)_printf_("saving results:\n"); 42 42 InputToResultx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,AdjointEnum); 43 }43 //} 44 44 }
Note:
See TracChangeset
for help on using the changeset viewer.