Changeset 17087


Ignore:
Timestamp:
01/09/14 15:06:03 (11 years ago)
Author:
Mathieu Morlighem
Message:

NEW: added SMBhenning fonction, to be completed by Henning (dummy for now)

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

Legend:

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

    r17085 r17087  
    110110                        break;
    111111                case SMBhenningEnum:
    112                         iomodel->FetchDataToInput(elements,SurfaceforcingsMassBalanceEnum,0.);
     112                        iomodel->FetchDataToInput(elements,SurfaceforcingsSmbrefEnum,0.);
    113113                        break;
    114114                default:
  • issm/trunk-jpl/src/c/modules/SurfaceMassBalancex/SurfaceMassBalancex.cpp

    r17085 r17087  
    3737                        if(VerboseSolution())_printf_("  call smb Henning module\n");
    3838                        SmbHenningx(femmodel);
     39                        break;
    3940                default:
    4041                        _error_("Surface mass balance model "<<EnumToStringx(smb_model)<<" not supported yet");
     
    160161void SmbHenningx(FemModel* femmodel){/*{{{*/
    161162
    162         // void SurfaceMassBalancex(hd,agd,ni){
    163         //    INPUT parameters: ni: working size of arrays
    164         //    INPUT: surface elevation (m): hd(NA)
    165         //    OUTPUT: mass-balance (m/yr ice): agd(NA)
    166 
     163        /*Intermediaries*/
     164        IssmDouble  z_critical = 200.;
     165        IssmDouble  a = 2.;
     166        IssmDouble  b = 3.;
     167        IssmDouble  smb,smbref,z;
     168
     169        /*Loop over all the elements of this partition*/
    167170        for(int i=0;i<femmodel->elements->Size();i++){
    168171                Element* element=dynamic_cast<Element*>(femmodel->elements->GetObjectByOffset(i));
    169         }
    170 
    171 }/*}}}*/
     172
     173                /*Get reference SMB (uncorrected) and allocate all arrays*/
     174                int         numvertices = element->GetNumberOfVertices();
     175                IssmDouble* surfacelist = xNew<IssmDouble>(numvertices);
     176                IssmDouble* smblistref  = xNew<IssmDouble>(numvertices);
     177                IssmDouble* smblist     = xNew<IssmDouble>(numvertices);
     178                element->GetInputListOnVertices(surfacelist,SurfaceEnum);
     179                element->GetInputListOnVertices(smblistref,SurfaceforcingsSmbrefEnum);
     180
     181                /*Loop over all vertices of element and correct SMB as a function of altitude z*/
     182                for(int v=0;v<numvertices;v++){
     183
     184                        /*Get vertex elevation, reference smb*/
     185                        z      = surfacelist[v];
     186                        smbref = smblistref[v];
     187
     188                        /*Compute corrected smb*/
     189                        if(z<z_critical){
     190                                smb = smbref;
     191                        }
     192                        else{
     193                                smb = a*smbref*smbref+b+z;
     194                        }
     195
     196                        /*Update array accordingly*/
     197                        smblist[v] = smb;
     198
     199                }
     200
     201                /*Add input to element and Free memory*/
     202                element->AddInput(SurfaceforcingsMassBalanceEnum,smblist,P1Enum);
     203                xDelete<IssmDouble>(surfacelist);
     204                xDelete<IssmDouble>(smblistref);
     205                xDelete<IssmDouble>(smblist);
     206        }
     207
     208}/*}}}*/
  • issm/trunk-jpl/src/m/classes/SMBhenning.m

    r17086 r17087  
    66classdef SMBhenning
    77        properties (SetAccess=public)
    8                 mass_balance = NaN;
     8                smbref = NaN;
    99        end
    1010        methods
     
    1818                function self = extrude(self,md) % {{{
    1919
    20                         self.mass_balance=project3d(md,'vector',self.mass_balance,'type','node');
     20                        self.smbref=project3d(md,'vector',self.smbref,'type','node');
    2121
    2222                end % }}}
    2323                function self = initialize(self,md) % {{{
    2424
    25                         if isnan(self.mass_balance)
    26                                 self.mass_balance=zeros(md.mesh.numberofvertices,1);
    27                                 disp('      no surfaceforcings.mass_balance specified: values set as zero');
     25                        if isnan(self.smbref)
     26                                self.smbref=zeros(md.mesh.numberofvertices,1);
     27                                disp('      no surfaceforcings.smbref specified: values set as zero');
    2828                        end
    2929
     
    3232
    3333                        if ismember(MasstransportAnalysisEnum(),analyses),
    34                                 md = checkfield(md,'fieldname','surfaceforcings.mass_balance','forcing',1,'NaN',1);
     34                                md = checkfield(md,'fieldname','surfaceforcings.smbref','forcing',1,'NaN',1);
    3535                        end
    3636                        if ismember(BalancethicknessAnalysisEnum(),analyses),
    37                                 md = checkfield(md,'fieldname','surfaceforcings.mass_balance','size',[md.mesh.numberofvertices 1],'NaN',1);
     37                                md = checkfield(md,'fieldname','surfaceforcings.smbref','size',[md.mesh.numberofvertices 1],'NaN',1);
    3838                        end
    3939                end % }}}
    4040                function disp(obj) % {{{
    4141                        disp(sprintf('   surface forcings parameters:'));
    42                         fielddisplay(obj,'mass_balance','surface mass balance [m/yr ice eq]');
     42                        fielddisplay(obj,'smbref','reference smb from which deviation is calculated [m/yr ice eq]');
    4343                end % }}}
    4444                function marshall(obj,md,fid) % {{{
     
    4747
    4848                        WriteData(fid,'enum',SurfaceforcingsEnum(),'data',SMBhenningEnum(),'format','Integer');
    49                         WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','mass_balance','format','DoubleMat','mattype',1,'scale',1./yts,'forcinglength',md.mesh.numberofvertices+1);
     49                        WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','smbref','format','DoubleMat','mattype',1,'scale',1./yts,'forcinglength',md.mesh.numberofvertices+1);
    5050                end % }}}
    5151        end
Note: See TracChangeset for help on using the changeset viewer.