/*
**************************************************************************
                                                                   
FUNCS.H -- Function Prototypes for EPANET Program                       
                                                                   
VERSION:    2.00
DATE:       5/8/00
            9/25/00
            10/25/00
            12/29/00
            3/1/01
            2/14/08    (2.00.12)
AUTHOR:     L. Rossman
            US EPA - NRMRL
                                                                                
**************************************************************************
*/

/*****************************************************************/
/*   Most float arguments have been changed to double - 7/3/07   */
/*****************************************************************/

/* ------- EPANET.C --------------------*/
/*
**  NOTE: The exportable functions that can be called
**        via the DLL are prototyped in TOOLKIT.H.
*/

#ifndef FUNCS_H
#define FUNCS_H

void    initpointers(void);               /* Initializes pointers       */
int     allocdata(void);                  /* Allocates memory           */
void    freeTmplist(STmplist *);          /* Frees items in linked list */
void    freeFloatlist(SFloatlist *);      /* Frees list of floats       */
void    freedata(void);                   /* Frees allocated memory     */
int     openfiles(char *,char *,char *);  /* Opens input & report files */
int     openhydfile(void);                /* Opens hydraulics file      */
int     openoutfile(void);                /* Opens binary output file   */
int     strcomp(char *, char *);          /* Compares two strings       */
char*   getTmpName(char* fname);          /* Gets temporary file name   */     //(2.00.12 - LR)
double  interp(int, double *,             /* Interpolates a data curve  */
               double *, double);
int     findnode(char *);                 /* Finds node's index from ID */
int     findlink(char *);                 /* Finds link's index from ID */
char*   geterrmsg(int);                   /* Gets text of error message */
void    errmsg(int);                      /* Reports program error      */
void    writecon(char *);                 /* Writes text to console     */
void    writewin(char *);                 /* Passes text to calling app */

/* ------- INPUT1.C --------------------*/
int     getdata(void);                    /* Gets network data          */
void    setdefaults(void);                /* Sets default values        */
void    initreport(void);                 /* Initializes report options */
void    adjustdata(void);                 /* Adjusts input data         */
int     inittanks(void);                  /* Initializes tank levels    */
void    initunits(void);                  /* Determines reporting units */
void    convertunits(void);               /* Converts data to std. units*/

/* -------- INPUT2.C -------------------*/
int     netsize(void);                    /* Determines network size    */
int     readdata(void);                   /* Reads in network data      */
int     newline(int, char *);             /* Processes new line of data */
int     addnodeID(int, char *);           /* Adds node ID to data base  */
int     addlinkID(int, char *);           /* Adds link ID to data base  */
int     addpattern(char *);               /* Adds pattern to data base  */
int     addcurve(char *);                 /* Adds curve to data base    */
STmplist *findID(char *, STmplist *);     /* Locates ID on linked list  */
int     unlinked(void);                   /* Checks for unlinked nodes  */
int     getpumpparams(void);              /* Computes pump curve coeffs.*/
int     getpatterns(void);                /* Gets pattern data from list*/
int     getcurves(void);                  /* Gets curve data from list  */
int     findmatch(char *,char *[]);       /* Finds keyword in line      */
int     match(char *, char *);            /* Checks for word match      */
int     gettokens(char *);                /* Tokenizes input line       */
int     getfloat(char *, double *);       /* Converts string to double   */
double  hour(char *, char *);             /* Converts time to hours     */
int     setreport(char *);                /* Processes reporting command*/
void    inperrmsg(int,int,char *);        /* Input error message        */

/* ---------- INPUT3.C -----------------*/
int     juncdata(void);                   /* Processes junction data    */
int     tankdata(void);                   /* Processes tank data        */
int     pipedata(void);                   /* Processes pipe data        */
int     pumpdata(void);                   /* Processes pump data        */
int     valvedata(void);                  /* Processes valve data       */
int     patterndata(void);                /* Processes pattern data     */
int     curvedata(void);                  /* Processes curve data       */
int     coordata(void);                   /* Processes coordinate data  */
int     demanddata(void);                 /* Processes demand data      */
int     controldata(void);                /* Processes simple controls  */
int     energydata(void);                 /* Processes energy data      */
int     sourcedata(void);                 /* Processes source data      */
int     emitterdata(void);                /* Processes emitter data     */
int     qualdata(void);                   /* Processes quality data     */
int     reactdata(void);                  /* Processes reaction data    */
int     mixingdata(void);                 /* Processes tank mixing data */
int     statusdata(void);                 /* Processes link status data */
int     reportdata(void);                 /* Processes report options   */
int     timedata(void);                   /* Processes time options     */
int     optiondata(void);                 /* Processes analysis options */
int     optionchoice(int);                /* Processes option choices   */
int     optionvalue(int);                 /* Processes option values    */
int     getpumpcurve(int);                /* Constructs a pump curve    */
int     powercurve(double, double, double,/* Coeffs. of power pump curve*/
                   double, double, double *,
                   double *, double *);
