Friday, September 30, 2016

How to Make Break Nodes in #INFOSWMM and #H2OMAP SWMM

How to Make Break Nodes in #INFOSWMM and #H2OMAP SWMM

You would add a break node to break up long force mains so that the pipe(s) react faster to the pump flows.

  1. Find your long FM or long  Gravity Main links
  2. Insert a Node into the middle of the link to break the link into two links with the same geometry but different lengths
  3. Use the Node Inference tool to estimate the new nodes invert based on the immediate upstream and downstream node inverts
  4.  If you make a new for a FM, please also use this tool  
which will set the Surcharge depth – 1000 is bit high

Steps used to Insert Nodes in a Force Main

InfoSWMM and the Custom Report Tool

Step 0 is to define the domain and use the Custom tool in Tools,
Step 1 is to define the data source
Step 2 is to define the fields to show in the table
Step 3 is to define the source (click on Domain) and
Step 4 is to view the output table.



Larger Fonts in #SWMM5 using Delphi

If you Delphi XE2 to XE7 then it is easy to adjust the Fonts in Fmain.pas using the Respective Property Pages - it does not work for menus, unfortunately.

Monday, September 26, 2016

The Impact of the yCrown Taper equation in #SWMM5 on Surcharged Nodes

The Impact of the yCrown Taper equation in #SWMM5

We are looking at three ranges of depth in the node:
1.  Node depths below yCrown using the node continuity equation to compute the new node depth,
2. Node Depths above 1.25 * yCrown use the point iteration solution for the node in which there is no node area and the program iterates until the sum of flows is zero for the timestep.
3.  Node Depths between yCrown and 1.25 * yCrown use the taper equation in which the node area decreases from the area at 0.96 Full Depth to a value of zero area at 1.25 yCrown.

If the current depth in the node is below 1.25 * yCrown

Where,  yCrown is the depth till the highest connecting conduit crown elevation

There is a tapered equation based on the sum of the  flow at the node and the surface area from the last non-surcharged condition which will influence dqdh if depth close to crown depth

F = yLast/yCrown – 1

Denom = Sum DQDH for all connecting links to the node

Denom = Denom + (Old Surface Area (at last non-surcharged condition) / dt (time step) – Sum DQDH term for connecting links ) * exp (-15*f)

This has the effect of quickly tapering the impact of the Old Surface Area between yCrown and 1.25 * yCrown (Figure 1 and Table 1).  It starts out at the value of Old Surface Area and by a depth of 1.25*yCrown the impact of Old Surface Area is zero.


Figure .  Values of the yCrown Taper from 1 to 1.25*yCrown in #SWMM5





Ycrown
exp(-15.0 * f)  Taper Value
            f = (yLast - yCrown) / yCrown or yLast/yCrown - 1
exp(-15.0 * f) Taper Value

1
1.0000
0
1.0000



1.01
0.8607
0.01
0.8607

1.02
0.7408
0.02
0.7408

1.03
0.6376
0.03
0.6376

1.04
0.5488
0.04
0.5488
1.05
0.4724
0.05
0.4724
1.06
0.4066
0.06
0.4066
1.07
0.3499
0.07
0.3499
1.08
0.3012
0.08
0.3012
1.09
0.2592
0.09
0.2592
1.1
0.2231
0.1
0.2231
1.11
0.1920
0.11
0.1920
1.12
0.1653
0.12
0.1653
1.13
0.1423
0.13
0.1423
1.14
0.1225
0.14
0.1225
1.15
0.1054
0.15
0.1054
1.16
0.0907
0.16
0.0907
1.17
0.0781
0.17
0.0781
1.18
0.0672
0.18
0.0672
1.19
0.0578
0.19
0.0578
1.2
0.0498
0.2
0.0498
1.21
0.0429
0.21
0.0429
1.22
0.0369
0.22
0.0369
1.24
0.0273
0.24
0.0273
1.25
0.0235
0.25
0.0235
 Table 1.  Values of the Taper Equation between 1 and 1.25*yCrown

Spatial Databases in #InfoSWMM and #InfoSewer using ArcCatalog™

Spatial Databases in #InfoSWMM and #InfoSewer using ArcCatalog™

With ArcCatalog™ , you can explore and manage geographic data stored in an RDBMS through ArcSDE™ . Similarly, SDE for Coverages lets you access coverage, ArcInfo™ LIBRARIAN, and ArcStorm™ databases the same way you access data from an RDBMS. To access these spatial databases, you must add a spatial database connection to the Catalog.
Refer to the section on Database Connections folder -> Spatial Database Connection link in the ArcGIS help file to learn more.

Pump as a Node In Water and System Head Curve

System Head Curve


Note:  This is a feature often asked for in InfoSWMM and SWMM5.  Pumps are links in the SWMM5 engine.
The dialog box for system head curve is shown below. Click here for the methodology of system head curve.

