@@ -1339,6 +1339,11 @@ def calc_stats(
13391339 if not use_geogrid_fields :
13401340 return
13411341
1342+ # Get list of active realization (Must be active for all iterations in iter_list)
1343+ active_real , number_of_skipped = get_active_real (
1344+ iter_list , ens_path , nreal , geogrid_name
1345+ )
1346+
13421347 ensemble_path = ens_path
13431348
13441349 logger .info (f"Number of realizations: { nreal } " )
@@ -1356,8 +1361,8 @@ def calc_stats(
13561361 (ertbox_size [0 ], ertbox_size [1 ], ertbox_size [2 ], nreal ),
13571362 dtype = np .float32 ,
13581363 )
1359- number_of_skipped = 0
1360- for real_number in range ( nreal ) :
1364+
1365+ for real_number in active_real :
13611366 grid_dimensions , subgrids , property_param = (
13621367 read_ensemble_realization (
13631368 ensemble_path ,
@@ -1368,11 +1373,7 @@ def calc_stats(
13681373 geogrid_name ,
13691374 )
13701375 )
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
1376+ assert grid_dimensions is not None
13761377 ertbox_prop_values = get_values_in_ertbox (
13771378 grid_dimensions ,
13781379 subgrids ,
@@ -1445,8 +1446,8 @@ def calc_stats(
14451446 (ertbox_size [0 ], ertbox_size [1 ], ertbox_size [2 ], nreal ),
14461447 dtype = np .int32 ,
14471448 )
1448- number_of_skipped = 0
1449- for real_number in range ( nreal ) :
1449+
1450+ for real_number in active_real :
14501451 grid_dimensions , subgrids , property_param = (
14511452 read_ensemble_realization (
14521453 ensemble_path ,
@@ -1457,11 +1458,7 @@ def calc_stats(
14571458 geogrid_name ,
14581459 )
14591460 )
1460-
1461- if grid_dimensions is None :
1462- logger .info (f" Skip realization: { real_number } " )
1463- number_of_skipped += 1
1464- continue
1461+ assert grid_dimensions is not None
14651462 ertbox_prop_values = get_values_in_ertbox (
14661463 grid_dimensions ,
14671464 subgrids ,
@@ -1576,6 +1573,8 @@ def calc_temporary_field_stats(
15761573 # Check if any need to continue to calculation
15771574 if not use_temporary_fields :
15781575 return
1576+ # Get list of active realization (Must be active for all iterations in iter_list)
1577+ active_real , number_of_skipped = get_active_real (iter_list , ens_path , nreal )
15791578
15801579 # Import realizations of temporary field parameters
15811580 for param_name in param_list :
@@ -1591,20 +1590,15 @@ def calc_temporary_field_stats(
15911590 dtype = np .float32 ,
15921591 )
15931592
1594- number_of_skipped = 0
1595- for real_number in range (nreal ):
1593+ for real_number in active_real :
15961594 filepath = (
15971595 ens_path
15981596 / Path (
15991597 "realization-" + str (real_number ) + "/iter-" + str (iteration )
16001598 )
16011599 / Path (full_param_filename )
16021600 )
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
1601+ assert filepath .exists ()
16081602 property = xtgeo .gridproperty_from_file (filepath , fformat = "roff" )
16091603 values = property .values
16101604 all_values [:, :, :, real_number ] = values
@@ -1657,6 +1651,39 @@ def calc_temporary_field_stats(
16571651 xtgeo_ertbox_stdev .to_file (result_stdev_file_path , fformat = "roff" )
16581652
16591653
1654+ def get_active_real (
1655+ iter_list : list , ens_path : Path , nreal : int , geogrid_name : str = "NotUsed"
1656+ ):
1657+ """Get a list of active realizations"""
1658+ number_of_skipped = 0
1659+ active_real = []
1660+ for real_number in range (nreal ):
1661+ real_exist = True
1662+ for iteration in iter_list :
1663+ ensemble_path = ens_path / Path (
1664+ "realization-" + str (real_number ) + "/iter-" + str (iteration )
1665+ )
1666+ if geogrid_name != "NotUsed" :
1667+ grid_path = Path ("share/results/grids/" + geogrid_name + ".roff" )
1668+ file_path_grid = ensemble_path / grid_path
1669+ txt = f" Skip non-existing realization of grid: { real_number } "
1670+ else :
1671+ file_path_grid = ensemble_path
1672+ txt = f" Skip non-existing realization: { real_number } "
1673+
1674+ if not file_path_grid .exists ():
1675+ logger .info (txt )
1676+ number_of_skipped += 1
1677+ # No need to check other iterations since active_real should
1678+ # only be those realizations that exists for all specified
1679+ # iterations in iter_list
1680+ real_exist = False
1681+ continue
1682+ if real_exist :
1683+ active_real .append (real_number )
1684+ return active_real , number_of_skipped
1685+
1686+
16601687def generate_script (
16611688 rms_load_script , ert_config_path , result_path , field_stat_config_file
16621689):
@@ -1853,25 +1880,47 @@ def main():
18531880 if init_path and param_names:
18541881 for param_name in param_names:
18551882 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"
1883+ mean_name = "mean_" + param_name + "_" + str(iteration)
1884+ std_name = "stdev_" + param_name + "_" + str(iteration)
1885+
1886+ mean_param_file_name = Path(result_path) / Path(mean_name + ".roff")
1887+ mean_prop_param = xtgeo.gridproperty_from_file(
1888+ mean_param_file_name, fformat="roff"
18601889 )
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)
1890+ print(f"Read: {{mean_name}} into {{GRIDNAME}}")
18651891
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"
1892+ std_param_file_name = Path(result_path) / Path(std_name + ".roff")
1893+ std_prop_param = xtgeo.gridproperty_from_file(
1894+ std_param_file_name, fformat="roff"
18701895 )
1871- print(f"Read: {{new_name}} into {{GRIDNAME}}")
1896+ print(f"Read: {{std_name}} into {{GRIDNAME}}")
1897+
18721898 if label:
1873- new_name = new_name + "_" + label
1874- prop_param.to_roxar(PRJ, GRIDNAME, new_name)
1899+ new_mean_name = mean_name + "_" + label
1900+ new_std_name = std_name + "_" + label
1901+ difference_mean_name = "diff_" + new_mean_name
1902+ difference_std_name = "diff_" + new_std_name
1903+
1904+ mean_prop_param.to_roxar(PRJ, GRIDNAME, new_mean_name)
1905+ std_prop_param.to_roxar(PRJ, GRIDNAME, new_std_name)
1906+
1907+ if iteration == iter_list[0]:
1908+ # Init
1909+ mean_prop_param_init = mean_prop_param
1910+ std_prop_param_init = std_prop_param
1911+ elif iteration == iter_list[-1]:
1912+ mean_prop_param_upd = mean_prop_param
1913+ std_prop_param_upd = std_prop_param
1914+ diff_mean_prop_param = mean_prop_param_upd.copy()
1915+ diff_std_prop_param = std_prop_param_upd.copy()
1916+ diff_mean_prop_param.values = \
1917+ mean_prop_param_upd.values - mean_prop_param_init.values
1918+ diff_std_prop_param.values = \
1919+ std_prop_param_upd.values - std_prop_param_init.values
1920+ diff_mean_prop_param.to_roxar(PRJ,
1921+ GRIDNAME, difference_mean_name)
1922+ diff_std_prop_param.to_roxar(PRJ,
1923+ GRIDNAME, difference_std_name)
18751924
18761925if __name__ == "__main__":
18771926 main()
0 commit comments