Changeset 22178


Ignore:
Timestamp:
10/20/17 14:03:10 (7 years ago)
Author:
Mathieu Morlighem
Message:

CHG: working on balancethickness2 with Jerome, new model, new implementation, new adjoint

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

Legend:

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

    r18930 r22178  
    192192
    193193        /*Intermediaries*/
    194         IssmDouble dlambda[2],ds[2],D0,omega,Jdet;
     194        int         n=3;
     195        IssmDouble  dlambda[2],ds[2],slopex,slopey,slope,omega,Jdet;
    195196        IssmDouble *xyz_list= NULL;
    196197
     
    207208        element->GradientIndexing(&vertexpidlist[0],control_index);
    208209        Input* adjoint_input = element->GetInput(AdjointEnum);            _assert_(adjoint_input);
    209         Input* s_input       = element->GetInput(SurfaceEnum);            _assert_(s_input);
    210         Input* D0_input      = element->GetInput(BalancethicknessD0Enum); _assert_(D0_input);
    211210        Input* omega_input   = element->GetInput(BalancethicknessOmegaEnum); _assert_(omega_input);
     211        Input* surface_input = element->GetInput(SurfaceEnum); _assert_(surface_input);
     212        Input* surfaceslopex_input = element->GetInput(SurfaceSlopeXEnum); _assert_(surfaceslopex_input);
     213        Input* surfaceslopey_input = element->GetInput(SurfaceSlopeYEnum); _assert_(surfaceslopey_input);
     214        IssmDouble rhog    = element->GetMaterialParameter(MaterialsRhoIceEnum)*element->GetMaterialParameter(ConstantsGEnum);
    212215
    213216        Gauss* gauss=element->NewGauss(2);
     
    218221                element->NodalFunctionsP1(basis,gauss);
    219222
    220                 D0_input->GetInputValue(&D0,gauss);
    221223                omega_input->GetInputValue(&omega,gauss);
    222224                adjoint_input->GetInputDerivativeValue(&dlambda[0],xyz_list,gauss);
    223                 s_input->GetInputDerivativeValue(&ds[0],xyz_list,gauss);
     225                surface_input->GetInputDerivativeValue(&ds[0],xyz_list,gauss);
     226                surfaceslopex_input->GetInputValue(&slopex,gauss);
     227                surfaceslopey_input->GetInputValue(&slopey,gauss);
     228
     229                slope = sqrt(slopex*slopex + slopey*slopey);
    224230
    225231                /*Build gradient vector (actually -dJ/da): */
    226232                for(int i=0;i<numvertices;i++){
    227                         ge[i]+= -Jdet*gauss->weight*basis[i]*exp(omega)*D0*(ds[0]*dlambda[0] + ds[1]*dlambda[1]);
     233                        ge[i]+= -Jdet*gauss->weight*basis[i]*pow(rhog,n)*exp(omega)*pow(slope,n-1)*(ds[0]*dlambda[0] + ds[1]*dlambda[1]);
    228234                        _assert_(!xIsNan<IssmDouble>(ge[i]));
    229235                }
  • issm/trunk-jpl/src/c/analyses/Balancethickness2Analysis.cpp

    r20690 r22178  
    3939        iomodel->FetchDataToInput(elements,"md.balancethickness.thickening_rate",BalancethicknessThickeningRateEnum);
    4040        iomodel->FetchDataToInput(elements,"md.balancethickness.omega",BalancethicknessOmegaEnum);
     41        iomodel->FetchDataToInput(elements,"md.balancethickness.slopex",SurfaceSlopeXEnum);
     42        iomodel->FetchDataToInput(elements,"md.balancethickness.slopey",SurfaceSlopeYEnum);
    4143
    4244        /*Update elements: */
     
    6365        return NULL;
    6466}/*}}}*/
    65 void           Balancethickness2Analysis::CreateD0(Element* element){/*{{{*/
    66 
    67         /*Intermediaries */
    68         IssmDouble       Gamma,h,mu0,ds[2],Cmu,B,k,s,b,normds;
    69         const int        n = 3;
    70         const IssmDouble Hstar = 500.;
    71         const IssmDouble Lstar = 500.e+3;
    72         IssmDouble *xyz_list  = NULL;
    73 
    74         /*Fetch number of vertices and allocate output*/
    75         int  numnodes = element->GetNumberOfNodes();
    76         IssmDouble* D0     = xNew<IssmDouble>(numnodes);
    77 
    78         /*retrieve what we need: */
    79         element->GetVerticesCoordinates(&xyz_list);
    80         Input* surfaceslopex_input = element->GetInput(SurfaceSlopeXEnum);
    81         Input* surfaceslopey_input = element->GetInput(SurfaceSlopeYEnum);
    82         Input* surface_input       = element->GetInput(SurfaceEnum);            _assert_(surface_input);
    83         Input* B_input             = element->GetInput(MaterialsRheologyBEnum); _assert_(B_input);
    84         IssmDouble rhog            = element->GetMaterialParameter(MaterialsRhoIceEnum)*element->GetMaterialParameter(ConstantsGEnum);
    85 
    86         /*Calculate damage evolution source term: */
    87         Gauss* gauss=element->NewGauss();
    88         for (int i=0;i<numnodes;i++){
    89                 gauss->GaussNode(element->GetElementType(),i);
    90                
    91                 B_input->GetInputValue(&B,gauss);
    92                 if(surfaceslopex_input && surfaceslopey_input){
    93                         surfaceslopex_input->GetInputValue(&ds[0],gauss);
    94                         surfaceslopey_input->GetInputValue(&ds[1],gauss);
    95                 }
    96                 else{
    97                         surface_input->GetInputDerivativeValue(&ds[0],xyz_list,gauss);
    98                 }
    99 
    100                 /*check slopes*/
    101                 normds = sqrt(ds[0]*ds[0]+ds[1]*ds[1]);
    102                 if (normds==0.){
    103                         _error_("surface slope is zero");
    104                 }
    105                 if(normds<1.e-5){
    106                         ds[0] = ds[0]/normds*1.e+5;
    107                         ds[1] = ds[1]/normds*1.e+5;
    108                         normds = 1.e-5;
    109                 }
    110 
    111                 mu0   = pow(2.,(1-3*n)/(2.*n)) * B;
    112                 Gamma = pow(rhog,n) * pow(Hstar,2*(n+1)) * pow(Hstar/Lstar,2*(n+1)) * 1./pow(mu0,n);
    113 
    114                 D0[i] = Gamma*pow(ds[0]*ds[0]+ds[1]*ds[1],(n-1)/2)/(n+2);
    115         }
    116 
    117         /*Add input*/
    118         element->AddInput(BalancethicknessD0Enum,D0,element->GetElementType());
    119         //if(surfaceslopex_input && surfaceslopey_input){
    120         //      element->DeleteInput(SurfaceSlopeXEnum);
    121         //      element->DeleteInput(SurfaceSlopeYEnum);
    122         //}
    123        
    124         /*Clean up and return*/
    125         xDelete<IssmDouble>(D0);
    126         xDelete<IssmDouble>(xyz_list);
    127         delete gauss;
    128 }/*}}}*/
    12967ElementMatrix* Balancethickness2Analysis::CreateJacobianMatrix(Element* element){/*{{{*/
    13068_error_("Not implemented");
     
    13371
    13472        /*Intermediaries */
    135         IssmDouble  Jdet,D0,omega;
     73        int         n=3;
     74        IssmDouble  Jdet,omega,ds[2],slope;
    13675        IssmDouble* xyz_list = NULL;
    13776
     
    14584        /*Retrieve all inputs and parameters*/
    14685        element->GetVerticesCoordinates(&xyz_list);
    147         Input* omega_input = element->GetInput(BalancethicknessOmegaEnum); _assert_(omega_input);
    148         Input* D0_input    = element->GetInput(BalancethicknessD0Enum);
    149         if(!D0_input){
    150                 this->CreateD0(element);
    151                 D0_input = element->GetInput(BalancethicknessD0Enum); _assert_(D0_input);
    152         }
     86        Input* omega_input         = element->GetInput(BalancethicknessOmegaEnum); _assert_(omega_input);
     87        Input* surfaceslopex_input = element->GetInput(SurfaceSlopeXEnum); _assert_(surfaceslopex_input);
     88        Input* surfaceslopey_input = element->GetInput(SurfaceSlopeYEnum); _assert_(surfaceslopey_input);
     89        IssmDouble rhog    = element->GetMaterialParameter(MaterialsRhoIceEnum)*element->GetMaterialParameter(ConstantsGEnum);
    15390
    15491        /* Start  looping on the number of gaussian points: */
     
    15895                element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss);
    15996                element->JacobianDeterminant(&Jdet,xyz_list,gauss);
    160                 D0_input->GetInputValue(&D0,gauss);
    16197                omega_input->GetInputValue(&omega,gauss);
     98                surfaceslopex_input->GetInputValue(&ds[0],gauss);
     99                surfaceslopey_input->GetInputValue(&ds[1],gauss);
     100
     101                slope = sqrt(ds[0]*ds[0] + ds[1]*ds[1]);
    162102
    163103                for(int i=0;i<numnodes;i++){
    164104                        for(int j=0;j<numnodes;j++){
    165                                 Ke->values[i*numnodes+j] += D0*exp(omega)*gauss->weight*Jdet*(dbasis[0*numnodes+i]*dbasis[0*numnodes+j] + dbasis[1*numnodes+i]*dbasis[1*numnodes+j]);
     105                                Ke->values[i*numnodes+j] += pow(rhog,n)*exp(omega)*pow(slope,n-1)*gauss->weight*Jdet*(dbasis[0*numnodes+i]*dbasis[0*numnodes+j] + dbasis[1*numnodes+i]*dbasis[1*numnodes+j]);
    166106                        }
    167107                }
  • issm/trunk-jpl/src/c/analyses/Balancethickness2Analysis.h

    r18930 r22178  
    2323                void           Core(FemModel* femmodel);
    2424                ElementVector* CreateDVector(Element* element);
    25                 void           CreateD0(Element* element);
    2625                ElementMatrix* CreateJacobianMatrix(Element* element);
    2726                ElementMatrix* CreateKMatrix(Element* element);
  • issm/trunk-jpl/src/c/classes/Elements/Tria.cpp

    r22124 r22178  
    17591759                                                for(j=0;j<NUMVERTICES;j++)cmmaxinputs[j]=iomodel->Data("md.inversion.max_parameters")[(tria_vertex_ids[j]-1)*num_control_type+i];
    17601760                                                this->inputs->AddInput(new ControlInput(ThicknessEnum,TriaInputEnum,nodeinputs,cmmininputs,cmmaxinputs,i+1));
     1761                                        }
     1762                                        break;
     1763                                case BalancethicknessOmegaEnum:
     1764                                        if(iomodel->Data("md.balancethickness.omega")){
     1765                                                for(j=0;j<NUMVERTICES;j++) nodeinputs[j]=iomodel->Data("md.balancethickness.omega")[tria_vertex_ids[j]-1];
     1766                                                for(j=0;j<NUMVERTICES;j++)cmmininputs[j]=iomodel->Data("md.inversion.min_parameters")[(tria_vertex_ids[j]-1)*num_control_type+i];
     1767                                                for(j=0;j<NUMVERTICES;j++)cmmaxinputs[j]=iomodel->Data("md.inversion.max_parameters")[(tria_vertex_ids[j]-1)*num_control_type+i];
     1768                                                this->inputs->AddInput(new ControlInput(BalancethicknessOmegaEnum,TriaInputEnum,nodeinputs,cmmininputs,cmmaxinputs,i+1));
    17611769                                        }
    17621770                                        break;
  • issm/trunk-jpl/src/c/cores/adjointbalancethickness2_core.cpp

    r18193 r22178  
    2424
    2525        /*Call SurfaceAreax, because some it might be needed by PVector*/
    26         SurfaceAreax(NULL,femmodel);
     26        //SurfaceAreax(NULL,femmodel);
    2727
    2828        /*compute adjoint*/
  • issm/trunk-jpl/src/c/cores/balancethickness2_core.cpp

    r18715 r22178  
    1313
    1414        /*parameters: */
    15         bool        save_results;
    16         IssmDouble  l = 3.;
     15        bool save_results;
     16        //IssmDouble  l = 3.;
    1717
    1818        /*recover parameters: */
    1919        femmodel->parameters->FindParam(&save_results,SaveResultsEnum);
    2020
    21         if(VerboseSolution()) _printf0_("computing smooth surface slopes:\n");
     21        //if(VerboseSolution()) _printf0_("computing smooth surface slopes:\n");
    2222        //femmodel->parameters->SetParam(l,SmoothThicknessMultiplierEnum);
    2323        //femmodel->SetCurrentConfiguration(SmoothAnalysisEnum);
     
    2626        //femmodel->parameters->SetParam(SurfaceSlopeYEnum,InputToSmoothEnum);
    2727        //solutionsequence_linear(femmodel);
    28         surfaceslope_core(femmodel);
     28        //surfaceslope_core(femmodel);
    2929
    3030        if(VerboseSolution()) _printf0_("call computational core:\n");
     
    3535        if(save_results){
    3636                if(VerboseSolution()) _printf0_("   saving results\n");
    37                 const int numoutputs = 6;
    38                 int outputs[numoutputs] = {SurfaceEnum,SurfaceSlopeXEnum,SurfaceSlopeYEnum,VxEnum,VyEnum,VelEnum};
    39                 //const int numoutputs = 4;
    40                 //int outputs[numoutputs] = {SurfaceEnum,VxEnum,VyEnum,VelEnum};
     37                const int numoutputs = 1;
     38                int outputs[numoutputs] = {SurfaceEnum};
    4139                femmodel->RequestedOutputsx(&femmodel->results,&outputs[0],numoutputs);
    4240        }
  • issm/trunk-jpl/src/c/cores/controlvalidation_core.cpp

    r19344 r22178  
    104104        xDelete<IssmDouble>(X);
    105105        xDelete<IssmDouble>(X0);
     106        xDelete<IssmDouble>(scaling_factors);
    106107}
Note: See TracChangeset for help on using the changeset viewer.