Changeset 27780
- Timestamp:
- 06/05/23 07:35:05 (22 months ago)
- Location:
- issm/trunk-jpl
- Files:
-
- 3 added
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateParameters.cpp
r27498 r27780 575 575 parameters->AddObject(new BoolParam(StochasticForcingIsWaterPressureEnum,false)); 576 576 if(isstochasticforcing){ 577 int num_fields, stochastic_dim;577 int num_fields,num_tcov,stochastic_dim; 578 578 char** fields; 579 579 parameters->AddObject(iomodel->CopyConstantObject("md.stochasticforcing.num_fields",StochasticForcingNumFieldsEnum)); 580 580 parameters->AddObject(iomodel->CopyConstantObject("md.stochasticforcing.defaultdimension",StochasticForcingDefaultDimensionEnum)); 581 581 parameters->AddObject(iomodel->CopyConstantObject("md.stochasticforcing.stochastictimestep",StochasticForcingTimestepEnum)); 582 parameters->AddObject(iomodel->CopyConstantObject("md.stochasticforcing.num_timescovariance",StochasticForcingNumTimesCovarianceEnum)); 582 583 iomodel->FindConstant(&fields,&num_fields,"md.stochasticforcing.fields"); 583 584 if(num_fields<1) _error_("no stochasticforcing fields found"); … … 594 595 parameters->AddObject(new IntVecParam(StochasticForcingDimensionsEnum,transparam,N)); 595 596 xDelete<IssmDouble>(transparam); 597 iomodel->FetchData(&transparam,&M,&N,"md.stochasticforcing.timecovariance"); 598 parameters->AddObject(new DoubleVecParam(StochasticForcingTimeCovarianceEnum,transparam,N)); 599 xDelete<IssmDouble>(transparam); 596 600 iomodel->FetchData(&transparam,&M,&N,"md.stochasticforcing.covariance"); 597 601 parameters->AddObject(new DoubleMatParam(StochasticForcingCovarianceEnum,transparam,M,N)); -
issm/trunk-jpl/src/c/modules/StochasticForcingx/StochasticForcingx.cpp
r27462 r27780 14 14 /*Retrieve parameters*/ 15 15 bool randomflag; 16 int M,N,numfields,my_rank; 17 int* fields = NULL; 18 int* dimensions = NULL; 19 IssmDouble* covariance = NULL; 16 int M,N,numfields,numtcov,my_rank; 17 int* fields = NULL; 18 int* dimensions = NULL; 19 IssmDouble* timecovariance = NULL; 20 IssmDouble* covariance = NULL; 20 21 femmodel->parameters->FindParam(&randomflag,StochasticForcingRandomflagEnum); 21 22 femmodel->parameters->FindParam(&numfields,StochasticForcingNumFieldsEnum); 23 femmodel->parameters->FindParam(&numtcov,StochasticForcingNumTimesCovarianceEnum); 22 24 femmodel->parameters->FindParam(&fields,&N,StochasticForcingFieldsEnum); _assert_(N==numfields); 23 25 femmodel->parameters->FindParam(&dimensions,&N,StochasticForcingDimensionsEnum); _assert_(N==numfields); 26 femmodel->parameters->FindParam(&timecovariance,&N,StochasticForcingTimeCovarianceEnum); _assert_(N==numtcov); 24 27 int dimtot=0; 25 28 for(int i=0;i<numfields;i++) dimtot = dimtot+dimensions[i]; 26 femmodel->parameters->FindParam(&covariance,&M,&N,StochasticForcingCovarianceEnum); _assert_(M== dimtot); _assert_(N==dimtot);29 femmodel->parameters->FindParam(&covariance,&M,&N,StochasticForcingCovarianceEnum); _assert_(M==numtcov); _assert_(N==dimtot*dimtot); 27 30 28 31 /*Check if this is a timestep for new noiseterms computation*/ … … 45 48 46 49 /*Compute noise terms*/ 47 IssmDouble* noiseterms = xNew<IssmDouble>(dimtot); 50 IssmDouble* timestepcovariance = xNew<IssmDouble>(dimtot*dimtot); 51 IssmDouble* noiseterms = xNew<IssmDouble>(dimtot); 48 52 if(isstepforstoch){ 53 /*Find covariance to be applied at current time step*/ 54 int itime; 55 if(numtcov>1){ 56 for(int i=0;i<numtcov;i++){ 57 if(time>=timecovariance[i]) itime=i; 58 } 59 } 60 else itime=0; 61 for(int i=0;i<dimtot*dimtot;i++) timestepcovariance[i] = covariance[itime*dimtot*dimtot+i]; 49 62 my_rank=IssmComm::GetRank(); 50 63 if(my_rank==0){ … … 55 68 /*multivariateNormal needs to be passed a NULL pointer to avoid memory leak issues*/ 56 69 IssmDouble* temparray = NULL; 57 multivariateNormal(&temparray,dimtot,0.0, covariance,fixedseed);70 multivariateNormal(&temparray,dimtot,0.0,timestepcovariance,fixedseed); 58 71 for(int i=0;i<dimtot;i++) noiseterms[i]=temparray[i]; 59 72 xDelete<IssmDouble>(temparray); … … 233 246 xDelete<int>(dimensions); 234 247 xDelete<IssmDouble>(covariance); 248 xDelete<IssmDouble>(timecovariance); 249 xDelete<IssmDouble>(timestepcovariance); 235 250 xDelete<IssmDouble>(noiseterms); 236 251 }/*}}}*/ -
issm/trunk-jpl/src/c/shared/Enum/Enum.vim
r27758 r27780 507 507 syn keyword cConstant StochasticForcingNoisetermsEnum 508 508 syn keyword cConstant StochasticForcingNumFieldsEnum 509 syn keyword cConstant StochasticForcingNumTimesCovarianceEnum 509 510 syn keyword cConstant StochasticForcingRandomflagEnum 511 syn keyword cConstant StochasticForcingTimeCovarianceEnum 510 512 syn keyword cConstant StochasticForcingTimestepEnum 511 513 syn keyword cConstant SolidearthSettingsReltolEnum … … 1775 1777 syn keyword cType Cfsurfacesquaretransient 1776 1778 syn keyword cType Channel 1779 syn keyword cType classes 1777 1780 syn keyword cType Constraint 1778 1781 syn keyword cType Constraints … … 1782 1785 syn keyword cType ControlParam 1783 1786 syn keyword cType Covertree 1787 syn keyword cType DatasetInput 1784 1788 syn keyword cType DataSetParam 1785 syn keyword cType DatasetInput1786 1789 syn keyword cType Definition 1787 1790 syn keyword cType DependentObject … … 1796 1799 syn keyword cType ElementInput 1797 1800 syn keyword cType ElementMatrix 1801 syn keyword cType Elements 1798 1802 syn keyword cType ElementVector 1799 syn keyword cType Elements1800 1803 syn keyword cType ExponentialVariogram 1801 1804 syn keyword cType ExternalResult … … 1804 1807 syn keyword cType Friction 1805 1808 syn keyword cType Gauss 1809 syn keyword cType GaussianVariogram 1810 syn keyword cType gaussobjects 1806 1811 syn keyword cType GaussPenta 1807 1812 syn keyword cType GaussSeg 1808 1813 syn keyword cType GaussTetra 1809 1814 syn keyword cType GaussTria 1810 syn keyword cType GaussianVariogram1811 1815 syn keyword cType GenericExternalResult 1812 1816 syn keyword cType GenericOption … … 1825 1829 syn keyword cType IssmDirectApplicInterface 1826 1830 syn keyword cType IssmParallelDirectApplicInterface 1831 syn keyword cType krigingobjects 1827 1832 syn keyword cType Load 1828 1833 syn keyword cType Loads … … 1835 1840 syn keyword cType Matice 1836 1841 syn keyword cType Matlitho 1842 syn keyword cType matrixobjects 1837 1843 syn keyword cType MatrixParam 1838 1844 syn keyword cType Misfit … … 1847 1853 syn keyword cType Observations 1848 1854 syn keyword cType Option 1855 syn keyword cType Options 1849 1856 syn keyword cType OptionUtilities 1850 syn keyword cType Options1851 1857 syn keyword cType Param 1852 1858 syn keyword cType Parameters … … 1862 1868 syn keyword cType Regionaloutput 1863 1869 syn keyword cType Results 1870 syn keyword cType Riftfront 1864 1871 syn keyword cType RiftStruct 1865 syn keyword cType Riftfront1866 1872 syn keyword cType SealevelGeometry 1867 1873 syn keyword cType Seg 1868 1874 syn keyword cType SegInput 1875 syn keyword cType Segment 1869 1876 syn keyword cType SegRef 1870 syn keyword cType Segment1871 1877 syn keyword cType SpcDynamic 1872 1878 syn keyword cType SpcStatic … … 1887 1893 syn keyword cType Vertex 1888 1894 syn keyword cType Vertices 1889 syn keyword cType classes1890 syn keyword cType gaussobjects1891 syn keyword cType krigingobjects1892 syn keyword cType matrixobjects1893 1895 syn keyword cType AdjointBalancethickness2Analysis 1894 1896 syn keyword cType AdjointBalancethicknessAnalysis -
issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
r27758 r27780 501 501 StochasticForcingNoisetermsEnum, 502 502 StochasticForcingNumFieldsEnum, 503 StochasticForcingNumTimesCovarianceEnum, 503 504 StochasticForcingRandomflagEnum, 505 StochasticForcingTimeCovarianceEnum, 504 506 StochasticForcingTimestepEnum, 505 507 SolidearthSettingsReltolEnum, -
issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
r27758 r27780 509 509 case StochasticForcingNoisetermsEnum : return "StochasticForcingNoiseterms"; 510 510 case StochasticForcingNumFieldsEnum : return "StochasticForcingNumFields"; 511 case StochasticForcingNumTimesCovarianceEnum : return "StochasticForcingNumTimesCovariance"; 511 512 case StochasticForcingRandomflagEnum : return "StochasticForcingRandomflag"; 513 case StochasticForcingTimeCovarianceEnum : return "StochasticForcingTimeCovariance"; 512 514 case StochasticForcingTimestepEnum : return "StochasticForcingTimestep"; 513 515 case SolidearthSettingsReltolEnum : return "SolidearthSettingsReltol"; -
issm/trunk-jpl/src/c/shared/Enum/Enumjl.vim
r27758 r27780 500 500 syn keyword juliaConstC StochasticForcingNoisetermsEnum 501 501 syn keyword juliaConstC StochasticForcingNumFieldsEnum 502 syn keyword juliaConstC StochasticForcingNumTimesCovarianceEnum 502 503 syn keyword juliaConstC StochasticForcingRandomflagEnum 504 syn keyword juliaConstC StochasticForcingTimeCovarianceEnum 503 505 syn keyword juliaConstC StochasticForcingTimestepEnum 504 506 syn keyword juliaConstC SolidearthSettingsReltolEnum -
issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
r27758 r27780 521 521 else if (strcmp(name,"StochasticForcingNoiseterms")==0) return StochasticForcingNoisetermsEnum; 522 522 else if (strcmp(name,"StochasticForcingNumFields")==0) return StochasticForcingNumFieldsEnum; 523 else if (strcmp(name,"StochasticForcingNumTimesCovariance")==0) return StochasticForcingNumTimesCovarianceEnum; 523 524 else if (strcmp(name,"StochasticForcingRandomflag")==0) return StochasticForcingRandomflagEnum; 525 else if (strcmp(name,"StochasticForcingTimeCovariance")==0) return StochasticForcingTimeCovarianceEnum; 524 526 else if (strcmp(name,"StochasticForcingTimestep")==0) return StochasticForcingTimestepEnum; 525 527 else if (strcmp(name,"SolidearthSettingsReltol")==0) return SolidearthSettingsReltolEnum; … … 627 629 else if (strcmp(name,"SolutionType")==0) return SolutionTypeEnum; 628 630 else if (strcmp(name,"SteadystateMaxiter")==0) return SteadystateMaxiterEnum; 629 else if (strcmp(name,"SteadystateNumRequestedOutputs")==0) return SteadystateNumRequestedOutputsEnum;630 else if (strcmp(name,"SteadystateReltol")==0) return SteadystateReltolEnum;631 631 else stage=6; 632 632 } 633 633 if(stage==6){ 634 if (strcmp(name,"SteadystateRequestedOutputs")==0) return SteadystateRequestedOutputsEnum; 634 if (strcmp(name,"SteadystateNumRequestedOutputs")==0) return SteadystateNumRequestedOutputsEnum; 635 else if (strcmp(name,"SteadystateReltol")==0) return SteadystateReltolEnum; 636 else if (strcmp(name,"SteadystateRequestedOutputs")==0) return SteadystateRequestedOutputsEnum; 635 637 else if (strcmp(name,"Step")==0) return StepEnum; 636 638 else if (strcmp(name,"Steps")==0) return StepsEnum; … … 750 752 else if (strcmp(name,"BasalforcingsPicoOverturningCoeff")==0) return BasalforcingsPicoOverturningCoeffEnum; 751 753 else if (strcmp(name,"BasalforcingsPicoSubShelfOceanOverturning")==0) return BasalforcingsPicoSubShelfOceanOverturningEnum; 752 else if (strcmp(name,"BasalforcingsPicoSubShelfOceanSalinity")==0) return BasalforcingsPicoSubShelfOceanSalinityEnum;753 else if (strcmp(name,"BasalforcingsPicoSubShelfOceanTemp")==0) return BasalforcingsPicoSubShelfOceanTempEnum;754 754 else stage=7; 755 755 } 756 756 if(stage==7){ 757 if (strcmp(name,"BasalStressx")==0) return BasalStressxEnum; 757 if (strcmp(name,"BasalforcingsPicoSubShelfOceanSalinity")==0) return BasalforcingsPicoSubShelfOceanSalinityEnum; 758 else if (strcmp(name,"BasalforcingsPicoSubShelfOceanTemp")==0) return BasalforcingsPicoSubShelfOceanTempEnum; 759 else if (strcmp(name,"BasalStressx")==0) return BasalStressxEnum; 758 760 else if (strcmp(name,"BasalStressy")==0) return BasalStressyEnum; 759 761 else if (strcmp(name,"BasalStress")==0) return BasalStressEnum; … … 873 875 else if (strcmp(name,"UGia")==0) return UGiaEnum; 874 876 else if (strcmp(name,"UGiaRate")==0) return UGiaRateEnum; 875 else if (strcmp(name,"Gradient")==0) return GradientEnum;876 else if (strcmp(name,"GroundinglineHeight")==0) return GroundinglineHeightEnum;877 877 else stage=8; 878 878 } 879 879 if(stage==8){ 880 if (strcmp(name,"HydraulicPotential")==0) return HydraulicPotentialEnum; 880 if (strcmp(name,"Gradient")==0) return GradientEnum; 881 else if (strcmp(name,"GroundinglineHeight")==0) return GroundinglineHeightEnum; 882 else if (strcmp(name,"HydraulicPotential")==0) return HydraulicPotentialEnum; 881 883 else if (strcmp(name,"HydraulicPotentialOld")==0) return HydraulicPotentialOldEnum; 882 884 else if (strcmp(name,"HydrologyBasalFlux")==0) return HydrologyBasalFluxEnum; … … 996 998 else if (strcmp(name,"SealevelBarystaticHydroLatbar")==0) return SealevelBarystaticHydroLatbarEnum; 997 999 else if (strcmp(name,"SealevelBarystaticHydroLongbar")==0) return SealevelBarystaticHydroLongbarEnum; 998 else if (strcmp(name,"SealevelBarystaticHydroLoad")==0) return SealevelBarystaticHydroLoadEnum;999 else if (strcmp(name,"SealevelBarystaticBpMask")==0) return SealevelBarystaticBpMaskEnum;1000 1000 else stage=9; 1001 1001 } 1002 1002 if(stage==9){ 1003 if (strcmp(name,"SealevelBarystaticBpWeights")==0) return SealevelBarystaticBpWeightsEnum; 1003 if (strcmp(name,"SealevelBarystaticHydroLoad")==0) return SealevelBarystaticHydroLoadEnum; 1004 else if (strcmp(name,"SealevelBarystaticBpMask")==0) return SealevelBarystaticBpMaskEnum; 1005 else if (strcmp(name,"SealevelBarystaticBpWeights")==0) return SealevelBarystaticBpWeightsEnum; 1004 1006 else if (strcmp(name,"SealevelBarystaticBpArea")==0) return SealevelBarystaticBpAreaEnum; 1005 1007 else if (strcmp(name,"SealevelBarystaticBpLoad")==0) return SealevelBarystaticBpLoadEnum; … … 1119 1121 else if (strcmp(name,"SmbIsInitialized")==0) return SmbIsInitializedEnum; 1120 1122 else if (strcmp(name,"SmbMAdd")==0) return SmbMAddEnum; 1121 else if (strcmp(name,"SmbMassBalance")==0) return SmbMassBalanceEnum;1122 else if (strcmp(name,"SmbMassBalanceSnow")==0) return SmbMassBalanceSnowEnum;1123 1123 else stage=10; 1124 1124 } 1125 1125 if(stage==10){ 1126 if (strcmp(name,"SmbMassBalanceIce")==0) return SmbMassBalanceIceEnum; 1126 if (strcmp(name,"SmbMassBalance")==0) return SmbMassBalanceEnum; 1127 else if (strcmp(name,"SmbMassBalanceSnow")==0) return SmbMassBalanceSnowEnum; 1128 else if (strcmp(name,"SmbMassBalanceIce")==0) return SmbMassBalanceIceEnum; 1127 1129 else if (strcmp(name,"SmbMassBalanceSemic")==0) return SmbMassBalanceSemicEnum; 1128 1130 else if (strcmp(name,"SmbMassBalanceSubstep")==0) return SmbMassBalanceSubstepEnum; … … 1242 1244 else if (strcmp(name,"ThicknessResidual")==0) return ThicknessResidualEnum; 1243 1245 else if (strcmp(name,"TransientAccumulatedDeltaIceThickness")==0) return TransientAccumulatedDeltaIceThicknessEnum; 1244 else if (strcmp(name,"Vel")==0) return VelEnum;1245 else if (strcmp(name,"VxAverage")==0) return VxAverageEnum;1246 1246 else stage=11; 1247 1247 } 1248 1248 if(stage==11){ 1249 if (strcmp(name,"VxBase")==0) return VxBaseEnum; 1249 if (strcmp(name,"Vel")==0) return VelEnum; 1250 else if (strcmp(name,"VxAverage")==0) return VxAverageEnum; 1251 else if (strcmp(name,"VxBase")==0) return VxBaseEnum; 1250 1252 else if (strcmp(name,"VxDebris")==0) return VxDebrisEnum; 1251 1253 else if (strcmp(name,"Vx")==0) return VxEnum; … … 1365 1367 else if (strcmp(name,"Outputdefinition82")==0) return Outputdefinition82Enum; 1366 1368 else if (strcmp(name,"Outputdefinition83")==0) return Outputdefinition83Enum; 1367 else if (strcmp(name,"Outputdefinition84")==0) return Outputdefinition84Enum;1368 else if (strcmp(name,"Outputdefinition85")==0) return Outputdefinition85Enum;1369 1369 else stage=12; 1370 1370 } 1371 1371 if(stage==12){ 1372 if (strcmp(name,"Outputdefinition86")==0) return Outputdefinition86Enum; 1372 if (strcmp(name,"Outputdefinition84")==0) return Outputdefinition84Enum; 1373 else if (strcmp(name,"Outputdefinition85")==0) return Outputdefinition85Enum; 1374 else if (strcmp(name,"Outputdefinition86")==0) return Outputdefinition86Enum; 1373 1375 else if (strcmp(name,"Outputdefinition87")==0) return Outputdefinition87Enum; 1374 1376 else if (strcmp(name,"Outputdefinition88")==0) return Outputdefinition88Enum; … … 1488 1490 else if (strcmp(name,"ExtrudeFromBaseAnalysis")==0) return ExtrudeFromBaseAnalysisEnum; 1489 1491 else if (strcmp(name,"ExtrudeFromTopAnalysis")==0) return ExtrudeFromTopAnalysisEnum; 1490 else if (strcmp(name,"FSApproximation")==0) return FSApproximationEnum;1491 else if (strcmp(name,"FSSolver")==0) return FSSolverEnum;1492 1492 else stage=13; 1493 1493 } 1494 1494 if(stage==13){ 1495 if (strcmp(name,"FSpressure")==0) return FSpressureEnum; 1495 if (strcmp(name,"FSApproximation")==0) return FSApproximationEnum; 1496 else if (strcmp(name,"FSSolver")==0) return FSSolverEnum; 1497 else if (strcmp(name,"FSpressure")==0) return FSpressureEnum; 1496 1498 else if (strcmp(name,"FSvelocity")==0) return FSvelocityEnum; 1497 1499 else if (strcmp(name,"FemModel")==0) return FemModelEnum; … … 1611 1613 else if (strcmp(name,"Matestar")==0) return MatestarEnum; 1612 1614 else if (strcmp(name,"Matice")==0) return MaticeEnum; 1613 else if (strcmp(name,"Matlitho")==0) return MatlithoEnum;1614 else if (strcmp(name,"Mathydro")==0) return MathydroEnum;1615 1615 else stage=14; 1616 1616 } 1617 1617 if(stage==14){ 1618 if (strcmp(name,"MatrixParam")==0) return MatrixParamEnum; 1618 if (strcmp(name,"Matlitho")==0) return MatlithoEnum; 1619 else if (strcmp(name,"Mathydro")==0) return MathydroEnum; 1620 else if (strcmp(name,"MatrixParam")==0) return MatrixParamEnum; 1619 1621 else if (strcmp(name,"MaxAbsVx")==0) return MaxAbsVxEnum; 1620 1622 else if (strcmp(name,"MaxAbsVy")==0) return MaxAbsVyEnum; … … 1734 1736 else if (strcmp(name,"Sset")==0) return SsetEnum; 1735 1737 else if (strcmp(name,"StatisticsSolution")==0) return StatisticsSolutionEnum; 1736 else if (strcmp(name,"SteadystateSolution")==0) return SteadystateSolutionEnum;1737 else if (strcmp(name,"StressIntensityFactor")==0) return StressIntensityFactorEnum;1738 1738 else stage=15; 1739 1739 } 1740 1740 if(stage==15){ 1741 if (strcmp(name,"StressbalanceAnalysis")==0) return StressbalanceAnalysisEnum; 1741 if (strcmp(name,"SteadystateSolution")==0) return SteadystateSolutionEnum; 1742 else if (strcmp(name,"StressIntensityFactor")==0) return StressIntensityFactorEnum; 1743 else if (strcmp(name,"StressbalanceAnalysis")==0) return StressbalanceAnalysisEnum; 1742 1744 else if (strcmp(name,"StressbalanceConvergenceNumSteps")==0) return StressbalanceConvergenceNumStepsEnum; 1743 1745 else if (strcmp(name,"StressbalanceSIAAnalysis")==0) return StressbalanceSIAAnalysisEnum; -
issm/trunk-jpl/src/m/classes/stochasticforcing.m
r27484 r27780 11 11 default_id = NaN; 12 12 covariance = NaN; 13 timecovariance = NaN; 13 14 stochastictimestep = 0; 14 15 randomflag = 1; … … 40 41 end 41 42 42 %Check that covariance matrix is positive definite 43 try 44 chol(self.covariance); 45 catch 46 error('md.stochasticforcing.covariance is not positive definite'); 43 44 if(numel(size(self.covariance)==3)) 45 numtcovmat = numel(self.covariance(1,1,:)); %number of covariance matrices in time 46 lsCovmats = {}; 47 for ii=[1:numtcovmat] %loop over 3rd dimension 48 lsCovmats{ii} = self.covariance(:,:,ii); 49 %Check that covariance matrix is positive definite 50 try 51 chol(self.covariance(:,:,ii)); 52 catch 53 error('an entry in md.stochasticforcing.covariance is not positive definite'); 54 end 55 end 56 elseif(numel(size(self.covariance)==2)) 57 numtcovmat = 1; %number of covariance matrices in time 58 lsCovmats = {self.covariance}; 59 %Check that covariance matrix is positive definite 60 try 61 chol(self.covariance); 62 catch 63 error('md.stochasticforcing.covariance is not positive definite'); 64 end 47 65 end 48 66 … … 176 194 if(indPwarma~=-1) 177 195 if(md.basalforcings.arma_timestep~=md.hydrology.arma_timestep) 178 crossentries = reshape(self.covariance(1+sum(dimensions(1:indBDWarma-1)):sum(dimensions(1:indBDWarma)),1+sum(dimensions(1:indPwarma-1)):sum(dimensions(1:indPwarma))),1,[]); 179 if any(crossentries~=0) 180 error('BasalforcingsDeepwaterMeltingRatearma and hydrologyarmapw have different arma_timestep and non-zero covariance'); 196 for(ii=[1:numel(lsCovmats)]) 197 covm = lsCovmats{ii}; 198 crossentries = reshape(covm(1+sum(dimensions(1:indBDWarma-1)):sum(dimensions(1:indBDWarma)),1+sum(dimensions(1:indPwarma-1)):sum(dimensions(1:indPwarma))),1,[]); 199 if any(crossentries~=0) 200 error('BasalforcingsDeepwaterMeltingRatearma and hydrologyarmapw have different arma_timestep and non-zero covariance'); 201 end 181 202 end 182 203 end 183 204 elseif(indSdarma~=-1) 184 205 if(md.frontalforcings.sd_arma_timestep~=md.basalforcings.arma_timestep) 185 crossentries = reshape(self.covariance(1+sum(dimensions(1:indSdarma-1)):sum(dimensions(1:indSdarma)),1+sum(dimensions(1:indBDWarma-1)):sum(dimensions(1:indBDWarma))),1,[]); 186 if any(crossentries~=0) 187 error('FrontalForcingsSubglacialDischargearma and BasalforcingsDeepwaterMeltingRatearma have different arma_timestep and non-zero covariance'); 206 for(ii=[1:numel(lsCovmats)]) 207 covm = lsCovmats{ii}; 208 crossentries = reshape(covm(1+sum(dimensions(1:indSdarma-1)):sum(dimensions(1:indSdarma)),1+sum(dimensions(1:indBDWarma-1)):sum(dimensions(1:indBDWarma))),1,[]); 209 if any(crossentries~=0) 210 error('FrontalForcingsSubglacialDischargearma and BasalforcingsDeepwaterMeltingRatearma have different arma_timestep and non-zero covariance'); 211 end 188 212 end 189 213 end 190 214 elseif(indSMBarma~=-1) 191 215 if(md.smb.arma_timestep~=md.basalforcings.arma_timestep) 192 crossentries = reshape(self.covariance(1+sum(dimensions(1:indSMBarma-1)):sum(dimensions(1:indSMBarma)),1+sum(dimensions(1:indBDWarma-1)):sum(dimensions(1:indBDWarma))),1,[]); 193 if any(crossentries~=0) 194 error('SMBarma and BasalforcingsDeepwaterMeltingRatearma have different arma_timestep and non-zero covariance'); 216 for(ii=[1:numel(lsCovmats)]) 217 covm = lsCovmats{ii}; 218 crossentries = reshape(covm(1+sum(dimensions(1:indSMBarma-1)):sum(dimensions(1:indSMBarma)),1+sum(dimensions(1:indBDWarma-1)):sum(dimensions(1:indBDWarma))),1,[]); 219 if any(crossentries~=0) 220 error('SMBarma and BasalforcingsDeepwaterMeltingRatearma have different arma_timestep and non-zero covariance'); 221 end 195 222 end 196 223 end 197 224 elseif(indTFarma~=-1) 198 225 if(md.frontalforcings.arma_timestep~=md.basalforcings.arma_timestep) 199 crossentries = reshape(self.covariance(1+sum(dimensions(1:indTFarma-1)):sum(dimensions(1:indTFarma)),1+sum(dimensions(1:indBDWarma-1)):sum(dimensions(1:indBDWarma))),1,[]); 200 if any(crossentries~=0) 201 error('FrontalForcingsRignotarma and BasalforcingsDeepwaterMeltingRatearma have different arma_timestep and non-zero covariance'); 226 for(ii=[1:numel(lsCovmats)]) 227 covm = lsCovmats{ii}; 228 crossentries = reshape(covm(1+sum(dimensions(1:indTFarma-1)):sum(dimensions(1:indTFarma)),1+sum(dimensions(1:indBDWarma-1)):sum(dimensions(1:indBDWarma))),1,[]); 229 if any(crossentries~=0) 230 error('FrontalForcingsRignotarma and BasalforcingsDeepwaterMeltingRatearma have different arma_timestep and non-zero covariance'); 231 end 202 232 end 203 233 end … … 206 236 if(indSdarma~=-1) 207 237 if(md.frontalforcings.sd_arma_timestep~=md.hydrology.arma_timestep) 208 crossentries = reshape(self.covariance(1+sum(dimensions(1:indSdarma-1)):sum(dimensions(1:indSdarma)),1+sum(dimensions(1:indPwarma-1)):sum(dimensions(1:indPwarma))),1,[]); 209 if any(crossentries~=0) 210 error('FrontalForcingsSubglacialDischargearma and hydrologyarmapw have different arma_timestep and non-zero covariance'); 238 for(ii=[1:numel(lsCovmats)]) 239 covm = lsCovmats{ii}; 240 crossentries = reshape(covm(1+sum(dimensions(1:indSdarma-1)):sum(dimensions(1:indSdarma)),1+sum(dimensions(1:indPwarma-1)):sum(dimensions(1:indPwarma))),1,[]); 241 if any(crossentries~=0) 242 error('FrontalForcingsSubglacialDischargearma and hydrologyarmapw have different arma_timestep and non-zero covariance'); 243 end 211 244 end 212 245 end 213 246 elseif(indSMBarma~=-1) 214 247 if(md.smb.arma_timestep~=md.hydrology.arma_timestep) 215 crossentries = reshape(self.covariance(1+sum(dimensions(1:indSMBarma-1)):sum(dimensions(1:indSMBarma)),1+sum(dimensions(1:indPwarma-1)):sum(dimensions(1:indPwarma))),1,[]); 216 if any(crossentries~=0) 217 error('SMBarma and hydrologyarmapw have different arma_timestep and non-zero covariance'); 248 for(ii=[1:numel(lsCovmats)]) 249 covm = lsCovmats{ii}; 250 crossentries = reshape(covm(1+sum(dimensions(1:indSMBarma-1)):sum(dimensions(1:indSMBarma)),1+sum(dimensions(1:indPwarma-1)):sum(dimensions(1:indPwarma))),1,[]); 251 if any(crossentries~=0) 252 error('SMBarma and hydrologyarmapw have different arma_timestep and non-zero covariance'); 253 end 218 254 end 219 255 end 220 256 elseif(indTFarma~=-1) 221 257 if(md.frontalforcings.arma_timestep~=md.hydrology.arma_timestep) 222 crossentries = reshape(self.covariance(1+sum(dimensions(1:indTFarma-1)):sum(dimensions(1:indTFarma)),1+sum(dimensions(1:indPwarma-1)):sum(dimensions(1:indPwarma))),1,[]); 223 if any(crossentries~=0) 224 error('FrontalForcingsRignotarma and hydrologyarmapw have different arma_timestep and non-zero covariance'); 258 for(ii=[1:numel(lsCovmats)]) 259 covm = lsCovmats{ii}; 260 crossentries = reshape(covm(1+sum(dimensions(1:indTFarma-1)):sum(dimensions(1:indTFarma)),1+sum(dimensions(1:indPwarma-1)):sum(dimensions(1:indPwarma))),1,[]); 261 if any(crossentries~=0) 262 error('FrontalForcingsRignotarma and hydrologyarmapw have different arma_timestep and non-zero covariance'); 263 end 225 264 end 226 265 end … … 229 268 if(indSMBarma~=-1) 230 269 if(md.smb.arma_timestep~=md.frontalforcings.sd_arma_timestep) 231 crossentries = reshape(self.covariance(1+sum(dimensions(1:indSMBarma-1)):sum(dimensions(1:indSMBarma)),1+sum(dimensions(1:indSdarma-1)):sum(dimensions(1:indSdarma))),1,[]); 232 if any(crossentries~=0) 233 error('SMBarma and FrontalForcingsSubglacialDischargearma have different arma_timestep and non-zero covariance'); 270 for(ii=[1:numel(lsCovmats)]) 271 covm = lsCovmats{ii}; 272 crossentries = reshape(covm(1+sum(dimensions(1:indSMBarma-1)):sum(dimensions(1:indSMBarma)),1+sum(dimensions(1:indSdarma-1)):sum(dimensions(1:indSdarma))),1,[]); 273 if any(crossentries~=0) 274 error('SMBarma and FrontalForcingsSubglacialDischargearma have different arma_timestep and non-zero covariance'); 275 end 234 276 end 235 277 end 236 278 elseif(indTFarma~=-1) 237 279 if(md.frontalforcings.sd_arma_timestep~=md.frontalforcings.arma_timestep) 238 crossentries = reshape(self.covariance(1+sum(dimensions(1:indSdarma-1)):sum(dimensions(1:indSdarma)),1+sum(dimensions(1:indTFarma-1)):sum(dimensions(1:indTFarma))),1,[]); 239 if any(crossentries~=0) 240 error('FrontalForcingsRignotarma and FrontalForcingsSubglacialDischargearma have different arma_timestep and non-zero covariance'); 280 for(ii=[1:numel(lsCovmats)]) 281 covm = lsCovmats{ii}; 282 crossentries = reshape(covm(1+sum(dimensions(1:indSdarma-1)):sum(dimensions(1:indSdarma)),1+sum(dimensions(1:indTFarma-1)):sum(dimensions(1:indTFarma))),1,[]); 283 if any(crossentries~=0) 284 error('FrontalForcingsRignotarma and FrontalForcingsSubglacialDischargearma have different arma_timestep and non-zero covariance'); 285 end 241 286 end 242 287 end … … 245 290 if(indTFarma~=-1) 246 291 if(md.smb.arma_timestep~=md.frontalforcings.arma_timestep) 247 crossentries = reshape(self.covariance(1+sum(dimensions(1:indSMBarma-1)):sum(dimensions(1:indSMBarma)),1+sum(dimensions(1:indTFarma-1)):sum(dimensions(1:indTFarma))),1,[]); 248 if any(crossentries~=0) 249 error('SMBarma and FrontalForcingsRignotarma have different arma_timestep and non-zero covariance'); 292 for(ii=[1:numel(lsCovmats)]) 293 covm = lsCovmats{ii}; 294 crossentries = reshape(covm(1+sum(dimensions(1:indSMBarma-1)):sum(dimensions(1:indSMBarma)),1+sum(dimensions(1:indTFarma-1)):sum(dimensions(1:indTFarma))),1,[]); 295 if any(crossentries~=0) 296 error('SMBarma and FrontalForcingsRignotarma have different arma_timestep and non-zero covariance'); 297 end 250 298 end 251 299 end … … 256 304 md = checkfield(md,'fieldname','stochasticforcing.isstochasticforcing','values',[0 1]); 257 305 md = checkfield(md,'fieldname','stochasticforcing.fields','numel',num_fields,'cell',1,'values',supportedstochforcings()); 258 md = checkfield(md,'fieldname','stochasticforcing.covariance','NaN',1,'Inf',1,'size',[size_tot,size_tot ]); %global covariance matrix306 md = checkfield(md,'fieldname','stochasticforcing.covariance','NaN',1,'Inf',1,'size',[size_tot,size_tot,numtcovmat]); %global covariance matrix 259 307 md = checkfield(md,'fieldname','stochasticforcing.stochastictimestep','NaN',1,'Inf',1,'>=',md.timestepping.time_step); 260 308 md = checkfield(md,'fieldname','stochasticforcing.randomflag','numel',[1],'values',[0 1]); 309 if(numtcovmat>1) %check the time steps at which each covariance matrix starts to be applied 310 md = checkfield(md,'fieldname','stochasticforcing.timecovariance','NaN',1,'Inf',1,'>=',md.timestepping.start_time,'<=',md.timestepping.final_time,'size',[1,numtcovmat]); 311 end 261 312 if(checkdefaults) %need to check the defaults 262 313 md = checkfield(md,'fieldname','stochasticforcing.defaultdimension','numel',1,'NaN',1,'Inf',1,'>',0); … … 270 321 fielddisplay(self,'defaultdimension','dimensionality of the noise terms (does not apply to fields with their specific dimension)'); 271 322 fielddisplay(self,'default_id','id of each element for partitioning of the noise terms (does not apply to fields with their specific partition)'); 272 fielddisplay(self,'covariance','covariance matrix for within- and between-fields covariance (units must be squared field units)'); 323 fielddisplay(self,'covariance',{'covariance matrix for within- and between-fields covariance (units must be squared field units)','multiple matrices can be concatenated along 3rd dimension to apply different covariances in time'}); 324 fielddisplay(self,'timecovariance','starting dates at which covariances apply (only applicabe if multiple covariance matrices are prescribed)'); 273 325 fielddisplay(self,'stochastictimestep','timestep at which new stochastic noise terms are generated (default: md.timestepping.time_step)'); 274 326 fielddisplay(self,'randomflag','whether to apply real randomness (true) or pseudo-randomness with fixed seed (false)'); … … 325 377 end 326 378 379 if(numel(size(self.covariance)==3)) 380 [nrow,ncol,numtcovmat] = size(self.covariance); 381 lsCovmats = {}; 382 for ii=[1:numtcovmat] %loop over 3rd dimension 383 lsCovmats{ii} = self.covariance(:,:,ii); 384 end 385 if(md.timestepping.interp_forcing==1) 386 disp('WARNING: md.timestepping.interp_forcing is 1, but be aware that there is no interpolation between covariance matrices'); 387 disp(' the changes between covariance matrices occur at the time steps specified in md.stochasticforcing.timecovariance'); 388 end 389 elseif(numel(size(self.covariance)==2)) 390 [nrow,ncol] = size(self.covariance); 391 numtcovmat = 1; %number of covariance matrices in time 392 lsCovmats = {self.covariance}; 393 end 394 327 395 %Scaling covariance matrix (scale column-by-column and row-by-row) 328 396 scaledfields = {'BasalforcingsDeepwaterMeltingRatearma','BasalforcingsSpatialDeepwaterMeltingRate','DefaultCalving','FloatingMeltRate','SMBarma','SMBforcing'}; %list of fields that need scaling *1/yts 329 tempcovariance = self.covariance; %copy of covariance to avoid writing back in member variable 330 for i=1:num_fields 331 if any(strcmp(scaledfields,self.fields(i))) 332 inds = [1+sum(dimensions(1:i-1)):1:sum(dimensions(1:i))]; 333 for row=inds %scale rows corresponding to scaled field 334 tempcovariance(row,:) = 1./yts*tempcovariance(row,:); 335 end 336 for col=inds %scale columns corresponding to scaled field 337 tempcovariance(:,col) = 1./yts*tempcovariance(:,col); 338 end 397 tempcovariance2d = zeros(numtcovmat,sum(nrow*ncol)); %covariance matrices in 2d array 398 % Loop over covariance matrices % 399 for kk=[1:numtcovmat] 400 kkcov = self.covariance(:,:,kk); %extract covariance at index kk 401 % Loop over the fields % 402 for i=1:num_fields 403 if any(strcmp(scaledfields,self.fields(i))) 404 inds = [1+sum(dimensions(1:i-1)):1:sum(dimensions(1:i))]; 405 for row=inds %scale rows corresponding to scaled field 406 kkcov(row,:) = 1./yts*kkcov(row,:); 407 end 408 for col=inds %scale columns corresponding to scaled field 409 kkcov(:,col) = 1./yts*kkcov(:,col); 410 end 411 end 412 end 413 % Save scaled covariance % 414 for rr=[1:nrow] 415 ind0 = 1+(rr-1)*ncol; 416 tempcovariance2d(kk,ind0:ind0+ncol-1) = kkcov(rr,:); 339 417 end 340 418 end … … 342 420 if isnan(self.default_id) 343 421 self.default_id = zeros(md.mesh.numberofelements,1); 422 end 423 %Set dummy timecovariance vector if a single covariance matrix is used 424 if(numtcovmat==1) 425 self.timecovariance = [md.timestepping.start_time]; 344 426 end 345 427 … … 349 431 WriteData(fid,prefix,'object',self,'fieldname','default_id','data',self.default_id-1,'format','IntMat','mattype',2); %0-indexed 350 432 WriteData(fid,prefix,'object',self,'fieldname','defaultdimension','format','Integer'); 351 WriteData(fid,prefix,'data',tempcovariance,'name','md.stochasticforcing.covariance','format','DoubleMat'); 433 WriteData(fid,prefix,'data',numtcovmat,'name','md.stochasticforcing.num_timescovariance','format','Integer'); 434 WriteData(fid,prefix,'data',tempcovariance2d,'name','md.stochasticforcing.covariance','format','DoubleMat'); 435 WriteData(fid,prefix,'object',self,'fieldname','timecovariance','format','DoubleMat','scale',yts); 352 436 WriteData(fid,prefix,'object',self,'fieldname','stochastictimestep','format','Double','scale',yts); 353 437 WriteData(fid,prefix,'object',self,'fieldname','randomflag','format','Boolean'); -
issm/trunk-jpl/src/m/classes/stochasticforcing.py
r27531 r27780 19 19 self.default_id = np.nan 20 20 self.covariance = np.nan 21 self.timecovariance = np.nan 21 22 self.stochastictimestep = 0 22 23 self.randomflag = 1 … … 33 34 s += '{}\n'.format(fielddisplay(self, 'defaultdimension', 'dimensionality of the noise terms (does not apply to fields with their specific dimension)')) 34 35 s += '{}\n'.format(fielddisplay(self, 'default_id', 'id of each element for partitioning of the noise terms (does not apply to fields with their specific partition)')) 35 s += '{}\n'.format(fielddisplay(self, 'covariance', 'covariance matrix for within- and between-fields covariance (units must be squared field units)')) 36 s += '{}\n'.format(fielddisplay(self, 'covariance', 'covariance matrix for within- and between-fields covariance (units must be squared field units),multiple matrices can be concatenated along 3rd dimension to apply different covariances in time')) 37 s += '{}\n'.format(fielddisplay(self, 'timecovariance', 'starting dates at which covariances apply (only applicabe if multiple covariance matrices are prescribed)')) 36 38 s += '{}\n'.format(fielddisplay(self, 'stochastictimestep', 'timestep at which new stochastic noise terms are generated (default: md.timestepping.time_step)')) 37 39 s += '{}\n'.format(fielddisplay(self, 'randomflag', 'whether to apply real randomness (true) or pseudo-randomness with fixed seed (false)')) … … 69 71 print(' stochasticforcing.stocahstictimestep not specified: set to md.timestepping.time_step') 70 72 71 # Check that covariance matrix is positive definite (this is done internally by linalg) 72 try: 73 np.linalg.cholesky(self.covariance) 74 except: 75 raise TypeError('md.stochasticforcing.covariance is not positive definite') 73 if(len(np.shape(self.covariance))==3): 74 numtcovmat = np.shape(self.covariance)[2] #number of covariance matrices in time 75 lsCovmats = [] 76 for ii in range(numtcovmat): 77 lsCovmats.append(self.covariance[:,:,ii]) 78 try: 79 np.linalg.cholesky(self.covariance[:,:,ii]) 80 except: 81 raise TypeError('an entry in md.stochasticforcing.covariance is not positive definite') 82 elif(len(np.shape(self.covariance))==2): 83 numtcovmat = 1 84 lsCovmats = [self.covariance] 85 # Check that covariance matrix is positive definite (this is done internally by linalg) 86 try: 87 np.linalg.cholesky(self.covariance) 88 except: 89 raise TypeError('md.stochasticforcing.covariance is not positive definite') 76 90 77 91 # Check that all fields agree with the corresponding md class and if any field needs the default params … … 171 185 if indBDWarma != -1: 172 186 if indPwarma != -1: 173 covsum = self.covariance[np.sum(dimensions[0:indBDWarma]).astype(int):np.sum(dimensions[0:indBDWarma + 1]).astype(int), np.sum(dimensions[0:indPwarma]).astype(int):np.sum(dimensions[0:indPwarma + 1]).astype(int)] 174 if md.smb.arma_timestep != md.hydrology.arma_timestep and np.any(covsum != 0): 175 raise IOError('BasalforcingsDeepwaterMeltingRatarma and hydrologyarmapw have different arma_timestep and non-zero covariance') 187 for ii in range(len(lsCovmats)): 188 covm = lsCovmats[ii] 189 covsum = covm[np.sum(dimensions[0:indBDWarma]).astype(int):np.sum(dimensions[0:indBDWarma + 1]).astype(int), np.sum(dimensions[0:indPwarma]).astype(int):np.sum(dimensions[0:indPwarma + 1]).astype(int)] 190 if md.smb.arma_timestep != md.hydrology.arma_timestep and np.any(covsum != 0): 191 raise IOError('BasalforcingsDeepwaterMeltingRatarma and hydrologyarmapw have different arma_timestep and non-zero covariance') 176 192 elif indSdarma != -1: 177 covsum = self.covariance[np.sum(dimensions[0:indSdarma]).astype(int):np.sum(dimensions[0:indSdarma + 1]).astype(int), np.sum(dimensions[0:indBDWarma]).astype(int):np.sum(dimensions[0:indBDWarma + 1]).astype(int)] 178 if md.frontalforcings.sd_arma_timestep != md.basalforcings.arma_timestep and np.any(covsum != 0): 179 raise IOError('FrontalForcingsSubglacialDischargearma and BasalforcingsDeepwaterMeltingRatearma have different arma_timestep and non-zero covariance') 193 for ii in range(len(lsCovmats)): 194 covm = lsCovmats[ii] 195 covsum = covm[np.sum(dimensions[0:indSdarma]).astype(int):np.sum(dimensions[0:indSdarma + 1]).astype(int), np.sum(dimensions[0:indBDWarma]).astype(int):np.sum(dimensions[0:indBDWarma + 1]).astype(int)] 196 if md.frontalforcings.sd_arma_timestep != md.basalforcings.arma_timestep and np.any(covsum != 0): 197 raise IOError('FrontalForcingsSubglacialDischargearma and BasalforcingsDeepwaterMeltingRatearma have different arma_timestep and non-zero covariance') 180 198 elif indSMBarma != -1: 181 covsum = self.covariance[np.sum(dimensions[0:indSMBarma]).astype(int):np.sum(dimensions[0:indSMBarma + 1]).astype(int), np.sum(dimensions[0:indBDWarma]).astype(int):np.sum(dimensions[0:indBDWarma + 1]).astype(int)] 182 if md.smb.arma_timestep != md.basalforcings.arma_timestep and np.any(covsum != 0): 183 raise IOError('SMBarma and BasalforcingsDeepwaterMeltingRatearma have different arma_timestep and non-zero covariance') 199 for ii in range(len(lsCovmats)): 200 covm = lsCovmats[ii] 201 covsum = covm[np.sum(dimensions[0:indSMBarma]).astype(int):np.sum(dimensions[0:indSMBarma + 1]).astype(int), np.sum(dimensions[0:indBDWarma]).astype(int):np.sum(dimensions[0:indBDWarma + 1]).astype(int)] 202 if md.smb.arma_timestep != md.basalforcings.arma_timestep and np.any(covsum != 0): 203 raise IOError('SMBarma and BasalforcingsDeepwaterMeltingRatearma have different arma_timestep and non-zero covariance') 184 204 elif indTFarma != -1: 185 covsum = self.covariance[np.sum(dimensions[0:indTFarma]).astype(int):np.sum(dimensions[0:indTFarma + 1]).astype(int), np.sum(dimensions[0:indBDWarma]).astype(int):np.sum(dimensions[0:indBDWarma + 1]).astype(int)] 186 if md.frontalforcings.arma_timestep != md.basalforcings.arma_timestep and np.any(covsum != 0): 187 raise IOError('FrontalForcingsRignotarma and BasalforcingsDeepwaterMeltingRatearma have different arma_timestep and non-zero covariance') 205 for ii in range(len(lsCovmats)): 206 covm = lsCovmats[ii] 207 covsum = covm[np.sum(dimensions[0:indTFarma]).astype(int):np.sum(dimensions[0:indTFarma + 1]).astype(int), np.sum(dimensions[0:indBDWarma]).astype(int):np.sum(dimensions[0:indBDWarma + 1]).astype(int)] 208 if md.frontalforcings.arma_timestep != md.basalforcings.arma_timestep and np.any(covsum != 0): 209 raise IOError('FrontalForcingsRignotarma and BasalforcingsDeepwaterMeltingRatearma have different arma_timestep and non-zero covariance') 188 210 elif indPwarma != -1: 189 211 if indSdarma != -1: 190 covsum = self.covariance[np.sum(dimensions[0:indSdarma]).astype(int):np.sum(dimensions[0:indSdarma + 1]).astype(int), np.sum(dimensions[0:indPwarma]).astype(int):np.sum(dimensions[0:indPwarma + 1]).astype(int)] 191 if md.frontalforcings.sd_arma_timestep != md.hydrology.arma_timestep and np.any(covsum != 0): 192 raise IOError('FrontalForingsSubglacialDischargearma and hydrologyarmapw have different arma_timestep and non-zero covariance') 212 for ii in range(len(lsCovmats)): 213 covm = lsCovmats[ii] 214 covsum = covm[np.sum(dimensions[0:indSdarma]).astype(int):np.sum(dimensions[0:indSdarma + 1]).astype(int), np.sum(dimensions[0:indPwarma]).astype(int):np.sum(dimensions[0:indPwarma + 1]).astype(int)] 215 if md.frontalforcings.sd_arma_timestep != md.hydrology.arma_timestep and np.any(covsum != 0): 216 raise IOError('FrontalForingsSubglacialDischargearma and hydrologyarmapw have different arma_timestep and non-zero covariance') 193 217 elif indSMBarma != -1: 194 covsum = self.covariance[np.sum(dimensions[0:indSMBarma]).astype(int):np.sum(dimensions[0:indSMBarma + 1]).astype(int), np.sum(dimensions[0:indPwarma]).astype(int):np.sum(dimensions[0:indPwarma + 1]).astype(int)] 195 if md.smb.arma_timestep != md.hydrology.arma_timestep and np.any(covsum != 0): 196 raise IOError('SMBarma and hydrologyarmapw have different arma_timestep and non-zero covariance') 218 for ii in range(len(lsCovmats)): 219 covm = lsCovmats[ii] 220 covsum = covm[np.sum(dimensions[0:indSMBarma]).astype(int):np.sum(dimensions[0:indSMBarma + 1]).astype(int), np.sum(dimensions[0:indPwarma]).astype(int):np.sum(dimensions[0:indPwarma + 1]).astype(int)] 221 if md.smb.arma_timestep != md.hydrology.arma_timestep and np.any(covsum != 0): 222 raise IOError('SMBarma and hydrologyarmapw have different arma_timestep and non-zero covariance') 197 223 elif indTFarma != -1: 198 covsum = self.covariance[np.sum(dimensions[0:indTFarma]).astype(int):np.sum(dimensions[0:indTFarma + 1]).astype(int), np.sum(dimensions[0:indPwarma]).astype(int):np.sum(dimensions[0:indPwarma + 1]).astype(int)] 199 if md.frontalforcings.arma_timestep != md.hydrology.arma_timestep and np.any(covsum != 0): 200 raise IOError('FrontalForcingsRignotarma and hydrologyarmapw have different arma_timestep and non-zero covariance') 224 for ii in range(len(lsCovmats)): 225 covm = lsCovmats[ii] 226 covsum = covm[np.sum(dimensions[0:indTFarma]).astype(int):np.sum(dimensions[0:indTFarma + 1]).astype(int), np.sum(dimensions[0:indPwarma]).astype(int):np.sum(dimensions[0:indPwarma + 1]).astype(int)] 227 if md.frontalforcings.arma_timestep != md.hydrology.arma_timestep and np.any(covsum != 0): 228 raise IOError('FrontalForcingsRignotarma and hydrologyarmapw have different arma_timestep and non-zero covariance') 201 229 elif indSdarma != -1: 202 230 if indSMBarma != -1: 203 covsum = self.covariance[np.sum(dimensions[0:indSMBarma]).astype(int):np.sum(dimensions[0:indSMBarma + 1]).astype(int), np.sum(dimensions[0:indSdarma]).astype(int):np.sum(dimensions[0:indSdarma + 1]).astype(int)] 204 if md.smb.arma_timestep != md.frontalforcings.sd_arma_timestep and np.any(covsum != 0): 205 raise IOError('SMBarma and FrontalForcingsSubglacialDischargearma have different arma_timestep and non-zero covariance') 231 for ii in range(len(lsCovmats)): 232 covm = lsCovmats[ii] 233 covsum = covm[np.sum(dimensions[0:indSMBarma]).astype(int):np.sum(dimensions[0:indSMBarma + 1]).astype(int), np.sum(dimensions[0:indSdarma]).astype(int):np.sum(dimensions[0:indSdarma + 1]).astype(int)] 234 if md.smb.arma_timestep != md.frontalforcings.sd_arma_timestep and np.any(covsum != 0): 235 raise IOError('SMBarma and FrontalForcingsSubglacialDischargearma have different arma_timestep and non-zero covariance') 206 236 elif indTFarma != -1: 207 covsum = self.covariance[np.sum(dimensions[0:indSdarma]).astype(int):np.sum(dimensions[0:indSdarma + 1]).astype(int), np.sum(dimensions[0:indTFarma]).astype(int):np.sum(dimensions[0:indTFarma + 1]).astype(int)] 208 if md.frontalforcings.sd_arma_timestep != md.frontalforcings.arma_timestep and np.any(covsum != 0): 209 raise IOError('FrontalForcingsSubglacialDischargearma and FrontalForcingsRignotarma have different arma_timestep and non-zero covariance') 237 for ii in range(len(lsCovmats)): 238 covm = lsCovmats[ii] 239 covsum = covm[np.sum(dimensions[0:indSdarma]).astype(int):np.sum(dimensions[0:indSdarma + 1]).astype(int), np.sum(dimensions[0:indTFarma]).astype(int):np.sum(dimensions[0:indTFarma + 1]).astype(int)] 240 if md.frontalforcings.sd_arma_timestep != md.frontalforcings.arma_timestep and np.any(covsum != 0): 241 raise IOError('FrontalForcingsSubglacialDischargearma and FrontalForcingsRignotarma have different arma_timestep and non-zero covariance') 210 242 elif indSMBarma != -1: 211 243 if indTFarma != -1: 212 covsum = self.covariance[np.sum(dimensions[0:indSMBarma]).astype(int):np.sum(dimensions[0:indSMBarma + 1]).astype(int), np.sum(dimensions[0:indTFarma]).astype(int):np.sum(dimensions[0:indTFarma + 1]).astype(int)] 213 if md.smb.arma_timestep != md.frontalforcings.arma_timestep and np.any(covsum != 0): 214 raise IOError('SMBarma and FrontalForcingsRignotarma have different arma_timestep and non-zero covariance') 244 for ii in range(len(lsCovmats)): 245 covm = lsCovmats[ii] 246 covsum = covm[np.sum(dimensions[0:indSMBarma]).astype(int):np.sum(dimensions[0:indSMBarma + 1]).astype(int), np.sum(dimensions[0:indTFarma]).astype(int):np.sum(dimensions[0:indTFarma + 1]).astype(int)] 247 if md.smb.arma_timestep != md.frontalforcings.arma_timestep and np.any(covsum != 0): 248 raise IOError('SMBarma and FrontalForcingsRignotarma have different arma_timestep and non-zero covariance') 215 249 216 250 md = checkfield(md, 'fieldname', 'stochasticforcing.isstochasticforcing', 'values', [0, 1]) 217 251 md = checkfield(md, 'fieldname', 'stochasticforcing.fields', 'numel', num_fields, 'cell', 1, 'values', self.supportedstochforcings()) 218 md = checkfield(md, 'fieldname', 'stochasticforcing.covariance', 'NaN', 1, 'Inf', 1, 'size', [size_tot, size_tot ]) # global covariance matrix252 md = checkfield(md, 'fieldname', 'stochasticforcing.covariance', 'NaN', 1, 'Inf', 1, 'size', [size_tot, size_tot, numtcovmat]) # global covariance matrix 219 253 md = checkfield(md, 'fieldname', 'stochasticforcing.stochastictimestep', 'NaN', 1,'Inf', 1, '>=', md.timestepping.time_step) 220 254 md = checkfield(md, 'fieldname', 'stochasticforcing.randomflag', 'numel', [1], 'values', [0, 1]) 255 if(numtcovmat>1): #check the time steps at which each covariance matrix starts to be applie 256 md = checkfield(md, 'fieldname', 'stochasticforcing.timecovariance', 'NaN', 1, 'Inf', 1, '>=',md.timestepping.start_time,'<=',md.timestepping.final_time,'size',[1,numtcovmat]) # global covariance matrix 221 257 if checkdefaults: 222 258 md = checkfield(md, 'fieldname', 'stochasticforcing.defaultdimension', 'numel', 1, 'NaN', 1, 'Inf', 1, '>', 0) … … 260 296 elif field == 'FrictionWaterPressure' and ispwHydroarma: 261 297 dimensions[ind] = md.hydrology.num_basins 298 299 if(len(np.shape(self.covariance))==3): 300 nrow,ncol,numtcovmat = np.shape(self.covariance) 301 lsCovmats = [] 302 for ii in range(numtcovmat): 303 lsCovmats.append(self.covariance[:,:,ii]) 304 if(md.timestepping.interp_forcing==1): 305 print('WARNING: md.timestepping.interp_forcing is 1, but be aware that there is no interpolation between covariance matrices') 306 print(' the changes between covariance matrices occur at the time steps specified in md.stochasticforcing.timecovariance') 307 elif(len(np.shape(self.covariance))==2): 308 nrow,ncol = np.shape(self.covariance) 309 numtcovmat = 1 310 lsCovmats = [self.covariance] 262 311 263 312 # Scaling covariance matrix (scale column-by-column and row-by-row) 264 313 scaledfields = ['BasalforcingsDeepwaterMeltingRatearma','BasalforcingsSpatialDeepwaterMeltingRate','DefaultCalving', 'FloatingMeltRate', 'SMBarma', 'SMBforcing'] # list of fields that need scaling * 1 / yts 265 tempcovariance = np.copy(self.covariance) 266 for i in range(num_fields): 267 if self.fields[i] in scaledfields: 268 inds = range(int(np.sum(dimensions[0:i])), int(np.sum(dimensions[0:i + 1]))) 269 for row in inds: # scale rows corresponding to scaled field 270 tempcovariance[row, :] = 1 / yts * tempcovariance[row, :] 271 for col in inds: # scale columns corresponding to scaled field 272 tempcovariance[:, col] = 1 / yts * tempcovariance[:, col] 314 tempcovariance2d = np.zeros((numtcovmat,nrow*ncol)) 315 # Loop over covariance matrices # 316 for kk in range(numtcovmat): 317 kkcov = lsCovmats[kk] 318 # Loop over the fields # 319 for i in range(num_fields): 320 if self.fields[i] in scaledfields: 321 inds = range(int(np.sum(dimensions[0:i])), int(np.sum(dimensions[0:i + 1]))) 322 for row in inds: # scale rows corresponding to scaled field 323 kkcov[row, :] = 1 / yts * kkcov[row, :] 324 for col in inds: # scale columns corresponding to scaled field 325 kkcov[:, col] = 1 / yts * kkcov[:, col] 326 # Save scaled covariance # 327 for rr in range(nrow): 328 ind0 = rr*ncol 329 tempcovariance2d[kk,ind0:ind0+ncol] = np.copy(kkcov[rr,:]) 330 273 331 # Set dummy default_id vector if defaults not used 274 332 if np.any(np.isnan(self.default_id)): 275 333 self.default_id = np.zeros(md.mesh.numberofelements) 334 # Set dummy timecovariance vector if a single covariance matrix is used 335 if(numtcovmat==1): 336 self.timecovariance = np.array([md.timestepping.start_time]) 276 337 # Reshape dimensions as column array for marshalling 277 338 dimensions = dimensions.reshape(1, len(dimensions)) … … 282 343 WriteData(fid, prefix, 'object', self, 'fieldname', 'default_id', 'data', self.default_id - 1, 'format', 'IntMat', 'mattype', 2) #12Nov2021 make sure this is zero-indexed! 283 344 WriteData(fid, prefix, 'object', self, 'fieldname', 'defaultdimension', 'format', 'Integer') 284 WriteData(fid, prefix, 'data', tempcovariance, 'name', 'md.stochasticforcing.covariance', 'format', 'DoubleMat') 345 WriteData(fid, prefix, 'data', numtcovmat, 'name', 'md.stochasticforcing.num_timescovariance', 'format', 'Integer') 346 WriteData(fid, prefix, 'data', tempcovariance2d, 'name', 'md.stochasticforcing.covariance', 'format', 'DoubleMat') 347 WriteData(fid, prefix, 'object', self, 'fieldname', 'timecovariance', 'format', 'DoubleMat', 'scale', yts) 285 348 WriteData(fid, prefix, 'object', self, 'fieldname', 'stochastictimestep', 'format', 'Double', 'scale', yts) 286 349 WriteData(fid, prefix, 'object', self, 'fieldname', 'randomflag', 'format', 'Boolean')
Note:
See TracChangeset
for help on using the changeset viewer.