int     valvecheck(int, int, int);        /* Checks valve placement     */
void    changestatus(int, char, double);  /* Changes status of a link   */

/* -------------- RULES.C --------------*/
void    initrules(void);                  /* Initializes rule base      */
void    addrule(char *);                  /* Adds rule to rule base     */
int     allocrules(void);                 /* Allocates memory for rule  */
int     ruledata(void);                   /* Processes rule input data  */
int     checkrules(long);                 /* Checks all rules           */
void    freerules(void);                  /* Frees rule base memory     */  

/* ------------- REPORT.C --------------*/
int     writereport(void);                /* Writes formatted report    */
void    writelogo(void);                  /* Writes program logo        */
void    writesummary(void);               /* Writes network summary     */
void    writehydstat(int,double);          /* Writes hydraulic status    */
void    writeenergy(void);                /* Writes energy usage        */
int     writeresults(void);               /* Writes node/link results   */
void    writeheader(int,int);             /* Writes heading on report   */
void    writeline(char *);                /* Writes line to report file */
void    writerelerr(int, double);          /* Writes convergence error   */
void    writestatchange(int,char,char);   /* Writes link status change  */
void    writecontrolaction(int, int);     /* Writes control action taken*/
void    writeruleaction(int, char *);     /* Writes rule action taken   */
int     writehydwarn(int,double);          /* Writes hydraulic warnings  */
void    writehyderr(int);                 /* Writes hydraulic error msg.*/
int     disconnected(void);               /* Checks for disconnections  */
void    marknodes(int, int *, char *);    /* Identifies connected nodes */
void    getclosedlink(int, char *);       /* Finds a disconnecting link */
void    writelimits(int,int);             /* Writes reporting limits    */
int     checklimits(double *,int,int);     /* Checks variable limits     */
void    writetime(char *);                /* Writes current clock time  */
char    *clocktime(char *, long);         /* Converts time to hrs:min   */
char    *fillstr(char *, char, int);      /* Fills string with character*/
int     getnodetype(int);                 /* Determines node type       */

/* --------- HYDRAUL.C -----------------*/
int     openhyd(void);                    /* Opens hydraulics solver    */

/*** Updated 3/1/01 ***/
void    inithyd(int);                     /* Re-sets initial conditions */

int     runhyd(long *);                   /* Solves 1-period hydraulics */
int     nexthyd(long *);                  /* Moves to next time period  */
void    closehyd(void);                   /* Closes hydraulics solver   */
int     allocmatrix(void);                /* Allocates matrix coeffs.   */
void    freematrix(void);                 /* Frees matrix coeffs.       */
void    initlinkflow(int, char, double);  /* Initializes link flow      */
void    setlinkflow(int, double);         /* Sets link flow via headloss*/
void    setlinkstatus(int, char, char *,  /* Sets link status           */
                      double *);
void    setlinksetting(int, double,       /* Sets pump/valve setting    */
                       char *, double *);
void    resistance(int);                  /* Computes resistance coeff. */
void    demands(void);                    /* Computes current demands   */
int     controls(void);                   /* Controls link settings     */
long    timestep(void);                   /* Computes new time step     */
void    tanktimestep(long *);             /* Time till tanks fill/drain */
void    controltimestep(long *);          /* Time till control action   */
void    ruletimestep(long *);             /* Time till rule action      */
void    addenergy(long);                  /* Accumulates energy usage   */
void    getenergy(int, double *, double *); /* Computes link energy use   */
void    tanklevels(long);                 /* Computes new tank levels   */
double  tankvolume(int,double);           /* Finds tank vol. from grade */
double  tankgrade(int,double);            /* Finds tank grade from vol. */
int     netsolve(int *,double *);         /* Solves network equations   */
int     badvalve(int);                    /* Checks for bad valve       */
int     valvestatus(void);                /* Updates valve status       */
int     linkstatus(void);                 /* Updates link status        */
char    cvstatus(char,double,double);     /* Updates CV status          */
char    pumpstatus(int,double);           /* Updates pump status        */
char    prvstatus(int,char,double,        /* Updates PRV status         */
                  double,double);
char    psvstatus(int,char,double,        /* Updates PSV status         */
                  double,double);
char    fcvstatus(int,char,double,        /* Updates FCV status         */
                  double);
