Changeset 23814
- Timestamp:
- 03/29/19 15:50:05 (6 years ago)
- Location:
- issm/trunk-jpl/src
- Files:
-
- 15 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/analyses/SmbAnalysis.cpp
r23808 r23814 192 192 switch(smb_model){ 193 193 case SMBforcingEnum: 194 /*Nothing to add to parameters*/194 parameters->AddObject(iomodel->CopyConstantObject("md.smb.isclimatology",SmbIsclimatologyEnum)); 195 195 break; 196 196 case SMBgembEnum: … … 278 278 break; 279 279 case SMBcomponentsEnum: 280 /*Nothing to add to parameters*/280 parameters->AddObject(iomodel->CopyConstantObject("md.smb.isclimatology",SmbIsclimatologyEnum)); 281 281 break; 282 282 case SMBmeltcomponentsEnum: 283 /*Nothing to add to parameters*/283 parameters->AddObject(iomodel->CopyConstantObject("md.smb.isclimatology",SmbIsclimatologyEnum)); 284 284 break; 285 285 case SMBgradientscomponentsEnum: … … 322 322 switch(smb_model){ 323 323 case SMBforcingEnum: 324 /*Nothing to be done*/324 SmbForcingx(femmodel); 325 325 break; 326 326 case SMBgembEnum: -
issm/trunk-jpl/src/c/modules/SurfaceMassBalancex/SurfaceMassBalancex.cpp
r23665 r23814 6 6 #include "../../shared/shared.h" 7 7 #include "../../toolkits/toolkits.h" 8 8 #include "../modules.h" 9 10 void SmbForcingx(FemModel* femmodel){/*{{{*/ 11 12 // void SmbForcingx(smb,ni){ 13 // INPUT parameters: ni: working size of arrays 14 // OUTPUT: mass-balance (m/yr ice): agd(NA) 15 bool isclimatology=false; 16 femmodel->parameters->FindParam(&isclimatology,SmbIsclimatologyEnum); 17 18 if (isclimatology){ 19 int v; 20 IssmDouble time,dt,delta,starttime,finaltime; 21 int offsetend; 22 IssmDouble time0, timeend, timeclim; 23 24 femmodel->parameters->FindParam(&time,TimeEnum); 25 femmodel->parameters->FindParam(&dt,TimesteppingTimeStepEnum); 26 femmodel->parameters->FindParam(&finaltime,TimesteppingFinalTimeEnum); 27 femmodel->parameters->FindParam(&starttime,TimesteppingStartTimeEnum); 28 29 if (time<=starttime+dt){ 30 InputDuplicatex(femmodel,SmbMassBalanceEnum,SmbMassBalanceClimateEnum); 31 } 32 33 /*Loop over all the elements of this partition*/ 34 for(int i=0;i<femmodel->elements->Size();i++){ 35 Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i)); 36 37 int numvertices = element->GetNumberOfVertices(); 38 IssmDouble* smb = xNew<IssmDouble>(numvertices); 39 40 /*Recover Smb*/ 41 //If this is a climatology, we need to repeat the forcing after the final time 42 Input* smb_input=element->GetInput(SmbMassBalanceClimateEnum); _assert_(smb_input); 43 44 //Get accumulation climatology value 45 offsetend=dynamic_cast<TransientInput*>(smb_input)->GetTimeInputOffset(finaltime); 46 time0=dynamic_cast<TransientInput*>(smb_input)->GetTimeByOffset(0); 47 timeend=dynamic_cast<TransientInput*>(smb_input)->GetTimeByOffset(offsetend); 48 if (time>time0 & timeend>time0){ 49 delta=(time-time0) - (timeend-time0)*((int)((time-time0)/(timeend-time0))); 50 if (delta==0){ timeclim=timeend;} 51 else{ timeclim=time0+delta;} 52 } 53 54 element->GetInputListOnVerticesAtTime(smb,SmbMassBalanceClimateEnum,timeclim); 55 56 /*Add input to element and Free memory*/ 57 element->AddInput(SmbMassBalanceEnum,smb,P1Enum); 58 xDelete<IssmDouble>(smb); 59 } 60 } 61 62 }/*}}}*/ 9 63 void SmbGradientsx(FemModel* femmodel){/*{{{*/ 10 64 … … 350 404 // OUTPUT: mass-balance (m/yr ice): agd(NA) 351 405 int v; 406 bool isclimatology=false; 407 IssmDouble time,delta,starttime,finaltime; 408 int offsetend; 409 IssmDouble time0, timeend, timeclim; 410 411 femmodel->parameters->FindParam(&isclimatology,SmbIsclimatologyEnum); 412 femmodel->parameters->FindParam(&time,TimeEnum); 413 femmodel->parameters->FindParam(&finaltime,TimesteppingFinalTimeEnum); 414 femmodel->parameters->FindParam(&starttime,TimesteppingStartTimeEnum); 352 415 353 416 /*Loop over all the elements of this partition*/ … … 363 426 364 427 /*Recover Smb Components*/ 365 element->GetInputListOnVertices(acc,SmbAccumulationEnum); 366 element->GetInputListOnVertices(evap,SmbEvaporationEnum); 367 element->GetInputListOnVertices(runoff,SmbRunoffEnum); 428 if (isclimatology){ 429 430 //If this is a climatology, we need to repeat the forcing after the final time 431 Input* acc_input=element->GetInput(SmbAccumulationEnum); _assert_(acc_input); 432 Input* evap_input=element->GetInput(SmbEvaporationEnum); _assert_(evap_input); 433 Input* runoff_input=element->GetInput(SmbRunoffEnum); _assert_(runoff_input); 434 435 //Get accumulation climatology value 436 offsetend=dynamic_cast<TransientInput*>(acc_input)->GetTimeInputOffset(finaltime); 437 time0=dynamic_cast<TransientInput*>(acc_input)->GetTimeByOffset(0); 438 timeend=dynamic_cast<TransientInput*>(acc_input)->GetTimeByOffset(offsetend); 439 if (time>time0 & timeend>time0){ 440 delta=(time-time0) - (timeend-time0)*((int)((time-time0)/(timeend-time0))); 441 if (delta==0){ timeclim=timeend;} 442 else{ timeclim=time0+delta;} 443 } 444 445 element->GetInputListOnVerticesAtTime(acc,SmbAccumulationEnum,timeclim); 446 447 //Get evaporation climatology value 448 offsetend=dynamic_cast<TransientInput*>(evap_input)->GetTimeInputOffset(finaltime); 449 time0=dynamic_cast<TransientInput*>(evap_input)->GetTimeByOffset(0); 450 timeend=dynamic_cast<TransientInput*>(evap_input)->GetTimeByOffset(offsetend); 451 if (time>time0 & timeend>time0){ 452 delta=(time-time0) - (timeend-time0)*((int)((time-time0)/(timeend-time0))); 453 if (delta==0){ timeclim=timeend;} 454 else{ timeclim=time0+delta;} 455 } 456 457 element->GetInputListOnVerticesAtTime(evap,SmbEvaporationEnum,timeclim); 458 459 //Get runoff climatology value 460 offsetend=dynamic_cast<TransientInput*>(runoff_input)->GetTimeInputOffset(finaltime); 461 time0=dynamic_cast<TransientInput*>(runoff_input)->GetTimeByOffset(0); 462 timeend=dynamic_cast<TransientInput*>(runoff_input)->GetTimeByOffset(offsetend); 463 if (time>time0 & timeend>time0){ 464 delta=(time-time0) - (timeend-time0)*((int)((time-time0)/(timeend-time0))); 465 if (delta==0){ timeclim=timeend;} 466 else{ timeclim=time0+delta;} 467 } 468 469 element->GetInputListOnVerticesAtTime(runoff,SmbRunoffEnum,timeclim); 470 } 471 else{ 472 element->GetInputListOnVertices(acc,SmbAccumulationEnum); 473 element->GetInputListOnVertices(evap,SmbEvaporationEnum); 474 element->GetInputListOnVertices(runoff,SmbRunoffEnum); 475 } 368 476 369 477 // loop over all vertices … … 391 499 // OUTPUT: mass-balance (m/yr ice): agd(NA) 392 500 int v; 501 bool isclimatology=false; 502 IssmDouble time,delta,starttime,finaltime; 503 int offsetend; 504 IssmDouble time0, timeend, timeclim; 505 506 femmodel->parameters->FindParam(&isclimatology,SmbIsclimatologyEnum); 507 femmodel->parameters->FindParam(&time,TimeEnum); 508 femmodel->parameters->FindParam(&finaltime,TimesteppingFinalTimeEnum); 509 femmodel->parameters->FindParam(&starttime,TimesteppingStartTimeEnum); 393 510 394 511 /*Loop over all the elements of this partition*/ … … 405 522 406 523 /*Recover Smb Components*/ 407 element->GetInputListOnVertices(acc,SmbAccumulationEnum); 408 element->GetInputListOnVertices(evap,SmbEvaporationEnum); 409 element->GetInputListOnVertices(melt,SmbMeltEnum); 410 element->GetInputListOnVertices(refreeze,SmbRefreezeEnum); 524 if (isclimatology){ 525 526 //If this is a climatology, we need to repeat the forcing after the final time 527 Input* acc_input=element->GetInput(SmbAccumulationEnum); _assert_(acc_input); 528 Input* evap_input=element->GetInput(SmbEvaporationEnum); _assert_(evap_input); 529 Input* melt_input=element->GetInput(SmbMeltEnum); _assert_(melt_input); 530 Input* refreeze_input=element->GetInput(SmbRefreezeEnum); _assert_(refreeze_input); 531 532 //Get accumulation climatology value 533 offsetend=dynamic_cast<TransientInput*>(acc_input)->GetTimeInputOffset(finaltime); 534 time0=dynamic_cast<TransientInput*>(acc_input)->GetTimeByOffset(0); 535 timeend=dynamic_cast<TransientInput*>(acc_input)->GetTimeByOffset(offsetend); 536 if (time>time0 & timeend>time0){ 537 delta=(time-time0) - (timeend-time0)*((int)((time-time0)/(timeend-time0))); 538 if (delta==0){ timeclim=timeend;} 539 else{ timeclim=time0+delta;} 540 } 541 542 element->GetInputListOnVerticesAtTime(acc,SmbAccumulationEnum,timeclim); 543 544 //Get evaporation climatology value 545 offsetend=dynamic_cast<TransientInput*>(evap_input)->GetTimeInputOffset(finaltime); 546 time0=dynamic_cast<TransientInput*>(evap_input)->GetTimeByOffset(0); 547 timeend=dynamic_cast<TransientInput*>(evap_input)->GetTimeByOffset(offsetend); 548 if (time>time0){ 549 delta=(time-time0) - (timeend-time0)*((int)((time-time0)/(timeend-time0))); 550 if (delta==0){ timeclim=timeend;} 551 else{ timeclim=time0+delta;} 552 } 553 554 element->GetInputListOnVerticesAtTime(evap,SmbEvaporationEnum,timeclim); 555 556 //Get melt climatology value 557 offsetend=dynamic_cast<TransientInput*>(melt_input)->GetTimeInputOffset(finaltime); 558 time0=dynamic_cast<TransientInput*>(melt_input)->GetTimeByOffset(0); 559 timeend=dynamic_cast<TransientInput*>(melt_input)->GetTimeByOffset(offsetend); 560 if (time>time0){ 561 delta=(time-time0) - (timeend-time0)*((int)((time-time0)/(timeend-time0))); 562 if (delta==0){ timeclim=timeend;} 563 else{ timeclim=time0+delta;} 564 } 565 566 element->GetInputListOnVerticesAtTime(melt,SmbMeltEnum,timeclim); 567 568 //Get refreeze climatology value 569 offsetend=dynamic_cast<TransientInput*>(refreeze_input)->GetTimeInputOffset(finaltime); 570 time0=dynamic_cast<TransientInput*>(refreeze_input)->GetTimeByOffset(0); 571 timeend=dynamic_cast<TransientInput*>(refreeze_input)->GetTimeByOffset(offsetend); 572 if (time>time0){ 573 delta=(time-time0) - (timeend-time0)*((int)((time-time0)/(timeend-time0))); 574 if (delta==0){ timeclim=timeend;} 575 else{ timeclim=time0+delta;} 576 } 577 578 element->GetInputListOnVerticesAtTime(refreeze,SmbRefreezeEnum,timeclim); 579 } 580 else{ 581 element->GetInputListOnVertices(acc,SmbAccumulationEnum); 582 element->GetInputListOnVertices(evap,SmbEvaporationEnum); 583 element->GetInputListOnVertices(melt,SmbMeltEnum); 584 element->GetInputListOnVertices(refreeze,SmbRefreezeEnum); 585 } 411 586 412 587 // loop over all vertices -
issm/trunk-jpl/src/c/modules/SurfaceMassBalancex/SurfaceMassBalancex.h
r23540 r23814 10 10 /* local prototypes: */ 11 11 void SurfaceMassBalancex(FemModel* femmodel); 12 void SmbForcingx(FemModel* femmodel); 12 13 void SmbGradientsx(FemModel* femmodel); 13 14 void SmbGradientsElax(FemModel* femmodel); -
issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
r23808 r23814 640 640 SmbIsInitializedEnum, 641 641 SmbMassBalanceEnum, 642 SmbMassBalanceClimateEnum, 642 643 SmbMeltEnum, 643 644 SmbMonthlytemperaturesEnum, -
issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
r23808 r23814 646 646 case SmbIsInitializedEnum : return "SmbIsInitialized"; 647 647 case SmbMassBalanceEnum : return "SmbMassBalance"; 648 case SmbMassBalanceClimateEnum : return "SmbMassBalanceClimate"; 648 649 case SmbMeltEnum : return "SmbMelt"; 649 650 case SmbMonthlytemperaturesEnum : return "SmbMonthlytemperatures"; -
issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
r23808 r23814 661 661 else if (strcmp(name,"SmbIsInitialized")==0) return SmbIsInitializedEnum; 662 662 else if (strcmp(name,"SmbMassBalance")==0) return SmbMassBalanceEnum; 663 else if (strcmp(name,"SmbMassBalanceClimate")==0) return SmbMassBalanceClimateEnum; 663 664 else if (strcmp(name,"SmbMelt")==0) return SmbMeltEnum; 664 665 else if (strcmp(name,"SmbMonthlytemperatures")==0) return SmbMonthlytemperaturesEnum; … … 751 752 else if (strcmp(name,"VzSSA")==0) return VzSSAEnum; 752 753 else if (strcmp(name,"Watercolumn")==0) return WatercolumnEnum; 753 else if (strcmp(name,"WaterColumnOld")==0) return WaterColumnOldEnum;754 754 else stage=7; 755 755 } 756 756 if(stage==7){ 757 if (strcmp(name,"WaterfractionDrainage")==0) return WaterfractionDrainageEnum; 757 if (strcmp(name,"WaterColumnOld")==0) return WaterColumnOldEnum; 758 else if (strcmp(name,"WaterfractionDrainage")==0) return WaterfractionDrainageEnum; 758 759 else if (strcmp(name,"WaterfractionDrainageIntegrated")==0) return WaterfractionDrainageIntegratedEnum; 759 760 else if (strcmp(name,"Waterfraction")==0) return WaterfractionEnum; … … 874 875 else if (strcmp(name,"FullMeltOnPartiallyFloating")==0) return FullMeltOnPartiallyFloatingEnum; 875 876 else if (strcmp(name,"GaussPenta")==0) return GaussPentaEnum; 876 else if (strcmp(name,"GaussSeg")==0) return GaussSegEnum;877 877 else stage=8; 878 878 } 879 879 if(stage==8){ 880 if (strcmp(name,"GaussTetra")==0) return GaussTetraEnum; 880 if (strcmp(name,"GaussSeg")==0) return GaussSegEnum; 881 else if (strcmp(name,"GaussTetra")==0) return GaussTetraEnum; 881 882 else if (strcmp(name,"GaussTria")==0) return GaussTriaEnum; 882 883 else if (strcmp(name,"GenericOption")==0) return GenericOptionEnum; … … 997 998 else if (strcmp(name,"NoMeltOnPartiallyFloating")==0) return NoMeltOnPartiallyFloatingEnum; 998 999 else if (strcmp(name,"NoneApproximation")==0) return NoneApproximationEnum; 999 else if (strcmp(name,"None")==0) return NoneEnum;1000 1000 else stage=9; 1001 1001 } 1002 1002 if(stage==9){ 1003 if (strcmp(name,"Numberedcostfunction")==0) return NumberedcostfunctionEnum; 1003 if (strcmp(name,"None")==0) return NoneEnum; 1004 else if (strcmp(name,"Numberedcostfunction")==0) return NumberedcostfunctionEnum; 1004 1005 else if (strcmp(name,"Numericalflux")==0) return NumericalfluxEnum; 1005 1006 else if (strcmp(name,"OldGradient")==0) return OldGradientEnum; … … 1120 1121 else if (strcmp(name,"P2")==0) return P2Enum; 1121 1122 else if (strcmp(name,"P2xP1")==0) return P2xP1Enum; 1122 else if (strcmp(name,"P2xP4")==0) return P2xP4Enum;1123 1123 else stage=10; 1124 1124 } 1125 1125 if(stage==10){ 1126 if (strcmp(name,"Paterson")==0) return PatersonEnum; 1126 if (strcmp(name,"P2xP4")==0) return P2xP4Enum; 1127 else if (strcmp(name,"Paterson")==0) return PatersonEnum; 1127 1128 else if (strcmp(name,"Pengrid")==0) return PengridEnum; 1128 1129 else if (strcmp(name,"Penpair")==0) return PenpairEnum; … … 1243 1244 else if (strcmp(name,"NearestInterp")==0) return NearestInterpEnum; 1244 1245 else if (strcmp(name,"OutputdefinitionList")==0) return OutputdefinitionListEnum; 1245 else if (strcmp(name,"SealevelObs")==0) return SealevelObsEnum;1246 1246 else stage=11; 1247 1247 } 1248 1248 if(stage==11){ 1249 if (strcmp(name,"SealevelWeights")==0) return SealevelWeightsEnum; 1249 if (strcmp(name,"SealevelObs")==0) return SealevelObsEnum; 1250 else if (strcmp(name,"SealevelWeights")==0) return SealevelWeightsEnum; 1250 1251 else if (strcmp(name,"StrainRate")==0) return StrainRateEnum; 1251 1252 else if (strcmp(name,"StressbalanceViscosityOvershoot")==0) return StressbalanceViscosityOvershootEnum; -
issm/trunk-jpl/src/m/classes/SMBcomponents.m
r21049 r23814 6 6 classdef SMBcomponents 7 7 properties (SetAccess=public) 8 isclimatology = 0; 8 9 accumulation = NaN; 9 10 runoff = NaN; … … 68 69 end 69 70 md = checkfield(md,'fieldname','smb.requested_outputs','stringrow',1); 71 md = checkfield(md,'fieldname','smb.isclimatology','values',[0 1]); 72 if (self.isclimatology) 73 md = checkfield(md,'fieldname', 'smb.accumulation', 'size',[md.mesh.numberofvertices+1],... 74 'message',['accumulation must have md.mesh.numberofvertices+1 rows in order to force a climatology']); 75 md = checkfield(md,'fieldname', 'smb.runoff', 'size',[md.mesh.numberofvertices+1],... 76 'message',['runoff must have md.mesh.numberofvertices+1 rows in order to force a climatology']); 77 md = checkfield(md,'fieldname', 'smb.evaporation', 'size',[md.mesh.numberofvertices+1],... 78 'message',['evaporation must have md.mesh.numberofvertices+1 rows in order to force a climatology']); 79 end 70 80 end % }}} 71 81 function disp(self) % {{{ … … 74 84 fielddisplay(self,'runoff','amount of ice melt lost from the ice column [m/yr ice eq]'); 75 85 fielddisplay(self,'evaporation','amount of ice lost to evaporative processes [m/yr ice eq]'); 86 fielddisplay(self,'isclimatology','repeat all forcings when past last forcing time (default false)'); 76 87 fielddisplay(self,'requested_outputs','additional outputs requested'); 77 88 end % }}} … … 93 104 end 94 105 WriteData(fid,prefix,'data',outputs,'name','md.smb.requested_outputs','format','StringArray'); 106 WriteData(fid,prefix,'object',self,'class','smb','fieldname','isclimatology','format','Boolean'); 95 107 96 108 end % }}} -
issm/trunk-jpl/src/m/classes/SMBcomponents.py
r23716 r23814 16 16 self.runoff = float('NaN') 17 17 self.evaporation = float('NaN') 18 self.isclimatology = 0 18 19 self.requested_outputs = [] 19 20 #}}} … … 23 24 string="%s\n%s"%(string,fielddisplay(self,'runoff','amount of ice melt lost from the ice column [m/yr ice eq]')) 24 25 string="%s\n%s"%(string,fielddisplay(self,'evaporation','mount of ice lost to evaporative processes [m/yr ice eq]')) 26 string="%s\n%s"%(string,fielddisplay(self,'isclimatology','repeat all forcings when past last forcing time (default false)')) 25 27 string="%s\n%s"%(string,fielddisplay(self,'requested_outputs','additional outputs requested')) 26 28 return string … … 73 75 74 76 md = checkfield(md,'fieldname','masstransport.requested_outputs','stringrow',1) 77 md = checkfield(md,'fieldname','smb.isclimatology','values',[0,1]) 75 78 76 79 return md … … 92 95 outputs =outputscopy 93 96 WriteData(fid,prefix,'data',outputs,'name','md.smb.requested_outputs','format','StringArray') 97 WriteData(fid,prefix,'object',self,'class','smb','fieldname','isclimatology','format','Boolean') 98 if (self.isclimatology>0): 99 md = checkfield(md,'fieldname', 'smb.accumulation', 'size',[md.mesh.numberofvertices+1],'message','accumulation must have md.mesh.numberofvertices+1 rows in order to force a climatology') 100 md = checkfield(md,'fieldname', 'smb.runoff', 'size',[md.mesh.numberofvertices+1],'message','runoff must have md.mesh.numberofvertices+1 rows in order to force a climatology') 101 md = checkfield(md,'fieldname', 'smb.evaporation', 'size',[md.mesh.numberofvertices+1],'message','evaporation must have md.mesh.numberofvertices+1 rows in order to force a climatology') 94 102 95 103 # }}} -
issm/trunk-jpl/src/m/classes/SMBforcing.m
r21810 r23814 6 6 classdef SMBforcing 7 7 properties (SetAccess=public) 8 isclimatology = 0; 8 9 mass_balance = NaN; 9 10 requested_outputs = {}; … … 49 50 50 51 if (strcmp(solution,'TransientSolution') & md.transient.issmb == 0), return; end 51 52 52 53 if ismember('MasstransportAnalysis',analyses), 53 54 md = checkfield(md,'fieldname','smb.mass_balance','timeseries',1,'NaN',1,'Inf',1); … … 57 58 end 58 59 md = checkfield(md,'fieldname','smb.requested_outputs','stringrow',1); 60 md = checkfield(md,'fieldname','smb.isclimatology','values',[0 1]); 61 if (self.isclimatology) 62 md = checkfield(md,'fieldname', 'smb.mass_balance', 'size',[md.mesh.numberofvertices+1],... 63 'message',['mass_balance must have md.mesh.numberofvertices+1 rows in order to force a climatology']); 64 end 59 65 end % }}} 60 66 function disp(self) % {{{ 61 67 disp(sprintf(' surface forcings parameters:')); 62 68 fielddisplay(self,'mass_balance','surface mass balance [m/yr ice eq]'); 69 fielddisplay(self,'isclimatology','repeat all forcings when past last forcing time (default false)'); 63 70 fielddisplay(self,'requested_outputs','additional outputs requested'); 64 71 end % }}} … … 79 86 end 80 87 WriteData(fid,prefix,'data',outputs,'name','md.smb.requested_outputs','format','StringArray'); 88 WriteData(fid,prefix,'object',self,'class','smb','fieldname','isclimatology','format','Boolean'); 81 89 82 90 end % }}} … … 85 93 writejs1Darray(fid,[modelname '.smb.mass_balance'],self.mass_balance); 86 94 writejscellstring(fid,[modelname '.smb.requested_outputs'],self.requested_outputs); 95 writejs1Darray(fid,[modelname '.smb.isclimatology'],self.isclimatology); 87 96 88 97 end % }}} -
issm/trunk-jpl/src/m/classes/SMBforcing.py
r23716 r23814 16 16 self.mass_balance = float('NaN') 17 17 self.requested_outputs = [] 18 self.isclimatology = 0 18 19 #}}} 19 20 def __repr__(self): # {{{ 20 21 string=" surface forcings parameters:" 21 22 string="%s\n%s"%(string,fielddisplay(self,'mass_balance','surface mass balance [m/yr ice eq]')) 23 string="%s\n%s"%(string,fielddisplay(self,'isclimatology','repeat all forcings when past last forcing time (default false)')) 22 24 string="%s\n%s"%(string,fielddisplay(self,'requested_outputs','additional outputs requested')) 23 25 return string … … 48 50 49 51 md = checkfield(md,'fieldname','masstransport.requested_outputs','stringrow',1) 52 md = checkfield(md,'fieldname','smb.isclimatology','values',[0,1]) 53 if (self.isclimatology>0): 54 md = checkfield(md,'fieldname', 'smb.mass_balance', 'size',[md.mesh.numberofvertices+1],'message','mass_balance must have md.mesh.numberofvertices+1 rows in order to force a climatology') 55 50 56 return md 51 57 # }}} … … 65 71 outputs =outputscopy 66 72 WriteData(fid,prefix,'data',outputs,'name','md.smb.requested_outputs','format','StringArray') 73 WriteData(fid,prefix,'object',self,'class','smb','fieldname','isclimatology','format','Boolean') 67 74 68 75 # }}} -
issm/trunk-jpl/src/m/classes/SMBgemb.m
r23808 r23814 218 218 219 219 md = checkfield(md,'fieldname','smb.Ta','timeseries',1,'NaN',1,'Inf',1,'>',273-100,'<',273+100); %-100/100 celsius min/max value 220 md = checkfield(md,'fieldname','smb.V','timeseries',1,'NaN',1,'Inf',1,'>=',0,'<',45); %max 500 km/h 221 md = checkfield(md,'fieldname','smb.dswrf','timeseries',1,'NaN',1,'Inf',1,'>=',0,'<=',1400); 222 md = checkfield(md,'fieldname','smb.dlwrf','timeseries',1,'NaN',1,'Inf',1,'>=',0); 223 md = checkfield(md,'fieldname','smb.P','timeseries',1,'NaN',1,'Inf',1,'>=',0,'<=',100); 224 md = checkfield(md,'fieldname','smb.eAir','timeseries',1,'NaN',1,'Inf',1); 220 md = checkfield(md,'fieldname','smb.V','timeseries',1,'NaN',1,'Inf',1,'>=',0,'<',45,'size',size(self.Ta)); %max 500 km/h 221 md = checkfield(md,'fieldname','smb.dswrf','timeseries',1,'NaN',1,'Inf',1,'>=',0,'<=',1400,'size',size(self.Ta)); 222 md = checkfield(md,'fieldname','smb.dlwrf','timeseries',1,'NaN',1,'Inf',1,'>=',0,'size',size(self.Ta)); 223 md = checkfield(md,'fieldname','smb.P','timeseries',1,'NaN',1,'Inf',1,'>=',0,'<=',100,'size',size(self.Ta)); 224 md = checkfield(md,'fieldname','smb.eAir','timeseries',1,'NaN',1,'Inf',1,'size',size(self.Ta)); 225 226 if (self.isclimatology) 227 md = checkfield(md,'fieldname', 'smb.Ta', 'size',[md.mesh.numberofelements+1],... 228 'message',['Ta must have md.mesh.numberofelements+1 rows in order to force a climatology']); 229 md = checkfield(md,'fieldname', 'smb.V', 'size',[md.mesh.numberofelements+1],... 230 'message',['V must have md.mesh.numberofelements+1 rows in order to force a climatology']); 231 md = checkfield(md,'fieldname', 'smb.dswrf', 'size',[md.mesh.numberofelements+1],... 232 'message',['dswrf must have md.mesh.numberofelements+1 rows in order to force a climatology']); 233 md = checkfield(md,'fieldname', 'smb.dlwrf', 'size',[md.mesh.numberofelements+1],... 234 'message',['dlwrf must have md.mesh.numberofelements+1 rows in order to force a climatology']); 235 md = checkfield(md,'fieldname', 'smb.P', 'size',[md.mesh.numberofelements+1],... 236 'message',['P must have md.mesh.numberofelements+1 rows in order to force a climatology']); 237 md = checkfield(md,'fieldname', 'smb.eAir', 'size',[md.mesh.numberofelements+1],... 238 'message',['eAir must have md.mesh.numberofelements+1 rows in order to force a climatology']); 239 end 225 240 226 241 md = checkfield(md,'fieldname','smb.Tmean','size',[md.mesh.numberofelements 1],'NaN',1,'Inf',1,'>',273-100,'<',273+100); %-100/100 celsius min/max value -
issm/trunk-jpl/src/m/classes/SMBgemb.py
r23808 r23814 296 296 297 297 md = checkfield(md,'fieldname','smb.Ta','timeseries',1,'NaN',1,'Inf',1,'>',273-100,'<',273+100) #-100/100 celsius min/max value 298 md = checkfield(md,'fieldname','smb.V','timeseries',1,'NaN',1,'Inf',1,'> = ',0,'<',45) #max 500 km/h 299 md = checkfield(md,'fieldname','smb.dswrf','timeseries',1,'NaN',1,'Inf',1,'> = ',0,'< = ',1400) 300 md = checkfield(md,'fieldname','smb.dlwrf','timeseries',1,'NaN',1,'Inf',1,'> = ',0) 301 md = checkfield(md,'fieldname','smb.P','timeseries',1,'NaN',1,'Inf',1,'> = ',0,'< = ',100) 302 md = checkfield(md,'fieldname','smb.eAir','timeseries',1,'NaN',1,'Inf',1) 298 md = checkfield(md,'fieldname','smb.V','timeseries',1,'NaN',1,'Inf',1,'> = ',0,'<',45,'size',np.shape(self.Ta)) #max 500 km/h 299 md = checkfield(md,'fieldname','smb.dswrf','timeseries',1,'NaN',1,'Inf',1,'> = ',0,'< = ',1400,'size',np.shape(self.Ta)) 300 md = checkfield(md,'fieldname','smb.dlwrf','timeseries',1,'NaN',1,'Inf',1,'> = ',0,'size',np.shape(self.Ta)) 301 md = checkfield(md,'fieldname','smb.P','timeseries',1,'NaN',1,'Inf',1,'> = ',0,'< = ',100,'size',np.shape(self.Ta)) 302 md = checkfield(md,'fieldname','smb.eAir','timeseries',1,'NaN',1,'Inf',1,'size',np.shape(self.Ta)) 303 304 if (self.isclimatology>0): 305 md = checkfield(md,'fieldname', 'smb.Ta', 'size',[md.mesh.numberofelements+1],'message','Ta must have md.mesh.numberofelements+1 rows in order to force a climatology') 306 md = checkfield(md,'fieldname', 'smb.V', 'size',[md.mesh.numberofelements+1],'message','V must have md.mesh.numberofelements+1 rows in order to force a climatology') 307 md = checkfield(md,'fieldname', 'smb.dswrf', 'size',[md.mesh.numberofelements+1],'message','dswrf must have md.mesh.numberofelements+1 rows in order to force a climatology') 308 md = checkfield(md,'fieldname', 'smb.dlwrf', 'size',[md.mesh.numberofelements+1],'message','dlwrf must have md.mesh.numberofelements+1 rows in order to force a climatology') 309 md = checkfield(md,'fieldname', 'smb.P', 'size',[md.mesh.numberofelements+1],'message','P must have md.mesh.numberofelements+1 rows in order to force a climatology') 310 md = checkfield(md,'fieldname', 'smb.eAir', 'size',[md.mesh.numberofelements+1],'message','eAir must have md.mesh.numberofelements+1 rows in order to force a climatology') 303 311 304 312 md = checkfield(md,'fieldname','smb.Tmean','size',[md.mesh.numberofelements],'NaN',1,'Inf',1,'>',273-100,'<',273+100) #-100/100 celsius min/max value -
issm/trunk-jpl/src/m/classes/SMBmeltcomponents.m
r21049 r23814 6 6 classdef SMBmeltcomponents 7 7 properties (SetAccess=public) 8 isclimatology = 0; 8 9 accumulation = NaN; 9 10 evaporation = NaN; … … 78 79 end 79 80 md = checkfield(md,'fieldname','smb.requested_outputs','stringrow',1); 81 md = checkfield(md,'fieldname','smb.isclimatology','values',[0 1]); 82 if (self.isclimatology) 83 md = checkfield(md,'fieldname', 'smb.accumulation', 'size',[md.mesh.numberofvertices+1],... 84 'message',['accumulation must have md.mesh.numberofvertices+1 rows in order to force a climatology']); 85 md = checkfield(md,'fieldname', 'smb.melt', 'size',[md.mesh.numberofvertices+1],... 86 'message',['melt must have md.mesh.numberofvertices+1 rows in order to force a climatology']); 87 md = checkfield(md,'fieldname', 'smb.refreeze', 'size',[md.mesh.numberofvertices+1],... 88 'message',['refreeze must have md.mesh.numberofvertices+1 rows in order to force a climatology']); 89 md = checkfield(md,'fieldname', 'smb.evaporation', 'size',[md.mesh.numberofvertices+1],... 90 'message',['evaporation must have md.mesh.numberofvertices+1 rows in order to force a climatology']); 91 end 80 92 end % }}} 81 93 function disp(self) % {{{ … … 85 97 fielddisplay(self,'melt','amount of ice melt in ice column [m/yr ice eq]'); 86 98 fielddisplay(self,'refreeze','amount of ice melt refrozen in ice column [m/yr ice eq]'); 99 fielddisplay(self,'isclimatology','repeat all forcings when past last forcing time (default false)'); 87 100 fielddisplay(self,'requested_outputs','additional outputs requested'); 88 101 end % }}} … … 105 118 end 106 119 WriteData(fid,prefix,'data',outputs,'name','md.smb.requested_outputs','format','StringArray'); 120 WriteData(fid,prefix,'object',self,'class','smb','fieldname','isclimatology','format','Boolean'); 107 121 108 122 end % }}} -
issm/trunk-jpl/src/m/classes/SMBmeltcomponents.py
r23716 r23814 16 16 self.runoff = float('NaN') 17 17 self.evaporation = float('NaN') 18 self.isclimatology = 0 18 19 self.requested_outputs = [] 19 20 #}}} … … 24 25 string="%s\n%s"%(string,fielddisplay(self,'melt','amount of ice melt in the ice column [m/yr ice eq]')) 25 26 string="%s\n%s"%(string,fielddisplay(self,'refreeze','amount of ice melt refrozen in the ice column [m/yr ice eq]')) 27 string="%s\n%s"%(string,fielddisplay(self,'isclimatology','repeat all forcings when past last forcing time (default false)')) 26 28 string="%s\n%s"%(string,fielddisplay(self,'requested_outputs','additional outputs requested')) 27 29 return string … … 85 87 86 88 md = checkfield(md,'fieldname','masstransport.requested_outputs','stringrow',1) 89 md = checkfield(md,'fieldname','smb.isclimatology','values',[0,1]) 87 90 return md 88 91 # }}} … … 104 107 outputs =outputscopy 105 108 WriteData(fid,prefix,'data',outputs,'name','md.smb.requested_outputs','format','StringArray') 109 WriteData(fid,prefix,'object',self,'class','smb','fieldname','isclimatology','format','Boolean') 110 if (self.isclimatology>0): 111 md = checkfield(md,'fieldname', 'smb.accumulation', 'size',[md.mesh.numberofvertices+1],'message','accumulation must have md.mesh.numberofvertices+1 rows in order to force a climatology') 112 md = checkfield(md,'fieldname', 'smb.melt', 'size',[md.mesh.numberofvertices+1],'message','melt must have md.mesh.numberofvertices+1 rows in order to force a climatology') 113 md = checkfield(md,'fieldname', 'smb.refreeze', 'size',[md.mesh.numberofvertices+1],'message','refreeze must have md.mesh.numberofvertices+1 rows in order to force a climatology') 114 md = checkfield(md,'fieldname', 'smb.evaporation', 'size',[md.mesh.numberofvertices+1],'message','evaporation must have md.mesh.numberofvertices+1 rows in order to force a climatology') 106 115 107 116 # }}} -
issm/trunk-jpl/src/m/classes/model.m
r23771 r23814 167 167 else 168 168 md.settings.results_on_nodes = {'all'}; 169 end 170 end 171 %2019 Mar 28 172 if isa(md.smb.isclimatology,'double') 173 if prod(size(md.smb.isclimatology)) ~= 1 174 md.smb.isclimatology = 0; 169 175 end 170 176 end
Note:
See TracChangeset
for help on using the changeset viewer.