source:
issm/oecreview/Archive/17984-18295/ISSM-18002-18003.diff@
18296
Last change on this file since 18296 was 18296, checked in by , 11 years ago | |
---|---|
File size: 20.4 KB |
-
../trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.cpp
37 37 }/*}}}*/ 38 38 ElementMatrix* AdjointBalancethickness2Analysis::CreateKMatrix(Element* element){/*{{{*/ 39 39 40 _error_("not implemented");41 40 Balancethickness2Analysis* analysis = new Balancethickness2Analysis(); 42 41 ElementMatrix* Ke = analysis->CreateKMatrix(element); 43 42 delete analysis; 44 43 45 /*Transpose and return Ke*/46 Ke->Transpose();47 44 return Ke; 48 45 }/*}}}*/ 49 46 ElementVector* AdjointBalancethickness2Analysis::CreatePVector(Element* element){/*{{{*/ 50 47 51 _error_("not implemented");52 /*Intermediaries*/53 int domaintype;54 Element* basalelement;55 56 /*Get basal element*/57 element->FindParam(&domaintype,DomainTypeEnum);58 switch(domaintype){59 case Domain2DhorizontalEnum:60 basalelement = element;61 break;62 case Domain3DEnum:63 if(!element->IsOnBase()) return NULL;64 basalelement = element->SpawnBasalElement();65 break;66 default: _error_("mesh "<<EnumToStringx(domaintype)<<" not supported yet");67 }68 69 48 /*Intermediaries */ 70 49 int num_responses,i; 71 IssmDouble dH[2]; 72 IssmDouble vx,vy,vel,Jdet; 73 IssmDouble thickness,thicknessobs,weight; 50 IssmDouble hobs,hu2,weight,NUMx,NUMy,DEN,Jdet; 51 IssmDouble vx,vy,vbar2,nux,nuy,dphi[2]; 74 52 int *responses = NULL; 75 53 IssmDouble *xyz_list = NULL; 76 54 77 55 /*Fetch number of nodes and dof for this finite element*/ 78 int numnodes = basalelement->GetNumberOfNodes();56 int numnodes = element->GetNumberOfNodes(); 79 57 80 58 /*Initialize Element vector and vectors*/ 81 ElementVector* pe = basalelement->NewElementVector(SSAApproximationEnum);59 ElementVector* pe = element->NewElementVector(SSAApproximationEnum); 82 60 IssmDouble* basis = xNew<IssmDouble>(numnodes); 83 61 IssmDouble* dbasis = xNew<IssmDouble>(2*numnodes); 84 62 85 63 /*Retrieve all inputs and parameters*/ 86 basalelement->GetVerticesCoordinates(&xyz_list); 87 basalelement->FindParam(&num_responses,InversionNumCostFunctionsEnum); 88 basalelement->FindParam(&responses,NULL,InversionCostFunctionsEnum); 89 Input* thickness_input = basalelement->GetInput(ThicknessEnum); _assert_(thickness_input); 90 Input* thicknessobs_input = basalelement->GetInput(InversionThicknessObsEnum); _assert_(thicknessobs_input); 91 Input* weights_input = basalelement->GetInput(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input); 92 Input* vx_input = basalelement->GetInput(VxEnum); _assert_(vx_input); 93 Input* vy_input = basalelement->GetInput(VyEnum); _assert_(vy_input); 64 element->GetVerticesCoordinates(&xyz_list); 65 element->FindParam(&num_responses,InversionNumCostFunctionsEnum); 66 element->FindParam(&responses,NULL,InversionCostFunctionsEnum); 67 Input* thicknessobs_input = element->GetInput(InversionThicknessObsEnum); _assert_(thicknessobs_input); 68 Input* weights_input = element->GetInput(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input); 69 Input* potential_input = element->GetInput(PotentialEnum); _assert_(potential_input); 70 Input* vx_input = element->GetInput(BalancethicknessVxObsEnum); _assert_(vx_input); 71 Input* vy_input = element->GetInput(BalancethicknessVyObsEnum); _assert_(vy_input); 72 Input* nux_input = element->GetInput(BalancethicknessNuxEnum); _assert_(nux_input); 73 Input* nuy_input = element->GetInput(BalancethicknessNuyEnum); _assert_(nuy_input); 94 74 95 75 /* Start looping on the number of gaussian points: */ 96 Gauss* gauss= basalelement->NewGauss(2);76 Gauss* gauss=element->NewGauss(2); 97 77 for(int ig=gauss->begin();ig<gauss->end();ig++){ 98 78 gauss->GaussPoint(ig); 99 79 100 basalelement->JacobianDeterminant(&Jdet,xyz_list,gauss);101 basalelement->NodalFunctions(basis,gauss);102 basalelement->NodalFunctionsDerivatives(dbasis,xyz_list,gauss);80 element->JacobianDeterminant(&Jdet,xyz_list,gauss); 81 element->NodalFunctions(basis,gauss); 82 element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss); 103 83 104 thickness_input->GetInputValue(&thickness, gauss); 105 thickness_input->GetInputDerivativeValue(&dH[0],xyz_list,gauss); 106 thicknessobs_input->GetInputValue(&thicknessobs, gauss); 84 vx_input->GetInputValue(&vx,gauss); 85 vy_input->GetInputValue(&vy,gauss); 86 nux_input->GetInputValue(&nux,gauss); 87 nuy_input->GetInputValue(&nuy,gauss); 88 potential_input->GetInputDerivativeValue(&dphi[0],xyz_list,gauss); 89 thicknessobs_input->GetInputValue(&hobs,gauss); 107 90 91 vbar2 = (nux*nux*vx*vx + nuy*nuy*vy*vy); 92 hu2 = hobs*hobs*vbar2; 93 94 NUMx = 2.*dbasis[0]*dphi[0]*(dphi[0]*dphi[0] + dphi[1]*dphi[1] - hu2); 95 NUMy = 2.*dbasis[1]*dphi[1]*(dphi[0]*dphi[0] + dphi[1]*dphi[1] - hu2); 96 DEN = vbar2*vbar2; 97 108 98 /*Loop over all requested responses*/ 109 99 for(int resp=0;resp<num_responses;resp++){ 110 100 weights_input->GetInputValue(&weight,gauss,responses[resp]); 111 101 112 102 switch(responses[resp]){ 113 case ThicknessAbsMisfitEnum:114 for(i=0;i<numnodes;i++) pe->values[i]+=( thicknessobs-thickness)*weight*Jdet*gauss->weight*basis[i];103 case Balancethickness2MisfitEnum: 104 for(i=0;i<numnodes;i++) pe->values[i]+=(NUMx+NUMy)/DEN *weight*Jdet*gauss->weight*basis[i]; 115 105 break; 116 case ThicknessAbsGradientEnum:117 for(i=0;i<numnodes;i++) pe->values[i]+= - weight*dH[0]*dbasis[0*numnodes+i]*Jdet*gauss->weight;118 for(i=0;i<numnodes;i++) pe->values[i]+= - weight*dH[1]*dbasis[1*numnodes+i]*Jdet*gauss->weight;119 break;120 case ThicknessAlongGradientEnum:121 vx_input->GetInputValue(&vx,gauss);122 vy_input->GetInputValue(&vy,gauss);123 vel = sqrt(vx*vx+vy*vy);124 vx = vx/(vel+1.e-9);125 vy = vy/(vel+1.e-9);126 for(i=0;i<numnodes;i++) pe->values[i]+= - weight*(dH[0]*vx+dH[1]*vy)*(dbasis[0*numnodes+i]*vx+dbasis[1*numnodes+i]*vy)*Jdet*gauss->weight;127 break;128 case ThicknessAcrossGradientEnum:129 vx_input->GetInputValue(&vx,gauss);130 vy_input->GetInputValue(&vy,gauss);131 vel = sqrt(vx*vx+vy*vy);132 vx = vx/(vel+1.e-9);133 vy = vy/(vel+1.e-9);134 for(i=0;i<numnodes;i++) pe->values[i]+= - weight*(dH[0]*(-vy)+dH[1]*vx)*(dbasis[0*numnodes+i]*(-vy)+dbasis[1*numnodes+i]*vx)*Jdet*gauss->weight;135 break;136 106 default: 137 107 _error_("response " << EnumToStringx(responses[resp]) << " not supported yet"); 138 108 } … … 144 114 xDelete<IssmDouble>(xyz_list); 145 115 xDelete<IssmDouble>(basis); 146 116 xDelete<IssmDouble>(dbasis); 147 if(domaintype!=Domain2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;};148 117 delete gauss; 149 118 return pe; 150 119 }/*}}}*/ -
../trunk-jpl/src/c/analyses/Balancethickness2Analysis.cpp
182 182 element->JacobianDeterminantSurface(&Jdet,xyz_list_front,gauss); 183 183 element->NodalFunctions(basis,gauss); 184 184 185 for(int i=0;i<numnodes;i++) pe->values[i] += -Jdet*gauss->weight*thickness*(vx*normal[0] + vy*normal[1])*basis[i];185 for(int i=0;i<numnodes;i++) pe->values[i] += Jdet*gauss->weight*thickness*(vx*normal[0] + vy*normal[1])*basis[i]; 186 186 } 187 187 188 188 /*Clean up and return*/ -
../trunk-jpl/src/c/modules/ModelProcessorx/Control/UpdateElementsAndMaterialsControl.cpp
11 11 void UpdateElementsAndMaterialsControl(Elements* elements,Materials* materials, IoModel* iomodel){ 12 12 13 13 /*Intermediary*/ 14 int i; 15 int counter; 14 int control; 16 15 Element *element = NULL; 17 16 Material *material = NULL; 18 17 int num_control_type; … … 32 31 33 32 iomodel->FetchData(5,InversionControlParametersEnum,InversionCostFunctionsEnum,InversionCostFunctionsCoefficientsEnum,InversionMinParametersEnum,InversionMaxParametersEnum); 34 33 35 for(i =0;i<num_control_type;i++){36 intcontrol = reCast<int,IssmDouble>(iomodel->Data(InversionControlParametersEnum)[i]);34 for(int i=0;i<num_control_type;i++){ 35 control = reCast<int,IssmDouble>(iomodel->Data(InversionControlParametersEnum)[i]); 37 36 switch(control){ 38 37 /*List of supported controls*/ 39 38 case BalancethicknessThickeningRateEnum: … … 43 42 case FrictionCoefficientEnum: 44 43 case BalancethicknessNuxEnum: 45 44 case BalancethicknessNuyEnum: 45 case BalancethicknessApparentMassbalanceEnum: 46 46 iomodel->FetchData(1,control); 47 47 break; 48 48 … … 55 55 } 56 56 57 57 /*Update elements: */ 58 counter=0;59 for (i=0;i<iomodel->numberofelements;i++){58 int counter=0; 59 for(int i=0;i<iomodel->numberofelements;i++){ 60 60 if(iomodel->my_elements[i]){ 61 61 element=(Element*)elements->GetObjectByOffset(counter); 62 62 element->InputUpdateFromIoModel(i,iomodel); //we need i to index into elements. … … 65 65 } 66 66 67 67 /*Free data: */ 68 iomodel->DeleteData(5+7,InversionControlParametersEnum,InversionCostFunctionsCoefficientsEnum,InversionCostFunctionsEnum,InversionMinParametersEnum,InversionMaxParametersEnum,BalancethicknessThickeningRateEnum,VxEnum,VyEnum,ThicknessEnum,FrictionCoefficientEnum,MaterialsRheologyBEnum,DamageDEnum); 68 for(int i=0;i<num_control_type;i++){ 69 control = reCast<int,IssmDouble>(iomodel->Data(InversionControlParametersEnum)[i]); 70 switch(control){ 71 case MaterialsRheologyBbarEnum: iomodel->DeleteData(1,MaterialsRheologyBEnum); break; 72 case DamageDbarEnum: iomodel->DeleteData(1,DamageDEnum); break; 73 default: iomodel->DeleteData(1,control); 74 } 75 } 76 iomodel->DeleteData(5,InversionControlParametersEnum,InversionCostFunctionsCoefficientsEnum,InversionCostFunctionsEnum,InversionMinParametersEnum,InversionMaxParametersEnum); 77 78 69 79 } -
../trunk-jpl/src/c/cores/control_core.cpp
144 144 femmodel->parameters->FindParam(&solution_type,SolutionTypeEnum); 145 145 146 146 /*set analysis type to compute velocity: */ 147 if (solution_type==SteadystateSolutionEnum || solution_type==StressbalanceSolutionEnum){ 148 femmodel->SetCurrentConfiguration(StressbalanceAnalysisEnum); 147 switch(solution_type){ 148 case SteadystateSolutionEnum: 149 case StressbalanceSolutionEnum: 150 femmodel->SetCurrentConfiguration(StressbalanceAnalysisEnum); 151 break; 152 case BalancethicknessSolutionEnum: 153 femmodel->SetCurrentConfiguration(BalancethicknessAnalysisEnum); 154 break; 155 case BalancethicknessSoftSolutionEnum: 156 femmodel->SetCurrentConfiguration(BalancethicknessAnalysisEnum); 157 break; 158 case Balancethickness2SolutionEnum: 159 femmodel->SetCurrentConfiguration(Balancethickness2AnalysisEnum); 160 break; 161 default: 162 _error_("Solution " << EnumToStringx(solution_type) << " not implemented yet"); 149 163 } 150 else if (solution_type==BalancethicknessSolutionEnum){151 femmodel->SetCurrentConfiguration(BalancethicknessAnalysisEnum);152 }153 else if (solution_type==BalancethicknessSoftSolutionEnum){154 femmodel->SetCurrentConfiguration(BalancethicknessAnalysisEnum);155 }156 else{157 _error_("Solution " << EnumToStringx(solution_type) << " not implemented yet");158 }159 164 160 165 /*update parameter according to scalar: */ //false means: do not save control 161 166 InputControlUpdatex(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,search_scalar,false); … … 170 175 else if (solution_type==BalancethicknessSolutionEnum){ 171 176 solutionsequence_linear(femmodel); 172 177 } 178 else if (solution_type==Balancethickness2SolutionEnum){ 179 solutionsequence_linear(femmodel); 180 } 173 181 else if (solution_type==BalancethicknessSoftSolutionEnum){ 174 182 /*Don't do anything*/ 175 183 } -
../trunk-jpl/src/c/classes/FemModel.cpp
435 435 case IceVolumeEnum: this->IceVolumex(responses); break; 436 436 case IceVolumeAboveFloatationEnum: this->IceVolumeAboveFloatationx(responses); break; 437 437 case MinVelEnum: this->MinVelx(responses); break; 438 case MaxVelEnum: this->MaxVelx( 438 case MaxVelEnum: this->MaxVelx(responses); break; 439 439 case MinVxEnum: this->MinVxx(responses); break; 440 case MaxVxEnum: this->MaxVxx( 441 case MaxAbsVxEnum: this->MaxAbsVxx( 440 case MaxVxEnum: this->MaxVxx(responses); break; 441 case MaxAbsVxEnum: this->MaxAbsVxx(responses); break; 442 442 case MinVyEnum: this->MinVyx(responses); break; 443 case MaxVyEnum: this->MaxVyx( 444 case MaxAbsVyEnum: this->MaxAbsVyx( 443 case MaxVyEnum: this->MaxVyx(responses); break; 444 case MaxAbsVyEnum: this->MaxAbsVyx(responses); break; 445 445 case MinVzEnum: this->MinVzx(responses); break; 446 case MaxVzEnum: this->MaxVzx( 447 case MaxAbsVzEnum: this->MaxAbsVzx( 448 case MassFluxEnum: this->MassFluxx( 446 case MaxVzEnum: this->MaxVzx(responses); break; 447 case MaxAbsVzEnum: this->MaxAbsVzx(responses); break; 448 case MassFluxEnum: this->MassFluxx(responses); break; 449 449 case SurfaceAbsVelMisfitEnum: SurfaceAbsVelMisfitx(responses, elements,nodes, vertices, loads, materials,parameters); break; 450 450 case SurfaceRelVelMisfitEnum: SurfaceRelVelMisfitx(responses, elements,nodes, vertices, loads, materials,parameters); break; 451 451 case SurfaceLogVelMisfitEnum: SurfaceLogVelMisfitx(responses, elements,nodes, vertices, loads, materials,parameters); break; … … 458 458 case RheologyBbarAbsGradientEnum: RheologyBbarAbsGradientx(responses, elements,nodes, vertices, loads, materials, parameters); break; 459 459 case DragCoefficientAbsGradientEnum:DragCoefficientAbsGradientx(responses, elements,nodes, vertices, loads, materials, parameters); break; 460 460 case BalancethicknessMisfitEnum: BalancethicknessMisfitx(responses); break; 461 case Balancethickness2MisfitEnum: Balancethickness2Misfitx(responses); break; 461 462 case TotalSmbEnum: this->TotalSmbx(responses); break; 462 463 case MaterialsRheologyBbarEnum: this->ElementResponsex(responses,MaterialsRheologyBbarEnum); break; 463 464 case VelEnum: this->ElementResponsex(responses,VelEnum); break; … … 1199 1200 *presponse=J; 1200 1201 1201 1202 }/*}}}*/ 1203 void FemModel::Balancethickness2Misfitx(IssmDouble* presponse){/*{{{*/ 1204 1205 /*output: */ 1206 IssmDouble J=0.; 1207 IssmDouble J_sum; 1208 1209 IssmDouble weight,thicknessobs,thickness; 1210 IssmDouble Jdet; 1211 IssmDouble* xyz_list = NULL; 1212 1213 /*Compute Misfit: */ 1214 for(int i=0;i<elements->Size();i++){ 1215 Element* element=dynamic_cast<Element*>(elements->GetObjectByOffset(i)); 1216 1217 /*If on water, return 0: */ 1218 if(!element->IsIceInElement()) continue; 1219 1220 /* Get node coordinates*/ 1221 element->GetVerticesCoordinates(&xyz_list); 1222 Input* weights_input =element->GetInput(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input); 1223 Input* thickness_input =element->GetInput(ThicknessEnum); _assert_(thickness_input); 1224 Input* thicknessobs_input=element->GetInput(InversionThicknessObsEnum); _assert_(thicknessobs_input); 1225 1226 /* Start looping on the number of gaussian points: */ 1227 Gauss* gauss=element->NewGauss(2); 1228 for(int ig=gauss->begin();ig<gauss->end();ig++){ 1229 1230 gauss->GaussPoint(ig); 1231 1232 /* Get Jacobian determinant: */ 1233 element->JacobianDeterminant(&Jdet,xyz_list,gauss); 1234 1235 /*Get all parameters at gaussian point*/ 1236 weights_input->GetInputValue(&weight,gauss,Balancethickness2MisfitEnum); 1237 thickness_input->GetInputValue(&thickness,gauss); 1238 thicknessobs_input->GetInputValue(&thicknessobs,gauss); 1239 gauss->GaussPoint(ig); 1240 1241 J +=0.5*(thickness*thickness - thicknessobs*thicknessobs)*weight*Jdet*gauss->weight; 1242 } 1243 1244 /*clean up and Return: */ 1245 xDelete<IssmDouble>(xyz_list); 1246 delete gauss; 1247 } 1248 1249 /*Sum all J from all cpus of the cluster:*/ 1250 ISSM_MPI_Reduce (&J,&J_sum,1,ISSM_MPI_DOUBLE,ISSM_MPI_SUM,0,IssmComm::GetComm() ); 1251 ISSM_MPI_Bcast(&J_sum,1,ISSM_MPI_DOUBLE,0,IssmComm::GetComm()); 1252 J=J_sum; 1253 1254 /*Assign output pointers: */ 1255 *presponse=J; 1256 1257 }/*}}}*/ 1202 1258 void FemModel::ThicknessAbsGradientx( IssmDouble* pJ){/*{{{*/ 1203 1259 1204 1260 /*output: */ -
../trunk-jpl/src/c/classes/Elements/Tria.cpp
990 990 switch(control){ 991 991 /*yts conversion*/ 992 992 case BalancethicknessThickeningRateEnum: 993 case BalancethicknessApparentMassbalanceEnum: 993 994 case VxEnum: 994 995 case VyEnum: 995 996 if(iomodel->Data(control)){ … … 2802 2803 case ThicknessEnum: 2803 2804 GradjThicknessBalancethicknessSoft(gradient,control_index); 2804 2805 break; 2806 case BalancethicknessApparentMassbalanceEnum: 2807 GradjAdotBulancethickness2(gradient,control_index); 2808 break; 2805 2809 default: 2806 _error_("control type not supported yet: " << control_type);2810 _error_("control type not supported yet: " << EnumToStringx(control_type)); 2807 2811 } 2808 2812 2809 2813 /*Now deal with ∂J/∂alpha*/ … … 2820 2824 case ThicknessAlongGradientEnum: 2821 2825 case ThicknessAcrossGradientEnum: 2822 2826 case BalancethicknessMisfitEnum: 2827 case Balancethickness2MisfitEnum: 2823 2828 case SurfaceAbsVelMisfitEnum: 2824 2829 case SurfaceRelVelMisfitEnum: 2825 2830 case SurfaceLogVelMisfitEnum: … … 3167 3172 gradient->SetValues(NUMVERTICES,vertexpidlist,gradient_g,INS_VAL); 3168 3173 } 3169 3174 /*}}}*/ 3175 void Tria::GradjAdotBulancethickness2(Vector<IssmDouble>* gradient,int control_index){/*{{{*/ 3176 3177 /*Intermediaries*/ 3178 int vertexpidlist[NUMVERTICES]; 3179 IssmDouble lambda[NUMVERTICES]; 3180 IssmDouble gradient_g[NUMVERTICES]; 3181 3182 /*Compute Gradient*/ 3183 GradientIndexing(&vertexpidlist[0],control_index); 3184 GetInputListOnVertices(&lambda[0],AdjointEnum); 3185 for(int i=0;i<NUMVERTICES;i++) gradient_g[i]=lambda[i]; 3186 3187 gradient->SetValues(NUMVERTICES,vertexpidlist,gradient_g,INS_VAL); 3188 } 3189 /*}}}*/ 3170 3190 void Tria::GradjVxBalancedthickness(Vector<IssmDouble>* gradient,int control_index){/*{{{*/ 3171 3191 3172 3192 /*Intermediaries*/ -
../trunk-jpl/src/c/classes/Elements/Tria.h
148 148 void GradjVxBalancedthickness(Vector<IssmDouble>* gradient,int control_index); 149 149 void GradjVyBalancedthickness(Vector<IssmDouble>* gradient,int control_index); 150 150 void GradjThicknessBalancethicknessSoft(Vector<IssmDouble>* gradient,int control_index); 151 void GradjAdotBulancethickness2(Vector<IssmDouble>* gradient,int control_index); 151 152 void GetVectorFromControlInputs(Vector<IssmDouble>* gradient,int control_enum,int control_index,const char* data); 152 153 void SetControlInputsFromVector(IssmDouble* vector,int control_enum,int control_index); 153 154 void ControlInputGetGradient(Vector<IssmDouble>* gradient,int enum_type,int control_index); -
../trunk-jpl/src/c/classes/FemModel.h
76 76 void IceVolumeAboveFloatationx(IssmDouble* pV); 77 77 void ElementResponsex(IssmDouble* presponse,int response_enum); 78 78 void BalancethicknessMisfitx(IssmDouble* pV); 79 void Balancethickness2Misfitx(IssmDouble* pV); 79 80 #ifdef _HAVE_DAKOTA_ 80 81 void DakotaResponsesx(double* d_responses,char** responses_descriptors,int numresponsedescriptors,int d_numresponses); 81 82 #endif
Note:
See TracBrowser
for help on using the repository browser.