The Dataset.to_dfs() method is the primary way of writing dfs files in MIKE IO. In some case, however, the data we want to write to a file is larger than the system memory and we will therefore not be able to store it in a Dataset before writing to disk.
This notebook shows how to write larger-than-memory data to a dfsu file.
import numpy as np
import pandas as pd
import mikeio
mesh_file = "../tests/testdata/north_sea_2.mesh"
msh = mikeio.open(mesh_file)
msh.geometry
Flexible Mesh Geometry: Dfsu2D number of nodes: 1296 number of elements: 2259 projection: LONG/LAT
time = pd.date_range("2018-1-1", end="2018-2-1", freq="D")
dt_seconds = (time[1] - time[0]).total_seconds()
xy = msh.geometry.element_coordinates[:,:2]
# the "data" to be written to file
item1 = mikeio.ItemInfo("Item1", mikeio.EUMType.Water_Level)
def func1(t, x, y):
t = np.atleast_1d(t)
data = np.zeros(shape=(len(t), len(x)))
for j in range(len(t)):
data[j,:] = 0.01*t[j]*np.cos(0.2*x)*np.sin(2*y)
return data
item2 = mikeio.ItemInfo("Item2", mikeio.EUMType.Water_Level)
def func2(t, x, y):
t = np.atleast_1d(t)
data = np.zeros(shape=(len(t), len(x)))
for j in range(len(t)):
data[j,:] = 0.01*(3-t[j])*np.cos(0.4*x)*np.sin(0.8*y)
return data
data10 = func1(t=0, x=xy[:,0], y=xy[:,1])
da1 = mikeio.DataArray(data=data10, time=time[0], geometry=msh.geometry, item=item1)
data20 = func2(t=0, x=xy[:,0], y=xy[:,1])
da2 = mikeio.DataArray(data=data20, time=time[0], geometry=msh.geometry, item=item2)
da2.plot();
ds = mikeio.Dataset([da1, da2])
ds
<mikeio.Dataset> dims: (time:1, element:2259) time: 2018-01-01 00:00:00 (time-invariant) geometry: Dfsu2D (2259 elements, 1296 nodes) items: 0: Item1 <Water Level> (meter) 1: Item2 <Water Level> (meter)
dfs = mikeio.Dfsu(mesh_file)
fn = "bigfile1.dfsu"
with dfs.write(fn, data=ds, dt=dt_seconds, keep_open=True) as f:
for tj in time[1:]:
t = (tj - time[0]).total_seconds()
ds[0].values = func1(t, x=xy[:,0], y=xy[:,1])
ds[1].values = func2(t, x=xy[:,0], y=xy[:,1])
ds.time = tj
f.append(ds)
The older option is to use dfs.write_header()
dfs = mikeio.Dfsu(mesh_file)
fn = "bigfile2.dfsu"
with dfs.write_header(fn, start_time=time[0], dt=dt_seconds, items=[item1, item2]) as f:
for tj in time:
t = (tj - time[0]).total_seconds()
data1 = func1(t, x=xy[:,0], y=xy[:,1])
data2 = func2(t, x=xy[:,0], y=xy[:,1])
f.append(data=[data1, data2])
import os
os.remove("bigfile1.dfsu")
os.remove("bigfile2.dfsu")