%SMBpdd Class definition % % Usage: % SMBpdd=SMBpdd(); classdef SMBpdd properties (SetAccess=public) precipitation = NaN; monthlytemperatures = NaN; desfac = 0; s0p = 0; s0t = 0; rlaps = 0; rlapslgm = 0; dpermil = 0; Pfac = NaN; Tdiff = NaN; sealev = NaN; isdelta18o = 0; ismungsm = 0; isd18opd = 0; delta18o = NaN; delta18o_surface = NaN; temperatures_presentday = NaN; temperatures_lgm = NaN; precipitations_presentday = NaN; precipitations_lgm = NaN; end methods function self = SMBpdd(varargin) % {{{ switch nargin case 0 self=setdefaultparameters(self); otherwise error('constructor not supported'); end end % }}} function self = extrude(self,md) % {{{ if(self.isdelta18o==0 & self.ismungsm==0 & self.isd18opd==0),self.precipitation=project3d(md,'vector',self.precipitation,'type','node');end if(self.isdelta18o==0 & self.ismungsm==0 & self.isd18opd==0),self.monthlytemperatures=project3d(md,'vector',self.monthlytemperatures,'type','node');end if(self.isdelta18o),self.temperatures_lgm=project3d(md,'vector',self.temperatures_lgm,'type','node');end if(self.isdelta18o),self.temperatures_presentday=project3d(md,'vector',self.temperatures_presentday,'type','node');end if(self.isdelta18o),self.precipitations_presentday=project3d(md,'vector',self.precipitations_presentday,'type','node');end if(self.isdelta18o),self.precipitations_lgm=project3d(md,'vector',self.precipitations_lgm,'type','node');end if(self.ismungsm),self.temperatures_lgm=project3d(md,'vector',self.temperatures_lgm,'type','node');end if(self.ismungsm),self.temperatures_presentday=project3d(md,'vector',self.temperatures_presentday,'type','node');end if(self.ismungsm),self.precipitations_presentday=project3d(md,'vector',self.precipitations_presentday,'type','node');end if(self.ismungsm),self.precipitations_lgm=project3d(md,'vector',self.precipitations_lgm,'type','node');end if(self.isd18opd),self.temperatures_presentday=project3d(md,'vector',self.temperatures_presentday,'type','node');end if(self.isd18opd),self.precipitations_presentday=project3d(md,'vector',self.precipitations_presentday,'type','node');end end % }}} function self = initialize(self,md) % {{{ % if isnan(self.precipitation), % self.precipitation=zeros(md.mesh.numberofvertices,1); % disp(' no SMBpdd.precipitation specified: values set as zero'); % end end % }}} function self = setdefaultparameters(self) % {{{ self.isdelta18o = 0; self.ismungsm = 0; self.isd18opd = 0; self.desfac = 0.5; self.s0p = 0; self.s0t = 0; self.rlaps = 6.5; self.rlapslgm = 6.5; self.dpermil = 2.4; end % }}} function md = checkconsistency(self,md,solution,analyses) % {{{ if ismember(MasstransportAnalysisEnum(),analyses), md = checkfield(md,'fieldname','surfaceforcings.desfac','<=',1,'numel',1); md = checkfield(md,'fieldname','surfaceforcings.s0p','>=',0,'numel',1); md = checkfield(md,'fieldname','surfaceforcings.s0t','>=',0,'numel',1); md = checkfield(md,'fieldname','surfaceforcings.rlaps','>=',0,'numel',1); md = checkfield(md,'fieldname','surfaceforcings.rlapslgm','>=',0,'numel',1); if(self.isdelta18o==0 & self.ismungsm==0 & self.isd18opd==0) md = checkfield(md,'fieldname','surfaceforcings.monthlytemperatures','timeseries',1,'NaN',1); md = checkfield(md,'fieldname','surfaceforcings.precipitation','timeseries',1,'NaN',1); elseif(self.isdelta18o==1) md = checkfield(md,'fieldname','surfaceforcings.delta18o','NaN',1); md = checkfield(md,'fieldname','surfaceforcings.delta18o_surface','NaN',1); md = checkfield(md,'fieldname','surfaceforcings.temperatures_presentday','size',[md.mesh.numberofvertices+1 12],'NaN',1); md = checkfield(md,'fieldname','surfaceforcings.temperatures_lgm','size',[md.mesh.numberofvertices+1 12],'NaN',1); md = checkfield(md,'fieldname','surfaceforcings.precipitations_presentday','size',[md.mesh.numberofvertices+1 12],'NaN',1); md = checkfield(md,'fieldname','surfaceforcings.precipitations_lgm','size',[md.mesh.numberofvertices+1 12],'NaN',1); md = checkfield(md,'fieldname','surfaceforcings.Tdiff','NaN',1); md = checkfield(md,'fieldname','surfaceforcings.sealev','NaN',1); elseif(self.ismungsm==1) md = checkfield(md,'fieldname','surfaceforcings.temperatures_presentday','size',[md.mesh.numberofvertices+1 12],'NaN',1); md = checkfield(md,'fieldname','surfaceforcings.temperatures_lgm','size',[md.mesh.numberofvertices+1 12],'NaN',1); md = checkfield(md,'fieldname','surfaceforcings.precipitations_presentday','size',[md.mesh.numberofvertices+1 12],'NaN',1); md = checkfield(md,'fieldname','surfaceforcings.precipitations_lgm','size',[md.mesh.numberofvertices+1 12],'NaN',1); md = checkfield(md,'fieldname','surfaceforcings.Pfac','NaN',1,'size',[2,NaN]); md = checkfield(md,'fieldname','surfaceforcings.Tdiff','NaN',1); md = checkfield(md,'fieldname','surfaceforcings.sealev','NaN',1); elseif(self.isd18opd==1) md = checkfield(md,'fieldname','surfaceforcings.temperatures_presentday','size',[md.mesh.numberofvertices+1 12],'NaN',1); md = checkfield(md,'fieldname','surfaceforcings.precipitations_presentday','size',[md.mesh.numberofvertices+1 12],'NaN',1); md = checkfield(md,'fieldname','surfaceforcings.delta18o','NaN',1); md = checkfield(md,'fieldname','surfaceforcings.dpermil','>=',0,'numel',1); end end end % }}} function disp(self) % {{{ disp(sprintf(' surface forcings parameters:')); disp(sprintf('\n PDD and deltaO18 parameters:')); fielddisplay(self,'isdelta18o','is temperature and precipitation delta18o parametrisation activated (0 or 1, default is 0)'); fielddisplay(self,'ismungsm','is temperature and precipitation mungsm parametrisation activated (0 or 1, default is 0)'); fielddisplay(self,'isd18opd','is delta18o parametrisation from present day temperature and precipitation activated (0 or 1, default is 0)'); fielddisplay(self,'desfac','desertification elevation factor (between 0 and 1, default is 0.5) [m]'); fielddisplay(self,'s0p','should be set to elevation from precip source (between 0 and a few 1000s m, default is 0) [m]'); fielddisplay(self,'s0t','should be set to elevation from temperature source (between 0 and a few 1000s m, default is 0) [m]'); fielddisplay(self,'rlaps','present day lapse rate [degree/km]'); fielddisplay(self,'rlapslgm','LGM lapse rate [degree/km]'); if(self.isdelta18o==0 & self.ismungsm==0 & self.isd18opd==0) fielddisplay(self,'monthlytemperatures',['monthly surface temperatures [K], required if pdd is activated and delta18o not activated']); fielddisplay(self,'precipitation',['monthly surface precipitation [m/yr water eq], required if pdd is activated and delta18o or mungsm not activated']); elseif(self.isdelta18o==1) fielddisplay(self,'delta18o','delta18o, required if pdd is activated and delta18o activated'); fielddisplay(self,'delta18o_surface','surface elevation of the delta18o site, required if pdd is activated and delta18o activated'); fielddisplay(self,'temperatures_presentday','monthly present day surface temperatures [K], required if delta18o/mungsm is activated'); fielddisplay(self,'temperatures_lgm','monthly LGM surface temperatures [K], required if delta18o or mungsm is activated'); fielddisplay(self,'precipitations_presentday','monthly surface precipitation [m/yr water eq], required if delta18o/mungsm/d18opd is activated'); fielddisplay(self,'precipitations_lgm','monthly surface precipitation [m/yr water eq], required if delta18o/mungsm is activated'); fielddisplay(self,'Tdiff','time interpolation parameter for temperature, 1D(year), required if mungsm is activated'); fielddisplay(self,'sealev','sea level [m], 1D(year), required if mungsm is activated'); elseif(self.ismungsm==1) fielddisplay(self,'temperatures_presentday','monthly present day surface temperatures [K], required if delta18o/mungsm/d18opd is activated'); fielddisplay(self,'temperatures_lgm','monthly LGM surface temperatures [K], required if delta18o or mungsm is activated'); fielddisplay(self,'precipitations_presentday','monthly surface precipitation [m/yr water eq], required if delta18o/mungsm/d18opd is activated'); fielddisplay(self,'precipitations_lgm','monthly surface precipitation [m/yr water eq], required if delta18o/mungsm is activated'); fielddisplay(self,'Pfac','time interpolation parameter for precipitation, 1D(year), required if mungsm is activated'); fielddisplay(self,'Tdiff','time interpolation parameter for temperature, 1D(year), required if mungsm is activated'); fielddisplay(self,'sealev','sea level [m], 1D(year), required if mungsm is activated'); elseif(self.isd18opd==1) fielddisplay(self,'temperatures_presentday','monthly present day surface temperatures [K], required if delta18o/mungsm/d18opd is activated'); fielddisplay(self,'precipitations_presentday','monthly surface precipitation [m/yr water eq], required if delta18o/mungsm/d18opd is activated'); fielddisplay(self,'delta18o','delta18o, required if pdd is activated and d18opd activated'); fielddisplay(self,'dpermil','degree per mil, required if d18opd is activated'); end end % }}} function marshall(self,md,fid) % {{{ yts=365.0*24.0*3600.0; WriteData(fid,'enum',SurfaceforcingsEnum(),'data',SMBpddEnum(),'format','Integer'); WriteData(fid,'object',self,'class','surfaceforcings','fieldname','isdelta18o','format','Boolean'); WriteData(fid,'object',self,'class','surfaceforcings','fieldname','ismungsm','format','Boolean'); WriteData(fid,'object',self,'class','surfaceforcings','fieldname','isd18opd','format','Boolean'); WriteData(fid,'object',self,'class','surfaceforcings','fieldname','desfac','format','Double'); WriteData(fid,'object',self,'class','surfaceforcings','fieldname','s0p','format','Double'); WriteData(fid,'object',self,'class','surfaceforcings','fieldname','s0t','format','Double'); WriteData(fid,'object',self,'class','surfaceforcings','fieldname','rlaps','format','Double'); WriteData(fid,'object',self,'class','surfaceforcings','fieldname','rlapslgm','format','Double'); if(self.isdelta18o==0 & self.ismungsm==0 & self.isd18opd==0) %WriteData(fid,'object',self,'class','surfaceforcings','fieldname','monthlytemperatures','format','DoubleMat','mattype',1); WriteData(fid,'object',self,'class','surfaceforcings','fieldname','monthlytemperatures','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1); WriteData(fid,'object',self,'class','surfaceforcings','fieldname','precipitation','format','DoubleMat','mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1); elseif self.isdelta18o WriteData(fid,'object',self,'class','surfaceforcings','fieldname','temperatures_presentday','format','DoubleMat','mattype',1); WriteData(fid,'object',self,'class','surfaceforcings','fieldname','temperatures_lgm','format','DoubleMat','mattype',1); WriteData(fid,'object',self,'class','surfaceforcings','fieldname','precipitations_presentday','format','DoubleMat','mattype',1); WriteData(fid,'object',self,'class','surfaceforcings','fieldname','precipitations_lgm','format','DoubleMat','mattype',1); WriteData(fid,'object',self,'class','surfaceforcings','fieldname','delta18o_surface','format','DoubleMat','mattype',1); WriteData(fid,'object',self,'class','surfaceforcings','fieldname','delta18o','format','DoubleMat','mattype',1); WriteData(fid,'object',self,'class','surfaceforcings','fieldname','Tdiff','format','DoubleMat','mattype',1); WriteData(fid,'object',self,'class','surfaceforcings','fieldname','sealev','format','DoubleMat','mattype',1); elseif self.ismungsm WriteData(fid,'object',self,'class','surfaceforcings','fieldname','temperatures_presentday','format','DoubleMat','mattype',1); WriteData(fid,'object',self,'class','surfaceforcings','fieldname','temperatures_lgm','format','DoubleMat','mattype',1); WriteData(fid,'object',self,'class','surfaceforcings','fieldname','precipitations_presentday','format','DoubleMat','mattype',1); WriteData(fid,'object',self,'class','surfaceforcings','fieldname','precipitations_lgm','format','DoubleMat','mattype',1); WriteData(fid,'object',self,'class','surfaceforcings','fieldname','Pfac','format','DoubleMat','mattype',1); WriteData(fid,'object',self,'class','surfaceforcings','fieldname','Tdiff','format','DoubleMat','mattype',1); WriteData(fid,'object',self,'class','surfaceforcings','fieldname','sealev','format','DoubleMat','mattype',1); elseif self.isd18opd WriteData(fid,'object',self,'class','surfaceforcings','fieldname','temperatures_presentday','format','DoubleMat','mattype',1); WriteData(fid,'object',self,'class','surfaceforcings','fieldname','precipitations_presentday','format','DoubleMat','mattype',1); WriteData(fid,'object',self,'class','surfaceforcings','fieldname','delta18o','format','DoubleMat','mattype',1); WriteData(fid,'object',self,'class','surfaceforcings','fieldname','dpermil','format','Double'); end end % }}} end end