pymarthe.mfield
Contains the classes related to field data. Designed for handling distributed Marthe properties (structured and unstructured grid)
Attributes
Classes
Class to handle Marthe single grid. |
|
Wrapper Marthe --> python |
|
Wrapper Marthe --> python |
Module Contents
- class pymarthe.mfield.MartheGrid(istep, layer, inest, nrow, ncol, xl, yl, dx, dy, xcc, ycc, array, field=None)
Class to handle Marthe single grid.
- get_cell_vertices(i, j, closed=False)
DOES NOT WORK PROPERLY!
- to_records(fmt='light', base=0)
Convert grid values to flatten recarray.
Parameters:
- fmt (str)output format.
- Can be:
‘light’ : output columns: ‘layer,inest,i,j,x,y,value’
‘full’ : output columns: ‘node,layer,inest,i,j,x,y,dx,dy,vertices,value’
Default is ‘light’. Note: the ‘full’ format is obviously slower.
- base (int)n-based array format
- Can be :
0 (Python)
1 (Fortran)
Default is 0.
Returns:
Write data inplace. (record files, listm files, pastp file)
Examples:
mg.to_records(fmt=’light’)
- to_string(maxlayer=None, maxnest=None, rlevel=None, keep_uniform_fmt=False)
Convert grid to a single string with Marthe Grid file format. Parameters: ———– maxlayer (int/None, optional) : maximum number of layer.
If None, value will be ‘0’. Default is None.
- maxnest (int/None, optional)maximum number of nested grid.
If None, value will be ‘0’. Default is None.
- rlevel (int/None, optional)refine level to extract adjacent
cells informations. Default is None.
- keep_uniform_fmt (bool, optional)whatever to conserve marthe light format
for uniform grid. If True, light format will be conserved. If False, all grids will be written explictly. Default is False. /!/ CAREFULL /!/ keeping uniform light format on permh field can modify the model geometry.
Return:
- lines_str (str)Marthe Grid string format
(ready to write)
Example
mygrid = MartheGrid(0, 0, 125, 126, 325., 750., dx, dy, xcc, ycc, array, field = ‘PERMEAB’) with open(‘mymarthegrid.prop’, ‘r’) as f:
f.write(mygrid.to_string())
- to_pyshp()
Convert grid to list of polygons with vertices coordinates.
Parameters:
self (MartheGrid) : MartheGrid instance
Return:
- pyshp_parts (list) = polygons parts with
xy-vertices coordinates.
Example
parts = mg.to_pyshp()
- to_patches()
Convert grid to list of matplotlib.Path
Parameters:
self (MartheGrid) : MartheGrid instance
Return:
patches (list) = list of Path objects
Example
patches = mg.to_patches()
- __str__()
Internal string method.
- pymarthe.mfield.encoding = 'latin-1'
- pymarthe.mfield.dmv
- class pymarthe.mfield.MartheField(field, data, mm, use_imask=True)
Wrapper Marthe –> python
- get_xyvertices(stack=False)
Function to fetch x and y vertices of the modelgrid.
Parameters:
- stack (bool)stack output array
- Formatnp.array([vx1, vy1],
- [vx2, vy2],
… )
Default is False.
Returns:
- if stack is False:
vx, vy (array) : xy-vertices.
- if stack is True:
vxy (array) : stacked xy-vertices
Examples:
vx, vy = mf.get_xyvertices()
- sample(x, y, layer, masked_values=None, as_mask=False, as_idx=False)
Sample field data by x, y, layer coordinates. It will perform simple a spatial intersection with field data.
Parameters:
x, y (float/iterable) : xy-coordinate(s) of the required point(s) layer (int/iterable) : layer id(s) to intersect data. masked_values (None/list, optional) : values to ignore during the sampling process
Default is None.
- as_mask (bool, optional)return field boolean mask.
Does not allow duplicated value (array <= x,y). Default is False.
- as_idx (bool, optional)return field indexes (=cell ids, =node numbers).
Allows duplicated values (array >= x,y)
Returns:
rec (np.recarray) : data intersected on point(s) mask (np.array [1D]) : field boolean mask (if as_mask = True) idx (np.array [1D]) : cell ids/node number/field indexes (if as_idx = True)
Examples:
rec = mf.sample(x=456.32, y=567.1, layer=0)
- get_data(layer=None, inest=None, as_array=False, as_mask=False, masked_values=list())
Function to select/subset NON-masked values.
Parameters:
- layer (int, optional)number(s) of layer required.
If None, all layers are considered. Default is None.
- inest (int, optional)number(s) of nested grid required.
If None, all nested are considered. Default is None.
- as_array (bool, optional)returning data as 3D-array.
Format : (layer*inest, row, col) Default is False.
- as_mask (bool, optional)returning data as boolean index.
Default is False.
Returns:
- if as_array is False:
rec (np.recarray) : selected data as recarray.
- if as_array is True:
arr (3D-array) : selected data as array.
- Note: if all arguments are set to None,
all data is returned.
Examples:
rec1 = mf.get_data(layer=[1,5,8], inest = 1) arr1 = mf.get_data(inest=3, as_array=True)
- set_data(data, layer=None, inest=None)
Set field data for active cells (where imask is 1) and NON-masked values (see dmv)
Parameters:
- data (object)field data to read/set.
- Can be:
Marthe property file (‘mymodel.permh’)
Recarray with layer, inest,… informations
3D-array
- layer (int, optional)number(s) of layer required.
If None, all layers are considered. Default is None.
- inest (int, optional)number(s) of nested grid required.
If None, all nested are considered. Default is None.
Returns:
Set field data inplace.
Examples:
mf.set_data(permh_recarray) mf.set_data(permh3darray) # structured grids only mf.set_data(2.3e-3) # all layers/inest mf.set_data(2.3e-3, layer=2, inest=3) # one nest
- get_masked(rec)
Return field data (rec.array) after masking with model active cells (.imask). Note : if the field is not related to the model (`use_imask`=False) then return
the input data.
Parameters:
rec (rec.array) : field data.
Returns:
mrec (rec.array) : masked field data
Examples:
mf.get_masked()
- set_data_from_parfile(parfile, izone, btrans='none')
Set field data from parameter file inplace.
Parameters:
- parfile (str)path to parameter file to read.
Can be either zpc or pp parameter.
izone (MartheField) : parameter zone(s) field.
- btrans (str, optional)string function to back-transform
field values. Default is ‘none’.
Examples:
parfile = ‘par/hk_zpc.dat’ mf.set_data_from_parfile(parfile,
izone, btrans=’lambda x: 10**x’)
- as_3darray()
Wrapper to .get_data(inest=0, as_array=True) with error handling for nested model.
Parameters:
self (MartheField) : MartheField instance.
Returns:
- arr (3D-array)array 3D of main grid only.
Format : (layer, row, col)
Examples:
arr3d = mf.as_3darray()
- static grids2rec(grids)
Read Marthe field property file. Wrapper of marthe_utils.read_grid_file().
Parameters:
filename (str) : path to Marthe field property file.
Returns:
- rec (np.recarray)recarray with all usefull informations
for each model grid cell such as layer, inest, value, …
Examples:
rec = mf._grid2rec(‘mymodel.emmca’)
- _3d2rec(arr3d)
Convert 3D-array Wrapper of marthe_utils.read_grid_file().
Parameters:
filename (str) : path to Marthe field property file.
Returns:
- rec (np.recarray)recarray with all usefull informations
for each model grid cell such as layer, inest, value, …
Examples:
rec = mf._grid2rec(‘mymodel.emmca’)
- _rec2grid(layer, inest)
Single MartheGrid instance construction from given layer and inest.
Parameters:
layer (int) : number of layer required. inest (int) : number of nested grid required.
Returns:
mg (MartheGrid) : Single Marthe grid instance.
Examples:
rec = mf._grid2rec(‘mymodel.emmca’)
- to_grids(layer=None, inest=None)
Converting internal data (recarray) to a list of MartheGrid instance for given layers and inests.
Parameters:
- layer (int, optional)number(s) of layer required.
If None, all layers are considered. Default is None.
- inest (int, optional)number(s) of nested grid required.
If None, all nested are considered. Default is None.
Returns:
mgrids (list) : Required MartheGrid instances.
Examples:
mg = mf.to_grids(layer)
- write_data(filename=None, keep_uniform_fmt=False)
Write field data in Marthe field property file.
Parameters:
filename (str) : path to write field data.
- keep_uniform_fmt (bool, optional)whatever to conserve marthe light format
for uniform grid. If True, light format will be conserved. If False, all grids will be written explictly. Default is False. /!/ CAREFULL /!/ keeping uniform light format on permh field can modify the model geometry.
Returns:
Write in Marthe field property file on disk.
Examples:
mf.write_data(‘modified.permh’)
- to_shapefile(filename=None, layer=0, inest=None, masked_values=dmv, log=False, epsg=None, prj=None)
Write field data as shapefile by layer.
Parameters:
- filename (str, optional)shapefile path to write.
If None, filename = ‘field_layer.shp’. Default is None
- layer (int, optional)layer numerical id to export.
Note : a unique layer id is allowed Default is 0.
- inest (int, optional)nested grid numerical id to export.
If None, all nested grid are considered. Default is None.
- masked_values (list, optional)field values to ignore.
Default is [-9999., 0., 9999].
- log (bool, optional)logarithmic transformation of all values.
Default is False.
- epsg (int, optional)Geodetic Parameter Dataset.
Default is None.
- prj (str, optional)cartographic projection and coordinates
Default is None.
Returns:
Write shape in filename.
Examples:
filename = os.path.join(‘gis’, ‘permh_layer5.shp’) mf.to_shapefile(filename, layer=5)
- plot(ax=None, layer=0, inest=None, vmin=None, vmax=None, log=False, extent=None, masked_values=dmv, basemap=False, **kwargs)
Plot data by layer
Parameters:
- ax (matplotlib.axes, optional)matplotlib.axes custom ax.
If None basic ax will be create. Default is None.
- layer (int, optional)layer numerical id to export.
Note : a unique layer id is allowed Default is 0.
- inest (int, optional)nested grid numerical id to export.
If None, all nested grid are considered. Default is None.
vmin, vmax (float, optional) : min/max value(s) to plot.
- log (bool, optional)logarithmic transformation of all values.
Default is False.
- extent (tuple/list, optional): xy-limits of the plot window.
Format: (xmin, ymin, xmax, ymax). If None, window correspond to the entire model domain. Default is None.
- masked_values (list, optional)field values to ignore.
Default is [-9999., 0., 9999].
- basemap (dict/bool, optional)add base map to AxesSubplot.
/!/ Required python contextily module /!/ Can be:
False : not adding any basemap
- Trueadd standard basemap.
-> provider: Stamen Terrain web tiles. -> crs: Spherical Mercator projection (EPSG:3857)
- dict()contextily.add_basemap() arguments.
- Format:
- {‘source’:TileProvider object,
zoom:’auto’, … , ‘crs’: ‘EPSG:2154’}
Default is False.
- **kwargs (optional)matplotlib.PathCollection arguments.
(ex: cmap, lw, ls, edgecolor, …)
Returns:
- ax (matplotlib.axes)standard ax with 2 collections:
1 for rectangles
1 for colorbar
Examples:
ax = mf.plot(layer=6, cmap=’jet’) ax.set_title(‘Field (layer = 6)’, fontsize=14)
- zonal_stats(stats, polygons, layer=None, names=None, trans='none')
Perform statistics on zonal areas.
Parameters:
- stats (str/list)statistics functions to perform.
Must be recognize by pandas.DataFrame.agg() method. Example: stats = [‘mean’, ‘min’,’max’,’median’,’count’].
- polygons (it)iterable containing single part polygons.
- Format: [ [(x0, y0),(x1,y1),(x2,y2)],.., [(x’N,y’N),..], ..]
<=> [ polygon_0 ,.., polygon_N ].
- layer (int/it, optional)layer id(s) on wich perform zonal statistics.
If None, all layers are considered. Default is None.
- names (str/it, optional)names of zones in the output.
If None, generic names are created with field and zone number (‘field_z0’, ‘field_z1’,…). Default is None.
- trans (str/func, optional): function/function name to transform field values
before applying statistics. If None, field values are not transformed. Default is ‘none’.
Returns:
zstats_df (DataFrame) : DataFrame with rows MultiIndex (‘zone’, ‘layer’).
Examples:
stats = [‘mean’,’max’,’min’,’median’,’count’] polygons = shp_utils.read_shapefile(‘mypolygons.shp’)[‘coords’] zdf = mf.zonal_stats(stats, polygons, layer=[4,5,6])
- to_vtk(filename=None, trans='none', masked_values=dmv, **kwargs)
Build vtk unstructured grid from model geometry and add current field to cell dataset.
**kwargs correspond to the arguments of the MartheModel.get_vtk() method.
Required python vtk package.
Parameters:
- filename (str, optional)vtk file name to write without extension.
Extension will be inferred. If None, filename = field. Default is None.
- trans (str, optional)transformation to apply to the values.
See pymarthe.utils.pest_utils.transform. Default is ‘none’.
- masked_values (float/it, optional)values to mask of the current field data.
Default are [9999, 0, -9999].
- vertical_exageration (float, kwargs)floating point value to scale vertical
exageration of the vtk points. Default is 0.05.
- hws (str, kwargs)hanging wall state, flag to define whatever the superior
hanging walls of the model are defined as normal layers (explivitly) or not (implicitly). Can be:
‘implicit’
‘explicit’
Default is ‘implicit’.
- smooth (bool, kwargs)boolean flag to enable interpolating vertex elevations
based on shared cell. Default is False.
- binary (bool, kwargs)Enable binary writing, otherwise classic ASCII format
will be consider. Default is True. Note : binary is prefered as paraview can produced bug
representing NaN values from ASCII (non xml) files.
- xml (bool, kwargs)Enable xml based VTK files writing.
Default is False.
- shared_points (bool, kwargs)Enable sharing points in grid polyhedron construction.
Default is False. Note : False is prefered as paraview has a bug (8/4/2021)
where some polyhedron will not properly close when using shared points.
Returns:
vtk (pymarthe.utils.vtk_utils.Vtk) : Vtk class containg unstructured vtk grid
Example:
mf = mm.prop[‘permh’] myvtk = mf.to_vtk(filename = mf.field, trans=’log10’, vertical_exageration=0.02)
- __str__()
Internal string method.
- class pymarthe.mfield.MartheFieldSeries(mm, chasim=None)
Wrapper Marthe –> python Manage series of MartheField instances.
- check_fieldname(fieldname, raise_error=True)
Check if field name exist and is already added to main .data dictionary.
- Parameters:
(str) (fieldname) –
(bool (raise_error) – just returning boolean response.
optional) (whatever raising error on checks or) – just returning boolean response.
Returns –
-------- –
(tuple[bool]) (res) – (only available when raise_error is False).
Examples
exist, load = mfs.check_fieldnames(‘%saturation’, raise_error=False)
- load_field(field, istep=None)
Set dictionary of MartheField instances in .data. Format: { istep_0: MartheField_0,
…, istep_N: Marthefield_N}
- Parameters:
(str) (field) –
- Notemust be written with the same
typology as written in the chasim file.
(int/it (istep) – sequence of timesteps. If None, all simulated timesteps will be considered. Default is None.
optional) (required timestep number or) – sequence of timesteps. If None, all simulated timesteps will be considered. Default is None.
Examples
mm = MartheField(‘mona.rma’) mfs = MartheFieldSeries(mm, chasim=None) mfs.load_field(‘CHARGE’, istep= list(range(20)))
- get_tseries(field, x, y, layer, names=None, index='date', masked_values=dmv[::2], base=0)
Sample field data by x, y, layer coordinates and stack timeseries in a DataFrame. It will perform simple a spatial intersection with field data.
Parameters:
field (str) : required field names.
x, y (float/iterable) : xy-coordinate(s) of the required point(s)
layer (int/iterable) : layer id(s) to intersect data.
- names (str/list of str, optional)additional names of each required point coordinates.
If None, standard names are given according to the coordinates. Example: ‘23i_45j_6k’ Default is None.
- masked_values (None/list): values to ignore during the sampling process
Default are [-9999, 0, 9999].
- index (str, optional)type of index required for the output DataFrame.
- Can be:
‘date’: index is a pd.DatetimeIndex.
‘istep’: index is a pd.index
‘combined’: index is a pd.MultiIndex(pd.index, pd.DatetimeIndex)
Default is ‘date’.
- base (int, optional)spatial coordinates base reference.
Default is 0. Note : only use to build default output DataFrame columns
when names is not provided.
Reminder : Python is 0-based and Marthe is compiled in 1-based (Fortran).
Returns:
df (DataFrame): Output timeseries stack in DataFrame.
Examples:
x, y = [343., 385.3], [223., 217.2] layer = 0 names = [‘rec1’, ‘rec2’] df = mfs.get_tseries(‘CHARGE’, x, y, layer, names)
- save_animation(field, filename, dpf=0.25, dpi=200, **kwargs)
Build a .gif animation from a series of field data. /!/ Package imageio required /!/
Parameters:
field (str) : required field names.
- filename (str)required output file name.
Example: ‘myfieldanimation.gif’
- dpf (float, optional)duration per frame (in second).
Default is 0.25.
- dpi (int, optional)dots per inch (=image/plot resolution).
Default is 200.
**kwargs : MartheField.plot arguments.
Returns:
Save .gif animation in filename.
Examples:
mfs.save_animation(‘CHARGE’, ‘chargeout.gif’, dpf = 0.2, dpi=200, layer=5, cmap=’jet’)
- to_shapefile(field, filename=None, layer=0, inest=None, masked_values=dmv, log=False, epsg=None, prj=None)
Save field series in shapefile.
Parameters:
field (str) : required field name.
- filename (str, optional)shapefile name to write.
If None, filename = ‘field_layer.shp’. Default is None.
- layer (int, optional)layer numerical id to export.
Note : a unique layer id is allowed Default is 0.
- inest (int, optional)nested grid numerical id to export.
If None, all nested grid are considered. Default is None.
- masked_values (list, optional)field values to ignore.
Default is [-9999., 0., 9999].
- log (bool, optional)logarithmic transformation of all values.
Default is False.
- epsg (int, optional)Geodetic Parameter Dataset.
Default is None.
- prj (str, optional)cartographic projection and coordinates
Default is None.
Returns:
Save vectorial geometries and records in filename.
Examples:
mfs.to_shapefile(layer=3)
- __str__()
Internal string method.