[Test] public void RunABitLessSimpleModel() { int modelHandle = 0; int numSteps = 0; string workingDirectory = @"..\..\..\..\testdata\ModelApiTest\Simple\CMTWORK\"; Environment.CurrentDirectory = workingDirectory; // set current directory to output so that it will be the only one place where sobeksim writes data // the directory for now already contains files produced by parsen.exe // format for date is YYYYMMDD and for time HHMMSS int startDate = 19960101; int startTime = 10000; int endDate = 19960102; int endtTime = 150000; // time steps are given in seconds int timeStep = 300; int outputTimeStep = 3600; ModelApi.ModelSetSimulationTimes(ref startDate, ref startTime, ref endDate, ref endtTime, ref timeStep, ref outputTimeStep); // Define the dimensions of the model. In terms of number of Branches, number of nodes and number of cross // sections int branchesCount = 3; int nodesCount = 4; int crossSectionsCount = 3; float deltaX = 10.0f; ModelApi.NetworkSetDimensions(ref branchesCount, ref nodesCount, ref crossSectionsCount, ref deltaX); // ---------------------------------------------------- // set branch1, node1, node2, crs1, crs2, etc to model // A node has an ID, which must be a uniqe (key), a name (a description of the node) and coordinates, which // define the location of the node. The coordinates are used to calculate the length of a branch string id = "1"; string name = " "; double[] coor = new double[2]; coor[0] = -400; coor[1] = 0; ModelApi.NetworkSetNode(id, name, coor); id = "2"; name = " "; coor[0] = 200; coor[1] = 200; ModelApi.NetworkSetNode(id, name, coor); id = "3"; name = " "; coor[0] = 200; coor[1] = -200; ModelApi.NetworkSetNode(id, name, coor); id = "4"; name = " "; coor[0] = -9.967; coor[1] = 16.56; ModelApi.NetworkSetNode(id, name, coor); // Define the branches, using a from node and a to node. Length can be used to override // the length, defined by the distance between the fromNode and toNode. If length > 0, // this length is used. // With deltaX the A global value for the complete network is defined by DeltaX given in id = "1"; name = ""; int fromNode = 1; int toNode = 4; deltaX = 0.0f; float length = 0; ModelApi.NetworkSetBranch(id, name, ref fromNode, ref toNode, ref length, ref deltaX); id = "2"; name = ""; fromNode = 4; toNode = 2; deltaX = 0.0f; length = 0; ModelApi.NetworkSetBranch(id, name, ref fromNode, ref toNode, ref length, ref deltaX); id = "3"; name = ""; fromNode = 4; toNode = 3; deltaX = 0.0f; length = 0; ModelApi.NetworkSetBranch(id, name, ref fromNode, ref toNode, ref length, ref deltaX); // Set boundary conditions. Boundary conditions may only be set on nodes, that have only // one connection. NodeId is not the name of the id, but the sequence number, id = 1 is // the first node that is defined by the call NetworkSetNode. int nodeId = 1; double value = 2.0; ModelApi.NetworkSetQBoundary(ref nodeId, ref value); nodeId = 2; ModelApi.NetworkSetHBoundary(ref nodeId, ref value); nodeId = 3; value = 1.9; ModelApi.NetworkSetHBoundary(ref nodeId, ref value); // Define a cross section with two levels int levelCount = 2; double [] levels = new double[levelCount]; levels[0] = 0.0; levels[1] = 5.0; double [] flowWidth = new double[levelCount]; flowWidth[0] = 5.0; flowWidth[1] = 5.0; double [] storWidth = new double[levelCount]; storWidth[0] = 6.0; storWidth[1] = 10.0; int iref = ModelApi.NetworkSetTabCrossSection(ref levelCount, levels, flowWidth, storWidth); // Connect the cross section to the various branches int branch = 1; double location= 196.086; double bottomLevel = 0; double surfaceLevel = 2.0; int bedFrictionType = (int) Friction.ChezyConstant; int groundFrictionType = (int) Friction.WhiteColebrook; double bedFriction = 45.0; double groundFriction = 0.003; int storageType = 0; ModelApi.NetworkSetCS(ref branch, ref location, ref iref, ref bottomLevel, ref surfaceLevel, ref bedFrictionType, ref bedFriction, ref groundFrictionType, ref groundFriction, ref storageType); branch = 2; location = 139.364; bedFrictionType = (int)Friction.Mannings; bedFriction = 0.025; ModelApi.NetworkSetCS(ref branch, ref location, ref iref, ref bottomLevel, ref surfaceLevel, ref bedFrictionType, ref bedFriction, ref groundFrictionType, ref groundFriction, ref storageType); branch = 3; location = 160.33; bedFrictionType = (int)Friction.WhiteColebrook; bedFriction = 0.2; ModelApi.NetworkSetCS(ref branch, ref location, ref iref, ref bottomLevel, ref surfaceLevel, ref bedFrictionType, ref bedFriction, ref groundFrictionType, ref groundFriction, ref storageType); // Initialize SOBEKSIM ModelApi.ModelInitialize(ref modelHandle, ref numSteps); for (int step = 0; step <= numSteps; step++) { // Perform one time step ModelApi.ModelPerformTimeStep(ref modelHandle, ref step); } // End the simulation ModelApi.ModelFinalize(); }