Index: ../trunk-jpl/src/c/analyses/MasstransportAnalysis.cpp =================================================================== --- ../trunk-jpl/src/c/analyses/MasstransportAnalysis.cpp (revision 17077) +++ ../trunk-jpl/src/c/analyses/MasstransportAnalysis.cpp (revision 17078) @@ -89,6 +89,25 @@ case SMBEnum: iomodel->FetchDataToInput(elements,SurfaceforcingsMassBalanceEnum,0.); break; + case SMBpddEnum: + iomodel->Constant(&isdelta18o,SurfaceforcingsIsdelta18oEnum); + iomodel->FetchDataToInput(elements,ThermalSpctemperatureEnum); + if(isdelta18o){ + iomodel->FetchDataToInput(elements,SurfaceforcingsTemperaturesLgmEnum); + iomodel->FetchDataToInput(elements,SurfaceforcingsTemperaturesPresentdayEnum); + iomodel->FetchDataToInput(elements,SurfaceforcingsPrecipitationsPresentdayEnum); + } + else{ + iomodel->FetchDataToInput(elements,SurfaceforcingsPrecipitationEnum); + iomodel->FetchDataToInput(elements,SurfaceforcingsMonthlytemperaturesEnum); + } + break; + case SMBgradientsEnum: + iomodel->FetchDataToInput(elements,SurfaceforcingsHrefEnum); + iomodel->FetchDataToInput(elements,SurfaceforcingsSmbrefEnum); + iomodel->FetchDataToInput(elements,SurfaceforcingsBPosEnum); + iomodel->FetchDataToInput(elements,SurfaceforcingsBNegEnum); + break; case SurfaceforcingsEnum: /*To Be REMOVED*/ iomodel->Constant(&ispdd,SurfaceforcingsIspddEnum); iomodel->Constant(&isdelta18o,SurfaceforcingsIsdelta18oEnum); Index: ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h =================================================================== --- ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h (revision 17077) +++ ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h (revision 17078) @@ -280,7 +280,7 @@ SurfaceforcingsEnum, SMBEnum, SurfaceforcingsMassBalanceEnum, - + SMBpddEnum, SurfaceforcingsDelta18oEnum, SurfaceforcingsDelta18oSurfaceEnum, SurfaceforcingsIsdelta18oEnum, @@ -288,15 +288,18 @@ SurfaceforcingsTemperaturesPresentdayEnum, SurfaceforcingsTemperaturesLgmEnum, SurfaceforcingsPrecipitationEnum, - SurfaceforcingsIspddEnum, SurfaceforcingsDesfacEnum, SurfaceforcingsS0pEnum, - SurfaceforcingsIssmbgradientsEnum, + SMBgradientsEnum, SurfaceforcingsMonthlytemperaturesEnum, SurfaceforcingsHrefEnum, SurfaceforcingsSmbrefEnum, SurfaceforcingsBPosEnum, SurfaceforcingsBNegEnum, + SMBlapserate, + /*TO BE REMOVED*/ + SurfaceforcingsIspddEnum, + SurfaceforcingsIssmbgradientsEnum, /*}}}*/ /*Solutions and Analyses{{{ */ SolutionTypeEnum, Index: ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp =================================================================== --- ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp (revision 17077) +++ ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp (revision 17078) @@ -284,6 +284,7 @@ case SurfaceforcingsEnum : return "Surfaceforcings"; case SMBEnum : return "SMB"; case SurfaceforcingsMassBalanceEnum : return "SurfaceforcingsMassBalance"; + case SMBpddEnum : return "SMBpdd"; case SurfaceforcingsDelta18oEnum : return "SurfaceforcingsDelta18o"; case SurfaceforcingsDelta18oSurfaceEnum : return "SurfaceforcingsDelta18oSurface"; case SurfaceforcingsIsdelta18oEnum : return "SurfaceforcingsIsdelta18o"; @@ -291,15 +292,16 @@ case SurfaceforcingsTemperaturesPresentdayEnum : return "SurfaceforcingsTemperaturesPresentday"; case SurfaceforcingsTemperaturesLgmEnum : return "SurfaceforcingsTemperaturesLgm"; case SurfaceforcingsPrecipitationEnum : return "SurfaceforcingsPrecipitation"; - case SurfaceforcingsIspddEnum : return "SurfaceforcingsIspdd"; case SurfaceforcingsDesfacEnum : return "SurfaceforcingsDesfac"; case SurfaceforcingsS0pEnum : return "SurfaceforcingsS0p"; - case SurfaceforcingsIssmbgradientsEnum : return "SurfaceforcingsIssmbgradients"; + case SMBgradientsEnum : return "SMBgradients"; case SurfaceforcingsMonthlytemperaturesEnum : return "SurfaceforcingsMonthlytemperatures"; case SurfaceforcingsHrefEnum : return "SurfaceforcingsHref"; case SurfaceforcingsSmbrefEnum : return "SurfaceforcingsSmbref"; case SurfaceforcingsBPosEnum : return "SurfaceforcingsBPos"; case SurfaceforcingsBNegEnum : return "SurfaceforcingsBNeg"; + case SurfaceforcingsIspddEnum : return "SurfaceforcingsIspdd"; + case SurfaceforcingsIssmbgradientsEnum : return "SurfaceforcingsIssmbgradients"; case SolutionTypeEnum : return "SolutionType"; case AnalysisTypeEnum : return "AnalysisType"; case ConfigurationTypeEnum : return "ConfigurationType"; Index: ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp =================================================================== --- ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp (revision 17077) +++ ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp (revision 17078) @@ -290,6 +290,7 @@ else if (strcmp(name,"Surfaceforcings")==0) return SurfaceforcingsEnum; else if (strcmp(name,"SMB")==0) return SMBEnum; else if (strcmp(name,"SurfaceforcingsMassBalance")==0) return SurfaceforcingsMassBalanceEnum; + else if (strcmp(name,"SMBpdd")==0) return SMBpddEnum; else if (strcmp(name,"SurfaceforcingsDelta18o")==0) return SurfaceforcingsDelta18oEnum; else if (strcmp(name,"SurfaceforcingsDelta18oSurface")==0) return SurfaceforcingsDelta18oSurfaceEnum; else if (strcmp(name,"SurfaceforcingsIsdelta18o")==0) return SurfaceforcingsIsdelta18oEnum; @@ -297,15 +298,16 @@ else if (strcmp(name,"SurfaceforcingsTemperaturesPresentday")==0) return SurfaceforcingsTemperaturesPresentdayEnum; else if (strcmp(name,"SurfaceforcingsTemperaturesLgm")==0) return SurfaceforcingsTemperaturesLgmEnum; else if (strcmp(name,"SurfaceforcingsPrecipitation")==0) return SurfaceforcingsPrecipitationEnum; - else if (strcmp(name,"SurfaceforcingsIspdd")==0) return SurfaceforcingsIspddEnum; else if (strcmp(name,"SurfaceforcingsDesfac")==0) return SurfaceforcingsDesfacEnum; else if (strcmp(name,"SurfaceforcingsS0p")==0) return SurfaceforcingsS0pEnum; - else if (strcmp(name,"SurfaceforcingsIssmbgradients")==0) return SurfaceforcingsIssmbgradientsEnum; + else if (strcmp(name,"SMBgradients")==0) return SMBgradientsEnum; else if (strcmp(name,"SurfaceforcingsMonthlytemperatures")==0) return SurfaceforcingsMonthlytemperaturesEnum; else if (strcmp(name,"SurfaceforcingsHref")==0) return SurfaceforcingsHrefEnum; else if (strcmp(name,"SurfaceforcingsSmbref")==0) return SurfaceforcingsSmbrefEnum; else if (strcmp(name,"SurfaceforcingsBPos")==0) return SurfaceforcingsBPosEnum; else if (strcmp(name,"SurfaceforcingsBNeg")==0) return SurfaceforcingsBNegEnum; + else if (strcmp(name,"SurfaceforcingsIspdd")==0) return SurfaceforcingsIspddEnum; + else if (strcmp(name,"SurfaceforcingsIssmbgradients")==0) return SurfaceforcingsIssmbgradientsEnum; else if (strcmp(name,"SolutionType")==0) return SolutionTypeEnum; else if (strcmp(name,"AnalysisType")==0) return AnalysisTypeEnum; else if (strcmp(name,"ConfigurationType")==0) return ConfigurationTypeEnum; @@ -380,14 +382,14 @@ else if (strcmp(name,"AdolcParam")==0) return AdolcParamEnum; else if (strcmp(name,"BoolInput")==0) return BoolInputEnum; else if (strcmp(name,"BoolParam")==0) return BoolParamEnum; - else if (strcmp(name,"Contour")==0) return ContourEnum; + else stage=4; + } + if(stage==4){ + if (strcmp(name,"Contour")==0) return ContourEnum; else if (strcmp(name,"ControlInput")==0) return ControlInputEnum; else if (strcmp(name,"DatasetInput")==0) return DatasetInputEnum; else if (strcmp(name,"DoubleInput")==0) return DoubleInputEnum; - else stage=4; - } - if(stage==4){ - if (strcmp(name,"DataSetParam")==0) return DataSetParamEnum; + else if (strcmp(name,"DataSetParam")==0) return DataSetParamEnum; else if (strcmp(name,"DoubleMatArrayParam")==0) return DoubleMatArrayParamEnum; else if (strcmp(name,"DoubleMatParam")==0) return DoubleMatParamEnum; else if (strcmp(name,"DoubleParam")==0) return DoubleParamEnum; @@ -503,14 +505,14 @@ else if (strcmp(name,"EnthalpyPicard")==0) return EnthalpyPicardEnum; else if (strcmp(name,"ThicknessAbsGradient")==0) return ThicknessAbsGradientEnum; else if (strcmp(name,"ThicknessAlongGradient")==0) return ThicknessAlongGradientEnum; - else if (strcmp(name,"ThicknessAcrossGradient")==0) return ThicknessAcrossGradientEnum; + else stage=5; + } + if(stage==5){ + if (strcmp(name,"ThicknessAcrossGradient")==0) return ThicknessAcrossGradientEnum; else if (strcmp(name,"IntMatParam")==0) return IntMatParamEnum; else if (strcmp(name,"RheologyBbarAbsGradient")==0) return RheologyBbarAbsGradientEnum; else if (strcmp(name,"DragCoefficientAbsGradient")==0) return DragCoefficientAbsGradientEnum; - else stage=5; - } - if(stage==5){ - if (strcmp(name,"TransientInput")==0) return TransientInputEnum; + else if (strcmp(name,"TransientInput")==0) return TransientInputEnum; else if (strcmp(name,"Waterfraction")==0) return WaterfractionEnum; else if (strcmp(name,"Watercolumn")==0) return WatercolumnEnum; else if (strcmp(name,"BasalFriction")==0) return BasalFrictionEnum; @@ -626,14 +628,14 @@ else if (strcmp(name,"TriangleInterp")==0) return TriangleInterpEnum; else if (strcmp(name,"BilinearInterp")==0) return BilinearInterpEnum; else if (strcmp(name,"NearestInterp")==0) return NearestInterpEnum; - else if (strcmp(name,"XY")==0) return XYEnum; + else stage=6; + } + if(stage==6){ + if (strcmp(name,"XY")==0) return XYEnum; else if (strcmp(name,"XYZ")==0) return XYZEnum; else if (strcmp(name,"Dense")==0) return DenseEnum; else if (strcmp(name,"MpiDense")==0) return MpiDenseEnum; - else stage=6; - } - if(stage==6){ - if (strcmp(name,"MpiSparse")==0) return MpiSparseEnum; + else if (strcmp(name,"MpiSparse")==0) return MpiSparseEnum; else if (strcmp(name,"Seq")==0) return SeqEnum; else if (strcmp(name,"Mpi")==0) return MpiEnum; else if (strcmp(name,"Mumps")==0) return MumpsEnum; Index: ../trunk-jpl/src/c/modules/ModelProcessorx/CreateParameters.cpp =================================================================== --- ../trunk-jpl/src/c/modules/ModelProcessorx/CreateParameters.cpp (revision 17077) +++ ../trunk-jpl/src/c/modules/ModelProcessorx/CreateParameters.cpp (revision 17078) @@ -90,6 +90,30 @@ case SMBEnum: /*Nothing to add to parameters*/ break; + case SMBpddEnum: + parameters->AddObject(iomodel->CopyConstantObject(SurfaceforcingsIsdelta18oEnum)); + parameters->AddObject(iomodel->CopyConstantObject(SurfaceforcingsDesfacEnum)); + parameters->AddObject(iomodel->CopyConstantObject(SurfaceforcingsS0pEnum)); + iomodel->Constant(&isdelta18o,SurfaceforcingsIsdelta18oEnum); + if(isdelta18o){ + IssmDouble *temp = NULL; + IssmDouble yts; + int N,M; + iomodel->Constant(&yts,ConstantsYtsEnum); + iomodel->FetchData(&temp,&N,&M,SurfaceforcingsDelta18oEnum); _assert_(N==2); + for(i=0;iAddObject(new TransientParam(SurfaceforcingsDelta18oEnum,&temp[0],&temp[M],M)); + iomodel->DeleteData(temp,SurfaceforcingsDelta18oEnum); + + iomodel->FetchData(&temp,&N,&M,SurfaceforcingsDelta18oSurfaceEnum); _assert_(N==2); + for(i=0;iAddObject(new TransientParam(SurfaceforcingsDelta18oSurfaceEnum,&temp[0],&temp[M],M)); + iomodel->DeleteData(temp,SurfaceforcingsDelta18oSurfaceEnum); + } + break; + case SMBgradientsEnum: + /*Nothing to add to parameters*/ + break; case SurfaceforcingsEnum: /*To Be REMOVED*/ parameters->AddObject(iomodel->CopyConstantObject(SurfaceforcingsIspddEnum)); parameters->AddObject(iomodel->CopyConstantObject(SurfaceforcingsIsdelta18oEnum)); Index: ../trunk-jpl/src/c/cores/transient_core.cpp =================================================================== --- ../trunk-jpl/src/c/cores/transient_core.cpp (revision 17077) +++ ../trunk-jpl/src/c/cores/transient_core.cpp (revision 17078) @@ -21,11 +21,11 @@ /*parameters: */ int i; IssmDouble starttime,finaltime,dt,yts; - bool isstressbalance,ismasstransport,isFS,isthermal,isgroundingline,isdelta18o,isgia,islevelset; + bool isstressbalance,ismasstransport,isFS,isthermal,isgroundingline,isgia,islevelset; bool save_results,dakota_analysis; bool time_adapt=false; int output_frequency; - int meshtype,groundingline_migration; + int meshtype,groundingline_migration,smb_model; int numoutputs = 0; Analysis *analysis = NULL; char** requested_outputs = NULL; @@ -53,7 +53,6 @@ if(isgroundingline) femmodel->parameters->FindParam(&groundingline_migration,GroundinglineMigrationEnum); femmodel->parameters->FindParam(&numoutputs,TransientNumRequestedOutputsEnum); if(numoutputs) femmodel->parameters->FindParam(&requested_outputs,&numoutputs,TransientRequestedOutputsEnum); - femmodel->parameters->FindParam(&isdelta18o,SurfaceforcingsIsdelta18oEnum); /*initialize: */ step=0; @@ -169,10 +168,6 @@ /*unload results*/ if(VerboseSolution()) _printf0_(" computing requested outputs\n"); femmodel->RequestedOutputsx(&femmodel->results,requested_outputs,numoutputs,save_results); - if(isdelta18o){ - int outputs[2] = {SurfaceforcingsMonthlytemperaturesEnum,SurfaceforcingsPrecipitationEnum}; - femmodel->RequestedOutputsx(&femmodel->results,&outputs[0],2,save_results); - } if(isgroundingline && (groundingline_migration==SubelementMigrationEnum || groundingline_migration==SubelementMigration2Enum)){ int outputs[1] = {MaskGroundediceLevelsetEnum}; femmodel->RequestedOutputsx(&femmodel->results,&outputs[0],1,save_results); Index: ../trunk-jpl/src/c/cores/masstransport_core.cpp =================================================================== --- ../trunk-jpl/src/c/cores/masstransport_core.cpp (revision 17077) +++ ../trunk-jpl/src/c/cores/masstransport_core.cpp (revision 17078) @@ -44,6 +44,19 @@ case SMBEnum: /*Nothing to be done*/ break; + case SMBpddEnum: + femmodel->parameters->FindParam(&isdelta18o,SurfaceforcingsIsdelta18oEnum); + if(isdelta18o){ + if(VerboseSolution()) _printf0_(" call Delta18oParametrization module\n"); + Delta18oParameterizationx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters); + } + if(VerboseSolution()) _printf0_(" call positive degree day module\n"); + PositiveDegreeDayx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters); + break; + case SMBgradientsEnum: + if(VerboseSolution())_printf_(" call smb gradients module\n\n"); + SmbGradientsx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters); + break; case SurfaceforcingsEnum: /*To Be REMOVED*/ femmodel->parameters->FindParam(&issmbgradients,SurfaceforcingsIssmbgradientsEnum); femmodel->parameters->FindParam(&ispdd,SurfaceforcingsIspddEnum); Index: ../trunk-jpl/src/c/classes/Materials/Matpar.cpp =================================================================== --- ../trunk-jpl/src/c/classes/Materials/Matpar.cpp (revision 17077) +++ ../trunk-jpl/src/c/classes/Materials/Matpar.cpp (revision 17078) @@ -46,6 +46,13 @@ case SMBEnum: /*Nothing to add*/ break; + case SMBpddEnum: + iomodel->Constant(&this->desfac,SurfaceforcingsDesfacEnum); + iomodel->Constant(&this->s0p,SurfaceforcingsS0pEnum); + break; + case SMBgradientsEnum: + /*Nothing to add*/ + break; case SurfaceforcingsEnum: /*To Be REMOVED*/ iomodel->Constant(&ispdd,SurfaceforcingsIspddEnum); if(ispdd){ Index: ../trunk-jpl/src/m/classes/SMBpdd.py =================================================================== --- ../trunk-jpl/src/m/classes/SMBpdd.py (revision 0) +++ ../trunk-jpl/src/m/classes/SMBpdd.py (revision 17078) @@ -0,0 +1,97 @@ +from fielddisplay import fielddisplay +from EnumDefinitions import * +from checkfield import * +from WriteData import * + +class SMBpdd(object): + """ + SMBpdd Class definition + + Usage: + SMBpdd=SMBpdd(); + """ + + def __init__(self): # {{{ + self.precipitation = float('NaN') + self.monthlytemperatures = float('NaN') + self.desfac = 0. + self.s0p = 0. + self.isdelta18o = 0 + self.delta18o = float('NaN') + self.delta18o_surface = float('NaN') + self.temperatures_presentday = float('NaN') + self.temperatures_lgm = float('NaN') + self.precipitations_presentday = float('NaN') + + #set defaults + self.setdefaultparameters() + #}}} + def __repr__(self): # {{{ + string=" surface forcings parameters:" + + string="%s\n%s"%(string,fielddisplay(self,'precipitation','surface precipitation [m/yr water eq]')) + string="%s\n%s"%(string,fielddisplay(self,'desfac','desertification elevation factor (between 0 and 1, default is 0.5) [m]')) + string="%s\n%s"%(string,fielddisplay(self,'isdelta18o','is temperature and precipitation delta18o parametrisation activated (0 or 1, default is 0)')) + string="%s\n%s"%(string,fielddisplay(self,'s0p','should be set to elevation from precip source (between 0 and a few 1000s m, default is 0) [m]')) + string="%s\n%s"%(string,fielddisplay(self,'monthlytemperatures','monthly surface temperatures [K], required if pdd is activated and delta18o not activated')) + string="%s\n%s"%(string,fielddisplay(self,'temperatures_presentday','monthly present day surface temperatures [K], required if pdd is activated and delta18o activated')) + string="%s\n%s"%(string,fielddisplay(self,'temperatures_lgm','monthly LGM surface temperatures [K], required if pdd is activated and delta18o activated')) + string="%s\n%s"%(string,fielddisplay(self,'precipitations_presentday','monthly surface precipitation [m/yr water eq], required if pdd is activated and delta18o activated')) + string="%s\n%s"%(string,fielddisplay(self,'delta18o','delta18o, required if pdd is activated and delta18o activated')) + string="%s\n%s"%(string,fielddisplay(self,'delta18o_surface','surface elevation of the delta18o site, required if pdd is activated and delta18o activated')) + + return string + #}}} + def initialize(self,md): # {{{ + + if numpy.all(numpy.isnan(self.precipitation)): + self.precipitation=numpy.zeros((md.mesh.numberofvertices,1)) + print " no SMBpdd.precipitation specified: values set as zero" + + return self + #}}} + def setdefaultparameters(self): # {{{ + + #pdd method not used in default mode + self.isdelta18o = 0 + self.desfac = 0.5 + self.s0p = 0. + + return self + #}}} + def checkconsistency(self,md,solution,analyses): # {{{ + + if MasstransportAnalysisEnum() in analyses: + md = checkfield(md,'fieldname','surfaceforcings.desfac','<=',1,'numel',[1]); + md = checkfield(md,'fieldname','surfaceforcings.s0p','>=',0,'numel',[1]); + if not self.isdelta18o: + md = checkfield(md,'fieldname','surfaceforcings.monthlytemperatures','forcing',1,'NaN',1) + md = checkfield(md,'fieldname','surfaceforcings.precipitation','forcing',1,'NaN',1) + else: + 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) + + return md + # }}} + def 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','precipitation','format','DoubleMat','mattype',1,'scale',1./yts,'forcinglength',md.mesh.numberofvertices+1) + WriteData(fid,'object',self,'class','surfaceforcings','fieldname','isdelta18o','format','Boolean') + WriteData(fid,'object',self,'class','surfaceforcings','fieldname','desfac','format','Double'); + WriteData(fid,'object',self,'class','surfaceforcings','fieldname','s0p','format','Double'); + if 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','delta18o_surface','format','DoubleMat','mattype',1) + WriteData(fid,'object',self,'class','surfaceforcings','fieldname','delta18o','format','DoubleMat','mattype',1) + else: + WriteData(fid,'object',self,'class','surfaceforcings','fieldname','monthlytemperatures','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1) + # }}} Index: ../trunk-jpl/src/m/classes/SMBpdd.m =================================================================== --- ../trunk-jpl/src/m/classes/SMBpdd.m (revision 0) +++ ../trunk-jpl/src/m/classes/SMBpdd.m (revision 17078) @@ -0,0 +1,96 @@ +%SMBpdd Class definition +% +% Usage: +% SMBpdd=SMBpdd(); + +classdef SMBpdd + properties (SetAccess=public) + precipitation = NaN; + monthlytemperatures = NaN; + desfac = 0.5; + s0p = 0; + isdelta18o = 0; + delta18o = NaN; + delta18o_surface = NaN; + temperatures_presentday = NaN; + temperatures_lgm = NaN; + precipitations_presentday = NaN; + end + methods + function obj = SMBpdd(varargin) % {{{ + switch nargin + case 0 + obj=setdefaultparameters(obj); + otherwise + error('constructor not supported'); + 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 obj = setdefaultparameters(obj) % {{{ + + obj.isdelta18o = 0; + obj.desfac = 0.5; + obj.s0p = 0; + end % }}} + function md = checkconsistency(obj,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); + if(obj.isdelta18o==0) + md = checkfield(md,'fieldname','surfaceforcings.monthlytemperatures','forcing',1,'NaN',1); + md = checkfield(md,'fieldname','surfaceforcings.precipitation','forcing',1,'NaN',1); + else + 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); + end + end + end % }}} + function disp(obj) % {{{ + disp(sprintf(' surface forcings parameters:')); + + disp(sprintf('\n PDD and deltaO18 parameters:')); + fielddisplay(obj,'isdelta18o','is temperature and precipitation delta18o parametrisation activated (0 or 1, default is 0)'); + fielddisplay(obj,'desfac','desertification elevation factor (between 0 and 1, default is 0.5) [m]'); + fielddisplay(obj,'s0p','should be set to elevation from precip source (between 0 and a few 1000s m, default is 0) [m]'); + fielddisplay(obj,'monthlytemperatures','monthly surface temperatures [K], required if pdd is activated and delta18o not activated'); + fielddisplay(obj,'precipitation','surface precipitation [m/yr water eq]'); + fielddisplay(obj,'temperatures_presentday','monthly present day surface temperatures [K], required if pdd is activated and delta18o activated'); + fielddisplay(obj,'temperatures_lgm','monthly LGM surface temperatures [K], required if pdd is activated and delta18o activated'); + fielddisplay(obj,'precipitations_presentday','monthly surface precipitation [m/yr water eq], required if pdd is activated and delta18o activated'); + fielddisplay(obj,'delta18o','delta18o, required if pdd is activated and delta18o activated'); + fielddisplay(obj,'delta18o_surface','surface elevation of the delta18o site, required if pdd is activated and delta18o activated'); + + end % }}} + function marshall(obj,md,fid) % {{{ + + yts=365.0*24.0*3600.0; + + WriteData(fid,'enum',SurfaceforcingsEnum(),'data',SMBpddEnum(),'format','Integer'); + + WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','precipitation','format','DoubleMat','mattype',1,'scale',1./yts,'forcinglength',md.mesh.numberofvertices+1); + WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','desfac','format','Double'); + WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','s0p','format','Double'); + WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','isdelta18o','format','Boolean'); + if obj.isdelta18o + WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','temperatures_presentday','format','DoubleMat','mattype',1); + WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','temperatures_lgm','format','DoubleMat','mattype',1); + WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','precipitations_presentday','format','DoubleMat','mattype',1); + WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','delta18o_surface','format','DoubleMat','mattype',1); + WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','delta18o','format','DoubleMat','mattype',1); + else + WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','monthlytemperatures','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1); + end + end % }}} + end +end Index: ../trunk-jpl/src/m/classes/SMBgradients.m =================================================================== --- ../trunk-jpl/src/m/classes/SMBgradients.m (revision 0) +++ ../trunk-jpl/src/m/classes/SMBgradients.m (revision 17078) @@ -0,0 +1,63 @@ +%SMBgradients Class definition +% +% Usage: +% SMBgradients=SMBgradients(); + +classdef SMBgradients + properties (SetAccess=public) + href = NaN; + smbref = NaN; + b_pos = NaN; + b_neg = NaN; + end + methods + function obj = SMBgradients(varargin) % {{{ + switch nargin + case 0 + obj=setdefaultparameters(obj); + otherwise + error('constructor not supported'); + end + end % }}} + function self = initialize(self,md) % {{{ + + %Nothing done for now + + end % }}} + function obj = setdefaultparameters(obj) % {{{ + + %Nothing for now + + end % }}} + function md = checkconsistency(obj,md,solution,analyses) % {{{ + + if ismember(MasstransportAnalysisEnum(),analyses), + md = checkfield(md,'fieldname','surfaceforcings.href','forcing',1,'NaN',1); + md = checkfield(md,'fieldname','surfaceforcings.smbref','forcing',1,'NaN',1); + md = checkfield(md,'fieldname','surfaceforcings.b_pos','forcing',1,'NaN',1); + md = checkfield(md,'fieldname','surfaceforcings.b_neg','forcing',1,'NaN',1); + end + end % }}} + function disp(obj) % {{{ + disp(sprintf(' surface forcings parameters:')); + + disp(sprintf('\n SMB gradients parameters:')); + fielddisplay(obj,'href',' reference elevation from which deviation is used to calculate SMB adjustment in smb gradients method'); + fielddisplay(obj,'smbref',' reference smb from which deviation is calculated in smb gradients method'); + fielddisplay(obj,'b_pos',' slope of hs - smb regression line for accumulation regime required if smb gradients is activated'); + fielddisplay(obj,'b_neg',' slope of hs - smb regression line for ablation regime required if smb gradients is activated'); + + end % }}} + function marshall(obj,md,fid) % {{{ + + yts=365.0*24.0*3600.0; + + WriteData(fid,'enum',SurfaceforcingsEnum(),'data',SMBgradientsEnum(),'format','Integer'); + WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','href','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1); + WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','smbref','format','DoubleMat','mattype',1,'scale',1./yts,'forcinglength',md.mesh.numberofvertices+1); + WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','b_pos','format','DoubleMat','mattype',1,'scale',1./yts,'forcinglength',md.mesh.numberofvertices+1); + WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','b_neg','format','DoubleMat','mattype',1,'scale',1./yts,'forcinglength',md.mesh.numberofvertices+1); + + end % }}} + end +end Index: ../trunk-jpl/src/m/classes/model.py =================================================================== --- ../trunk-jpl/src/m/classes/model.py (revision 17077) +++ ../trunk-jpl/src/m/classes/model.py (revision 17078) @@ -8,6 +8,8 @@ from constants import constants from surfaceforcings import surfaceforcings from SMB import SMB +from SMBpdd import SMBpdd +from SMBgradients import SMBgradients from basalforcings import basalforcings from matice import matice from damage import damage Index: ../trunk-jpl/src/m/classes/SMBgradients.py =================================================================== --- ../trunk-jpl/src/m/classes/SMBgradients.py (revision 0) +++ ../trunk-jpl/src/m/classes/SMBgradients.py (revision 17078) @@ -0,0 +1,56 @@ +from fielddisplay import fielddisplay +from EnumDefinitions import * +from checkfield import * +from WriteData import * + +class SMBgradients(object): + """ + SMBgradients Class definition + + Usage: + SMBgradients=SMBgradients(); + """ + + def __init__(self): # {{{ + self.href = float('NaN') + self.smbref = float('NaN') + self.b_pos = float('NaN') + self.b_neg = float('NaN') + #}}} + def __repr__(self): # {{{ + string=" surface forcings parameters:" + + string="%s\n%s"%(string,fielddisplay(self,'issmbgradients','is smb gradients method activated (0 or 1, default is 0)')) + string="%s\n%s"%(string,fielddisplay(self,'href',' reference elevation from which deviation is used to calculate SMB adjustment in smb gradients method')) + string="%s\n%s"%(string,fielddisplay(self,'smbref',' reference smb from which deviation is calculated in smb gradients method')) + string="%s\n%s"%(string,fielddisplay(self,'b_pos',' slope of hs - smb regression line for accumulation regime required if smb gradients is activated')) + string="%s\n%s"%(string,fielddisplay(self,'b_neg',' slope of hs - smb regression line for ablation regime required if smb gradients is activated')) + + return string + #}}} + def initialize(self,md): # {{{ + + #Nothing for now + + return self + #}}} + def checkconsistency(self,md,solution,analyses): # {{{ + + if MasstransportAnalysisEnum() in analyses: + md = checkfield(md,'fieldname','surfaceforcings.href','forcing',1,'NaN',1) + md = checkfield(md,'fieldname','surfaceforcings.smbref','forcing',1,'NaN',1) + md = checkfield(md,'fieldname','surfaceforcings.b_pos','forcing',1,'NaN',1) + md = checkfield(md,'fieldname','surfaceforcings.b_neg','forcing',1,'NaN',1) + + return md + # }}} + def marshall(self,md,fid): # {{{ + + yts=365.0*24.0*3600.0 + + WriteData(fid,'enum',SurfaceforcingsEnum(),'data',SMBgradientsEnum(),'format','Integer'); + WriteData(fid,'object',self,'class','surfaceforcings','fieldname','href','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1) + WriteData(fid,'object',self,'class','surfaceforcings','fieldname','smbref','format','DoubleMat','mattype',1,'scale',1./yts,'forcinglength',md.mesh.numberofvertices+1) + WriteData(fid,'object',self,'class','surfaceforcings','fieldname','b_pos','format','DoubleMat','mattype',1,'scale',1./yts,'forcinglength',md.mesh.numberofvertices+1) + WriteData(fid,'object',self,'class','surfaceforcings','fieldname','b_neg','format','DoubleMat','mattype',1,'scale',1./yts,'forcinglength',md.mesh.numberofvertices+1) + # }}} Index: ../trunk-jpl/src/m/enum/SMBpddEnum.m =================================================================== --- ../trunk-jpl/src/m/enum/SMBpddEnum.m (revision 0) +++ ../trunk-jpl/src/m/enum/SMBpddEnum.m (revision 17078) @@ -0,0 +1,11 @@ +function macro=SMBpddEnum() +%SMBPDDENUM - Enum of SMBpdd +% +% WARNING: DO NOT MODIFY THIS FILE +% this file has been automatically generated by src/c/shared/Enum/Synchronize.sh +% Please read src/c/shared/Enum/README for more information +% +% Usage: +% macro=SMBpddEnum() + +macro=StringToEnum('SMBpdd'); Index: ../trunk-jpl/src/m/enum/SMBgradientsEnum.m =================================================================== --- ../trunk-jpl/src/m/enum/SMBgradientsEnum.m (revision 0) +++ ../trunk-jpl/src/m/enum/SMBgradientsEnum.m (revision 17078) @@ -0,0 +1,11 @@ +function macro=SMBgradientsEnum() +%SMBGRADIENTSENUM - Enum of SMBgradients +% +% WARNING: DO NOT MODIFY THIS FILE +% this file has been automatically generated by src/c/shared/Enum/Synchronize.sh +% Please read src/c/shared/Enum/README for more information +% +% Usage: +% macro=SMBgradientsEnum() + +macro=StringToEnum('SMBgradients'); Index: ../trunk-jpl/src/m/enum/LevelsetAnalysisEnum.m =================================================================== --- ../trunk-jpl/src/m/enum/LevelsetAnalysisEnum.m (revision 0) +++ ../trunk-jpl/src/m/enum/LevelsetAnalysisEnum.m (revision 17078) @@ -0,0 +1,11 @@ +function macro=LevelsetAnalysisEnum() +%LEVELSETANALYSISENUM - Enum of LevelsetAnalysis +% +% WARNING: DO NOT MODIFY THIS FILE +% this file has been automatically generated by src/c/shared/Enum/Synchronize.sh +% Please read src/c/shared/Enum/README for more information +% +% Usage: +% macro=LevelsetAnalysisEnum() + +macro=StringToEnum('LevelsetAnalysis'); Index: ../trunk-jpl/src/m/enum/EnumDefinitions.py =================================================================== --- ../trunk-jpl/src/m/enum/EnumDefinitions.py (revision 17077) +++ ../trunk-jpl/src/m/enum/EnumDefinitions.py (revision 17078) @@ -276,6 +276,7 @@ def SurfaceforcingsEnum(): return StringToEnum("Surfaceforcings")[0] def SMBEnum(): return StringToEnum("SMB")[0] def SurfaceforcingsMassBalanceEnum(): return StringToEnum("SurfaceforcingsMassBalance")[0] +def SMBpddEnum(): return StringToEnum("SMBpdd")[0] def SurfaceforcingsDelta18oEnum(): return StringToEnum("SurfaceforcingsDelta18o")[0] def SurfaceforcingsDelta18oSurfaceEnum(): return StringToEnum("SurfaceforcingsDelta18oSurface")[0] def SurfaceforcingsIsdelta18oEnum(): return StringToEnum("SurfaceforcingsIsdelta18o")[0] @@ -283,15 +284,16 @@ def SurfaceforcingsTemperaturesPresentdayEnum(): return StringToEnum("SurfaceforcingsTemperaturesPresentday")[0] def SurfaceforcingsTemperaturesLgmEnum(): return StringToEnum("SurfaceforcingsTemperaturesLgm")[0] def SurfaceforcingsPrecipitationEnum(): return StringToEnum("SurfaceforcingsPrecipitation")[0] -def SurfaceforcingsIspddEnum(): return StringToEnum("SurfaceforcingsIspdd")[0] def SurfaceforcingsDesfacEnum(): return StringToEnum("SurfaceforcingsDesfac")[0] def SurfaceforcingsS0pEnum(): return StringToEnum("SurfaceforcingsS0p")[0] -def SurfaceforcingsIssmbgradientsEnum(): return StringToEnum("SurfaceforcingsIssmbgradients")[0] +def SMBgradientsEnum(): return StringToEnum("SMBgradients")[0] def SurfaceforcingsMonthlytemperaturesEnum(): return StringToEnum("SurfaceforcingsMonthlytemperatures")[0] def SurfaceforcingsHrefEnum(): return StringToEnum("SurfaceforcingsHref")[0] def SurfaceforcingsSmbrefEnum(): return StringToEnum("SurfaceforcingsSmbref")[0] def SurfaceforcingsBPosEnum(): return StringToEnum("SurfaceforcingsBPos")[0] def SurfaceforcingsBNegEnum(): return StringToEnum("SurfaceforcingsBNeg")[0] +def SurfaceforcingsIspddEnum(): return StringToEnum("SurfaceforcingsIspdd")[0] +def SurfaceforcingsIssmbgradientsEnum(): return StringToEnum("SurfaceforcingsIssmbgradients")[0] def SolutionTypeEnum(): return StringToEnum("SolutionType")[0] def AnalysisTypeEnum(): return StringToEnum("AnalysisType")[0] def ConfigurationTypeEnum(): return StringToEnum("ConfigurationType")[0] Index: ../trunk-jpl/src/m/enum/TransientIslevelsetEnum.m =================================================================== --- ../trunk-jpl/src/m/enum/TransientIslevelsetEnum.m (revision 0) +++ ../trunk-jpl/src/m/enum/TransientIslevelsetEnum.m (revision 17078) @@ -0,0 +1,11 @@ +function macro=TransientIslevelsetEnum() +%TRANSIENTISLEVELSETENUM - Enum of TransientIslevelset +% +% WARNING: DO NOT MODIFY THIS FILE +% this file has been automatically generated by src/c/shared/Enum/Synchronize.sh +% Please read src/c/shared/Enum/README for more information +% +% Usage: +% macro=TransientIslevelsetEnum() + +macro=StringToEnum('TransientIslevelset');