Changeset 23867
- Timestamp:
- 04/18/19 15:48:42 (6 years ago)
- Location:
- issm/trunk-jpl/src/c
- Files:
-
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
TabularUnified issm/trunk-jpl/src/c/analyses/AdjointHorizAnalysis.cpp ¶
r23629 r23867 553 553 /*Nothing in P vector*/ 554 554 break; 555 case RheologyBInitialguessMisfitEnum: 556 /*Nothing in P vector*/ 557 break; 555 558 default: 556 559 _error_("response " << EnumToStringx(responses[resp]) << " not supported yet"); … … 788 791 /*Nothing in P vector*/ 789 792 break; 793 case RheologyBInitialguessMisfitEnum: 794 /*Nothing in P vector*/ 795 break; 790 796 default: 791 797 _error_("response " << EnumToStringx(responses[resp]) << " not supported yet"); … … 1036 1042 /*Nothing in P vector*/ 1037 1043 break; 1044 case RheologyBInitialguessMisfitEnum: 1045 /*Nothing in P vector*/ 1046 break; 1038 1047 default: 1039 1048 _error_("response " << EnumToStringx(responses[resp]) << " not supported yet"); … … 1097 1106 case RheologyBbarAbsGradientEnum: GradientJBbarGradient(element,gradient,control_index); break; 1098 1107 case RheologyBAbsGradientEnum: GradientJBGradient(element,gradient,control_index); break; 1108 case RheologyBInitialguessMisfitEnum: GradientJBinitial(element,gradient,control_index); break; 1099 1109 default: _error_("response " << EnumToStringx(responses[resp]) << " not supported yet"); 1100 1110 } … … 1398 1408 delete gauss; 1399 1409 }/*}}}*/ 1410 void AdjointHorizAnalysis::GradientJBinitial(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/ 1411 1412 /*Intermediaries*/ 1413 int domaintype; 1414 1415 /*Get basal element*/ 1416 element->FindParam(&domaintype,DomainTypeEnum); 1417 switch(domaintype){ 1418 case Domain2DhorizontalEnum: 1419 break; 1420 case Domain2DverticalEnum: 1421 break; 1422 case Domain3DEnum: 1423 break; 1424 default: _error_("mesh "<<EnumToStringx(domaintype)<<" not supported yet"); 1425 } 1426 1427 /*Intermediaries*/ 1428 IssmDouble Jdet,weight; 1429 IssmDouble B,B0; 1430 IssmDouble *xyz_list= NULL; 1431 1432 /*Fetch number of vertices for this finite element*/ 1433 int numvertices = element->GetNumberOfVertices(); 1434 1435 /*Initialize some vectors*/ 1436 IssmDouble* basis = xNew<IssmDouble>(numvertices); 1437 IssmDouble* ge = xNewZeroInit<IssmDouble>(numvertices); 1438 int* vertexpidlist = xNew<int>(numvertices); 1439 1440 /*Retrieve all inputs we will be needing: */ 1441 element->GetVerticesCoordinates(&xyz_list); 1442 element->GradientIndexing(&vertexpidlist[0],control_index); 1443 Input* rheology_input = element->GetInput(MaterialsRheologyBbarEnum); _assert_(rheology_input); 1444 Input* rheology0_input = element->GetInput(RheologyBInitialguessEnum); _assert_(rheology0_input); 1445 Input* weights_input = element->GetInput(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input); 1446 1447 /* Start looping on the number of gaussian points: */ 1448 Gauss* gauss=element->NewGauss(2); 1449 for(int ig=gauss->begin();ig<gauss->end();ig++){ 1450 gauss->GaussPoint(ig); 1451 element->JacobianDeterminant(&Jdet,xyz_list,gauss); 1452 element->NodalFunctionsP1(basis,gauss); 1453 weights_input->GetInputValue(&weight,gauss,RheologyBInitialguessMisfitEnum); 1454 1455 /*Build alpha_complement_list: */ 1456 rheology_input->GetInputValue(&B,gauss); 1457 rheology0_input->GetInputValue(&B0,gauss); 1458 1459 /*Build gradje_g_gaussian vector (actually -dJ/ddrag): */ 1460 for(int i=0;i<numvertices;i++){ 1461 ge[i]+=-weight*Jdet*gauss->weight*basis[i]*(B-B0); 1462 _assert_(!xIsNan<IssmDouble>(ge[i])); 1463 } 1464 } 1465 gradient->SetValues(numvertices,vertexpidlist,ge,ADD_VAL); 1466 1467 /*Clean up and return*/ 1468 xDelete<IssmDouble>(xyz_list); 1469 xDelete<IssmDouble>(basis); 1470 xDelete<IssmDouble>(ge); 1471 xDelete<int>(vertexpidlist); 1472 delete gauss; 1473 }/*}}}*/ 1400 1474 void AdjointHorizAnalysis::GradientJBHO(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/ 1401 1475 /*Intermediaries*/ -
TabularUnified issm/trunk-jpl/src/c/analyses/AdjointHorizAnalysis.h ¶
r23585 r23867 38 38 void GradientJBbarFS(Element* element,Vector<IssmDouble>* gradient,int control_index); 39 39 void GradientJBbarGradient(Element* element,Vector<IssmDouble>* gradient,int control_index); 40 void GradientJBinitial(Element* element,Vector<IssmDouble>* gradient,int control_index); 40 41 void GradientJBbarL1L2(Element* element,Vector<IssmDouble>* gradient,int control_index); 41 42 void GradientJBbarHO(Element* element,Vector<IssmDouble>* gradient,int control_index); -
TabularUnified issm/trunk-jpl/src/c/classes/FemModel.cpp ¶
r23801 r23867 2223 2223 case RheologyBbarAbsGradientEnum: RheologyBbarAbsGradientx(&double_result,elements,nodes,vertices,loads,materials,parameters); break; 2224 2224 case RheologyBAbsGradientEnum: RheologyBAbsGradientx(&double_result,elements,nodes,vertices,loads,materials,parameters); break; 2225 case RheologyBInitialguessMisfitEnum: RheologyBInitialguessMisfitx(&double_result,elements,nodes,vertices,loads,materials,parameters); break; 2225 2226 case DragCoefficientAbsGradientEnum:DragCoefficientAbsGradientx(&double_result,elements,nodes,vertices,loads,materials,parameters); break; 2226 2227 case BalancethicknessMisfitEnum: BalancethicknessMisfitx(&double_result); break; -
TabularUnified issm/trunk-jpl/src/c/modules/ModelProcessorx/Control/UpdateElementsAndMaterialsControl.cpp ¶
r23320 r23867 60 60 if( cost_function==ThicknessAbsMisfitEnum) iomodel->FetchDataToInput(elements,"md.inversion.thickness_obs",InversionThicknessObsEnum); 61 61 else if(cost_function==SurfaceAbsMisfitEnum) iomodel->FetchDataToInput(elements,"md.inversion.surface_obs",InversionSurfaceObsEnum); 62 else if(cost_function==RheologyBInitialguessMisfitEnum) iomodel->FetchDataToInput(elements,"md.materials.rheology_B",RheologyBInitialguessEnum); 62 63 else if(cost_function==SurfaceAbsVelMisfitEnum 63 64 || cost_function==SurfaceRelVelMisfitEnum -
TabularUnified issm/trunk-jpl/src/c/modules/RheologyBAbsGradientx/RheologyBAbsGradientx.cpp ¶
r18825 r23867 78 78 return Jelem; 79 79 } 80 81 void RheologyBInitialguessMisfitx( IssmDouble* pJ, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials,Parameters* parameters){ 82 83 /*output: */ 84 IssmDouble J=0.; 85 IssmDouble J_sum; 86 87 /*Compute Misfit: */ 88 for(int i=0;i<elements->Size();i++){ 89 Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i)); 90 J+=RheologyBInitialguessMisfit(element); 91 } 92 93 /*Sum all J from all cpus of the cluster:*/ 94 ISSM_MPI_Reduce (&J,&J_sum,1,ISSM_MPI_DOUBLE,ISSM_MPI_SUM,0,IssmComm::GetComm() ); 95 ISSM_MPI_Bcast(&J_sum,1,ISSM_MPI_DOUBLE,0,IssmComm::GetComm()); 96 J=J_sum; 97 98 /*Assign output pointers: */ 99 *pJ=J; 100 } 101 102 IssmDouble RheologyBInitialguessMisfit(Element* element){ 103 104 int domaintype,numcomponents; 105 IssmDouble Jelem=0.; 106 IssmDouble misfit,Jdet; 107 IssmDouble B,B0,weight; 108 IssmDouble* xyz_list = NULL; 109 110 /*If on water, return 0: */ 111 if(!element->IsIceInElement()) return 0.; 112 113 /*Get problem dimension*/ 114 element->FindParam(&domaintype,DomainTypeEnum); 115 switch(domaintype){ 116 case Domain2DverticalEnum: numcomponents = 1; break; 117 case Domain3DEnum: numcomponents = 2; break; 118 case Domain2DhorizontalEnum: numcomponents = 2; break; 119 default: _error_("not supported yet"); 120 } 121 122 /* Get node coordinates*/ 123 element->GetVerticesCoordinates(&xyz_list); 124 125 /*Retrieve all inputs we will be needing: */ 126 Input* weights_input=element->GetInput(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input); 127 Input* rheologyb_input=element->GetInput(MaterialsRheologyBbarEnum); _assert_(rheologyb_input); 128 Input* rheologyb0_input=element->GetInput(RheologyBInitialguessEnum); _assert_(rheologyb0_input); 129 130 /* Start looping on the number of gaussian points: */ 131 Gauss* gauss=element->NewGauss(2); 132 for(int ig=gauss->begin();ig<gauss->end();ig++){ 133 134 gauss->GaussPoint(ig); 135 136 /* Get Jacobian determinant: */ 137 element->JacobianDeterminant(&Jdet,xyz_list,gauss); 138 139 /*Get all parameters at gaussian point*/ 140 weights_input->GetInputValue(&weight,gauss,RheologyBInitialguessMisfitEnum); 141 rheologyb_input->GetInputValue(&B,gauss); 142 rheologyb0_input->GetInputValue(&B0,gauss); 143 144 /*Tikhonov regularization: J = 1/2 (B-B0)^2 */ 145 Jelem+=weight*1./2.*(B-B0)*(B-B0)*Jdet*gauss->weight; 146 } 147 148 /*clean up and Return: */ 149 xDelete<IssmDouble>(xyz_list); 150 delete gauss; 151 return Jelem; 152 } -
TabularUnified issm/trunk-jpl/src/c/modules/RheologyBAbsGradientx/RheologyBAbsGradientx.h ¶
r18825 r23867 12 12 IssmDouble RheologyBAbsGradient(Element* element); 13 13 14 void RheologyBInitialguessMisfitx( IssmDouble* pJ, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters); 15 IssmDouble RheologyBInitialguessMisfit(Element* element); 16 14 17 #endif -
TabularUnified issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h ¶
r23866 r23867 601 601 RheologyBAbsGradientEnum, 602 602 RheologyBbarAbsGradientEnum, 603 RheologyBInitialguessMisfitEnum, 604 RheologyBInitialguessEnum, 603 605 SealevelEnum, 604 606 SealevelriseCumDeltathicknessEnum, -
TabularUnified issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp ¶
r23866 r23867 607 607 case RheologyBAbsGradientEnum : return "RheologyBAbsGradient"; 608 608 case RheologyBbarAbsGradientEnum : return "RheologyBbarAbsGradient"; 609 case RheologyBInitialguessMisfitEnum : return "RheologyBInitialguessMisfit"; 610 case RheologyBInitialguessEnum : return "RheologyBInitialguess"; 609 611 case SealevelEnum : return "Sealevel"; 610 612 case SealevelriseCumDeltathicknessEnum : return "SealevelriseCumDeltathickness"; -
TabularUnified issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp ¶
r23866 r23867 619 619 else if (strcmp(name,"RheologyBAbsGradient")==0) return RheologyBAbsGradientEnum; 620 620 else if (strcmp(name,"RheologyBbarAbsGradient")==0) return RheologyBbarAbsGradientEnum; 621 else if (strcmp(name,"RheologyBInitialguessMisfit")==0) return RheologyBInitialguessMisfitEnum; 622 else if (strcmp(name,"RheologyBInitialguess")==0) return RheologyBInitialguessEnum; 621 623 else if (strcmp(name,"Sealevel")==0) return SealevelEnum; 622 624 else if (strcmp(name,"SealevelriseCumDeltathickness")==0) return SealevelriseCumDeltathicknessEnum; … … 627 629 else if (strcmp(name,"SealevelUEsa")==0) return SealevelUEsaEnum; 628 630 else if (strcmp(name,"SealevelRSLEustaticRate")==0) return SealevelRSLEustaticRateEnum; 629 else if (strcmp(name,"SealevelriseSpcthickness")==0) return SealevelriseSpcthicknessEnum;630 else if (strcmp(name,"SealevelriseStericRate")==0) return SealevelriseStericRateEnum;631 631 else stage=6; 632 632 } 633 633 if(stage==6){ 634 if (strcmp(name,"SealevelNEsa")==0) return SealevelNEsaEnum; 634 if (strcmp(name,"SealevelriseSpcthickness")==0) return SealevelriseSpcthicknessEnum; 635 else if (strcmp(name,"SealevelriseStericRate")==0) return SealevelriseStericRateEnum; 636 else if (strcmp(name,"SealevelNEsa")==0) return SealevelNEsaEnum; 635 637 else if (strcmp(name,"SealevelUGia")==0) return SealevelUGiaEnum; 636 638 else if (strcmp(name,"SealevelNGia")==0) return SealevelNGiaEnum; … … 750 752 else if (strcmp(name,"StressTensoryy")==0) return StressTensoryyEnum; 751 753 else if (strcmp(name,"StressTensoryz")==0) return StressTensoryzEnum; 752 else if (strcmp(name,"StressTensorzz")==0) return StressTensorzzEnum;753 else if (strcmp(name,"SurfaceAbsMisfit")==0) return SurfaceAbsMisfitEnum;754 754 else stage=7; 755 755 } 756 756 if(stage==7){ 757 if (strcmp(name,"SurfaceAbsVelMisfit")==0) return SurfaceAbsVelMisfitEnum; 757 if (strcmp(name,"StressTensorzz")==0) return StressTensorzzEnum; 758 else if (strcmp(name,"SurfaceAbsMisfit")==0) return SurfaceAbsMisfitEnum; 759 else if (strcmp(name,"SurfaceAbsVelMisfit")==0) return SurfaceAbsVelMisfitEnum; 758 760 else if (strcmp(name,"SurfaceArea")==0) return SurfaceAreaEnum; 759 761 else if (strcmp(name,"SurfaceAverageVelMisfit")==0) return SurfaceAverageVelMisfitEnum; … … 873 875 else if (strcmp(name,"Outputdefinition77")==0) return Outputdefinition77Enum; 874 876 else if (strcmp(name,"Outputdefinition78")==0) return Outputdefinition78Enum; 875 else if (strcmp(name,"Outputdefinition79")==0) return Outputdefinition79Enum;876 else if (strcmp(name,"Outputdefinition7")==0) return Outputdefinition7Enum;877 877 else stage=8; 878 878 } 879 879 if(stage==8){ 880 if (strcmp(name,"Outputdefinition80")==0) return Outputdefinition80Enum; 880 if (strcmp(name,"Outputdefinition79")==0) return Outputdefinition79Enum; 881 else if (strcmp(name,"Outputdefinition7")==0) return Outputdefinition7Enum; 882 else if (strcmp(name,"Outputdefinition80")==0) return Outputdefinition80Enum; 881 883 else if (strcmp(name,"Outputdefinition81")==0) return Outputdefinition81Enum; 882 884 else if (strcmp(name,"Outputdefinition82")==0) return Outputdefinition82Enum; … … 996 998 else if (strcmp(name,"FrontalForcingsRignot")==0) return FrontalForcingsRignotEnum; 997 999 else if (strcmp(name,"FSApproximation")==0) return FSApproximationEnum; 998 else if (strcmp(name,"Fset")==0) return FsetEnum;999 else if (strcmp(name,"FSpressure")==0) return FSpressureEnum;1000 1000 else stage=9; 1001 1001 } 1002 1002 if(stage==9){ 1003 if (strcmp(name,"FSSolver")==0) return FSSolverEnum; 1003 if (strcmp(name,"Fset")==0) return FsetEnum; 1004 else if (strcmp(name,"FSpressure")==0) return FSpressureEnum; 1005 else if (strcmp(name,"FSSolver")==0) return FSSolverEnum; 1004 1006 else if (strcmp(name,"FSvelocity")==0) return FSvelocityEnum; 1005 1007 else if (strcmp(name,"FullMeltOnPartiallyFloating")==0) return FullMeltOnPartiallyFloatingEnum; … … 1119 1121 else if (strcmp(name,"NoMeltOnPartiallyFloating")==0) return NoMeltOnPartiallyFloatingEnum; 1120 1122 else if (strcmp(name,"NoneApproximation")==0) return NoneApproximationEnum; 1121 else if (strcmp(name,"None")==0) return NoneEnum;1122 else if (strcmp(name,"Numberedcostfunction")==0) return NumberedcostfunctionEnum;1123 1123 else stage=10; 1124 1124 } 1125 1125 if(stage==10){ 1126 if (strcmp(name,"Numericalflux")==0) return NumericalfluxEnum; 1126 if (strcmp(name,"None")==0) return NoneEnum; 1127 else if (strcmp(name,"Numberedcostfunction")==0) return NumberedcostfunctionEnum; 1128 else if (strcmp(name,"Numericalflux")==0) return NumericalfluxEnum; 1127 1129 else if (strcmp(name,"OldGradient")==0) return OldGradientEnum; 1128 1130 else if (strcmp(name,"OneLayerP4z")==0) return OneLayerP4zEnum; … … 1242 1244 else if (strcmp(name,"XY")==0) return XYEnum; 1243 1245 else if (strcmp(name,"XYZ")==0) return XYZEnum; 1244 else if (strcmp(name,"BalancethicknessD0")==0) return BalancethicknessD0Enum;1245 else if (strcmp(name,"BalancethicknessDiffusionCoefficient")==0) return BalancethicknessDiffusionCoefficientEnum;1246 1246 else stage=11; 1247 1247 } 1248 1248 if(stage==11){ 1249 if (strcmp(name,"BilinearInterp")==0) return BilinearInterpEnum; 1249 if (strcmp(name,"BalancethicknessD0")==0) return BalancethicknessD0Enum; 1250 else if (strcmp(name,"BalancethicknessDiffusionCoefficient")==0) return BalancethicknessDiffusionCoefficientEnum; 1251 else if (strcmp(name,"BilinearInterp")==0) return BilinearInterpEnum; 1250 1252 else if (strcmp(name,"CalvingdevCoeff")==0) return CalvingdevCoeffEnum; 1251 1253 else if (strcmp(name,"DeviatoricStress")==0) return DeviatoricStressEnum;
Note:
See TracChangeset
for help on using the changeset viewer.