void    tankstatus(int,int,int);          /* Checks if tank full/empty  */
int     pswitch(void);                    /* Pressure switch controls   */
double  newflows(void);                   /* Updates link flows         */
void    newcoeffs(void);                  /* Computes matrix coeffs.    */
void    linkcoeffs(void);                 /* Computes link coeffs.      */
void    nodecoeffs(void);                 /* Computes node coeffs.      */
void    valvecoeffs(void);                /* Computes valve coeffs.     */
void    pipecoeff(int);                   /* Computes pipe coeff.       */
double  DWcoeff(int, double *);           /* Computes D-W coeff.        */
void    pumpcoeff(int);                   /* Computes pump coeff.       */

/*** Updated 10/25/00 ***/
/*** Updated 12/29/00 ***/
void    curvecoeff(int,double,double *,   /* Computes curve coeffs.     */
                             double *);

void    gpvcoeff(int);                    /* Computes GPV coeff.        */
void    pbvcoeff(int);                    /* Computes PBV coeff.        */
void    tcvcoeff(int);                    /* Computes TCV coeff.        */
void    prvcoeff(int,int,int);            /* Computes PRV coeff.        */
void    psvcoeff(int,int,int);            /* Computes PSV coeff.        */
void    fcvcoeff(int,int,int);            /* Computes FCV coeff.        */
void    emittercoeffs(void);              /* Computes emitter coeffs.   */
double  emitflowchange(int);              /* Computes new emitter flow  */

/* ----------- SMATRIX.C ---------------*/
int     createsparse(void);               /* Creates sparse matrix      */
int     allocsparse(void);                /* Allocates matrix memory    */
void    freesparse(void);                 /* Frees matrix memory        */
int     buildlists(int);                  /* Builds adjacency lists     */
int     paralink(int, int, int);          /* Checks for parallel links  */
void    xparalinks(void);                 /* Removes parallel links     */
void    freelists(void);                  /* Frees adjacency lists      */
void    countdegree(void);                /* Counts links at each node  */
int     reordernodes(void);               /* Finds a node re-ordering   */
int     mindegree(int, int);              /* Finds min. degree node     */
int     growlist(int);                    /* Augments adjacency list    */
int     newlink(Padjlist);                /* Adds fill-ins for a node   */
int     linked(int, int);                 /* Checks if 2 nodes linked   */
int     addlink(int, int, int);           /* Creates new fill-in        */
int     storesparse(int);                 /* Stores sparse matrix       */
int     ordersparse(int);                 /* Orders matrix storage      */
void    transpose(int,int *,int *,        /* Transposes sparse matrix   */
        int *,int *,int *,int *,int *);
int     linsolve(int, double *, double *, /* Solution of linear eqns.   */
                 double *);               /* via Cholesky factorization */

/* ----------- QUALITY.C ---------------*/
int     openqual(void);                   /* Opens WQ solver system     */
void    initqual(void);                   /* Initializes WQ solver      */
int     runqual(long *);                  /* Gets current WQ results    */
int     nextqual(long *);                 /* Updates WQ by hyd.timestep */
int     stepqual(long *);                 /* Updates WQ by WQ time step */
int     closequal(void);                  /* Closes WQ solver system    */
int     gethyd(long *, long *);           /* Gets next hyd. results     */
char    setReactflag(void);               /* Checks for reactive chem.  */
void    transport(long);                  /* Transports mass in network */
void    initsegs(void);                   /* Initializes WQ segments    */
void    reorientsegs(void);               /* Re-orients WQ segments     */
void    updatesegs(long);                 /* Updates quality in segments*/
void    removesegs(int);                  /* Removes a WQ segment       */
void    addseg(int,double,double);        /* Adds a WQ segment to pipe  */
void    accumulate(long);                 /* Sums mass flow into node   */
void    updatenodes(long);                /* Updates WQ at nodes        */
void    sourceinput(long);                /* Computes source inputs     */
void    release(long);                    /* Releases mass from nodes   */
void    updatetanks(long);                /* Updates WQ in tanks        */
void    updatesourcenodes(long);          /* Updates WQ at source nodes */
void    tankmix1(int, long);              /* Complete mix tank model    */
void    tankmix2(int, long);              /* 2-compartment tank model   */
void    tankmix3(int, long);              /* FIFO tank model            */
void    tankmix4(int, long);              /* LIFO tank model            */
double  sourcequal(Psource);              /* Finds WQ input from source */
double  avgqual(int);                     /* Finds avg. quality in pipe */
void    ratecoeffs(void);                 /* Finds wall react. coeffs.  */
double  piperate(int);                    /* Finds wall react. coeff.   */
double  pipereact(int,double,double,long);/* Reacts water in a pipe     */
double  tankreact(double,double,double,
                  long);                  /* Reacts water in a tank     */
