def replace_kw( self , old_kw , new_kw): """ Will replace @old_kw with @new_kw in current EclFile instance. This method can be used to replace one of the EclKW instances in the current EclFile. The @old_kw reference must be to the actual EclKW instance in the current EclFile instance (the final comparison is based on C pointer equality!), i.e. it must be a reference (not a copy) from one of the ??get_kw?? methods of the EclFile class. In the example below we replace the SWAT keyword from a restart file: swat = file.iget_named_kw( "SWAT" , 0 ) new_swat = swat * 0.25 file.replace_kw( swat , new_swat ) The C-level ecl_file_type structure takes full ownership of all installed ecl_kw instances; mixing the garbage collector into it means that this is quite low level - and potentially dangerous! """ # We ensure that this scope owns the new_kw instance; the # new_kw will be handed over to the ecl_file instance, and we # can not give away something we do not alreeady own. if not new_kw.data_owner: new_kw = EclKW.copy( new_kw ) # The ecl_file instance will take responsability for freeing # this ecl_kw instance. new_kw.data_owner = False cfunc.replace_kw( self , old_kw , new_kw , False )
def replace_kw(self, old_kw, new_kw): """ Will replace @old_kw with @new_kw in current EclFile instance. This method can be used to replace one of the EclKW instances in the current EclFile. The @old_kw reference must be to the actual EclKW instance in the current EclFile instance (the final comparison is based on C pointer equality!), i.e. it must be a reference (not a copy) from one of the ??get_kw?? methods of the EclFile class. In the example below we replace the SWAT keyword from a restart file: swat = file.iget_named_kw( "SWAT" , 0 ) new_swat = swat * 0.25 file.replace_kw( swat , new_swat ) The C-level ecl_file_type structure takes full ownership of all installed ecl_kw instances; mixing the garbage collector into it means that this is quite low level - and potentially dangerous! """ # We ensure that this scope owns the new_kw instance; the # new_kw will be handed over to the ecl_file instance, and we # can not give away something we do not alreeady own. if not new_kw.data_owner: new_kw = EclKW.copy(new_kw) # The ecl_file instance will take responsability for freeing # this ecl_kw instance. new_kw.data_owner = False cfunc.replace_kw(self, old_kw, new_kw, False)
def restart_get_kw( self , kw_name , dtime , copy = False): """ Will return EclKW @kw_name from restart file at time @dtime. This function assumes that the current EclFile instance represents a restart file. It will then look for keyword @kw_name exactly at the time @dtime; @dtime is a datetime instance: file = EclFile( "ECLIPSE.UNRST" ) swat2010 = file.restart_get_kw( "SWAT" , datetime.datetime( 2000 , 1 , 1 )) By default the returned kw instance is a reference to the ecl_kw still contained in the EclFile instance; i.e. the kw will become a dangling reference if the EclFile instance goes out of scope. If the optional argument @copy is True the returned kw will be a true copy. If the file does not have the keyword at the specified time the function will return None. """ index = cfunc.get_restart_index( self , ctime( dtime ) ) if index >= 0: kw = self.iget_named_kw( kw_name , index ) if copy: return EclKW.copy( kw ) else: return kw else: return None
def restart_get_kw(self, kw_name, dtime, copy=False): """ Will return EclKW @kw_name from restart file at time @dtime. This function assumes that the current EclFile instance represents a restart file. It will then look for keyword @kw_name exactly at the time @dtime; @dtime is a datetime instance: file = EclFile( "ECLIPSE.UNRST" ) swat2010 = file.restart_get_kw( "SWAT" , datetime.datetime( 2000 , 1 , 1 )) By default the returned kw instance is a reference to the ecl_kw still contained in the EclFile instance; i.e. the kw will become a dangling reference if the EclFile instance goes out of scope. If the optional argument @copy is True the returned kw will be a true copy. If the file does not have the keyword at the specified time the function will return None. """ index = cfunc.get_restart_index(self, ctime(dtime)) if index >= 0: kw = self.iget_named_kw(kw_name, index) if copy: return EclKW.copy(kw) else: return kw else: return None
def iget_named_kw( self , kw_name , index , copy = False): """ Will return EclKW nr @index reference with header @kw_name. The keywords in a an ECLIPSE file are organized in a long linear array; keywords with the same name can occur many times. For instance a summary data[1] file might look like this: SEQHDR MINISTEP PARAMS MINISTEP PARAMS MINISTEP PARAMS .... To get the third 'PARAMS' keyword you can use the method call: params_kw = file.iget_named_kw( "PARAMS" , 2 ) The functionality of the iget_named_kw() method is also available through the __getitem__() method as: params_kw = file["PARAMS"][2] Observe that the returned EclKW instance is only a reference to the data owned by the EclFile instance. Observe that syntactically this is equivalent to file[kw_name][index], however the latter form will imply that all the keywords of this type are loaded from the file. If you know that only a few will actually be used it will be faster to use this method. [1]: For working with summary data you are probably better off using the EclSum class. """ kw_c_ptr = cfunc.iget_named_kw( self , kw_name , index ) ecl_kw = EclKW.wrap( kw_c_ptr , parent = self , data_owner = False) if copy: return EclKW.copy( ecl_kw ) else: return ecl_kw
def iget_named_kw(self, kw_name, index, copy=False): """ Will return EclKW nr @index reference with header @kw_name. The keywords in a an ECLIPSE file are organized in a long linear array; keywords with the same name can occur many times. For instance a summary data[1] file might look like this: SEQHDR MINISTEP PARAMS MINISTEP PARAMS MINISTEP PARAMS .... To get the third 'PARAMS' keyword you can use the method call: params_kw = file.iget_named_kw( "PARAMS" , 2 ) The functionality of the iget_named_kw() method is also available through the __getitem__() method as: params_kw = file["PARAMS"][2] Observe that the returned EclKW instance is only a reference to the data owned by the EclFile instance. Observe that syntactically this is equivalent to file[kw_name][index], however the latter form will imply that all the keywords of this type are loaded from the file. If you know that only a few will actually be used it will be faster to use this method. [1]: For working with summary data you are probably better off using the EclSum class. """ kw_c_ptr = cfunc.iget_named_kw(self, kw_name, index) ecl_kw = EclKW.wrap(kw_c_ptr, parent=self, data_owner=False) if copy: return EclKW.copy(ecl_kw) else: return ecl_kw
def __getitem__(self , index): """ Implements [] operator; index can be integer or key. Will look up EclKW instances from the current EclFile instance. The @index argument can either be an integer, in which case the method will return EclKW number @index, or alternatively a keyword string, in which case the method will return a list of EclKW instances with that keyword: restart_file = ecl_file.EclFile("ECLIPSE.UNRST") kw9 = restart_file[9] swat_list = restart_file["SWAT"] The keyword based lookup can be combined with an extra [] to get EclKW instance nr: swat9 = restart_file["SWAT"][9] Will return the 10'th SWAT keyword from the restart file. The following example will iterate over all the SWAT keywords in a restart file: restart_file = ecl_file.EclFile("ECLIPSE.UNRST") for swat in restart_file["SWAT"]: .... """ if isinstance( index , types.IntType): if index < 0 or index >= cfunc.get_size( self ): raise IndexError else: kw_c_ptr = cfunc.iget_kw( self , index ) return EclKW.wrap( kw_c_ptr , parent = self , data_owner = False) if isinstance( index , slice ): indices = index.indices( len(self) ) kw_list = [] for i in range(*indices): kw_list.append( self[i] ) return kw_list else: if isinstance( index , types.StringType): if self.has_kw( index ): kw_index = index kw_list = [] for index in range( self.num_named_kw( kw_index )): kw_list.append( self.iget_named_kw( kw_index , index)) return kw_list else: raise KeyError("Unrecognized keyword:\'%s\'" % index) else: raise TypeError("Index must be integer or string (keyword)")
def __getitem__(self, index): """ Implements [] operator; index can be integer or key. Will look up EclKW instances from the current EclFile instance. The @index argument can either be an integer, in which case the method will return EclKW number @index, or alternatively a keyword string, in which case the method will return a list of EclKW instances with that keyword: restart_file = ecl_file.EclFile("ECLIPSE.UNRST") kw9 = restart_file[9] swat_list = restart_file["SWAT"] The keyword based lookup can be combined with an extra [] to get EclKW instance nr: swat9 = restart_file["SWAT"][9] Will return the 10'th SWAT keyword from the restart file. The following example will iterate over all the SWAT keywords in a restart file: restart_file = ecl_file.EclFile("ECLIPSE.UNRST") for swat in restart_file["SWAT"]: .... """ if isinstance(index, types.IntType): if index < 0 or index >= cfunc.get_size(self): raise IndexError else: kw_c_ptr = cfunc.iget_kw(self, index) return EclKW.wrap(kw_c_ptr, parent=self, data_owner=False) if isinstance(index, slice): indices = index.indices(len(self)) kw_list = [] for i in range(*indices): kw_list.append(self[i]) return kw_list else: if isinstance(index, types.StringType): if self.has_kw(index): kw_index = index kw_list = [] for index in range(self.num_named_kw(kw_index)): kw_list.append(self.iget_named_kw(kw_index, index)) return kw_list else: raise KeyError("Unrecognized keyword:\'%s\'" % index) else: raise TypeError("Index must be integer or string (keyword)")
def iget_kw( self , index , copy = False): """ Will return EclKW instance nr @index. In the files loaded with the EclFile implementation the ECLIPSE keywords come sequentially in a long series, an INIT file might have the following keywords: INTEHEAD LOGIHEAD DOUBHEAD PORV DX DY DZ PERMX PERMY PERMZ MULTX MULTY ..... The iget_kw() method will give you a EclKW reference to keyword nr @index. This functionality is also available through the index operator []: file = EclFile( "ECLIPSE.INIT" ) permx = file.iget_kw( 7 ) permz = file[ 9 ] Observe that the returned EclKW instance is only a reference to the data owned by the EclFile instance. The method iget_named_kw() which lets you specify the name of the keyword you are interested in is in general more useful than this method. """ kw = self[index] if copy: return EclKW.copy( kw ) else: return kw
def iget_kw(self, index, copy=False): """ Will return EclKW instance nr @index. In the files loaded with the EclFile implementation the ECLIPSE keywords come sequentially in a long series, an INIT file might have the following keywords: INTEHEAD LOGIHEAD DOUBHEAD PORV DX DY DZ PERMX PERMY PERMZ MULTX MULTY ..... The iget_kw() method will give you a EclKW reference to keyword nr @index. This functionality is also available through the index operator []: file = EclFile( "ECLIPSE.INIT" ) permx = file.iget_kw( 7 ) permz = file[ 9 ] Observe that the returned EclKW instance is only a reference to the data owned by the EclFile instance. The method iget_named_kw() which lets you specify the name of the keyword you are interested in is in general more useful than this method. """ kw = self[index] if copy: return EclKW.copy(kw) else: return kw