diff --git a/doc/input-output-reference/src/overview/group-simulation-parameters.tex b/doc/input-output-reference/src/overview/group-simulation-parameters.tex index 52dc18a3502..8d105a826b1 100644 --- a/doc/input-output-reference/src/overview/group-simulation-parameters.tex +++ b/doc/input-output-reference/src/overview/group-simulation-parameters.tex @@ -839,7 +839,7 @@ \subsection{PerformancePrecisionTradeoffs}\label{performanceprecisiontradeoffs} % table X {\scriptsize -\begin{longtable}[c]{p{0.2in}p{0.4in}p{0.55in}p{0.5in}p{0.52in}p{0.4in}p{0.5in}p{0.5in}p{0.5in}p{0.6in}p{0.5in}} +\begin{longtable}[c]{p{0.15in}p{0.4in}p{0.55in}p{0.5in}p{0.52in}p{0.4in}p{0.5in}p{0.5in}p{0.55in}p{0.5in}p{0.55in}p{0.5in}} % \begin{longtable}[c]{p{0.2in}p{0.4in}p{0.6in}p{0.6in}p{0.5in}p{0.5in}p{0.6in}p{0.6in}p{0.65in}} % \begin{longtable}[c]{cccccccrr} \caption{PerfLog Mode Columns\label{table:perflog_mode_columns}} \tabularnewline @@ -852,39 +852,42 @@ \subsection{PerformancePrecisionTradeoffs}\label{performanceprecisiontradeoffs} Min Warmup& Suppress Resets & System Timestep {[}minute{]} & +PsyTsatFnPb & MaxZone TempDiff & MaxAllowed DelTemp & Runtime {[}second{]} \tabularnewline \midrule \endfirsthead -1 & FALSE & ScriptF & NORMAL & 6 & 1 & FALSE & 1 & 0.30 & 0.002 & 185.12 \tabularnewline -2 & FALSE & ScriptF & MODE01 & 1 & 1 & FALSE & 1 & 0.30 & 0.002 & 75.73 \tabularnewline -3 & FALSE & ScriptF & MODE02 & 1 & 1 & FALSE & 1 & 0.30 & 0.002 & 71.37 \tabularnewline -4 & FALSE & ScriptF & MODE03 & 1 & 1 & FALSE & 1 & 0.30 & 0.002 & 66.17 \tabularnewline -5 & FALSE & ScriptF & MODE04 & 1 & 1 & TRUE & 1 & 0.30 & 0.002 & 61.31 \tabularnewline -6 & FALSE & ScriptF & MODE05 & 1 & 1 & TRUE & 60 & 0.30 & 0.002 & 33.30 \tabularnewline -7 & FALSE & ScriptF & MODE06 & 1 & 1 & TRUE & 60 & 1.00 & 0.002 & 32.20 \tabularnewline -8 & FALSE & ScriptF & MODE07 & 1 & 1 & TRUE & 60 & 1.00 & 0.1 & 26.38 \tabularnewline -9 & TRUE & ScriptF & NORMAL & 6 & 1 & FALSE & 1 & 0.30 & 0.002 & 178.86 \tabularnewline -10 & FALSE & CarrollMRT & NORMAL & 6 & 1 & FALSE & 1 & 0.30 & 0.002 & 185.07 \tabularnewline -11 & FALSE & CarrollMRT & MODE01 & 1 & 1 & FALSE & 1 & 0.30 & 0.002 & 70.30 \tabularnewline -12 & FALSE & CarrollMRT & MODE02 & 1 & 1 & FALSE & 1 & 0.30 & 0.002 & 66.85 \tabularnewline -13 & FALSE & CarrollMRT & MODE03 & 1 & 1 & FALSE & 1 & 0.30 & 0.002 & 65.76 \tabularnewline -14 & FALSE & CarrollMRT & MODE04 & 1 & 1 & TRUE & 1 & 0.30 & 0.002 & 54.46 \tabularnewline -15 & FALSE & CarrollMRT & MODE05 & 1 & 1 & TRUE & 60 & 0.30 & 0.002 & 28.09 \tabularnewline -16 & FALSE & CarrollMRT & MODE06 & 1 & 1 & TRUE & 60 & 1.00 & 0.002 & 27.87 \tabularnewline -17 & FALSE & CarrollMRT & MODE07 & 1 & 1 & TRUE & 60 & 1.00 & 0.1 & 27.39 \tabularnewline +1 & FALSE & ScriptF & NORMAL & 6 & 1 & FALSE & 1 & Normal & 0.30 & 0.002 & 275.56 \tabularnewline +2 & FALSE & ScriptF & MODE01 & 1 & 1 & FALSE & 1 & Normal & 0.30 & 0.002 & 104.37 \tabularnewline +3 & FALSE & ScriptF & MODE02 & 1 & 1 & FALSE & 1 & Normal & 0.30 & 0.002 & 98.81 \tabularnewline +4 & FALSE & ScriptF & MODE03 & 1 & 1 & FALSE & 1 & Normal & 0.30 & 0.002 & 98.63 \tabularnewline +5 & FALSE & ScriptF & MODE04 & 1 & 1 & TRUE & 1 & Normal & 0.30 & 0.002 & 97.87 \tabularnewline +6 & FALSE & ScriptF & MODE05 & 1 & 1 & TRUE & 60 & Normal & 0.30 & 0.002 & 47.22 \tabularnewline +7 & FALSE & ScriptF & MODE06 & 1 & 1 & TRUE & 60 & Interpolate & 0.30 & 0.002 & 45.48 \tabularnewline +8 & FALSE & ScriptF & MODE07 & 1 & 1 & TRUE & 60 & Interpolate & 1.00 & 0.002 & 45.14 \tabularnewline +9 & FALSE & ScriptF & MODE08 & 1 & 1 & TRUE & 60 & Interpolate & 1.00 & 0.1 & 44.18 \tabularnewline +10 & TRUE & ScriptF & NORMAL & 6 & 1 & FALSE & 1 & Normal & 0.30 & 0.002 & 273.42 \tabularnewline +11 & FALSE & CarrollMRT & NORMAL & 6 & 1 & FALSE & 1 & Normal & 0.30 & 0.002 & 276.68 \tabularnewline +12 & FALSE & CarrollMRT & MODE01 & 1 & 1 & FALSE & 1 & Normal & 0.30 & 0.002 & 102.73 \tabularnewline +13 & FALSE & CarrollMRT & MODE02 & 1 & 1 & FALSE & 1 & Normal & 0.30 & 0.002 & 97.28 \tabularnewline +14 & FALSE & CarrollMRT & MODE03 & 1 & 1 & FALSE & 1 & Normal & 0.30 & 0.002 & 96.77 \tabularnewline +15 & FALSE & CarrollMRT & MODE04 & 1 & 1 & TRUE & 1 & Normal & 0.30 & 0.002 & 96.56 \tabularnewline +16 & FALSE & CarrollMRT & MODE05 & 1 & 1 & TRUE & 60 & Normal & 0.30 & 0.002 & 47.31 \tabularnewline +17 & FALSE & CarrollMRT & MODE06 & 1 & 1 & TRUE & 60 & Interpolate & 0.30 & 0.002 & 45.62 \tabularnewline +18 & FALSE & CarrollMRT & MODE07 & 1 & 1 & TRUE & 60 & Interpolate & 1.00 & 0.002 & 45.23 \tabularnewline +19 & FALSE & CarrollMRT & MODE08 & 1 & 1 & TRUE & 60 & Interpolate & 1.00 & 0.1 & 44.09 \tabularnewline \bottomrule \end{longtable} } -This example uses 17 different simulations to arrive at the recommended values for the PerformancePrecisionTradeoffs object, but fewer trials could have been made to reach a similar conclusion. The first run (Run 1, Normal mode) shows the results of no performance precision tradeoffs being applied and is the same as not having the PerformancePrecisionTradeoffs object present. It is a good idea to use this as a first step so that a baseline of the time, errors, and oscillations are available for reference. Runs 2 through 8 are just stepping through the Override Modes (Mode01 to Mode07). Run 9 employs the ``Use Coil Direct Solution'' option, but the time gain for the simulation is not so significant. Therefore it is not used anymore in later runs. Runs 10 through 17 repeat the various override modes, but this time with the CarrollMRT radiant exchange algorithm. The biggest savings of the computation time are from Mode01 (Run 2) application. Compared to the Normal mode (Run 1) baseline, applying Mode01 (Run 2) immediately reduces the simulation time by nearly 60\%, to about only 40.9\% of that for the Normal baseline. Then again, by applying Mode02 (Run 3), the simulation time is reduced by 5.8\% compared to Mode02 (Run 1); Mode03 (Run 4) saves about 7.3\% compared to Mode02 (Run 3); and Mode04 (Run 5) saves about 7.3\% on top of Mode03 (Run 4). Compared to the normal baseline (Run 1), Mode04 (Run 5) only consumes about one third (33.1\%) of the computation time of Run 1 Normal baseline. +This example uses 19 different simulations to arrive at the recommended values for the PerformancePrecisionTradeoffs object, but fewer trials could have been made to reach a similar conclusion. The first run (Run 1, Normal mode) shows the results of no performance precision tradeoffs being applied and is the same as not having the PerformancePrecisionTradeoffs object present. It is a good idea to use this as a first step so that a baseline of the time, errors, and oscillations are available for reference. Runs 2 through 9 are just stepping through the Override Modes (Mode01 to Mode08). Run 10 employs the ``Use Coil Direct Solution'' option, but the time gain for the simulation is not so significant. Therefore it is not used anymore in later runs. Runs 11 through 19 repeat the various override modes, but this time with the CarrollMRT radiant exchange algorithm. The biggest savings of the computation time are from Mode01 (Run 2) application. Compared to the Normal mode (Run 1) baseline, applying Mode01 (Run 2) immediately reduces the simulation time by 62\%, to about only 37.9\% of that for the Normal baseline. Then again, by applying Mode02 (Run 3), the simulation time is reduced by 5.3\% compared to Mode02 (Run 1); Mode03 (Run 4) saves about 0.2\% compared to Mode02 (Run 3); and Mode04 (Run 5) saves about 0.7\% on top of Mode03 (Run 4). Compared to the normal baseline (Run 1), Mode04 (Run 5) only consumes about one third (35.5\%) of the computation time of Run 1 Normal baseline. -Next, when Mode05 (Run 6) is applied, the simulation time is significantly reduced again---Mode05 reduces the simulation time by nearly a half compared to Mode04 (Run 5). The run time for Mode05 (Run 6) is only 54.3\% of that for Mode04 (Run 5); and it is only 18.0\% of the Normal baseline (Run 1). Mode06 (Run 7) cuts the simulation time by about a second, or about 3.3\% compared to Mode 05 (Run 6); the overall simulation time of Mode06 (Run 7) is about 17.4\% of the Normal baseline. The final Mode07 (Run 8) cuts the simulation time by another 18.0\% compared to Mode06 (Run 7); and the overall run time for Mode07 is only 14.25\% (or about one-seventh) of that for the Run 1 Normal baseline. +Next, when Mode05 (Run 6) is applied, the simulation time is significantly reduced again---Mode05 reduces the simulation time by nearly a half compared to Mode04 (Run 5). The run time for Mode05 (Run 6) is only 51.8\% of that for Mode04 (Run 5); and it is only 17.0\% of the Normal baseline (Run 1). The run time for Mode06 (Run 7)was reduced by 3.7\% in comparison with Mode05 (Run6).Mode07 (Run 8) cuts the simulation time by about 0.7\% compared to Mode 06 (Run 7); the overall simulation time of Mode07 (Run 8) is about 16.4\% of the Normal baseline. The final Mode08 (Run 9) cuts the simulation time by another 2.1\% compared to Mode07 (Run 8); and the overall run time for Mode08 is only 16.0\% (or about one-seventh) of that for the Run 1 Normal baseline. -In general, the higher models---Mode05 to Mode07---significantly save the simulation time with both ScriptF and CarrollMRT, taking about one-fifth to one-seventh of the original Normal simulation time. These modes seem to be good choices for faster simulations. However, we still need to look at other results in the \_perflog.csv file first before coming to that conclusion. +In general, the higher models---Mode05 to Mode08---significantly save the simulation time with both ScriptF and CarrollMRT, taking about one-fifth to one-seventh of the original Normal simulation time. These modes seem to be good choices for faster simulations. However, we still need to look at other results in the \_perflog.csv file first before coming to that conclusion. These example simulations each takes about three minutes or less to try. If your building takes much longer than a few minutes, you might want to temporarily change the run period to just a month or even a week to tune the PerformancePrecisionTradeoffs object inputs. If temporarily shortening the run period is necessary, it is best to pick a month or week that has some cooling and some heating. Just remember to set your run period back to a full year before coming to any conclusions about the building or energy efficiency options being considered for the building. @@ -905,29 +908,31 @@ \subsection{PerformancePrecisionTradeoffs}\label{performanceprecisiontradeoffs} \midrule \endfirsthead -1 & FALSE & ScriptF & NORMAL & 3,103,447 & 755,635 & 213,488 & 185.12 \tabularnewline -2 & FALSE & ScriptF & MODE01 & 3,095,147 & 741,358 & 212,016 & 75.73 \tabularnewline -3 & FALSE & ScriptF & MODE02 & 3,097,345 & 744,583 & 212,730 & 71.37 \tabularnewline -4 & FALSE & ScriptF & MODE03 & 3,097,345 & 744,583 & 212,730 & 66.17 \tabularnewline -5 & FALSE & ScriptF & MODE04 & 3,097,345 & 744,583 & 212,730 & 61.31 \tabularnewline -6 & FALSE & ScriptF & MODE05 & 3,096,331 & 766,580 & 211,613 & 33.30 \tabularnewline -7 & FALSE & ScriptF & MODE06 & 3,096,331 & 766,580 & 211,613 & 32.20 \tabularnewline -8 & FALSE & ScriptF & MODE07 & 3,097,280 & 751,021 & 212,386 & 26.38 \tabularnewline -9 & TRUE & ScriptF & NORMAL & 3,103,447 & 755,635 & 213,488 & 178.86 \tabularnewline -10 & FALSE & CarrollMRT & NORMAL & 3,256,682& 497,760 & 267,097 & 185.07 \tabularnewline -11 & FALSE & CarrollMRT & MODE01 & 3,246,880& 488,583 & 265,309 & 70.30 \tabularnewline -12 & FALSE & CarrollMRT & MODE02 & 3,244,172& 491,383 & 265,347 & 66.85 \tabularnewline -13 & FALSE & CarrollMRT & MODE03 & 3,244,172& 491,383 & 265,347 & 65.76 \tabularnewline -14 & FALSE & CarrollMRT & MODE04 & 3,244,172& 491,383 & 265,347 & 56.46 \tabularnewline -15 & FALSE & CarrollMRT & MODE05 & 3,250,818& 505,725 & 265,180 & 28.09 \tabularnewline -16 & FALSE & CarrollMRT & MODE06 & 3,250,818& 505,725 & 265,180 & 27.87 \tabularnewline -17 & FALSE & CarrollMRT & MODE07 & 3,250,420& 493,351 & 265,828 & 27.39 \tabularnewline +1 & FALSE & ScriptF & NORMAL & 3,351,884 & 1,524,574 & 248,815 & 275.56 \tabularnewline +2 & FALSE & ScriptF & MODE01 & 3,340,493 & 1,508,410 & 247,179 & 104.37 \tabularnewline +3 & FALSE & ScriptF & MODE02 & 3,342,128 & 1,511,817 & 247,759 & 98.81 \tabularnewline +4 & FALSE & ScriptF & MODE03 & 3,342,128 & 1,511,817 & 247,759 & 98.63 \tabularnewline +5 & FALSE & ScriptF & MODE04 & 3,342,128 & 1,511,817 & 247,759 & 97.87 \tabularnewline +6 & FALSE & ScriptF & MODE05 & 3,341,145 & 1,532,697 & 246,121 & 47.22 \tabularnewline +7 & FALSE & ScriptF & MODE06 & 3,341,183 & 1,532,626 & 246,122 & 45.48 \tabularnewline +8 & FALSE & ScriptF & MODE07 & 3,341,183 & 1,532,626 & 246,122 & 45.14 \tabularnewline +9 & FALSE & ScriptF & MODE08 & 3,342,365 & 1,516,963 & 246,906 & 44.18 \tabularnewline +10 & TRUE & ScriptF & NORMAL & 3,351,884 & 1,524,574 & 248,816 & 273.42 \tabularnewline +11 & FALSE & CarrollMRT & NORMAL & 3,525,611 & 1,271,563 & 304,914 & 276.68 \tabularnewline +12 & FALSE & CarrollMRT & MODE01 & 3,511,800 & 1,260,228 & 303,189 & 102.73 \tabularnewline +13 & FALSE & CarrollMRT & MODE02 & 3,510,893 & 1,263,149 & 303,383 & 97.28 \tabularnewline +14 & FALSE & CarrollMRT & MODE03 & 3,510,893 & 1,263,149 & 303,383 & 96.77 \tabularnewline +15 & FALSE & CarrollMRT & MODE04 & 3,510,893 & 1,263,149 & 303,383 & 96.56 \tabularnewline +16 & FALSE & CarrollMRT & MODE05 & 3,513,714 & 1,277,252 & 302,242 & 47.31 \tabularnewline +17 & FALSE & CarrollMRT & MODE06 & 3,513,750 & 1,277,187 & 302,246 & 45.62 \tabularnewline +18 & FALSE & CarrollMRT & MODE07 & 3,513,750 & 1,277,187 & 302,246 & 45.23 \tabularnewline +19 & FALSE & CarrollMRT & MODE08 & 3,513,797 & 1,264,779 & 303,035 & 44.09 \tabularnewline \bottomrule \end{longtable} } -The CarrollMRT options seem to have a much more significant impact on the natural gas usage; and the total water and the times are similar to the runtimes using ScriptF. So for this example, CarrollMRT does not seem to be a right choice. In these cases, the computation times are not very different from the ScriptF instances; however, the energy usage is further away from the Normal baseline. The electricity usage differences for Runs 2 through 8 are small compared to Run 1 (the Normal baseline case), and are less than 0.27\% different. The natural gas usage has more significant differences of 1.4\% to 1.9\%, and the water usage differs from 0.36\% to 0.88\%. From an energy perspective, these impacts for the ScriptF Runs 2 through 8 are probably tolerable. +The CarrollMRT options seem to have a much more significant impact on the natural gas usage; and the total water and the times are similar to the runtimes using ScriptF. So for this example, CarrollMRT does not seem to be a right choice. In these cases, the computation times are not very different from the ScriptF instances; however, the energy usage is further away from the Normal baseline. The electricity usage differences for Runs 2 through 8 are small compared to Run 1 (the Normal baseline case), and are less than 0.34\% different. The natural gas usage has more significant differences of 0.5\% to 1.1\%, and the water usage differs from 0.4\% to 1.1\%. From an energy perspective, these impacts for the ScriptF Runs 2 through 8 are probably tolerable. % table X {\scriptsize @@ -947,31 +952,33 @@ \subsection{PerformancePrecisionTradeoffs}\label{performanceprecisiontradeoffs} \midrule \endfirsthead -1 & FALSE & ScriptF & NORMAL & 2.92 & 2.75 & 0.17 & 46 & 185.12 \tabularnewline -2 & FALSE & ScriptF & MODE01 & 7.5 & 2.17 & 6.17 & 47 & 75.73 \tabularnewline -3 & FALSE & ScriptF & MODE02 & 9.25 & 4 & 8.25 & 48 & 71.37 \tabularnewline -4 & FALSE & ScriptF & MODE03 & 9.25 & 4 & 8.25 & 49 & 66.17 \tabularnewline -5 & FALSE & ScriptF & MODE04 & 9.25 & 4 & 8.25 & 50 & 61.31 \tabularnewline -6 & FALSE & ScriptF & MODE05 & 158 & 87 & 122 & 52 & 33.30 \tabularnewline -7 & FALSE & ScriptF & MODE06 & 158 & 87 & 122 & 53 & 32.20 \tabularnewline -8 & FALSE & ScriptF & MODE07 & 155 & 91 & 122 & 54 & 26.38 \tabularnewline -9 & TRUE & ScriptF & NORMAL & 2.92 & 2.75 & 0.17 & 47 & 178.86 \tabularnewline -10 & FALSE & CarrollMRT & NORMAL & 2.14 & 1.97 & 0.17 & 47 & 185.07 \tabularnewline -11 & FALSE & CarrollMRT & MODE01 & 7.74 & 0.95 & 6.08 & 48 & 70.30 \tabularnewline -12 & FALSE & CarrollMRT & MODE02 & 9.99 & 3.33 & 7.53 & 49 & 66.85 \tabularnewline -13 & FALSE & CarrollMRT & MODE03 & 9.99 & 3.33 & 7.53 & 50 & 65.76 \tabularnewline -14 & FALSE & CarrollMRT & MODE04 & 9.99 & 3.33 & 7.53 & 51 & 56.46 \tabularnewline -15 & FALSE & CarrollMRT & MODE05 & 150 & 74 & 108 & 52 & 28.09 \tabularnewline -16 & FALSE & CarrollMRT & MODE06 & 150 & 74 & 108 & 53 & 27.87 \tabularnewline -17 & FALSE & CarrollMRT & MODE07 & 151 & 76 & 113 & 54 & 27.39 \tabularnewline +1 & FALSE & ScriptF & NORMAL & 2.6 & 2.25 & 0.18 & 64 & 275.56 \tabularnewline +2 & FALSE & ScriptF & MODE01 & 7.87 & 2.67 & 6.87 & 65 & 104.37 \tabularnewline +3 & FALSE & ScriptF & MODE02 & 8.7 & 3.5 & 7.7 & 66 & 98.81 \tabularnewline +4 & FALSE & ScriptF & MODE03 & 8.7 & 3.5 & 7.7 & 67 & 98.63 \tabularnewline +5 & FALSE & ScriptF & MODE04 & 8.7 & 3.5 & 7.7 & 68 & 97.87 \tabularnewline +6 & FALSE & ScriptF & MODE05 & 169 & 94 & 119 & 70 & 47.22 \tabularnewline +7 & FALSE & ScriptF & MODE06 & 169 & 94 & 119 & 71 & 45.48 \tabularnewline +8 & FALSE & ScriptF & MODE07 & 169 & 94 & 119 & 72 & 45.14 \tabularnewline +9 & FALSE & ScriptF & MODE08 & 161 & 94 & 115 & 2379 & 44.18 \tabularnewline +10 & TRUE & ScriptF & NORMAL & 2.6 & 2.25 & 0.18 & 65 & 273.42 \tabularnewline +11 & FALSE & CarrollMRT & NORMAL & 2.18 & 1.83 & 0.18 & 65 & 276.68 \tabularnewline +12 & FALSE & CarrollMRT & MODE01 & 8.57 & 1.7 & 7.57 & 66 & 102.73 \tabularnewline +13 & FALSE & CarrollMRT & MODE02 & 8.83 & 2.5 & 7.7 & 67 & 97.28 \tabularnewline +14 & FALSE & CarrollMRT & MODE03 & 8.83 & 2.5 & 7.7 & 68 & 96.77 \tabularnewline +15 & FALSE & CarrollMRT & MODE04 & 8.83 & 2.5 & 7.7 & 69 & 96.56 \tabularnewline +16 & FALSE & CarrollMRT & MODE05 & 177 & 105 & 112 & 70 & 47.31 \tabularnewline +17 & FALSE & CarrollMRT & MODE06 & 177 & 105 & 112 & 71 & 45.62 \tabularnewline +18 & FALSE & CarrollMRT & MODE07 & 177 & 105 & 112 & 72 & 45.23 \tabularnewline +19 & FALSE & CarrollMRT & MODE08 & 173 & 100 & 112 & 73 & 44.09 \tabularnewline \bottomrule \end{longtable} } -The number of hours any zone is oscillating for Run 1 (the Normal baseline case) using Script F is only 2.92 hours, with almost none of the hours in the dead band and nearly all during occupancy. This changes when considering the other ScriptF cases using Mode01 to Mode07 (Run 2 to Run 8). For Mode01 (Run 2), the oscillating hours increase but are still less than 8 hours per year. While more than doubling, it is still considered a small change on an absolute basis. The change is even more minor when considering the oscillating hours during occupancy, which for Mode01 (Run 2) the hours even decrease by a small amount. The oscillation hours in the dead band for Mode01 (Run 2) increase about 6 hours. For Mode02 to Mode04, there is an increase of about 2 hours for each oscillating hour categories (the total, the occupancy, and the dead band ones), though they are considered to be a relatively minor change from the Normal baselines especially when comparing further with those for the succeeding Mode05 and Mode07. For Mode05 to Mode07 (Runs 6 to 8), the oscillating hours increase significantly, by more than one order of magnitude to about 155--158 hours per year. The numbers are also reflected in similar fashions for the the oscillating hours during occupancy and for the oscillating hours during dead band. For the CarrollMRT cases, similar trends can be observed when applying Mode01 to Mode07. The most significant change starts from Mode05, which for both ScriptF and CarrollMRT raise the oscillating hours to about 155--158. This is a substantial change that does indicate a significant shift in the way the simulation program is behaving. On the other hand, the number of warnings for all the seventeen cases are not too much different from each other, all ranging from 46 to 54, showing a slow increasing trend from Normal to Mode07. No severe errors are reported for any of these simulations, so no column is shown for them. After investigating the changes, it is reasonable to conclude that the change in the count of warning messages is not considered important. +The number of hours any zone is oscillating for Run 1 (the Normal baseline case) using Script F is only 2.6 hours, with almost none of the hours in the dead band and nearly all during occupancy. This changes when considering the other ScriptF cases using Mode01 to Mode08 (Run 2 to Run 9). For Mode01 (Run 2), the oscillating hours increase but are still less than 8 hours per year. While more than doubling, it is still considered a small change on an absolute basis. The change is even more minor when considering the oscillating hours during occupancy. The oscillation hours in the dead band for Mode01 (Run 2) increase about 6 hours. For Mode02 to Mode04, there is an increase of about 1 hours for each oscillating hour categories (the total, the occupancy, and the dead band ones), though they are considered to be a relatively minor change from the Normal baselines especially when comparing further with those for the succeeding Mode05 and Mode08. For Mode05 to Mode08 (Runs 6 to 9), the oscillating hours increase significantly, by more than one order of magnitude to about 161--169 hours per year. The numbers are also reflected in similar fashions for the the oscillating hours during occupancy and for the oscillating hours during dead band. For the CarrollMRT cases, similar trends can be observed when applying Mode01 to Mode08. The most significant change starts from Mode05, which for both ScriptF and CarrollMRT raise the oscillating hours to about 173--177. This is a substantial change that does indicate a significant shift in the way the simulation program is behaving. On the other hand, the number of warnings for all the 19 cases are not too much different from each other ranging from 64 to 73, except for Run 9 which has 2,379 warnings. No severe errors are reported for any of these simulations, so no column is shown for them. -The decision on which mode to use is up to the individual modelers. These simulations runs can be clearly classified into three tiers based on the simulation speed (computation time) and the numerical stability (oscillation hours): the first tier is the normal run, which incurs the least oscillations (the best), but also takes the longest computation time; the second tier includes Mode02 to Mode04, where the simulation time can be cut to roughly one-third of that for the Normal baseline, but with a minor penalty for increased oscillation hours; and the third tier includes Mode05 to Mode07, which can achieve an superior simulation time advantage, reaching around one-fifth to one-seventh of that for the Normal baseline, but also with significant oscillation hours penalties of about one order of magnitude higher. For simulations conducted in these test modes, Runs 5 (Mode04) is recommended as a balanced option for speed and numerical stability (oscillations). It does not use direct coil solution, uses ScriptF, and Mode04. This simulation time also shows an advantages over the other lower modes cases--it saves time compared to Mode01--Mode03---and still has tamed the oscillating hours. Further, it does not add too much additional overrides compared to the higher modes (Mode05--Mode07), which should be avoided if not adding value. For extreme speed benefit, higher modes such as Mode05 to Mode07 definitely show an advantage in the computation time, as they cost only about only one-seventh to one-fifth of the normal base, and only about half of those for the lower modes (such as Mode02--Mode04). However, substantially higher oscillating hours will be incurred as a downside with these higher modes. +The decision on which mode to use is up to the individual modelers. These simulations runs can be clearly classified into three tiers based on the simulation speed (computation time) and the numerical stability (oscillation hours): the first tier is the normal run, which incurs the least oscillations (the best), but also takes the longest computation time; the second tier includes Mode02 to Mode04, where the simulation time can be cut to roughly one-third of that for the Normal baseline, but with a minor penalty for increased oscillation hours; and the third tier includes Mode05 to Mode08, which can achieve an superior simulation time advantage, reaching around one-fifth to one-seventh of that for the Normal baseline, but also with significant oscillation hours penalties of about one order of magnitude higher. For simulations conducted in these test modes, Runs 5 (Mode04) is recommended as a balanced option for speed and numerical stability (oscillations). It does not use direct coil solution, uses ScriptF, and Mode04. This simulation time also shows an advantages over the other lower modes cases--it saves time compared to Mode01--Mode03---and still has tamed the oscillating hours. Further, it does not add too much additional overrides compared to the higher modes (Mode05--Mode08), which should be avoided if not adding value. For extreme speed benefit, higher modes such as Mode05 to Mode08 definitely show an advantage in the computation time, as they cost only about only one-seventh to one-fifth of the normal base, and only about half of those for the lower modes (such as Mode02--Mode04). However, substantially higher oscillating hours will be incurred as a downside with these higher modes. Additional guidance on how to make EnergyPlus faster appears in the ``Tips And Tricks for Using EnergyPlus'' document that is distributed with EnergyPlus within the section titled ``Platforms and Run-Time.'' @@ -1098,14 +1105,15 @@ \subsection{PerformancePrecisionTradeoffs}\label{performanceprecisiontradeoffs} Mode03 & Mode02 plus Minimum Number of Warmup Days will be set to 1\tabularnewline Mode04 & Mode03 plus Begin Environment Reset Mode will be set to SuppressAllBeginEnvironmentResets\tabularnewline Mode05 & Mode04 plus minimum system timestep length will be 1 hour\tabularnewline -Mode06 & Mode05 MaxZoneTempDiff will be set to 1.00\tabularnewline -Mode07 & Mode06 MaxAllowedDelTemp will be set to 0.1\tabularnewline +Mode06 & Mode05 plus use cubic spline interpolations in replacement of the psychrometric function PsyTsatFnPb\tabularnewline +Mode07 & Mode06 plus MaxZoneTempDiff will be set to 1.00\tabularnewline +Mode08 & Mode07 plus MaxAllowedDelTemp will be set to 0.1\tabularnewline Advanced& Allow direct input of convergence field values\tabularnewline \bottomrule \end{longtable} -The increasing mode number roughly corresponds with increased speed. Mode01 to Mode05 are overriding inputs in other parts of the IDF/epJSON file and is equivalent to changing those input directly. Mode06 and Mode07 are changing convergence parameters previously not available to be modified by the user. +The increasing mode number roughly corresponds with increased speed. Mode01 to Mode05 are overriding inputs in other parts of the IDF/epJSON file and is equivalent to changing those input directly. Mode06 offers an alternative method to calculate saturated temperature given pressure in replacement of the psychrometric function PsyTsatFnPb. Mode07 and Mode08 are changing convergence parameters previously not available to be modified by the user. \paragraph{Field: MaxZoneTempDiff}\label{max-zone-temp-diff} diff --git a/idd/Energy+.idd.in b/idd/Energy+.idd.in index 449a895a311..518fafecb9e 100644 --- a/idd/Energy+.idd.in +++ b/idd/Energy+.idd.in @@ -483,6 +483,7 @@ PerformancePrecisionTradeoffs, \key Mode05 \key Mode06 \key Mode07 + \key Mode08 \key Advanced \default Normal N1, \field MaxZoneTempDiff diff --git a/src/EnergyPlus/PsychCacheData.hh b/src/EnergyPlus/PsychCacheData.hh index d53ca62569e..dc08532670b 100644 --- a/src/EnergyPlus/PsychCacheData.hh +++ b/src/EnergyPlus/PsychCacheData.hh @@ -100,7 +100,7 @@ constexpr Int64 psatcache_mask = psatcache_size - 1; #endif #ifdef EP_cache_PsyTsatFnPb constexpr int tsatcache_size = 1024 * 1024; -constexpr int tsatprecision_bits = 24; +constexpr int tsatprecision_bits = 24; // 20 constexpr Int64 tsatcache_mask = tsatcache_size - 1; #endif #ifdef EP_cache_PsyTsatFnHPb @@ -191,4 +191,4 @@ struct PsychrometricCacheData : BaseGlobalStruct } // namespace EnergyPlus -#endif // PsychCacheData_hh_INCLUDED \ No newline at end of file +#endif // PsychCacheData_hh_INCLUDED diff --git a/src/EnergyPlus/Psychrometrics.cc b/src/EnergyPlus/Psychrometrics.cc index a7ca9c11135..4b98e0431f2 100644 --- a/src/EnergyPlus/Psychrometrics.cc +++ b/src/EnergyPlus/Psychrometrics.cc @@ -1345,58 +1345,63 @@ namespace Psychrometrics { return state.dataPsychrometrics->tSat_Save; } state.dataPsychrometrics->Press_Save = Press; + if (state.dataPsychrometrics->useInterpolationPsychTsatFnPb) { + int n_sample = 1651; // sample bin size = 64 Pa; continous sample size = 1651 + // CSpline interpolation + tSat = CSplineint(n_sample, Press); // Cubic spline interpolation + iter = 0; + } else { + // Uses an iterative process to determine the saturation temperature at a given + // pressure by correlating saturated water vapor as a function of temperature. - // Uses an iterative process to determine the saturation temperature at a given - // pressure by correlating saturated water vapor as a function of temperature. + // Initial guess of boiling temperature + tSat = 100.0; + iter = 0; - // Initial guess of boiling temperature - tSat = 100.0; - iter = 0; + // If above 1555000,set value of Temp corresponding to Saturation Pressure of 1555000 Pascal. + if (Press >= 1555000.0) { + tSat = 200.0; + // If below 0.0017,set value of Temp corresponding to Saturation Pressure of 0.0017 Pascal. + } else if (Press <= 0.0017) { + tSat = -100.0; - // If above 1555000,set value of Temp corresponding to Saturation Pressure of 1555000 Pascal. - if (Press >= 1555000.0) { - tSat = 200.0; - // If below 0.0017,set value of Temp corresponding to Saturation Pressure of 0.0017 Pascal. - } else if (Press <= 0.0017) { - tSat = -100.0; + // Setting Value of PsyTsatFnPb= 0C, due to non-continuous function for Saturation Pressure at 0C. + } else if ((Press > 611.000) && (Press < 611.25)) { + tSat = 0.0; - // Setting Value of PsyTsatFnPb= 0C, due to non-continuous function for Saturation Pressure at 0C. - } else if ((Press > 611.000) && (Press < 611.25)) { - tSat = 0.0; + } else { + // Iterate to find the saturation temperature + // of water given the total pressure + + // Set iteration loop parameters + // make sure these are initialized + Real64 pSat; // Pressure corresponding to temp. guess + Real64 error; // Deviation of dependent variable in iteration + Real64 X1; // Previous value of independent variable in ITERATE + Real64 Y1; // Previous value of dependent variable in ITERATE + Real64 ResultX; // ResultX is the final Iteration result passed back to the calling routine + bool const CalledFrom_empty(CalledFrom.empty()); + int icvg; // Iteration convergence flag + for (iter = 1; iter <= itmax; ++iter) { + + // Calculate saturation pressure for estimated boiling temperature + pSat = PsyPsatFnTemp( + state, tSat, (CalledFrom_empty ? PsyRoutineNames[static_cast(PsychrometricFunction::TsatFnPb)] : CalledFrom)); + + // Compare with specified pressure and update estimate of temperature + error = Press - pSat; + Iterate(ResultX, convTol, tSat, error, X1, Y1, iter, icvg); + tSat = ResultX; + // If converged leave loop iteration + if (icvg == 1) break; + + // Water temperature not converged, repeat calculations with new + // estimate of water temperature + } - } else { - // Iterate to find the saturation temperature - // of water given the total pressure - - // Set iteration loop parameters - // make sure these are initialized - Real64 pSat; // Pressure corresponding to temp. guess - Real64 error; // Deviation of dependent variable in iteration - Real64 X1; // Previous value of independent variable in ITERATE - Real64 Y1; // Previous value of dependent variable in ITERATE - Real64 ResultX; // ResultX is the final Iteration result passed back to the calling routine - bool const CalledFrom_empty(CalledFrom.empty()); - int icvg; // Iteration convergence flag - for (iter = 1; iter <= itmax; ++iter) { - - // Calculate saturation pressure for estimated boiling temperature - pSat = - PsyPsatFnTemp(state, tSat, (CalledFrom_empty ? PsyRoutineNames[static_cast(PsychrometricFunction::TsatFnPb)] : CalledFrom)); - - // Compare with specified pressure and update estimate of temperature - error = Press - pSat; - Iterate(ResultX, convTol, tSat, error, X1, Y1, iter, icvg); - tSat = ResultX; - // If converged leave loop iteration - if (icvg == 1) break; - - // Water temperature not converged, repeat calculations with new - // estimate of water temperature + // Saturation temperature has not converged after maximum specified + // iterations. Print error message, set return error flag, and RETURN } - - // Saturation temperature has not converged after maximum specified - // iterations. Print error message, set return error flag, and RETURN - } // End If for the Pressure Range Checking #ifdef EP_psych_stats @@ -1439,6 +1444,26 @@ namespace Psychrometrics { return Temp; } + Real64 CSplineint(int const n, // sample data size + const Real64 &x) // given value of x + { // Cubic Spline interpolation + // Reference: Numerical Recipies in C (pp.97) + Real64 A, B, y; + // find location of x in arrays without searching since array bins are equally sized + int x_int = static_cast(x); + //********continous sample start + int j = (x_int >> 6) - 1; // sample bin 64, sample size=1651 + if (j < 0) j = 0; + if (j > (n - 2)) j = n - 2; + static constexpr Real64 h(64); // sample bin 64, sample size=1651 + //********continous sample end + int tsat_fn_pb_x_j1 = 64 * (j + 1); // sample data for pressure + A = (tsat_fn_pb_x_j1 - x) / h; + B = 1 - A; + y = A * tsat_fn_pb_y[j] + B * tsat_fn_pb_y[j + 1] + + ((A * A * A - A) * (tsat_fn_pb_d2y[j]) + (B * B * B - B) * (tsat_fn_pb_d2y[j + 1])) * (h * h) * 0.1666666667; + return y; + } } // namespace Psychrometrics diff --git a/src/EnergyPlus/Psychrometrics.hh b/src/EnergyPlus/Psychrometrics.hh index a12ddc47a4d..defb292b0d2 100644 --- a/src/EnergyPlus/Psychrometrics.hh +++ b/src/EnergyPlus/Psychrometrics.hh @@ -129,7 +129,341 @@ namespace Psychrometrics { // 14 - HR | 15 - max iter | 16 - HR | 17 - max iter | 18 - // PsyTwbFnTdbWPb_raw (raw calc) | 19 - PsyPsatFnTemp_raw // (raw calc) - + // sample bin size =64 Pa; sample size =1651 (continous) + constexpr std::array tsat_fn_pb_y = { + -100, -24.88812836, -17.74197121, -13.36696483, -10.17031904, -7.635747635, -5.528025298, -3.719474549, -2.132789207, -0.717496548, + 0.635182846, 1.961212857, 3.184455749, 4.320585222, 5.381890646, 6.378191532, 7.317464071, 8.206277019, 9.050107781, 9.853572827, + 10.62060139, 11.35456508, 12.05838073, 12.73458802, 13.38541367, 14.01282043, 14.61854774, 15.2041452, 15.77099766, 16.32035156, + 16.85332662, 17.37094188, 17.87411665, 18.36369351, 18.84043883, 19.30505535, 19.75818947, 20.200435, 20.63234161, 21.05441545, + 21.46712703, 21.87091368, 22.26617973, 22.65330582, 23.03264392, 23.40452474, 23.76925695, 24.12713074, 24.4784194, 24.82337925, + 25.16224961, 25.49525941, 25.82262353, 26.14454343, 26.46121131, 26.77280989, 27.07951029, 27.38147718, 27.67886392, 27.97181871, + 28.26048327, 28.54498875, 28.82546493, 29.10203155, 29.37480614, 29.64389783, 29.90941288, 30.17145332, 30.43011544, 30.68549275, + 30.93767354, 31.1867437, 31.43278471, 31.67587535, 31.91609169, 32.15350578, 32.38818672, 32.62020399, 32.84962034, 33.07649705, + 33.30089772, 33.52287753, 33.7424911, 33.95979768, 34.17484337, 34.38768181, 34.59836177, 34.8069286, 35.01342775, 35.21790433, + 35.42039942, 35.62095455, 35.81961149, 36.0164063, 36.21137695, 36.40456083, 36.59599334, 36.78570706, 36.97373442, 37.16011096, + 37.34486543, 37.5280276, 37.70962755, 37.88969498, 38.06825698, 38.24534078, 38.4209727, 38.59517724, 38.7679823, 38.93940873, + 39.10948012, 39.2782229, 39.44565725, 39.6118041, 39.77668652, 39.94032485, 40.10273846, 40.26394796, 40.42397281, 40.58283123, + 40.74054192, 40.89712156, 41.0525873, 41.20696011, 41.3602526, 41.5124819, 41.66366455, 41.81381521, 41.96295168, 42.11108573, + 42.25823182, 42.40440716, 42.54962287, 42.69389419, 42.8372333, 42.97965197, 43.12116511, 43.2617866, 43.40152372, 43.5403934, + 43.67840528, 43.81556931, 43.95189963, 44.0874032, 44.22209605, 44.35598543, 44.48908135, 44.62139435, 44.75293555, 44.88371503, + 45.01374001, 45.14302132, 45.27156964, 45.39939168, 45.52649676, 45.65289264, 45.77859083, 45.90359809, 46.02792097, 46.15157051, + 46.27455279, 46.39687482, 46.51854662, 46.63957407, 46.75996667, 46.87972868, 46.99886779, 47.11739332, 47.23530984, 47.35262368, + 47.46934408, 47.58547585, 47.7010257, 47.81600131, 47.93040599, 48.0442474, 48.15753313, 48.27026594, 48.38245292, 48.49410119, + 48.60521578, 48.71580123, 48.82586296, 48.93540734, 49.04443945, 49.15296424, 49.26098645, 49.36851262, 49.47554597, 49.58209088, + 49.68815438, 49.7937401, 49.89885468, 50.00349843, 50.10767869, 50.21139915, 50.31466562, 50.41748127, 50.51984969, 50.6217774, + 50.72326533, 50.8243191, 50.92494506, 51.02514303, 51.12491978, 51.22427873, 51.32322162, 51.42175505, 51.51988223, 51.61760565, + 51.71492849, 51.81185626, 51.90838995, 52.00453601, 52.10029659, 52.19567395, 52.29067211, 52.38529434, 52.47954517, 52.57342522, + 52.66694094, 52.76009179, 52.85288285, 52.94531781, 53.03739768, 53.12912747, 53.22050752, 53.31154238, 53.40223643, 53.49258938, + 53.58260762, 53.67228883, 53.76164079, 53.85066348, 53.93935919, 54.02773136, 54.11578345, 54.20351687, 54.29093451, 54.37803778, + 54.46483065, 54.55131516, 54.63749308, 54.7233676, 54.80894018, 54.89421491, 54.97919066, 55.0638724, 55.14826341, 55.23236115, + 55.31617223, 55.39969882, 55.48294042, 55.56589968, 55.64857895, 55.7309827, 55.8131092, 55.89496315, 55.97654474, 56.05785774, + 56.1389022, 56.21968099, 56.30019707, 56.38045024, 56.46044318, 56.54017846, 56.61965822, 56.69888215, 56.77785343, 56.85657191, + 56.93504425, 57.01326641, 57.09124313, 57.16897715, 57.24646717, 57.32371609, 57.40072768, 57.4774991, 57.55403662, 57.63033718, + 57.70640793, 57.7822446, 57.85785243, 57.93323193, 58.00838488, 58.08331234, 58.15801692, 58.23249741, 58.30675724, 58.38079823, + 58.4546222, 58.52822764, 58.60161837, 58.67479622, 58.74775927, 58.82051339, 58.89305587, 58.96539129, 59.03751832, 59.1094403, + 59.18115654, 59.25267006, 59.32398161, 59.39509291, 59.46600373, 59.53671502, 59.60723006, 59.67755023, 59.74767505, 59.81760513, + 59.88734393, 59.95688928, 60.02624654, 60.09541405, 60.16439371, 60.2331876, 60.30179567, 60.37021755, 60.43845741, 60.50651412, + 60.57438886, 60.64208387, 60.70960018, 60.77693773, 60.84409885, 60.91108356, 60.97789194, 61.04452769, 61.11098811, 61.1772789, + 61.2433966, 61.30934573, 61.37512456, 61.44073521, 61.50617791, 61.57145516, 61.6365656, 61.70151178, 61.76629472, 61.83091455, + 61.89537314, 61.95967045, 62.02380873, 62.08778598, 62.15160576, 62.21526616, 62.2787729, 62.34212215, 62.40531644, 62.46835564, + 62.53124254, 62.59397652, 62.65655972, 62.7189898, 62.78127202, 62.84340443, 62.90538831, 62.96722333, 63.02891098, 63.09045474, + 63.15185221, 63.21310404, 63.27421125, 63.33517636, 63.395999, 63.45668024, 63.5172196, 63.57761821, 63.63787789, 63.69799922, + 63.75798178, 63.81782639, 63.87753525, 63.93710759, 63.99654311, 64.05584549, 64.11501608, 64.1740502, 64.23294864, 64.29172001, + 64.35035847, 64.40886389, 64.4672399, 64.5254877, 64.5836074, 64.64159658, 64.69945949, 64.75719386, 64.81480044, 64.87228539, + 64.92964246, 64.98687573, 65.04398502, 65.10096852, 65.15782959, 65.21457202, 65.27118885, 65.32768769, 65.38406204, 65.44031895, + 65.49645605, 65.55247365, 65.60837577, 65.66415606, 65.7198208, 65.7753675, 65.8307992, 65.88611471, 65.94131694, 65.99640529, + 66.05137563, 66.10623566, 66.16098047, 66.21561318, 66.27013565, 66.32454189, 66.37884177, 66.43303089, 66.48710748, 66.54107712, + 66.59493603, 66.64868734, 66.70232946, 66.75586325, 66.80929006, 66.86261073, 66.91582873, 66.96893645, 67.02193922, 67.07484084, + 67.12763318, 67.18032374, 67.23291261, 67.2853971, 67.33777697, 67.39005562, 67.44223342, 67.49431315, 67.54628565, 67.59816124, + 67.64993655, 67.70161425, 67.75319106, 67.80466762, 67.85604816, 67.90732765, 67.95851385, 68.00959903, 68.06059149, 68.11148356, + 68.16228279, 68.21298473, 68.26359087, 68.31410431, 68.36452488, 68.41484999, 68.46508104, 68.51521777, 68.56526159, 68.6152136, + 68.6650752, 68.71484646, 68.76452459, 68.81410894, 68.86360503, 68.9130119, 68.96232932, 69.01155648, 69.06069295, 69.10974389, + 69.15870478, 69.20757526, 69.25636202, 69.30505708, 69.35366941, 69.40219039, 69.45062774, 69.49898231, 69.54724573, 69.59542511, + 69.64352333, 69.69153266, 69.73946144, 69.78730174, 69.83506042, 69.8827346, 69.93032771, 69.97783945, 70.02526447, 70.07260834, + 70.11987362, 70.16705659, 70.21415392, 70.26117672, 70.3081124, 70.35497219, 70.40175094, 70.44845033, 70.49506926, 70.5416108, + 70.58807245, 70.63445733, 70.68076429, 70.72698884, 70.77314, 70.81921262, 70.86521029, 70.91112621, 70.956971, 71.0027362, + 71.04842458, 71.09404158, 71.13958183, 71.18504519, 71.23043212, 71.27574987, 71.3209896, 71.36615442, 71.41124924, 71.45626937, + 71.50121362, 71.5460872, 71.59088911, 71.63561453, 71.68027218, 71.72485702, 71.76936872, 71.8138079, 71.85817753, 71.90247673, + 71.94670456, 71.99086376, 72.03495158, 72.07896913, 72.12291519, 72.16679298, 72.21060503, 72.25434249, 72.29801465, 72.34161996, + 72.38515599, 72.42862145, 72.47201901, 72.51535392, 72.5586171, 72.60181527, 72.64494367, 72.68800759, 72.73100471, 72.77393894, + 72.81680315, 72.85960377, 72.90233649, 72.94500537, 72.98760805, 73.03014695, 73.07262276, 73.11503298, 73.1573782, 73.19966128, + 73.24187731, 73.28403304, 73.32612125, 73.36815237, 73.41011791, 73.45201898, 73.49385988, 73.53563549, 73.57735287, 73.61900651, + 73.6605957, 73.70212525, 73.74359587, 73.78500201, 73.82635101, 73.86763719, 73.90886374, 73.95002747, 73.99113361, 74.03217995, + 74.07316582, 74.11409233, 74.15495789, 74.19576541, 74.23651553, 74.27720372, 74.31783561, 74.35840878, 74.39892536, 74.43938115, + 74.47978004, 74.52011928, 74.56040515, 74.60062901, 74.64080092, 74.68091054, 74.72096571, 74.76096771, 74.80090708, 74.84079646, + 74.88062483, 74.9204009, 74.96011942, 74.99977909, 75.03939008, 75.07893992, 75.11843698, 75.15788211, 75.19726977, 75.23660313, + 75.27588023, 75.31510624, 75.3542739, 75.39339345, 75.43245611, 75.47146405, 75.51042254, 75.54932382, 75.58817471, 75.62697021, + 75.66571461, 75.70440632, 75.74304491, 75.78163044, 75.82016525, 75.85865056, 75.89708068, 75.93545883, 75.97378492, 76.0120621, + 76.05028712, 76.08846034, 76.12658418, 76.16465767, 76.2026797, 76.24065195, 76.27857222, 76.31644424, 76.35426512, 76.39203326, + 76.42975531, 76.46742597, 76.50504989, 76.54262349, 76.58014732, 76.6176226, 76.6550495, 76.69242337, 76.72975292, 76.76703263, + 76.80426597, 76.84144989, 76.87858556, 76.91567266, 76.95271451, 76.98970341, 77.02664946, 77.06354801, 77.10039946, 77.13720248, + 77.17395743, 77.21066858, 77.24732868, 77.28394674, 77.32051481, 77.35703974, 77.3935179, 77.4299481, 77.46633278, 77.50267234, + 77.53896767, 77.5752132, 77.6114198, 77.64757673, 77.68368996, 77.71975535, 77.75577955, 77.79175544, 77.82768892, 77.86357885, + 77.89942204, 77.93522269, 77.97097918, 78.00669057, 78.04235789, 78.07798, 78.11356019, 78.14909725, 78.18459127, 78.22004104, + 78.25544735, 78.29081033, 78.32613242, 78.3614084, 78.39664434, 78.43183732, 78.46698385, 78.50209439, 78.53715718, 78.57218022, + 78.60716047, 78.64209878, 78.6769951, 78.71185226, 78.746663, 78.78143682, 78.81616758, 78.85085484, 78.88550274, 78.92010982, + 78.9546777, 78.98920242, 79.02368438, 79.05812941, 79.09253277, 79.12689452, 79.16121566, 79.19549993, 79.22974184, 79.26394059, + 79.29810401, 79.33222714, 79.36630773, 79.40034862, 79.43435261, 79.46831575, 79.50224105, 79.5361278, 79.56997224, 79.60377852, + 79.63754844, 79.6712756, 79.70496707, 79.7386195, 79.77223095, 79.80580692, 79.8393431, 79.87284009, 79.90630324, 79.9397239, + 79.9731062, 80.00645432, 80.03976078, 80.07303132, 80.10626466, 80.13946141, 80.17261862, 80.2057402, 80.23882443, 80.27187067, + 80.30488333, 80.33785562, 80.37079099, 80.40368818, 80.43655134, 80.46937694, 80.50216672, 80.53492197, 80.56763831, 80.60032048, + 80.63296434, 80.66557006, 80.69814406, 80.73067924, 80.7631833, 80.7956466, 80.82807796, 80.86046929, 80.89282813, 80.92515223, + 80.95744088, 80.98969387, 81.02191322, 81.05409659, 81.08624412, 81.11835765, 81.15043579, 81.1824791, 81.21448773, 81.24646338, + 81.27840107, 81.31030725, 81.34217912, 81.3740162, 81.40582266, 81.43759037, 81.4693268, 81.50102878, 81.53269738, 81.564328, + 81.59592988, 81.62749803, 81.65902927, 81.69053248, 81.72199906, 81.75343024, 81.78483194, 81.81620159, 81.84753434, 81.87883589, + 81.91010465, 81.94134123, 81.97254592, 82.0037149, 82.03485388, 82.06595769, 82.09703065, 82.1280729, 82.15908193, 82.19005726, + 82.22100267, 82.25191447, 82.28279684, 82.31364612, 82.34446044, 82.37524835, 82.40600156, 82.43672281, 82.46741359, 82.49807143, + 82.52869953, 82.55929763, 82.58986383, 82.62039574, 82.65090102, 82.68137014, 82.71181314, 82.74222283, 82.77260316, 82.80295069, + 82.83327058, 82.86355667, 82.89381203, 82.92404037, 82.95423709, 82.98440109, 83.0145352, 83.04464057, 83.0747166, 83.10476355, + 83.13477865, 83.16476369, 83.19471663, 83.22464346, 83.25454104, 83.28440557, 83.31424367, 83.34405051, 83.37382643, 83.403574, + 83.43329363, 83.46298145, 83.49264184, 83.52227618, 83.55187566, 83.5814507, 83.61099411, 83.64050958, 83.66999636, 83.69945328, + 83.72888435, 83.75828467, 83.78765457, 83.81699798, 83.84631261, 83.87559999, 83.90485773, 83.93408864, 83.96328773, 83.9924604, + 84.02160824, 84.05072359, 84.07981307, 84.10887322, 84.13790674, 84.16691375, 84.19589213, 84.22484302, 84.25376552, 84.28266125, + 84.31152889, 84.34036894, 84.36918258, 84.39796509, 84.426723, 84.4554566, 84.48416077, 84.51283457, 84.54148605, 84.57010873, + 84.59870416, 84.62727398, 84.65581296, 84.68432935, 84.71281921, 84.74128034, 84.76971427, 84.79812356, 84.82650714, 84.85486414, + 84.88319335, 84.91149363, 84.93977033, 84.96802107, 84.99624746, 85.02444686, 85.05261848, 85.08076234, 85.10888389, 85.13697661, + 85.16504751, 85.19308996, 85.22110697, 85.24909745, 85.27706406, 85.3050058, 85.33291891, 85.36080872, 85.38867288, 85.41650897, + 85.44432122, 85.47211082, 85.49987157, 85.5276116, 85.55532315, 85.58301033, 85.61067074, 85.63830715, 85.66592225, 85.69350747, + 85.72106906, 85.74860734, 85.77612007, 85.80360992, 85.83107309, 85.85851235, 85.88592674, 85.91331883, 85.940685, 85.96802559, + 85.99534052, 86.02263527, 86.04990355, 86.07714803, 86.1043677, 86.13156409, 86.15873472, 86.18588473, 86.21300672, 86.24010603, + 86.267184, 86.29423588, 86.32126306, 86.34826803, 86.37525004, 86.40220887, 86.42914117, 86.45605219, 86.48294074, 86.50980317, + 86.53664208, 86.56346029, 86.59025279, 86.61702366, 86.64376933, 86.6704935, 86.6971967, 86.72387239, 86.75052605, 86.77716019, + 86.80376776, 86.83035345, 86.85691767, 86.88345664, 86.90997465, 86.93646901, 86.96294, 86.98938903, 87.01581375, 87.04222061, + 87.06860086, 87.09495848, 87.12129645, 87.14761207, 87.17390292, 87.20017179, 87.22641888, 87.25264536, 87.27884551, 87.30502537, + 87.33118401, 87.35732172, 87.38343463, 87.40952679, 87.43559834, 87.46164719, 87.48767415, 87.51367842, 87.53966135, 87.56562576, + 87.59156283, 87.61748293, 87.64337717, 87.66925215, 87.69510798, 87.72093736, 87.74674778, 87.77253857, 87.79830413, 87.82405258, + 87.84977774, 87.87547845, 87.90116109, 87.92682487, 87.95246439, 87.9780827, 88.00367984, 88.02925702, 88.05481207, 88.08035027, + 88.10586302, 88.13135623, 88.15683029, 88.18227924, 88.2077092, 88.23311926, 88.25851218, 88.28387904, 88.30922637, 88.33455433, + 88.35986038, 88.38515007, 88.41041472, 88.43566009, 88.46088564, 88.48608997, 88.51127475, 88.53643864, 88.5615843, 88.58670705, + 88.61180925, 88.63689372, 88.66195676, 88.6870023, 88.71202293, 88.73702912, 88.76201161, 88.7869734, 88.81191947, 88.83684387, + 88.86174532, 88.88662923, 88.91149412, 88.93633903, 88.96116308, 88.98596844, 89.01075422, 89.03552234, 89.0602694, 89.08499342, + 89.10970333, 89.1343894, 89.15906041, 89.18370902, 89.20834007, 89.23295171, 89.25754223, 89.28211345, 89.30666784, 89.33119931, + 89.35571584, 89.38021293, 89.40468873, 89.42914701, 89.45358423, 89.47800419, 89.50240334, 89.52678556, 89.55114712, 89.57549205, + 89.59981659, 89.62412467, 89.64841158, 89.67267947, 89.69693248, 89.72116452, 89.74537692, 89.76957083, 89.7937454, 89.81790335, + 89.84204321, 89.86616299, 89.89026483, 89.9143479, 89.93841405, 89.96245975, 89.98648709, 90.01049982, 90.03449049, 90.05846689, + 90.08242149, 90.10635828, 90.13027714, 90.15417848, 90.17806217, 90.20192576, 90.22577482, 90.24960461, 90.27341656, 90.2972106, + 90.32098387, 90.34474149, 90.36848137, 90.39220204, 90.41590903, 90.43959324, 90.46326397, 90.48691589, 90.51054803, 90.53416512, + 90.55776192, 90.58134304, 90.60490873, 90.62845405, 90.65198139, 90.67549356, 90.69898682, 90.72246132, 90.74592103, 90.769361, + 90.79278746, 90.81619179, 90.83958359, 90.86295533, 90.88630908, 90.90964877, 90.93297058, 90.95627204, 90.97955858, 91.00282768, + 91.02608323, 91.04931768, 91.07253502, 91.09573908, 91.11892527, 91.14209171, 91.16524142, 91.1883783, 91.21149485, 91.23459599, + 91.25767976, 91.2807473, 91.30379877, 91.32683136, 91.34984706, 91.37285084, 91.39583217, 91.41880262, 91.44175194, 91.46468678, + 91.48760533, 91.51050867, 91.53339033, 91.55625985, 91.57911433, 91.60195137, 91.62476883, 91.64757164, 91.67036098, 91.69313301, + 91.71588507, 91.73862389, 91.76134768, 91.78405458, 91.80674275, 91.82941719, 91.85207509, 91.87471831, 91.89734523, 91.91995466, + 91.94254665, 91.96512422, 91.98768844, 92.01023542, 92.03276627, 92.05527817, 92.07777696, 92.10025976, 92.12272678, 92.14517897, + 92.16761444, 92.19003427, 92.21243853, 92.23482725, 92.25720356, 92.27955771, 92.30190036, 92.3242278, 92.34654009, 92.36883447, + 92.39111284, 92.41338006, 92.43562863, 92.45786234, 92.48008133, 92.50228177, 92.52446971, 92.54664103, 92.56880174, 92.59094039, + 92.61306856, 92.63517859, 92.65727443, 92.67935617, 92.70142287, 92.72347274, 92.74550864, 92.76753071, 92.7895351, 92.81152687, + 92.83350013, 92.85545971, 92.87740485, 92.89933747, 92.92125288, 92.943154, 92.96503896, 92.98690982, 93.0087646, 93.03060924, + 93.05243319, 93.07424721, 93.09604538, 93.11782401, 93.13959274, 93.16134502, 93.18308465, 93.20480792, 93.22651868, 93.24821416, + 93.26989246, 93.29155854, 93.31320847, 93.3348463, 93.35646639, 93.37807529, 93.3996693, 93.42124759, 93.44281016, 93.46436002, + 93.48589524, 93.50741881, 93.52892603, 93.55041879, 93.57189532, 93.59336136, 93.61480953, 93.63624525, 93.65766882, 93.67907358, + 93.70046721, 93.72184688, 93.74321081, 93.7645638, 93.78590211, 93.80722194, 93.82853104, 93.84982856, 93.8711087, 93.89237653, + 93.91362794, 93.9348689, 93.95609091, 93.9773035, 93.99850109, 94.01968552, 94.04085511, 94.06201077, 94.08315348, 94.10428149, + 94.12539575, 94.14649848, 94.16758545, 94.18865888, 94.20971874, 94.23076523, 94.25179828, 94.2728171, 94.29382356, 94.31481682, + 94.33579601, 94.3567592, 94.37771222, 94.39865154, 94.41957488, 94.44048529, 94.46138296, 94.48226783, 94.50314002, 94.52399573, + 94.54484271, 94.56567332, 94.58649145, 94.60729332, 94.6280858, 94.64886302, 94.6696293, 94.69037824, 94.71111801, 94.73184187, + 94.75255372, 94.77325448, 94.79393861, 94.8146147, 94.8352743, 94.85591916, 94.87655236, 94.89717391, 94.91778139, 94.93837602, + 94.95895446, 94.97952618, 95.00008186, 95.02062236, 95.04115163, 95.06166969, 95.08217276, 95.10266477, 95.12314186, 95.14360713, + 95.16406232, 95.18450036, 95.20493, 95.22534421, 95.24574469, 95.26613366, 95.28651202, 95.30687598, 95.32722563, 95.34756393, + 95.36788887, 95.38820343, 95.40850304, 95.42879168, 95.449067, 95.4693292, 95.48958046, 95.50981786, 95.53004526, 95.55025891, + 95.57045881, 95.59064806, 95.61082454, 95.63098662, 95.65113602, 95.67127496, 95.6914036, 95.71151577, 95.73161845, 95.75170788, + 95.77178414, 95.7918502, 95.81190402, 95.83194392, 95.85197168, 95.87198945, 95.89199053, 95.91198337, 95.93196106, 95.95193138, + 95.97188434, 95.99182926, 96.01176161, 96.03168058, 96.05158784, 96.07148185, 96.09136342, 96.11123649, 96.13109341, 96.15094189, + 96.17077664, 96.19059992, 96.21041192, 96.23021102, 96.24999892, 96.26977403, 96.28953722, 96.30929235, 96.32903185, 96.34875878, + 96.36847475, 96.38818287, 96.40787474, 96.42755733, 96.44722605, 96.46688407, 96.48652908, 96.50616346, 96.5257865, 96.54539743, + 96.5649979, 96.58458635, 96.60416366, 96.62372601, 96.64328114, 96.66282372, 96.68235301, 96.70187136, 96.72137804, 96.74087386, + 96.76035587, 96.77983017, 96.79928993, 96.81874209, 96.83818056, 96.85760851, 96.87702132, 96.89642747, 96.91581871, 96.93520023, + 96.95457142, 96.97393153, 96.99327835, 97.01261497, 97.03194067, 97.05125242, 97.07055411, 97.08984577, 97.10912744, 97.12839538, + 97.14765195, 97.16689939, 97.18613698, 97.20535798, 97.22457231, 97.24377619, 97.26296359, 97.28214521, 97.30131272, 97.32047148, + 97.33962005, 97.35875536, 97.37787753, 97.39699277, 97.41609556, 97.43518605, 97.45426661, 97.47333802, 97.49239649, 97.51144208, + 97.53048245, 97.54950626, 97.56852035, 97.58752557, 97.60651883, 97.62550117, 97.64447612, 97.66343401, 97.68238777, 97.7013245, + 97.72025336, 97.73917295, 97.75808021, 97.77697826, 97.79586097, 97.81473912, 97.83360053, 97.85245612, 97.87129715, 97.89012997, + 97.90895465, 97.92776351, 97.94656357, 97.96535557, 97.98413572, 98.00290411, 98.0216607, 98.04040946, 98.0591458, 98.07787434, + 98.09659062, 98.11529602, 98.13399297, 98.15267543, 98.17135021, 98.19001678, 98.20866815, 98.22731202, 98.24594464, 98.26456913, + 98.28317933, 98.30178152, 98.32037191, 98.33895574, 98.35752401, 98.37608583, 98.39463599, 98.41317593, 98.43170428, 98.45022567, + 98.46873238, 98.48723156, 98.50572064, 98.52419839, 98.54266935, 98.56112833, 98.5795743, 98.59801359, 98.61644162, 98.63485926, + 98.65326612, 98.6716639, 98.69005, 98.70842759, 98.72679422, 98.74515239, 98.76349897, 98.78183652, 98.80016317, 98.818479, + 98.83678649, 98.85508254, 98.87337098, 98.89164802, 98.90991685, 98.92817432, 98.94642114, 98.96465599, 98.98288655, 99.0011027, + 99.0193095, 99.03750706, 99.05569661, 99.07387501, 99.09204163, 99.11020164, 99.12834992, 99.14649098, 99.16462101, 99.18274005, + 99.20084747, 99.21894777, 99.23704034, 99.25511882, 99.2731896, 99.29125019, 99.30930313, 99.32734527, 99.34537664, 99.36340108, + 99.38141098, 99.39941718, 99.41740889, 99.43539377, 99.45336677, 99.4713336, 99.48928668, 99.50723239, 99.5251714, 99.54309608, + 99.56101346, 99.57892103, 99.59682135, 99.61470745, 99.63258635, 99.65045553, 99.66831756, 99.68616804, 99.70400948, 99.72184065, + 99.7396654, 99.75747931, 99.77528304, 99.79307659, 99.81085938, 99.82863649, 99.84640288, 99.8641592, 99.88190929, 99.8996443, + 99.91737375, 99.93509321, 99.95280653, 99.97050611, 99.98819959, 100.0058826, 100.0235557, 100.041219, 100.0588725, 100.0765193, + 100.0941565, 100.1117838, 100.1294041, 100.147012, 100.1646135, 100.1822015, 100.1997837, 100.2173562, 100.2349186, 100.2524759, + 100.2700192, 100.2875567, 100.3050842, 100.3226022, 100.3401102, 100.3576094, 100.3751023, 100.3925827, 100.4100569, 100.4275217, + 100.4449773, 100.462423, 100.4798599, 100.4972871, 100.514705, 100.532117, 100.5495203, 100.5669127, 100.5842934, 100.6016687, + 100.6190344, 100.636391, 100.6537386, 100.6710809, 100.6884104, 100.7057304, 100.7230452, 100.7403472, 100.7576436, 100.7749305, + 100.7922053, 100.809475, 100.8267359, 100.8439874, 100.8612302, 100.8784641, 100.8956893, 100.9129053, 100.9301125, 100.947311, + 100.9645009, 100.9816821, 100.9988569, 101.0160203, 101.0331752, 101.0503248, 101.067462, 101.0845908, 101.101711, 101.1188265, + 101.1359293}; + constexpr std::array tsat_fn_pb_d2y = { + 0.015250294, -0.030500589, 0.007192909, -0.002330349, 0.000402372, -0.000248973, -3.17456E-05, -0.000062284, -4.41164E-05, -1.23139E-05, + 1.6533E-06, -3.33366E-05, -1.88742E-05, -1.87743E-05, -1.56343E-05, -1.39099E-05, -1.22638E-05, -1.09504E-05, -9.8264E-06, -8.8733E-06, + -8.0541E-06, -7.3451E-06, -6.7277E-06, -0.000006186, -5.7085E-06, -5.2852E-06, -4.9077E-06, -0.000004571, -4.2666E-06, -3.9951E-06, + -3.7455E-06, -3.5228E-06, -3.3165E-06, -3.1302E-06, -2.9589E-06, -2.8011E-06, -2.6567E-06, -2.5223E-06, -2.3992E-06, -2.2844E-06, + -2.1774E-06, -2.0795E-06, -1.9859E-06, -1.9007E-06, -1.8196E-06, -1.7446E-06, -1.6737E-06, -0.000001607, -1.5443E-06, -1.4864E-06, + -1.4302E-06, -1.3778E-06, -1.3288E-06, -1.2819E-06, -0.000001237, -1.1958E-06, -0.000001155, -1.1181E-06, -1.0818E-06, -1.0468E-06, + -1.0157E-06, -0.000000983, -9.547E-07, -9.252E-07, -8.992E-07, -0.000000873, -0.000000848, -8.248E-07, -8.016E-07, -7.804E-07, + -7.592E-07, -7.395E-07, -7.202E-07, -7.016E-07, -0.000000684, -6.675E-07, -6.499E-07, -6.349E-07, -6.203E-07, -6.039E-07, + -0.000000591, -5.783E-07, -5.621E-07, -5.528E-07, -5.384E-07, -5.269E-07, -5.159E-07, -5.048E-07, -4.935E-07, -4.838E-07, + -4.737E-07, -0.000000463, -4.549E-07, -4.453E-07, -4.362E-07, -4.274E-07, -4.196E-07, -0.000000412, -4.025E-07, -3.962E-07, + -3.887E-07, -3.814E-07, -0.000000374, -3.676E-07, -3.609E-07, -3.542E-07, -3.489E-07, -3.411E-07, -3.368E-07, -3.311E-07, + -3.239E-07, -3.196E-07, -3.145E-07, -3.085E-07, -3.037E-07, -2.991E-07, -2.939E-07, -2.891E-07, -2.849E-07, -2.801E-07, + -2.761E-07, -2.724E-07, -2.661E-07, -2.642E-07, -2.594E-07, -2.554E-07, -2.523E-07, -2.471E-07, -0.000000245, -2.414E-07, + -2.365E-07, -2.348E-07, -2.303E-07, -2.276E-07, -2.249E-07, -2.211E-07, -0.000000217, -2.168E-07, -2.111E-07, -2.095E-07, + -2.074E-07, -2.028E-07, -2.028E-07, -0.000000197, -1.966E-07, -1.936E-07, -1.912E-07, -1.884E-07, -1.857E-07, -1.845E-07, + -1.816E-07, -1.786E-07, -1.776E-07, -1.748E-07, -1.735E-07, -0.00000017, -1.687E-07, -1.675E-07, -0.000000164, -0.000000163, + -1.615E-07, -1.583E-07, -1.578E-07, -1.545E-07, -1.543E-07, -1.522E-07, -1.495E-07, -1.488E-07, -1.474E-07, -1.445E-07, + -1.439E-07, -1.422E-07, -1.398E-07, -1.398E-07, -1.375E-07, -1.353E-07, -1.354E-07, -1.332E-07, -1.314E-07, -1.303E-07, + -1.292E-07, -1.279E-07, -1.262E-07, -1.251E-07, -1.238E-07, -1.229E-07, -1.208E-07, -1.204E-07, -1.195E-07, -1.171E-07, + -1.171E-07, -1.143E-07, -1.157E-07, -1.127E-07, -1.126E-07, -1.106E-07, -1.101E-07, -1.095E-07, -1.071E-07, -1.078E-07, + -1.061E-07, -1.039E-07, -1.051E-07, -1.025E-07, -1.019E-07, -0.000000102, -9.96E-08, -9.92E-08, -9.85E-08, -9.81E-08, + -0.000000096, -9.68E-08, -9.42E-08, -9.42E-08, -9.37E-08, -9.25E-08, -0.000000092, -9.02E-08, -9.12E-08, -8.82E-08, + -8.96E-08, -8.77E-08, -8.67E-08, -8.71E-08, -0.000000085, -8.58E-08, -8.43E-08, -8.27E-08, -0.000000084, -8.07E-08, + -8.33E-08, -7.96E-08, -8.07E-08, -7.98E-08, -0.000000079, -0.000000078, -0.000000078, -7.69E-08, -0.000000077, -7.56E-08, + -7.53E-08, -0.000000075, -7.38E-08, -7.41E-08, -7.22E-08, -7.35E-08, -7.17E-08, -7.05E-08, -7.24E-08, -6.95E-08, + -6.93E-08, -6.98E-08, -6.88E-08, -6.87E-08, -6.66E-08, -6.84E-08, -0.000000066, -0.000000067, -6.52E-08, -6.58E-08, + -6.49E-08, -6.39E-08, -6.45E-08, -6.34E-08, -0.000000063, -6.21E-08, -6.29E-08, -6.12E-08, -6.25E-08, -0.000000059, + -6.19E-08, -5.96E-08, -0.000000059, -5.99E-08, -0.000000059, -5.73E-08, -5.96E-08, -0.000000056, -5.91E-08, -5.48E-08, + -5.82E-08, -5.52E-08, -0.000000056, -5.51E-08, -5.53E-08, -0.000000054, -5.52E-08, -5.36E-08, -5.36E-08, -5.26E-08, + -5.38E-08, -5.23E-08, -5.16E-08, -5.33E-08, -5.01E-08, -5.25E-08, -4.98E-08, -5.15E-08, -4.96E-08, -5.07E-08, + -4.92E-08, -4.95E-08, -4.87E-08, -0.000000049, -4.89E-08, -4.78E-08, -4.75E-08, -4.77E-08, -4.79E-08, -4.61E-08, + -0.000000048, -4.52E-08, -4.67E-08, -4.58E-08, -4.53E-08, -4.53E-08, -4.59E-08, -4.39E-08, -0.000000045, -4.44E-08, + -4.38E-08, -4.35E-08, -4.39E-08, -4.29E-08, -0.000000043, -4.35E-08, -4.14E-08, -4.38E-08, -4.04E-08, -4.32E-08, + -4.04E-08, -4.21E-08, -4.07E-08, -4.13E-08, -0.00000004, -4.11E-08, -3.99E-08, -3.98E-08, -0.00000004, -3.91E-08, + -3.97E-08, -3.83E-08, -0.00000004, -3.77E-08, -3.98E-08, -3.65E-08, -3.92E-08, -3.74E-08, -3.83E-08, -3.68E-08, + -3.77E-08, -3.62E-08, -3.82E-08, -3.53E-08, -0.000000037, -0.000000036, -3.65E-08, -3.62E-08, -3.46E-08, -3.61E-08, + -3.54E-08, -3.55E-08, -3.44E-08, -0.000000035, -3.43E-08, -3.48E-08, -3.44E-08, -3.39E-08, -3.37E-08, -3.39E-08, + -3.38E-08, -3.29E-08, -3.33E-08, -3.37E-08, -3.24E-08, -3.18E-08, -3.36E-08, -3.38E-08, -2.98E-08, -3.31E-08, + -3.26E-08, -3.14E-08, -3.14E-08, -3.09E-08, -3.25E-08, -3.02E-08, -3.16E-08, -3.18E-08, -2.85E-08, -3.23E-08, + -2.97E-08, -3.02E-08, -0.000000031, -3.01E-08, -2.79E-08, -3.22E-08, -2.72E-08, -3.19E-08, -2.76E-08, -2.96E-08, + -2.96E-08, -2.71E-08, -0.000000031, -2.72E-08, -2.96E-08, -2.75E-08, -2.88E-08, -2.74E-08, -2.74E-08, -0.00000003, + -2.57E-08, -2.89E-08, -2.73E-08, -2.61E-08, -2.99E-08, -2.46E-08, -2.74E-08, -2.81E-08, -2.52E-08, -2.78E-08, + -2.57E-08, -2.69E-08, -2.64E-08, -0.000000026, -2.64E-08, -0.000000024, -0.000000028, -2.55E-08, -2.36E-08, -2.81E-08, + -0.000000024, -2.48E-08, -2.56E-08, -2.58E-08, -2.43E-08, -2.52E-08, -2.26E-08, -2.81E-08, -2.21E-08, -2.54E-08, + -2.32E-08, -2.49E-08, -2.49E-08, -2.24E-08, -2.62E-08, -0.000000021, -2.65E-08, -2.08E-08, -2.62E-08, -2.13E-08, + -2.45E-08, -2.33E-08, -2.25E-08, -2.25E-08, -2.37E-08, -2.27E-08, -2.32E-08, -2.26E-08, -2.25E-08, -0.000000022, + -2.19E-08, -2.28E-08, -2.34E-08, -0.000000021, -0.000000022, -2.18E-08, -2.19E-08, -2.27E-08, -2.01E-08, -2.22E-08, + -2.28E-08, -1.89E-08, -2.43E-08, -1.82E-08, -0.000000024, -1.98E-08, -1.95E-08, -2.35E-08, -2.02E-08, -1.88E-08, + -2.34E-08, -1.78E-08, -2.33E-08, -1.87E-08, -2.14E-08, -1.95E-08, -1.94E-08, -0.000000022, -1.95E-08, -0.000000019, + -1.98E-08, -2.25E-08, -1.57E-08, -2.38E-08, -1.66E-08, -2.08E-08, -1.88E-08, -2.02E-08, -1.83E-08, -2.01E-08, + -1.85E-08, -1.86E-08, -2.14E-08, -1.64E-08, -2.04E-08, -1.69E-08, -2.19E-08, -1.54E-08, -2.06E-08, -1.88E-08, + -1.66E-08, -1.93E-08, -1.84E-08, -1.95E-08, -1.54E-08, -2.01E-08, -1.83E-08, -1.64E-08, -1.85E-08, -1.89E-08, + -1.69E-08, -0.000000017, -0.00000002, -1.52E-08, -1.84E-08, -1.77E-08, -0.000000018, -1.67E-08, -1.72E-08, -1.78E-08, + -1.62E-08, -1.79E-08, -1.68E-08, -1.78E-08, -1.68E-08, -1.49E-08, -1.99E-08, -1.48E-08, -1.66E-08, -1.69E-08, + -1.74E-08, -1.71E-08, -1.39E-08, -1.92E-08, -1.44E-08, -1.83E-08, -1.47E-08, -1.73E-08, -1.41E-08, -1.86E-08, + -1.42E-08, -1.76E-08, -1.48E-08, -1.67E-08, -1.54E-08, -1.52E-08, -1.62E-08, -1.62E-08, -1.43E-08, -1.77E-08, + -0.000000013, -1.85E-08, -0.000000012, -0.000000017, -1.59E-08, -1.37E-08, -1.72E-08, -0.000000013, -1.61E-08, -0.000000016, + -1.44E-08, -1.37E-08, -1.71E-08, -1.26E-08, -1.65E-08, -1.37E-08, -1.63E-08, -1.33E-08, -1.48E-08, -1.49E-08, + -1.42E-08, -1.53E-08, -1.41E-08, -1.35E-08, -1.61E-08, -1.28E-08, -0.000000015, -0.000000013, -1.58E-08, -1.29E-08, + -1.58E-08, -1.13E-08, -1.73E-08, -1.05E-08, -0.000000017, -1.27E-08, -1.19E-08, -1.75E-08, -9.6E-09, -1.71E-08, + -1.13E-08, -1.44E-08, -1.55E-08, -9.7E-09, -0.000000017, -0.000000012, -1.23E-08, -1.48E-08, -1.25E-08, -1.47E-08, + -0.000000011, -1.62E-08, -9.8E-09, -0.000000015, -1.36E-08, -1.08E-08, -1.55E-08, -1.09E-08, -1.46E-08, -1.18E-08, + -1.31E-08, -1.29E-08, -1.31E-08, -1.25E-08, -1.14E-08, -1.43E-08, -1.22E-08, -1.32E-08, -1.13E-08, -1.31E-08, + -1.27E-08, -1.18E-08, -1.23E-08, -1.29E-08, -1.17E-08, -1.33E-08, -1.12E-08, -1.25E-08, -1.37E-08, -0.00000001, + -1.37E-08, -1.05E-08, -1.28E-08, -0.000000012, -0.000000012, -1.11E-08, -1.43E-08, -9.3E-09, -1.33E-08, -1.05E-08, + -1.26E-08, -1.14E-08, -1.25E-08, -9.8E-09, -1.47E-08, -8.9E-09, -1.24E-08, -1.12E-08, -1.19E-08, -1.23E-08, + -9.4E-09, -1.42E-08, -8.4E-09, -1.39E-08, -9.4E-09, -1.18E-08, -1.19E-08, -1.09E-08, -1.13E-08, -9.9E-09, + -1.39E-08, -7.3E-09, -1.41E-08, -9.2E-09, -1.31E-08, -8.5E-09, -1.32E-08, -9.6E-09, -1.05E-08, -0.000000012, + -9.8E-09, -1.09E-08, -1.12E-08, -1.05E-08, -1.15E-08, -9.8E-09, -1.08E-08, -1.03E-08, -0.000000011, -1.04E-08, + -0.000000011, -9.1E-09, -1.23E-08, -0.000000009, -1.03E-08, -1.28E-08, -6.5E-09, -1.38E-08, -8.3E-09, -1.11E-08, + -9.9E-09, -1.08E-08, -8.4E-09, -0.000000013, -7.5E-09, -1.12E-08, -1.09E-08, -9.1E-09, -1.04E-08, -9.1E-09, + -1.08E-08, -1.09E-08, -8.1E-09, -1.07E-08, -0.00000001, -1.03E-08, -8.3E-09, -1.06E-08, -1.13E-08, -7.6E-09, + -1.02E-08, -1.06E-08, -9.8E-09, -8.4E-09, -1.06E-08, -8.9E-09, -9.2E-09, -1.09E-08, -9.2E-09, -8.1E-09, + -1.17E-08, -7.7E-09, -9.7E-09, -1.06E-08, -7.8E-09, -1.01E-08, -1.01E-08, -0.000000007, -1.15E-08, -9.3E-09, + -7.3E-09, -1.15E-08, -7.9E-09, -9.5E-09, -8.4E-09, -1.03E-08, -8.2E-09, -9.2E-09, -9.8E-09, -7.1E-09, + -1.09E-08, -8.3E-09, -0.00000001, -7.5E-09, -9.7E-09, -8.7E-09, -7.9E-09, -1.04E-08, -7.5E-09, -9.7E-09, + -0.00000001, -6.3E-09, -1.12E-08, -5.6E-09, -1.21E-08, -5.8E-09, -1.15E-08, -6.8E-09, -8.9E-09, -8.5E-09, + -0.000000009, -7.8E-09, -0.000000009, -8.9E-09, -0.000000008, -8.9E-09, -8.3E-09, -8.8E-09, -7.3E-09, -1.04E-08, + -6.8E-09, -8.6E-09, -0.000000009, -6.2E-09, -0.000000011, -6.4E-09, -9.2E-09, -7.3E-09, -1.07E-08, -5.8E-09, + -8.4E-09, -1.01E-08, -5.3E-09, -9.9E-09, -8.8E-09, -6.7E-09, -7.6E-09, -9.9E-09, -6.9E-09, -8.3E-09, + -7.9E-09, -7.3E-09, -9.7E-09, -6.2E-09, -9.6E-09, -0.000000007, -7.4E-09, -8.1E-09, -8.7E-09, -6.5E-09, + -9.1E-09, -6.5E-09, -8.1E-09, -9.6E-09, -4.9E-09, -9.6E-09, -7.5E-09, -7.1E-09, -8.6E-09, -6.9E-09, + -7.4E-09, -7.5E-09, -9.5E-09, -4.6E-09, -0.000000011, -4.4E-09, -9.6E-09, -6.1E-09, -9.1E-09, -5.6E-09, + -9.1E-09, -7.5E-09, -0.000000006, -0.000000008, -8.2E-09, -7.2E-09, -6.9E-09, -7.3E-09, -6.7E-09, -8.3E-09, + -6.8E-09, -8.7E-09, -5.6E-09, -7.1E-09, -0.000000009, -5.4E-09, -8.2E-09, -7.5E-09, -6.9E-09, -6.4E-09, + -8.4E-09, -6.6E-09, -5.3E-09, -1.04E-08, -4.1E-09, -0.000000009, -6.2E-09, -0.000000007, -7.8E-09, -5.5E-09, + -0.000000008, -7.7E-09, -5.9E-09, -7.5E-09, -6.1E-09, -7.9E-09, -5.7E-09, -8.7E-09, -6.2E-09, -5.2E-09, + -9.3E-09, -5.2E-09, -7.9E-09, -6.2E-09, -6.3E-09, -7.3E-09, -6.4E-09, -7.2E-09, -6.2E-09, -0.000000007, + -6.9E-09, -5.8E-09, -8.6E-09, -5.4E-09, -5.7E-09, -7.3E-09, -8.3E-09, -4.1E-09, -7.9E-09, -6.6E-09, + -5.5E-09, -8.8E-09, -4.4E-09, -6.8E-09, -7.1E-09, -6.7E-09, -5.7E-09, -6.4E-09, -6.5E-09, -6.6E-09, + -7.7E-09, -0.000000005, -6.9E-09, -5.5E-09, -6.9E-09, -6.6E-09, -7.5E-09, -4.2E-09, -8.6E-09, -3.8E-09, + -8.1E-09, -5.6E-09, -6.9E-09, -5.6E-09, -5.8E-09, -7.8E-09, -0.000000005, -6.3E-09, -7.3E-09, -5.7E-09, + -4.7E-09, -8.5E-09, -3.4E-09, -8.3E-09, -5.1E-09, -0.000000007, -0.000000006, -4.2E-09, -8.6E-09, -5.1E-09, + -5.6E-09, -6.7E-09, -4.9E-09, -7.2E-09, -5.3E-09, -6.6E-09, -4.8E-09, -6.8E-09, -5.9E-09, -0.000000007, + -3.8E-09, -7.4E-09, -5.2E-09, -6.5E-09, -5.1E-09, -7.2E-09, -3.7E-09, -8.1E-09, -5.1E-09, -4.8E-09, + -6.8E-09, -0.000000006, -5.2E-09, -5.8E-09, -5.2E-09, -7.3E-09, -4.6E-09, -5.4E-09, -6.8E-09, -5.8E-09, + -4.3E-09, -7.2E-09, -4.4E-09, -6.9E-09, -0.000000005, -4.5E-09, -7.7E-09, -5.2E-09, -0.000000004, -7.5E-09, + -4.9E-09, -4.9E-09, -6.9E-09, -4.4E-09, -6.1E-09, -5.8E-09, -4.8E-09, -0.000000007, -2.9E-09, -7.7E-09, + -5.2E-09, -4.5E-09, -5.4E-09, -6.5E-09, -0.000000005, -5.7E-09, -4.2E-09, -7.5E-09, -4.1E-09, -5.6E-09, + -4.6E-09, -6.8E-09, -4.7E-09, -4.9E-09, -5.8E-09, -5.2E-09, -5.6E-09, -5.6E-09, -3.2E-09, -8.7E-09, + -2.1E-09, -7.9E-09, -0.000000004, -4.1E-09, -7.7E-09, -3.9E-09, -4.4E-09, -7.4E-09, -2.9E-09, -6.2E-09, + -6.4E-09, -3.9E-09, -4.3E-09, -6.6E-09, -4.7E-09, -5.5E-09, -4.3E-09, -6.4E-09, -2.7E-09, -7.6E-09, + -4.2E-09, -4.2E-09, -7.2E-09, -3.7E-09, -5.6E-09, -2.9E-09, -7.8E-09, -4.1E-09, -4.5E-09, -6.3E-09, + -2.5E-09, -7.5E-09, -3.9E-09, -4.9E-09, -5.4E-09, -4.4E-09, -5.6E-09, -3.7E-09, -6.2E-09, -5.1E-09, + -3.7E-09, -6.2E-09, -2.8E-09, -0.000000008, -1.5E-09, -0.000000007, -0.000000005, -3.1E-09, -5.6E-09, -6.1E-09, + -3.7E-09, -4.9E-09, -4.8E-09, -5.4E-09, -4.2E-09, -5.1E-09, -3.9E-09, -0.000000005, -6.8E-09, -1.5E-09, + -7.9E-09, -1.8E-09, -6.9E-09, -3.5E-09, -4.9E-09, -5.3E-09, -0.000000005, -3.2E-09, -0.000000007, -2.5E-09, + -5.1E-09, -5.7E-09, -3.5E-09, -0.000000006, -3.3E-09, -0.000000006, -3.2E-09, -0.000000006, -3.1E-09, -5.9E-09, + -3.1E-09, -5.8E-09, -4.8E-09, -2.8E-09, -5.8E-09, -4.7E-09, -4.3E-09, -5.1E-09, -3.7E-09, -4.4E-09, + -5.3E-09, -0.000000004, -0.000000005, -3.6E-09, -5.4E-09, -4.8E-09, -2.4E-09, -0.000000007, -1.8E-09, -6.6E-09, + -3.7E-09, -4.6E-09, -4.3E-09, -0.000000004, -5.7E-09, -2.5E-09, -5.4E-09, -4.2E-09, -4.1E-09, -5.8E-09, + -3.2E-09, -4.3E-09, -5.5E-09, -1.8E-09, -7.5E-09, -1.8E-09, -5.1E-09, -5.3E-09, -2.7E-09, -5.9E-09, + -3.4E-09, -3.4E-09, -5.5E-09, -4.4E-09, -3.2E-09, -4.9E-09, -0.000000005, -2.6E-09, -6.2E-09, -1.6E-09, + -7.4E-09, -1.3E-09, -5.9E-09, -4.4E-09, -0.000000003, -4.4E-09, -5.7E-09, -2.8E-09, -5.2E-09, -2.1E-09, + -6.2E-09, -0.000000004, -2.7E-09, -4.6E-09, -0.000000005, -4.4E-09, -2.1E-09, -6.2E-09, -2.9E-09, -4.7E-09, + -3.9E-09, -3.7E-09, -4.8E-09, -4.7E-09, -1.2E-09, -7.8E-09, -3E-10, -7.1E-09, -2.4E-09, -4.7E-09, + -2.7E-09, -6.8E-09, -1.7E-09, -4.1E-09, -0.000000004, -5.3E-09, -3.3E-09, -3.1E-09, -4.1E-09, -5.7E-09, + -2.5E-09, -3.9E-09, -3.9E-09, -5.2E-09, -2.6E-09, -4.6E-09, -3.2E-09, -4.1E-09, -4.3E-09, -4.5E-09, + -3.5E-09, -2.8E-09, -4.8E-09, -3.3E-09, -5.5E-09, -2.3E-09, -4.3E-09, -3.9E-09, -3.4E-09, -4.4E-09, + -3.7E-09, -3.7E-09, -4.4E-09, -1.6E-09, -7.4E-09, -1.2E-09, -4.4E-09, -3.3E-09, -4.7E-09, -4.3E-09, + -1.6E-09, -5.6E-09, -3.2E-09, -3.2E-09, -5.5E-09, -1.8E-09, -5.5E-09, -6E-10, -7.8E-09, -4E-10, + -5.8E-09, -2.8E-09, -3.6E-09, -3.5E-09, -4.5E-09, -3.3E-09, -2.9E-09, -5.3E-09, -1.9E-09, -5.7E-09, + -2.6E-09, -4.1E-09, -2.3E-09, -0.000000005, -2.9E-09, -4.5E-09, -2.8E-09, -0.000000005, -6E-10, -7.2E-09, + -8E-10, -4.1E-09, -5.9E-09, -8E-10, -5.3E-09, -2.1E-09, -4.9E-09, -2.4E-09, -3.8E-09, -4.8E-09, + -0.000000002, -0.000000005, -1.8E-09, -5.6E-09, -1.7E-09, -4.1E-09, -3.7E-09, -4.2E-09, -2.6E-09, -4.2E-09, + -0.000000002, -4.8E-09, -2.9E-09, -4.9E-09, -1.2E-09, -5.6E-09, -2.6E-09, -2.3E-09, -5.9E-09, -1.7E-09, + -3.6E-09, -4.4E-09, -0.000000002, -3.5E-09, -5.4E-09, -0.000000002, -2.4E-09, -5.3E-09, -1.9E-09, -5.3E-09, + -9E-10, -6.6E-09, -6E-10, -4.7E-09, -2.7E-09, -3.9E-09, -3.4E-09, -0.000000003, -3.8E-09, -3.5E-09, + -2.2E-09, -4.5E-09, -0.000000003, -3.4E-09, -3.3E-09, -3.2E-09, -3.7E-09, -2.8E-09, -3.3E-09, -3.2E-09, + -4.6E-09, -1.7E-09, -3.5E-09, -4.2E-09, -2.9E-09, -3.1E-09, -3.3E-09, -2.5E-09, -5.3E-09, -5E-10, + -5.4E-09, -1.9E-09, -5.3E-09, -9E-10, -5.1E-09, -1.3E-09, -5.9E-09, -6E-10, -0.000000005, -2.6E-09, + -0.000000002, -5.5E-09, -3E-10, -5.1E-09, -3.4E-09, -2.8E-09, -2.6E-09, -3.9E-09, -2.4E-09, -5.4E-09, + 1E-10, -0.000000005, -3.7E-09, -2.6E-09, -2.3E-09, -4.4E-09, -1.9E-09, -4.3E-09, -2.9E-09, -1.5E-09, + -5.8E-09, -4E-10, -4.8E-09, -3.1E-09, -2.9E-09, -2.2E-09, -3.8E-09, -3.7E-09, -2.2E-09, -3.9E-09, + -1.7E-09, -4.6E-09, -0.000000002, -3.5E-09, -3.4E-09, -2.1E-09, -4.1E-09, -1.7E-09, -3.7E-09, -3.6E-09, + -2.2E-09, -3.2E-09, -3.7E-09, -3.1E-09, -2.6E-09, -1.8E-09, -5.3E-09, -1.2E-09, -3.7E-09, -3.4E-09, + -2.1E-09, -3.1E-09, -3.5E-09, -3.2E-09, -1.4E-09, -5.7E-09, -2E-10, -5.6E-09, 3E-10, -6.3E-09, + -4E-10, -3.7E-09, -3.3E-09, -2.6E-09, -3.3E-09, -3.5E-09, -9E-10, -5.5E-09, -6E-10, -4.2E-09, + -2.5E-09, -2.7E-09, -3.5E-09, -2.4E-09, -3.2E-09, -3.3E-09, -9E-10, -4.9E-09, -2.6E-09, -3.2E-09, + -7E-10, -5.6E-09, -9E-10, -4.4E-09, -1.9E-09, -3.7E-09, -2.3E-09, -2.8E-09, -3.2E-09, -2.2E-09, + -3.3E-09, -0.000000002, -4.8E-09, -5E-10, -3.6E-09, -3.4E-09, -2.4E-09, -3.2E-09, -2.1E-09, -4.4E-09, + -4E-10, -5.1E-09, -4E-10, -4.6E-09, -1.4E-09, -5.2E-09, 1E-10, -5.1E-09, -1.6E-09, -2.8E-09, + -2.4E-09, -3.7E-09, -2.2E-09, -2.5E-09, -0.000000004, -0.000000002, -2.7E-09, -0.000000002, -3.9E-09, -2.6E-09, + -2.3E-09, -1.6E-09, -5.5E-09, -5E-10, -2.3E-09, -5.6E-09, 5E-10, -0.000000005, -1.3E-09, -2.6E-09, + -3.2E-09, -3.8E-09, -7E-10, -3.6E-09, -0.000000003, -2.4E-09, -1.9E-09, -3.2E-09, -0.000000004, 5E-10, + -5.8E-09, -1.6E-09, -2.1E-09, -3.1E-09, -3.2E-09, -3E-10, -6.6E-09, 1.8E-09, -6.5E-09, -7E-10, + -2.3E-09, -3.7E-09, -0.000000001, -5.7E-09, 1.4E-09, -6.7E-09, 8E-10, -5.2E-09, -1.4E-09, -1.4E-09, + -5.1E-09, -1.5E-09, -1.8E-09, -3.2E-09, -2.6E-09, -3.4E-09, -0.000000001, -4.1E-09, -0.000000001, -3.6E-09, + -2.8E-09, -1.2E-09, -4.7E-09, -1.3E-09, -1.4E-09, -5.1E-09, -5E-10, -3.8E-09, -8E-10, -4.9E-09, + -7E-10, -4.2E-09, 1E-10, -5.7E-09, 0.000000, -3.8E-09, -1.9E-09, -3.7E-09, -4E-10, -5.1E-09, + -8E-10, -2.7E-09, -3.3E-09, -9E-10, -3.2E-09, -3.8E-09, -7E-10, -3.4E-09, -2.2E-09, -0.000000003, + -1.7E-09, -3.5E-09, -1.4E-09, -3.3E-09, -1.4E-09, -3.5E-09, -1.7E-09, -2.8E-09, -2.9E-09, -1.4E-09, + -3.6E-09, -0.000000001, -3.6E-09, -1.3E-09, -3.3E-09, -2.1E-09, -0.000000004, 7E-10, -5.1E-09, -1.5E-09, + -2.6E-09, -1.6E-09, -2.8E-09, -3.5E-09, -6E-10, -3.9E-09, -9E-10, -3.2E-09, -2.4E-09, -3.3E-09, + -1.5E-09, -1.3E-09, -4.6E-09, -9E-10, -3.2E-09, -1.3E-09, -2.8E-09, -3.1E-09, -3E-10, -5.6E-09, + 1.5E-09, -5.7E-09, 0.00000, -4.4E-09, 0.00000, -4.7E-09, -1.3E-09, -9E-10, -4.9E-09, -6E-10, + -3.3E-09, -6E-10, -4.9E-09, -6E-10, -3.2E-09, -9E-10, -3.6E-09, -1.6E-09, -3.2E-09, -8E-10, + -3.2E-09, -2.4E-09, -2.3E-09, -3.2E-09, -5E-10, -3.1E-09, -2.9E-09, -2E-10, -5.5E-09, 3E-10, + -3.7E-09, -1E-10, -0.000000005, -2E-10, -3.2E-09, -2.2E-09, -2.4E-09, -2.7E-09, -1.1E-09, -2.6E-09, + -2.7E-09, -9E-10, -4.3E-09, -1E-10, -4.9E-09, -2E-10, -2.7E-09, -3.1E-09, 2E-10, -5.2E-09, + 0.0000, -3.2E-09, -0.000000002, -2.6E-09, -2.5E-09, -6E-10, -4.4E-09, -5E-10, -2.8E-09, -2.1E-09, + -2.6E-09, -1.9E-09, -2.5E-09, -2.5E-09, -0.000000001, -2.3E-09, -2.5E-09, -3.6E-09, -3E-10, -0.000000003, + -1.9E-09, -2.8E-09, -2E-10, -0.000000004, -2.5E-09, -1E-10, -4.6E-09, -3E-10, -2.5E-09, -3.8E-09, + -3E-10, -2.6E-09, -2.3E-09, -2.1E-09, -2.2E-09, -2.1E-09, -2.4E-09, -2.1E-09, -2.2E-09, -0.000000002, + -2.4E-09, -9E-10, -3.3E-09, -2.2E-09, -4E-10, -4.1E-09, -1.4E-09, -2.9E-09, 4E-10, -5.5E-09, + 2.7E-09}; // namespace Psychrometrics #ifdef EP_psych_stats constexpr std::array(PsychrometricFunction::Num)> PsyReportIt = { true, @@ -174,11 +508,12 @@ namespace Psychrometrics { inline Real64 PsyRhoAirFnPbTdbW([[maybe_unused]] EnergyPlusData &state, - Real64 const pb, // barometric pressure (Pascals) + Real64 const pb, // pressure (Pascals) Real64 const tdb, // dry bulb temperature (Celsius) Real64 const dw, // humidity ratio (kgWater/kgDryAir) [[maybe_unused]] std::string_view const CalledFrom = "" // routine this function was called from (error messages) !unused1208 ) + { // FUNCTION INFORMATION: // AUTHOR G. S. Wright @@ -490,7 +825,7 @@ namespace Psychrometrics { PsyRhFnTdbRhovLBnd0C([[maybe_unused]] EnergyPlusData &state, Real64 const Tdb, // dry-bulb temperature {C} Real64 const Rhovapor, // vapor density in air {kg/m3} - [[maybe_unused]] std::string_view const CalledFrom = "" // routine this function was called from (error messages) + [[maybe_unused]] std::string_view const CalledFrom = "" // routine this function was called from (error message) ) { // FUNCTION INFORMATION: @@ -659,10 +994,10 @@ namespace Psychrometrics { std::string_view const CalledFrom = "" // routine this function was called from (error messages) ); - // we are disabling these warnings on Windows because the cache value lookups are using 64bit integers, - // but the () and [] operator overloads for Array1D (which stores the cache) only uses 32bit lookups - // this seems ... very bad. This problem will be fixed when we get rid of Array1D - // at which time this warning disable should be removed. +// we are disabling these warnings on Windows because the cache value lookups are using 64bit integers, +// but the () and [] operator overloads for Array1D (which stores the cache) only uses 32bit lookups +// this seems ... very bad. This problem will be fixed when we get rid of Array1D +// at which time this warning disable should be removed. #ifdef _MSC_VER #pragma warning(push) #pragma warning(disable : 4244) @@ -1345,7 +1680,8 @@ namespace Psychrometrics { Real64 const Wmin = min(W1, W2); return PsyDeltaHSenFnTdb2Tdb1W(TDB2, TDB1, Wmin); } - + Real64 CSplineint(int const n, // sample data size + const Real64 &x); // given value of x } // namespace Psychrometrics struct PsychrometricsData : BaseGlobalStruct @@ -1358,6 +1694,7 @@ struct PsychrometricsData : BaseGlobalStruct std::array(EnergyPlus::PsychrometricFunction::Num)> iPsyErrIndex; std::string String; bool ReportErrors = true; + bool useInterpolationPsychTsatFnPb = false; void clear_state() override { @@ -1369,6 +1706,7 @@ struct PsychrometricsData : BaseGlobalStruct tSat_Save = -99999.0; String = ""; ReportErrors = true; + useInterpolationPsychTsatFnPb = false; } }; diff --git a/src/EnergyPlus/SimulationManager.cc b/src/EnergyPlus/SimulationManager.cc index 65349cc8c13..29b86e88560 100644 --- a/src/EnergyPlus/SimulationManager.cc +++ b/src/EnergyPlus/SimulationManager.cc @@ -1184,6 +1184,7 @@ namespace SimulationManager { bool overrideMaxZoneTempDiff(false); bool overrideSystemTimestep(false); bool overrideMaxAllowedDelTemp(false); + bool overridePsychTsatFnPb(false); state.dataZoneTempPredictorCorrector->OscillationVariablesNeeded = true; if (fields.find("override_mode") != fields.end()) { overrideModeValue = UtilityRoutines::MakeUPPERCase(AsString(fields.at("override_mode"))); @@ -1215,15 +1216,24 @@ namespace SimulationManager { overrideBeginEnvResetSuppress = true; overrideSystemTimestep = true; } else if (overrideModeValue == "MODE06") { - // Mode05 plus internal variable MaxZoneTempDiff will be set to 1.00 + // Mode05 plus cubic spline interpolations in replacement of the original psychrometric function PsychTsatFnPb overrideTimestep = true; overrideZoneAirHeatBalAlg = true; overrideMinNumWarmupDays = true; overrideBeginEnvResetSuppress = true; overrideSystemTimestep = true; - overrideMaxZoneTempDiff = true; + overridePsychTsatFnPb = true; } else if (overrideModeValue == "MODE07") { - // Mode06 plus internal variable MaxAllowedDelTemp will be set to 0.1 + // Mode06 plus internal variable MaxZoneTempDiff will be set to 1.00 + overrideTimestep = true; + overrideZoneAirHeatBalAlg = true; + overrideMinNumWarmupDays = true; + overrideBeginEnvResetSuppress = true; + overrideSystemTimestep = true; + overrideMaxZoneTempDiff = true; + overridePsychTsatFnPb = true; + } else if (overrideModeValue == "MODE08") { + // Mode07 plus internal variable MaxAllowedDelTemp will be set to 0.1 overrideTimestep = true; overrideZoneAirHeatBalAlg = true; overrideMinNumWarmupDays = true; @@ -1231,6 +1241,7 @@ namespace SimulationManager { overrideSystemTimestep = true; overrideMaxZoneTempDiff = true; overrideMaxAllowedDelTemp = true; + overridePsychTsatFnPb = true; } else if (overrideModeValue == "ADVANCED") { bool advancedModeUsed = false; if (fields.find("maxzonetempdiff") != fields.end()) { // not required field, has default value @@ -1294,6 +1305,13 @@ namespace SimulationManager { state.dataConvergeParams->MinTimeStepSys = MinTimeStepSysOverrideValue / 60.0; state.dataHVACGlobal->LimitNumSysSteps = int(state.dataGlobal->TimeStepZone / state.dataConvergeParams->MinTimeStepSys); } + if (overridePsychTsatFnPb) { + ShowWarningError(state, + "Due to PerformancePrecisionTradeoffs Override Mode, the saturated temperature will be calculated using " + "cubic spline interpolations in replacement of PsychTsatFnPb ."); + // Mode06 CSpline interpolation (64 Pa bin size + 20/16 bit) + state.dataPsychrometrics->useInterpolationPsychTsatFnPb = true; + } if (overrideMaxZoneTempDiff) { ShowWarningError( state, "Due to PerformancePrecisionTradeoffs Override Mode, internal variable MaxZoneTempDiff will be set to 1.0 ."); diff --git a/src/Transition/CreateNewIDFUsingRulesV9_6_0.f90 b/src/Transition/CreateNewIDFUsingRulesV9_6_0.f90 index b1623002a53..56e287cb260 100644 --- a/src/Transition/CreateNewIDFUsingRulesV9_6_0.f90 +++ b/src/Transition/CreateNewIDFUsingRulesV9_6_0.f90 @@ -387,10 +387,10 @@ SUBROUTINE CreateNewIDFUsingRules(EndOfFile,DiffOnly,InLfn,AskForInput,InputFile CASE('AIRFLOWNETWORK:MULTIZONE:REFERENCECRACKCONDITIONS') CALL GetNewObjectDefInIDD(ObjectName,NwNumArgs,NwAorN,NwReqFld,NwObjMinFlds,NwFldNames,NwFldDefaults,NwFldUnits) nodiff=.false. - OutArgs(1:CurArgs)=InArgs(1:CurArgs) - IF (InArgs(2) == Blank) THEN + OutArgs(1:CurArgs)=InArgs(1:CurArgs) + IF (InArgs(2) == Blank) THEN OutArgs(2)="20.0" - END IF + END IF CASE('AIRLOOPHVAC:OUTDOORAIRSYSTEM') @@ -438,7 +438,15 @@ SUBROUTINE CreateNewIDFUsingRules(EndOfFile,DiffOnly,InLfn,AskForInput,InputFile ! If your original object starts with R, insert the rules here ! If your original object starts with S, insert the rules here - + CASE('PERFORMANCEPRECISIONTRADEOFFS') + CALL GetNewObjectDefInIDD(ObjectName,NwNumArgs,NwAorN,NwReqFld,NwObjMinFlds,NwFldNames,NwFldDefaults,NwFldUnits) + nodiff=.false. + OutArgs(1:CurArgs)=InArgs(1:CurArgs) + IF (MakeUPPERCase(InArgs(3)) == "MODE06") THEN + OutArgs(3)='Mode07' + ELSEIF (MakeUPPERCase(InArgs(3)) == "MODE07") THEN + OutArgs(3)='Mode08' + END IF ! If your original object starts with T, insert the rules here ! If your original object starts with U, insert the rules here diff --git a/src/Transition/InputRulesFiles/Rules9-5-0-to-9-6-0.md b/src/Transition/InputRulesFiles/Rules9-5-0-to-9-6-0.md index 44929de2046..a1a13c46fe9 100644 --- a/src/Transition/InputRulesFiles/Rules9-5-0-to-9-6-0.md +++ b/src/Transition/InputRulesFiles/Rules9-5-0-to-9-6-0.md @@ -31,6 +31,15 @@ Field 4 has been eliminated/deleted and not replace with anything else. See [8884](https://github.com/NREL/EnergyPlus/pull/8884) +# Object Change: PerformancePrecisionTradeoffs +Summary: A new override option including cubic spline interpolations in replacement of original psychrometric function PsyTsatFnPb was added as Mode06 in this object. The previous options for the override mode of the object including Mode06 and Mode07 in version 9.5 were switched to Mode07 and Mode08 in version 9.6, respectively. + +Fields 1-2 remains the same. +Fields 3 has been updated by adding a new override mode option. +Fields 4-5 remains the same. + +See [8946](https://github.com/NREL/EnergyPlus/pull/8946) + # Object Change: GroundHeatExchanger:System Summary: A new field was added to specify the method used to compute the g-function values. @@ -38,3 +47,4 @@ Summary: A new field was added to specify the method used to compute the g-funct Fields 1-9 remain the same. New Field F10 (A7) g-Function Calculation Method. Leave blank or assign a value of 'UHFcalc' or 'UBHWTcalc'. Default value is 'UHFcalc'. Remaining fields remain the same and are shifted. + diff --git a/tst/EnergyPlus/unit/Psychrometrics.unit.cc b/tst/EnergyPlus/unit/Psychrometrics.unit.cc index 3bdf7c5e831..718fb5bec3b 100644 --- a/tst/EnergyPlus/unit/Psychrometrics.unit.cc +++ b/tst/EnergyPlus/unit/Psychrometrics.unit.cc @@ -433,3 +433,209 @@ TEST_F(EnergyPlusFixture, Psychrometrics_CpAirAverageValue_Test) EXPECT_DOUBLE_EQ(CpAirOut, 1.00484e3 + W2 * 1.85895e3); EXPECT_DOUBLE_EQ(CpAir_result, CpAir_average); } +TEST_F(EnergyPlusFixture, Psychrometrics_Interpolation_Sample_Test) +{ + // verify sample data for interpolation + InitializePsychRoutines(*state); + Real64 tsat_psy; + Real64 error = 0.0; + int i; + constexpr std::array tsat_fn_pb_tsat = { + -100, -24.88812836, -17.74197121, -13.36696483, -10.17031904, -7.635747635, -5.528025298, -3.719474549, -2.132789207, -0.717496548, + 0.635182846, 1.961212857, 3.184455749, 4.320585222, 5.381890646, 6.378191532, 7.317464071, 8.206277019, 9.050107781, 9.853572827, + 10.62060139, 11.35456508, 12.05838073, 12.73458802, 13.38541367, 14.01282043, 14.61854774, 15.2041452, 15.77099766, 16.32035156, + 16.85332662, 17.37094188, 17.87411665, 18.36369351, 18.84043883, 19.30505535, 19.75818947, 20.200435, 20.63234161, 21.05441545, + 21.46712703, 21.87091368, 22.26617973, 22.65330582, 23.03264392, 23.40452474, 23.76925695, 24.12713074, 24.4784194, 24.82337925, + 25.16224961, 25.49525941, 25.82262353, 26.14454343, 26.46121131, 26.77280989, 27.07951029, 27.38147718, 27.67886392, 27.97181871, + 28.26048327, 28.54498875, 28.82546493, 29.10203155, 29.37480614, 29.64389783, 29.90941288, 30.17145332, 30.43011544, 30.68549275, + 30.93767354, 31.1867437, 31.43278471, 31.67587535, 31.91609169, 32.15350578, 32.38818672, 32.62020399, 32.84962034, 33.07649705, + 33.30089772, 33.52287753, 33.7424911, 33.95979768, 34.17484337, 34.38768181, 34.59836177, 34.8069286, 35.01342775, 35.21790433, + 35.42039942, 35.62095455, 35.81961149, 36.0164063, 36.21137695, 36.40456083, 36.59599334, 36.78570706, 36.97373442, 37.16011096, + 37.34486543, 37.5280276, 37.70962755, 37.88969498, 38.06825698, 38.24534078, 38.4209727, 38.59517724, 38.7679823, 38.93940873, + 39.10948012, 39.2782229, 39.44565725, 39.6118041, 39.77668652, 39.94032485, 40.10273846, 40.26394796, 40.42397281, 40.58283123, + 40.74054192, 40.89712156, 41.0525873, 41.20696011, 41.3602526, 41.5124819, 41.66366455, 41.81381521, 41.96295168, 42.11108573, + 42.25823182, 42.40440716, 42.54962287, 42.69389419, 42.8372333, 42.97965197, 43.12116511, 43.2617866, 43.40152372, 43.5403934, + 43.67840528, 43.81556931, 43.95189963, 44.0874032, 44.22209605, 44.35598543, 44.48908135, 44.62139435, 44.75293555, 44.88371503, + 45.01374001, 45.14302132, 45.27156964, 45.39939168, 45.52649676, 45.65289264, 45.77859083, 45.90359809, 46.02792097, 46.15157051, + 46.27455279, 46.39687482, 46.51854662, 46.63957407, 46.75996667, 46.87972868, 46.99886779, 47.11739332, 47.23530984, 47.35262368, + 47.46934408, 47.58547585, 47.7010257, 47.81600131, 47.93040599, 48.0442474, 48.15753313, 48.27026594, 48.38245292, 48.49410119, + 48.60521578, 48.71580123, 48.82586296, 48.93540734, 49.04443945, 49.15296424, 49.26098645, 49.36851262, 49.47554597, 49.58209088, + 49.68815438, 49.7937401, 49.89885468, 50.00349843, 50.10767869, 50.21139915, 50.31466562, 50.41748127, 50.51984969, 50.6217774, + 50.72326533, 50.8243191, 50.92494506, 51.02514303, 51.12491978, 51.22427873, 51.32322162, 51.42175505, 51.51988223, 51.61760565, + 51.71492849, 51.81185626, 51.90838995, 52.00453601, 52.10029659, 52.19567395, 52.29067211, 52.38529434, 52.47954517, 52.57342522, + 52.66694094, 52.76009179, 52.85288285, 52.94531781, 53.03739768, 53.12912747, 53.22050752, 53.31154238, 53.40223643, 53.49258938, + 53.58260762, 53.67228883, 53.76164079, 53.85066348, 53.93935919, 54.02773136, 54.11578345, 54.20351687, 54.29093451, 54.37803778, + 54.46483065, 54.55131516, 54.63749308, 54.7233676, 54.80894018, 54.89421491, 54.97919066, 55.0638724, 55.14826341, 55.23236115, + 55.31617223, 55.39969882, 55.48294042, 55.56589968, 55.64857895, 55.7309827, 55.8131092, 55.89496315, 55.97654474, 56.05785774, + 56.1389022, 56.21968099, 56.30019707, 56.38045024, 56.46044318, 56.54017846, 56.61965822, 56.69888215, 56.77785343, 56.85657191, + 56.93504425, 57.01326641, 57.09124313, 57.16897715, 57.24646717, 57.32371609, 57.40072768, 57.4774991, 57.55403662, 57.63033718, + 57.70640793, 57.7822446, 57.85785243, 57.93323193, 58.00838488, 58.08331234, 58.15801692, 58.23249741, 58.30675724, 58.38079823, + 58.4546222, 58.52822764, 58.60161837, 58.67479622, 58.74775927, 58.82051339, 58.89305587, 58.96539129, 59.03751832, 59.1094403, + 59.18115654, 59.25267006, 59.32398161, 59.39509291, 59.46600373, 59.53671502, 59.60723006, 59.67755023, 59.74767505, 59.81760513, + 59.88734393, 59.95688928, 60.02624654, 60.09541405, 60.16439371, 60.2331876, 60.30179567, 60.37021755, 60.43845741, 60.50651412, + 60.57438886, 60.64208387, 60.70960018, 60.77693773, 60.84409885, 60.91108356, 60.97789194, 61.04452769, 61.11098811, 61.1772789, + 61.2433966, 61.30934573, 61.37512456, 61.44073521, 61.50617791, 61.57145516, 61.6365656, 61.70151178, 61.76629472, 61.83091455, + 61.89537314, 61.95967045, 62.02380873, 62.08778598, 62.15160576, 62.21526616, 62.2787729, 62.34212215, 62.40531644, 62.46835564, + 62.53124254, 62.59397652, 62.65655972, 62.7189898, 62.78127202, 62.84340443, 62.90538831, 62.96722333, 63.02891098, 63.09045474, + 63.15185221, 63.21310404, 63.27421125, 63.33517636, 63.395999, 63.45668024, 63.5172196, 63.57761821, 63.63787789, 63.69799922, + 63.75798178, 63.81782639, 63.87753525, 63.93710759, 63.99654311, 64.05584549, 64.11501608, 64.1740502, 64.23294864, 64.29172001, + 64.35035847, 64.40886389, 64.4672399, 64.5254877, 64.5836074, 64.64159658, 64.69945949, 64.75719386, 64.81480044, 64.87228539, + 64.92964246, 64.98687573, 65.04398502, 65.10096852, 65.15782959, 65.21457202, 65.27118885, 65.32768769, 65.38406204, 65.44031895, + 65.49645605, 65.55247365, 65.60837577, 65.66415606, 65.7198208, 65.7753675, 65.8307992, 65.88611471, 65.94131694, 65.99640529, + 66.05137563, 66.10623566, 66.16098047, 66.21561318, 66.27013565, 66.32454189, 66.37884177, 66.43303089, 66.48710748, 66.54107712, + 66.59493603, 66.64868734, 66.70232946, 66.75586325, 66.80929006, 66.86261073, 66.91582873, 66.96893645, 67.02193922, 67.07484084, + 67.12763318, 67.18032374, 67.23291261, 67.2853971, 67.33777697, 67.39005562, 67.44223342, 67.49431315, 67.54628565, 67.59816124, + 67.64993655, 67.70161425, 67.75319106, 67.80466762, 67.85604816, 67.90732765, 67.95851385, 68.00959903, 68.06059149, 68.11148356, + 68.16228279, 68.21298473, 68.26359087, 68.31410431, 68.36452488, 68.41484999, 68.46508104, 68.51521777, 68.56526159, 68.6152136, + 68.6650752, 68.71484646, 68.76452459, 68.81410894, 68.86360503, 68.9130119, 68.96232932, 69.01155648, 69.06069295, 69.10974389, + 69.15870478, 69.20757526, 69.25636202, 69.30505708, 69.35366941, 69.40219039, 69.45062774, 69.49898231, 69.54724573, 69.59542511, + 69.64352333, 69.69153266, 69.73946144, 69.78730174, 69.83506042, 69.8827346, 69.93032771, 69.97783945, 70.02526447, 70.07260834, + 70.11987362, 70.16705659, 70.21415392, 70.26117672, 70.3081124, 70.35497219, 70.40175094, 70.44845033, 70.49506926, 70.5416108, + 70.58807245, 70.63445733, 70.68076429, 70.72698884, 70.77314, 70.81921262, 70.86521029, 70.91112621, 70.956971, 71.0027362, + 71.04842458, 71.09404158, 71.13958183, 71.18504519, 71.23043212, 71.27574987, 71.3209896, 71.36615442, 71.41124924, 71.45626937, + 71.50121362, 71.5460872, 71.59088911, 71.63561453, 71.68027218, 71.72485702, 71.76936872, 71.8138079, 71.85817753, 71.90247673, + 71.94670456, 71.99086376, 72.03495158, 72.07896913, 72.12291519, 72.16679298, 72.21060503, 72.25434249, 72.29801465, 72.34161996, + 72.38515599, 72.42862145, 72.47201901, 72.51535392, 72.5586171, 72.60181527, 72.64494367, 72.68800759, 72.73100471, 72.77393894, + 72.81680315, 72.85960377, 72.90233649, 72.94500537, 72.98760805, 73.03014695, 73.07262276, 73.11503298, 73.1573782, 73.19966128, + 73.24187731, 73.28403304, 73.32612125, 73.36815237, 73.41011791, 73.45201898, 73.49385988, 73.53563549, 73.57735287, 73.61900651, + 73.6605957, 73.70212525, 73.74359587, 73.78500201, 73.82635101, 73.86763719, 73.90886374, 73.95002747, 73.99113361, 74.03217995, + 74.07316582, 74.11409233, 74.15495789, 74.19576541, 74.23651553, 74.27720372, 74.31783561, 74.35840878, 74.39892536, 74.43938115, + 74.47978004, 74.52011928, 74.56040515, 74.60062901, 74.64080092, 74.68091054, 74.72096571, 74.76096771, 74.80090708, 74.84079646, + 74.88062483, 74.9204009, 74.96011942, 74.99977909, 75.03939008, 75.07893992, 75.11843698, 75.15788211, 75.19726977, 75.23660313, + 75.27588023, 75.31510624, 75.3542739, 75.39339345, 75.43245611, 75.47146405, 75.51042254, 75.54932382, 75.58817471, 75.62697021, + 75.66571461, 75.70440632, 75.74304491, 75.78163044, 75.82016525, 75.85865056, 75.89708068, 75.93545883, 75.97378492, 76.0120621, + 76.05028712, 76.08846034, 76.12658418, 76.16465767, 76.2026797, 76.24065195, 76.27857222, 76.31644424, 76.35426512, 76.39203326, + 76.42975531, 76.46742597, 76.50504989, 76.54262349, 76.58014732, 76.6176226, 76.6550495, 76.69242337, 76.72975292, 76.76703263, + 76.80426597, 76.84144989, 76.87858556, 76.91567266, 76.95271451, 76.98970341, 77.02664946, 77.06354801, 77.10039946, 77.13720248, + 77.17395743, 77.21066858, 77.24732868, 77.28394674, 77.32051481, 77.35703974, 77.3935179, 77.4299481, 77.46633278, 77.50267234, + 77.53896767, 77.5752132, 77.6114198, 77.64757673, 77.68368996, 77.71975535, 77.75577955, 77.79175544, 77.82768892, 77.86357885, + 77.89942204, 77.93522269, 77.97097918, 78.00669057, 78.04235789, 78.07798, 78.11356019, 78.14909725, 78.18459127, 78.22004104, + 78.25544735, 78.29081033, 78.32613242, 78.3614084, 78.39664434, 78.43183732, 78.46698385, 78.50209439, 78.53715718, 78.57218022, + 78.60716047, 78.64209878, 78.6769951, 78.71185226, 78.746663, 78.78143682, 78.81616758, 78.85085484, 78.88550274, 78.92010982, + 78.9546777, 78.98920242, 79.02368438, 79.05812941, 79.09253277, 79.12689452, 79.16121566, 79.19549993, 79.22974184, 79.26394059, + 79.29810401, 79.33222714, 79.36630773, 79.40034862, 79.43435261, 79.46831575, 79.50224105, 79.5361278, 79.56997224, 79.60377852, + 79.63754844, 79.6712756, 79.70496707, 79.7386195, 79.77223095, 79.80580692, 79.8393431, 79.87284009, 79.90630324, 79.9397239, + 79.9731062, 80.00645432, 80.03976078, 80.07303132, 80.10626466, 80.13946141, 80.17261862, 80.2057402, 80.23882443, 80.27187067, + 80.30488333, 80.33785562, 80.37079099, 80.40368818, 80.43655134, 80.46937694, 80.50216672, 80.53492197, 80.56763831, 80.60032048, + 80.63296434, 80.66557006, 80.69814406, 80.73067924, 80.7631833, 80.7956466, 80.82807796, 80.86046929, 80.89282813, 80.92515223, + 80.95744088, 80.98969387, 81.02191322, 81.05409659, 81.08624412, 81.11835765, 81.15043579, 81.1824791, 81.21448773, 81.24646338, + 81.27840107, 81.31030725, 81.34217912, 81.3740162, 81.40582266, 81.43759037, 81.4693268, 81.50102878, 81.53269738, 81.564328, + 81.59592988, 81.62749803, 81.65902927, 81.69053248, 81.72199906, 81.75343024, 81.78483194, 81.81620159, 81.84753434, 81.87883589, + 81.91010465, 81.94134123, 81.97254592, 82.0037149, 82.03485388, 82.06595769, 82.09703065, 82.1280729, 82.15908193, 82.19005726, + 82.22100267, 82.25191447, 82.28279684, 82.31364612, 82.34446044, 82.37524835, 82.40600156, 82.43672281, 82.46741359, 82.49807143, + 82.52869953, 82.55929763, 82.58986383, 82.62039574, 82.65090102, 82.68137014, 82.71181314, 82.74222283, 82.77260316, 82.80295069, + 82.83327058, 82.86355667, 82.89381203, 82.92404037, 82.95423709, 82.98440109, 83.0145352, 83.04464057, 83.0747166, 83.10476355, + 83.13477865, 83.16476369, 83.19471663, 83.22464346, 83.25454104, 83.28440557, 83.31424367, 83.34405051, 83.37382643, 83.403574, + 83.43329363, 83.46298145, 83.49264184, 83.52227618, 83.55187566, 83.5814507, 83.61099411, 83.64050958, 83.66999636, 83.69945328, + 83.72888435, 83.75828467, 83.78765457, 83.81699798, 83.84631261, 83.87559999, 83.90485773, 83.93408864, 83.96328773, 83.9924604, + 84.02160824, 84.05072359, 84.07981307, 84.10887322, 84.13790674, 84.16691375, 84.19589213, 84.22484302, 84.25376552, 84.28266125, + 84.31152889, 84.34036894, 84.36918258, 84.39796509, 84.426723, 84.4554566, 84.48416077, 84.51283457, 84.54148605, 84.57010873, + 84.59870416, 84.62727398, 84.65581296, 84.68432935, 84.71281921, 84.74128034, 84.76971427, 84.79812356, 84.82650714, 84.85486414, + 84.88319335, 84.91149363, 84.93977033, 84.96802107, 84.99624746, 85.02444686, 85.05261848, 85.08076234, 85.10888389, 85.13697661, + 85.16504751, 85.19308996, 85.22110697, 85.24909745, 85.27706406, 85.3050058, 85.33291891, 85.36080872, 85.38867288, 85.41650897, + 85.44432122, 85.47211082, 85.49987157, 85.5276116, 85.55532315, 85.58301033, 85.61067074, 85.63830715, 85.66592225, 85.69350747, + 85.72106906, 85.74860734, 85.77612007, 85.80360992, 85.83107309, 85.85851235, 85.88592674, 85.91331883, 85.940685, 85.96802559, + 85.99534052, 86.02263527, 86.04990355, 86.07714803, 86.1043677, 86.13156409, 86.15873472, 86.18588473, 86.21300672, 86.24010603, + 86.267184, 86.29423588, 86.32126306, 86.34826803, 86.37525004, 86.40220887, 86.42914117, 86.45605219, 86.48294074, 86.50980317, + 86.53664208, 86.56346029, 86.59025279, 86.61702366, 86.64376933, 86.6704935, 86.6971967, 86.72387239, 86.75052605, 86.77716019, + 86.80376776, 86.83035345, 86.85691767, 86.88345664, 86.90997465, 86.93646901, 86.96294, 86.98938903, 87.01581375, 87.04222061, + 87.06860086, 87.09495848, 87.12129645, 87.14761207, 87.17390292, 87.20017179, 87.22641888, 87.25264536, 87.27884551, 87.30502537, + 87.33118401, 87.35732172, 87.38343463, 87.40952679, 87.43559834, 87.46164719, 87.48767415, 87.51367842, 87.53966135, 87.56562576, + 87.59156283, 87.61748293, 87.64337717, 87.66925215, 87.69510798, 87.72093736, 87.74674778, 87.77253857, 87.79830413, 87.82405258, + 87.84977774, 87.87547845, 87.90116109, 87.92682487, 87.95246439, 87.9780827, 88.00367984, 88.02925702, 88.05481207, 88.08035027, + 88.10586302, 88.13135623, 88.15683029, 88.18227924, 88.2077092, 88.23311926, 88.25851218, 88.28387904, 88.30922637, 88.33455433, + 88.35986038, 88.38515007, 88.41041472, 88.43566009, 88.46088564, 88.48608997, 88.51127475, 88.53643864, 88.5615843, 88.58670705, + 88.61180925, 88.63689372, 88.66195676, 88.6870023, 88.71202293, 88.73702912, 88.76201161, 88.7869734, 88.81191947, 88.83684387, + 88.86174532, 88.88662923, 88.91149412, 88.93633903, 88.96116308, 88.98596844, 89.01075422, 89.03552234, 89.0602694, 89.08499342, + 89.10970333, 89.1343894, 89.15906041, 89.18370902, 89.20834007, 89.23295171, 89.25754223, 89.28211345, 89.30666784, 89.33119931, + 89.35571584, 89.38021293, 89.40468873, 89.42914701, 89.45358423, 89.47800419, 89.50240334, 89.52678556, 89.55114712, 89.57549205, + 89.59981659, 89.62412467, 89.64841158, 89.67267947, 89.69693248, 89.72116452, 89.74537692, 89.76957083, 89.7937454, 89.81790335, + 89.84204321, 89.86616299, 89.89026483, 89.9143479, 89.93841405, 89.96245975, 89.98648709, 90.01049982, 90.03449049, 90.05846689, + 90.08242149, 90.10635828, 90.13027714, 90.15417848, 90.17806217, 90.20192576, 90.22577482, 90.24960461, 90.27341656, 90.2972106, + 90.32098387, 90.34474149, 90.36848137, 90.39220204, 90.41590903, 90.43959324, 90.46326397, 90.48691589, 90.51054803, 90.53416512, + 90.55776192, 90.58134304, 90.60490873, 90.62845405, 90.65198139, 90.67549356, 90.69898682, 90.72246132, 90.74592103, 90.769361, + 90.79278746, 90.81619179, 90.83958359, 90.86295533, 90.88630908, 90.90964877, 90.93297058, 90.95627204, 90.97955858, 91.00282768, + 91.02608323, 91.04931768, 91.07253502, 91.09573908, 91.11892527, 91.14209171, 91.16524142, 91.1883783, 91.21149485, 91.23459599, + 91.25767976, 91.2807473, 91.30379877, 91.32683136, 91.34984706, 91.37285084, 91.39583217, 91.41880262, 91.44175194, 91.46468678, + 91.48760533, 91.51050867, 91.53339033, 91.55625985, 91.57911433, 91.60195137, 91.62476883, 91.64757164, 91.67036098, 91.69313301, + 91.71588507, 91.73862389, 91.76134768, 91.78405458, 91.80674275, 91.82941719, 91.85207509, 91.87471831, 91.89734523, 91.91995466, + 91.94254665, 91.96512422, 91.98768844, 92.01023542, 92.03276627, 92.05527817, 92.07777696, 92.10025976, 92.12272678, 92.14517897, + 92.16761444, 92.19003427, 92.21243853, 92.23482725, 92.25720356, 92.27955771, 92.30190036, 92.3242278, 92.34654009, 92.36883447, + 92.39111284, 92.41338006, 92.43562863, 92.45786234, 92.48008133, 92.50228177, 92.52446971, 92.54664103, 92.56880174, 92.59094039, + 92.61306856, 92.63517859, 92.65727443, 92.67935617, 92.70142287, 92.72347274, 92.74550864, 92.76753071, 92.7895351, 92.81152687, + 92.83350013, 92.85545971, 92.87740485, 92.89933747, 92.92125288, 92.943154, 92.96503896, 92.98690982, 93.0087646, 93.03060924, + 93.05243319, 93.07424721, 93.09604538, 93.11782401, 93.13959274, 93.16134502, 93.18308465, 93.20480792, 93.22651868, 93.24821416, + 93.26989246, 93.29155854, 93.31320847, 93.3348463, 93.35646639, 93.37807529, 93.3996693, 93.42124759, 93.44281016, 93.46436002, + 93.48589524, 93.50741881, 93.52892603, 93.55041879, 93.57189532, 93.59336136, 93.61480953, 93.63624525, 93.65766882, 93.67907358, + 93.70046721, 93.72184688, 93.74321081, 93.7645638, 93.78590211, 93.80722194, 93.82853104, 93.84982856, 93.8711087, 93.89237653, + 93.91362794, 93.9348689, 93.95609091, 93.9773035, 93.99850109, 94.01968552, 94.04085511, 94.06201077, 94.08315348, 94.10428149, + 94.12539575, 94.14649848, 94.16758545, 94.18865888, 94.20971874, 94.23076523, 94.25179828, 94.2728171, 94.29382356, 94.31481682, + 94.33579601, 94.3567592, 94.37771222, 94.39865154, 94.41957488, 94.44048529, 94.46138296, 94.48226783, 94.50314002, 94.52399573, + 94.54484271, 94.56567332, 94.58649145, 94.60729332, 94.6280858, 94.64886302, 94.6696293, 94.69037824, 94.71111801, 94.73184187, + 94.75255372, 94.77325448, 94.79393861, 94.8146147, 94.8352743, 94.85591916, 94.87655236, 94.89717391, 94.91778139, 94.93837602, + 94.95895446, 94.97952618, 95.00008186, 95.02062236, 95.04115163, 95.06166969, 95.08217276, 95.10266477, 95.12314186, 95.14360713, + 95.16406232, 95.18450036, 95.20493, 95.22534421, 95.24574469, 95.26613366, 95.28651202, 95.30687598, 95.32722563, 95.34756393, + 95.36788887, 95.38820343, 95.40850304, 95.42879168, 95.449067, 95.4693292, 95.48958046, 95.50981786, 95.53004526, 95.55025891, + 95.57045881, 95.59064806, 95.61082454, 95.63098662, 95.65113602, 95.67127496, 95.6914036, 95.71151577, 95.73161845, 95.75170788, + 95.77178414, 95.7918502, 95.81190402, 95.83194392, 95.85197168, 95.87198945, 95.89199053, 95.91198337, 95.93196106, 95.95193138, + 95.97188434, 95.99182926, 96.01176161, 96.03168058, 96.05158784, 96.07148185, 96.09136342, 96.11123649, 96.13109341, 96.15094189, + 96.17077664, 96.19059992, 96.21041192, 96.23021102, 96.24999892, 96.26977403, 96.28953722, 96.30929235, 96.32903185, 96.34875878, + 96.36847475, 96.38818287, 96.40787474, 96.42755733, 96.44722605, 96.46688407, 96.48652908, 96.50616346, 96.5257865, 96.54539743, + 96.5649979, 96.58458635, 96.60416366, 96.62372601, 96.64328114, 96.66282372, 96.68235301, 96.70187136, 96.72137804, 96.74087386, + 96.76035587, 96.77983017, 96.79928993, 96.81874209, 96.83818056, 96.85760851, 96.87702132, 96.89642747, 96.91581871, 96.93520023, + 96.95457142, 96.97393153, 96.99327835, 97.01261497, 97.03194067, 97.05125242, 97.07055411, 97.08984577, 97.10912744, 97.12839538, + 97.14765195, 97.16689939, 97.18613698, 97.20535798, 97.22457231, 97.24377619, 97.26296359, 97.28214521, 97.30131272, 97.32047148, + 97.33962005, 97.35875536, 97.37787753, 97.39699277, 97.41609556, 97.43518605, 97.45426661, 97.47333802, 97.49239649, 97.51144208, + 97.53048245, 97.54950626, 97.56852035, 97.58752557, 97.60651883, 97.62550117, 97.64447612, 97.66343401, 97.68238777, 97.7013245, + 97.72025336, 97.73917295, 97.75808021, 97.77697826, 97.79586097, 97.81473912, 97.83360053, 97.85245612, 97.87129715, 97.89012997, + 97.90895465, 97.92776351, 97.94656357, 97.96535557, 97.98413572, 98.00290411, 98.0216607, 98.04040946, 98.0591458, 98.07787434, + 98.09659062, 98.11529602, 98.13399297, 98.15267543, 98.17135021, 98.19001678, 98.20866815, 98.22731202, 98.24594464, 98.26456913, + 98.28317933, 98.30178152, 98.32037191, 98.33895574, 98.35752401, 98.37608583, 98.39463599, 98.41317593, 98.43170428, 98.45022567, + 98.46873238, 98.48723156, 98.50572064, 98.52419839, 98.54266935, 98.56112833, 98.5795743, 98.59801359, 98.61644162, 98.63485926, + 98.65326612, 98.6716639, 98.69005, 98.70842759, 98.72679422, 98.74515239, 98.76349897, 98.78183652, 98.80016317, 98.818479, + 98.83678649, 98.85508254, 98.87337098, 98.89164802, 98.90991685, 98.92817432, 98.94642114, 98.96465599, 98.98288655, 99.0011027, + 99.0193095, 99.03750706, 99.05569661, 99.07387501, 99.09204163, 99.11020164, 99.12834992, 99.14649098, 99.16462101, 99.18274005, + 99.20084747, 99.21894777, 99.23704034, 99.25511882, 99.2731896, 99.29125019, 99.30930313, 99.32734527, 99.34537664, 99.36340108, + 99.38141098, 99.39941718, 99.41740889, 99.43539377, 99.45336677, 99.4713336, 99.48928668, 99.50723239, 99.5251714, 99.54309608, + 99.56101346, 99.57892103, 99.59682135, 99.61470745, 99.63258635, 99.65045553, 99.66831756, 99.68616804, 99.70400948, 99.72184065, + 99.7396654, 99.75747931, 99.77528304, 99.79307659, 99.81085938, 99.82863649, 99.84640288, 99.8641592, 99.88190929, 99.8996443, + 99.91737375, 99.93509321, 99.95280653, 99.97050611, 99.98819959, 100.0058826, 100.0235557, 100.041219, 100.0588725, 100.0765193, + 100.0941565, 100.1117838, 100.1294041, 100.147012, 100.1646135, 100.1822015, 100.1997837, 100.2173562, 100.2349186, 100.2524759, + 100.2700192, 100.2875567, 100.3050842, 100.3226022, 100.3401102, 100.3576094, 100.3751023, 100.3925827, 100.4100569, 100.4275217, + 100.4449773, 100.462423, 100.4798599, 100.4972871, 100.514705, 100.532117, 100.5495203, 100.5669127, 100.5842934, 100.6016687, + 100.6190344, 100.636391, 100.6537386, 100.6710809, 100.6884104, 100.7057304, 100.7230452, 100.7403472, 100.7576436, 100.7749305, + 100.7922053, 100.809475, 100.8267359, 100.8439874, 100.8612302, 100.8784641, 100.8956893, 100.9129053, 100.9301125, 100.947311, + 100.9645009, 100.9816821, 100.9988569, 101.0160203, 101.0331752, 101.0503248, 101.067462, 101.0845908, 101.101711, 101.1188265, + 101.1359293}; + for (i = 1; i < 1651; ++i) { + int tsat_fn_pb_pressure = i * 64; // sample bin size =64 Pa; sample size =1651 (continous) + tsat_psy = PsyTsatFnPb(*state, tsat_fn_pb_pressure); + error = max(abs(tsat_psy - tsat_fn_pb_tsat[i]), error); + } + + // check error + EXPECT_LE(error, 1E-7); +} +TEST_F(EnergyPlusFixture, Psychrometrics_CSpline_Test) +{ + // compare the results of Tsat between CSpline interpolation and original psychrometric function for PsychTsatFnPb + InitializePsychRoutines(*state); + Real64 tsat_psy; + Real64 tsat_cspline; + Real64 Press_test; + Real64 Press_test_smallchange; + Real64 error = 0.0; + int i; + for (i = 0; i <= 700; i++) { // Press =50,000 ~ 120,000 Pascal + state->dataPsychrometrics->useInterpolationPsychTsatFnPb = false; + Press_test = 50000 + i * 100; + tsat_psy = PsyTsatFnPb_raw(*state, Press_test); // Tsat from original psychrometric function for PsychTsatFnPb + + state->dataPsychrometrics->useInterpolationPsychTsatFnPb = true; // change to cspline + Press_test_smallchange = Press_test + 1e-60; + tsat_cspline = PsyTsatFnPb_raw(*state, Press_test_smallchange); // Tsat from cspline interpolation + error = max(abs(tsat_psy - tsat_cspline), error); + } + // check error + EXPECT_LE(error, 1E-5); +}