complete function description. still needs user manual "application" examples
This commit is contained in:
16
doc/modules_controls.dox
Normal file
16
doc/modules_controls.dox
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
/**
|
||||||
|
|
||||||
|
@defgroup Controls Managing Controls
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@addtogroup Controls
|
||||||
|
@{
|
||||||
|
@enum EN_ControlType
|
||||||
|
@fn int ENgetcontrol(int controlIndex, int *controlType, int *linkIndex, EN_API_FLOAT_TYPE *setting, int *nodeIndex, EN_API_FLOAT_TYPE *level)
|
||||||
|
@fn int ENsetcontrol(int cindex, int ctype, int lindex, EN_API_FLOAT_TYPE setting, int nindex, EN_API_FLOAT_TYPE level)
|
||||||
|
@}
|
||||||
|
*/
|
||||||
@@ -15,5 +15,6 @@
|
|||||||
@fn int ENsetreport (char *reportFormat)
|
@fn int ENsetreport (char *reportFormat)
|
||||||
@fn int ENopen (char *inpFile, char *rptFile, char *binOutFile)
|
@fn int ENopen (char *inpFile, char *rptFile, char *binOutFile)
|
||||||
@fn int ENsaveinpfile (char *filename)
|
@fn int ENsaveinpfile (char *filename)
|
||||||
|
@fn int ENclose()
|
||||||
@}
|
@}
|
||||||
*/
|
*/
|
||||||
@@ -7,16 +7,15 @@ int errcode;
|
|||||||
long t, tstep;
|
long t, tstep;
|
||||||
|
|
||||||
errcode = ENopenH();
|
errcode = ENopenH();
|
||||||
if (!errcode)
|
if (!errcode) {
|
||||||
{
|
errcode = ENinitH(EN_SAVE);
|
||||||
errcode = ENinitH(EN_SAVE);
|
if (!errcode) {
|
||||||
if (!errcode) do
|
do {
|
||||||
{
|
tstep = 0;
|
||||||
tstep = 0;
|
ERRCODE(ENrunH(&t));
|
||||||
ERRCODE(ENrunH(&t));
|
ERRCODE(ENnextH(&tstep));
|
||||||
ERRCODE(ENnextH(&tstep));
|
} while (tstep > 0);
|
||||||
}
|
}
|
||||||
while (tstep > 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ENcloseH();
|
ENcloseH();
|
||||||
|
|||||||
@@ -692,22 +692,21 @@ extern "C" {
|
|||||||
@return Error code.
|
@return Error code.
|
||||||
*/
|
*/
|
||||||
int DLLEXPORT ENgetcurve(int curveIndex, char* id, int *nValues, EN_API_FLOAT_TYPE **xValues, EN_API_FLOAT_TYPE **yValues);
|
int DLLEXPORT ENgetcurve(int curveIndex, char* id, int *nValues, EN_API_FLOAT_TYPE **xValues, EN_API_FLOAT_TYPE **yValues);
|
||||||
int DLLEXPORT ENgetheadcurveindex(int index, int *curveindex);
|
|
||||||
int DLLEXPORT ENgetpumptype(int index, int *type);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@brief Get the string ID of the head curve assigned to a pump.
|
@brief Retrieves the curve index for a specified pump index.
|
||||||
@param linkIndex The index of a pump
|
@param pumpIndex The index of a pump
|
||||||
@param[out] curveId The string ID of a curve. Must be preallocated by the client for at least MAXID characters.
|
@param[out] curveIndex The index of the curve used by the pump.
|
||||||
@return Error code.
|
@return Error code.
|
||||||
*/
|
*/
|
||||||
int DLLEXPORT ENgetheadcurve(int linkIndex, char *curveId);
|
int DLLEXPORT ENgetheadcurveindex(int pumpIndex, int *curveIndex);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@brief Get the type of pump
|
@brief Get the type of pump
|
||||||
@param linkIndex The index of the pump element
|
@param linkIndex The index of the pump element
|
||||||
@param outType The integer-typed pump type signifier (output parameter)
|
@param[out] outType The integer-typed pump curve type signifier (output parameter)
|
||||||
@return Error code
|
@return Error code
|
||||||
|
@see EN_CurveType
|
||||||
*/
|
*/
|
||||||
int DLLEXPORT ENgetpumptype(int linkIndex, int *outType);
|
int DLLEXPORT ENgetpumptype(int linkIndex, int *outType);
|
||||||
|
|
||||||
@@ -796,79 +795,111 @@ extern "C" {
|
|||||||
int DLLEXPORT ENsetoption(int code, EN_API_FLOAT_TYPE v);
|
int DLLEXPORT ENsetoption(int code, EN_API_FLOAT_TYPE v);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@brief
|
@brief Sets the level of hydraulic status reporting.
|
||||||
@param
|
@param code Status reporting code.
|
||||||
@return
|
@return Error code.
|
||||||
*/
|
*/
|
||||||
int DLLEXPORT ENsetstatusreport(int code);
|
int DLLEXPORT ENsetstatusreport(int code);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@brief
|
@brief Sets type of quality analysis called for
|
||||||
@param
|
@param qualcode WQ parameter code, EN_QualityType
|
||||||
@return
|
@param chemname Name of WQ constituent
|
||||||
|
@param chemunits Concentration units of WQ constituent
|
||||||
|
@param tracenode ID of node being traced (if applicable)
|
||||||
|
@return Error code.
|
||||||
|
@see EN_QualityType
|
||||||
|
|
||||||
|
chemname and chemunits only apply when WQ analysis is for chemical. tracenode only applies when WQ analysis is source tracing.
|
||||||
*/
|
*/
|
||||||
int DLLEXPORT ENsetqualtype(int qualcode, char *chemname, char *chemunits, char *tracenode);
|
int DLLEXPORT ENsetqualtype(int qualcode, char *chemname, char *chemunits, char *tracenode);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@brief
|
@brief Get quality analysis information (type, chemical name, units, trace node ID)
|
||||||
@param
|
@param[out] qualcode The EN_QualityType code being used.
|
||||||
@return
|
@param[out] chemname The name of the WQ constituent.
|
||||||
|
@param[out] chemunits The cencentration units of the WQ constituent.
|
||||||
|
@param[out] tracenode The trace node ID.
|
||||||
|
@return Error code.
|
||||||
|
@see EN_QualityType
|
||||||
*/
|
*/
|
||||||
int DLLEXPORT ENgetqualinfo(int *qualcode, char *chemname, char *chemunits, int *tracenode);
|
int DLLEXPORT ENgetqualinfo(int *qualcode, char *chemname, char *chemunits, int *tracenode);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@brief
|
@brief Sets the node's base demand for a category.
|
||||||
@param
|
@param nodeIndex The index of a node.
|
||||||
@return
|
@param demandIdx The index of a demand category.
|
||||||
|
@param baseDemand The base demand multiplier for the selected category.
|
||||||
|
@return Error code.
|
||||||
|
@see ENgetbasedemand
|
||||||
*/
|
*/
|
||||||
int DLLEXPORT ENsetbasedemand(int nodeIndex, int demandIdx, EN_API_FLOAT_TYPE baseDemand);
|
int DLLEXPORT ENsetbasedemand(int nodeIndex, int demandIdx, EN_API_FLOAT_TYPE baseDemand);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@brief
|
@brief Retrieves index of curve with specific ID.
|
||||||
@param
|
@param id The ID of a curve.
|
||||||
@return
|
@param[out] index The index of the named curve
|
||||||
|
@return Error code.
|
||||||
|
@see ENgetcurveid
|
||||||
*/
|
*/
|
||||||
int DLLEXPORT ENgetcurveindex(char *id, int *index);
|
int DLLEXPORT ENgetcurveindex(char *id, int *index);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@brief
|
@brief Retrieves ID of a curve with specific index.
|
||||||
@param
|
@param index The index of a curve.
|
||||||
@return
|
@param[out] id The ID of the curve specified.
|
||||||
|
@return Error code.
|
||||||
|
@see ENsetcurveindex
|
||||||
|
|
||||||
|
NOTE: 'id' must be able to hold MAXID characters
|
||||||
*/
|
*/
|
||||||
int DLLEXPORT ENgetcurveid(int index, char *id);
|
int DLLEXPORT ENgetcurveid(int index, char *id);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@brief
|
@brief Retrieves number of points in a curve
|
||||||
@param
|
@param index The index of a curve.
|
||||||
@return
|
@param[out] len The length of the curve coordinate list
|
||||||
|
@return Error code.
|
||||||
|
@see ENgetcurvevalue
|
||||||
*/
|
*/
|
||||||
int DLLEXPORT ENgetcurvelen(int index, int *len);
|
int DLLEXPORT ENgetcurvelen(int index, int *len);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@brief
|
@brief retrieves x,y point for a specific point number and curve
|
||||||
@param
|
@param curveIndex The index of a curve
|
||||||
@return
|
@param pointIndex The index of a point in the curve
|
||||||
|
@param[out] x The x-value of the specified point.
|
||||||
|
@param[out] y The y-value of the specified point.
|
||||||
|
@return Error code.
|
||||||
|
@see ENgetcurvelen ENsetcurvevalue
|
||||||
*/
|
*/
|
||||||
int DLLEXPORT ENgetcurvevalue(int index, int pnt, EN_API_FLOAT_TYPE *x, EN_API_FLOAT_TYPE *y);
|
int DLLEXPORT ENgetcurvevalue(int curveIndex, int pointIndex, EN_API_FLOAT_TYPE *x, EN_API_FLOAT_TYPE *y);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@brief
|
@brief Sets x,y point for a specific point and curve.
|
||||||
@param
|
@param curveIndex The index of a curve.
|
||||||
@return
|
@param pointIndex The index of a point in the curve.
|
||||||
|
@param x The x-value of the point.
|
||||||
|
@param y The y-value of the point.
|
||||||
|
@return Error code.
|
||||||
*/
|
*/
|
||||||
int DLLEXPORT ENsetcurvevalue(int index, int pnt, EN_API_FLOAT_TYPE x, EN_API_FLOAT_TYPE y);
|
int DLLEXPORT ENsetcurvevalue(int curveIndex, int pointIndex, EN_API_FLOAT_TYPE x, EN_API_FLOAT_TYPE y);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@brief
|
@brief Sets x,y values for a specified curve.
|
||||||
@param
|
@param index The index of a curve.
|
||||||
@return
|
@param x An array of x-values for the curve.
|
||||||
|
@param y An array of y-values for the curve.
|
||||||
|
@param len The length of the arrays x and y.
|
||||||
|
@return Error code.
|
||||||
*/
|
*/
|
||||||
int DLLEXPORT ENsetcurve(int index, EN_API_FLOAT_TYPE *x, EN_API_FLOAT_TYPE *y, int len);
|
int DLLEXPORT ENsetcurve(int index, EN_API_FLOAT_TYPE *x, EN_API_FLOAT_TYPE *y, int len);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@brief
|
@brief Adds a new curve appended to the end of the existing curves.
|
||||||
@param
|
@param id The name of the curve to be added.
|
||||||
@return
|
@return Error code.
|
||||||
|
@see ENgetcurveindex ENsetcurve
|
||||||
*/
|
*/
|
||||||
int DLLEXPORT ENaddcurve(char *id);
|
int DLLEXPORT ENaddcurve(char *id);
|
||||||
|
|
||||||
|
|||||||
113
src/epanet.c
113
src/epanet.c
@@ -930,13 +930,6 @@ int DLLEXPORT ENgetpatternvalue(int index, int period, EN_API_FLOAT_TYPE *value)
|
|||||||
|
|
||||||
|
|
||||||
int DLLEXPORT ENgetcurveindex(char *id, int *index)
|
int DLLEXPORT ENgetcurveindex(char *id, int *index)
|
||||||
/*----------------------------------------------------------------
|
|
||||||
** Input: id = curve ID
|
|
||||||
** Output: *index = index of curve in list of curves
|
|
||||||
** Returns: error code
|
|
||||||
** Purpose: retrieves index of curve with specific ID
|
|
||||||
**----------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
*index = 0;
|
*index = 0;
|
||||||
@@ -955,15 +948,6 @@ int DLLEXPORT ENgetcurveindex(char *id, int *index)
|
|||||||
|
|
||||||
|
|
||||||
int DLLEXPORT ENgetcurveid(int index, char *id)
|
int DLLEXPORT ENgetcurveid(int index, char *id)
|
||||||
/*----------------------------------------------------------------
|
|
||||||
** Input: index = index of curve
|
|
||||||
** Output: id = curve ID
|
|
||||||
** Returns: error code
|
|
||||||
** Purpose: retrieves ID of a curve with specific index
|
|
||||||
**
|
|
||||||
** NOTE: 'id' must be able to hold MAXID characters
|
|
||||||
**----------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
{
|
{
|
||||||
strcpy(id,"");
|
strcpy(id,"");
|
||||||
if (!Openflag) return(102);
|
if (!Openflag) return(102);
|
||||||
@@ -974,13 +958,6 @@ int DLLEXPORT ENgetcurveid(int index, char *id)
|
|||||||
|
|
||||||
|
|
||||||
int DLLEXPORT ENgetcurvelen(int index, int *len)
|
int DLLEXPORT ENgetcurvelen(int index, int *len)
|
||||||
/*----------------------------------------------------------------
|
|
||||||
** Input: index = index of curve
|
|
||||||
** Output: *len = curve length (number of points in curve)
|
|
||||||
** Returns: error code
|
|
||||||
** Purpose: retrieves number of points in a curve
|
|
||||||
**----------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
{
|
{
|
||||||
if (!Openflag) return(102);
|
if (!Openflag) return(102);
|
||||||
if (index < 1 || index > Ncurves) return(206);
|
if (index < 1 || index > Ncurves) return(206);
|
||||||
@@ -990,16 +967,6 @@ int DLLEXPORT ENgetcurvelen(int index, int *len)
|
|||||||
|
|
||||||
|
|
||||||
int DLLEXPORT ENgetcurvevalue(int index, int pnt, EN_API_FLOAT_TYPE *x, EN_API_FLOAT_TYPE *y)
|
int DLLEXPORT ENgetcurvevalue(int index, int pnt, EN_API_FLOAT_TYPE *x, EN_API_FLOAT_TYPE *y)
|
||||||
/*----------------------------------------------------------------
|
|
||||||
** Input: index = index of curve
|
|
||||||
** pnt = curve's point number
|
|
||||||
** Output: *x = curve x value
|
|
||||||
** curve y value
|
|
||||||
** Returns: error code
|
|
||||||
** Purpose: retrieves x,y point for a specific point number
|
|
||||||
** and curve
|
|
||||||
**----------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
{
|
{
|
||||||
*x = 0.0;
|
*x = 0.0;
|
||||||
*y = 0.0;
|
*y = 0.0;
|
||||||
@@ -1500,18 +1467,6 @@ int DLLEXPORT ENgetlinkvalue(int index, int code, EN_API_FLOAT_TYPE *value)
|
|||||||
|
|
||||||
|
|
||||||
int DLLEXPORT ENgetcurve(int curveIndex, char* id, int *nValues, EN_API_FLOAT_TYPE **xValues, EN_API_FLOAT_TYPE **yValues)
|
int DLLEXPORT ENgetcurve(int curveIndex, char* id, int *nValues, EN_API_FLOAT_TYPE **xValues, EN_API_FLOAT_TYPE **yValues)
|
||||||
/*----------------------------------------------------------------
|
|
||||||
** Input: curveIndex = curve index
|
|
||||||
** Output: *nValues = number of points on curve
|
|
||||||
** id = curve ID
|
|
||||||
** *xValues = values for x
|
|
||||||
** *yValues = values for y
|
|
||||||
** Returns: error code
|
|
||||||
** Purpose: retrieves curve id, number of values and (x,y) values
|
|
||||||
**
|
|
||||||
** NOTE: 'id' must be able to hold MAXID characters
|
|
||||||
**----------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
{
|
{
|
||||||
int iPoint, nPoints;
|
int iPoint, nPoints;
|
||||||
Scurve curve;
|
Scurve curve;
|
||||||
@@ -2047,14 +2002,6 @@ int DLLEXPORT ENsetpatternvalue(int index, int period, EN_API_FLOAT_TYPE value
|
|||||||
|
|
||||||
|
|
||||||
int DLLEXPORT ENaddcurve(char *id)
|
int DLLEXPORT ENaddcurve(char *id)
|
||||||
/*----------------------------------------------------------------
|
|
||||||
** Input: id = ID name of the new curve
|
|
||||||
** Output: none
|
|
||||||
** Returns: error code
|
|
||||||
** Purpose: adds a new curve appended to the end of the
|
|
||||||
** existing curves.
|
|
||||||
**----------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
{
|
{
|
||||||
int i, j, n, err = 0;
|
int i, j, n, err = 0;
|
||||||
Scurve *tmpCur;
|
Scurve *tmpCur;
|
||||||
@@ -2134,16 +2081,6 @@ int DLLEXPORT ENaddcurve(char *id)
|
|||||||
|
|
||||||
|
|
||||||
int DLLEXPORT ENsetcurve(int index, EN_API_FLOAT_TYPE *x, EN_API_FLOAT_TYPE *y, int n)
|
int DLLEXPORT ENsetcurve(int index, EN_API_FLOAT_TYPE *x, EN_API_FLOAT_TYPE *y, int n)
|
||||||
/*----------------------------------------------------------------
|
|
||||||
** Input: index = curve index
|
|
||||||
** *x = array of x points
|
|
||||||
** *y = array of y points
|
|
||||||
** n = number of points in curve
|
|
||||||
** Output: none
|
|
||||||
** Returns: error code
|
|
||||||
** Purpose: sets x,y values for a specific curve
|
|
||||||
**----------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
{
|
{
|
||||||
int j;
|
int j;
|
||||||
|
|
||||||
@@ -2170,16 +2107,6 @@ int DLLEXPORT ENsetcurve(int index, EN_API_FLOAT_TYPE *x, EN_API_FLOAT_TYPE *y
|
|||||||
|
|
||||||
|
|
||||||
int DLLEXPORT ENsetcurvevalue(int index, int pnt, EN_API_FLOAT_TYPE x, EN_API_FLOAT_TYPE y)
|
int DLLEXPORT ENsetcurvevalue(int index, int pnt, EN_API_FLOAT_TYPE x, EN_API_FLOAT_TYPE y)
|
||||||
/*----------------------------------------------------------------
|
|
||||||
** Input: index = curve index
|
|
||||||
** pnt = curve's point number
|
|
||||||
** x = curve x value
|
|
||||||
** y = curve y value
|
|
||||||
** Output: none
|
|
||||||
** Returns: error code
|
|
||||||
** Purpose: sets x,y point for a specific point and curve
|
|
||||||
**----------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
{
|
{
|
||||||
if (!Openflag) return(102);
|
if (!Openflag) return(102);
|
||||||
if (index <= 0 || index > Ncurves) return(206);
|
if (index <= 0 || index > Ncurves) return(206);
|
||||||
@@ -2320,13 +2247,6 @@ int DLLEXPORT ENsetoption(int code, EN_API_FLOAT_TYPE v)
|
|||||||
|
|
||||||
|
|
||||||
int DLLEXPORT ENsetstatusreport(int code)
|
int DLLEXPORT ENsetstatusreport(int code)
|
||||||
/*----------------------------------------------------------------
|
|
||||||
** Input: code = status reporting code (0, 1, or 2)
|
|
||||||
** Output: none
|
|
||||||
** Returns: error code
|
|
||||||
** Purpose: sets level of hydraulic status reporting
|
|
||||||
**----------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
{
|
{
|
||||||
int errcode = 0;
|
int errcode = 0;
|
||||||
if (code >= 0 && code <= 2) Statflag = (char)code;
|
if (code >= 0 && code <= 2) Statflag = (char)code;
|
||||||
@@ -2335,22 +2255,7 @@ int DLLEXPORT ENsetstatusreport(int code)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int DLLEXPORT ENsetqualtype(int qualcode, char *chemname,
|
int DLLEXPORT ENsetqualtype(int qualcode, char *chemname, char *chemunits, char *tracenode)
|
||||||
char *chemunits, char *tracenode)
|
|
||||||
/*----------------------------------------------------------------
|
|
||||||
** Input: qualcode = WQ parameter code (see EPANET2.H)
|
|
||||||
** chemname = name of WQ constituent
|
|
||||||
** chemunits = concentration units of WQ constituent
|
|
||||||
** tracenode = ID of node being traced
|
|
||||||
** Output: none
|
|
||||||
** Returns: error code
|
|
||||||
** Purpose: sets type of quality analysis called for
|
|
||||||
**
|
|
||||||
** NOTE: chemname and chemunits only apply when WQ analysis
|
|
||||||
** is for chemical. tracenode only applies when WQ
|
|
||||||
** analysis is source tracing.
|
|
||||||
**----------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
{
|
{
|
||||||
/*** Updated 3/1/01 ***/
|
/*** Updated 3/1/01 ***/
|
||||||
double ccf = 1.0;
|
double ccf = 1.0;
|
||||||
@@ -2398,14 +2303,6 @@ int DLLEXPORT ENsetqualtype(int qualcode, char *chemname,
|
|||||||
}
|
}
|
||||||
|
|
||||||
int DLLEXPORT ENgetheadcurveindex(int index, int *curveindex)
|
int DLLEXPORT ENgetheadcurveindex(int index, int *curveindex)
|
||||||
/*----------------------------------------------------------------
|
|
||||||
** Input: index = index of pump in list of links
|
|
||||||
** Output: curveindex = head curve index
|
|
||||||
** Returns: error code
|
|
||||||
** Purpose: retrieves index of a head curve for specific link index
|
|
||||||
**
|
|
||||||
**----------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
{
|
{
|
||||||
if (!Openflag) return(102);
|
if (!Openflag) return(102);
|
||||||
if (index < 1 || index > Nlinks || PUMP != Link[index].Type) return(204);
|
if (index < 1 || index > Nlinks || PUMP != Link[index].Type) return(204);
|
||||||
@@ -3191,14 +3088,6 @@ int DLLEXPORT ENgetbasedemand(int nodeIndex, int demandIdx, EN_API_FLOAT_TYPE *
|
|||||||
|
|
||||||
|
|
||||||
int DLLEXPORT ENsetbasedemand(int nodeIndex, int demandIdx, EN_API_FLOAT_TYPE baseDemand)
|
int DLLEXPORT ENsetbasedemand(int nodeIndex, int demandIdx, EN_API_FLOAT_TYPE baseDemand)
|
||||||
/*----------------------------------------------------------------
|
|
||||||
** Input: nodeIndex = index of node
|
|
||||||
** demandIdx = index of demand category
|
|
||||||
** baseDemand = base demand for selected category
|
|
||||||
** Returns: error code
|
|
||||||
** Purpose: sets the node's base demand for a category
|
|
||||||
**----------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
{
|
{
|
||||||
Pdemand d;
|
Pdemand d;
|
||||||
int n=1;
|
int n=1;
|
||||||
|
|||||||
Reference in New Issue
Block a user