Input for system head curve:

 Flow Unit – Select the desired flow unit.
 Head Loss Equation – Select from Manning, Darcy-Weisbach (Colebrook-White), or Hazen–Williams formula.
 Pipe 1 – The pipe that connects the upstream reservoir with the pump (i.e., pipe on the suction side of the pump).
 Pipe 2 – The pipe that connects the pump with the downstream reservoir (i.e., pipe on the discharge side of the pump).
 Coefficient – Roughness coefficient.
 Head at Position 1 – Head at the upstream reservoir.
 Head at Position 2 – Head at the downstream reservoir.
 Length – Length of the pipe (i.e., pipe 1 or pipe 2).
 Diameter – Diameter of the pipe (i.e., pipe 1 or pipe 2).
 Sum of Minor Loss Coefficients – Sum of minor loss coefficients for the pipe (i.e., pipe 1 or pipe 2).
 Maximum Flow – Maximum flow for use in constructing the system head curve. The maximum flow is divided into ten equal intervals and the head corresponding to each of the ten flows is computed to construct the system head curve. Therefore, it is advisable to use a maximum flow that is divisible by ten.

Output for system head curve:

 Graphical System Curve – Presents the system head curve graphically.
 Tabular System Curve – Presents the system head curve in tabular form.  


#SWMM6 - A Sustainable Center for Crowd-Sourced Water Infrastructure Modeling



Friday, September 16, 2016

How to add a new view variable to SWMM 5.1.011

How to add a new view variable to SWMM 5.1.011

If you want to add a new view variable to the graphs of SWMM 5 – this is the steps you have to take (3 in the Delphi GUI and 3 in the SWMM 5 C Engine code).

This example will add a new view variable called NodeXTRA at the end of the Node list of view variables (Figure 1).  You add it to three locations in the Delphi XE7 code (Figure 3) and three locations in the SWMM 5 Engine code (Figure 3).  The purpose of this note is for students and as a reminder to myself.

Figure 1 - New view variable called NodeXtra

Figure 2 - We need to make a few additions to the Delphi GUI code to see the Name NodeXtra when we run SWMM 5.1.011



Figure 3 - SWMM 5 C code - We need to add the NodeXtra variable to the code to see some numbers and results.

How to Add Extra Output Files to SWMM 5.1.011

How to Add Extra Output Files to #SWMM 5.1.011 – the goal here is to automatically make calibration files for InfoSWMM, H2OMap SWMM, SWMM 5 and other programs based on the name of the Outflows file in SWMM 5.

Step 1.   Add names to globals.h

EXTERN TFile
                  Finp,                     // Input file
                  Fout,                     // Output file
                  Frpt,                     // Report file
                  Fclimate,                 // Climate file
                  Frain,                    // Rainfall file
                  Frunoff,                  // Runoff file
                  Frdii,                    // RDII inflow file
                  Fhotstart1,               // Hot start input file
                  Fhotstart2,               // Hot start output file
                  Finflows,                 // Inflows routing file
                  Foutflows,                // Outflows routing file
                  FcalibrationS,            // Calibration file Innovyze RED 2016  // Storage Volume in a Storage Node
                  FcalibrationR,            // Calibration file Innovyze RED 2016   Runoff
                  FcalibrationE,            // Calibration file Innovyze RED 2016   Groundwater Elevation
                  FcalibrationG,            // Calibration file Innovyze RED 2016   Groundwater Q
                  FcalibrationH,            // Calibration file Innovyze RED 2016   Node Depth
                  FcalibrationL,            // Calibration file Innovyze RED 2016   Node Lateral Q
                  FcalibrationQ,            // Calibration file Innovyze RED 2016  Link Q
                  FcalibrationV,            // Calibration file Innovyze RED 2016  Link V
                  FcalibrationD;            // Calibration file Innovyze RED 2016  Link D

Step 2. Name them in iface.c
      case OUTFLOWS_FILE:
        if ( k != SAVE_FILE ) return error_setInpError(ERR_ITEMS, "");
        Foutflows.mode = k;
        sstrncpy(Foutflows.name, tok[2], MAXFNAME);
        // SWMM 5 Calibration File // Innovyze RED - 2016
        sstrncpy(FcalibrationS.name, tok[2], MAXFNAME);
        sstrncpy(FcalibrationR.name, tok[2], MAXFNAME);
        sstrncpy(FcalibrationG.name, tok[2], MAXFNAME);
        sstrncpy(FcalibrationE.name, tok[2], MAXFNAME);
        sstrncpy(FcalibrationH.name, tok[2], MAXFNAME);
        sstrncpy(FcalibrationL.name, tok[2], MAXFNAME);
        sstrncpy(FcalibrationQ.name, tok[2], MAXFNAME);
        sstrncpy(FcalibrationV.name, tok[2], MAXFNAME);
        sstrncpy(FcalibrationD.name, tok[2], MAXFNAME);
            FcalibrationS.mode = k;
             FcalibrationR.mode = k;
             FcalibrationG.mode = k;
             FcalibrationE.mode = k;
             FcalibrationH.mode = k;
             FcalibrationL.mode = k;
             FcalibrationQ.mode = k;
             FcalibrationV.mode = k;
             FcalibrationD.mode = k;
             strcat(FcalibrationS.name,".SWMM5_S_CALIBRATION.DAT");
             strcat(FcalibrationR.name,".SWMM5_R_CALIBRATION.DAT");
             strcat(FcalibrationG.name,".SWMM5_G_CALIBRATION.DAT");
             strcat(FcalibrationE.name,".SWMM5_E_CALIBRATION.DAT");
             strcat(FcalibrationH.name,".SWMM5_H_CALIBRATION.DAT");
             strcat(FcalibrationL.name,".SWMM5_L_CALIBRATION.DAT");
             strcat(FcalibrationQ.name,".SWMM5_Q_CALIBRATION.DAT");
             strcat(FcalibrationV.name,".SWMM5_V_CALIBRATION.DAT");
             strcat(FcalibrationD.name,".SWMM5_D_CALIBRATION.DAT");
           break;

