From 1dbad59e31484629d2fa81d7a703edce72d3c1ce Mon Sep 17 00:00:00 2001 From: kjei Date: Thu, 24 Apr 2025 14:43:59 +0200 Subject: [PATCH] NE in pipt file is now used instead of the whole loaded ensemble if this number is smaller+bug fix --- ensemble/ensemble.py | 20 +++++++++++++++----- simulator/flow_rock.py | 11 +---------- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/ensemble/ensemble.py b/ensemble/ensemble.py index e71cc84..130b96a 100644 --- a/ensemble/ensemble.py +++ b/ensemble/ensemble.py @@ -134,14 +134,24 @@ def __init__(self, keys_en, sim, redund_sim=None): # individually). self.state = {key: val for key, val in tmp_load.items()} - # Find the number of ensemble members from state variable + # Find the number of ensemble members from loaded state variables tmp_ne = [] for tmp_state in self.state.keys(): tmp_ne.extend([self.state[tmp_state].shape[1]]) - if max(tmp_ne) != min(tmp_ne): - print('\033[1;33mInput states have different ensemble size\033[1;m') - sys.exit(1) - self.ne = min(tmp_ne) + + if 'ne' not in self.keys_en: # NE not specified in input file + if max(tmp_ne) != min(tmp_ne): #Check loaded ensembles are the same size (if more than one state variable) + print('\033[1;33mInput states have different ensemble size\033[1;m') + sys.exit(1) + self.ne = min(tmp_ne) # Use the number of ensemble members in loaded ensemble + else: + # Use the number of ensemble members specified in input file (may be fewer than loaded) + self.ne = int(self.keys_en['ne']) + if self.ne < min(tmp_ne): + # pick correct number of ensemble members + self.state = {key: val[:,:self.ne] for key, val in self.state.items()} + else: + print('\033[1;33mInput states are smaller than NE\033[1;m') self._ext_ml_info() def _ext_ml_info(self): diff --git a/simulator/flow_rock.py b/simulator/flow_rock.py index 8fe5d13..e55b37d 100644 --- a/simulator/flow_rock.py +++ b/simulator/flow_rock.py @@ -22,7 +22,6 @@ from pylops.utils.wavelets import ricker from pylops.signalprocessing import Convolve1D import sys -sys.path.append("/home/AD.NORCERESEARCH.NO/mlie/") from PyGRDECL.GRDECL_Parser import GRDECL_Parser # https://github.com/BinWang0213/PyGRDECL/tree/master from scipy.interpolate import interp1d from scipy.interpolate import griddata @@ -41,8 +40,6 @@ def __init__(self, input_dict=None, filename=None, options=None): super().__init__(input_dict, filename, options) self._getpeminfo(input_dict) - self.dum_file_root = 'dummy.txt' - self.dum_entry = str(0) self.date_slack = None if 'date_slack' in input_dict: self.date_slack = int(input_dict['date_slack']) @@ -738,7 +735,7 @@ def run_fwd_sim(self, state, member_i, del_folder=True): # The inherited simulator also has a run_fwd_sim. Call this. self.ensemble_member = member_i - self.pred_data = super().run_fwd_sim(state, member_i, del_folder=del_folder) + return super().run_fwd_sim(state, member_i, del_folder=del_folder) def call_sim(self, folder=None, wait_for_proc=False, run_reservoir_model=None, save_folder=None): # replace the sim2seis part (which is unusable) by avo based on Pylops @@ -855,11 +852,8 @@ def calc_velocities(self, folder, save_folder, grid, v, f_dim): # The properties in pem are only given in the active cells # indices of active cells: - true_indices = np.where(grid['ACTNUM']) - - # Alt 2 if len(self.pem.getBulkVel()) == len(true_indices[0]): #self.vp = np.full(f_dim, self.avo_config['vp_shale']) @@ -1037,7 +1031,6 @@ def _calc_avo_props(self, dt=0.0005): f0=self.avo_config['frequency']) - # Travel time corresponds to reflectivity series t = time_sample[:, :, 0:-1] @@ -1096,8 +1089,6 @@ def _calc_avo_props_active_cells(self, grid, dt=0.0005): # TOPS[:, :, 0] corresponds to the depth profile of the reservoir top on the first layer top_res = 2 * self.TOPS[:, :, 0] / vp_shale - - # Cumulative traveling time through the reservoir in vertical direction cum_time_res = np.cumsum(2 * self.DZ / self.vp, axis=2) + top_res[:, :, np.newaxis]