From cbbdb40dfc77fb4fd18e3c55cbe6f5f1b035ef04 Mon Sep 17 00:00:00 2001 From: Ondrej Pesek Date: Sat, 29 Jun 2024 00:24:20 +0200 Subject: [PATCH 1/2] change mat_aa to mat_a * mat_aa is a historic name from times of single variables instead of matrices fix #388 --- smoderp2d/core/general.py | 8 +++---- smoderp2d/core/surface.py | 2 +- smoderp2d/providers/base/data_preparation.py | 18 +++++++------- smoderp2d/providers/profile1d/__init__.py | 5 ++-- smoderp2d/time_step.py | 6 ++--- utils/convert-saved-data.py | 25 +++++++++----------- 6 files changed, 30 insertions(+), 34 deletions(-) diff --git a/smoderp2d/core/general.py b/smoderp2d/core/general.py index 9c2c001e..9d69e719 100644 --- a/smoderp2d/core/general.py +++ b/smoderp2d/core/general.py @@ -205,7 +205,7 @@ class Globals: # raster contains critical water level mat_hcrit = None # raster contains parameter of power law for surface runoff - mat_aa = None + mat_a = None # raster contains parameter of power law for surface runoff mat_b = None # raster contains surface retention data @@ -314,9 +314,9 @@ def get_mat_hcrit(cls): return cls.mat_hcrit @classmethod - def get_mat_aa(cls): + def get_mat_a(cls): """TODO.""" - return cls.mat_aa + return cls.mat_a @classmethod def get_mat_b(cls): @@ -448,7 +448,7 @@ def reset(cls): # raster contains critical water level cls.mat_hcrit = None # raster contains parameter of power law for surface runoff - cls.mat_aa = None + cls.mat_a = None # raster contains parameter of power law for surface runoff cls.mat_b = None # raster contains surface retention data diff --git a/smoderp2d/core/surface.py b/smoderp2d/core/surface.py index a8a39c76..4b325bd5 100644 --- a/smoderp2d/core/surface.py +++ b/smoderp2d/core/surface.py @@ -129,7 +129,7 @@ def __init__(self): Globals.get_mat_reten(), Globals.get_mat_inf_index(), Globals.get_mat_hcrit(), - Globals.get_mat_aa(), + Globals.get_mat_a(), Globals.get_mat_b() ) diff --git a/smoderp2d/providers/base/data_preparation.py b/smoderp2d/providers/base/data_preparation.py index 4aed6de0..18c19989 100644 --- a/smoderp2d/providers/base/data_preparation.py +++ b/smoderp2d/providers/base/data_preparation.py @@ -24,9 +24,9 @@ def _get_a(mat_nsheet, mat_y, no_data, mat_slope): :param mat_y: :param no_data: no data value :param mat_slope: - :return: np ndarray for mat_aa + :return: np ndarray for mat_a """ - mat_aa = ma.where( + mat_a = ma.where( ma.logical_or( mat_nsheet == no_data, mat_y == no_data, mat_slope == no_data ), @@ -38,11 +38,11 @@ def _get_a(mat_nsheet, mat_y, no_data, mat_slope): ) ) - return mat_aa + return mat_a @staticmethod def _get_crit_water(mat_b, mat_tau, mat_v, r, c, mat_slope, - no_data_value, mat_aa): + no_data_value, mat_a): cond = ma.logical_and( mat_slope != no_data_value, mat_tau != no_data_value ) @@ -61,7 +61,7 @@ def _get_crit_water(mat_b, mat_tau, mat_v, r, c, mat_slope, mat_hcrit_v = ma.where( cond, - ma.where(mat_slope == 0, 1000, ma.power(mat_v / mat_aa, exp)), + ma.where(mat_slope == 0, 1000, ma.power(mat_v / mat_a, exp)), no_data_value ) @@ -70,7 +70,7 @@ def _get_crit_water(mat_b, mat_tau, mat_v, r, c, mat_slope, ma.where( mat_slope == 0, 1000, - ma.power(flux_crit / mat_slope / g / mat_aa, 1 / mat_b) + ma.power(flux_crit / mat_slope / g / mat_a, 1 / mat_b) ), no_data_value ) @@ -265,7 +265,7 @@ def __init__(self, writer): 'surface_retention': None, 'mat_inf_index': None, 'mat_hcrit': None, - 'mat_aa': None, + 'mat_a': None, 'mat_b': None, 'mat_reten': None, 'mat_fd': None, @@ -612,7 +612,7 @@ def run(self): self.data['mat_dem']) # build a/aa arrays - self.data['mat_aa'] = self._get_a( + self.data['mat_a'] = self._get_a( self.soilveg_fields['nsheet'], self.soilveg_fields['y'], GridGlobals.NoDataValue, self.data['mat_slope']) Logger.progress(50) @@ -622,7 +622,7 @@ def run(self): self.data['mat_b'], self.soilveg_fields['tau'], self.soilveg_fields['v'], GridGlobals.r, GridGlobals.c, self.data['mat_slope'], - GridGlobals.NoDataValue, self.data['mat_aa']) + GridGlobals.NoDataValue, self.data['mat_a']) self.storage.write_raster(self.data['mat_hcrit'], 'hcrit', 'control') # load precipitation input file diff --git a/smoderp2d/providers/profile1d/__init__.py b/smoderp2d/providers/profile1d/__init__.py index 0369dbf8..e86bc4f7 100644 --- a/smoderp2d/providers/profile1d/__init__.py +++ b/smoderp2d/providers/profile1d/__init__.py @@ -197,7 +197,7 @@ def _load_roff(self): # set values to parameter matrics data['mat_nrill'] = parsed_data['nrill'].reshape((data['r'], data['c'])) data['mat_b'] = parsed_data['b'].reshape((data['r'], data['c'])) - data['mat_aa'] = self._get_a( + data['mat_a'] = self._get_a( data['nsheet'], data['y'], data['NoDataValue'], @@ -210,7 +210,7 @@ def _load_roff(self): data['c'], data['mat_slope'], data['NoDataValue'], - data['mat_aa'] + data['mat_a'] ) data['mat_reten'] = parsed_data['ret'].reshape((data['r'], data['c'])) @@ -344,7 +344,6 @@ def _alloc_matrices(data): data['mat_inf_index'] = np.zeros((data['r'], data['c']), float) data['mat_fd'] = np.zeros((data['r'], data['c']), float) data['mat_hcrit'] = np.zeros((data['r'], data['c']), float) - data['mat_aa'] = np.zeros((data['r'], data['c']), float) data['mat_reten'] = np.zeros((data['r'], data['c']), float) data['mat_nan'] = np.zeros((data['r'], data['c']), float) data['mat_effect_cont'] = np.zeros((data['r'], data['c']), float) diff --git a/smoderp2d/time_step.py b/smoderp2d/time_step.py index 0646ec8a..ef6bf537 100644 --- a/smoderp2d/time_step.py +++ b/smoderp2d/time_step.py @@ -389,7 +389,7 @@ def do_next_h_implicit(self, surface, subsurface, rain_arr, cumulative, h_old = np.ravel(surface.arr.h_total_pre.tolist(0)) # Preparing the matrixes of flow parameters - aa = ma.array(Globals.get_mat_aa(), mask=GridGlobals.masks) + a = ma.array(Globals.get_mat_a(), mask=GridGlobals.masks) b = ma.array(Globals.get_mat_b(), mask=GridGlobals.masks) # Setting the initial guess for the solver h_0 = h_old @@ -436,7 +436,7 @@ def model_args(h_new): h_old, list_fd, r,c, - aa,b, + a,b, act_rain, surface.arr.soil_type, pixel_area, @@ -573,7 +573,7 @@ def model_args(h_new): #calculating sheet runoff _q_sheet, surface.arr.vol_runoff, surface.arr.vol_rest = ma.filled( - sheet_runoff(delta_t, aa, b, surface.arr.h_sheet), fill_value=0.0 + sheet_runoff(delta_t, a, b, surface.arr.h_sheet), fill_value=0.0 ) # Saving the inflows diff --git a/utils/convert-saved-data.py b/utils/convert-saved-data.py index e167edcb..d02dc6f5 100644 --- a/utils/convert-saved-data.py +++ b/utils/convert-saved-data.py @@ -23,20 +23,17 @@ def main(filename): 'delta_t': indata[13], 'mat_pi': indata[14], 'mat_ppl': indata[15], 'surface_retention': indata[16], 'mat_inf_index': indata[17], 'mat_hcrit': indata[18], - 'mat_aa': indata[19], 'mat_b': indata[20], - 'mat_reten': indata[21], 'mat_fd': indata[22], - 'mat_dmt': indata[23], 'mat_effect_cont': indata[24], - 'mat_slope': indata[25], 'mat_nan': indata[26], - 'mat_a': indata[27], 'mat_n': indata[28], - 'outdir': indata[29], 'pixel_area': indata[30], - 'points': indata[31], 'poradi': indata[32], - 'end_time': indata[33], 'spix': indata[34], - 'state_cell': indata[35], 'temp': indata[36], - 'type_of_computing': indata[37], 'vpix': indata[38], - 'mfda': indata[39], 'sr': indata[40], 'itera': indata[41], - 'toky': indata[42], 'cell_stream': indata[43], - 'mat_tok_reach': indata[44], 'STREAM_RATIO': indata[45], - 'toky_loc': indata[46] + 'mat_b': indata[19], 'mat_reten': indata[20], 'mat_fd': indata[21], + 'mat_dmt': indata[22], 'mat_effect_cont': indata[23], + 'mat_slope': indata[24], 'mat_nan': indata[25], 'mat_a': indata[26], + 'mat_n': indata[27], 'outdir': indata[28], 'pixel_area': indata[29], + 'points': indata[30], 'poradi': indata[31], 'end_time': indata[32], + 'spix': indata[33], 'state_cell': indata[34], 'temp': indata[35], + 'type_of_computing': indata[36], 'vpix': indata[37], + 'mfda': indata[38], 'sr': indata[39], 'itera': indata[40], + 'toky': indata[41], 'cell_stream': indata[42], + 'mat_tok_reach': indata[43], 'STREAM_RATIO': indata[44], + 'toky_loc': indata[45] } BaseProvider.save_data(data, filename) From fe01fdc581845188d68885e8cf51a2f637460d98 Mon Sep 17 00:00:00 2001 From: Ondrej Pesek Date: Tue, 3 Sep 2024 15:21:43 +0200 Subject: [PATCH 2/2] update .save files to follow the new naming --- tests/data/nucice.save | Bin 1313766 -> 1313756 bytes tests/data/rain_sim.save | Bin 11897 -> 11887 bytes .../reference/gistest_nucice/dpre/dpre.save | Bin 1313766 -> 1313756 bytes .../reference/gistest_rain_sim/dpre/dpre.save | Bin 11897 -> 11887 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/tests/data/nucice.save b/tests/data/nucice.save index d92e6a7097fd4486682bb1c0cc2eb726f0bc8ad8..cad3ef54a0cb6f17f8ef005bd72aed1f95ff2cb2 100644 GIT binary patch delta 2337 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 delta 1358 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 delta 1358 zcmY+Edu$X{6vp@2Wx?vINvW_znpoX#p+-`QiHU_M+32JTTxuP)<2o}t+Zmai-EVdl zS}P(dEfuxu_(Boi?+4)ce!pM%z&DBtDk`EDD{5k*!F#9OS-XGTb7p_v`Odi~cVGA4 z-J3h3^}OHb^GR52VF>|AaDFbvg$J7cI8)+l zD47?nj40wPwIiXX)v&rqrApldf~R!0b4)E&$}sjE0+A`rl~^PbWT}!O@!@eL2{|>S zhB@CF^r%w?p%Q4G(7Dc@Sby;NWen8`@)it^;I3lK)daSM zYpQLR^g>a=wG--JM{vDI-=H4C2dLFtE7lLK9mI_UH`z;S>iioV;mE!I=*>)aBf%}q z*t}a=bQ{6#)Yu)>9u3jJofB%@MR2!Q;~r;c!@5B9UIyPsa6gke=>Zl!NbnGqdbn!X zFg0Drrb@e;S-V>Z9`VE+^{^o|!p{u)e9rvFk$^qFan1}p%G4esc-+Dh5*AqdY(%2htjOoS5z{ETt+VBi)BkQdhj$C9w4mc=^)-nDz0jtade;C*|z zsUfyazz3=Je@`4Znjq66a3(=)sN1>%?tgj_OKECM6lPw&k}zSm0#LP z7B1+>kOiHmEW$5ow`96-vS^82qFz?;>#3vL4;*msK$0<%9y^)Xmv&z$8NYF1H<#_j zXsUe|m88G1Odo!)W+v10tfJOSXDrft!2VSGHut|iSIER4T+GEx8Gj1+D`D5p-X9dq r8hdnheI!DkL&2P6$68vOqx75_Lun=U()8)NTrdsAG$;T6Te;;wwz