Skip to content

Commit 16c0289

Browse files
authored
Merge pull request #77 from daavid00/dev
Reducing the output size
2 parents b03ddd9 + f11068a commit 16c0289

3 files changed

Lines changed: 187 additions & 58 deletions

File tree

src/pycopm/utils/files_writer.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -205,15 +205,15 @@ def opm_properties(dic):
205205
lines = compact_format("".join(f"{val:E} " for val in dic[f"{name}_c"]).split())
206206
lines.insert(0, name.upper() + "\n")
207207
lines.insert(0, dic["git"])
208-
lines.append("/")
208+
lines.append("/\n")
209209
with open(
210210
f"{dic['fol']}/preprocessing/{name}.inc", "w", encoding="utf8"
211211
) as file:
212212
file.write("".join(lines))
213213
lines = compact_format("".join(f"{val:E} " for val in dic["swat_c"]).split())
214214
lines.insert(0, "SWATINIT\n")
215215
lines.insert(0, dic["git"])
216-
lines.append("/")
216+
lines.append("/\n")
217217
with open(f"{dic['fol']}/preprocessing/swatinit.inc", "w", encoding="utf8") as file:
218218
file.write("".join(lines))
219219
lines = [dic["git"]]
@@ -228,7 +228,7 @@ def opm_properties(dic):
228228
lines = compact_format("".join(f"{val:E} " for val in dic["multz_c"]).split())
229229
lines.insert(0, "MULTZ\n")
230230
lines.insert(0, dic["git"])
231-
lines.append("/")
231+
lines.append("/\n")
232232
with open(
233233
f"{dic['fol']}/preprocessing/regionbarriers.inc",
234234
"w",

src/pycopm/utils/generate_files.py

Lines changed: 159 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -142,12 +142,8 @@ def create_deck(dic):
142142
dic["field"] = "generic"
143143
dic["props"] = ["permx", "permy", "permz", "poro"]
144144
dic["base"] = dic["props"] + ["grid"]
145-
dic["regions"] = []
146-
dic["grids"] = []
147-
dic["rptrst"] = []
148-
dic["mults"] = []
149-
dic["special"] = []
150-
dic["reftocoa"] = []
145+
for name in ["regions", "grids", "rptrst", "mults", "special", "reftocoa"]:
146+
dic[name] = []
151147
dic["fip"] = ""
152148
dic["nrptsrt"] = 0
153149
dic["nrptsrtc"] = 0
@@ -380,7 +376,7 @@ def create_deck(dic):
380376
) as file:
381377
file.write("PORV\n")
382378
file.write("".join(cor_pv))
383-
file.write("/")
379+
file.write("/\n")
384380
os.system(
385381
f"{dic['flow']} {dic['fol']}/{dic['write']}_CORR.DATA {dic['flags1']}"
386382
)
@@ -408,7 +404,7 @@ def create_deck(dic):
408404
) as file:
409405
file.write("PORV\n")
410406
file.write("".join(cor_pv))
411-
file.write("/")
407+
file.write("/\n")
412408
print(
413409
f"\nRunning {dic['fol']}/{dic['write']}_CORR.DATA with the corrected "
414410
"pore volume\n"
@@ -454,6 +450,84 @@ def create_deck(dic):
454450
print(f"\nThe dryrun results have been written to {dic['fol']}/")
455451

456452

453+
def bool_mult(dic, nrwo, mults):
454+
"""
455+
Set to True if the keyword is found
456+
457+
Args:
458+
dic (dict): Global dictionary\n
459+
nrwo (str): Entry of the deck\n
460+
mults (list): Name of MULT* keywords
461+
462+
Returns:
463+
dic (dict): Modified global dictionary
464+
465+
"""
466+
keyword = nrwo.split()
467+
for name in mults:
468+
if nrwo == name.upper() or (len(keyword) > 1 and keyword[0] == name.upper()):
469+
dic[f"has{name}"] = True
470+
471+
472+
def search_file(dic, path, mults):
473+
"""
474+
Check the file for the keywords
475+
476+
Args:
477+
dic (dict): Global dictionary\n
478+
path (str): Path to the file\n
479+
mults (list): Name of MULT* keywords
480+
481+
Returns:
482+
dic (dict): Modified global dictionary
483+
484+
"""
485+
includes, include = [], False
486+
data = ".DATA" in path
487+
with open(path, "r", encoding=dic["encoding"]) as file:
488+
for row in csv.reader(file):
489+
nrwo = str(row)[2:-2].strip()
490+
if include:
491+
inc = os.path.join(
492+
os.getcwd(), nrwo.split("/", maxsplit=1)[0].strip().strip("\"'")
493+
)
494+
if os.path.exists(inc):
495+
includes.append(inc)
496+
include = False
497+
continue
498+
bool_mult(dic, nrwo, mults)
499+
if nrwo == "INCLUDE":
500+
include = True
501+
if data and nrwo == "MULTFLT":
502+
dic["maindeckmultflt"] = True
503+
return includes
504+
505+
506+
def check_mult(dic, mults):
507+
"""
508+
Check for MULT* to avoid writing them if only MULTFLT is used.
509+
We look at most for three levels of INCLUDE
510+
511+
Args:
512+
dic (dict): Global dictionary\n
513+
mults (list): Name of MULT* keywords
514+
515+
Returns:
516+
dic (dict): Modified global dictionary
517+
518+
"""
519+
for name in mults:
520+
dic[f"has{name}"] = False
521+
includes = search_file(dic, dic["deck"] + ".DATA", mults)
522+
includes1, includes2 = [], []
523+
for include in includes:
524+
includes1.extend(search_file(dic, include, mults))
525+
for include in includes1:
526+
includes2.extend(search_file(dic, include, mults))
527+
for include in includes2:
528+
search_file(dic, include, mults)
529+
530+
457531
def initialize_variables(dic):
458532
"""
459533
Use opm to read the dry run
@@ -476,12 +550,16 @@ def initialize_variables(dic):
476550
if dic["ini"].count(name.upper()):
477551
dic["props"] += [name]
478552
dic["special"] += [name]
479-
for name in ["multx", "multx-", "multy", "multy-", "multz", "multz-"]:
553+
mults = ["multx", "multx-", "multy", "multy-", "multz", "multz-"]
554+
dic["maindeckmultflt"] = False
555+
check_mult(dic, mults)
556+
for name in mults:
480557
if dic["ini"].count(name.upper()):
481558
tmp = np.array(dic["ini"][name.upper()])
482559
if 0 < np.sum(tmp != 1):
483-
dic["props"] += [name]
484-
dic["mults"] += [name]
560+
if dic[f"has{name}"] or not dic["maindeckmultflt"]:
561+
dic["props"] += [name]
562+
dic["mults"] += [name]
485563
for name in ["multnum", "fluxnum"]:
486564
if dic["ini"].count(name.upper()):
487565
if np.max(dic["ini"][name.upper()]) > 1:
@@ -536,6 +614,12 @@ def initialize_variables(dic):
536614
]:
537615
if dic["rst"].count(name.upper()):
538616
dic["rptrst"] += [name]
617+
dic["facpermz"] = -1.0
618+
for i, val in enumerate(dic["ini"]["PERMX"]):
619+
if val != 0:
620+
if dic["ini"]["PERMZ"][i] != 0:
621+
dic["facpermz"] = dic["ini"]["PERMZ"][i] / float(val)
622+
break
539623

540624

541625
def handle_nnc_trans(dic):
@@ -671,7 +755,7 @@ def handle_nnc_trans(dic):
671755
0,
672756
"-- This file was generated by pycopm https://github.com/cssr-tools/pycopm\n",
673757
)
674-
dic[f"coa_{name}"].append("/")
758+
dic[f"coa_{name}"].append("/\n")
675759
with open(
676760
f"{dic['label']}{name.upper()}.INC",
677761
"w",
@@ -691,6 +775,7 @@ def write_grid(dic):
691775
None
692776
693777
"""
778+
dic["ntot"] = dic["nx"] * dic["ny"] * dic["nz"]
694779
grid, tmp = [], []
695780
grid.append(
696781
"-- This deck was generated by pycopm https://github.com/cssr-tools/pycopm\n"
@@ -714,10 +799,11 @@ def write_grid(dic):
714799
if dic["field"] == "generic":
715800
grid.append("\nACTNUM\n")
716801
grid += compact_format(" ".join(list(map(str, dic["actnum_c"]))).split())
717-
grid.append("/")
802+
grid.append("/\n")
718803
with open(f"{dic['fol']}/{dic['label']}GRID.INC", "w", encoding="utf8") as file:
719804
file.write("".join(grid))
720805
else:
806+
grid.append("\n")
721807
with open(
722808
f"{dic['fol']}/preprocessing/{dic['name']}_COARSER.GRDECL",
723809
"w",
@@ -738,6 +824,7 @@ def write_props(dic):
738824
739825
"""
740826
names = dic["props"] + dic["regions"] + dic["grids"] + dic["rptrst"] + ["porv"]
827+
names = compact_perm(dic, names)
741828
if dic["vicinity"]:
742829
names += ["subtoglob"]
743830
fips = [f"{int(val)+1} " for val in dic["subm"]]
@@ -749,7 +836,7 @@ def write_props(dic):
749836
) as file:
750837
file.write("FIPNUM\n")
751838
file.write("".join(fips))
752-
file.write("/")
839+
file.write("/\n")
753840
elif dic["coarsening"]:
754841
oprs = [f"{int(val)} " for val in dic["reftocoa"]]
755842
oprs = compact_format("".join(f"{int(val)} " for val in oprs).split())
@@ -760,12 +847,21 @@ def write_props(dic):
760847
) as file:
761848
file.write("OPERNUM\n")
762849
file.write("".join(oprs))
763-
file.write("/")
850+
file.write("/\n")
764851
print("Writing the files")
765852
with alive_bar(len(names)) as bar_animation:
766853
for name in names:
767854
bar_animation()
768855
dic[f"{name}_c"] = compact_format(dic[f"{name}_c"])
856+
if "*" in dic[f"{name}_c"][0]:
857+
if int(dic[f"{name}_c"][0].split("*")[0]) == dic["ntot"]:
858+
whr = dic["lol"].index(f"'{dic['label']}{name.upper()}.INC' /\n")
859+
del dic["lol"][whr]
860+
del dic["lol"][whr - 1]
861+
dic["lol"].insert(
862+
whr - 1, f"{name.upper()}\n{dic[f'{name}_c'][0]}/\n"
863+
)
864+
continue
769865
if name == "subtoglob":
770866
dic[f"{name}_c"].insert(0, "OPERNUM\n")
771867
else:
@@ -774,7 +870,7 @@ def write_props(dic):
774870
0,
775871
"-- This file was generated by pycopm https://github.com/cssr-tools/pycopm\n",
776872
)
777-
dic[f"{name}_c"].append("/")
873+
dic[f"{name}_c"].append("/\n")
778874
with open(
779875
f"{dic['fol']}/{dic['label']}{name.upper()}.INC",
780876
"w",
@@ -783,6 +879,53 @@ def write_props(dic):
783879
file.write("".join(dic[f"{name}_c"]))
784880

785881

882+
def compact_perm(dic, names):
883+
"""
884+
Use COPY and MULTIPLY is PERMY and PERMZ can be generated from PERMX
885+
886+
Args:
887+
dic (dict): Global dictionary\n
888+
names (list): Properties to write the .INC
889+
890+
Returns:
891+
names (list): Modified properties to write the .INC
892+
893+
"""
894+
cpermy, cpermz = False, False
895+
if dic["permx_c"] == dic["permy_c"]:
896+
names.remove("permy")
897+
whr = dic["lol"].index(f"'{dic['label']}PERMY.INC' /\n")
898+
del dic["lol"][whr]
899+
del dic["lol"][whr]
900+
cpermy = True
901+
if dic["facpermz"] > 0:
902+
delpermz = True
903+
for permx, permz in zip(dic["permx_c"], dic["permz_c"]):
904+
if abs(float(permz) - dic["facpermz"] * float(permx)) > 1e-12:
905+
delpermz = False
906+
break
907+
if delpermz:
908+
names.remove("permz")
909+
whr = dic["lol"].index(f"'{dic['label']}PERMZ.INC' /\n")
910+
del dic["lol"][whr]
911+
del dic["lol"][whr]
912+
cpermz = True
913+
if cpermy and cpermz:
914+
text = "COPY\nPERMX PERMY /\nPERMX PERMZ /\n/\n"
915+
if abs(1 - dic["facpermz"]) > 1e-12:
916+
text += f"\nMULTIPLY\nPERMZ {dic['facpermz']:.4E} /\n/\n"
917+
dic["lol"].insert(whr - 1, text)
918+
elif cpermy:
919+
text = "COPY\nPERMX PERMY /\n/\n"
920+
dic["lol"].insert(whr - 1, text)
921+
elif cpermz:
922+
text = "COPY\nPERMX PERMZ /\n/"
923+
if abs(1 - dic["facpermz"]) > 1e-12:
924+
text += f"\nMULTIPLY\nPERMZ {dic['facpermz']:.4E} /\n/\n"
925+
dic["lol"].insert(whr - 1, text)
926+
return names
927+
928+
786929
def compact_format(values):
787930
"""
788931
Use the 'n*x' notation to write repited values to save storage

0 commit comments

Comments
 (0)