/// <summary> /// Update DFS2 bathymetry, lowering bathymetry with 5.61 meters everywhere, /// taking land value into account. /// <para> /// The method assumes that the OresundBathy900.dfs2 test file /// (or preferably a copy of it) is the input file. /// </para> /// </summary> /// <param name="bathyFilename">Path and name of OresundBathy900.dfs2 test file</param> public static void ModifyDfs2Bathymetry(string bathyFilename) { // Open file Dfs2File dfs2 = DfsFileFactory.Dfs2FileOpenEdit(bathyFilename); // Second custom block (index 1) contains the M21_MISC values, // where the 4th (index 3) is the land value float landValue = (float)dfs2.FileInfo.CustomBlocks[1][3]; // Read bathymetry data IDfsItemData2D <float> bathyData = (IDfsItemData2D <float>)dfs2.ReadItemTimeStepNext(); // Modify bathymetry data for (int i = 0; i < bathyData.Data.Length; i++) { if (bathyData.Data[i] != landValue) { bathyData.Data[i] -= 5.61f; } } // Write back bathymetry data dfs2.WriteItemTimeStep(1, 0, 0, bathyData.Data); dfs2.Close(); }
/// <summary> /// Example of how to create a Dfs2 file from scratch. This method /// creates a copy of the OresundHD.dfs2 test file. /// <para> /// Data for static and dynamic item is taken from a source dfs file, /// which here is the OresundHD.dfs2 test file. The data could come /// from any other source. /// </para> /// </summary> /// <param name="sourceFilename">Path and name of the OresundHD.dfs2 test file</param> /// <param name="filename">Path and name of the new file to create</param> public static void CreateDfs2File(string sourceFilename, string filename) { IDfs2File source = DfsFileFactory.Dfs2FileOpen(sourceFilename); DfsFactory factory = new DfsFactory(); Dfs2Builder builder = Dfs2Builder.Create("", @"C:\Program Files\DHI\2010\bin\nmodel.exe", 0); // Set up the header builder.SetDataType(1); builder.SetGeographicalProjection(factory.CreateProjectionGeoOrigin("UTM-33", 12.438741600559766, 55.225707842436385, 326.99999999999955)); builder.SetTemporalAxis(factory.CreateTemporalEqCalendarAxis(eumUnit.eumUsec, new DateTime(1993, 12, 02, 0, 0, 0), 0, 86400)); builder.SetSpatialAxis(factory.CreateAxisEqD2(eumUnit.eumUmeter, 71, 0, 900, 91, 0, 900)); builder.DeleteValueFloat = -1e-30f; // Add custom block // M21_Misc : {orientation (should match projection), drying depth, -900=has projection, land value, 0, 0, 0} builder.AddCustomBlock(factory.CreateCustomBlock("M21_Misc", new float[] { 327f, 0.2f, -900f, 10f, 0f, 0f, 0f })); // Set up dynamic items builder.AddDynamicItem("H Water Depth m", eumQuantity.Create(eumItem.eumIWaterLevel, eumUnit.eumUmeter), DfsSimpleType.Float, DataValueType.Instantaneous); builder.AddDynamicItem("P Flux m^3/s/m", eumQuantity.Create(eumItem.eumIFlowFlux, eumUnit.eumUm3PerSecPerM), DfsSimpleType.Float, DataValueType.Instantaneous); builder.AddDynamicItem("Q Flux m^3/s/m", eumQuantity.Create(eumItem.eumIFlowFlux, eumUnit.eumUm3PerSecPerM), DfsSimpleType.Float, DataValueType.Instantaneous); // Create file builder.CreateFile(filename); // Add static items containing bathymetri data, use data from source IDfsStaticItem sourceStaticItem = source.ReadStaticItemNext(); builder.AddStaticItem("Static item", eumQuantity.UnDefined, sourceStaticItem.Data); // Get the file Dfs2File file = builder.GetFile(); // Loop over all time steps for (int i = 0; i < source.FileInfo.TimeAxis.NumberOfTimeSteps; i++) { // Loop over all items for (int j = 0; j < source.ItemInfo.Count; j++) { // Add data for all item-timesteps, copying data from source file. // Read data from source file IDfsItemData2D <float> sourceData = (IDfsItemData2D <float>)source.ReadItemTimeStepNext(); // Create empty item data, and copy over data from source // The IDfsItemData2D can handle 2D indexing, on the form data2D[k,l]. // An ordinary array, float[], can also be used, though indexing from 2D to 1D must be // handled by user code i.e. using data1D[k + l*xCount] compared to data2D[k,l] IDfsItemData2D <float> itemData2D = (IDfsItemData2D <float>)file.CreateEmptyItemData(j + 1); for (int k = 0; k < 71; k++) { for (int l = 0; l < 91; l++) { itemData2D[k, l] = sourceData[k, l]; } } // the itemData2D.Data is a float[], so any float[] of the correct size is valid here. file.WriteItemTimeStep(j + 1, i, sourceData.Time, itemData2D.Data); } } source.Close(); file.Close(); }