def lyr_to_dfsu(self, lyr_name, output_dfsu): """ Create model layer .dfsu file `lyr` attribute. References `lyrs` attribute dictionary as value at element coordinates to write to .dfsu file. See also `lyr_from_shape`. Parameters ---------- lyr_name : str Layer name as key to `lyrs` attribute dictionary output_dfsu : str Path to output .dfsu file Returns ------- weights : array, shape (n_components,) """ # Check that lyr_name is correct assert self.lyrs[lyr_name].shape[0] == self.num_elements, \ "Length of input layer must equal number of mesh elements" # Load mesh file and mesh object mesh_class = dfs.mesh.MeshFile() dhi_mesh = mesh_class.ReadMesh(self.filename) # Call dfsu builder builder = dfs.dfsu.DfsuBuilder.Create(dfs.dfsu.DfsuFileType.Dfsu2D) builder.SetFromMeshFile(dhi_mesh) # Create arbitrary date and timestep; this is not a dynamic dfsu date = dt.datetime(2018, 1, 1, 0, 0, 0, 0) time_step = 1.0 builder.SetTimeInfo(System.DateTime(date.year, date.month, date.day), time_step) # Create dfsu attribute builder.AddDynamicItem( lyr_name, eumQuantity(eumItem.eumIManningsM, eumUnit.eumUMeter2One3rdPerSec)) # Create file dfsu_file = builder.CreateFile(output_dfsu) # Add lyr_name values net_arr = Array.CreateInstance(System.Single, self.num_elements) for i, val in enumerate(self.lyrs[lyr_name]): net_arr[i] = val dfsu_file.WriteItemTimeStepNext(0, net_arr) # Close file dfsu_file.Close()
def lyr_to_dfsu(self, lyr_name, output_dfsu, item_type=units.get_item("ManningsM"), unit_type=units.get_unit("Meter2One3rdPerSec")): """ Create model layer .dfsu file `lyr` attribute. References `lyrs` attribute dictionary as value at element coordinates to write to .dfsu file. See also :func:`lyr_from_shape()`. Parameters ---------- lyr_name : str Layer name as key to :class:`lyrs <dhitools.mesh.Mesh>` attribute dictionary output_dfsu : str Path to output .dfsu file item_type : int MIKE21 item code. See :func:`get_item() <dhitools.units.get_item>`. Default is "Mannings M" unit_type : int MIKE21 unit code. See :func:`get_unit() <dhitools.units.get_unit>`. Default is "Mannings M" unit "cube root metre per second" Returns ------- Creates a new dfsu file at output_dfsu : dfsu file """ # Check that lyr_name is correct assert self.lyrs[lyr_name].shape[0] == self.num_elements, \ "Length of input layer must equal number of mesh elements" # Load mesh file and mesh object mesh_class = dfs.mesh.MeshFile() dhi_mesh = mesh_class.ReadMesh(self.filename) # Call dfsu builder builder = dfs.dfsu.DfsuBuilder.Create(dfs.dfsu.DfsuFileType.Dfsu2D) builder.SetFromMeshFile(dhi_mesh) # Create arbitrary date and timestep; this is not a dynamic dfsu date = dt.datetime(2018, 1, 1, 0, 0, 0, 0) time_step = 1.0 builder.SetTimeInfo(System.DateTime(date.year, date.month, date.day), time_step) # Create dfsu attribute builder.AddDynamicItem(lyr_name, eumQuantity(item_type, unit_type)) # Create file dfsu_file = builder.CreateFile(output_dfsu) # Add lyr_name values net_arr = Array.CreateInstance(System.Single, self.num_elements) for i, val in enumerate(self.lyrs[lyr_name]): net_arr[i] = val dfsu_file.WriteItemTimeStepNext(0, net_arr) # Close file dfsu_file.Close()
def create_dfsu(self, arr, item_name, output_dfsu, start_datetime=None, timestep=None, item_type=units.get_item("SurfaceElevation"), unit_type=units.get_unit("meter")): """ Create a new `dfsu` file based on the underlying :class:`Dfsu()` for some new non-temporal or temporal layer. Parameters ---------- arr : ndarray, shape (num_elements, num_timesteps) Array to write to dfsu file. Number of rows must equal the number of elements in the :class:`Dfsu()` object and the order of the array must align with the order of the elements. Can create a non-temporal `dfsu` layer of a single dimensional input `arr`, or a temporal `dfsu` layer at `timestep` from `start_datetime`. item_name : str Name of item to write to `dfsu` output_dfsu : str Path to output .dfsu file start_datetime : datetime Start datetime (datetime object). If `None`, use the base :class:`Dfsu()` `start_datetime`. timestep : float Timestep delta in seconds. If `None`, use the base :class:`Dfsu()` `timestep`. item_type : str MIKE21 item code. See :func:`get_item() <dhitools.units.get_item>`. Default is "Mannings M" unit_type : str MIKE21 unit code. See :func:`get_unit() <dhitools.units.get_unit>`. Default is "Mannings M" unit "cube root metre per second" Returns ------- Creates a new dfsu file at output_dfsu : dfsu file """ assert arr.shape[0] == self.num_elements, \ "Rows of input array must equal number of mesh elements" dfs_obj = dfs.DfsFileFactory.DfsuFileOpen(self.filename) builder = dfs.dfsu.DfsuBuilder.Create(dfs.dfsu.DfsuFileType.Dfsu2D) # Create mesh nodes node_x = Array[System.Double](self.nodes[:, 0]) node_y = Array[System.Double](self.nodes[:, 1]) node_z = Array[System.Single](self.nodes[:, 2]) node_id = Array[System.Int32](self.node_boundary_codes) # Element table element_table = Array.CreateInstance(System.Int32, self.num_elements, 3) for i in range(self.num_elements): for j in range(self.element_table.shape[1]): element_table[i, j] = self.element_table[i, j] # Set dfsu items builder.SetNodes(node_x, node_y, node_z, node_id) builder.SetElements(dfs_obj.ElementTable) builder.SetProjection(dfs_obj.Projection) # Start datetime and time step if start_datetime is not None: sys_dt = System.DateTime(start_datetime.year, start_datetime.month, start_datetime.day, start_datetime.hour, start_datetime.minute, start_datetime.second) else: sys_dt = dfs_obj.StartDateTime if timestep is None: timestep = dfs_obj.TimeStepInSeconds builder.SetTimeInfo(sys_dt, timestep) # Create item builder.AddDynamicItem(item_name, eumQuantity(item_type, unit_type)) # Create file dfsu_file = builder.CreateFile(output_dfsu) # Write item data if arr.ndim != 1: # Multiple time steps nsteps = arr.shape[1] for j in range(nsteps): net_arr = Array.CreateInstance(System.Single, self.num_elements) for i, val in enumerate(arr[:, j]): net_arr[i] = val dfsu_file.WriteItemTimeStepNext(0, net_arr) else: # Single timestep net_arr = Array.CreateInstance(System.Single, self.num_elements) for i, val in enumerate(arr): net_arr[i] = val dfsu_file.WriteItemTimeStepNext(0, net_arr) # Close file dfsu_file.Close()
def create_dfsu( self, items, output_dfsu, start_datetime=None, timestep=None, ): """ Create a new `dfsu` file based on the underlying :class:`Dfsu()` for some new non-temporal or temporal layer. Parameters ---------- items : dictionary Dict of items to write to dfsu. Item data and info is stored as a sub-dict of the items dict. Item and unit information can be assigned to the dictionary. If left blank, items will be assigned as type SurfaceElevation (units: m) All item data should have the same number of timesteps. Example: items = {'Surface Elevation': { 'arr': element_data, 'item_type': units.get_item("SurfaceElevation"), 'unit_type': units.get_unit("meter"), } Dict-keys : str Name of items to write to `dfsu` Sub-Dict Keys and Values: arr : ndarray, shape (num_elements, num_timesteps) Array to write to dfsu file. Number of rows must equal the number of elements in the :class:`Dfsu()` object and the order of the array must align with the order of the elements. Can create a non-temporal `dfsu` layer of a single dimensional input `arr`, or a temporal `dfsu` layer at `timestep` from `start_datetime`. item_type: str MIKE21 item code. See :func:`get_item() <dhitools.units.get_item>`. Default is "SurfaceElevation" unit_type : str MIKE21 unit code. See :func:`get_unit() <dhitools.units.get_unit>`. Default is "meter" unit output_dfsu : str Path to output .dfsu file start_datetime : datetime Start datetime (datetime object). If `None`, use the base :class:`Dfsu()` `start_datetime`. timestep : float Timestep delta in seconds. If `None`, use the base :class:`Dfsu()` `timestep`. Returns ------- Creates a new dfsu file at output_dfsu : dfsu file output_dfsu : str Path to output .dfsu file start_datetime : datetime Start datetime (datetime object). If `None`, use the base :class:`Dfsu()` `start_datetime`. timestep : float Timestep delta in seconds. If `None`, use the base :class:`Dfsu()` `timestep`. item_type : str MIKE21 item code. See :func:`get_item() <dhitools.units.get_item>`. Default is "Mannings M" unit_type : str MIKE21 unit code. See :func:`get_unit() <dhitools.units.get_unit>`. Default is "Mannings M" unit "cube root metre per second" Returns ------- Creates a new dfsu file at output_dfsu : dfsu file """ dim = self.elements.shape for v in items.values(): assert (v["arr"].shape[0] == dim[0] ), "Rows of input array must equal number of mesh elements" dfs_obj = dfs.DfsFileFactory.DfsuFileOpen(self.filename) builder = dfs.dfsu.DfsuBuilder.Create(dfs.dfsu.DfsuFileType.Dfsu2D) # Create mesh nodes node_x = Array[System.Double](self.nodes[:, 0]) node_y = Array[System.Double](self.nodes[:, 1]) node_z = Array[System.Single](self.nodes[:, 2]) node_id = Array[System.Int32](self.node_boundary_codes) # Element table element_table = Array.CreateInstance(System.Int32, self.num_elements, 3) for i in range(self.num_elements): for j in range(dim[1]): element_table[i, j] = self.element_table[i, j] # Set dfsu items builder.SetNodes(node_x, node_y, node_z, node_id) builder.SetElements(dfs_obj.ElementTable) builder.SetProjection(dfs_obj.Projection) # Start datetime and time step if start_datetime is not None: sys_dt = System.DateTime( start_datetime.year, start_datetime.month, start_datetime.day, start_datetime.hour, start_datetime.minute, start_datetime.second, ) else: sys_dt = dfs_obj.StartDateTime if timestep is None: timestep = dfs_obj.TimeStepInSeconds builder.SetTimeInfo(sys_dt, timestep) # Create items for item_name, v in items.items(): builder.AddDynamicItem(item_name, eumQuantity(v["item_type"], v["unit_type"])) # Create file dfsu_file = builder.CreateFile(output_dfsu) # Stack arrays by a third dimension (nelements x ntimesteps x nvariables) arr = np.dstack([v["arr"] for v in items.values()]) # Write item data ntimesteps = arr.shape[1] nvariables = arr.shape[2] for j in range(ntimesteps): for k in range(nvariables): net_arr = Array.CreateInstance(System.Single, dim[0]) for i, val in enumerate(arr[:, j, k]): net_arr[i] = val dfsu_file.WriteItemTimeStepNext(0, net_arr) # Close file dfsu_file.Close()