77 Authors: see AUTHORS
88 Copyright: see AUTHORS
99 License: see LICENSE
10- Last Updated: 03/19 /2026
10+ Last Updated: 05/11 /2026
1111 ******************************************************************************
1212*/
1313
1616#include <string.h>
1717#include <float.h>
1818#include <math.h>
19+ #include <locale.h>
1920
2021#include "epanet2_2.h"
2122#include "types.h"
@@ -48,6 +49,10 @@ int DLLEXPORT EN_createproject(EN_Project *p)
4849 getTmpName (project -> TmpOutFname );
4950 getTmpName (project -> TmpStatFname );
5051 * p = project ;
52+
53+ // Use system's decimal point (will be changed locally to dot
54+ // when reading/writing EPANET input files)
55+ setlocale (LC_NUMERIC , "" );
5156 return 0 ;
5257}
5358
@@ -2768,7 +2773,7 @@ int DLLEXPORT EN_setnodevalues(EN_Project p, int property, double *values, int *
27682773**----------------------------------------------------------------
27692774*/
27702775{
2771- int i , j , errcode = 0 ;
2776+ int i , j , k , errcode = 0 ;
27722777 int n = p -> network .Nnodes ;
27732778 double * old = NULL ;
27742779
@@ -2796,7 +2801,7 @@ int DLLEXPORT EN_setnodevalues(EN_Project p, int property, double *values, int *
27962801 }
27972802 if (errcode != 0 )
27982803 {
2799- for (int k = 1 ; k <= j ; k ++ )
2804+ for (k = 1 ; k <= j ; k ++ )
28002805 {
28012806 EN_setnodevalue (p , k , property , old [k - 1 ]);
28022807 }
@@ -4331,20 +4336,30 @@ int DLLEXPORT EN_setlinkvalue(EN_Project p, int index, int property, double valu
43314336
43324337 case EN_LEAK_AREA : // leak area per 100 pipe lengths units
43334338 if (value < 0.0 ) return 211 ;
4334- Link [index ].LeakArea = value * Ucf [LENGTH ];
4339+ value = value * Ucf [LENGTH ];
4340+ if (fabs (value - Link [index ].LeakArea ) > TINY )
4341+ {
4342+ Link [index ].LeakArea = value ;
4343+ if (hyd -> OpenHflag ) hyd -> LeakageChanged = TRUE;
4344+ }
43354345 break ;
43364346
43374347 case EN_LEAK_EXPAN : // leak area expansion slope per 100 pipe length units
43384348 if (value < 0.0 ) return 211 ;
4339- Link [index ].LeakExpan = value * Ucf [LENGTH ];
4349+ value = value * Ucf [LENGTH ];
4350+ if (fabs (value - Link [index ].LeakExpan ) > TINY )
4351+ {
4352+ Link [index ].LeakExpan = value ;
4353+ if (hyd -> OpenHflag ) hyd -> LeakageChanged = TRUE;
4354+ }
43404355 break ;
43414356
43424357 case EN_VALVE_TYPE :
43434358 if (hyd -> OpenHflag || qual -> OpenQflag ) return 262 ; //Solver is running
43444359 if (Link [index ].Type <= PUMP ) return 264 ; //Link not a valve
43454360 valveType = ROUND (value );
43464361 if (valveType < PRV || valveType > PCV ) return 213 ; //Invalid valve type
4347- if (valveType == Link [index ].Type ) return 0 ; //No type change
4362+ if (valveType == ( int ) Link [index ].Type ) return 0 ; //No type change
43484363 return changevalvetype (p , index , valveType ); //See project.c
43494364
43504365 default :
@@ -4363,7 +4378,7 @@ int DLLEXPORT EN_setlinkvalues(EN_Project p, int property, double *values, int *
43634378**----------------------------------------------------------------
43644379*/
43654380{
4366- int i , j , errcode = 0 ;
4381+ int i , j , k , errcode = 0 ;
43674382 int n = p -> network .Nlinks ;
43684383 double * old = NULL ;
43694384
@@ -4391,7 +4406,7 @@ int DLLEXPORT EN_setlinkvalues(EN_Project p, int property, double *values, int *
43914406 }
43924407 if (errcode != 0 )
43934408 {
4394- for (int k = 1 ; k <= j ; k ++ )
4409+ for (k = 1 ; k <= j ; k ++ )
43954410 {
43964411 EN_setlinkvalue (p , k , property , old [k - 1 ]);
43974412 }
@@ -4632,7 +4647,6 @@ int DLLEXPORT EN_setheadcurveindex(EN_Project p, int linkIndex, int curveIndex)
46324647 Network * net = & p -> network ;
46334648
46344649 int pumpIndex ;
4635- int err = 0 ;
46364650 Spump * pump ;
46374651
46384652 // Check for valid parameters
0 commit comments