Exemple #1
0
    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()
Exemple #2
0
    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()
Exemple #3
0
    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()
Exemple #4
0
    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()