@@ -1080,6 +1080,7 @@ def get_specifications(
10801080 use_population_stdev = input_dict [key ]
10811081
10821082 use_geogrid_fields = False
1083+ geogrid_name = None
10831084 zone_names_used = None
10841085 zone_conformity = None
10851086 zone_code_names = None
@@ -1339,6 +1340,11 @@ def calc_stats(
13391340 if not use_geogrid_fields :
13401341 return
13411342
1343+ # Get list of active realization (Must be active for all iterations in iter_list)
1344+ active_real , number_of_skipped = get_active_real (
1345+ iter_list , ens_path , nreal , geogrid_name
1346+ )
1347+
13421348 ensemble_path = ens_path
13431349
13441350 logger .info (f"Number of realizations: { nreal } " )
@@ -1356,8 +1362,8 @@ def calc_stats(
13561362 (ertbox_size [0 ], ertbox_size [1 ], ertbox_size [2 ], nreal ),
13571363 dtype = np .float32 ,
13581364 )
1359- number_of_skipped = 0
1360- for real_number in range ( nreal ) :
1365+
1366+ for real_number in active_real :
13611367 grid_dimensions , subgrids , property_param = (
13621368 read_ensemble_realization (
13631369 ensemble_path ,
@@ -1368,11 +1374,7 @@ def calc_stats(
13681374 geogrid_name ,
13691375 )
13701376 )
1371- if grid_dimensions is None :
1372- txt = f" Skip non-existing realization: { real_number } "
1373- logger .info (txt )
1374- number_of_skipped += 1
1375- continue
1377+ assert grid_dimensions is not None
13761378 ertbox_prop_values = get_values_in_ertbox (
13771379 grid_dimensions ,
13781380 subgrids ,
@@ -1445,8 +1447,8 @@ def calc_stats(
14451447 (ertbox_size [0 ], ertbox_size [1 ], ertbox_size [2 ], nreal ),
14461448 dtype = np .int32 ,
14471449 )
1448- number_of_skipped = 0
1449- for real_number in range ( nreal ) :
1450+
1451+ for real_number in active_real :
14501452 grid_dimensions , subgrids , property_param = (
14511453 read_ensemble_realization (
14521454 ensemble_path ,
@@ -1457,11 +1459,7 @@ def calc_stats(
14571459 geogrid_name ,
14581460 )
14591461 )
1460-
1461- if grid_dimensions is None :
1462- logger .info (f" Skip realization: { real_number } " )
1463- number_of_skipped += 1
1464- continue
1462+ assert grid_dimensions is not None
14651463 ertbox_prop_values = get_values_in_ertbox (
14661464 grid_dimensions ,
14671465 subgrids ,
@@ -1576,7 +1574,8 @@ def calc_temporary_field_stats(
15761574 # Check if any need to continue to calculation
15771575 if not use_temporary_fields :
15781576 return
1579-
1577+ # Get list of active realization (Must be active for all iterations in iter_list)
1578+ active_real , number_of_skipped = get_active_real (iter_list , ens_path , nreal )
15801579 # Import realizations of temporary field parameters
15811580 for param_name in param_list :
15821581 for iteration in iter_list :
@@ -1590,21 +1589,15 @@ def calc_temporary_field_stats(
15901589 (ertbox_size [0 ], ertbox_size [1 ], ertbox_size [2 ], nreal ),
15911590 dtype = np .float32 ,
15921591 )
1593-
1594- number_of_skipped = 0
1595- for real_number in range (nreal ):
1592+ for real_number in active_real :
15961593 filepath = (
15971594 ens_path
15981595 / Path (
15991596 "realization-" + str (real_number ) + "/iter-" + str (iteration )
16001597 )
16011598 / Path (full_param_filename )
16021599 )
1603- if not filepath .exists ():
1604- txt = f" Skip non-existing realization: { real_number } "
1605- logger .info (txt )
1606- number_of_skipped += 1
1607- continue
1600+ assert filepath .exists ()
16081601 property = xtgeo .gridproperty_from_file (filepath , fformat = "roff" )
16091602 values = property .values
16101603 all_values [:, :, :, real_number ] = values
@@ -1657,6 +1650,38 @@ def calc_temporary_field_stats(
16571650 xtgeo_ertbox_stdev .to_file (result_stdev_file_path , fformat = "roff" )
16581651
16591652
1653+ def get_active_real (
1654+ iter_list : list , ens_path : Path , nreal : int , geogrid_name : str = ""
1655+ ):
1656+ """Get a list of active realizations"""
1657+ number_of_skipped = 0
1658+ active_real = []
1659+ for real_number in range (nreal ):
1660+ real_exist = True
1661+ for iteration in iter_list :
1662+ ensemble_path = ens_path / Path (
1663+ "realization-" + str (real_number ) + "/iter-" + str (iteration )
1664+ )
1665+ if len (geogrid_name ) > 0 :
1666+ grid_path = Path ("share/results/grids/" + geogrid_name + ".roff" )
1667+ file_path_grid = ensemble_path / grid_path
1668+ txt = f" Skip non-existing realization of grid: { real_number } "
1669+ else :
1670+ file_path_grid = ensemble_path
1671+ txt = f" Skip non-existing realization: { real_number } "
1672+ if not file_path_grid .exists ():
1673+ logger .info (txt )
1674+ number_of_skipped += 1
1675+ # No need to check other iterations since active_real should
1676+ # only be those realizations that exists for all specified
1677+ # iterations in iter_list
1678+ real_exist = False
1679+ continue
1680+ if real_exist :
1681+ active_real .append (real_number )
1682+ return active_real , number_of_skipped
1683+
1684+
16601685def generate_script (
16611686 rms_load_script , ert_config_path , result_path , field_stat_config_file
16621687):
@@ -1853,25 +1878,47 @@ def main():
18531878 if init_path and param_names:
18541879 for param_name in param_names:
18551880 for iteration in iter_list:
1856- new_name = "mean_" + param_name + "_" + str(iteration)
1857- param_file_name = Path(result_path) / Path(new_name + ".roff")
1858- prop_param = xtgeo.gridproperty_from_file(
1859- param_file_name, fformat="roff"
1881+ mean_name = "mean_" + param_name + "_" + str(iteration)
1882+ std_name = "stdev_" + param_name + "_" + str(iteration)
1883+
1884+ mean_param_file_name = Path(result_path) / Path(mean_name + ".roff")
1885+ mean_prop_param = xtgeo.gridproperty_from_file(
1886+ mean_param_file_name, fformat="roff"
18601887 )
1861- print(f"Read: {{new_name}} into {{GRIDNAME}}")
1862- if label:
1863- new_name = new_name + "_" + label
1864- prop_param.to_roxar(PRJ, GRIDNAME, new_name)
1888+ print(f"Read: {{mean_name}} into {{GRIDNAME}}")
18651889
1866- new_name = "stdev_" + param_name + "_" + str(iteration)
1867- param_file_name = Path(result_path) / Path(new_name + ".roff")
1868- prop_param = xtgeo.gridproperty_from_file(
1869- param_file_name, fformat="roff"
1890+ std_param_file_name = Path(result_path) / Path(std_name + ".roff")
1891+ std_prop_param = xtgeo.gridproperty_from_file(
1892+ std_param_file_name, fformat="roff"
18701893 )
1871- print(f"Read: {{new_name}} into {{GRIDNAME}}")
1894+ print(f"Read: {{std_name}} into {{GRIDNAME}}")
1895+
18721896 if label:
1873- new_name = new_name + "_" + label
1874- prop_param.to_roxar(PRJ, GRIDNAME, new_name)
1897+ new_mean_name = mean_name + "_" + label
1898+ new_std_name = std_name + "_" + label
1899+ difference_mean_name = "diff_" + new_mean_name
1900+ difference_std_name = "diff_" + new_std_name
1901+
1902+ mean_prop_param.to_roxar(PRJ, GRIDNAME, new_mean_name)
1903+ std_prop_param.to_roxar(PRJ, GRIDNAME, new_std_name)
1904+
1905+ if iteration == iter_list[0]:
1906+ # Init
1907+ mean_prop_param_init = mean_prop_param
1908+ std_prop_param_init = std_prop_param
1909+ elif iteration == iter_list[-1]:
1910+ mean_prop_param_upd = mean_prop_param
1911+ std_prop_param_upd = std_prop_param
1912+ diff_mean_prop_param = mean_prop_param_upd.copy()
1913+ diff_std_prop_param = std_prop_param_upd.copy()
1914+ diff_mean_prop_param.values = \
1915+ mean_prop_param_upd.values - mean_prop_param_init.values
1916+ diff_std_prop_param.values = \
1917+ std_prop_param_upd.values - std_prop_param_init.values
1918+ diff_mean_prop_param.to_roxar(PRJ,
1919+ GRIDNAME, difference_mean_name)
1920+ diff_std_prop_param.to_roxar(PRJ,
1921+ GRIDNAME, difference_std_name)
18751922
18761923if __name__ == "__main__":
18771924 main()
0 commit comments