Changeset 23867


Ignore:
Timestamp:
04/18/19 15:48:42 (6 years ago)
Author:
Mathieu Morlighem
Message:

NEW: added 508 cost function

Location:
issm/trunk-jpl/src/c
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • TabularUnified issm/trunk-jpl/src/c/analyses/AdjointHorizAnalysis.cpp

    r23629 r23867  
    553553                                        /*Nothing in P vector*/
    554554                                        break;
     555                                case RheologyBInitialguessMisfitEnum:
     556                                        /*Nothing in P vector*/
     557                                        break;
    555558                                default:
    556559                                        _error_("response " << EnumToStringx(responses[resp]) << " not supported yet");
     
    788791                                        /*Nothing in P vector*/
    789792                                        break;
     793                                case RheologyBInitialguessMisfitEnum:
     794                                        /*Nothing in P vector*/
     795                                        break;
    790796                                default:
    791797                                        _error_("response " << EnumToStringx(responses[resp]) << " not supported yet");
     
    10361042                                        /*Nothing in P vector*/
    10371043                                        break;
     1044                                case RheologyBInitialguessMisfitEnum:
     1045                                        /*Nothing in P vector*/
     1046                                        break;
    10381047                                default:
    10391048                                        _error_("response " << EnumToStringx(responses[resp]) << " not supported yet");
     
    10971106                case RheologyBbarAbsGradientEnum:    GradientJBbarGradient(element,gradient,control_index); break;
    10981107                case RheologyBAbsGradientEnum:       GradientJBGradient(element,gradient,control_index);    break;
     1108                case RheologyBInitialguessMisfitEnum:  GradientJBinitial(element,gradient,control_index);    break;
    10991109                default: _error_("response " << EnumToStringx(responses[resp]) << " not supported yet");
    11001110        }
     
    13981408        delete gauss;
    13991409}/*}}}*/
     1410void           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}/*}}}*/
    14001474void           AdjointHorizAnalysis::GradientJBHO(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/
    14011475        /*Intermediaries*/
  • TabularUnified issm/trunk-jpl/src/c/analyses/AdjointHorizAnalysis.h

    r23585 r23867  
    3838                void           GradientJBbarFS(Element* element,Vector<IssmDouble>* gradient,int control_index);
    3939                void           GradientJBbarGradient(Element* element,Vector<IssmDouble>* gradient,int control_index);
     40                void           GradientJBinitial(Element* element,Vector<IssmDouble>* gradient,int control_index);
    4041                void           GradientJBbarL1L2(Element* element,Vector<IssmDouble>* gradient,int control_index);
    4142                void           GradientJBbarHO(Element* element,Vector<IssmDouble>* gradient,int control_index);
  • TabularUnified issm/trunk-jpl/src/c/classes/FemModel.cpp

    r23801 r23867  
    22232223                                case RheologyBbarAbsGradientEnum:   RheologyBbarAbsGradientx(&double_result,elements,nodes,vertices,loads,materials,parameters);    break;
    22242224                                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;
    22252226                                case DragCoefficientAbsGradientEnum:DragCoefficientAbsGradientx(&double_result,elements,nodes,vertices,loads,materials,parameters); break;
    22262227                                case BalancethicknessMisfitEnum:    BalancethicknessMisfitx(&double_result);                                                        break;
  • TabularUnified issm/trunk-jpl/src/c/modules/ModelProcessorx/Control/UpdateElementsAndMaterialsControl.cpp

    r23320 r23867  
    6060                if(     cost_function==ThicknessAbsMisfitEnum) iomodel->FetchDataToInput(elements,"md.inversion.thickness_obs",InversionThicknessObsEnum);
    6161                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);
    6263                else if(cost_function==SurfaceAbsVelMisfitEnum
    6364                          || cost_function==SurfaceRelVelMisfitEnum
  • TabularUnified issm/trunk-jpl/src/c/modules/RheologyBAbsGradientx/RheologyBAbsGradientx.cpp

    r18825 r23867  
    7878        return Jelem;
    7979}
     80
     81void 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
     102IssmDouble 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  
    1212IssmDouble RheologyBAbsGradient(Element* element);
    1313
     14void RheologyBInitialguessMisfitx( IssmDouble* pJ, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters);
     15IssmDouble RheologyBInitialguessMisfit(Element* element);
     16
    1417#endif
  • TabularUnified issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h

    r23866 r23867  
    601601        RheologyBAbsGradientEnum,
    602602        RheologyBbarAbsGradientEnum,
     603        RheologyBInitialguessMisfitEnum,
     604        RheologyBInitialguessEnum,
    603605        SealevelEnum,
    604606        SealevelriseCumDeltathicknessEnum,
  • TabularUnified issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp

    r23866 r23867  
    607607                case RheologyBAbsGradientEnum : return "RheologyBAbsGradient";
    608608                case RheologyBbarAbsGradientEnum : return "RheologyBbarAbsGradient";
     609                case RheologyBInitialguessMisfitEnum : return "RheologyBInitialguessMisfit";
     610                case RheologyBInitialguessEnum : return "RheologyBInitialguess";
    609611                case SealevelEnum : return "Sealevel";
    610612                case SealevelriseCumDeltathicknessEnum : return "SealevelriseCumDeltathickness";
  • TabularUnified issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp

    r23866 r23867  
    619619              else if (strcmp(name,"RheologyBAbsGradient")==0) return RheologyBAbsGradientEnum;
    620620              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;
    621623              else if (strcmp(name,"Sealevel")==0) return SealevelEnum;
    622624              else if (strcmp(name,"SealevelriseCumDeltathickness")==0) return SealevelriseCumDeltathicknessEnum;
     
    627629              else if (strcmp(name,"SealevelUEsa")==0) return SealevelUEsaEnum;
    628630              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;
    631631         else stage=6;
    632632   }
    633633   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;
    635637              else if (strcmp(name,"SealevelUGia")==0) return SealevelUGiaEnum;
    636638              else if (strcmp(name,"SealevelNGia")==0) return SealevelNGiaEnum;
     
    750752              else if (strcmp(name,"StressTensoryy")==0) return StressTensoryyEnum;
    751753              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;
    754754         else stage=7;
    755755   }
    756756   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;
    758760              else if (strcmp(name,"SurfaceArea")==0) return SurfaceAreaEnum;
    759761              else if (strcmp(name,"SurfaceAverageVelMisfit")==0) return SurfaceAverageVelMisfitEnum;
     
    873875              else if (strcmp(name,"Outputdefinition77")==0) return Outputdefinition77Enum;
    874876              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;
    877877         else stage=8;
    878878   }
    879879   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;
    881883              else if (strcmp(name,"Outputdefinition81")==0) return Outputdefinition81Enum;
    882884              else if (strcmp(name,"Outputdefinition82")==0) return Outputdefinition82Enum;
     
    996998              else if (strcmp(name,"FrontalForcingsRignot")==0) return FrontalForcingsRignotEnum;
    997999              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;
    10001000         else stage=9;
    10011001   }
    10021002   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;
    10041006              else if (strcmp(name,"FSvelocity")==0) return FSvelocityEnum;
    10051007              else if (strcmp(name,"FullMeltOnPartiallyFloating")==0) return FullMeltOnPartiallyFloatingEnum;
     
    11191121              else if (strcmp(name,"NoMeltOnPartiallyFloating")==0) return NoMeltOnPartiallyFloatingEnum;
    11201122              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;
    11231123         else stage=10;
    11241124   }
    11251125   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;
    11271129              else if (strcmp(name,"OldGradient")==0) return OldGradientEnum;
    11281130              else if (strcmp(name,"OneLayerP4z")==0) return OneLayerP4zEnum;
     
    12421244              else if (strcmp(name,"XY")==0) return XYEnum;
    12431245              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;
    12461246         else stage=11;
    12471247   }
    12481248   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;
    12501252              else if (strcmp(name,"CalvingdevCoeff")==0) return CalvingdevCoeffEnum;
    12511253              else if (strcmp(name,"DeviatoricStress")==0) return DeviatoricStressEnum;
Note: See TracChangeset for help on using the changeset viewer.