Changeset 26483
- Timestamp:
- 10/15/21 12:36:16 (3 years ago)
- Location:
- issm/trunk-jpl/src
- Files:
-
- 10 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/classes/Elements/Element.cpp
r26482 r26483 3609 3609 IssmDouble tspin,beta0_basin,beta1_basin,noisespin_basin; 3610 3610 IssmDouble* phi_basin = xNew<IssmDouble>(arorder); 3611 IssmDouble* smbspin = xNew <IssmDouble>(numvertices*arorder);3611 IssmDouble* smbspin = xNewZeroInit<IssmDouble>(numvertices*arorder); 3612 3612 3613 3613 /*Get Basin ID and Basin coefficients*/ -
issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateParameters.cpp
r26477 r26483 399 399 /*Add parameters that are not in standard nbvertices format*/ 400 400 parameters->AddObject(iomodel->CopyConstantObject("md.smb.num_basins",SmbNumBasinsEnum)); 401 parameters->AddObject(iomodel->CopyConstantObject("md.smb.randomflag",SmbRandomflagEnum)); 401 402 parameters->AddObject(iomodel->CopyConstantObject("md.smb.ar_order",SmbAutoregressiveOrderEnum)); 402 403 parameters->AddObject(iomodel->CopyConstantObject("md.smb.ar_initialtime",SmbAutoregressionInitialTimeEnum)); -
issm/trunk-jpl/src/c/modules/SurfaceMassBalancex/SurfaceMassBalancex.cpp
r26482 r26483 171 171 my_rank=IssmComm::GetRank(); 172 172 if(my_rank==0){ 173 bool randomflag{}; 174 femmodel->parameters->FindParam(&randomflag,SmbRandomflagEnum); 175 int fixedseed; 173 176 for(int i=0;i<nspin;i++){ 174 177 IssmDouble* temparray = xNew<IssmDouble>(numbasins); 175 multivariateNormal(&temparray,numbasins,0.0,covmat); 178 /*Determine whether random seed is fixed to for loop step (randomflag==false) or random seed truly random (randomflag==true)*/ 179 if(randomflag) fixedseed=-1; 180 else fixedseed = i; 181 multivariateNormal(&temparray,numbasins,0.0,covmat,fixedseed); 176 182 for(int j=0;j<numbasins;j++){noisespin[i*numbasins+j]=temparray[j];} 177 183 xDelete<IssmDouble>(temparray); … … 194 200 }/*}}}*/ 195 201 void Smbautoregressionx(FemModel* femmodel){/*{{{*/ 202 196 203 /*Get time parameters*/ 197 204 IssmDouble time,dt,starttime,tstep_ar; … … 234 241 my_rank=IssmComm::GetRank(); 235 242 if(my_rank==0){ 236 multivariateNormal(&noiseterms,numbasins,0.0,covmat); 243 bool randomflag{}; 244 femmodel->parameters->FindParam(&randomflag,SmbRandomflagEnum); 245 _printf_("randomflag: "<<randomflag<<'\n'); 246 /*Determine whether random seed is fixed to time step (randomflag==false) or random seed truly random (randomflag==true)*/ 247 int fixedseed; 248 if(randomflag) fixedseed=-1; 249 else fixedseed = static_cast<int>((time-starttime)/dt); 250 multivariateNormal(&noiseterms,numbasins,0.0,covmat,fixedseed); 237 251 } 238 252 ISSM_MPI_Bcast(noiseterms,numbasins,ISSM_MPI_DOUBLE,0,IssmComm::GetComm()); -
issm/trunk-jpl/src/c/shared/Enum/Enum.vim
r26445 r26483 415 415 syn keyword cConstant SmbAccurefEnum 416 416 syn keyword cConstant SmbAdThreshEnum 417 syn keyword cConstant SmbAutoregressionInitialTimeEnum 418 syn keyword cConstant SmbAutoregressionTimestepEnum 419 syn keyword cConstant SmbAutoregressiveOrderEnum 417 420 syn keyword cConstant SmbAveragingEnum 421 syn keyword cConstant SmbBeta0Enum 422 syn keyword cConstant SmbBeta1Enum 423 syn keyword cConstant SmbCovmatEnum 418 424 syn keyword cConstant SmbDesfacEnum 419 425 syn keyword cConstant SmbDpermilEnum … … 444 450 syn keyword cConstant SmbIsturbulentfluxEnum 445 451 syn keyword cConstant SmbKEnum 452 syn keyword cConstant SmbNumBasinsEnum 446 453 syn keyword cConstant SmbNumRequestedOutputsEnum 447 454 syn keyword cConstant SmbPfacEnum 455 syn keyword cConstant SmbPhiEnum 456 syn keyword cConstant SmbRandomflagEnum 448 457 syn keyword cConstant SmbRdlEnum 449 458 syn keyword cConstant SmbRequestedOutputsEnum … … 540 549 syn keyword cConstant AdjointpEnum 541 550 syn keyword cConstant AdjointxEnum 551 syn keyword cConstant AdjointxBaseEnum 552 syn keyword cConstant AdjointxShearEnum 542 553 syn keyword cConstant AdjointyEnum 554 syn keyword cConstant AdjointyBaseEnum 555 syn keyword cConstant AdjointyShearEnum 543 556 syn keyword cConstant AdjointzEnum 544 557 syn keyword cConstant AirEnum … … 863 876 syn keyword cConstant SmbAdiffiniEnum 864 877 syn keyword cConstant SmbAiniEnum 878 syn keyword cConstant SmbBasinsIdEnum 865 879 syn keyword cConstant SmbBMaxEnum 866 880 syn keyword cConstant SmbBMinEnum … … 948 962 syn keyword cConstant SmbTmeanEnum 949 963 syn keyword cConstant SmbTzEnum 964 syn keyword cConstant SmbValuesAutoregressionEnum 950 965 syn keyword cConstant SmbVEnum 951 966 syn keyword cConstant SmbVmeanEnum … … 1411 1426 syn keyword cConstant SamplingSolutionEnum 1412 1427 syn keyword cConstant SIAApproximationEnum 1428 syn keyword cConstant SMBautoregressionEnum 1413 1429 syn keyword cConstant SMBcomponentsEnum 1414 1430 syn keyword cConstant SMBd18opddEnum -
issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
r26477 r26483 448 448 SmbPfacEnum, 449 449 SmbPhiEnum, 450 SmbRandomflagEnum, 450 451 SmbRdlEnum, 451 452 SmbRequestedOutputsEnum, -
issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
r26477 r26483 456 456 case SmbPfacEnum : return "SmbPfac"; 457 457 case SmbPhiEnum : return "SmbPhi"; 458 case SmbRandomflagEnum : return "SmbRandomflag"; 458 459 case SmbRdlEnum : return "SmbRdl"; 459 460 case SmbRequestedOutputsEnum : return "SmbRequestedOutputs"; -
issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
r26477 r26483 465 465 else if (strcmp(name,"SmbPfac")==0) return SmbPfacEnum; 466 466 else if (strcmp(name,"SmbPhi")==0) return SmbPhiEnum; 467 else if (strcmp(name,"SmbRandomflag")==0) return SmbRandomflagEnum; 467 468 else if (strcmp(name,"SmbRdl")==0) return SmbRdlEnum; 468 469 else if (strcmp(name,"SmbRequestedOutputs")==0) return SmbRequestedOutputsEnum; … … 505 506 else if (strcmp(name,"ThermalMaxiter")==0) return ThermalMaxiterEnum; 506 507 else if (strcmp(name,"ThermalNumRequestedOutputs")==0) return ThermalNumRequestedOutputsEnum; 507 else if (strcmp(name,"ThermalPenaltyFactor")==0) return ThermalPenaltyFactorEnum;508 508 else stage=5; 509 509 } 510 510 if(stage==5){ 511 if (strcmp(name,"ThermalPenaltyLock")==0) return ThermalPenaltyLockEnum; 511 if (strcmp(name,"ThermalPenaltyFactor")==0) return ThermalPenaltyFactorEnum; 512 else if (strcmp(name,"ThermalPenaltyLock")==0) return ThermalPenaltyLockEnum; 512 513 else if (strcmp(name,"ThermalPenaltyThreshold")==0) return ThermalPenaltyThresholdEnum; 513 514 else if (strcmp(name,"ThermalReltol")==0) return ThermalReltolEnum; … … 628 629 else if (strcmp(name,"DamageDbar")==0) return DamageDbarEnum; 629 630 else if (strcmp(name,"DamageDbarOld")==0) return DamageDbarOldEnum; 630 else if (strcmp(name,"DamageF")==0) return DamageFEnum;631 631 else stage=6; 632 632 } 633 633 if(stage==6){ 634 if (strcmp(name,"DegreeOfChannelization")==0) return DegreeOfChannelizationEnum; 634 if (strcmp(name,"DamageF")==0) return DamageFEnum; 635 else if (strcmp(name,"DegreeOfChannelization")==0) return DegreeOfChannelizationEnum; 635 636 else if (strcmp(name,"DepthBelowSurface")==0) return DepthBelowSurfaceEnum; 636 637 else if (strcmp(name,"DeltaIceThickness")==0) return DeltaIceThicknessEnum; … … 751 752 else if (strcmp(name,"LevelsetfunctionSlopeY")==0) return LevelsetfunctionSlopeYEnum; 752 753 else if (strcmp(name,"LevelsetObservation")==0) return LevelsetObservationEnum; 753 else if (strcmp(name,"LoadingforceX")==0) return LoadingforceXEnum;754 754 else stage=7; 755 755 } 756 756 if(stage==7){ 757 if (strcmp(name,"LoadingforceY")==0) return LoadingforceYEnum; 757 if (strcmp(name,"LoadingforceX")==0) return LoadingforceXEnum; 758 else if (strcmp(name,"LoadingforceY")==0) return LoadingforceYEnum; 758 759 else if (strcmp(name,"LoadingforceZ")==0) return LoadingforceZEnum; 759 760 else if (strcmp(name,"MaskOceanLevelset")==0) return MaskOceanLevelsetEnum; … … 874 875 else if (strcmp(name,"SealevelchangeViscousN")==0) return SealevelchangeViscousNEnum; 875 876 else if (strcmp(name,"SealevelchangeViscousE")==0) return SealevelchangeViscousEEnum; 876 else if (strcmp(name,"SedimentHead")==0) return SedimentHeadEnum;877 877 else stage=8; 878 878 } 879 879 if(stage==8){ 880 if (strcmp(name,"SedimentHeadOld")==0) return SedimentHeadOldEnum; 880 if (strcmp(name,"SedimentHead")==0) return SedimentHeadEnum; 881 else if (strcmp(name,"SedimentHeadOld")==0) return SedimentHeadOldEnum; 881 882 else if (strcmp(name,"SedimentHeadSubstep")==0) return SedimentHeadSubstepEnum; 882 883 else if (strcmp(name,"SedimentHeadTransient")==0) return SedimentHeadTransientEnum; … … 997 998 else if (strcmp(name,"SolidearthExternalDisplacementEastRate")==0) return SolidearthExternalDisplacementEastRateEnum; 998 999 else if (strcmp(name,"SolidearthExternalDisplacementNorthRate")==0) return SolidearthExternalDisplacementNorthRateEnum; 999 else if (strcmp(name,"SolidearthExternalDisplacementUpRate")==0) return SolidearthExternalDisplacementUpRateEnum;1000 1000 else stage=9; 1001 1001 } 1002 1002 if(stage==9){ 1003 if (strcmp(name,"SolidearthExternalGeoidRate")==0) return SolidearthExternalGeoidRateEnum; 1003 if (strcmp(name,"SolidearthExternalDisplacementUpRate")==0) return SolidearthExternalDisplacementUpRateEnum; 1004 else if (strcmp(name,"SolidearthExternalGeoidRate")==0) return SolidearthExternalGeoidRateEnum; 1004 1005 else if (strcmp(name,"StrainRateeffective")==0) return StrainRateeffectiveEnum; 1005 1006 else if (strcmp(name,"StrainRateparallel")==0) return StrainRateparallelEnum; … … 1120 1121 else if (strcmp(name,"Outputdefinition47")==0) return Outputdefinition47Enum; 1121 1122 else if (strcmp(name,"Outputdefinition48")==0) return Outputdefinition48Enum; 1122 else if (strcmp(name,"Outputdefinition49")==0) return Outputdefinition49Enum;1123 1123 else stage=10; 1124 1124 } 1125 1125 if(stage==10){ 1126 if (strcmp(name,"Outputdefinition4")==0) return Outputdefinition4Enum; 1126 if (strcmp(name,"Outputdefinition49")==0) return Outputdefinition49Enum; 1127 else if (strcmp(name,"Outputdefinition4")==0) return Outputdefinition4Enum; 1127 1128 else if (strcmp(name,"Outputdefinition50")==0) return Outputdefinition50Enum; 1128 1129 else if (strcmp(name,"Outputdefinition51")==0) return Outputdefinition51Enum; … … 1243 1244 else if (strcmp(name,"DataSet")==0) return DataSetEnum; 1244 1245 else if (strcmp(name,"DataSetParam")==0) return DataSetParamEnum; 1245 else if (strcmp(name,"DatasetInput")==0) return DatasetInputEnum;1246 1246 else stage=11; 1247 1247 } 1248 1248 if(stage==11){ 1249 if (strcmp(name,"DefaultAnalysis")==0) return DefaultAnalysisEnum; 1249 if (strcmp(name,"DatasetInput")==0) return DatasetInputEnum; 1250 else if (strcmp(name,"DefaultAnalysis")==0) return DefaultAnalysisEnum; 1250 1251 else if (strcmp(name,"DefaultCalving")==0) return DefaultCalvingEnum; 1251 1252 else if (strcmp(name,"Dense")==0) return DenseEnum; … … 1366 1367 else if (strcmp(name,"LoveLi")==0) return LoveLiEnum; 1367 1368 else if (strcmp(name,"LoveLr")==0) return LoveLrEnum; 1368 else if (strcmp(name,"LoveSolution")==0) return LoveSolutionEnum;1369 1369 else stage=12; 1370 1370 } 1371 1371 if(stage==12){ 1372 if (strcmp(name,"MINI")==0) return MINIEnum; 1372 if (strcmp(name,"LoveSolution")==0) return LoveSolutionEnum; 1373 else if (strcmp(name,"MINI")==0) return MINIEnum; 1373 1374 else if (strcmp(name,"MINIcondensed")==0) return MINIcondensedEnum; 1374 1375 else if (strcmp(name,"MantlePlumeGeothermalFlux")==0) return MantlePlumeGeothermalFluxEnum; … … 1489 1490 else if (strcmp(name,"Seg")==0) return SegEnum; 1490 1491 else if (strcmp(name,"SegInput")==0) return SegInputEnum; 1491 else if (strcmp(name,"Segment")==0) return SegmentEnum;1492 1492 else stage=13; 1493 1493 } 1494 1494 if(stage==13){ 1495 if (strcmp(name,"SegmentRiftfront")==0) return SegmentRiftfrontEnum; 1495 if (strcmp(name,"Segment")==0) return SegmentEnum; 1496 else if (strcmp(name,"SegmentRiftfront")==0) return SegmentRiftfrontEnum; 1496 1497 else if (strcmp(name,"Separate")==0) return SeparateEnum; 1497 1498 else if (strcmp(name,"Seq")==0) return SeqEnum; -
issm/trunk-jpl/src/c/shared/Random/random.cpp
r26482 r26483 20 20 /*}}}*/ 21 21 22 void univariateNormal(IssmPDouble* prand, IssmPDouble mean, IssmPDouble sdev ) { /*{{{*/22 void univariateNormal(IssmPDouble* prand, IssmPDouble mean, IssmPDouble sdev, int seedfixed=-1) { /*{{{*/ 23 23 24 unsigned seed; 24 25 /*Random seed using time_since_epoch*/ 25 unsigned seed = std::chrono::steady_clock::now().time_since_epoch().count(); 26 std::default_random_engine generator(seed); 26 if(seedfixed==-1) seed = std::chrono::steady_clock::now().time_since_epoch().count(); 27 /*Seed fixed by input argument*/ 28 else seed = seedfixed; 29 std::default_random_engine generator(seed); 27 30 /*Normal Probability Distribution*/ 28 31 std::normal_distribution<IssmPDouble> normdistri(mean,sdev); 29 32 *prand = normdistri(generator); 30 33 } /*}}}*/ 31 void multivariateNormal(IssmDouble** prand, int dim, IssmDouble mean, IssmDouble* covariancematrix ) { /*{{{*/34 void multivariateNormal(IssmDouble** prand, int dim, IssmDouble mean, IssmDouble* covariancematrix, int seedfixed=-1) { /*{{{*/ 32 35 33 36 IssmPDouble* sampleStandardNormal = xNew<IssmPDouble>(dim); … … 35 38 IssmDouble* Lchol = xNewZeroInit<IssmDouble>(dim*dim); 36 39 37 for(int i=0;i<dim;i++) univariateNormal(&(sampleStandardNormal[i]),0.0,1.0); 38 CholeskyRealPositiveDefinite(Lchol,covariancematrix,dim); 40 /*True randomness if seedfixed==-1, otherwise random seed is fixed at seedfixed*/ 41 for(int i=0;i<dim;i++) univariateNormal(&(sampleStandardNormal[i]),0.0,1.0,seedfixed); 42 CholeskyRealPositiveDefinite(Lchol,covariancematrix,dim); 39 43 40 44 /*Matrix by vector multiplication*/ … … 51 55 xDelete<IssmDouble>(Lchol); 52 56 } /*}}}*/ 53 void multivariateNormal(IssmDouble** prand, int dim, IssmDouble* mean, IssmDouble* covariancematrix ) { /*{{{*/57 void multivariateNormal(IssmDouble** prand, int dim, IssmDouble* mean, IssmDouble* covariancematrix, int seedfixed=-1) { /*{{{*/ 54 58 55 59 IssmPDouble* sampleStandardNormal = xNew<IssmPDouble>(dim); 56 60 IssmDouble* sampleMultivariateNormal = xNew<IssmDouble>(dim); 57 61 IssmDouble* Lchol = xNewZeroInit<IssmDouble>(dim*dim); 58 for(int i=0;i<dim;i++) univariateNormal(&(sampleStandardNormal[i]),0.0,1.0);59 62 63 /*True randomness if seedfixed==-1, otherwise random seed is fixed at seedfixed*/ 64 for(int i=0;i<dim;i++) univariateNormal(&(sampleStandardNormal[i]),0.0,1.0,seedfixed); 60 65 CholeskyRealPositiveDefinite(Lchol,covariancematrix,dim); 61 66 -
issm/trunk-jpl/src/c/shared/Random/random.h
r26477 r26483 6 6 #define _RANDOM_H_ 7 7 8 void univariateNormal(IssmDouble* prand, IssmDouble mean, IssmDouble sdev );9 void multivariateNormal(IssmDouble** prand, int dim, IssmDouble mean, IssmDouble* covariancematrix );10 void multivariateNormal(IssmDouble** prand, int dim, IssmDouble* mean, IssmDouble* covariancematrix );8 void univariateNormal(IssmDouble* prand, IssmDouble mean, IssmDouble sdev, int seedfixed=-1); 9 void multivariateNormal(IssmDouble** prand, int dim, IssmDouble mean, IssmDouble* covariancematrix, int seedfixed=-1); 10 void multivariateNormal(IssmDouble** prand, int dim, IssmDouble* mean, IssmDouble* covariancematrix, int seedfixed=-1); 11 11 12 12 #endif //ifndef _RANDOM_H_ -
issm/trunk-jpl/src/m/classes/SMBautoregression.m
r26477 r26483 14 14 phi = NaN; 15 15 covmat = NaN; 16 basin_id = NaN; 16 basin_id = NaN; 17 randomflag = 1; 17 18 steps_per_step = 1; 18 19 averaging = 0; … … 62 63 end % }}} 63 64 function self = setdefaultparameters(self) % {{{ 64 self.ar_order = 0.0; %autoregression model of order 0 65 self.ar_order = 0.0; %autoregression model of order 0 66 self.randomflag = 1; 65 67 end % }}} 66 function md = checkconsistency(self,md,solution,analyses) % {{{68 function md = checkconsistency(self,md,solution,analyses) 67 69 68 70 if ismember('MasstransportAnalysis',analyses), … … 76 78 md = checkfield(md,'fieldname','smb.phi','NaN',1,'Inf',1,'size',[md.smb.num_basins,md.smb.ar_order]); 77 79 md = checkfield(md,'fieldname','smb.covmat','NaN',1,'Inf',1,'size',[md.smb.num_basins,md.smb.num_basins]); 80 md = checkfield(md,'fieldname','smb.randomflag','numel',[1],'values',[0 1]); 78 81 end 79 82 md = checkfield(md,'fieldname','smb.steps_per_step','>=',1,'numel',[1]); 80 83 md = checkfield(md,'fieldname','smb.averaging','numel',[1],'values',[0 1 2]); 81 84 md = checkfield(md,'fieldname','smb.requested_outputs','stringrow',1); 82 end % }}}85 end 83 86 function disp(self) % {{{ 84 87 disp(sprintf(' surface forcings parameters:')); … … 92 95 fielddisplay(self,'phi','basin-specific vectors of lag coefficients [unitless]'); 93 96 fielddisplay(self,'covmat','inter-basin covariance matrix for multivariate normal noise at each time step [m^2 ice eq. yr^(-2)]'); 97 fielddisplay(self,'randomflag','whether to apply real randomness (true) or pseudo-randomness with fixed seed (false)'); 94 98 fielddisplay(self, 'steps_per_step', 'number of smb steps per time step'); 95 99 fielddisplay(self, 'averaging', 'averaging methods from short to long steps'); … … 114 118 WriteData(fid,prefix,'object',self,'class','smb','fieldname','phi','format','DoubleMat','name','md.smb.phi','yts',md.constants.yts); 115 119 WriteData(fid,prefix,'object',self,'class','smb','fieldname','covmat','format','DoubleMat','name','md.smb.covmat','scale',1./(yts^2),'yts',md.constants.yts); 120 WriteData(fid,prefix,'object',self,'class','smb','fieldname','randomflag','format','Boolean'); 116 121 WriteData(fid, prefix, 'object', self, 'fieldname', 'steps_per_step', 'format', 'Integer'); 117 122 WriteData(fid, prefix, 'object', self, 'fieldname', 'averaging', 'format', 'Integer');
Note:
See TracChangeset
for help on using the changeset viewer.