Changeset 18771


Ignore:
Timestamp:
11/10/14 15:01:21 (10 years ago)
Author:
Mathieu Morlighem
Message:

NEW: added L1L2 inversions (very similar to SSA)

Location:
issm/trunk-jpl/src
Files:
4 edited

Legend:

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

    r18061 r18771  
    4242                case SSAApproximationEnum:
    4343                        return CreateKMatrixSSA(element);
     44                case L1L2ApproximationEnum:
     45                        return CreateKMatrixL1L2(element);
    4446                case HOApproximationEnum:
    4547                        return CreateKMatrixHO(element);
     
    139141        return Ke;
    140142}/*}}}*/
     143ElementMatrix* AdjointHorizAnalysis::CreateKMatrixL1L2(Element* element){/*{{{*/
     144
     145        /*Intermediaries*/
     146        bool incomplete_adjoint;
     147
     148        /*Initialize Jacobian with regular L1L2 (first part of the Gateau derivative)*/
     149        StressbalanceAnalysis* analysis = new StressbalanceAnalysis();
     150        ElementMatrix* Ke=analysis->CreateKMatrix(element);
     151        delete analysis;
     152
     153        /*return*/
     154        element->FindParam(&incomplete_adjoint,InversionIncompleteAdjointEnum);
     155        if(!incomplete_adjoint){
     156                _error_("Exact adjoint not supported yet for L1L2 model");
     157        }
     158        return Ke;
     159}/*}}}*/
    141160ElementMatrix* AdjointHorizAnalysis::CreateKMatrixHO(Element* element){/*{{{*/
    142161
     
    300319                case SSAApproximationEnum:
    301320                        return CreatePVectorSSA(element);
     321                case L1L2ApproximationEnum:
     322                        return CreatePVectorL1L2(element);
    302323                case HOApproximationEnum:
    303324                        return CreatePVectorHO(element);
     
    897918        return pe;
    898919}/*}}}*/
     920ElementVector* AdjointHorizAnalysis::CreatePVectorL1L2(Element* element){/*{{{*/
     921
     922        /*Same as SSA*/
     923        return this->CreatePVectorSSA(element);
     924}/*}}}*/
    899925void AdjointHorizAnalysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/
    900926           _error_("not implemented yet");
     
    946972                        switch(approximation){
    947973                                case SSAApproximationEnum: GradientJDragSSA(element,gradient,control_index); break;
     974                                case L1L2ApproximationEnum:GradientJDragL1L2(element,gradient,control_index); break;
    948975                                case HOApproximationEnum:  GradientJDragHO( element,gradient,control_index); break;
    949976                                case FSApproximationEnum:  GradientJDragFS( element,gradient,control_index); break;
     
    955982                        switch(approximation){
    956983                                case SSAApproximationEnum: GradientJBbarSSA(element,gradient,control_index); break;
     984                                case L1L2ApproximationEnum:GradientJBbarL1L2(element,gradient,control_index); break;
    957985                                case HOApproximationEnum:  GradientJBbarHO( element,gradient,control_index); break;
    958986                                case FSApproximationEnum:  GradientJBbarFS( element,gradient,control_index); break;
     
    12231251        if(domaintype!=Domain2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;};
    12241252}/*}}}*/
     1253void AdjointHorizAnalysis::GradientJDragL1L2(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/
     1254
     1255        /*Same as SSA*/
     1256        return this->GradientJDragSSA(element,gradient,control_index);
     1257}/*}}}*/
    12251258void AdjointHorizAnalysis::GradientJDragHO(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/
    12261259
     
    14461479        if(domaintype!=Domain2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;};
    14471480}/*}}}*/
     1481void AdjointHorizAnalysis::GradientJBbarL1L2(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/
     1482
     1483           /*Same as SSA*/
     1484           return this->GradientJBbarSSA(element,gradient,control_index);
     1485}/*}}}*/
    14481486void AdjointHorizAnalysis::GradientJBbarHO(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/
    14491487
  • issm/trunk-jpl/src/c/analyses/AdjointHorizAnalysis.h

    r18057 r18771  
    2626                ElementMatrix* CreateKMatrix(Element* element);
    2727                ElementMatrix* CreateKMatrixSSA(Element* element);
     28                ElementMatrix* CreateKMatrixL1L2(Element* element);
    2829                ElementMatrix* CreateKMatrixHO(Element* element);
    2930                ElementMatrix* CreateKMatrixFS(Element* element);
    3031                ElementVector* CreatePVector(Element* element);
    3132                ElementVector* CreatePVectorSSA(Element* element);
     33                ElementVector* CreatePVectorL1L2(Element* element);
    3234                ElementVector* CreatePVectorHO(Element* element);
    3335                ElementVector* CreatePVectorFS(Element* element);
     
    3739                void GradientJBGradient(Element* element,Vector<IssmDouble>* gradient,int control_index);
    3840                void GradientJDragSSA(Element* element,Vector<IssmDouble>* gradient,int control_index);
     41                void GradientJDragL1L2(Element* element,Vector<IssmDouble>* gradient,int control_index);
    3942                void GradientJDragHO(Element* element,Vector<IssmDouble>* gradient,int control_index);
    4043                void GradientJDragFS(Element* element,Vector<IssmDouble>* gradient,int control_index);
    4144                void GradientJBbarSSA(Element* element,Vector<IssmDouble>* gradient,int control_index);
     45                void GradientJBbarL1L2(Element* element,Vector<IssmDouble>* gradient,int control_index);
    4246                void GradientJBbarHO(Element* element,Vector<IssmDouble>* gradient,int control_index);
    4347                void GradientJBbarFS(Element* element,Vector<IssmDouble>* gradient,int control_index);
  • issm/trunk-jpl/src/m/classes/inversion.m

    r18605 r18771  
    146146                        %Only SSA, HO and FS are supported right now
    147147                        if solution==StressbalanceSolutionEnum()
    148                                 if ~(md.flowequation.isSSA || md.flowequation.isHO || md.flowequation.isFS),
     148                                if ~(md.flowequation.isSSA || md.flowequation.isHO || md.flowequation.isFS || md.flowequation.isL1L2),
    149149                                        md = checkmessage(md,['inversion can only be performed for SSA, HO or FS ice flow models']);
    150150                                end
  • issm/trunk-jpl/src/m/classes/inversion.py

    r18609 r18771  
    131131                #Only SSA, HO and FS are supported right now
    132132                if solution==StressbalanceSolutionEnum():
    133                         if not (md.flowequation.isSSA or md.flowequation.isHO or md.flowequation.isFS):
     133                        if not (md.flowequation.isSSA or md.flowequation.isHO or md.flowequation.isFS or md.flowequation.isL1L2):
    134134                                md.checkmessage("'inversion can only be performed for SSA, HO or FS ice flow models");
    135135
Note: See TracChangeset for help on using the changeset viewer.