Changeset 18604


Ignore:
Timestamp:
10/08/14 14:28:10 (10 years ago)
Author:
Mathieu Morlighem
Message:

CHG: working on balance thickness2

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  
    195195void AdjointBalancethickness2Analysis::GradientJdHdt(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/
    196196
     197        /*Intermediaries*/
     198        IssmDouble lambda,Jdet;
     199        IssmDouble *xyz_list= NULL;
     200
    197201        /*Fetch number of vertices for this finite element*/
    198202        int numvertices = element->GetNumberOfVertices();
    199203
    200204        /*Initialize some vectors*/
     205        IssmDouble* basis         = xNew<IssmDouble>(numvertices);
    201206        IssmDouble* ge            = xNewZeroInit<IssmDouble>(numvertices);
    202         IssmDouble* lambda        = xNew<IssmDouble>(numvertices);
    203207        int*        vertexpidlist = xNew<int>(numvertices);
    204208
    205209        /*Retrieve all inputs we will be needing: */
     210        element->GetVerticesCoordinates(&xyz_list);
    206211        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);
    213230
    214231        /*Clean up and return*/
    215232        xDelete<IssmDouble>(ge);
    216         xDelete<IssmDouble>(lambda);
     233        xDelete<IssmDouble>(xyz_list);
     234        xDelete<IssmDouble>(basis);
    217235        xDelete<int>(vertexpidlist);
     236        delete gauss;
    218237}/*}}}*/
    219238void AdjointBalancethickness2Analysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/
  • issm/trunk-jpl/src/c/analyses/Balancethickness2Analysis.cpp

    r18574 r18604  
    8282        Input* omega_input = element->GetInput(BalancethicknessOmegaEnum); _assert_(omega_input);
    8383        Input* D0_input    = element->GetInput(BalancethicknessD0Enum);
    84         if(!D0_input){
     84        //if(!D0_input){
    8585                this->CreateD0(element);
    8686                D0_input = element->GetInput(BalancethicknessD0Enum); _assert_(D0_input);
    87         }
     87        //}
    8888
    8989        /* Start  looping on the number of gaussian points: */
     
    220220
    221221        /*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;
    223223        const int        n = 3;
    224224        const IssmDouble Hstar = 500.;
     
    232232        /*retrieve what we need: */
    233233        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);
    237239
    238240        /*Calculate damage evolution source term: */
     
    242244               
    243245                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                }
    245264
    246265                mu0   = pow(2.,(1-3*n)/(2.*n)) * B;
     
    252271        /*Add input*/
    253272        element->AddInput(BalancethicknessD0Enum,D0,element->GetElementType());
     273        //if(surfaceslopex_input && surfaceslopey_input){
     274        //      element->DeleteInput(SurfaceSlopeXEnum);
     275        //      element->DeleteInput(SurfaceSlopeYEnum);
     276        //}
    254277       
    255278        /*Clean up and return*/
  • issm/trunk-jpl/src/c/analyses/SmoothAnalysis.cpp

    r18593 r18604  
    4848        /* Intermediaries */
    4949        int         domaintype;
    50         IssmDouble  Jdet,thickness,l=8.;
     50        IssmDouble  Jdet,thickness,l;
    5151        IssmDouble *xyz_list = NULL;
    5252
     
    6868
    6969        /*Retrieve all inputs and parameters*/
     70        element->FindParam(&l,SmoothThicknessMultiplierEnum); _assert_(l>0.);
    7071        element->GetVerticesCoordinates(&xyz_list);
    7172        Input* thickness_input = element->GetInput(ThicknessEnum); _assert_(thickness_input);
  • issm/trunk-jpl/src/c/cores/balancethickness2_core.cpp

    r18565 r18604  
    1515        bool save_results;
    1616
    17         /*activate formulation: */
    18         femmodel->SetCurrentConfiguration(Balancethickness2AnalysisEnum);
    19 
    2017        /*recover parameters: */
    2118        femmodel->parameters->FindParam(&save_results,SaveResultsEnum);
    2219
     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
    2328        if(VerboseSolution()) _printf0_("call computational core:\n");
     29        femmodel->SetCurrentConfiguration(Balancethickness2AnalysisEnum);
    2430        solutionsequence_linear(femmodel);
    2531        //solutionsequence_nonlinear(femmodel,false);
     
    2733        if(save_results){
    2834                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};
    3139                femmodel->RequestedOutputsx(&femmodel->results,&outputs[0],numoutputs);
    3240        }
  • issm/trunk-jpl/src/c/cores/balancevelocity_core.cpp

    r18593 r18604  
    1818        femmodel->parameters->FindParam(&save_results,SaveResultsEnum);
    1919
    20         if(VerboseSolution()) _printf0_("computing smoothed slopes:\n");
     20        if(VerboseSolution()) _printf0_("computing smooth driving stress:\n");
     21        femmodel->parameters->SetParam(8.,SmoothThicknessMultiplierEnum);
    2122        femmodel->SetCurrentConfiguration(SmoothAnalysisEnum);
    2223        femmodel->parameters->SetParam(DrivingStressXEnum,InputToSmoothEnum);
  • issm/trunk-jpl/src/c/cores/controlvalidation_core.cpp

    r18573 r18604  
    1313        int         solution_type,n;
    1414        int         num_responses;
    15         IssmDouble  j0,j;
     15        IssmDouble  j0,j,yts;
    1616        IssmDouble  Ialpha,exponent,alpha;
    1717        IssmDouble* jlist = NULL;
     
    2828        femmodel->parameters->SetParam(false,SaveResultsEnum);
    2929        femmodel->parameters->FindParam(&num_responses,InversionNumCostFunctionsEnum);
     30        femmodel->parameters->FindParam(&yts,ConstantsYtsEnum);
    3031
    3132        /*Get initial guess*/
     
    6465        IssmDouble exp0 = 0.;
    6566        IssmDouble incr = -0.2;
    66         IssmDouble exp1 = -10.;
     67        IssmDouble exp1 = -18.;
    6768        int        num  = reCast<int,IssmDouble>((exp1-exp0)/incr);
    6869
     
    8889
    8990                IssmDouble Den = 0.;
    90                 for(int i=0;i<n;i++) Den += alpha * G[i] * 1.;
     91                for(int i=0;i<n;i++) Den += alpha* G[i] * 1.;
    9192                Ialpha = fabs((j - j0)/Den - 1.);
    9293
  • issm/trunk-jpl/src/c/modules/ModelProcessorx/Control/UpdateElementsAndMaterialsControl.cpp

    r18568 r18604  
    2929        iomodel->FetchDataToInput(elements,InversionVyObsEnum,0.);
    3030        iomodel->FetchDataToInput(elements,InversionThicknessObsEnum,0.);
    31         //iomodel->FetchDataToInput(elements,InversionSurfaceObsEnum,0.);
     31        iomodel->FetchDataToInput(elements,InversionSurfaceObsEnum,0.);
    3232
    3333        iomodel->FetchData(5,InversionControlParametersEnum,InversionCostFunctionsEnum,InversionCostFunctionsCoefficientsEnum,InversionMinParametersEnum,InversionMaxParametersEnum);
  • issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h

    r18593 r18604  
    450450        InputToDepthaverageEnum,
    451451        InputToSmoothEnum,
     452        SmoothThicknessMultiplierEnum,
    452453        IntParamEnum,
    453454        IntVecParamEnum,
  • issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp

    r18593 r18604  
    447447                case InputToDepthaverageEnum : return "InputToDepthaverage";
    448448                case InputToSmoothEnum : return "InputToSmooth";
     449                case SmoothThicknessMultiplierEnum : return "SmoothThicknessMultiplier";
    449450                case IntParamEnum : return "IntParam";
    450451                case IntVecParamEnum : return "IntVecParam";
  • issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp

    r18593 r18604  
    456456              else if (strcmp(name,"InputToDepthaverage")==0) return InputToDepthaverageEnum;
    457457              else if (strcmp(name,"InputToSmooth")==0) return InputToSmoothEnum;
     458              else if (strcmp(name,"SmoothThicknessMultiplier")==0) return SmoothThicknessMultiplierEnum;
    458459              else if (strcmp(name,"IntParam")==0) return IntParamEnum;
    459460              else if (strcmp(name,"IntVecParam")==0) return IntVecParamEnum;
     
    505506              else if (strcmp(name,"BalancethicknessMisfit")==0) return BalancethicknessMisfitEnum;
    506507              else if (strcmp(name,"BedSlopeX")==0) return BedSlopeXEnum;
    507               else if (strcmp(name,"BedSlopeY")==0) return BedSlopeYEnum;
    508508         else stage=5;
    509509   }
    510510   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;
    512513              else if (strcmp(name,"Converged")==0) return ConvergedEnum;
    513514              else if (strcmp(name,"Fill")==0) return FillEnum;
     
    628629              else if (strcmp(name,"Time")==0) return TimeEnum;
    629630              else if (strcmp(name,"WaterColumnOld")==0) return WaterColumnOldEnum;
    630               else if (strcmp(name,"Outputdefinition")==0) return OutputdefinitionEnum;
    631631         else stage=6;
    632632   }
    633633   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;
    635636              else if (strcmp(name,"Massfluxatgate")==0) return MassfluxatgateEnum;
    636637              else if (strcmp(name,"MassfluxatgateName")==0) return MassfluxatgateNameEnum;
     
    751752              else if (strcmp(name,"BasalforcingsOceanVy")==0) return BasalforcingsOceanVyEnum;
    752753              else if (strcmp(name,"SurfaceforcingsRhoAir")==0) return SurfaceforcingsRhoAirEnum;
    753               else if (strcmp(name,"SurfaceforcingsAirCoef")==0) return SurfaceforcingsAirCoefEnum;
    754754         else stage=7;
    755755   }
    756756   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;
    758759              else if (strcmp(name,"SurfaceforcingsAirQuadDragCoef")==0) return SurfaceforcingsAirQuadDragCoefEnum;
    759760              else if (strcmp(name,"SurfaceforcingsWindVx")==0) return SurfaceforcingsWindVxEnum;
  • issm/trunk-jpl/src/m/enum/EnumDefinitions.py

    r18593 r18604  
    439439def InputToDepthaverageEnum(): return StringToEnum("InputToDepthaverage")[0]
    440440def InputToSmoothEnum(): return StringToEnum("InputToSmooth")[0]
     441def SmoothThicknessMultiplierEnum(): return StringToEnum("SmoothThicknessMultiplier")[0]
    441442def IntParamEnum(): return StringToEnum("IntParam")[0]
    442443def IntVecParamEnum(): return StringToEnum("IntVecParam")[0]
Note: See TracChangeset for help on using the changeset viewer.