Changeset 18604
- Timestamp:
- 10/08/14 14:28:10 (10 years ago)
- Location:
- issm/trunk-jpl/src
- Files:
-
- 1 added
- 2 deleted
- 11 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.cpp
r18569 r18604 195 195 void AdjointBalancethickness2Analysis::GradientJdHdt(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/ 196 196 197 /*Intermediaries*/ 198 IssmDouble lambda,Jdet; 199 IssmDouble *xyz_list= NULL; 200 197 201 /*Fetch number of vertices for this finite element*/ 198 202 int numvertices = element->GetNumberOfVertices(); 199 203 200 204 /*Initialize some vectors*/ 205 IssmDouble* basis = xNew<IssmDouble>(numvertices); 201 206 IssmDouble* ge = xNewZeroInit<IssmDouble>(numvertices); 202 IssmDouble* lambda = xNew<IssmDouble>(numvertices);203 207 int* vertexpidlist = xNew<int>(numvertices); 204 208 205 209 /*Retrieve all inputs we will be needing: */ 210 element->GetVerticesCoordinates(&xyz_list); 206 211 element->GradientIndexing(&vertexpidlist[0],control_index); 207 element->GetInputListOnVertices(lambda,AdjointEnum); 208 for(int i=0;i<numvertices;i++){ 209 ge[i]= - lambda[i]; 210 _assert_(!xIsNan<IssmDouble>(ge[i])); 211 } 212 gradient->SetValues(numvertices,vertexpidlist,ge,INS_VAL); 212 Input* adjoint_input = element->GetInput(AdjointEnum); _assert_(adjoint_input); 213 214 Gauss* gauss=element->NewGauss(2); 215 for(int ig=gauss->begin();ig<gauss->end();ig++){ 216 gauss->GaussPoint(ig); 217 218 element->JacobianDeterminant(&Jdet,xyz_list,gauss); 219 element->NodalFunctionsP1(basis,gauss); 220 221 adjoint_input->GetInputValue(&lambda,gauss); 222 223 /*Build gradient vector (actually -dJ/da): */ 224 for(int i=0;i<numvertices;i++){ 225 ge[i]+= -Jdet*gauss->weight*basis[i]*lambda; 226 _assert_(!xIsNan<IssmDouble>(ge[i])); 227 } 228 } 229 gradient->SetValues(numvertices,vertexpidlist,ge,ADD_VAL); 213 230 214 231 /*Clean up and return*/ 215 232 xDelete<IssmDouble>(ge); 216 xDelete<IssmDouble>(lambda); 233 xDelete<IssmDouble>(xyz_list); 234 xDelete<IssmDouble>(basis); 217 235 xDelete<int>(vertexpidlist); 236 delete gauss; 218 237 }/*}}}*/ 219 238 void AdjointBalancethickness2Analysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/ -
issm/trunk-jpl/src/c/analyses/Balancethickness2Analysis.cpp
r18574 r18604 82 82 Input* omega_input = element->GetInput(BalancethicknessOmegaEnum); _assert_(omega_input); 83 83 Input* D0_input = element->GetInput(BalancethicknessD0Enum); 84 if(!D0_input){84 //if(!D0_input){ 85 85 this->CreateD0(element); 86 86 D0_input = element->GetInput(BalancethicknessD0Enum); _assert_(D0_input); 87 }87 //} 88 88 89 89 /* Start looping on the number of gaussian points: */ … … 220 220 221 221 /*Intermediaries */ 222 IssmDouble Gamma,h,mu0,ds[2],Cmu,B,k,s,b ;222 IssmDouble Gamma,h,mu0,ds[2],Cmu,B,k,s,b,normds; 223 223 const int n = 3; 224 224 const IssmDouble Hstar = 500.; … … 232 232 /*retrieve what we need: */ 233 233 element->GetVerticesCoordinates(&xyz_list); 234 Input* surface_input = element->GetInput(SurfaceEnum); _assert_(surface_input); 235 Input* B_input = element->GetInput(MaterialsRheologyBEnum); _assert_(B_input); 236 IssmDouble rhog = element->GetMaterialParameter(MaterialsRhoIceEnum)*element->GetMaterialParameter(ConstantsGEnum); 234 Input* surfaceslopex_input = element->GetInput(SurfaceSlopeXEnum); 235 Input* surfaceslopey_input = element->GetInput(SurfaceSlopeYEnum); 236 Input* surface_input = element->GetInput(SurfaceEnum); _assert_(surface_input); 237 Input* B_input = element->GetInput(MaterialsRheologyBEnum); _assert_(B_input); 238 IssmDouble rhog = element->GetMaterialParameter(MaterialsRhoIceEnum)*element->GetMaterialParameter(ConstantsGEnum); 237 239 238 240 /*Calculate damage evolution source term: */ … … 242 244 243 245 B_input->GetInputValue(&B,gauss); 244 surface_input->GetInputDerivativeValue(&ds[0],xyz_list,gauss); 246 if(surfaceslopex_input && surfaceslopey_input){ 247 surfaceslopex_input->GetInputValue(&ds[0],gauss); 248 surfaceslopey_input->GetInputValue(&ds[1],gauss); 249 } 250 else{ 251 surface_input->GetInputDerivativeValue(&ds[0],xyz_list,gauss); 252 } 253 254 /*check slopes*/ 255 normds = sqrt(ds[0]*ds[0]+ds[1]*ds[1]); 256 if (normds==0.){ 257 _error_("surface slope is zero"); 258 } 259 if(normds<1.e-5){ 260 ds[0] = ds[0]/normds*1.e+5; 261 ds[1] = ds[1]/normds*1.e+5; 262 normds = 1.e-5; 263 } 245 264 246 265 mu0 = pow(2.,(1-3*n)/(2.*n)) * B; … … 252 271 /*Add input*/ 253 272 element->AddInput(BalancethicknessD0Enum,D0,element->GetElementType()); 273 //if(surfaceslopex_input && surfaceslopey_input){ 274 // element->DeleteInput(SurfaceSlopeXEnum); 275 // element->DeleteInput(SurfaceSlopeYEnum); 276 //} 254 277 255 278 /*Clean up and return*/ -
issm/trunk-jpl/src/c/analyses/SmoothAnalysis.cpp
r18593 r18604 48 48 /* Intermediaries */ 49 49 int domaintype; 50 IssmDouble Jdet,thickness,l =8.;50 IssmDouble Jdet,thickness,l; 51 51 IssmDouble *xyz_list = NULL; 52 52 … … 68 68 69 69 /*Retrieve all inputs and parameters*/ 70 element->FindParam(&l,SmoothThicknessMultiplierEnum); _assert_(l>0.); 70 71 element->GetVerticesCoordinates(&xyz_list); 71 72 Input* thickness_input = element->GetInput(ThicknessEnum); _assert_(thickness_input); -
issm/trunk-jpl/src/c/cores/balancethickness2_core.cpp
r18565 r18604 15 15 bool save_results; 16 16 17 /*activate formulation: */18 femmodel->SetCurrentConfiguration(Balancethickness2AnalysisEnum);19 20 17 /*recover parameters: */ 21 18 femmodel->parameters->FindParam(&save_results,SaveResultsEnum); 22 19 20 if(VerboseSolution()) _printf0_("computing smooth surface slopes:\n"); 21 femmodel->parameters->SetParam(8.,SmoothThicknessMultiplierEnum); 22 femmodel->SetCurrentConfiguration(SmoothAnalysisEnum); 23 femmodel->parameters->SetParam(SurfaceSlopeXEnum,InputToSmoothEnum); 24 solutionsequence_linear(femmodel); 25 femmodel->parameters->SetParam(SurfaceSlopeYEnum,InputToSmoothEnum); 26 solutionsequence_linear(femmodel); 27 23 28 if(VerboseSolution()) _printf0_("call computational core:\n"); 29 femmodel->SetCurrentConfiguration(Balancethickness2AnalysisEnum); 24 30 solutionsequence_linear(femmodel); 25 31 //solutionsequence_nonlinear(femmodel,false); … … 27 33 if(save_results){ 28 34 if(VerboseSolution()) _printf0_(" saving results\n"); 29 const int numoutputs = 4; 30 int outputs[numoutputs] = {SurfaceEnum,VxEnum,VyEnum,VelEnum}; 35 const int numoutputs = 6; 36 int outputs[numoutputs] = {SurfaceEnum,SurfaceSlopeXEnum,SurfaceSlopeYEnum,VxEnum,VyEnum,VelEnum}; 37 //const int numoutputs = 4; 38 //int outputs[numoutputs] = {SurfaceEnum,VxEnum,VyEnum,VelEnum}; 31 39 femmodel->RequestedOutputsx(&femmodel->results,&outputs[0],numoutputs); 32 40 } -
issm/trunk-jpl/src/c/cores/balancevelocity_core.cpp
r18593 r18604 18 18 femmodel->parameters->FindParam(&save_results,SaveResultsEnum); 19 19 20 if(VerboseSolution()) _printf0_("computing smoothed slopes:\n"); 20 if(VerboseSolution()) _printf0_("computing smooth driving stress:\n"); 21 femmodel->parameters->SetParam(8.,SmoothThicknessMultiplierEnum); 21 22 femmodel->SetCurrentConfiguration(SmoothAnalysisEnum); 22 23 femmodel->parameters->SetParam(DrivingStressXEnum,InputToSmoothEnum); -
issm/trunk-jpl/src/c/cores/controlvalidation_core.cpp
r18573 r18604 13 13 int solution_type,n; 14 14 int num_responses; 15 IssmDouble j0,j ;15 IssmDouble j0,j,yts; 16 16 IssmDouble Ialpha,exponent,alpha; 17 17 IssmDouble* jlist = NULL; … … 28 28 femmodel->parameters->SetParam(false,SaveResultsEnum); 29 29 femmodel->parameters->FindParam(&num_responses,InversionNumCostFunctionsEnum); 30 femmodel->parameters->FindParam(&yts,ConstantsYtsEnum); 30 31 31 32 /*Get initial guess*/ … … 64 65 IssmDouble exp0 = 0.; 65 66 IssmDouble incr = -0.2; 66 IssmDouble exp1 = -1 0.;67 IssmDouble exp1 = -18.; 67 68 int num = reCast<int,IssmDouble>((exp1-exp0)/incr); 68 69 … … 88 89 89 90 IssmDouble Den = 0.; 90 for(int i=0;i<n;i++) Den += alpha 91 for(int i=0;i<n;i++) Den += alpha* G[i] * 1.; 91 92 Ialpha = fabs((j - j0)/Den - 1.); 92 93 -
issm/trunk-jpl/src/c/modules/ModelProcessorx/Control/UpdateElementsAndMaterialsControl.cpp
r18568 r18604 29 29 iomodel->FetchDataToInput(elements,InversionVyObsEnum,0.); 30 30 iomodel->FetchDataToInput(elements,InversionThicknessObsEnum,0.); 31 //iomodel->FetchDataToInput(elements,InversionSurfaceObsEnum,0.);31 iomodel->FetchDataToInput(elements,InversionSurfaceObsEnum,0.); 32 32 33 33 iomodel->FetchData(5,InversionControlParametersEnum,InversionCostFunctionsEnum,InversionCostFunctionsCoefficientsEnum,InversionMinParametersEnum,InversionMaxParametersEnum); -
issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
r18593 r18604 450 450 InputToDepthaverageEnum, 451 451 InputToSmoothEnum, 452 SmoothThicknessMultiplierEnum, 452 453 IntParamEnum, 453 454 IntVecParamEnum, -
issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
r18593 r18604 447 447 case InputToDepthaverageEnum : return "InputToDepthaverage"; 448 448 case InputToSmoothEnum : return "InputToSmooth"; 449 case SmoothThicknessMultiplierEnum : return "SmoothThicknessMultiplier"; 449 450 case IntParamEnum : return "IntParam"; 450 451 case IntVecParamEnum : return "IntVecParam"; -
issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
r18593 r18604 456 456 else if (strcmp(name,"InputToDepthaverage")==0) return InputToDepthaverageEnum; 457 457 else if (strcmp(name,"InputToSmooth")==0) return InputToSmoothEnum; 458 else if (strcmp(name,"SmoothThicknessMultiplier")==0) return SmoothThicknessMultiplierEnum; 458 459 else if (strcmp(name,"IntParam")==0) return IntParamEnum; 459 460 else if (strcmp(name,"IntVecParam")==0) return IntVecParamEnum; … … 505 506 else if (strcmp(name,"BalancethicknessMisfit")==0) return BalancethicknessMisfitEnum; 506 507 else if (strcmp(name,"BedSlopeX")==0) return BedSlopeXEnum; 507 else if (strcmp(name,"BedSlopeY")==0) return BedSlopeYEnum;508 508 else stage=5; 509 509 } 510 510 if(stage==5){ 511 if (strcmp(name,"Boundary")==0) return BoundaryEnum; 511 if (strcmp(name,"BedSlopeY")==0) return BedSlopeYEnum; 512 else if (strcmp(name,"Boundary")==0) return BoundaryEnum; 512 513 else if (strcmp(name,"Converged")==0) return ConvergedEnum; 513 514 else if (strcmp(name,"Fill")==0) return FillEnum; … … 628 629 else if (strcmp(name,"Time")==0) return TimeEnum; 629 630 else if (strcmp(name,"WaterColumnOld")==0) return WaterColumnOldEnum; 630 else if (strcmp(name,"Outputdefinition")==0) return OutputdefinitionEnum;631 631 else stage=6; 632 632 } 633 633 if(stage==6){ 634 if (strcmp(name,"OutputdefinitionList")==0) return OutputdefinitionListEnum; 634 if (strcmp(name,"Outputdefinition")==0) return OutputdefinitionEnum; 635 else if (strcmp(name,"OutputdefinitionList")==0) return OutputdefinitionListEnum; 635 636 else if (strcmp(name,"Massfluxatgate")==0) return MassfluxatgateEnum; 636 637 else if (strcmp(name,"MassfluxatgateName")==0) return MassfluxatgateNameEnum; … … 751 752 else if (strcmp(name,"BasalforcingsOceanVy")==0) return BasalforcingsOceanVyEnum; 752 753 else if (strcmp(name,"SurfaceforcingsRhoAir")==0) return SurfaceforcingsRhoAirEnum; 753 else if (strcmp(name,"SurfaceforcingsAirCoef")==0) return SurfaceforcingsAirCoefEnum;754 754 else stage=7; 755 755 } 756 756 if(stage==7){ 757 if (strcmp(name,"SurfaceforcingsAirLinDragCoef")==0) return SurfaceforcingsAirLinDragCoefEnum; 757 if (strcmp(name,"SurfaceforcingsAirCoef")==0) return SurfaceforcingsAirCoefEnum; 758 else if (strcmp(name,"SurfaceforcingsAirLinDragCoef")==0) return SurfaceforcingsAirLinDragCoefEnum; 758 759 else if (strcmp(name,"SurfaceforcingsAirQuadDragCoef")==0) return SurfaceforcingsAirQuadDragCoefEnum; 759 760 else if (strcmp(name,"SurfaceforcingsWindVx")==0) return SurfaceforcingsWindVxEnum; -
issm/trunk-jpl/src/m/enum/EnumDefinitions.py
r18593 r18604 439 439 def InputToDepthaverageEnum(): return StringToEnum("InputToDepthaverage")[0] 440 440 def InputToSmoothEnum(): return StringToEnum("InputToSmooth")[0] 441 def SmoothThicknessMultiplierEnum(): return StringToEnum("SmoothThicknessMultiplier")[0] 441 442 def IntParamEnum(): return StringToEnum("IntParam")[0] 442 443 def IntVecParamEnum(): return StringToEnum("IntVecParam")[0]
Note:
See TracChangeset
for help on using the changeset viewer.