def create( self, meshfilename, filename, data, start_time=None, dt=1, timeseries_unit=TimeStep.SECOND, variable_type=None, unit=None, names=None, title=None, ): n_items = len(data) n_time_steps = np.shape(data[0])[0] if start_time is None: start_time = datetime.now() if names is None: names = [f"Item {i+1}" for i in range(n_items)] if variable_type is None: variable_type = [999] * n_items if unit is None: unit = [0] * n_items if title is None: title = "" system_start_time = System.DateTime( start_time.year, start_time.month, start_time.day, start_time.hour, start_time.minute, start_time.second, ) mesh = MeshFile.ReadMesh(meshfilename) # TODO support all types of Dfsu builder = DfsuBuilder.Create(DfsuFileType.Dfsu2D) # Setup header and geometry, copy from source file # zn have to be Single precision?? zn = Array[System.Single](list(mesh.Z)) builder.SetNodes(mesh.X, mesh.Y, zn, mesh.Code) builder.SetElements(mesh.ElementTable) factory = DfsFactory() proj = factory.CreateProjection(mesh.ProjectionString) builder.SetProjection(proj) builder.SetTimeInfo(system_start_time, dt) builder.SetZUnit(eumUnit.eumUmeter) for i in range(n_items): builder.AddDynamicItem( names[i], eumQuantity.Create(variable_type[i], unit[i]) ) try: dfs = builder.CreateFile(filename) except IOError: print("cannot create dfsu file: ", filename) deletevalue = dfs.DeleteValueFloat # Add data for all item-timesteps, copying from source for i in range(n_time_steps): for item in range(n_items): d = data[item][i, :] d[np.isnan(d)] = deletevalue darray = Array[System.Single](np.array(d.reshape(d.size, 1)[:, 0])) dfs.WriteItemTimeStepNext(0, darray) dfs.Close()
def create( self, meshfilename, filename, data, start_time=None, dt=1, timeseries_unit=TimeStep.SECOND, items=None, title=None, ): """Create a dfsu file Parameters ----------- meshfilename: str, full path to a mesh or dfsu file filename: str full path to the new dfsu file data: list[np.array] list of matrices, one for each item. Matrix dimension: time, y, x start_time: datetime, optional start datetime, default is datetime.now() dt: float The time step. Therefore dt of 5.5 with timeseries_unit of TimeStep.MINUTE means 5 mins and 30 seconds. Default 1 timeseries_unit: TimeStep, optional default TimeStep.SECOND unit: list[ItemInfo], optional Name, item, unit, default is undefined title: str title of the dfsu file. Default is blank. """ n_items = len(data) n_time_steps = np.shape(data[0])[0] if start_time is None: start_time = datetime.now() if items is None: items = [ItemInfo(f"temItem {i+1}") for i in range(n_items)] if title is None: title = "" system_start_time = to_dotnet_datetime(start_time) # Default filetype; filetype = DfsuFileType.Dfsu2D _, ext = os.path.splitext(meshfilename) if ext == ".mesh": source = MeshFile.ReadMesh(meshfilename) projstr = source.ProjectionString elif ext == ".dfsu": source = DfsuFile.Open(meshfilename) projstr = source.Projection.WKTString filetype = source.DfsuFileType xn = source.X yn = source.Y # zn have to be Single precision?? zn = to_dotnet_float_array(np.array(list(source.Z))) nodecodes = source.Code elementtable = source.ElementTable builder = DfsuBuilder.Create(filetype) builder.SetNodes(xn, yn, zn, nodecodes) builder.SetElements(elementtable) builder.SetNodeIds(source.NodeIds) builder.SetElementIds(source.ElementIds) factory = DfsFactory() proj = factory.CreateProjection(projstr) builder.SetProjection(proj) builder.SetTimeInfo(system_start_time, dt) builder.SetZUnit(eumUnit.eumUmeter) if filetype != DfsuFileType.Dfsu2D: builder.SetNumberOfSigmaLayers(source.NumberOfSigmaLayers) for item in items: if item.name != "Z coordinate": builder.AddDynamicItem( item.name, eumQuantity.Create(item.type, item.unit)) try: dfs = builder.CreateFile(filename) except IOError: print("cannot create dfsu file: ", filename) deletevalue = dfs.DeleteValueFloat try: # Add data for all item-timesteps, copying from source for i in range(n_time_steps): for item in range(n_items): d = data[item][i, :] d[np.isnan(d)] = deletevalue darray = to_dotnet_float_array(d) dfs.WriteItemTimeStepNext(0, darray) dfs.Close() except Exception as e: print(e) dfs.Close() os.remove(filename)
def create( self, meshfilename, filename, data, start_time=None, dt=1, timeseries_unit=TimeStep.SECOND, items=None, title=None, ): """Create a dfsu file Parameters ----------- meshfilename: str, full path to a valid mesh file filename: str full path to the new dfsu file data: list[np.array] list of matrices, one for each item. Matrix dimension: time, y, x start_time: datetime, optional start datetime, default is datetime.now() dt: float The time step. Therefore dt of 5.5 with timeseries_unit of TimeStep.MINUTE means 5 mins and 30 seconds. Default 1 timeseries_unit: TimeStep, optional default TimeStep.SECOND unit: list[ItemInfo], optional Name, item, unit, default is undefined title: str title of the dfsu file. Default is blank. """ n_items = len(data) n_time_steps = np.shape(data[0])[0] if start_time is None: start_time = datetime.now() if items is None: items = [ItemInfo(f"temItem {i+1}") for i in range(n_items)] if title is None: title = "" system_start_time = System.DateTime( start_time.year, start_time.month, start_time.day, start_time.hour, start_time.minute, start_time.second, ) mesh = MeshFile.ReadMesh(meshfilename) # TODO support all types of Dfsu builder = DfsuBuilder.Create(DfsuFileType.Dfsu2D) # Setup header and geometry, copy from source file # zn have to be Single precision?? zn = Array[System.Single](list(mesh.Z)) builder.SetNodes(mesh.X, mesh.Y, zn, mesh.Code) builder.SetElements(mesh.ElementTable) factory = DfsFactory() proj = factory.CreateProjection(mesh.ProjectionString) builder.SetProjection(proj) builder.SetTimeInfo(system_start_time, dt) builder.SetZUnit(eumUnit.eumUmeter) for item in items: builder.AddDynamicItem(item.name, eumQuantity.Create(item.type, item.unit)) try: dfs = builder.CreateFile(filename) except IOError: print("cannot create dfsu file: ", filename) deletevalue = dfs.DeleteValueFloat # Add data for all item-timesteps, copying from source for i in range(n_time_steps): for item in range(n_items): d = data[item][i, :] d[np.isnan(d)] = deletevalue darray = Array[System.Single](np.array( d.reshape(d.size, 1)[:, 0])) dfs.WriteItemTimeStepNext(0, darray) dfs.Close()