@@ -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"\n Running { dic ['fol' ]} /{ dic ['write' ]} _CORR.DATA with the corrected "
414410 "pore volume\n "
@@ -454,6 +450,84 @@ def create_deck(dic):
454450 print (f"\n The 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+
457531def 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
541625def 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 ("\n ACTNUM\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\n PERMX PERMY /\n PERMX PERMZ /\n /\n "
915+ if abs (1 - dic ["facpermz" ]) > 1e-12 :
916+ text += f"\n MULTIPLY\n PERMZ { dic ['facpermz' ]:.4E} /\n /\n "
917+ dic ["lol" ].insert (whr - 1 , text )
918+ elif cpermy :
919+ text = "COPY\n PERMX PERMY /\n /\n "
920+ dic ["lol" ].insert (whr - 1 , text )
921+ elif cpermz :
922+ text = "COPY\n PERMX PERMZ /\n /"
923+ if abs (1 - dic ["facpermz" ]) > 1e-12 :
924+ text += f"\n MULTIPLY\n PERMZ { dic ['facpermz' ]:.4E} /\n /\n "
925+ dic ["lol" ].insert (whr - 1 , text )
926+ return names
927+
928+
786929def compact_format (values ):
787930 """
788931 Use the 'n*x' notation to write repited values to save storage
0 commit comments