Step 3. Open them in iface.c

void openFileForOutput()
//
//  Input:   none
//  Output:  none
//  Purpose: opens a routing interface file for writing.
//
{
    int i, n;

    // --- open the routing file for writing text
    Foutflows.file = fopen(Foutflows.name, "wt");
       FcalibrationS.file  = fopen(FcalibrationS.name, "wt");                        // Innovyze RED 2016
       FcalibrationR.file = fopen(FcalibrationR.name, "wt");                        // Innovyze RED 2016
       FcalibrationG.file = fopen(FcalibrationG.name, "wt");                        // Innovyze RED 2016
       FcalibrationE.file = fopen(FcalibrationE.name, "wt");                        // Innovyze RED 2016
       FcalibrationH.file = fopen(FcalibrationH.name, "wt");                        // Innovyze RED 2016
       FcalibrationL.file = fopen(FcalibrationL.name, "wt");                        // Innovyze RED 2016
       FcalibrationQ.file = fopen(FcalibrationQ.name, "wt");                        // Innovyze RED 2016
       FcalibrationV.file = fopen(FcalibrationV.name, "wt");                        // Innovyze RED 2016
       FcalibrationD.file = fopen(FcalibrationD.name, "wt");                        // Innovyze RED 2016
    if ( Foutflows.file == NULL )
    {
        report_writeErrorMsg(ERR_ROUTING_FILE_OPEN, Foutflows.name);
        return;
    }

Step 5.   Alter Report.c to save data to the Extra Output files

I will leave out these details as they are too tedious. 


    if ( Nobjects[SUBCATCH] == 0 ) return;
    WRITE(";Subcatchment Results");
     k = 0;
    for (j = 0; j < Nobjects[SUBCATCH]; j++)
    {
        if ( Subcatch[j].rptFlag == TRUE )
        {
            fprintf(FcalibrationR.file,"\n%s", Subcatch[j].ID);   
               //fprintf(FcalibrationG.file,"\n%s", Subcatch[j].ID);   
               //Fprintf(FcalibrationE.file,"\n%s", Subcatch[j].ID);          
                    report_SubcatchHeader(Subcatch[j].ID);
            for ( period = 1; period <= Nperiods; period++ )
            {
                output_readDateTime(period, &days);
                datetime_dateToStr(days, theDate);
                datetime_timeToStr(days, theTime);
                output_readSubcatchResults(period, k);
                        datetime_decodeDate(days, &year, &month, &day);               
                 fprintf(FcalibrationR.file, "\n%02d/%02d/%4d %4s %9.3f R",   
                   month,day,year, theTime, SubcatchResults[SUBCATCH_RUNOFF]) ;
            }
            k++;
        }
    }

Step 5.  Close them in iface.c

void iface_closeRoutingFiles()
//
//  Input:   none
//  Output:  none
//  Purpose: closes routing interface files.
//
{
    FREE(IfacePolluts);
    FREE(IfaceNodes);
    if ( OldIfaceValues != NULL ) project_freeMatrix(OldIfaceValues);
    if ( NewIfaceValues != NULL ) project_freeMatrix(NewIfaceValues);
    if ( Finflows.file )  fclose(Finflows.file);
    if ( Foutflows.file ) fclose(Foutflows.file);
    if ( FcalibrationS.file )  fclose(FcalibrationS.file);  //  Innovyze RED - 2016
    if ( FcalibrationR.file ) fclose(FcalibrationR.file);   //  Innovyze RED - 2016
    if ( FcalibrationG.file ) fclose(FcalibrationG.file);   //  Innovyze RED - 2016
    if ( FcalibrationE.file ) fclose(FcalibrationE.file);   //  Innovyze RED - 2016
    if ( FcalibrationH.file ) fclose(FcalibrationH.file);   //  Innovyze RED - 2016
    if ( FcalibrationL.file ) fclose(FcalibrationL.file);   //  Innovyze RED - 2016
    if ( FcalibrationQ.file ) fclose(FcalibrationQ.file);   //  Innovyze RED - 2016
    if ( FcalibrationV.file ) fclose(FcalibrationV.file);   //  Innovyze RED - 2016
    if ( FcalibrationD.file ) fclose(FcalibrationD.file);   //  Innovyze RED - 2016
}

GitHub code and Markdown (MD) files Leveraging

 To better achieve your goal of leveraging your GitHub code and Markdown (MD) files for your WordPress blog or LinkedIn articles, consider t...