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

  • No labels