diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml index 1026e4035..5ae4b656d 100644 --- a/.github/workflows/build-and-test.yml +++ b/.github/workflows/build-and-test.yml @@ -2,9 +2,9 @@ name: Build and Test on: push: - branches: [ master, develop, release ] + branches: [ master, develop, release, lew-develop ] pull_request: - branches: [ master, develop, release ] + branches: [ master, develop, release, lew-develop ] env: OMP_NUM_THREADS: 1 @@ -94,11 +94,11 @@ jobs: - name: Build run: make.cmd /g "Visual Studio 16 2019" - - name: Before test + - name: Before reg test env: - NRTESTS_URL: https://github.com/SWMM-Project/swmm-nrtestsuite - RELEASE_TAG: v2.0.0 - run: before-nrtest.cmd %RELEASE_TAG% + NRTESTS_URL: https://github.com/USEPA/swmm-nrtestsuite + BENCHMARK_TAG: v2.1.0 + run: before-nrtest.cmd ${{ env.BENCHMARK_TAG }} - name: Reg test run: run-nrtests.cmd %GITHUB_RUN_ID%_%GITHUB_RUN_NUMBER% diff --git a/CMakeLists.txt b/CMakeLists.txt index 18cfa7c7a..4e6e0154f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,7 +2,7 @@ # CMakeLists.txt - CMake configuration file for swmm-solver # # Created: July 11, 2019 -# Modified: Nov 25, 2019 +# Modified: Aug 16, 2022 # # Author: Michael E. Tryby # US EPA ORD/CESER @@ -17,7 +17,7 @@ endif() project(swmm-solver - VERSION 5.2.0 + VERSION 5.2.1 LANGUAGES C CXX ) diff --git a/src/solver/consts.h b/src/solver/consts.h index c42235c99..3cb4cd990 100644 --- a/src/solver/consts.h +++ b/src/solver/consts.h @@ -3,7 +3,7 @@ // // Project: EPA SWMM5 // Version: 5.2 -// Date: 11/01/21 (Build 5.2.0) +// Date: 06/01/22 (Build 5.2.1) // Author: L. Rossman // // Various Constants @@ -16,7 +16,7 @@ // General Constants //------------------ -#define VERSION 52000 +#define VERSION 52001 #define MAGICNUMBER 516114522 #define EOFMARK 0x1A // Use 0x04 for UNIX systems #define MAXTITLE 3 // Max. # title lines diff --git a/src/solver/controls.c b/src/solver/controls.c index d2af28131..b46054006 100644 --- a/src/solver/controls.c +++ b/src/solver/controls.c @@ -3,7 +3,7 @@ // // Project: EPA SWMM5 // Version: 5.2 -// Date: 11/01/21 (Build 5.2.0) +// Date: 06/01/22 (Build 5.2.1) // Author: L. Rossman // // Rule-based controls functions. @@ -48,6 +48,9 @@ // - Additional attributes added to condition clauses. // - Support added for named variables in condition clauses. // - Support added for math expressions in condition clauses. +// Build 5.2.1: +// - A refactoring bug from 5.2.0 causing duplicate actions to be added +// to the list of control actions to take was fixed. //----------------------------------------------------------------------------- #define _CRT_SECURE_NO_DEPRECATE @@ -1188,14 +1191,14 @@ void updateActionList(struct TAction* a) listItem = listItem->next; } - // --- action not listed so add it to ActionList - listItem = (struct TActionList *) malloc(sizeof(struct TActionList)); - if (listItem) + // --- action not listed so add it to ActionList //5.2.1 + if ( !listItem ) { + listItem = (struct TActionList *) malloc(sizeof(struct TActionList)); listItem->next = ActionList; ActionList = listItem; - listItem->action = a; } + listItem->action = a; } //============================================================================= diff --git a/src/solver/dwflow.c b/src/solver/dwflow.c index 14338b2de..d6484fe57 100644 --- a/src/solver/dwflow.c +++ b/src/solver/dwflow.c @@ -3,7 +3,7 @@ // // Project: EPA SWMM5 // Version: 5.2 -// Date: 11/01/21 (Build 5.2.0) +// Date: 08/01/22 (Build 5.2.1) // Author: L. Rossman // M. Tryby (EPA) // R. Dickinson (CDM) @@ -24,6 +24,8 @@ // - Conduit evap. and seepage loss initialized to 0 in dwflow_findConduitFlow. // - Most current flow (qLast) used instead of previous time period flow // (qOld) in call to link_getLossRate. +// Build 5.2.1: +// - Implements the new option to skip checking for normal flow limitations. //----------------------------------------------------------------------------- #define _CRT_SECURE_NO_DEPRECATE @@ -248,11 +250,10 @@ void dwflow_findConduitFlow(int j, int steps, double omega, double dt) q = culvert_getInflow(j, q, h1); // --- check for normal flow limitation based on surface slope & Fr - else - if ( y1 < Link[j].xsect.yFull && - ( Link[j].flowClass == SUBCRITICAL || - Link[j].flowClass == SUPCRITICAL ) - ) q = checkNormalFlow(j, q, y1, y2, a1, r1); + else if (NormalFlowLtd != NEITHER && y1 < Link[j].xsect.yFull && + ( Link[j].flowClass == SUBCRITICAL || + Link[j].flowClass == SUPCRITICAL )) + q = checkNormalFlow(j, q, y1, y2, a1, r1); } // --- apply under-relaxation weighting between new & old flows; @@ -436,8 +437,8 @@ void findSurfArea(int j, double q, double length, double* h1, double* h2, double surfArea2 = 0.0; // surface area st downstrm node (ft2) double criticalDepth; // critical flow depth (ft) double normalDepth; // normal flow depth (ft) - double fullDepth; // full depth (ft) //(5.1.013) - double fasnh = 1.0; // fraction between norm. & crit. depth //(5.1.013) + double fullDepth; // full depth (ft) + double fasnh = 1.0; // fraction between norm. & crit. depth TXsect* xsect = &Link[j].xsect; // pointer to cross-section data // --- get node indexes & current flow depths @@ -655,7 +656,7 @@ double checkNormalFlow(int j, double q, double y1, double y2, double a1, // --- check if water surface slope < conduit slope if ( NormalFlowLtd == SLOPE || NormalFlowLtd == BOTH || hasOutfall ) { - if ( y1 < y2 ) check = TRUE; + if ( y1 < y2) check = TRUE; } // --- check if Fr >= 1.0 at upstream end of conduit diff --git a/src/solver/enums.h b/src/solver/enums.h index fc3cc2b4b..c260e4150 100644 --- a/src/solver/enums.h +++ b/src/solver/enums.h @@ -3,7 +3,7 @@ // // Project: EPA SWMM5 // Version: 5.2 -// Date: 11/01/21 (Build 5.2.0) +// Date: 06/01/22 (Build 5.2.1) // Author: L. Rossman // // Enumerated constants @@ -31,6 +31,8 @@ // - Support added for Streets and Inlets. // - Support added for variable speed pumps. // - Support added for analytical storage shapes. +// Build 5.2.1: +// - Adds a NEITHER option to the NormalFlowType enumeration. //----------------------------------------------------------------------------- #ifndef ENUMS_H @@ -356,7 +358,8 @@ enum CompatibilityType { enum NormalFlowType { SLOPE, // based on slope only FROUDE, // based on Fr only - BOTH}; // based on slope & Fr + BOTH, // based on slope & Fr + NEITHER}; enum InertialDampingType { NO_DAMPING, // no inertial damping diff --git a/src/solver/flowrout.c b/src/solver/flowrout.c index d38b68488..f296c3fb0 100644 --- a/src/solver/flowrout.c +++ b/src/solver/flowrout.c @@ -3,7 +3,7 @@ // // Project: EPA SWMM5 // Version: 5.2 -// Date: 11/01/21 (Build 5.2.0) +// Date: 05/02/22 (Build 5.2.1) // Author: L. Rossman // M. Tryby (EPA) // @@ -24,6 +24,9 @@ // - Arguments to function link_getLossRate changed. // Build 5.2.0: // - Correction made to updating state of terminal storage nodes. +// Build 5.2.1: +// - For storage routing, after convergence the reported depth is now +// based on the last volume found rather than the next trial depth. //----------------------------------------------------------------------------- #define _CRT_SECURE_NO_DEPRECATE @@ -587,7 +590,6 @@ void updateStorageState(int i, int j, int links[], double dt) if ( fabs(d2 - d1) <= STOPTOL ) stopped = TRUE; // --- update old depth with new value and continue to iterate - Node[i].newDepth = d2; d1 = d2; iter++; } diff --git a/src/solver/inlet.c b/src/solver/inlet.c index 2a09642d3..1ec914c4d 100644 --- a/src/solver/inlet.c +++ b/src/solver/inlet.c @@ -3,7 +3,7 @@ // // Project: EPA SWMM5 // Version: 5.2 -// Date: 11/01/21 (Build 5.2.0) +// Date: 06/01/22 (Build 5.2.1) // Author: L. Rossman // // Street/Channel Inlet Functions @@ -14,6 +14,8 @@ // Administration Hydraulic Engineering Circular No. 22, 3rd Edition, // FHWA-NHI-10-009, August 2013). // +// Build 5.2.1: +// - Substitutes the constant BIG for HUGE. //----------------------------------------------------------------------------- #define _CRT_SECURE_NO_DEPRECATE @@ -1567,7 +1569,7 @@ double getOnSagCapturedFlow(TInlet* inlet, double q, double d) // { int linkIndex, designIndex, totalInlets; - double qCaptured = 0.0, qMax = HUGE; + double qCaptured = 0.0, qMax = BIG; if (inlet->numInlets == 0) return 0.0; totalInlets = Nsides * inlet->numInlets; @@ -1680,7 +1682,7 @@ void findOnSagGrateFlows(int i, double d, double *Qw, double *Qo) // --- orifice flow applies else { - *Qo = 0.67 * Ao * sqrt(2.0 * GRAVITY * di); //HEC-22 Eq(4-27) + *Qo = 0.67 * Ao * sqrt(2.0 * 32.16 * di); //HEC-22 Eq(4-27) } } @@ -1763,7 +1765,7 @@ double getCurbOrificeFlow(double di, double h, double L, int throatAngle) d = di - h / 2.0; else if (throatAngle == INCLINED_THROAT) d = di + (h / 2.0) * 0.7071; - return 0.67 * h * L * sqrt(2.0 * GRAVITY * d); //HEC-22 Eq(4-31a) + return 0.67 * h * L * sqrt(2.0 * 32.16 * d); //HEC-22 Eq(4-31a) } //============================================================================= @@ -1895,7 +1897,7 @@ double getCustomCapturedFlow(TInlet* inlet, double q, double d) qBypassed, // inlet's bypassed flow (cfs) qCaptured, // inlet's captured flow (cfs) qIncrement, // increment to captured flow (cfs) - qMax = HUGE; // user-supplied flow capture limit (cfs) + qMax = BIG; // user-supplied flow capture limit (cfs) if (inlet->numInlets == 0) return 0.0; diff --git a/src/solver/input.c b/src/solver/input.c index 3613297b9..c0f7a0d9f 100644 --- a/src/solver/input.c +++ b/src/solver/input.c @@ -3,7 +3,7 @@ // // Project: EPA SWMM5 // Version: 5.2 -// Date: 11/01/21 (Build 5.2.0) +// Date: 06/01/22 (Build 5.2.1) // Author: L. Rossman // // Input data processing functions. @@ -19,6 +19,8 @@ // Build 5.2.0: // - Support added for Streets and Inlets. // - Support added for named variables & math expressions in control rules. +// Build 5.2.1: +// - Possible integer underflow avoided in getTokens() function. //----------------------------------------------------------------------------- #define _CRT_SECURE_NO_DEPRECATE @@ -889,8 +891,8 @@ int getTokens(char *s) // in CONSTS.H. Text between quotes is treated as a single token. // { - int n; - size_t len, m; + int len, n; + int m; char *c; // --- begin with no tokens @@ -905,7 +907,7 @@ int getTokens(char *s) // --- scan s for tokens until nothing left while (len > 0 && n < MAXTOKS) { - m = strcspn(s,SEPSTR); // find token length + m = (int)strcspn(s,SEPSTR); // find token length if (m == 0) s++; // no token found else { @@ -913,7 +915,7 @@ int getTokens(char *s) { s++; // start token after quote len--; // reduce length of s - m = strcspn(s,"\"\n"); // find end quote or new line + m = (int)strcspn(s,"\"\n"); // find end quote or new line } s[m] = '\0'; // null-terminate the token Tok[n] = s; // save pointer to token diff --git a/src/solver/keywords.c b/src/solver/keywords.c index 17973d182..5f4b4e443 100644 --- a/src/solver/keywords.c +++ b/src/solver/keywords.c @@ -3,7 +3,7 @@ // // Project: EPA SWMM5 // Version: 5.2 -// Date: 11/01/21 (Build 5.2.0) +// Date: 06/01/22 (Build 5.2.1) // Author: L. Rossman // // Exportable keyword dictionary @@ -34,6 +34,8 @@ // - Support added for variable speed pumps. // - Support added for analytical storage shapes. // - Support added for RptFlags.disabled option. +// Build 5.2.1: +// - Adds NONE to the list of NormalFlowWords. //----------------------------------------------------------------------------- #define _CRT_SECURE_NO_DEPRECATE @@ -65,7 +67,7 @@ char* LoadUnitsWords[] = { w_LBS, w_KG, w_LOGN }; char* NodeTypeWords[] = { w_JUNCTION, w_OUTFALL, w_STORAGE, w_DIVIDER }; char* NoneAllWords[] = { w_NONE, w_ALL, NULL}; -char* NormalFlowWords[] = { w_SLOPE, w_FROUDE, w_BOTH, NULL}; +char* NormalFlowWords[] = { w_SLOPE, w_FROUDE, w_BOTH, w_NONE, NULL}; char* NormalizerWords[] = { w_PER_AREA, w_PER_CURB, NULL}; char* NoYesWords[] = { w_NO, w_YES, NULL}; char* OffOnWords[] = { w_OFF, w_ON, NULL}; diff --git a/src/solver/link.c b/src/solver/link.c index 6de3688d7..b93cdfbaa 100644 --- a/src/solver/link.c +++ b/src/solver/link.c @@ -3,7 +3,7 @@ // // Project: EPA SWMM5 // Version: 5.2 -// Date: 11/01/21 (Build 5.2.0) +// Date: 06/01/22 (Build 5.2.1) // Author: L. Rossman // M. Tryby (EPA) // @@ -36,12 +36,14 @@ // - Support added for head-dependent weir coefficient curves. // - Adjustment of regulator link crest offset to match downstream node invert // now only done for Dynamic Wave flow routing. -// Build 5.1.014: -// - Conduit evap. and seepage losses initialized to 0 in conduit_initState() -// and not allowed to exceed current flow rate in conduit_getLossRate(). -// Build 5.2.0: +// Build 5.1.014: +// - Conduit evap. and seepage losses initialized to 0 in conduit_initState() +// and not allowed to exceed current flow rate in conduit_getLossRate(). +// Build 5.2.0: // - Support added for Streets and Inlets. // - Support added for variable speed pumps. +// Build 5.2.1 +// - Warning no longer issued when conduit elevation drop < MIN_DELTA_Z. //----------------------------------------------------------------------------- #define _CRT_SECURE_NO_DEPRECATE @@ -1262,7 +1264,9 @@ double conduit_getSlope(int j) delta = fabs(elev1 - elev2); if ( delta < MIN_DELTA_Z ) { + /* Deprecated as of v.5.2.1 report_writeWarningMsg(WARN04, Link[j].ID); + */ delta = MIN_DELTA_Z; } diff --git a/src/solver/node.c b/src/solver/node.c index 65843252d..2b26ecd82 100644 --- a/src/solver/node.c +++ b/src/solver/node.c @@ -3,7 +3,7 @@ // // Project: EPA SWMM5 // Version: 5.2 -// Date: 11/01/21 (Build 5.2.0) +// Date: 06/01/22 (Build 5.2.1) // Author: L. Rossman // // Conveyance system node functions. @@ -27,9 +27,13 @@ // Build 5.1.015: // - Fatal error issued if a storage node's area curve produces a negative // volume when extrapolated to the node's full depth. -// Build 5.2.0: -// - Support added Streets and Inlets. -// - Support added for analytical storage shapes. +// Build 5.2.0: +// - Support added Streets and Inlets. +// - Support added for analytical storage shapes. +// Build 5.2.1: +// - Warning no longer issued when node full depth is increased to match +// crown of highest connecting link. +// - a2 term for paraboloid shaped storage units was corrected //----------------------------------------------------------------------------- #define _CRT_SECURE_NO_DEPRECATE @@ -200,11 +204,12 @@ void node_validate(int j) TDwfInflow* inflow; // --- see if full depth was increased to accommodate conduit crown +/* Deprecated as of v.5.2.1 if ( Node[j].fullDepth > Node[j].oldDepth && Node[j].oldDepth > 0.0 ) { report_writeWarningMsg(WARN02, Node[j].ID); } - +*/ // --- check that initial depth does not exceed max. depth if ( Node[j].initDepth > Node[j].fullDepth + Node[j].surDepth ) report_writeErrorMsg(ERR_NODE_DEPTH, Node[j].ID); diff --git a/src/solver/output.c b/src/solver/output.c index e45423b63..9a48f1200 100644 --- a/src/solver/output.c +++ b/src/solver/output.c @@ -3,7 +3,7 @@ // // Project: EPA SWMM5 // Version: 5.2 -// Date: 11/01/21 (Build 5.2.0) +// Date: 06/01/22 (Build 5.2.1) // Author: L. Rossman // // Binary output file access functions. @@ -26,6 +26,8 @@ // - Changed how time step averaged flow is computed. // - Object's rptFlag changed to record its index in output file. // - Large file support added. +// Build5.2.1: +// - Corrects the definition of F_OFF for non-Microsoft C/C++ compilers. //----------------------------------------------------------------------------- #define _CRT_SECURE_NO_DEPRECATE @@ -33,8 +35,8 @@ #ifdef _MSC_VER // Windows (32-bit and 64-bit) #define F_OFF __int64 #define F_SEEK _fseeki64 -#elif // Other platforms - #define F_OFF off64_t +#else // Other platforms + #define F_OFF off_t #define F_SEEK fseeko #endif diff --git a/src/solver/qualrout.c b/src/solver/qualrout.c index 89788ba8e..9fb0b263a 100644 --- a/src/solver/qualrout.c +++ b/src/solver/qualrout.c @@ -3,7 +3,7 @@ // // Project: EPA SWMM5 // Version: 5.2 -// Date: 11/01/21 (Build 5.2.0) +// Date: 08/01/22 (Build 5.2.1) // Author: L. Rossman // // Water quality routing functions. @@ -23,6 +23,9 @@ // Build 5.2.0: // - Support added for flow capture by inlet structures. // - Definition of a dry node/link modified. +// Build 5.2.1: +// - Dry non-storage nodes now have quality determined by inflow. +// - Wet non-storage nodes with no inflow now have no change in quality. //----------------------------------------------------------------------------- #define _CRT_SECURE_NO_DEPRECATE @@ -110,10 +113,10 @@ void qualrout_execute(double tStep) // --- find new water quality concentration at each node for (j = 0; j < Nobjects[NODE]; j++) - { + { // --- get node inflow and average volume + Node[j].qualInflow = Node[j].inflow; qIn = Node[j].qualInflow; - vAvg = (Node[j].oldVolume + Node[j].newVolume) / 2.0; // --- save inflow concentrations if treatment applied @@ -227,7 +230,7 @@ void findNodeQual(int j) // --- if there is flow into node then concen. = mass inflow/node flow qNode = Node[j].qualInflow; - if ( qNode > ZERO && Node[j].newDepth > ZeroDepth) + if ( qNode > ZERO ) { for (p = 0; p < Nobjects[POLLUT]; p++) { @@ -235,8 +238,14 @@ void findNodeQual(int j) } } - // --- otherwise concen. is 0 - else for (p = 0; p < Nobjects[POLLUT]; p++) Node[j].newQual[p] = 0.0; + // --- otherwise concen. remains the same + else for (p = 0; p < Nobjects[POLLUT]; p++) + { + if (Node[j].newDepth > ZeroDepth) + Node[j].newQual[p] = Node[j].oldQual[p]; + else + Node[j].newQual[p] = 0.0; + } } //============================================================================= diff --git a/src/solver/statsrpt.c b/src/solver/statsrpt.c index 7cd18576f..3bd799b9f 100644 --- a/src/solver/statsrpt.c +++ b/src/solver/statsrpt.c @@ -3,7 +3,7 @@ // // Project: EPA SWMM5 // Version: 5.2 -// Date: 11/01/21 (Build 5.2.0) +// Date: 06/01/22 (Build 5.2.1) // Author: L. Rossman // // Report writing functions for summary statistics. @@ -25,6 +25,8 @@ // Build 5.2.0: // - Adds a new Street & Inlet Summary table. // - Fixes value used for total reporting time. +// Build 5.2.1: +// - Replaces the "3" in "ft3" and "m3" with ANSI superscript (\xB3). //----------------------------------------------------------------------------- #define _CRT_SECURE_NO_DEPRECATE @@ -87,7 +89,7 @@ void statsrpt_writeReport() if ( FlowUnits == MGD || FlowUnits == CMS ) sstrncpy(FlowFmt, "%9.3f", 5); else sstrncpy(FlowFmt, "%9.2f", 5); - // --- volume conversion factor from ft3 to Mgal or Mliters + // --- conversion factor from cu. ft. to mil. gallons or megaliters if (UnitSystem == US) Vcf = 7.48 / 1.0e6; else Vcf = 28.317 / 1.0e6; @@ -524,9 +526,9 @@ void writeStorageVolumes() "\n Average Avg Evap Exfil Maximum Max Time of Max Maximum" "\n Volume Pcnt Pcnt Pcnt Volume Pcnt Occurrence Outflow"); if ( UnitSystem == US ) fprintf(Frpt.file, -"\n Storage Unit 1000 ft3 Full Loss Loss 1000 ft3 Full days hr:min "); +"\n Storage Unit 1000 ft\xB3 Full Loss Loss 1000 ft\xB3 Full days hr:min "); else fprintf(Frpt.file, -"\n Storage Unit 1000 m3 Full Loss Loss 1000 m3 Full days hr:min "); +"\n Storage Unit 1000 m\xB3 Full Loss Loss 1000 m\xB3 Full days hr:min "); fprintf(Frpt.file, "%3s", FlowUnitWords[FlowUnits]); fprintf(Frpt.file, "\n --------------------------------------------------------------------------------------------------"); diff --git a/src/solver/text.h b/src/solver/text.h index a9c52be33..70bfc1f50 100644 --- a/src/solver/text.h +++ b/src/solver/text.h @@ -3,7 +3,7 @@ // // Project: EPA SWMM5 // Version: 5.2 -// Date: 11/01/21 (Build 5.2.0) +// Date: 06/01/22 (Build 5.2.1) // Author: L. Rossman // // Text strings @@ -25,7 +25,7 @@ #define FMT03 " There are errors.\n" #define FMT04 " There are warnings.\n" #define FMT08 \ - "\n EPA STORM WATER MANAGEMENT MODEL - VERSION 5.2 (Build 5.2.0)" + "\n EPA STORM WATER MANAGEMENT MODEL - VERSION 5.2 (Build 5.2.1)" #define FMT09 \ "\n ------------------------------------------------------------" #define FMT10 "\n" diff --git a/src/solver/xsect.dat b/src/solver/xsect.dat index fa199bb40..10b10ed33 100644 --- a/src/solver/xsect.dat +++ b/src/solver/xsect.dat @@ -3,7 +3,7 @@ // // Project: EPA SWMM5 // Version: 5.2 -// Date: 03/24/21 (Build 5.2.0) +// Date: 06/01/22 (Build 5.2.1) // Author: L. Rossman // // Tables of relative geometric properties for rounded cross-sections. @@ -18,6 +18,10 @@ // area at full depth for shape xxx // N_Z_xxx = number of equal intervals between 0.0 and 1.0 in the // table for parameter Z and shape xxx. +// +// Release 5.2.1: +// - The second and third entries in tables A_Egg, R_Egg, and W_Egg +// were corrected. //----------------------------------------------------------------------------- //============================================================================= @@ -76,13 +80,13 @@ double W_Circ[51] = // W/Wmax v. Y/Yfull int N_A_Egg = 26; double A_Egg[26] = -{.0000,.0150,.0400,.0550,.0850,.1200,.1555,.1900,.2250,.2750, +{.0000,.0116,.0316,.0550,.0850,.1200,.1555,.1900,.2250,.2750, .3200,.3700,.4200,.4700,.5150,.5700,.6200,.6800,.7300,.7800, .8350,.8850,.9250,.9550,.9800,1.000}; int N_R_Egg = 26; double R_Egg[26] = -{.0100,.0970,.2160,.3020,.3860,.4650,.5360,.6110,.6760,.7350, +{.0100,.1300,.2440,.3020,.3860,.4650,.5360,.6110,.6760,.7350, .7910,.8540,.9040,.9410,1.008,1.045,1.076,1.115,1.146,1.162, 1.186,1.193,1.186,1.162,1.107,1.000}; @@ -108,7 +112,7 @@ double S_Egg[51] = int N_W_Egg = 26; double W_Egg[26] = -{.0, .2980, .4330, .5080, .5820, .6420, .6960, .7460, .7910, +{.0, .3250, .4270, .5080, .5820, .6420, .6960, .7460, .7910, .8360, .8660, .8960, .9260, .9560, .9700, .9850, 1.000, .9850, .9700, .9400, .8960, .8360, .7640, .6420, .3100, .0};