Skip to content

Commit 7dda9b3

Browse files
committed
Use active realization list and add difference calculation of GRF posterior minus GRF prior
1 parent 88003f2 commit 7dda9b3

1 file changed

Lines changed: 85 additions & 36 deletions

File tree

src/subscript/field_statistics/field_statistics.py

Lines changed: 85 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
16601687
def 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
18761925
if __name__ == "__main__":
18771926
main()

0 commit comments

Comments
 (0)