[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();
}
|