Changeset 18551


Ignore:
Timestamp:
09/30/14 11:03:47 (10 years ago)
Author:
Mathieu Morlighem
Message:

CHG: working on balancethickness2 (added new field), and some minor changes to googlemaps to make it work for other regions than GIS or AIS

Location:
issm/trunk-jpl/src
Files:
1 added
9 edited

Legend:

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

    r18545 r18551  
    3434        iomodel->FetchDataToInput(elements,SurfaceforcingsMassBalanceEnum);
    3535        iomodel->FetchDataToInput(elements,BalancethicknessThickeningRateEnum);
     36        iomodel->FetchDataToInput(elements,BalancethicknessCmuEnum);
    3637}/*}}}*/
    3738void Balancethickness2Analysis::CreateNodes(Nodes* nodes,IoModel* iomodel){/*{{{*/
     
    144145                for(int i=0;i<numnodes;i++) pe->values[i]+=Jdet*gauss->weight*(
    145146                                        (ms-mb-dhdt)*basis[i]
    146                                         -D*db[0]*dbasis[0*numnodes+i] - D*db[1]*dbasis[1*numnodes+i]
     147                                        //-D*db[0]*dbasis[0*numnodes+i] - D*db[1]*dbasis[1*numnodes+i]
    147148                                        );
    148149        }
     
    155156}/*}}}*/
    156157void Balancethickness2Analysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/
    157            _error_("not implemented yet");
     158                element->GetSolutionFromInputsOneDof(solution,SurfaceEnum);
    158159}/*}}}*/
    159160void Balancethickness2Analysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
     
    161162}/*}}}*/
    162163void Balancethickness2Analysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/
    163         element->InputUpdateFromSolutionOneDof(solution,ThicknessEnum);
     164
     165        /*Intermediaries*/
     166        IssmDouble  ds[2],s,b,D;
     167        IssmDouble* xyz_list = NULL;
     168
     169        //element->InputUpdateFromSolutionOneDof(solution,ThicknessEnum);
     170        element->InputUpdateFromSolutionOneDof(solution,SurfaceEnum);
     171
     172        /*Fetch number of vertices and allocate velocity vectors*/
     173        int numvertices = element->GetNumberOfVertices();
     174        IssmDouble* vel_list = xNew<IssmDouble>(numvertices);
     175        IssmDouble* vx_list  = xNew<IssmDouble>(numvertices);
     176        IssmDouble* vy_list  = xNew<IssmDouble>(numvertices);
     177
     178        /*Retrieve all inputs and parameters*/
     179        element->GetVerticesCoordinates(&xyz_list);
     180        Input* D_input   = element->GetInput(BalancethicknessDiffusionCoefficientEnum);
     181        Input* H_input   = element->GetInput(ThicknessEnum);                            _assert_(H_input);
     182        Input* s_input   = element->GetInput(SurfaceEnum);                              _assert_(s_input);
     183        Input* b_input   = element->GetInput(BaseEnum);                                 _assert_(b_input);
     184
     185        /*Calculate velocities*/
     186        Gauss* gauss=element->NewGauss();
     187        for(int iv=0;iv<numvertices;iv++){
     188                gauss->GaussVertex(iv);
     189
     190                if(D_input){
     191                        D_input->GetInputValue(&D,gauss);
     192                }
     193                else{
     194                        D = 0.;
     195                }
     196                b_input->GetInputValue(&b,gauss);
     197                s_input->GetInputValue(&s,gauss);
     198                s_input->GetInputDerivativeValue(&ds[0],xyz_list,gauss);
     199
     200                vx_list[iv] = -1./(s-b)*D*ds[0];
     201                vy_list[iv] = -1./(s-b)*D*ds[1];
     202                vel_list[iv] = sqrt(pow(vx_list[iv],2) + pow(vy_list[iv],2));
     203        }
     204
     205        /*Add vx and vy as inputs to the tria element: */
     206        element->AddInput(VxEnum,vx_list,P1Enum);
     207        element->AddInput(VyEnum,vy_list,P1Enum);
     208        element->AddInput(VelEnum,vel_list,P1Enum);
     209
     210        /*Free ressources:*/
     211        xDelete<IssmDouble>(vy_list);
     212        xDelete<IssmDouble>(vx_list);
     213        xDelete<IssmDouble>(vel_list);
     214        xDelete<IssmDouble>(xyz_list);
    164215}/*}}}*/
    165216void Balancethickness2Analysis::UpdateConstraints(FemModel* femmodel){/*{{{*/
     
    172223
    173224        /*Intermediaries */
    174         IssmDouble       Gamma,h,mu0,ds[2],Cmu,B,k;
     225        IssmDouble       Gamma,h,mu0,ds[2],Cmu,B,k,s,b;
    175226        const int        n = 3;
    176227        const IssmDouble Hstar = 500.;
     
    185236        /*retrieve what we need: */
    186237        element->GetVerticesCoordinates(&xyz_list);
    187         Input* thickness_input  = element->GetInput(ThicknessEnum);          _assert_(thickness_input);
     238        Input* bed_input        = element->GetInput(BaseEnum);               _assert_(bed_input);
    188239        Input* surface_input    = element->GetInput(SurfaceEnum);            _assert_(surface_input);
    189240        Input* B_input          = element->GetInput(MaterialsRheologyBEnum); _assert_(B_input);
    190241        Input* k_input          = element->GetInput(FrictionCoefficientEnum);_assert_(k_input);
     242        Input* Cmu_input        = element->GetInput(BalancethicknessCmuEnum);_assert_(Cmu_input);
    191243        IssmDouble rhog = element->GetMaterialParameter(MaterialsRhoIceEnum)*element->GetMaterialParameter(ConstantsGEnum);
    192244
     
    198250                B_input->GetInputValue(&B,gauss);
    199251                k_input->GetInputValue(&k,gauss);
    200                 thickness_input->GetInputValue(&h,gauss);
     252                //thickness_input->GetInputValue(&h,gauss);
    201253                surface_input->GetInputDerivativeValue(&ds[0],xyz_list,gauss);
     254                surface_input->GetInputValue(&s,gauss);
     255                bed_input->GetInputValue(&b,gauss);
     256                h = s-b;
    202257
    203258                mu0   = pow(2.,(1-3*n)/(2.*n)) * B;
    204259                Gamma = pow(rhog,n) * pow(Hstar,2*(n+1)) * pow(Hstar/Lstar,2*(n+1)) * 1./pow(mu0,n);
    205                 Cmu   = mu0/Hstar/(k*k);
    206 
    207                 D[i] = Gamma*pow(ds[0]*ds[0]+ds[1]*ds[1],(n-1)/2)*pow(h,n+1)*(1./(n+2.)*h - Cmu);
     260                //Cmu   = pow(mu0,n)/Hstar/(k*k);
     261                Cmu_input->GetInputValue(&Cmu,gauss);
     262
     263                D[i] = Gamma*pow(ds[0]*ds[0]+ds[1]*ds[1],(n-1)/2)*pow(h,n+1)*(1./(n+2.)*h + Cmu);
    208264        }
    209265
  • issm/trunk-jpl/src/c/cores/balancethickness2_core.cpp

    r18476 r18551  
    2222
    2323        if(VerboseSolution()) _printf0_("call computational core:\n");
    24         solutionsequence_linear(femmodel);
     24        //solutionsequence_linear(femmodel);
     25        solutionsequence_nonlinear(femmodel,false);
    2526
    2627        if(save_results){
    2728                if(VerboseSolution()) _printf0_("   saving results\n");
    28                 int outputs[1] = {ThicknessEnum};
    29                 femmodel->RequestedOutputsx(&femmodel->results,&outputs[0],1);
     29                const int numoutputs = 5;
     30                //int outputs[numoutputs] = {ThicknessEnum};
     31                int outputs[numoutputs] = {SurfaceEnum,VxEnum,VyEnum,VelEnum,BalancethicknessDiffusionCoefficientEnum};
     32                femmodel->RequestedOutputsx(&femmodel->results,&outputs[0],numoutputs);
    3033        }
    3134
  • issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h

    r18528 r18551  
    305305        Balancethickness2MisfitEnum,
    306306        BalancethicknessDiffusionCoefficientEnum,
     307        BalancethicknessCmuEnum,
    307308        /*}}}*/
    308309        /*Surfaceforcings{{{*/
  • issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp

    r18528 r18551  
    313313                case Balancethickness2MisfitEnum : return "Balancethickness2Misfit";
    314314                case BalancethicknessDiffusionCoefficientEnum : return "BalancethicknessDiffusionCoefficient";
     315                case BalancethicknessCmuEnum : return "BalancethicknessCmu";
    315316                case SurfaceforcingsEnum : return "Surfaceforcings";
    316317                case SMBEnum : return "SMB";
  • issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp

    r18528 r18551  
    319319              else if (strcmp(name,"Balancethickness2Misfit")==0) return Balancethickness2MisfitEnum;
    320320              else if (strcmp(name,"BalancethicknessDiffusionCoefficient")==0) return BalancethicknessDiffusionCoefficientEnum;
     321              else if (strcmp(name,"BalancethicknessCmu")==0) return BalancethicknessCmuEnum;
    321322              else if (strcmp(name,"Surfaceforcings")==0) return SurfaceforcingsEnum;
    322323              else if (strcmp(name,"SMB")==0) return SMBEnum;
     
    382383              else if (strcmp(name,"MeltingAnalysis")==0) return MeltingAnalysisEnum;
    383384              else if (strcmp(name,"MasstransportAnalysis")==0) return MasstransportAnalysisEnum;
    384               else if (strcmp(name,"MasstransportSolution")==0) return MasstransportSolutionEnum;
    385385         else stage=4;
    386386   }
    387387   if(stage==4){
    388               if (strcmp(name,"FreeSurfaceBaseAnalysis")==0) return FreeSurfaceBaseAnalysisEnum;
     388              if (strcmp(name,"MasstransportSolution")==0) return MasstransportSolutionEnum;
     389              else if (strcmp(name,"FreeSurfaceBaseAnalysis")==0) return FreeSurfaceBaseAnalysisEnum;
    389390              else if (strcmp(name,"FreeSurfaceTopAnalysis")==0) return FreeSurfaceTopAnalysisEnum;
    390391              else if (strcmp(name,"SurfaceNormalVelocity")==0) return SurfaceNormalVelocityEnum;
     
    505506              else if (strcmp(name,"FractionIncrement")==0) return FractionIncrementEnum;
    506507              else if (strcmp(name,"Friction")==0) return FrictionEnum;
    507               else if (strcmp(name,"Internal")==0) return InternalEnum;
    508508         else stage=5;
    509509   }
    510510   if(stage==5){
    511               if (strcmp(name,"MassFlux")==0) return MassFluxEnum;
     511              if (strcmp(name,"Internal")==0) return InternalEnum;
     512              else if (strcmp(name,"MassFlux")==0) return MassFluxEnum;
    512513              else if (strcmp(name,"MeltingOffset")==0) return MeltingOffsetEnum;
    513514              else if (strcmp(name,"Misfit")==0) return MisfitEnum;
     
    628629              else if (strcmp(name,"MisfitObservation")==0) return MisfitObservationEnum;
    629630              else if (strcmp(name,"MisfitObservationEnum")==0) return MisfitObservationEnumEnum;
    630               else if (strcmp(name,"MisfitTimeinterpolation")==0) return MisfitTimeinterpolationEnum;
    631631         else stage=6;
    632632   }
    633633   if(stage==6){
    634               if (strcmp(name,"MisfitWeights")==0) return MisfitWeightsEnum;
     634              if (strcmp(name,"MisfitTimeinterpolation")==0) return MisfitTimeinterpolationEnum;
     635              else if (strcmp(name,"MisfitWeights")==0) return MisfitWeightsEnum;
    635636              else if (strcmp(name,"MisfitWeightsEnum")==0) return MisfitWeightsEnumEnum;
    636637              else if (strcmp(name,"SurfaceObservation")==0) return SurfaceObservationEnum;
     
    751752              else if (strcmp(name,"MaterialsYoungModulus")==0) return MaterialsYoungModulusEnum;
    752753              else if (strcmp(name,"MaterialsTimeRelaxationStress")==0) return MaterialsTimeRelaxationStressEnum;
    753               else if (strcmp(name,"MaterialsTimeRelaxationDamage")==0) return MaterialsTimeRelaxationDamageEnum;
    754754         else stage=7;
    755755   }
    756756   if(stage==7){
    757               if (strcmp(name,"MaterialsRidgingExponent")==0) return MaterialsRidgingExponentEnum;
     757              if (strcmp(name,"MaterialsTimeRelaxationDamage")==0) return MaterialsTimeRelaxationDamageEnum;
     758              else if (strcmp(name,"MaterialsRidgingExponent")==0) return MaterialsRidgingExponentEnum;
    758759              else if (strcmp(name,"MaterialsCohesion")==0) return MaterialsCohesionEnum;
    759760              else if (strcmp(name,"MaterialsInternalFrictionCoef")==0) return MaterialsInternalFrictionCoefEnum;
  • issm/trunk-jpl/src/m/classes/balancethickness.m

    r17931 r18551  
    99                thickening_rate   = NaN;
    1010                stabilization     = 0;
     11
     12                Cmu               = NaN;
    1113        end
    1214        methods
    13         function createxml(obj,fid) % {{{
    14             fprintf(fid, '\n\n');
    15             fprintf(fid, '%s\n', '<!-- balancethickness -->');
    16            
    17                         fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="spcthickness" type="',     class(obj.spcthickness),'" default="',        convert2str(obj.spcthickness),'">',       '     <section name="balancethickness" />','     <help> thickness constraints (NaN means no constraint) [m] </help>','</parameter>');
    18             fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="thickening_rate" type="',      class(obj.thickening_rate),'" default="',            convert2str(obj.thickening_rate),'">',     '     <section name="balancethickness" />','     <help> ice thickening rate used in the mass conservation (dh/dt) [m/yr] </help>','</parameter>');
    19            
    20             % balancethickness drop-down (1,2, or 3)
    21             fprintf(fid,'%s\n%s\n%s\n',        '<parameter key ="stabilization" type="alternative" optional="false">','     <section name="balancethickness" />','     <help> 0: None, 1: SU, 2: SSAs artificial diffusivity, 3:DG </help>');
    22             fprintf(fid,'%s\n','       <option value="1" type="string" default="true"> </option>');
    23             fprintf(fid,'%s\n','       <option value="2" type="string" default="false"> </option>');
    24             fprintf(fid,'%s\n%s\n','       <option value="3" type="string" default="false"> </option>','</parameter>');
    25 
    26         end % }}}
    2715                function obj = balancethickness(varargin) % {{{
    2816                        switch nargin
     
    4634                        md = checkfield(md,'fieldname','balancethickness.thickening_rate','size',[md.mesh.numberofvertices 1],'NaN',1);
    4735                        md = checkfield(md,'fieldname','balancethickness.stabilization','size',[1 1],'values',[0 1 2 3]);
     36
     37                        md = checkfield(md,'fieldname','balancethickness.Cmu','size',[md.mesh.numberofvertices 1],'NaN',1,'>=',0);
    4838                end % }}}
    4939                function disp(obj) % {{{
     
    6252                        WriteData(fid,'object',obj,'fieldname','thickening_rate','format','DoubleMat','mattype',1,'scale',1./yts);
    6353                        WriteData(fid,'object',obj,'fieldname','stabilization','format','Integer');
     54
     55                        WriteData(fid,'object',obj,'fieldname','Cmu','format','DoubleMat','mattype',1);
    6456                end % }}}
    6557        end
  • issm/trunk-jpl/src/m/enum/EnumDefinitions.py

    r18528 r18551  
    305305def Balancethickness2MisfitEnum(): return StringToEnum("Balancethickness2Misfit")[0]
    306306def BalancethicknessDiffusionCoefficientEnum(): return StringToEnum("BalancethicknessDiffusionCoefficient")[0]
     307def BalancethicknessCmuEnum(): return StringToEnum("BalancethicknessCmu")[0]
    307308def SurfaceforcingsEnum(): return StringToEnum("Surfaceforcings")[0]
    308309def SMBEnum(): return StringToEnum("SMB")[0]
  • issm/trunk-jpl/src/m/plot/googlemaps.m

    r15210 r18551  
    5454elseif strcmpi(md.mesh.hemisphere,'s'),
    5555        EPSGlocal = 'EPSG:3031'; % UPS Antarctica http://www.spatialreference.org/ref/epsg/3031/
     56elseif strcmpi(md.mesh.hemisphere,'UTM18N'),
     57        EPSGlocal = 'EPSG:32218'; % UTM 18 N Patagonia
    5658else
    5759        error('field hemisphere should either be ''n'' or ''s''');
  • issm/trunk-jpl/src/m/plot/plot_googlemaps.m

    r15172 r18551  
    3636                        -1,0,71);
    3737        else
     38                latlist = md.mesh.lat; %That might work?
     39                lonlist = md.mesh.long;
    3840                error('field hemisphere should either be ''n'' or ''s''');
    3941        end
Note: See TracChangeset for help on using the changeset viewer.