double  bulkrate(double,double,double);   /* Finds bulk reaction rate   */
double  wallrate(double,double,double,double);/* Finds wall reaction rate   */


/* ------------ OUTPUT.C ---------------*/
int     savenetdata(void);                /* Saves basic data to file   */
int     savehyd(long *);                  /* Saves hydraulic solution   */
int     savehydstep(long *);              /* Saves hydraulic timestep   */
int     saveenergy(void);                 /* Saves energy usage         */
int     readhyd(long *);                  /* Reads hydraulics from file */
int     readhydstep(long *);              /* Reads time step from file  */
int     saveoutput(void);                 /* Saves results to file      */
int     nodeoutput(int, REAL4 *, double); /* Saves node results to file */
int     linkoutput(int, REAL4 *, double); /* Saves link results to file */
int     savefinaloutput(void);            /* Finishes saving output     */
int     savetimestat(REAL4 *, char);      /* Saves time stats to file   */
int     savenetreacts(double, double,
                      double, double);    /* Saves react. rates to file */
int     saveepilog(void);                 /* Saves output file epilog   */


/* ------------ INPFILE.C --------------*/
int     saveinpfile(char *);              /* Saves network to text file  */


// Update at 2018/1/8.==============================================================================
int     gasparadata(void);               //get gas para 
int     resourcedata(void);
void    GetPipeSK(int pipeID, long* pipeKind,long* pipeState);
void    WriteMyErrorFile(char* errorMsg ); /* 写自己的输入错误信息     */

void	CalcGasHeadLoss(short material, double q, double diamter,  double length,  double* dHeadLoss);
//计算雷诺数
short Gas_count_Re(double dQ, double lDN, double dV, double dL, double* dRe);
//计算低压层流状态摩擦阻力系数(Coefficient of Friction)
//入口参数：dRe-雷诺数
//出口参数：dCF-摩擦阻力系数.
//返回值：  0 入口参数为0计算失败; 1 计算成功.
short Gas_Count_Low_Laminar_Flow_CF(double dRe, double* dCF);

//计算低压临界状态摩擦阻力系数(Coefficient of Friction)
//入口参数：dRe-雷诺数
//出口参数：dCF-摩擦阻力系数.
//返回值：  0 入口参数为0计算失败; 1 计算成功.
short Gas_Count_Low_Critical_CF(double dRe, double* dCF);

//计算低压(中高压)湍流状态钢管的摩擦阻系数(Coefficient of Friction)
//入口参数：lDN-管道内径(mm)
//			dRe-雷诺数
//出口参数：dCF-摩擦阻力系数.
//返回值：  0 入口参数为0计算失败; 1 计算成功.
short Gas_Count_Steel_CF(double lDN, double dRe, double dK, double* dCF);

//计算低压(中高压)湍流状态铸铁管的摩擦阻系数(Coefficient of Friction)
//入口参数：lDN-管道内径(mm)
//			dQ-计算流量(m3/h)
//出口参数：dCF-摩擦阻力系数
//返回值：  0 入口参数为0计算失败; 1 计算成功.
short Gas_Count_Cas_Iron_CF(double lDN, double dQ, double dV, double* dCF);
//计算低压层流燃气管道单位长度的摩擦阻力损失
short gas_count_Low_Laminar_Flow(double dL, double dQ, double lDN, double dV, double dDE, double dT, double* dHeadLoss);

//计算低压临界状态燃气管道单位长度的摩擦阻力损失
short gas_count_Low_Critical(double dL, double dQ, double lDN, double dV, double dDE, double dT, double * dHeadLoss);

//计算低压湍流状态钢管燃气管道单位长度的摩擦阻力损失
short gas_count_Low_Overfall_Steel(double dL, double dQ, double lDN, double dV, double dDE, double dT, double dK, double * dHeadLoss);

//计算低压湍流状态铸铁管燃气管道单位长度的摩擦阻力损失
short gas_count_Low_Cas_Iron(double dL, double dQ, double lDN, double dV, double dDE, double dT, double * dHeadLoss);

//计算高压钢管燃气管道单位长度的摩擦阻力损失
short gas_count_High_Overfall_Steel(double dL, double dQ, double lDN, double dV, double dDE, double dT, double dK, double * dHeadLoss);

//计算高压铸铁管燃气管道单位长度的摩擦阻力损失
short gas_count_High_Cas_Iron(double dL, double dQ, double lDN, double dV, double dDE, double dT, double * dHeadLoss);

// Update end.======================================================================================


#endif
